<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/feed.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Airing&apos;s Blog (English)</title><description>Airing - INFJ | Blogger | Full-stack engineer | SG</description><link>https://ursb.me/</link><language>en</language><item><title>After AI Takes Everything</title><link>https://ursb.me/en/posts/after-ai-takes-everything/</link><guid isPermaLink="true">https://ursb.me/en/posts/after-ai-takes-everything/</guid><description>Prompted by letters from three engineers, the author asks what remains for humans as AI takes over execution, naming judgment, taste, and derivation as irreplaceable, and warns against the erosion of subjecthood.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Over the past month I&apos;ve received three letters in a row from strangers — all software engineers I&apos;ve never met. One was a frontend developer in infrastructure, another did data ops, the third was somewhere in between. The three letters look different, but they ask the same question.&lt;/p&gt;
&lt;p&gt;The first one asked me: &quot;Do you think one day all of it will be handed over to AI? If so, do code reviews even still need humans?&quot;&lt;/p&gt;
&lt;p&gt;My answer: soon. By the end of this year or next, the year after at the very latest.&lt;/p&gt;
&lt;p&gt;The second was more direct: &quot;Is our future job going to be building AI and then letting it replace ourselves?&quot;&lt;/p&gt;
&lt;p&gt;The third was the longest. The writer listed every reason he was embracing AI-assisted coding — fewer rewrites, less communication overhead, more output — and then admitted at the end: if things keep going like this, what happens to my own growth? He hadn&apos;t figured that part out.&lt;/p&gt;
&lt;p&gt;These three questions are, fundamentally, the same question. On the surface it looks like an engineering question, or a career planning question, but underneath it is an existential question: once execution is fully taken over by machines, where does the human stand? Or more bluntly — &lt;strong&gt;once AI takes everything it can take, what is left for us?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I gave fragmented answers in my replies, but I knew they weren&apos;t enough. The question deserved a more complete answer, so I wrote this essay. It&apos;s a shared question and one I&apos;ve been turning over in my own mind lately. Writing my thoughts down may help others who are wrestling with the same thing.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;I. The Spinning Jenny&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The blue mountains cannot hold it back — the river still flows east.
— Xin Qiji, &lt;em&gt;Pusa Man · Inscribed on the Wall at Zaokou, Jiangxi&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A little over two hundred years ago in England, a spinning frame called the Spinning Jenny came into the world. One person could now do the work of several. Yarn got cheap, and the hand-spinners who had made their living with a pair of hands and an old wheel saw their livelihoods collapse in a matter of months.&lt;/p&gt;
&lt;p&gt;Later, some of them went out at night and smashed the machines. History calls them the Luddites. People usually treat them as fools who hated technology, but that&apos;s a misreading — what they wanted to smash was never the machine itself, but the position they suddenly occupied in front of it: a position that had become worthless overnight. They weren&apos;t blind to the technology; on the contrary, they saw what was happening earlier than anyone.&lt;/p&gt;
&lt;p&gt;The day Meituan announced 30%–50% layoffs, a friend texted me asking what to do. I replied: we should not be the spinners replaced by the Jenny — we should be the operators who use the Jenny well.&lt;/p&gt;
&lt;p&gt;He may have remembered that line for a long time. Today I want to correct it. It was only half right.&lt;/p&gt;
&lt;p&gt;Because the next page of history reads like this: the skilled Jenny operators didn&apos;t have it easy for long either. Faster machines were built, and the Jenny — along with all its skilled operators — was sent to the museum. Every machine is waiting for the next machine. &quot;Learn to use the new tool&quot; has never been an amnesty. It&apos;s just a stay of execution.&lt;/p&gt;
&lt;p&gt;So the real question is not &quot;do you know how to use AI.&quot; People who know how to use it today do hold an advantage over those who don&apos;t, but the half-life of that advantage is maybe a year or two — and at the top of the field, possibly only one or two months. The pressure from each new model generation is mounting; the window for exploration and adaptation gets shorter every time. Every new model release brings another paradigm shift, and the workflow you painstakingly built, the prompting tricks you collected, the engineering scaffolding you accumulated — any of it can become a Spinning Jenny overnight.&lt;/p&gt;
&lt;p&gt;My only method for dealing with this is what I call &lt;strong&gt;end-state thinking&lt;/strong&gt;: don&apos;t spend yourself on intermediate-state problems. Think and act with the endpoint as the premise.&lt;/p&gt;
&lt;p&gt;An example. A while back I had a serious argument with a few peers about a question: as AI writes more and more of the code, do engineers still need to understand it line by line? There are plenty of partial answers — better documentation, better visualization, mandatory code walkthroughs. But from the end-state view, this isn&apos;t the core question at all. Once intent can be translated directly and reliably into a working system, &quot;humans reading the intermediate artifact line by line&quot; loses its meaning — just as today, no one asks engineers to read every line of the assembly the compiler produces. Getting stuck on a question that is destined to disappear is the most invisible kind of waste this era inflicts on us.&lt;/p&gt;
&lt;p&gt;What does the end-state look like? My take is simple — a single line: &lt;strong&gt;PRD is Code&lt;/strong&gt;. Or in more general terms: &lt;strong&gt;intent is implementation&lt;/strong&gt;. A sufficiently clear expression of intent becomes a runnable system directly. All the redundant connective tissue in between — scheduling, integration, cross-team review, back-and-forth translation — disappears. To my eye, this isn&apos;t ten years away. It&apos;s well within reach this year. The Fable 5 release a few days ago made the point: anyone who has actually used it knows the gap to Opus 4.8 — it&apos;s confident and powerful enough that I momentarily wondered whether the questions I was asking it were just dumb.&lt;/p&gt;
&lt;p&gt;This gives us the first corollary of end-state thinking — cold but honest: &lt;strong&gt;every step that sits between intent and implementation will, by default, disappear.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So the remaining question is: where does the human stand?&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;II. The Bottleneck Has Moved to Us&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Aim at the highest, you reach the middle. Aim at the middle, you fall to the low.
— Li Shimin, &lt;em&gt;The Emperor&apos;s Plan&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let me start with what&apos;s been happening to me.&lt;/p&gt;
&lt;p&gt;Over the past year, every piece of my work that I could hand off, I handed off to AI, piece by piece. The design doc — it wrote. The code — it wrote. The first drafts of documents and review comments — it wrote. What I can now run in parallel in one evening would have taken a full quarter two years ago. By rights I should be idle, but the truth is the opposite — I am busier than I have ever been. The content of &quot;busy&quot; has simply changed: I almost never produce anything with my own hands now. I spend the whole day reviewing what it produces.&lt;/p&gt;
&lt;p&gt;This is the embryo of the end-state workflow. In it, there are only two things left for humans to do: &lt;strong&gt;review the design, and verify the result.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Notice what these two have in common: neither of them is production. They are gatekeeping.&lt;/p&gt;
&lt;p&gt;Ninety years ago in &lt;em&gt;Modern Times&lt;/em&gt;, Chaplin stood at the conveyor belt tightening bolts, fell behind the belt&apos;s pace, and got pulled into the gears. That image became iconic because it captured the industrial-era human condition exactly: machines set the rhythm, humans chase the machines. Ninety years later, the belt is moving in a new direction — now the machine produces and the human inspects. AI&apos;s production speed is effectively unlimited; the cost of starting a new task is approaching zero. But the cost of verifying its output hasn&apos;t dropped a cent, because verification requires a human in the loop. So for the first time in human history, &lt;strong&gt;the production bottleneck has shifted, wholesale, from the machine to the human.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This shift brings a quiet, lethal corollary: you can run 6 or 7 sessions concurrently, dancing across different worktrees, frantically switching context, multitasking with elegance. But on this new assembly line, you&apos;ll find that there is only one way to push your throughput further —&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;lower your own standards.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Read one fewer line of code. Skip one step of reasoning. Don&apos;t ask one of the &quot;whys.&quot; When the little voice in your head says &quot;eh, probably fine,&quot; nod and let it pass. Project this forward and you can already predict the next few years: nearly every collapse in engineering quality will not be because one specific person was lazy — it will be structural. When production is infinitely fast, the verification standard becomes the only compressible variable in the system, and every incentive in sight pushes you to compress it: the boss&apos;s expectations, your peers&apos; speed, the performance-review whip — they&apos;re all telling you to let go.&lt;/p&gt;
&lt;p&gt;But think clearly about what letting go means. The reason you have not yet been optimized away from the verification step is precisely that your standard is higher than the machine&apos;s. A gatekeeper who keeps lowering the standard is personally building the case for their own replaceability. My stance on this has never moved: slower is fine. The standard, not one inch.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;III. The Disappearing Moat&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Do not rely on the enemy not coming. Rely on having the means to receive him.
— &lt;em&gt;Sun Tzu, The Nine Variations&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But there&apos;s a question one layer earlier: not everyone gets to retreat safely to the gatekeeping role. Some jobs will be submerged earlier than others — they won&apos;t even get the chance to retreat.&lt;/p&gt;
&lt;p&gt;Inside our industry, the first to feel the water temperature changing, in my view, is the frontend engineer.&lt;/p&gt;
&lt;p&gt;Not because frontend isn&apos;t important. Because frontend&apos;s position is structurally exposed. The frontend sits at the hub of the entire engineering pipeline — connecting product and design upstream, server-side downstream, and the QA team to the side. It is the role with the most connections. It&apos;s a router. But at the same time, its moat is the shallowest: the technical complexity of a single page is bounded; when you break it, the blast radius is your own page, not other systems; even if a page becomes unmaintainable, the cost of rewriting it from scratch is low.&lt;/p&gt;
&lt;p&gt;Lower bar (outside infrastructure work — I&apos;m talking about ordinary business code), small blast radius, easy to rewrite — these three traits together mean: no moat. So everyone in the industry is watching everyone pour into the room with the lowest barrier: designers no longer hand over Figma files — they hand over HTML via D2C, sometimes written better than what some engineers produce; QA engineers are transitioning to frontend at scale; backend engineers write the page themselves on the side; people who can&apos;t write code at all are taking their first freelance gig by leaning on AI.&lt;/p&gt;
&lt;p&gt;But please don&apos;t read this section as a story about frontend. It&apos;s a story about &lt;strong&gt;moats&lt;/strong&gt;, and it applies to every industry and every role. Ask yourself two questions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;What fraction of your work is, at its core, &lt;strong&gt;moving information and converting formats&lt;/strong&gt;? Translating requirements into code, data into reports, policies into slide decks, the client&apos;s words into the vendor&apos;s words — every position that earns its living by &quot;carrying messages between two domains&quot; is standing on the fastest-flooding shoreline. Because large language models are, exactly, machines built for format conversion.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How big is the cost when you get it wrong? The smaller the cost of a mistake, the more readily the work will be handed to machines to experiment on; and once a machine is allowed to experiment, its iteration speed will run circles around any human. Conversely, domains where the cost of failure is enormous — system architecture, high performance, low-level quality affecting tens of millions of users — machines cannot enter yet. Not because they aren&apos;t smart enough, but because no one dares let them try. Payments. Trading. Finance. Large native clients. Infrastructure containers.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Think these two questions through and the exit routes show themselves. There are two:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Go deeper.&lt;/strong&gt; Move yourself from being the author of a page to being the guardian of a system — toward the places where mistakes cost a lot: performance, architecture, quality, stability. The advice I gave the frontend engineers in those letters was: take on some backend work, even do small features full-stack by yourself — not to learn another technology, but to pull your awareness from a single point into a column. The job boundaries are crumbling. What the future needs is not engineers of one specific side, but people who can take responsibility for the whole system.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Go where it&apos;s new.&lt;/strong&gt; Build things no one has built yet — things that other people&apos;s workflows can come to depend on. One important rule here: &lt;strong&gt;don&apos;t build what can be obtained by burning tokens.&lt;/strong&gt; Any engineering product that someone has already built and that you can simply have AI clone — one more review bot, one more workflow tool — is not worth your energy, because its acquisition cost has already approached zero. What&apos;s worth building is paradigm-level work: things that, once they exist, change how other people work.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A note on the window. A year ago, the consensus was that &quot;use AI like an intern&quot; was still a safe strategy — you set the direction, it does the grunt work, you check it. But the upgrade cycle has gotten shorter and shorter. Today&apos;s AI can be a mentor in many domains, not an intern. People treating AI as an intern can stay comfortable for another year or two. After that, the real question becomes: &lt;strong&gt;when it is better than you, what can you still contribute to this collaboration?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The next section answers that.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;IV. Three Things It Cannot Take&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The gentleman is not a tool.
— &lt;em&gt;The Analects · Wei Zheng&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If the execution layer is destined to be handed over, what is left for us?&lt;/p&gt;
&lt;p&gt;I want to clarify the nature of this question first. It sounds like a lament; it is actually a refining process. Michelangelo said the statue was already in the marble — he just chipped away the parts that didn&apos;t belong. The AI age is doing the same thing to every profession. The parts it takes from us — the repetitive execution, the format conversion, the skilled message-carrying — &lt;strong&gt;were never &quot;us&quot; in the first place. They were just the hours we traded for a paycheck.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When these layers peel away, what remains, the part it cannot take, is the true outline of a person. In other words: &lt;strong&gt;what&apos;s left is what is precious — and the further it survives this stripping, the more precious it gets.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the past, these things were hidden under mountains of execution work; they seemed cheap, and barely anyone noticed them. Now that the cover has been pulled clean off, for the first time they&apos;re standing fully in the light.&lt;/p&gt;
&lt;p&gt;In those three letters I wrote about the same three things, over and over again. They are not skills — skills are &quot;tools,&quot; and tools age out. No matter how skilled the operator of the Spinning Jenny was, she went into the museum together with her machine. These three things sit &lt;em&gt;above&lt;/em&gt; the tool layer, and I&apos;m fairly confident they are irreplaceable not because the machines are temporarily weak, but because of the technical structure of this generation of AI itself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The first: judgment.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI is the most powerful question-answering machine ever built, but it doesn&apos;t ask the questions. You tell it what to do, it does it — and &quot;what to do&quot; is a human&apos;s job.&lt;/p&gt;
&lt;p&gt;Many people think AI flattens the differences between humans. I think the opposite: it amplifies them. Try a thought experiment: suppose everyone&apos;s prompting skills are at peak, everyone can get AI to do something with a single sentence. The output between any two people will still differ enormously, because the &lt;em&gt;things&lt;/em&gt; you each ask AI to do are different. The person who picks the right problem gets ten times the output; the person who picks the wrong problem just does the wrong thing ten times as fast. In the past, execution ability masked mediocre judgment, because execution itself consumed most of the time. Now that execution is approaching free, judgment is exposed in the result for the first time, with nowhere to hide.&lt;/p&gt;
&lt;p&gt;There is no shortcut to building judgment, but there is a clumsy method: lay out everything on your plate, prioritize them by hand, and then interrogate yourself about why this order — what makes this one come before that one? What&apos;s the business value? What&apos;s the cost of not doing it? The answers come from your feel for the business and your awareness of the technology — and both of those, conveniently, can only be obtained personally.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The second: taste.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI&apos;s output is a product of pretraining. Without coaxing, what everyone gets from it is the same thing: an 80-out-of-100 mean — functionally correct, blandly faceless, correct in the same generic way.&lt;/p&gt;
&lt;p&gt;What moves the result from that mean to a specific, signed 95 — that&apos;s the taste a human injects.&lt;/p&gt;
&lt;p&gt;A true story. A friend who couldn&apos;t write a line of code took her first freelance gig on the back of AI. The page worked, the client accepted it — but I took one look at her technical setup and it was a mess: it ran, but it was unmaintainable, structureless, just one step ahead of the wall. I didn&apos;t write a single line of code for her. I just told the AI two more things: what stack the backend should use, and where to deploy it. Those two sentences redirected the whole project. The AI took it from there and refactored the rest itself.&lt;/p&gt;
&lt;p&gt;Same functionality. Where&apos;s the difference? In those two sentences. Those two sentences are taste.&lt;/p&gt;
&lt;p&gt;The philosopher Polanyi has a famous line: &quot;We know more than we can tell.&quot; Taste is a textbook case of tacit knowledge: it can&apos;t be written into a prompt template, can&apos;t be transferred to a machine in one shot, because it isn&apos;t a set of rules — it&apos;s something grown through thousands of feedback loops in your own hands, in the heat of &quot;no, not like that; like &lt;em&gt;this&lt;/em&gt;.&quot;&lt;/p&gt;
&lt;p&gt;In &lt;em&gt;Zhuangzi&lt;/em&gt;, the cook Pao Ding said: &quot;What I love is the Tao — it goes beyond technique.&quot; Technique can be handed to machines. The Tao, not yet — and the more technique is handed over, the rarer the Tao becomes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The third: derivation.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI is a creature of probability, which is why the material it gives you is always abundant, relevant, and looks plausible — but between &quot;looks logical&quot; and &quot;is logically sound&quot; lies a road that has to be walked on your own feet.&lt;/p&gt;
&lt;p&gt;AI does addition; the human has to do subtraction. In a second it can give you ten reasons, twenty references, five options. Your work is to find the most solid point inside this lush field of relevance and rebuild the logical chain link by link, by hand: if we go down this road, what happens at step one? Where will the blocker appear? Is that blocker fundamental, or engineering? — build this logical tower in your head, on your own, brick by brick. A plan whose tower you can&apos;t build will collapse when you ship it.&lt;/p&gt;
&lt;p&gt;One of the people who wrote to me said she uses paper and pen. Before asking AI for a plan, she sketches it on paper first: if upstream just hands us the code, how do we run it? What goes wrong? How does that problem come about? I treasure this habit, because the act of derivation is the source of &lt;strong&gt;knowledge ownership&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;AI can hand you the blueprints to the entire building in one instant. But if you didn&apos;t build the logical chain yourself, the knowledge isn&apos;t yours — it sits in your head, but it can&apos;t transfer to the next problem. Next time, in a different context, you&apos;ll still just have to ask AI again.&lt;/p&gt;
&lt;p&gt;Wang Yangming said: &quot;There is no such thing as knowing without acting. To know but not act is simply not to know.&quot; Five hundred years later, in the AI age, that line gets an oddly precise footnote: cognition that did not come through your own derivation and action — no matter how complete it looks — is just someone else&apos;s words, parked in your head.&lt;/p&gt;
&lt;p&gt;Having said all this, I have to face a contradiction honestly, because one of the letter writers stated it plainly: &quot;If in the future we write less code and only review, these abilities are hard to train — what do we do?&quot;&lt;/p&gt;
&lt;p&gt;She&apos;s right. Judgment, taste, derivation — all three come from doing things by hand. And we are handing &quot;doing things by hand&quot; over to AI. Use it or lose it. This is a real, structural contradiction, and I&apos;m not going to gloss over it with pretty words: &lt;strong&gt;I don&apos;t have a complete answer to this contradiction.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;But she said in the letter that she had found a method. I think it&apos;s the best local solution available right now: &lt;strong&gt;don&apos;t throw the problem at AI immediately.&lt;/strong&gt; Push the logical chain through yourself first, even roughly — form a high-level idea: what do I want, how many parts is it in, where are the key dependencies. &lt;em&gt;Then&lt;/em&gt; hand that idea to AI to expand, refine, and execute. This way you preserve the thinking process and still borrow the machine&apos;s speed — and because you have the blueprint in your head, verification goes faster too. She said she got this method from my &lt;a href=&quot;https://ursb.me/en/posts/weekly-31&quot;&gt;Weekly #31: A Claude-Based Reading Flow&lt;/a&gt;. It&apos;s slow, but you don&apos;t lose yourself.&lt;/p&gt;
&lt;p&gt;Slower is fine. When the tide of the times is pushing you along, slow can be a discipline.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;V. Presence, or Subjecthood&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Man is a thinking reed.
— Pascal, &lt;em&gt;Pensées&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Judgment, taste, derivation — at root, these are three capabilities. They are the &quot;art&quot; that helps you do the job better. But beneath these capabilities lies a more fundamental, more easily overlooked question. It is not about whether you can do the job well. It is about whether &lt;em&gt;you&lt;/em&gt;, as a person, are even still in the room.&lt;/p&gt;
&lt;p&gt;Lift your eyes from the engineering for a moment.&lt;/p&gt;
&lt;p&gt;In &lt;em&gt;Phaedrus&lt;/em&gt;, Plato tells an Egyptian legend: Theuth, the god who invented writing, presented it to the Pharaoh Thamus, claiming the invention would make the Egyptians wiser, with better memory. The Pharaoh refused. He said: &quot;On the contrary, this invention will sow forgetfulness in the souls of those who learn it. They will rely on external marks instead of remembering for themselves. They will hear many things and learn nothing truly. They will appear to know everything, while in fact knowing nothing.&quot;&lt;/p&gt;
&lt;p&gt;For twenty-four hundred years, every revolution in cognitive technology has summoned Thamus&apos;s ghost again: &lt;strong&gt;writing kills memory; printing kills authority; search engines kill learning. And every time, looking back, the worry seems overblown — we outsourced memory, but freed mental room to grow more complex thought; we outsourced retrieval, but built knowledge architectures one level higher up.&lt;/strong&gt; Technological pessimism has never won.&lt;/p&gt;
&lt;p&gt;So what&apos;s different this time?&lt;/p&gt;
&lt;p&gt;What&apos;s different is the &lt;em&gt;layer&lt;/em&gt; of what&apos;s being outsourced. Writing outsourced memory. Printing outsourced duplication. Search outsourced retrieval. What they all handed off was the &lt;strong&gt;raw material&lt;/strong&gt; of thought. This time, for the first time in human history, we can hand off &lt;strong&gt;thinking itself&lt;/strong&gt;: reasoning, weighing, judging — the parts of the soul that Thamus most feared losing.&lt;/p&gt;
&lt;p&gt;In every previous revolution, the freed mental room flowed to higher-level cognitive activity. This time, no one knows what is higher than the highest.&lt;/p&gt;
&lt;p&gt;I&apos;ve seen what the loss of subjecthood looks like, and it isn&apos;t dramatic — it makes no sound at all. A question comes in. The person doesn&apos;t think first anymore — they just forward it to AI. AI gives an answer. The person screenshots it and forwards it back to the asker. Round trip. This person&apos;s function in the chain is an ethernet cable. A bug ships, the manager asks what happened, and they say: I don&apos;t know, the AI wrote it.&lt;/p&gt;
&lt;p&gt;In that moment, what got replaced was not their job — it was their &lt;em&gt;presence&lt;/em&gt; (and quite possibly their job too). They are still in the seat. But they are no longer there.&lt;/p&gt;
&lt;p&gt;In his analysis of alienated labor, Marx wrote that the worker &quot;does not affirm himself in his labor, but denies himself.&quot; &lt;strong&gt;The horror of alienation has never been that the worker ultimately loses the job — it&apos;s that long before unemployment, the labor itself has already become something foreign to him.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The spinster in the age of the Jenny first lost her relation to her labor, and then lost the labor itself.&lt;/p&gt;
&lt;p&gt;Today&apos;s version is a cognitive alienation: &lt;strong&gt;before being replaced by AI, a person first lives themselves into someone who no longer needs to be a subject at all.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is the real danger. Foucault warned long ago: discipline never needs a guard — we will trim ourselves into the shape the process requires. Heidegger put it more coldly: &quot;The real danger of technology is never that the machine hurts the human, but that the human begins to understand himself, too, as a resource to be optimized.&quot;&lt;/p&gt;
&lt;p&gt;But what I want to say is not the pessimistic half. The opposite.&lt;/p&gt;
&lt;p&gt;A real question, most of the time, does not have a deterministic answer. &lt;strong&gt;Cognition does not fall from the sky. It is ground out by humans through derivation, argument, and exchange — bit by bit, through a process that cannot be skipped, because that process &lt;em&gt;is&lt;/em&gt; the human.&lt;/strong&gt; If cognition is handed to you directly by AI — whether or not it is comprehensive, whether or not it is critical — the mere absence of that middle stretch of thinking is enough to let subjecthood retreat, inch by inch, until what is left is the silhouette of someone waiting in front of a Jenny to be retired.&lt;/p&gt;
&lt;p&gt;AI cannot replace humans in perceiving and experiencing the world — and this isn&apos;t a pep talk; it has a structural basis. I wrote, in an earlier essay on AI and psychological healing: human cognition is not just information processing — it is an experience interwoven from sensation and emotion. We perceive the real world through our bodies; we assign meaning through feeling. AI is unmatched at processing information and generating text, but what it lacks is precisely this dimension of experience — it can process data, but cannot experience the real world that the data represents. In one line: &lt;strong&gt;AI&apos;s understanding is instrumental, not existential.&lt;/strong&gt; It can help us understand certain facets of the human condition, but it cannot replace the insight we obtain through lived experience and inner reflection. A painting can imitate nature, but it can never become nature itself.&lt;/p&gt;
&lt;p&gt;So: logical derivation, free-associative leaps, the feel for a business, the urge to explore the unknown — these are not bullet points on a résumé. They are the &lt;em&gt;organs&lt;/em&gt; of subjecthood. My view is this: &lt;strong&gt;human thought should not be worn down in the AI age. It should be amplified.&lt;/strong&gt; AI takes over the deterministic part. Humans were always meant to live in the uncertainty — that is where judgment, taste, and derivation reside, and that is where the question &quot;what makes us human&quot; finds its answer.&lt;/p&gt;
&lt;p&gt;Pascal said: man is a thinking reed; the universe needs no weapon to crush him. But man is still more noble than what crushes him, because he knows he will die, and the universe knows nothing of this. In the AI age, that line gets a new reading: a model can surpass us at nearly every task, but knowing what one is doing, why one is doing it, and what difference it will make in the world — that is still only the reed.&lt;/p&gt;
&lt;p&gt;The reed&apos;s entire dignity is in its thinking. Please do not hand it over.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;VI. The Anchor of Value&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;What defines us is never the voyage itself, but the meaning we give to the voyage.
— &lt;a href=&quot;https://ursb.me/en/posts/life&quot;&gt;On the Value of Existence and the Experience of Life&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The reasoning above is a path that keeps moving inward: from the job, to ability, to subjecthood — each layer deeper than the last. Now we have arrived at the innermost room — where the real source of all the anxiety sits. I think I have already answered this question, years ago, in &lt;a href=&quot;https://ursb.me/en/posts/life&quot;&gt;On the Value of Existence and the Experience of Life&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The threat to the job, the cultivation of the ability, the survival of subjecthood — all of these anxieties collapse, when gathered, into the same thing: &lt;strong&gt;we are afraid of losing our sense of value.&lt;/strong&gt; Afraid that one day we will wake up and find we are no longer useful to this world. Being laid off is just the outer shell of that fear. The core is older: a person&apos;s deepest fear has never been having no job. It is the suspicion that one is no longer worthy.&lt;/p&gt;
&lt;p&gt;But the sense of value has never been something the world hands you. It is something you anchor yourself.&lt;/p&gt;
&lt;p&gt;Years ago I wrote an essay called &lt;a href=&quot;https://ursb.me/en/posts/life&quot;&gt;On the Value of Existence and the Experience of Life&lt;/a&gt;. AI had nothing to do with my life back then. In it I wrote: life has no inherent purpose. We arrive by accident, leave by accident, and no law mandates what we must do. Even so, we must steer this meaningless life forward with courage — &quot;this voyage has no destination, but in the vast sea we constantly anchor markers along the way.&quot; What defines us is never the voyage itself, but the meaning we give to the voyage. &lt;strong&gt;Existence precedes essence. We exist first, and then go searching for meaning — assigning meaning to the fact of existence.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I did not expect that, years later, that passage about life would land precisely on a technical question.&lt;/p&gt;
&lt;p&gt;Because meaning is assigned after the fact — because it&apos;s a marker you anchor yourself — anchoring has an ancient trap: if you tie all your sense of meaning to a single external feedback loop, then the moment that loop breaks, the entire structure of meaning collapses overnight into disillusion. The example I used back then was the workaholic — pinning all of their sense of meaning on performance reviews and the boss&apos;s recognition. The moment the feedback cuts off, the enthusiasm goes out and self-doubt rushes in.&lt;/p&gt;
&lt;p&gt;The AI age has done nothing more than cash in this ancient fragility, at unprecedented scale and speed, for the whole world to see.&lt;/p&gt;
&lt;p&gt;If your sense of value happens to be anchored to &quot;I can write code,&quot; &quot;I can execute fast,&quot; &quot;I deliver more than others&quot; — then face the cruel fact: you have dropped your anchor into a sea that is going out. The anchor itself is not wrong. It is simply no longer yours — it belongs to the machine, and the machine is reeling it back in at visible speed. I wrote another line in that old essay that today reads almost like prophecy: &quot;The more you try to do everything to perfection, the less complete it ever feels — and life becomes hollow shards.&quot; In the sprint where every task is marked P0, in the inertia of &quot;shove the saved time into more requirements,&quot; the sense of value is not accumulating. It is being diluted.&lt;/p&gt;
&lt;p&gt;So where is the truly stable anchor of value? Exactly where AI cannot reach.&lt;/p&gt;
&lt;p&gt;AI can &lt;em&gt;process&lt;/em&gt; the entire world, but it cannot &lt;em&gt;experience&lt;/em&gt; it (I recommend my older piece: &lt;a href=&quot;https://ursb.me/en/posts/weekly-28&quot;&gt;Weekly #28: AI Has No Capacity to Experience the World&lt;/a&gt;). It can simulate all meanings, but it cannot truly &lt;em&gt;assign&lt;/em&gt; meaning — because to assign meaning, you need a subject who is genuinely alive, genuinely feeling, genuinely caring. This is the only reliable source of value: &lt;strong&gt;it does not come from &quot;you are useful.&quot; It comes from &quot;you can perceive, you can care, and you can give the things you do a meaning that belongs to no one else but you.&quot;&lt;/strong&gt; The former is the quote the market gives you, and it rises and falls with technology. The latter is your &lt;em&gt;own&lt;/em&gt; value, and no one can take it from you — unless you yourself confuse the two.&lt;/p&gt;
&lt;p&gt;Years ago, in a low point in my life, I wrote this down for myself, almost stubbornly: with or without those external things, believe you are 100% precious; I always have my own value, unconditionally. Today I want to give that line back to anyone who feels themselves being devalued in front of AI. AI is lowering your &lt;em&gt;quote&lt;/em&gt;. It cannot touch your &lt;em&gt;value&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;So: after AI takes everything, what remains is not some second-best refuge — it is the place where the sense of value was always meant to live. AI is a receding tide. It washes away all the external anchors we carelessly threw out over the years — title, output, the feeling of being needed — and forces us to swim back to the one center that the tide cannot reach.&lt;/p&gt;
&lt;p&gt;In that old essay I gave that center a definition: &lt;strong&gt;The value of our existence is the act of fixing this center. The meaning of being alive is the work of expanding its boundary.&lt;/strong&gt; The center is what makes you you. The boundary is the world you spend a lifetime experiencing, perceiving, and giving meaning to. AI can approach the boundary without limit, but it can never reach the center — because what sits at the center is a person who will die, who will love, who, in the late hours of the night, will still ask after meaning.&lt;/p&gt;
&lt;p&gt;Reclaim your sense of value from &quot;being needed by AI.&quot; This is the most quiet, and most urgent, lesson this age hands every one of us.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;VII. The Wind Rises in the Reeds&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The wind is born of the earth and rises from the tips of the reeds.
— Song Yu, &lt;em&gt;Rhapsody on Wind&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Back to the three letters, back to the question at the start.&lt;/p&gt;
&lt;p&gt;This year, friends who know me well call me radical: I hand designs to AI, code to AI, review drafts to AI; next I&apos;m preparing to hand over testing too. But few understand: efficiency was never the goal. If AI&apos;s entire purpose were to let one person do four people&apos;s work, piled with ever more workload — then what? That would just be turning yourself into a cheaper Jenny, saving the balance sheet two more years before you got replaced. &lt;strong&gt;A human can never out-compete a machine on efficiency.&lt;/strong&gt; That road has two words written at the end of it: &lt;em&gt;inevitably replaced&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;The real purpose of being radical is one thing only: &lt;strong&gt;before the macro trend arrives, keep finding new ground to stand on.&lt;/strong&gt; All the time AI saves you must flow into growth and exploration — not into more requirements. This is a discipline I set for myself, and a sentence I repeat in every reply: if the dividends of efficiency get eaten entirely by workload, then this revolution is meaningless to the individual.&lt;/p&gt;
&lt;p&gt;In the end-state workflow I envision, engineers have two positions, both indispensable.&lt;/p&gt;
&lt;p&gt;One is &lt;strong&gt;Infra&lt;/strong&gt;: building the world in which AI works. How knowledge is accumulated, how context flows, how agents collaborate, how paradigms refresh — this world will not grow on its own. Engineers have to build it. This is &quot;understanding systems and building systems&quot; — the engineer&apos;s native gift — migrated from business code up to a higher layer.&lt;/p&gt;
&lt;p&gt;The other is &lt;strong&gt;the gatekeeper&lt;/strong&gt;: in the rushing river from intent to implementation, standing as the last guard of quality and judgment — picking the right problem with judgment, setting the standard with taste, holding the logic with derivation. This is what makes an engineer specifically an engineer. The task is not to throw it away but to push it to the extreme, and then fit it into the workflow of the future.&lt;/p&gt;
&lt;p&gt;To close, I want to return to those Luddites who smashed machines in the night.&lt;/p&gt;
&lt;p&gt;Their real tragedy was not that they targeted the wrong thing — the machine truly did roll over their livelihoods, and their anger deserves the respect of those of us reading them two hundred years later. The real tragedy was that, standing in that moment, the only option they could &lt;em&gt;see&lt;/em&gt; was to smash. They could see what they were &lt;strong&gt;losing&lt;/strong&gt;. They could not see what they could &lt;strong&gt;become&lt;/strong&gt;. This is not their fault. In that age, no one could.&lt;/p&gt;
&lt;p&gt;But we are different from them. This is the harsh privilege specific to our generation: the change happens on the order of years, fast enough that a single person can witness the end-state inside their own career, and fast enough that no one is left any room to wait and see. We are the first generation of ordinary people who can participate in the revolution &lt;strong&gt;with a sense of the endgame in hand.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So — where do we go?&lt;/p&gt;
&lt;p&gt;Back to the question in the first letter: &quot;Will all of it be handed over to AI?&quot;&lt;/p&gt;
&lt;p&gt;Yes. And faster than most people expect.&lt;/p&gt;
&lt;p&gt;But the answer to that question doesn&apos;t depend on AI. It depends on where you are standing when that day comes: at the end of the assembly line, stamping approval on the machine&apos;s output with an ever-lower bar, waiting for even the stamping to be optimized away? Or further upstream — where the questions are picked, where the standards are set, where the logic is guarded, where the world is built.&lt;/p&gt;
&lt;p&gt;And wherever you choose to stand, please remember the other face of this revolution. It is a grand subtraction, but what it subtracts is never the most precious thing about us — only the execution and repetition that for so long hid the precious thing from view.&lt;/p&gt;
&lt;p&gt;When the tide goes out, what is laid bare on the sand was there all along, only buried by endless busyness: &lt;strong&gt;your judgment, your taste, the logic you&apos;ve walked through with your own hands, your perception of and your curiosity about this world.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So the question &quot;what is left for us&quot; no longer needs to be asked with a worried tone. What is left is precious. What is left is us.&lt;/p&gt;
&lt;p&gt;The wind rises in the reeds. The great trend is never some monolith descending from the sky — it is composed of the choices of countless individuals in this very moment. The decision you make today to push the logical chain through on paper before opening the chat window, to refuse to lower your standard for the sake of speed, to invest the saved hours into an exploration no one has done before — these tiny decisions are themselves the trend.&lt;/p&gt;
&lt;p&gt;We are not individuals carried by the trend.&lt;/p&gt;
&lt;p&gt;The wind rises in the reeds. &lt;strong&gt;We should be the trend itself.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Run forward. Don&apos;t look back.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;To the three friends who wrote in: thank you. Most of the thinking in this essay was not done by me alone — it was derived in the back-and-forth of those letters. And that fact, itself, is exactly what this essay is about.&lt;/p&gt;
&lt;p&gt;May you always, in the roar of the machines, still hear your own voice.&lt;/p&gt;
&lt;p&gt;Written late at night, June 12, 2026.&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=after-ai-takes-everything&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>essays</category></item><item><title>Weekly #35: Vibe Coding Weekends with Professor Claude</title><link>https://ursb.me/en/posts/weekly-35/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-35/</guid><description>Recaps six weekends of vibe coding: new blog modules, a comics pipeline, the MoneyWise finance app, fourteen immersive tech essays, and a self-made language, Penelope.</description><pubDate>Sat, 23 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This issue covers April and May 2026.&lt;/p&gt;
&lt;h2&gt;A Month of Vibe Coding&lt;/h2&gt;
&lt;p&gt;This past month I went on a vibe-coding spree — 25.7 billion Claude Code tokens spent in total:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/tokens-stats.webp&quot; alt=&quot;Claude Code token usage&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Almost all of those were burned across six weekends, because weekends are the only stretches I have for messing around (otherwise a 20x plan would only last me three days).&lt;/p&gt;
&lt;p&gt;I usually have at least seven long-running tasks going at once in Claude Code, and I&apos;m not glued to my desk the whole time — my Samsung small foldable phone is fantastic for this. I can be anywhere, watching short videos with one eye while keeping the other on the agent dashboard. The moment an agent stops, the phone catches it first; voice input keeps them moving (the ruthless boss can&apos;t let them rest):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/multitask-phone.webp&quot; alt=&quot;Managing many Claude Code agents from a phone&quot; /&gt;&lt;/p&gt;
&lt;p&gt;So what got built across those six weekends? Let me share it in this issue.&lt;/p&gt;
&lt;h2&gt;Some Small Toys&lt;/h2&gt;
&lt;p&gt;I polished the &lt;a href=&quot;https://ursb.me/&quot;&gt;blog&lt;/a&gt; a bit, added multi-language support, and shipped a few new modules:&lt;/p&gt;
&lt;p&gt;Workouts:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/mod-workouts.webp&quot; alt=&quot;Workouts module&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A photo wall:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/mod-photos.webp&quot; alt=&quot;Photos module&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And a comics pipeline: I set up a workspace that locks in my own character and art style, so I only need to say one sentence to the agent each day (optionally with photos — it style-transfers and anonymizes them), and it auto-generates a 4-panel strip and publishes it ——&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/mod-comics.webp&quot; alt=&quot;Comics pipeline&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Sharing turned out nice too:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/comics-share-1.webp&quot; alt=&quot;Comic share 1&quot; /&gt;
&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/comics-share-2.webp&quot; alt=&quot;Comic share 2&quot; /&gt;
&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/comics-share-3.webp&quot; alt=&quot;Comic share 3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I also wired up analytics. The site does about 10K PV/month right now:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/umami-pv.webp&quot; alt=&quot;Umami PV stats&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The App&lt;/h2&gt;
&lt;p&gt;Following up on last issue&apos;s finance app: I added quite a bit — AI voice input for transactions, OCR receipt capture, position tracking and analysis, and a family-shared ledger that took me a long while to get right.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/moneywise-app.webp&quot; alt=&quot;MoneyWise main screen&quot; /&gt;&lt;/p&gt;
&lt;p&gt;MoneyWise is now live on iOS, Android, and macOS, and it has fully replaced MoneyWiz which I&apos;d been paying for for years.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/moneywise-stores.webp&quot; alt=&quot;MoneyWise on the stores&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The whole journey from development to App Store didn&apos;t take much time — design, dev, ops, and the store-listing materials were all handled by Professor Claude.&lt;/p&gt;
&lt;h2&gt;14 Deep-Dive Articles&lt;/h2&gt;
&lt;p&gt;This period I shipped 14 new immersive technical longforms. Each one is an encyclopedic deep dive, paired with rich visualizations and interactive learning. Studying this way turned out to be remarkably efficient:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/chromium-renderer/&quot;&gt;The Life of Bytecode to Pixels — A Tour of Chromium&apos;s Rendering Pipeline&lt;/a&gt;: I originally wrote this in 2022, which back then took me a month — I had to spin up the Chromium project and step through it line by line, hand-drawing the logic chains. Not anymore. Claude spent one day rebuilding that article with much better visualizations and deeper explanations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/immersive-chromium.webp&quot; alt=&quot;Chromium renderer immersive article&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And 13 others, written-while-learning, with both learning efficiency and output at maximum:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/jank-stutter/&quot;&gt;Measuring &quot;Smoothness&quot; — From FrameTime to Stutter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/v8-fast-js/&quot;&gt;Extreme JS Performance — V8&apos;s Optimization Principles and the Reincarnation of a Hot Function&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/image-formats/&quot;&gt;Sedimented Pixels — A Full-Spectrum Encyclopedia of 50+ Image Formats&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/http3/&quot;&gt;The Life of One Request — HTTP/3 in Full&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/webassembly/&quot;&gt;From Rust to SIMD — The Life of WebAssembly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/quickjs/&quot;&gt;The Life of One JS Line — A QuickJS Source-Level Walkthrough&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/react-internals/&quot;&gt;The Life of One setState — A Tour of React&apos;s Render Pipeline&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/helio/&quot;&gt;Helio: The Evolution of a High-Performance Mini-Game Container&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/gc/&quot;&gt;Many Ways to Die — Family Tree of 11 GC Algorithms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/webgpu/&quot;&gt;Eight Translations of One Dispatch — A WebGPU Stack Source-Level Walkthrough&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/css-engine/&quot;&gt;The Life of One CSS Rule — A Tour of Chromium&apos;s Style Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/llm-inference-life/&quot;&gt;The Life of an LLM Inference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ursb.me/immersive/tls-handshake/&quot;&gt;The Life of a TLS Handshake — TLS 1.3 Protocol in Full&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Claude even went one step further with the GC piece and turned it into a 3D game that explains each GC algorithm through gameplay:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/gc-game-1.jpg&quot; alt=&quot;GC 3D game 1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/gc-game-2.jpg&quot; alt=&quot;GC 3D game 2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;A Homemade Programming Language —— &lt;a href=&quot;https://penelope.ursb.me/&quot;&gt;Penelope&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;In Homer&apos;s epic, Penelope waited twenty years for Odysseus. By day she wove a shroud; each night she secretly unraveled the day&apos;s work. She wasn&apos;t unable to choose — she was unwilling to. She was waiting for someone who hadn&apos;t come back.&lt;/p&gt;
&lt;p&gt;After that story rolled around in Claude&apos;s head for a long while, it suggested I turn it into a programming language.&lt;/p&gt;
&lt;p&gt;Anyone who writes code is familiar with this predicament: the programs you write have no patience for waiting. The moment a process is interrupted, everything in its head — the stack, the variables, the line it was on — is gone. To make programs survive waiting, we wrap them in scaffolding: checkpoint files, message queues, idempotency keys, retry logic, durable-execution frameworks like Temporal or Inngest. They work, but they all extract the same cost — you have to translate what you want to do into what the framework will let you say, slicing your code into activities, steps, and awaits.&lt;/p&gt;
&lt;p&gt;Penelope&apos;s idea is plain: pull all of that back into the language itself.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;let x = 10;
let y = pause;          // process exits here, state writes to disk
print(to_str(x + y));   // an hour later, a week later, a year later,
                        // another process picks up and prints 15
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No &lt;code&gt;await&lt;/code&gt;, no checkpoints, no decorators. Just one keyword &lt;code&gt;pause&lt;/code&gt;, on equal footing with &lt;code&gt;let&lt;/code&gt;. Underneath it sits a single axiom ——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Execution is data. A running program is itself a value.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Penelope ships with a self-implemented bytecode + VM execution, a debugger, an LSP, a VSCode extension; for performance, both JIT and a WASM backend are supported. On top of all this, the language is now self-hosting — the new lexer, parser, and compiler are all written in Penelope itself.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/penelope-site.webp&quot; alt=&quot;Penelope language site&quot; /&gt;&lt;/p&gt;
&lt;p&gt;By making &lt;code&gt;pause&lt;/code&gt; a first-class expression, Penelope rewinds an engineering problem all the way back to a semantic one.&lt;/p&gt;
&lt;p&gt;In the process, I shored up my own programming foundations, and along the way realized something about Professor Claude&apos;s reasoning: when the reasoning capacity is strong enough, the higher-level usage might actually be &lt;em&gt;subtraction&lt;/em&gt; — push back to the most solid base point, and then go forward together with it doing &lt;em&gt;addition&lt;/em&gt;. Knowledge absorbed that way is denser in value and far more durable.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/penelope-axiom.webp&quot; alt=&quot;Penelope&apos;s axiomatic derivation&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;A Living Stardew Valley&lt;/h2&gt;
&lt;p&gt;This project&apos;s origin: after I added i18n to the blog and a real-time online presence indicator, I noticed quite a few overseas visitors landing on the site, some of whom were happy to comment, which kept the traffic flowing. There were even a few days when the free Supabase tier started to choke:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/supabase-limit.webp&quot; alt=&quot;Supabase quota hit&quot; /&gt;&lt;/p&gt;
&lt;p&gt;So I thought — why not just make a game? Represent visitors as little animals, put them all in a shared room interacting with each other, give it a &quot;the world is one village&quot; feel:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/world-idea.webp&quot; alt=&quot;World concept sketch&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Because the image-2 results were great, I splurged on Codex too, and had Claude Code and Codex team up to build the game:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/codex-claude.webp&quot; alt=&quot;Claude Code + Codex collaboration&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The little game kept growing. Every NPC is wired up to AI, and borrowing from OpenClaw&apos;s architecture, each has its own SOUL and independent memory system — if you sign in, it stores memories specifically about you, and occasionally sends you check-in emails on its own initiative. A living Stardew Valley:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/npc-soul.webp&quot; alt=&quot;NPC SOUL memory system&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The creative momentum is real and just keeps coming. For example, right now I&apos;m building a chaotic exhibition hall for my own work — I&apos;ve rebuilt it several times and still not happy with it:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/gallery-exhibit.webp&quot; alt=&quot;Exhibition gallery&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I&apos;ll hold back the 2D world&apos;s link for now — there&apos;s still plenty I, the creator-god, need to fix up first.&lt;/p&gt;
&lt;h2&gt;3D Game Explorations&lt;/h2&gt;
&lt;p&gt;If the above was the 2D direction, this section is the 3D direction. Besides the GC game already mentioned, I also built a 3D zen miniature world:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/zen-world.jpg&quot; alt=&quot;3D zen world&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It&apos;s still being polished, but you can already get a taste: &lt;a href=&quot;https://ursb.me/world/&quot;&gt;https://ursb.me/world/&lt;/a&gt;. You can play white noise, set a Pomodoro timer, and there are subtle wind animations throughout — it has a real atmosphere to it.&lt;/p&gt;
&lt;p&gt;3D gaming took me down plenty of dead ends. For instance, I tried for a long time to build this &quot;chatting under a tree&quot; scene, and after all that effort this was the result:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/tree-chat-fail.webp&quot; alt=&quot;Chat-under-tree early attempt&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Avatars in particular burned a lot of my time and money. Diffusion model outputs are like a blind box — never quite what you want.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/avatar-diffusion.webp&quot; alt=&quot;Diffusion-model avatar attempts&quot; /&gt;&lt;/p&gt;
&lt;p&gt;But if you just let the coding model handle the art assets, you get this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/code-art.webp&quot; alt=&quot;Coding model generating art assets&quot; /&gt;&lt;/p&gt;
&lt;p&gt;There&apos;s still plenty more I want to make — I&apos;ll save it for another issue.&lt;/p&gt;
&lt;h2&gt;🌺 Life Moments&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;⛰️ MacRitchie Hike&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://ursb.me/workouts/521415AA-9098-4F05-96D8-AF11B5893821/&quot;&gt;https://ursb.me/workouts/521415AA-9098-4F05-96D8-AF11B5893821/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/macritchie.webp&quot; alt=&quot;MacRitchie hike&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🗡️ The Holy Sword Microphone&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I built myself a holy-sword-shaped microphone:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/mic-sword.webp&quot; alt=&quot;Holy sword microphone&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;⌨️ ZSA Voyager + Navigator + ZSA Moonlander&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Recently retired my HHKB series after over a decade of use, and picked up a ZSA Voyager + Navigator. The split keyboard took me two weeks of practice just to barely type again... but once it clicks, it&apos;s wonderful. So I went and bought a ZSA Moonlander too.&lt;/p&gt;
&lt;p&gt;My desk&apos;s a mess right now, so I&apos;ll go with a stock photo this issue — looks roughly like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/zsa-voyager.webp&quot; alt=&quot;ZSA split keyboard&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🎮 Roco Kingdom&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&apos;ve been hooked on Roco Kingdom lately, and caught a shiny-pink Snowshade Doll variant:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://r2.airingdeng.com/blog/wj35/rock-kingdom.webp&quot; alt=&quot;Roco Kingdom shiny variant&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🎬 Books, Films &amp;amp; Music&lt;/h2&gt;
&lt;p&gt;What I consumed this period:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Watched: TV | &lt;em&gt;Fatal Wish&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watched: TV | &lt;em&gt;Extraordinary Attorney Woo&lt;/em&gt; | ★★★★★ | second rewatch&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Sacrifice Hill&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Watched: TV | &lt;em&gt;The Boys: Season 5&lt;/em&gt; | ★★★☆☆ — disappointing ending.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-35&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #34: The Joy of Making Things</title><link>https://ursb.me/en/posts/weekly-34/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-34/</guid><description>Documents a month of building with Claude Code: a blog rebuilt in a weekend, a finance app shipped in two hours, and how AI amplifies the joy of creating.</description><pubDate>Sun, 05 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This issue covers my reflections from March 2026.&lt;/p&gt;
&lt;p&gt;When I first learned to program more than a decade ago, I&apos;d often code until two or three in the morning without noticing the time, watching what was in my head slowly take shape under my fingertips. In &lt;a href=&quot;https://ursb.me/posts/weekly-24/&quot;&gt;Monthly (Issue 24): Ten Years of Programming&lt;/a&gt;, I wrote: &quot;Those late nights, full of excitement as I built that game — even now, looking back, that feeling hasn&apos;t dimmed at all. I think that must have been the purest form of love.&quot;&lt;/p&gt;
&lt;p&gt;After years in the industry, that raw joy of making has been quietly fading — more time spent on collaboration, processes, and engineering complexity, and fewer real opportunities to build something from nothing. Then recently, Opus 4.6 helped me find that feeling again. Claude Code has become my source of joy after work. The only frustration is that Claude Max is nowhere near enough — a single window typically burns out in about forty minutes, and then I sit there watching the five-hour countdown, waiting for the window to reset so I can get back to building.&lt;/p&gt;
&lt;p&gt;This month I made a few things with it. Here&apos;s a look at what that was like.&lt;/p&gt;
&lt;h2&gt;A New Blog&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Building a blog platform, time spent: one weekend (2 days).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The blog has gone through another iteration — this is the fifth major version since 2014:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The full history is documented in &lt;a href=&quot;https://ursb.me/posts/weekly-4/&quot;&gt;Weekly (Issue 4): The Evolution of My Personal Blog&lt;/a&gt;. I&apos;ll just list the technical and visual changes at each stage here.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;2014: WordPress&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2015: Hexo&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Can&apos;t find any screenshots anymore.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2017: Typecho&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/image%201.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I also ran a separate weekly newsletter site for a while, which I merged into the main blog in 2023.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/image%202.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2023: Typlog&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/CleanShot%202026-04-05%20at%2016.26.14@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2026: Astro&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The new blog has a magazine-style look:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/CleanShot%202026-04-05%20at%2016.10.54@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;With a dynamic activity calendar:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/CleanShot%202026-04-05%20at%2016.11.03@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And AI Chat + Skills integration that can output interactive learning notes — great for co-creating educational content with AI:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/CleanShot%202026-04-05%20at%2016.11.13@2x.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/CleanShot%202026-04-05%20at%2016.13.01@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;There are some little surprises scattered throughout, like inline sidebar comments:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/CleanShot%202026-04-05%20at%2016.13.33@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The whole site was vibe-coded over a weekend as a static blog, with GitHub Actions pre-building and injecting data. But a lot of dynamic features — likes, comments, view counts — still use Serverless Functions under the hood.&lt;/p&gt;
&lt;p&gt;Before, a project like this would have taken months, which is why I&apos;d just subscribe to a blogging platform instead. But then you&apos;re always fighting against someone else&apos;s theme or feature constraints. Now, if you have an idea, AI can help you build it. &lt;strong&gt;The bottleneck in software is shifting from engineering complexity to imagination itself.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;A Personal Finance App&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Building an iOS app MVP from scratch, time spent: 2 hours.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I built a personal finance app MVP from zero in two hours. I&apos;ve been looking for an app that has the design aesthetic of Copilot Money but the functionality of MoneyWiz — multi-currency support, portfolio tracking, budget management — along with voice input and AI-powered portfolio discussion, all cross-platform. I haven&apos;t found one. Apps with good looks tend to be feature-light, and apps with features tend to be clunky. Multi-currency in particular is always a core need for anyone living outside their home country.&lt;/p&gt;
&lt;p&gt;So I built one: product concept, UI design, development, and testing — the full loop, handled by an agent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Claude Code + Pencil for design&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This starts with defining a design system and spec, then describing the product&apos;s functionality and letting multiple agents simultaneously design screens, then iterating in conversation. You watch your mental image of the product materialize in front of you.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/Pasted%202026-04-05-16-03-39.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Claude Code + Superpowers to refine the product design in conversation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This step is mainly checking whether the features are internally consistent, whether any user flows are missing, and whether the design could be improved anywhere. These first two steps are the most important part of the whole process — they took about 1.5 hours in total. If the design is solid, the build that follows will be accurate.&lt;/p&gt;
&lt;p&gt;The conversation itself is genuinely enjoyable. It&apos;s like having a rough idea in your head and a friend with deep industry experience helping you turn something naive into something polished and production-worthy. Every few minutes there&apos;s an &quot;oh yes, &lt;em&gt;that&apos;s&lt;/em&gt; what I wanted&quot; moment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Parallel multi-agent development&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After the design phase, it&apos;s straight into development. The agent writes the spec, you confirm the tech stack, and then you kick off parallel multi-agent development. The process runs according to the project&apos;s complexity — no need to tell it to test itself (set up the MCP and it handles that), no human intervention needed, one continuous build. You just sit back and drink tea. Because so much context was established in the earlier conversations, the agent has everything it needs.&lt;/p&gt;
&lt;p&gt;The result was great — the UI fidelity was very high.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/Pasted%202026-04-05-16-03-39%201.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/Pasted%202026-04-05-16-03-39%202.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The AI runs its own self-tests:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/Pasted%202026-04-05-16-03-39%203.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Then you merge and ship.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/Pasted%202026-04-05-16-03-39.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Before, getting something to this point would have taken one designer and one developer, probably a month between the two of them.&lt;/p&gt;
&lt;p&gt;Now it takes one person, in two hours.&lt;/p&gt;
&lt;h2&gt;A New Personal Homepage&lt;/h2&gt;
&lt;p&gt;The old version was like this — fairly minimal:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/image%203.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The new version looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/CleanShot%202026-04-05%20at%2016.14.39@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;There are a few new things to explore over at &lt;a href=&quot;https://ursb.me&quot;&gt;ursb.me&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI Chat (still being tuned)&lt;/li&gt;
&lt;li&gt;Real-time listening status sync&lt;/li&gt;
&lt;li&gt;Mood and fitness data sync&lt;/li&gt;
&lt;li&gt;Bookmarks, channel, blog, and notes update sync&lt;/li&gt;
&lt;li&gt;Vibe Coding stats&lt;/li&gt;
&lt;li&gt;And quite a few small surprises&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Other Projects&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://htyl.ursb.me/&quot;&gt;How to Train Your LLM&lt;/a&gt;&lt;/strong&gt;: An interactive mini-game for learning the basics of LLMs through play.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://claude-101.ursb.me/&quot;&gt;Claude-101&lt;/a&gt;&lt;/strong&gt;: An interactive learning project, with analysis based on the previously leaked 2.1.88 source code.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linear workflow&lt;/strong&gt;: I&apos;ve been experimenting with using Linear to assign tasks to agents, track progress, and generate summaries. Assigning tasks to agents isn&apos;t new — tools like Slock and Multica already do it — but the integration with Linear&apos;s project management capabilities makes the experience feel more complete. On the deployment side, in addition to Codex, I&apos;ve also self-hosted Cline to run Claude Code and Gemini.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Looking back at everything I built this month, none of it was strictly necessary — I could have kept writing in Typlog, I could have downloaded an existing finance app, and my homepage was perfectly fine as it was. But I built them anyway, and I had a great time doing it.&lt;/p&gt;
&lt;p&gt;I&apos;ve always believed that the pleasure of making things is fundamentally a confirmation that &lt;em&gt;I can have an impact on this world&lt;/em&gt;. A baby who discovers that pushing a toy makes it move will flail with delight. When we write code, build systems, and ship products, the drive underneath isn&apos;t really that different from that baby&apos;s.&lt;/p&gt;
&lt;p&gt;AI hasn&apos;t diminished this pleasure — it&apos;s amplified it. Before, engineering constraints and time costs meant many ideas just stayed in your head. Now the path from idea to reality has been dramatically shortened: a thought can become something you can touch in a few hours. That means we get to experience the moment of opening something we made more often. We get to feel the joy of creation more frequently.&lt;/p&gt;
&lt;p&gt;Of course, tools are still just tools. What actually brings joy is never the tool — it&apos;s having something in your mind that you want to build, and then building it. AI has made &lt;em&gt;building it&lt;/em&gt; much easier. But &lt;em&gt;wanting to build it&lt;/em&gt; — that can only ever come from you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Holding onto the urge to create is probably the best antidote to burnout.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Life Moments&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;✈️ Shanghai&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I had a brief work trip to Shanghai this month. Time was tight, so I didn&apos;t manage to meet up with anyone.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/2026-04-05%2016.58.17.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/2026-04-05%2016.58.22.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🤖 New Glasses&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj34/telegram-cloud-photo-size-5-6174856430171655762-y.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;These work nicely connected to OpenClaw — I now have a 24/7 assistant available on demand. I&apos;m running OpenClaw as a service on the Mac Mini and connecting to it via Tailscale.&lt;/p&gt;
&lt;p&gt;The real-time conversation subtitles have also been incredibly useful. My English communication with colleagues is nearly seamless now — before, I&apos;d sometimes lose track when someone spoke quickly. The Chinese-to-English translation feature has also been handy for everyday spoken English practice.&lt;/p&gt;
&lt;h2&gt;Books, Films &amp;amp; Music&lt;/h2&gt;
&lt;p&gt;Here&apos;s what I consumed this period:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Project Hail Mary&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;The Way Home&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-34&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>2025: A Brand New Journey</title><link>https://ursb.me/en/posts/summary-2025/</link><guid isPermaLink="true">https://ursb.me/en/posts/summary-2025/</guid><description>A 2025 year in review: moving to Singapore, MoFlow entering maintenance mode, a new TikTok job with first-time people management, a serious kidney stone ordeal, and an AI-powered workflow built on Tana, NotebookLM, Claude Code, and OpenClaw.</description><pubDate>Sun, 15 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Eight years of annual reviews now. I&apos;ve left the city I&apos;d called home my entire life and moved to an unknown country. The hollow feeling after 2024&apos;s breaking-apart has slowly dissipated, replaced by something rough but solid — an order built from specific people and specific moments.&lt;/p&gt;
&lt;h2&gt;Work&lt;/h2&gt;
&lt;h3&gt;The Startup&lt;/h3&gt;
&lt;p&gt;MoFlow&apos;s product thinking was too naive and idealistic to absorb risk and course-correction. Early in the year, Apple&apos;s review process locked us out for over three months — bugs couldn&apos;t be patched, polished features piled up in the release queue. For a young product, that&apos;s fatal. And there was nothing I could do.&lt;/p&gt;
&lt;p&gt;After shipping a technical update with long-term LLM memory, we chose to enter long-term maintenance mode.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/IMG_9468.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I&apos;m glad I made MoFlow at the right moment. It kept me on the frontlines of the AI wave. And through this emotional wellness project, I&apos;ve come to understand something more clearly: AI is evolving fast, but the things that can&apos;t be quantified by algorithm — the deep conversation between strangers, the resonance that arrives unexpectedly at 2am — these are the most precious privilege of being carbon-based creatures.&lt;/p&gt;
&lt;h3&gt;The Job Search&lt;/h3&gt;
&lt;p&gt;As I wrote in &lt;a href=&quot;https://blog.ursb.me/posts/weekly-29/&quot;&gt;Monthly #29: New Life&lt;/a&gt;, I did several interviews in February and March. The job market felt tighter than when I graduated, but for someone with the right skills, satisfying opportunities still exist. I&apos;d been wanting to go abroad and see what was out there, and fortunately, I seized the chance.&lt;/p&gt;
&lt;h3&gt;The New Job&lt;/h3&gt;
&lt;p&gt;I won&apos;t say much here for compliance reasons. I&apos;m in a rapidly growing TikTok business — the pure-analytics decision-making approach means I&apos;m absorbing a lot of business knowledge, fast. The volume of things to learn is staggering, and I&apos;m enjoying the sensation of ideas flowing into my mind again.&lt;/p&gt;
&lt;p&gt;One big change: I started managing people. Coming from a strong IC (Individual Contributor) background, the transition to POC (Point of Contact / team lead) hasn&apos;t been smooth. I&apos;m very grateful to my leader — he&apos;s been patiently guiding my landing over several months. But I still love coding, so I always carve out some first-line engineering work for myself.&lt;/p&gt;
&lt;p&gt;The core skill for people management is &lt;strong&gt;effective communication&lt;/strong&gt;, which requires regular one-on-ones — digging into what each person and each situation really needs underneath the surface.&lt;/p&gt;
&lt;p&gt;Second is &lt;strong&gt;building trust&lt;/strong&gt;: don&apos;t put out every fire yourself. Delegate meaningfully, develop people deliberately — this holds across cultures.&lt;/p&gt;
&lt;p&gt;On communication, I want to share a framework I find useful — the &lt;strong&gt;Trust Equation&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;(Credibility × Reliability × Intimacy) / Self-Interest&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Improving communication success comes down to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Credibility&lt;/strong&gt; (expertise): Speak from professional judgment and facts. Do the homework. This is your technical and business capability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reliability&lt;/strong&gt; (dependability): Respond promptly, resolve issues, be someone others can lean on. This is built through daily behavior and accumulated trust.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Intimacy&lt;/strong&gt; (relationship warmth): Talk about things beyond work. Create a warm, equal atmosphere. This is about genuine care for others, and the kind of thoughtful personality that shows it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduce self-interest&lt;/strong&gt; (motivation): Open by stating your positive intentions. Minimize personal stakes, don&apos;t let it look like you&apos;re using the situation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every time I use communication to shift momentum or unblock a stuck situation, I feel a satisfaction I&apos;ve never felt in IC work.&lt;/p&gt;
&lt;p&gt;Being in a fast business means every day is full. As an IC I always planned my time and projects with precision. But when your collaborators multiply, change outpaces planning — and eventually: &lt;strong&gt;work is never finished&lt;/strong&gt;. That&apos;s just the truth. This tests two things: &lt;strong&gt;focus&lt;/strong&gt; and &lt;strong&gt;judgment&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;On focus: for a long time after joining, my Todoist was an endless list. Staring at it produced a sense of overwhelm and anxiety. I used to think the antidote to anxiety was specificity — plan every item, then execute. But when things are huge and vague, that just means drowning in the specifics of tomorrow&apos;s calendar two hours from now, all the tiny concrete anxieties piling up before I even start.&lt;/p&gt;
&lt;p&gt;Now I&apos;ve stopped using Todoist&apos;s &quot;Upcoming&quot; view. I focus only on what&apos;s in front of me and let everything else go. That&apos;s when I started to feel my feet on solid ground.&lt;/p&gt;
&lt;p&gt;On judgment: beyond prioritizing my own work, the bigger question is whether to do something at all, how, and what value it brings. Resources are always finite. Using limited resources to produce maximum business return requires sharper judgment than any individual task management system.&lt;/p&gt;
&lt;h2&gt;Life&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/photo_2026-02-15_21-36-30.jpg&quot; alt=&quot;&quot; /&gt;&lt;em&gt;Image generated by NotebookLM from my diary&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Singapore&lt;/h3&gt;
&lt;p&gt;This year, I migrated to the equator. It&apos;s a small country — you can drive across it from east to west in 40 minutes. The physical relocation seems to have shifted my internal clock too. Here, without seasonal change to mark the passage of time, only an eternal summer, I&apos;m forced to face each bare moment directly.&lt;/p&gt;
&lt;p&gt;The cost of living jumped sharply. My Singapore dollars need to be spent like Chinese yuan, while I&apos;m still paying full Chinese income tax — not a good financial ratio by any calculation. But I wanted to see what was out there. If past trips abroad were an escape from present exhaustion, living abroad now is about remeasuring the texture of the world.&lt;/p&gt;
&lt;p&gt;Food and climate have been manageable — not so different from Shenzhen. I&apos;ll save the full living-cost breakdown for a future monthly letter.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/8fc513d2e94deebacc3cebab7a79a581.jpeg&quot; alt=&quot;&quot; /&gt;&lt;em&gt;National Day military parade&lt;/em&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image.png&quot; alt=&quot;&quot; /&gt;&lt;em&gt;City at night&lt;/em&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%201.png&quot; alt=&quot;&quot; /&gt;&lt;em&gt;A church in the city center&lt;/em&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%202.png&quot; alt=&quot;&quot; /&gt;&lt;em&gt;Sentosa&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Travel&lt;/h3&gt;
&lt;p&gt;April: Suzhou, China.&lt;/p&gt;
&lt;p&gt;October: Indonesia, Malaysia, Macau — &lt;a href=&quot;https://blog.ursb.me/posts/weekly-33&quot;&gt;Monthly #33: Ladder of Reasoning&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%203.jpg&quot; alt=&quot;&quot; /&gt;&lt;em&gt;Sunrise over an Indonesian island&lt;/em&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/IMG_9474.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%204.jpg&quot; alt=&quot;&quot; /&gt;&lt;em&gt;A Macau street corner&lt;/em&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%205.jpg&quot; alt=&quot;&quot; /&gt;&lt;em&gt;A grand Macau shopping mall&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Health&lt;/h3&gt;
&lt;p&gt;This past month, a kidney stone made my life miserable. A 7mm stone blocked my ureter. First visit to a clinic: misdiagnosed as gastritis. Took medication for three days without improvement. Fourth day: intense pain in the early morning. Went back — still missed. Finally went to a hospital for a CT scan and blood panel. That basic workup alone cost 2,300 SGD (roughly 15,000 CNY). Confirmed kidney stone. Scheduled extracorporeal lithotripsy. Then complications, one after another — four procedures total.&lt;/p&gt;
&lt;p&gt;Procedure 1: Ultrasound lithotripsy. Failed. Infection. Hospitalized.&lt;/p&gt;
&lt;p&gt;Procedure 2: General anesthesia, stent insertion. Infection resolved.&lt;/p&gt;
&lt;p&gt;Procedure 3: General anesthesia, retrograde intrarenal surgery (RIRS).&lt;/p&gt;
&lt;p&gt;Procedure 4: Local anesthesia, stent removal.&lt;/p&gt;
&lt;p&gt;Total cost: over 60,000 SGD (roughly 300,000+ CNY). Private hospital service was excellent — the room was more like a hotel, the food was proper meals with real choices. Company insurance covered everything in full. In China&apos;s public hospitals, the same thing would cost under 10,000 CNY.&lt;/p&gt;
&lt;h2&gt;Learning&lt;/h2&gt;
&lt;h3&gt;Reading Flow&lt;/h3&gt;
&lt;p&gt;I covered this in &lt;a href=&quot;https://blog.ursb.me/posts/weekly-31/&quot;&gt;Monthly #31: A Claude-Based Reading Flow&lt;/a&gt;, but a few additions:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tana&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I use Tana + Heptabase as my note system, but in the AI era I&apos;ve moved almost entirely to Tana. A few high-efficiency workflows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Custom AI Commands for extended exploration&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For instance: I write a single sentence — &quot;Why is Xiaohongshu (RedNote) torn between advertising and e-commerce?&quot; — then trigger a custom AI Command that sends it to Gemini Pro for deep exploration, then calls another Command to generate an image via Nano Banana.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/2046.jpg&quot; alt=&quot;&quot; /&gt;&lt;em&gt;Tana-generated image for RedNote&lt;/em&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/photo_2026-02-15_21-59-31.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This works for deep research and output on any topic, and the generated images are visually clean and appealing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bookmark auto-summarize and image generation&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I built a simple workflow: when I save a page to Raindrop, it triggers an IFTTT webhook that calls the Tana Input API, tagging the URL with &lt;code&gt;#link&lt;/code&gt; and saving it to Today. The &lt;code&gt;#link&lt;/code&gt; supertag is configured to automatically invoke a custom AI Command when a node is added — this Command fetches the page content, runs it through a custom article interpretation prompt, and then generates an image via Nano Banana.&lt;/p&gt;
&lt;p&gt;The whole flow is seamless, and subscription costs are reasonable given my early-adopter pricing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Infinite recursive deep exploration&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have a &lt;code&gt;#question&lt;/code&gt; supertag with two AI fields: one for deep summary, one for philosophical reflection. When a question occurs to me, I log it in Tana first — but I don&apos;t trigger the AI fields immediately. I think through it myself, search for relevant material, and fill in my own answer first (I believe this step is essential — see &lt;a href=&quot;https://blog.ursb.me/posts/weekly-31/&quot;&gt;Monthly #31&lt;/a&gt;). Then I trigger the AI fields to generate the deep summary and philosophical reflection, letting AI fill in what I missed.&lt;/p&gt;
&lt;p&gt;The interesting part: in Tana, every sentence is a node. That means I can take any sentence from the AI summary or reflection, tag it with &lt;code&gt;#question&lt;/code&gt;, and recursively explore it infinitely. This is extremely useful for deep research — it builds a very dense and durable understanding of a knowledge domain.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Connecting with OpenClaw&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tana recently launched MCP support — now you can not only Input but do full CRUD on your Tana workspace. The possibilities exploded. For example: I had OpenClaw write a Tana skill, so when an interesting topic comes up in my Telegram conversation with OpenClaw, it can search or save directly to Tana.&lt;/p&gt;
&lt;p&gt;AI-era notes still benefit from fragmented capture, but periodic synthesis to train organizational and expressive ability is also important. For that I still use Heptabase — I&apos;ve introduced it before, won&apos;t repeat myself here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NotebookLM&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using it for over a year now. Mainly for deep search — when I encounter a topic, I let NotebookLM gather the source material, then generate a PPT, which gives me a fast Outline of the domain and lets me build an initial framework from the key points.&lt;/p&gt;
&lt;p&gt;Once the framework exists, deeper learning has direction. When going back to Tana for infinite recursive exploration, knowing how to ask good questions is critical — that&apos;s what gives the &lt;code&gt;#question&lt;/code&gt; supertag enough information density to be useful.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;YouMind&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;玉伯&apos;s product (Yupeng Mu, a well-known Chinese tech figure). Advantage: seamless Bilibili, YouTube, and WeChat public account collection in China, without needing to set up the workflows I described above. Good for beginners getting into knowledge management.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%206.png&quot; alt=&quot;&quot; /&gt;&lt;em&gt;My YouMind board&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;AI&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Started using Claude Code around mid-2025. Running on a friend&apos;s 200 USD subscription — coding is basically inseparable from it now. CLI tools have the most complete permissions and context by default, so beyond AI coding, there&apos;s a lot of interesting customization possible in CLI mode.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AnyGen&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The weekend Manus got acquired by Meta, ByteDance released AnyGen. It had been running internally for nearly a year with a strong reputation — the experience is on par with Manus and similar products (Flowith, Fellou, etc.). Signed up immediately after launch. Currently using it mainly for scheduled tasks.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hapi&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Before Clawdbot, I used Hapi to control Claude Code on my Mac Mini remotely. Tried Happie and Droid too, but Hapi was the most frictionless. I can operate Claude Code through a public endpoint proxied by Hapi from anywhere — on the subway, letting it vibe code, fetch my schedule, plan Todoist.&lt;/p&gt;
&lt;p&gt;I thought I&apos;d use this setup for a long time. Then the lobster appeared.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I noticed Clawdbot (OpenClaw) before it blew up in Chinese tech circles, but I initially dismissed it as just an interface change — not something that could replace my custom setup. I was completely wrong. The gap between &quot;working&quot; and &quot;working well&quot; is often just one step. OpenClaw&apos;s division of each Agent&apos;s configuration into AGENTS, SOUL, IDENTITY, TOOLS, USER, HEARTBEAT, and BOOTSTRAP lets the agent&apos;s personality and communication style adapt vividly to user needs. I think that&apos;s a key reason it spread so fast.&lt;/p&gt;
&lt;p&gt;After migrating to Clawdbot, I still use my full reading flow, RSS subscriptions, Google Calendar, and Todoist — these are standard agent use cases. Let me share some of my more interesting OpenClaw setups:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Double-entry Bookkeeping&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I tried proper double-entry accounting before, but having to edit Beancount syntax in an IDE was unsustainable. With OpenClaw, Beancount&apos;s non-human-friendly format becomes AI-friendly. Overseas credit cards send email notifications — with an email integration, OpenClaw can do auto-bookkeeping.&lt;/p&gt;
&lt;p&gt;Stock tracking also works with Beancount: log positions, let OpenClaw generate a daily holdings report based on market conditions, and suggest rebalancing. Actually kind of fun.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Body Data&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Apple Watch body metrics get scripted to a specified iCloud directory every hour. A body-data skill lets OpenClaw monitor my physical state and offer suggestions.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/IMG_9478.jpeg&quot; alt=&quot;&quot; /&gt;&lt;em&gt;OpenClaw reporting body data&lt;/em&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/photo_2026-02-15_21-55-45.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Multi-Agent Household&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Currently running 10 Agents from 5 different model providers, all in a group chat orchestrated by a primary Agent. Family members are in the same group and use them for everyday life. The chat has gotten noticeably more active:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/2030.jpg&quot; alt=&quot;&quot; /&gt;&lt;em&gt;OpenClaw bringing the group chat to life&lt;/em&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/2032.jpg&quot; alt=&quot;&quot; /&gt;&lt;em&gt;OpenClaw bringing the group chat to life&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;These Agents are deployed in two places — Mac Mini and Railway — so they can back each other up and maintain stability under unexpected conditions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Service Development&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using LocalCan + ngrok, I&apos;ve allocated 10 public-facing ports, each bound to a domain. I direct another dev Agent in the group chat to code something, and once it&apos;s done it deploys the service directly — I don&apos;t look at a line of code, I just check the result. Being the boss feels great.&lt;/p&gt;
&lt;p&gt;PS. MoFlow is now entirely maintained by AI.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;YouMind Ingestion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For platforms without an API or MCP, you can write a Skill by capturing network requests. For example: when I come across an interesting article, I drop it in the group chat for the deep-reading Agent to analyze. If it thinks the article is worth keeping, it saves it to YouMind automatically.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/IMG_9479.jpeg&quot; alt=&quot;&quot; /&gt;&lt;em&gt;Cloud coding in the MoFlow group&lt;/em&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/IMG_9476.jpeg&quot; alt=&quot;&quot; /&gt;&lt;em&gt;OpenClaw saving to YouMind&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Investing&lt;/h3&gt;
&lt;p&gt;Plenty of opportunity in 2025, but my conservative approach produced a final return of under 30%. I think that&apos;s a healthy number — not spectacular, but I&apos;ve been in the green every year since 2020. A few principles I try to hold:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Never buy stocks you don&apos;t understand&lt;/strong&gt;: Study the fundamentals. Understand the logic behind every move. Build a rational position. Write down the plan before every trade (I designed a trade template in a Google Doc — fill it out, set the take-profit, stop-loss, scaling-in, and scaling-out targets, then execute as written). Set orders before the trading session opens. Don&apos;t watch the ticker during the day. Make no unplanned moves.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintain low, steady positions&lt;/strong&gt;: Always have capital available to enter at the right moment. Never use leverage. Never pick up pennies in front of a steamroller (don&apos;t take on catastrophic hidden risk for small certain gains).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don&apos;t put all your eggs in one basket&lt;/strong&gt;: Position sizing, brokerage accounts, currency/fund/equity diversification — apply this principle everywhere. If you&apos;re holding tech stocks, offset them with an appropriate blue-chip position.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Favorite Things&lt;/h2&gt;
&lt;h3&gt;Hardware&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ray-Ban Meta&lt;/strong&gt;: Can record video and take photos — roughly iPhone 12 camera quality, which is fine for everyday use. Downsides: wearing them draws attention in public (people notice the camera), they&apos;re not waterproof which is a problem in rainy Singapore, and a full charge doesn&apos;t last a full day. Audio quality is poor — functional but nothing more. Haven&apos;t charged them in six months; wearing them as regular glasses now. The custom Zeiss lenses (blue light filter + auto-tint) are genuinely excellent.&lt;/p&gt;
&lt;p&gt;Recently preordered the Even G2 — noticed MentraOS and Even have OpenClaw-compatible interfaces. Will experiment when it arrives.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%207.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Shokz open-ear headphones&lt;/strong&gt;: A productivity multiplier for calls. Probably the best single purchase of the year. 8–10 video calls a day sometimes, occasionally double-booking in person and remote — open-ear headphones are essential. Protects hearing too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Samsung Z Fold 7&lt;/strong&gt;: The ecosystem is a self-imposed wall, but getting over it opens up genuinely new experiences. Samsung&apos;s customization level is very high, which means high playability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Surface Pro 12&lt;/strong&gt;: Bought for document writing and vibe coding. Perhaps the best vibe coding device for this era — the specs and screen are mediocre, but it&apos;s a fully capable PC, which iPad Pro unfortunately can&apos;t claim.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Folding bicycle + skateboard&lt;/strong&gt;: Singapore&apos;s MRT and bus system covers most needs, but a folding bike makes you completely mobile. The skateboard took a lot of falls to learn, but it&apos;s now a viable short-distance transport option.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;KODAK Instax Camera + Printer&lt;/strong&gt;: Company New Year gift. Printing a few photos as keepsakes has a nice sense of occasion.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Software&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PeakWatch&lt;/strong&gt;: Quantifies your body energy via Apple Watch and turns it into a visual battery meter. One quarter of use later: impressively accurate. When sick, energy recharges slowly and peaks lower. When well-rested and well-fed, energy bounces back fast. The data tracks intuition well.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/IMG_9473.png&quot; alt=&quot;&quot; /&gt;&lt;em&gt;Normal energy consumption&lt;/em&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/IMG_9472.png&quot; alt=&quot;&quot; /&gt;&lt;em&gt;Energy during illness&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MoneyWiz&lt;/strong&gt;: Still the best in class for my needs — standard bookkeeping, budgeting, and reporting, plus multi-currency accounting and stock tracking, which I care about most.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Typeless&lt;/strong&gt;: Better product detail than Wispr Flow and Lightning Voice — voice input combined with AI polish is seamless. Useful for casual AI conversation where exact wording doesn&apos;t matter. Also good for journaling by voice.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Books, Films &amp;amp; Music&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Film&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;F1: ★★★★★ — Watched twice in theaters. The plot is the old hero-story formula, but the audiovisual immersion is addictive.&lt;/li&gt;
&lt;li&gt;Catch the Butterfly: ★★★★★&lt;/li&gt;
&lt;li&gt;Zootopia 2: ★★★★★&lt;/li&gt;
&lt;li&gt;Demon Slayer: Infinity Castle Arc Part 1: ★★★★★&lt;/li&gt;
&lt;li&gt;One Battle After Another: ★★★★☆&lt;/li&gt;
&lt;li&gt;Conclave: ★★★★☆&lt;/li&gt;
&lt;li&gt;Final Destination: Bloodlines: ★★★☆☆&lt;/li&gt;
&lt;li&gt;Wanted (Yang Ming Li Wan): ★★★☆☆&lt;/li&gt;
&lt;li&gt;Together: ★★★☆☆&lt;/li&gt;
&lt;li&gt;Train to Busan: The Valley of Death: ★★★☆☆&lt;/li&gt;
&lt;li&gt;The Wailing: ★★★☆☆&lt;/li&gt;
&lt;li&gt;The Fantastic Four: First Steps: ★★☆☆☆&lt;/li&gt;
&lt;li&gt;Detective Conan: The One-Eyed Remnant: ★★☆☆☆&lt;/li&gt;
&lt;li&gt;Emergency Declaration: ★★☆☆☆&lt;/li&gt;
&lt;li&gt;Flood: ★☆☆☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;TV&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When Life Gives You Tangerines: ★★★★★ — East Asian viewers are apparently drawn to stories of hardship and endurance.&lt;/li&gt;
&lt;li&gt;Bad Karma (E Yuan): ★★★★★ — Expected independent vignettes; they turned out to be interconnected threads of a larger web. Clever design.&lt;/li&gt;
&lt;li&gt;Pantheon: ★★★★★&lt;/li&gt;
&lt;li&gt;All Her Fault: ★★★★★&lt;/li&gt;
&lt;li&gt;Jujutsu Kaisen: Death Regression Arc: ★★★★☆ — visually distinctive, but the style feels slightly mismatched with the series&apos; overall aesthetic.&lt;/li&gt;
&lt;li&gt;The Knight (Qi Shi): ★★★★☆&lt;/li&gt;
&lt;li&gt;Insomnia Day: ★★★☆☆&lt;/li&gt;
&lt;li&gt;Drug Bust Storm: ★★★☆☆&lt;/li&gt;
&lt;li&gt;Zombie Drifters (Mi Shi Xiao Yuan): ★★★☆☆&lt;/li&gt;
&lt;li&gt;Alice in Borderland Season 3: ★★★☆☆&lt;/li&gt;
&lt;li&gt;The Rest of Your Life Has Limits: ★★★☆☆&lt;/li&gt;
&lt;li&gt;Heading to the Mountains and Sea (Fu Shan Hai): ★★☆☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Manga&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jujutsu Kaisen modulo: ★★★★☆ — Tora is incredible! The main characters from the original series absolutely deserve this kind of power-fantasy treatment in the sequel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Books&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Maybe You Should Talk to Someone (Wo Ke Neng Cuo Le): ★★★★★&lt;/li&gt;
&lt;li&gt;A Course on Literature by Yu Hua: ★★★★★&lt;/li&gt;
&lt;li&gt;Scream (Jue Jiao): ★★★★☆&lt;/li&gt;
&lt;li&gt;Young Babylon (Shao Nian Ba Bi Lun): ★★★★☆&lt;/li&gt;
&lt;li&gt;Wings of the Kirin (Qi Lin Zhi Yi): ★★★☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Games&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hades II: ★★★★☆&lt;/li&gt;
&lt;li&gt;Superhero Agency: ★★★★☆ — ending felt rushed, but this might be a glimpse of what future interactive storytelling looks like.&lt;/li&gt;
&lt;li&gt;Diablo IV: ★★★★☆&lt;/li&gt;
&lt;li&gt;Song of Silk (Si Zhi Ge): ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Writing&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-29/&quot;&gt;Monthly #29: New Life&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-30&quot;&gt;Monthly #30: Written on My 30th Birthday&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-31&quot;&gt;Monthly #31: A Claude-Based Reading Flow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-32&quot;&gt;Monthly #32: An Interview with the SYSU Alumni Association&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-33&quot;&gt;Monthly #33: Ladder of Reasoning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/game-engine-renderer/&quot;&gt;The Life of a Game Component: From Load to Screen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Effective Communication SOP&lt;/em&gt; (internal)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;New Year Goals&lt;/h2&gt;
&lt;p&gt;Standing at the start of 30, I didn&apos;t arrive at the panic I&apos;d imagined. As a child, thirty felt like an unreachable shore. Now that I&apos;m here, it&apos;s just an ordinary Monday in the long river of life.&lt;/p&gt;
&lt;p&gt;I don&apos;t know where the next stop is. But I&apos;ve started to enjoy the feeling of being on the way there. Whatever I encounter, I embrace it. Everything is welcome. From here, I am my own direction.&lt;/p&gt;
&lt;p&gt;Here&apos;s to this brand new journey. Here&apos;s to every concrete anxiety along the way. May we all hold onto our certain selves in an uncertain world.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/image%208.jpg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2025/05F2C1F8-B457-4774-96B5-36CDDFAF7E02.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2025&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>Weekly #33: The Ladder of Inference</title><link>https://ursb.me/en/posts/weekly-33/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-33/</guid><description>Introduces the Ladder of Inference, the seven steps from raw sensory data to belief and action and their limits, arguing for lowering fixed judgments.</description><pubDate>Sat, 15 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This issue covers my reflections from September to October 2025.&lt;/p&gt;
&lt;p&gt;The video &lt;a href=&quot;https://www.youtube.com/watch?v=KJLqOclPqis&quot;&gt;&lt;em&gt;Rethinking Thinking&lt;/em&gt;&lt;/a&gt; introduces the concept of the &quot;Ladder of Inference&quot; — a model of how we process the raw information we perceive in the world. It breaks the process into seven steps:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Raw data&lt;/strong&gt;: The unfiltered data of the world as our senses receive it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selected data&lt;/strong&gt;: From everything we perceive, we unconsciously use attention to filter certain details and information.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interpreted data&lt;/strong&gt;: We try to make sense of what we&apos;ve selected — to understand what it means.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assumptions&lt;/strong&gt;: We develop assumptions based on the meaning we&apos;ve created. At this stage, the line between fact and story starts to blur.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conclusions&lt;/strong&gt;: We draw conclusions from our assumptions, and our emotional reactions emerge here.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Beliefs&lt;/strong&gt;: We update our existing beliefs about the world based on our current experience.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Actions&lt;/strong&gt;: We act based on our updated beliefs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every step on this ladder has its own limitations, which means we&apos;re inevitably unable to perceive reality directly. At the very first step — raw data — the limits of human sensory systems ensure we can never receive the full picture, and what we do receive can&apos;t accurately reflect objective reality.&lt;/p&gt;
&lt;p&gt;Benford&apos;s Law reveals that in many naturally occurring datasets, the distribution of values follows a logarithmic rather than a uniform pattern. A vast amount of real-world data doesn&apos;t grow linearly; it spans many orders of magnitude. To accommodate this, biological nervous systems have evolved logarithmic encoding so the brain can maximize the information it receives. This is also what the Weber-Fechner Law describes: our sensory systems respond to stimuli proportionally. What we perceive is a representation jointly constructed by our senses and our brain — not reality itself.&lt;/p&gt;
&lt;p&gt;Zimbardo wrote in &lt;em&gt;Psychology and Life&lt;/em&gt;: &quot;Perception gives meaning to sensation, so perception produces an interpretation of the world, not a perfect representation of it.&quot; Knowledge is not merely information — it is interpretation that emerges dialectically as an individual&apos;s cognitive model collides continuously with the environment. Everything we understand about life has been filtered through these meanings and perspectives. We don&apos;t live in reality; we live in our perception of reality.&lt;/p&gt;
&lt;p&gt;The brain isn&apos;t seeking truth — it&apos;s seeking a reliable, stable model. For survival, the brain must rely on models, and so it works hard to protect the models it believes in.&lt;/p&gt;
&lt;p&gt;Hardened beliefs push us to rely on &quot;System 1&quot; — the fast, energy-efficient mode of judgment. When that happens, it can help to pause and trace the ladder of inference that led to a particular conclusion: what&apos;s at each level, and is there a higher vantage point from which to see things more clearly? Letting &quot;System 2&quot; do some work often leads to a more objective reading of the situation.&lt;/p&gt;
&lt;p&gt;The concepts we carry in our minds are each the result of countless overlapping horizons of understanding. The higher we stand, the wider our historical and cultural view — and the better equipped we are to correctly gauge the significance of everything within that view, from the large to the small, the near to the far.&lt;/p&gt;
&lt;p&gt;But we must also accept that we can only ever approach reality, never fully arrive at it. That means staying genuinely humble when encountering different perspectives — willing to hold them, to sit with them.&lt;/p&gt;
&lt;p&gt;I touched on a related idea in an earlier post, &lt;a href=&quot;https://blog.ursb.me/posts/life/&quot;&gt;&lt;em&gt;On Existence, Value, and the Experience of Living&lt;/em&gt;&lt;/a&gt;: the real world is complex and plural. Limiting yourself only to what you consider &quot;worthwhile&quot; is both narrow and a loss, because you&apos;ll miss so much that is rounded, sharp, obscure, and quietly beautiful. Lowering the threshold of &quot;value&quot; often turns out to be the better way to find life&apos;s hidden sweetness.&lt;/p&gt;
&lt;p&gt;So maybe the move is to demote that inner model — stop letting it occupy the top of your value hierarchy. When you do, you become more open, and in becoming more open, you find more joy. You also get to experience life more honestly, and to keep growing.&lt;/p&gt;
&lt;p&gt;Some people build authority and others blindly follow; some people champion niche things and others think they&apos;re just showing off. These are all just different people, in different moments, in different places, in different moods, looking at the world in their own way. As long as you can ultimately see the thing itself — and collect the sweetness from all those different vantage points along the way — does it really matter which path you took to get there?&lt;/p&gt;
&lt;h2&gt;Life Moments&lt;/h2&gt;
&lt;p&gt;Work was intense these two months, but looking back I still managed to squeeze in a few trips.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🇲🇾 Johor Bahru, Malaysia&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Our team went to Johor Bahru for a team dinner and escape room outing. I realized when writing this that I didn&apos;t take a single photo those two days. JB overall reminded me of a second- or third-tier city in China, with a sizable ethnic Chinese population.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🇮🇩 Batam Island, Indonesia&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I didn&apos;t have time off during China&apos;s National Day holiday, so I had to watch the travel photos roll across my feed with some envy. To compensate, I took the weekend to go lie on a beach in Batam for two days — my version of a National Day break.&lt;/p&gt;
&lt;p&gt;A sunrise at the water&apos;s edge — the XPan crop turned out pretty well:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/B0000431HEIC1759535470.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🇨🇳 Beijing &amp;amp; Zhuhai&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The week after National Day I was back in mainland China for work — first Beijing, then Zhuhai. First time back in six months. The first order of business was finding good food. Multiple meals a day. Nothing beats food back home.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/B0000486HEIC1760271280.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And finally got my long-awaited Ah Ma Homemade drink:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/B0000493HEIC1760272098.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🇲🇴 Macau&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After the Zhuhai work trip, I spent a weekend doing a full day of city walking in Macau.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/B0000559HEIC1760771304.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/B0000583HEIC1760772990.jpeg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/B0000514HEIC1760766420-1.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🇸🇬 Halloween at Universal Studios Singapore&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Also made it to USS in October for the Halloween night event — four exclusive haunted houses, all jump-scare based. The set design was creative but the experience felt pretty similar across all of them.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj33/20251025_215212.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Books, Films &amp;amp; Music&lt;/h2&gt;
&lt;p&gt;Here&apos;s what I consumed this period:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Watched: Series | &lt;em&gt;When the Stars Gossip&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watched: Series | &lt;em&gt;Zombie Campus&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Watched: Series | &lt;em&gt;The Rest of Our Life&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Watched: Series | &lt;em&gt;Journey to the Mountains and Seas&lt;/em&gt; | ★★☆☆☆&lt;/li&gt;
&lt;li&gt;Watched: Series | &lt;em&gt;Alice in Borderland Season 3&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Shadow in the Cloud&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Nanjing Photo Studio&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Fight Back to School&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;For Better or Worse&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Reading: Nonfiction | &lt;em&gt;Gödel, Escher, Bach&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Read: Fiction | &lt;em&gt;Wings of the Kirin&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Played: Game | &lt;em&gt;Marvel&apos;s Midnight Suns&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Playing: Game | &lt;em&gt;Silksong&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-33&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #32: A Sun Yat-sen University Alumni Interview</title><link>https://ursb.me/en/posts/weekly-32/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-32/</guid><description>Shares an alumni interview with Sun Yat-sen University&apos;s Philosophy Department on why the author chose philosophy, and how it shaped his tech career.</description><pubDate>Sat, 16 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This issue covers my reflections from July to August 2025.&lt;/p&gt;
&lt;p&gt;Last weekend I had the pleasure of being visited by a student doing an outstanding alumni project for the Philosophy Department at Sun Yat-sen University. She sent me the interview outline in advance, so I thought I&apos;d pick a few of the questions here and share some of what we talked about, as best as I can recall.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q1. You enrolled in SYSU&apos;s Philosophy Department in 2017 and completed a master&apos;s in Chinese Philosophy. What first drew you to Chinese philosophy at SYSU? And among all the philosophical traditions, why this one in particular?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The turning point came after I&apos;d gone deep into technology during my undergrad. I started to feel a kind of fatigue and disorientation. When I found myself facing choices like &quot;should I work on the project that wins awards or the one I actually want to do,&quot; I started asking: why am I even doing technical work? For fun? To change the world? In that environment, both felt out of reach — and not being changed by the world seemed like the more realistic goal.&lt;/p&gt;
&lt;p&gt;That questioning — about the meaning of technology, about direction in life — was what pushed me toward philosophy. My goal was clear: &quot;not for any other reason, just to find a kind of bearing, a state of mind that could hold the whole cosmos with equanimity.&quot; (From &lt;a href=&quot;https://blog.ursb.me/posts/summary-2017/&quot;&gt;&lt;em&gt;Goodbye, My College Years&lt;/em&gt;&lt;/a&gt;.) I also wanted philosophy to help me understand &quot;warmth&quot; and &quot;happiness.&quot;&lt;/p&gt;
&lt;p&gt;As for why Chinese philosophy specifically — I think my natural way of thinking was drawn to it. I tend to care more about lived practice and inner settledness. My experience during a teaching practicum made this even clearer. Every day I&apos;d walk through the corridors of the primary school reading Chinese and Western philosophy to prep for exams, while the sound of children reciting lessons filled the air. Philosophy&apos;s wisdom and the children&apos;s unstudied purity — together they felt extraordinarily warm. That was the beginning of my emotional connection to Chinese philosophical thought.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q2. How did your time in the Philosophy Department shape your later path, especially your career choices? You&apos;ve mentioned your philosophy background and your experience as a primary school teacher — how did those seemingly non-technical years influence the way you approach technical work at Tencent? And how do you think about the idea that university is just preparation for employment?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&apos;d say philosophy shaped my approach to technical work in a few ways.&lt;/p&gt;
&lt;p&gt;First, it cultivated a habit of tracing things back to first principles. Philosophical training teaches you to keep asking &quot;why,&quot; and when I encounter technology that instinct kicks in — I don&apos;t just want to know how to use it, I want to peel back the layers to find what&apos;s underneath. That process is genuinely exciting to me; it&apos;s how curiosity gets satisfied. It&apos;s also why my technical path has gone deeper over time — from front-end into client-side development, with a particular fascination with browsers and rendering.&lt;/p&gt;
&lt;p&gt;Second, philosophy trained me to think in systems. When I&apos;m in development I try to step back and see the whole product chain at once — evaluating whether each stage makes sense. In terms of business thinking, it&apos;s also a reminder not to be confined to whatever&apos;s immediately in front of me: dig into root causes vertically, survey the competitive landscape horizontally, and think beyond the present toward where things are heading. That habit of stepping outside the current module to see the whole system — I think that&apos;s what philosophical holism looks like in practice.&lt;/p&gt;
&lt;p&gt;Third, it strengthened some of the softer communication and expression skills. I won&apos;t go into detail on that.&lt;/p&gt;
&lt;p&gt;On the question of whether university is preparation for employment — there&apos;s some truth to it. That&apos;s the traditional path society endorses: college entrance exam, university, job. But you also have to recognize your own possibilities. University should be a time for exploration — figuring out what kind of future you might want and building the resilience to pursue it.&lt;/p&gt;
&lt;p&gt;From where I sit, the core purpose of university education is to build out your model of the world. To find different ways of seeing problems. To develop independent thinking. And from all that, to develop a sense of right and wrong — and real empathy. These qualities matter more than any single vocational skill. They&apos;re what carry a person further over time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q3. You wrote that programming&apos;s joy comes from &quot;pure creation,&quot; yet in practice technical work often gets distorted by performance metrics. What anti-fragile capacities from philosophy do you find most valuable? And what core qualities should students develop to resist the erosion of meaning?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The anti-fragile capacity philosophy gave me is probably this: it helped me anchor my sense of value internally. That inner anchor means external pressure is less likely to warp who I am. Another thing I&apos;ve been lucky about — maybe luckier than most — is that I had a brush with death early in university. It really drove home the feeling that in the face of life itself, nothing else is all that weighty. We should — we have to — use the time we have to experience what&apos;s rich in life and explore its infinite possibilities.&lt;/p&gt;
&lt;p&gt;On core qualities for students, I mentioned some earlier in passing, but let me be more specific. I think there are at least three:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;The habit of ongoing reflection and review&lt;/strong&gt;: This is a recurring theme in everything I&apos;ve written — from mood journals to annual retrospectives. It&apos;s how I resist the slow grinding away of meaning.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Building a personal system of meaning&lt;/strong&gt;: Students shouldn&apos;t only learn &lt;em&gt;how&lt;/em&gt; — they should think about &lt;em&gt;why&lt;/em&gt;. Ask why you&apos;re learning something, why you&apos;re doing what you&apos;re doing. Build a core that isn&apos;t easily shaken by outside forces.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Staying genuinely curious&lt;/strong&gt;: When curiosity is your source of energy, the sense of value and accomplishment you get from exploring and solving problems is the most stable kind. Curiosity isn&apos;t just a personal engine — it&apos;s really the engine of human progress across history.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Q4. The idea that struck me most from reading about your experience is &quot;embracing change.&quot; Did this come from early experiences, or did it crystallize at a particular point? And in a society that now so widely prizes stability, how do you cultivate and sustain that mindset?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It really was that experience of having one foot over the threshold into death that marked the shift — from ordinary student to someone who actively seeks the meaning of being alive. The way I see it, change is opportunity. It&apos;s a chance to step out of comfort and explore what else might be possible. The meaning of life is to fully experience the present, and if you hold that view, you can meet almost any change with more ease.&lt;/p&gt;
&lt;p&gt;As for how to sustain that attitude — two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ongoing self-reflection&lt;/strong&gt;: As I mentioned, regular writing — retrospectives, reviews, plans — lets me keep looking at the changes in my life and drawing growth from them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Focusing on inner development&lt;/strong&gt;: I think genuine security comes from growing in your own capacities, not from external stability.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Q5. What would you most want to share with current philosophy undergrads and graduate students at SYSU?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Break down the walls of your discipline&lt;/strong&gt;: Don&apos;t be constrained by any label. Invest time in engaging with different fields and then synthesize across them — I think you&apos;ll find something valuable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Practice philosophy in daily life&lt;/strong&gt;: Philosophy isn&apos;t dusty scholarship. There&apos;s an old saying: &quot;The Way is never far from people.&quot; Try using what you&apos;ve learned to analyze a film, a news event, or — like I do — your own life and growth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Find the value in what seems useless&lt;/strong&gt;: Don&apos;t be anxious about philosophy being hard to monetize. The logical rigor, the wide view, the clarity of expression that philosophical training develops — these are rare qualities in any field. At the same time, cultivate one concrete hard skill that gives your thinking somewhere to land.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Q6. If you had to leave one line from Chinese philosophy that&apos;s most shaped your life, what would it be?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Different lines have guided me at different stages. This question actually came up during my graduate school entrance interview. My answer then was from the &lt;em&gt;Doctrine of the Mean&lt;/em&gt;: &quot;If others can do it in one try, I&apos;ll try a hundred. If others can do it in ten, I&apos;ll try a thousand. If you truly follow this path, even the dull will become bright and the weak will become strong.&quot; The idea that diligence can compensate for lack of natural talent is a simple one — but when I was aware that my gifts fell short, it was what I held onto. Even though I hadn&apos;t had systematic philosophy training in undergrad, I was willing to put in more effort; even in areas I&apos;d never encountered, I&apos;d double my effort until I understood. That line still encourages me now. There&apos;s no need to fear the unfamiliar — I have the confidence and the means to master what&apos;s unknown.&lt;/p&gt;
&lt;p&gt;The second line might be from my &lt;a href=&quot;https://blog.ursb.me/posts/summary-2021/&quot;&gt;2021 annual review&lt;/a&gt;: &quot;When things go wrong, look within.&quot; When I run into difficulty, it reminds me to turn inward and find room to grow — though the prerequisite is that you&apos;ve already separated out what&apos;s yours to carry and what isn&apos;t. Otherwise, reflection becomes self-punishment.&lt;/p&gt;
&lt;p&gt;The third is one I&apos;ve felt strongly in the past couple of years: &quot;My life has a limit, but knowledge has none. To pursue the limitless with the limited is exhausting.&quot; Especially in the years of rapid AI development, the means of acquiring knowledge have become almost frictionless. But if you endlessly chase limitless knowledge with a finite life, you&apos;ll wear yourself out. Better to filter and select — pursue what genuinely interests you, internalize it into new understanding, and keep the inner life calm and natural.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q7. Finally — three book recommendations?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;First: &lt;em&gt;Finite and Infinite Games&lt;/em&gt;. I return to it again and again and always find something new.&lt;/p&gt;
&lt;p&gt;Second: &lt;em&gt;Existential Psychotherapy&lt;/em&gt;. It fits very well with how I think about life.&lt;/p&gt;
&lt;p&gt;Third: a hard choice between &lt;em&gt;Why Fish Don&apos;t Exist&lt;/em&gt; and &lt;em&gt;Siddhartha&lt;/em&gt;. I&apos;ll go with &lt;em&gt;Why Fish Don&apos;t Exist&lt;/em&gt; — I hope we can all learn to make peace with uncertainty.&lt;/p&gt;
&lt;h2&gt;Life Moments&lt;/h2&gt;
&lt;p&gt;Sharing a few sunsets I caught this month:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj32/IMG_8276.jpeg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj32/05F2C1F8-B457-4774-96B5-36CDDFAF7E02.jpeg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj32/IMG_8405.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Books, Films &amp;amp; Music&lt;/h2&gt;
&lt;p&gt;Here&apos;s what I consumed this period:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Demon Slayer: Infinity Castle Part 1&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watched: K-Drama | &lt;em&gt;Bad Connections&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;F1&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;The Fantastic Four: First Steps&lt;/em&gt; | ★★☆☆☆&lt;/li&gt;
&lt;li&gt;Watched: Series | &lt;em&gt;Storm of Drug Busters&lt;/em&gt; | ★★☆☆☆&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;The Strangers: Chapter 1&lt;/em&gt; | ★★☆☆☆&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Emergency Declaration&lt;/em&gt; | ★★☆☆☆&lt;/li&gt;
&lt;li&gt;Read: Literature | &lt;em&gt;Yu Hua&apos;s Literary Lectures&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Read: Art | &lt;em&gt;The Creative Act: A Way of Being&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Reading: Fiction | &lt;em&gt;The Venus of Gold&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-32&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #31: A Claude-Powered Reading Flow</title><link>https://ursb.me/en/posts/weekly-31/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-31/</guid><description>Shares a reading workflow built on Claude and MCP: weekday reading in Reader, weekend synthesis with Claude and Readwise notes, and thoughts on reading in the AI era.</description><pubDate>Sat, 05 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Back in &lt;a href=&quot;https://blog.ursb.me/posts/weekly-16/&quot;&gt;Monthly (Issue 16): My Personal Information Flow&lt;/a&gt;, I wrote about how I handle information input and output. Three years on, the rise of AI tools has made me feel it&apos;s time to revisit the topic. This issue, I want to focus on the reading workflow I&apos;ve been refining lately.&lt;/p&gt;
&lt;h2&gt;My Reading Flow&lt;/h2&gt;
&lt;p&gt;I split reading into two modes based on the rhythm of work and life: fragmented reading and deep reading.&lt;/p&gt;
&lt;p&gt;Weekdays rarely give me a quiet mind or an uninterrupted stretch of time, so I save deep reading for weekends. During the week I work through articles from various sources. I take notes directly in Reader as I go, and try to think things through on my own before the weekend arrives.&lt;/p&gt;
&lt;p&gt;Then on weekends I use Claude with MCP — feeding in the notes and questions I accumulated in Reader — to let Claude help flesh out my thinking. The refined notes then get added to a Project&apos;s RAG, so Claude can reference them in the future.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj31/image.png&quot; alt=&quot;&quot; /&gt;Throughout this process I try to stay as tool-agnostic as possible, both to keep things simple and to abstract a method that can survive tool changes. The whole reading flow runs on just two tools: Reader and Claude.&lt;/p&gt;
&lt;h3&gt;Fragmented Reading&lt;/h3&gt;
&lt;p&gt;Fragmented reading has three parts: collect, read, and jot.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj31/20250705184732@2x.png&quot; alt=&quot;&quot; /&gt;For collecting, beyond a handful of RSS feeds I subscribe to in Reader, I also actively hunt for good newsletters to add. Adding articles in Reader is frictionless — you can tap a link while reading and it goes straight to your Library, or use the browser extension. Either way it doesn&apos;t interrupt the flow.&lt;/p&gt;
&lt;p&gt;Reader&apos;s headline feature is automatic highlight sync to Readwise. But the thing I love even more is the ability to write margin notes while reading — those notes also get synced to Readwise automatically, and can later be recalled by Claude via the Readwise MCP.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj31/20250705184354@2x.png&quot; alt=&quot;&quot; /&gt;Reader recently added an AI Chat feature so you can talk directly to an article or PDF. Combined with its existing custom prompt support, it covers most AI-assisted reading scenarios: summarization, translation, term explanation, brainstorming, and more.&lt;/p&gt;
&lt;p&gt;That said, I rarely use these features. In my view, efficiency and reading are in tension with each other — the real goal of reading is to find what lies behind the information. So I prefer to jot my thoughts in the margins as they come, and if I have a question I write it down and sit with it. Give a question a few days before trying to reach for an answer.&lt;/p&gt;
&lt;h3&gt;Deep Reading&lt;/h3&gt;
&lt;p&gt;Speaking of thinking — I value deep reading even more, precisely because it more readily invites it.&lt;/p&gt;
&lt;p&gt;The material I read on weekends is also different: long-form articles, PDFs, or books. I usually read with WeChat Reading or Kindle. I miss the feel of paper, but digital makes it much easier to sync highlights and notes to Readwise, so they&apos;re available for Claude to pull up during the synthesis phase.&lt;/p&gt;
&lt;p&gt;For WeChat Reading, I recommend turning off the &quot;see other readers&apos; highlights&quot; feature to stay in your own head. Keep your attention on everything that happens during the reading experience — including the emotional texture of it — not just the information.&lt;/p&gt;
&lt;h3&gt;Synthesis and Digestion&lt;/h3&gt;
&lt;p&gt;After a week of input, Sunday tends to bring a pile of material that needs to be sorted. As I said earlier, this stage is mainly about answering questions that surfaced during the week, refining my thinking, and using AI to fill in angles I missed or deepen what I already had.&lt;/p&gt;
&lt;p&gt;I create a Project for each topic, load it with my own articles and notes as its RAG, and then work through things with the help of AI.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj31/20250705191459@2x.png&quot; alt=&quot;&quot; /&gt;One thing to note if you&apos;re on Claude Pro: Opus + Research doesn&apos;t give you a ton of quota per day. If I have too many threads going I&apos;ll let Claude run through them asynchronously on weekday evenings. Basically every evening I use up my Claude Pro quota before I sleep, satisfied.&lt;/p&gt;
&lt;p&gt;When prompting here, I generally emphasize &quot;critical thinking.&quot; A couple of prompts I use often:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;You are a world-renowned philosopher. Based on the following content, please raise 3 philosophical, thought-provoking questions to help the reader think expansively.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Li Jigang&apos;s prompt occasionally turns up interesting things too:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;;; Author: Li Jigang
;; Idea from: group member @三亿
;; Version: 0.1
;; Model: Claude Sonnet
;; Purpose: Deconstruct a concept to its core

;; Set the following as your *System Prompt*
(defun 撕考者 ()
  &quot;Tear apart the surface, research the core of the problem&quot;
  (目标 . 剥离血肉找出骨架)
  (技能 . (哲学家的洞察力 侦探的推理力))
  (金句 . 核心思想)
  (公式 . 文字关系式)
  (工具 . (operator
           ;; ≈: approximate
           ;; ∑: integrate
           ;; →: derive
           ;; ↔: mutual influence
           ;; +: information + thinking = good decisions
           (+ . 组合或增加)
           ;; -: thing - irrelevant noise = core
           (- . 去除或减少)
           ;; *: knowledge * action = unity
           (* . 增强或互相促进)
           ;; ÷: problem ÷ angle of analysis = sub-problems
           (÷ . 分解或简化))))

(defun 掰开揉碎 (用户输入)
  &quot;Understand user input, break it apart to analyze core variables, knowledge skeleton, and logical chain&quot;
  (let* (;; Core variables defined using textual relation formulas
         (核心变量 (文字关系式 (概念定义 (去除杂质 (庖丁解牛 用户输入)))))
         ;; Show each step of reasoning for the core variables, down to the core idea
         (逻辑链条 (每一步推理过程 (由浅入深 (概念递进 (逻辑推理 核心变量)))))
         ;; Integrate and distill the core ideas
         (知识精髓 (整合思考 核心变量 逻辑链条)))
    (SVG-Card 知识精髓)))

(defun SVG-Card (知识精髓)
  &quot;Output SVG card&quot;
  (setq design-rule &quot;Use negative space well, overall layout should breathe&quot;
        design-principles &apos;(干净 简洁 逻辑美))

  (设置画布 &apos;(宽度 400 高度 900 边距 20))
  (自动缩放 &apos;(最小字号 16))

  (配色风格 &apos;((背景色 (蒙德里安风格 设计感)))
            (主要文字 (楷体 粉笔灰))
            (装饰图案 随机几何图))

  (动态排版 (卡片元素 ((居中标题 &quot;撕考者&quot;)
             (颜色排版 (总结一行 用户输入))
             分隔线
             知识精髓
             ;; Separate area, ensure graphics don&apos;t overlap text
             (线条图展示 知识精髓)
             分隔线
             ;; Example: say more with fewer numbers
             (灰色 (言简意赅 金句))))))

(defun start ()
  &quot;Run on startup&quot;
  (setq system-role 撕考者)
  (print &quot;Take a seat. What concept are we tearing apart today?&quot;))

;; Rules
;; 1. Must run (start) on startup
;; 2. Then call the main function (掰开揉碎 用户输入)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There&apos;s another one called &quot;The Problem Hammer&quot; that&apos;s also quite good — I&apos;ll skip it here.&lt;/p&gt;
&lt;p&gt;If the question is deep enough and you have Opus + Research turned on, you don&apos;t need to overthink the prompts anyway. I generally ask for critical thinking or expansive exploration — that tends to work well in this reading-synthesis context.&lt;/p&gt;
&lt;p&gt;As an example, if I want to explore the topic of AI writing, I&apos;d ask something like the screenshot below — and it&apos;ll pull in my Readwise notes to think and research on its own:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj31/20250705211956@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Self-Exploration&lt;/h3&gt;
&lt;p&gt;The refined conclusions I arrive at get added to the Project&apos;s RAG. If something feels worth sharing more broadly, I&apos;ll write about it in a monthly post.&lt;/p&gt;
&lt;p&gt;In the process, I&apos;ve found that the accumulated output actually helps me do a kind of self-exploration — it informs the next stage of learning.&lt;/p&gt;
&lt;p&gt;For example, in my Monthly Posts Project, Claude has been remarkably astute at identifying shifts in my thinking over the years:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj31/20250705192357@2x.png&quot; alt=&quot;&quot; /&gt;&amp;gt; The full report is &lt;a href=&quot;https://claude.ai/public/artifacts/ab570268-283b-4dc7-b5ea-2fefcf0f7dbe&quot;&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Claude has also recently rolled out memory capabilities, and I imagine AI will only get better at helping us understand ourselves over time.&lt;/p&gt;
&lt;p&gt;One more thing as a side note: you can use this prompt with ChatGPT to extract a surprisingly accurate user profile of yourself — accurate enough to be a little unsettling. Worth trying if you&apos;re curious:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;I want you to summarize, word for word, everything you know about me so far — who I am, what my relationships are like, how my company is structured, what kinds of information I prefer, what I care about, what&apos;s worrying me right now, and everything else you can think of. I need all of it, because I&apos;m setting up a new GPT account and want to preserve a record of who I am.
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Back to the Heart of Reading&lt;/h2&gt;
&lt;p&gt;AI has already made it so easy — it can assist with reading, accelerate how we take in information; it can help with writing, sharpen how we express our views. So naturally people ask: in the age of AI, what&apos;s the point of reading and writing at all?&lt;/p&gt;
&lt;p&gt;As I said earlier, I believe efficiency and reading are in tension. That&apos;s why I rarely use AI summaries or AI explanations during reading. This isn&apos;t resistance to technology — it&apos;s that reading itself is the value. You can&apos;t outsource the thinking, or you&apos;ll lose yourself in the pursuit of speed and cleverness. That&apos;s why my reading flow deliberately puts weight on the synthesis and reflection phase: to make AI a better thinking partner, not a shortcut around thinking.&lt;/p&gt;
&lt;p&gt;Reading is a bridge to your own experience. Yu Hua put it beautifully:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I&apos;ve said many times: if literature holds any mysterious power, it&apos;s that it lets us — across different eras, nations, cultures, and environments — find in a work something that belongs to us. That&apos;s the wonder of it. A passage, an image, a metaphor, a line of dialogue — any of these can unlock a memory sealed away, and preserve it permanently in the mind&apos;s &quot;documents&quot; and &quot;photos.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;By the same logic, reading a literary work doesn&apos;t just awaken one experience from one period — it awakens many experiences across many periods. And one act of reading can awaken other acts of reading, recalling the textures of readings past. That&apos;s when reading gives birth to another world, another path through life. This is the imaginative reach that literature offers us.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Reading erases all kinds of boundaries — between one reading and another, between reading and living, between one life and another. This dissolution of boundaries lets us find ourselves in works from different centuries, cultures, and continents.&lt;/p&gt;
&lt;p&gt;That experience of recognition is irreplaceable — and it&apos;s also at odds with efficiency. When we&apos;re in a hurry to reach the conclusion, we miss the scenery on the way there.&lt;/p&gt;
&lt;p&gt;Reading is what keeps your attention on everything that happens during the experience — including its emotional texture — not just the information. The associations that arise between lines, the pauses at paragraph breaks, even the memories a single phrase can surface — all of this is part of reading.&lt;/p&gt;
&lt;p&gt;Good reading means being fully present, stretching time, deepening the weight of living. When we&apos;re absorbed in a conversation with the text — without rushing — we can actually arrive at the world the writer was trying to share.&lt;/p&gt;
&lt;p&gt;Real understanding requires stopping to think about how each idea connects to everything else. When we outsource all our thinking to AI, we don&apos;t just lose the memories — we lose the thinking itself.&lt;/p&gt;
&lt;p&gt;Virginia Woolf had a diary collection called &lt;em&gt;Thoughts Are My Resistance&lt;/em&gt;, where she wrote: &quot;The most important thing is to be oneself.&quot; Reading is one of the most direct paths toward that self. You can&apos;t get there by giving up on thought.&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-31&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #30: Written on My 30th Birthday</title><link>https://ursb.me/en/posts/weekly-30/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-30/</guid><description>Written on the author&apos;s 30th birthday, reflecting on a decade of study, career changes, and moving abroad, and on resisting calcifying into repetition of the past.</description><pubDate>Sun, 29 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This issue is a record of and reflection on May and June 2025.&lt;/p&gt;
&lt;p&gt;The ancients said: at thirty, you stand firm. That day has finally come for me. And fittingly, this is also the thirtieth issue of this monthly.&lt;/p&gt;
&lt;h2&gt;Growing Up&lt;/h2&gt;
&lt;p&gt;The other evening I went downstairs to the barbershop for a haircut, chatting with the owner, a man from northeastern China. He said time seems to move faster every year — a day goes by in a blink, barely any sensation of it passing. The same days, repeating. One month to the next, one year to the next. Now he finds himself afraid of time moving too fast, whereas as a child he couldn&apos;t wait for it to speed up — wanting to grow up sooner.&lt;/p&gt;
&lt;p&gt;I haven&apos;t had that feeling in a long time either — that &quot;I can&apos;t wait for tomorrow to come.&quot; As a kid I&apos;d look forward to seeing classmates the next day, to the cartoon episode that would air, to the new Naruto chapter that dropped every Wednesday — I used to close my eyes and will myself to sleep faster, as if blacking out would deliver me straight to the thing I was waiting for.&lt;/p&gt;
&lt;p&gt;But now it&apos;s the reverse. Reluctant for today to end, I stay up holding onto the evening hours as if they&apos;re mine and mine alone, as if by not sleeping I can stretch time indefinitely.&lt;/p&gt;
&lt;p&gt;I saw a line recently: &quot;Explaining a joke is like dissecting a frog — you understand the mechanics and the structure, but the frog is dead.&quot; The same goes for me writing about growing up. By the time I can actually describe what it feels like, I&apos;ve already lost the expectation that once accompanied it.&lt;/p&gt;
&lt;h2&gt;Hopes&lt;/h2&gt;
&lt;p&gt;Romain Rolland said: &quot;Most men die at 20 or 30, and are buried at 60 or 70. They merely repeat themselves for the rest of their lives.&quot;&lt;/p&gt;
&lt;p&gt;The soul is so often seen as dying in one&apos;s twenties or thirties because from that point on, many of us begin mechanically copying yesterday&apos;s thoughts and behaviors — losing the freshness and aliveness of the earlier self.&lt;/p&gt;
&lt;p&gt;This kind of dying is more about the calcification of spirit — when we do nothing but repeat what we once believed, once loved, once rejected, as if deliberately imitating an old and fixed version of ourselves. We no longer perceive the richness and mystery of the world with any sharpness. We can no longer catch the small glimmers and possibilities in everyday life.&lt;/p&gt;
&lt;p&gt;I genuinely miss and feel grateful for the version of me in my early twenties. He had energy and resilience I can barely imagine now. He took enormous pressure and setbacks and kept going. He created experiences that surprised even him —&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An unexpected college entrance exam result that put me in an education department at a second-tier school, from which I taught myself programming, entered competitions, won a national prize, and made it to WWDC (&lt;a href=&quot;https://blog.ursb.me/posts/wwdc-19/&quot;&gt;&lt;em&gt;WWDC 19 Travelogue&lt;/em&gt;&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;A student teaching internship that introduced me to many wonderful kids (&lt;a href=&quot;https://blog.ursb.me/posts/summary-2017/&quot;&gt;&lt;em&gt;Goodbye, My College Years&lt;/em&gt;&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;Studying for the philosophy postgraduate exam and wandering through a sea of philosophical ideas — the widest sky I&apos;ve known (&lt;a href=&quot;https://blog.ursb.me/posts/summary-2018/&quot;&gt;&lt;em&gt;2018: Settling In&lt;/em&gt;&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;Then interning at a major tech company, working hard, advancing quickly (&lt;a href=&quot;https://blog.ursb.me/posts/2024-summer/&quot;&gt;&lt;em&gt;Goodbye, Summer&lt;/em&gt;&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;Then leaving to start something (&lt;a href=&quot;https://blog.ursb.me/posts/weekly-27/&quot;&gt;&lt;em&gt;Monthly (Issue 27): A New Way of Living&lt;/em&gt;&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;And now, living in a foreign country (&lt;a href=&quot;https://blog.ursb.me/posts/weekly-29/&quot;&gt;&lt;em&gt;Monthly (Issue 29): A New Life&lt;/em&gt;&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;He went through a lot in his twenties. There was joy in those experiences, but there was corresponding pain too. It all bears witness to his tenacity and strength.&lt;/p&gt;
&lt;p&gt;I don&apos;t know if the thirty-year-old version of me can inherit that strength. But if I calcify here — if I do nothing but deliberately imitate that older, fixed self — then I&apos;ve wilted.&lt;/p&gt;
&lt;p&gt;What I hope for at thirty: the courage to break free from the beliefs and habits set in my twenties, the willingness to venture into the unfamiliar possibilities I haven&apos;t yet touched.&lt;/p&gt;
&lt;p&gt;Real growth isn&apos;t just about absorbing knowledge from outside — it&apos;s about transforming and pushing past yourself. Living openly, humbly, and bravely in a present that keeps changing. That&apos;s how we avoid being frozen by the judgments of the past, how we avoid spending the long years ahead in self-repetition. Instead: dancing again in the openness of the soul, keeping tension, continuing to bloom.&lt;/p&gt;
&lt;p&gt;I still want a kind of thinking that is clear, peaceful, and grounded — and through it, to experience the next unknown chapter of life.&lt;/p&gt;
&lt;h2&gt;🌺 Snippets from Life&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;🏡 Home&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Moved into a new apartment last month. A brand new development — everything is fresh. Tennis court, pool, gym, all there. A hawker centre and a wet market just across the road, so daily life is convenient.&lt;/p&gt;
&lt;p&gt;But the rent here is genuinely terrifying. A one-bedroom is 3,000+ SGD a month...&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj30/IMG_8589.jpeg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;⛰️ Hiking&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Went hiking with colleagues and reached the summit of Singapore&apos;s highest peak: Bukit Timah Hill (163 meters...).&lt;/p&gt;
&lt;p&gt;On the way down we spotted an interesting tree stump and some monkeys.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj30/IMG_7311.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj30/IMG_7344.jpeg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;🎡 Ferris Wheel&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Got a photo of the Ferris wheel! Looking through my camera roll, I&apos;ve photographed Ferris wheels in Zhongshan, Suzhou, and Shenzhen too — but never actually been on one.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj30/IMG_7379.jpeg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;🌴 Batam&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Went to Batam Island in Indonesia this weekend. Prices there were surprisingly affordable.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj30/DSCF1551.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;🌳 Botanical Garden&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A day worth remembering.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj30/DSC03714.jpg&quot; alt=&quot;&quot; /&gt;Tomorrow and the future may not be the most important thing. Right here, right now — this is the only thing I have and the only thing worth cherishing and being grateful for. It&apos;s where all meaning lives.&lt;/p&gt;
&lt;h2&gt;🎬 Books, Films, and More&lt;/h2&gt;
&lt;p&gt;What I&apos;ve been reading, watching, and playing this period:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Currently reading: Essays | &lt;em&gt;Ordinary Loves&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Currently reading: Essays | &lt;em&gt;Thinking Is My Resistance&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Currently reading: Literature | &lt;em&gt;Yu Hua&apos;s Literary Lectures&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Currently reading: Fiction | &lt;em&gt;The Lychees of Chang&apos;an&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Final Destination: Bloodlines&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;The Wailing&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-30&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>The Life of a Game Component: From Load to Screen</title><link>https://ursb.me/en/posts/game-engine-renderer/</link><guid isPermaLink="true">https://ursb.me/en/posts/game-engine-renderer/</guid><description>An analysis of how mini-game containers cooperate with game engines, tracing a game component&apos;s full lifecycle from script loading and rendering context through to final on-screen display.</description><pubDate>Sat, 17 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;1. Mini-Game Containers and Game Engines&lt;/h2&gt;
&lt;p&gt;A mini-game container can be thought of as a specialized WebView. On the rendering side, it strips away unnecessary DOM elements and keeps only Canvas. On the scripting side, it aligns with the ECMA-262 standard through JS polyfills or container bindings. Beyond that, the container must provide script loading and execution, WASM support, and multimedia capabilities like Audio and Video — all exposed to the JS layer via JSBinding, wrapped into BOM-style interfaces.&lt;/p&gt;
&lt;p&gt;The reason mini-game containers are designed to comply with web standards is compatibility: this lets different game engines plug in without modification. The core idea is to standardize and unify underlying platform capabilities, shielding hardware and OS fragmentation inside the container, and exposing only a single programming model similar to the browser&apos;s BOM/DOM. This allows engines like Cocos, Egret, Laya, and Unity WebGL to treat the container as a web runtime — no need for each engine to adapt to each platform&apos;s native APIs. It&apos;s essentially a local, lightweight re-evolution of WebView: the mini-game container is approximately a lightweight browser kernel.&lt;/p&gt;
&lt;p&gt;In this model, the &lt;strong&gt;container handles platform standardization&lt;/strong&gt;, and the &lt;strong&gt;engine handles content ecosystem&lt;/strong&gt;. For example:&lt;/p&gt;
&lt;p&gt;Container responsibilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provide a unified rendering context (Canvas/WebGL).&lt;/li&gt;
&lt;li&gt;Provide a unified script runtime (JS/WASM).&lt;/li&gt;
&lt;li&gt;Provide standardized input, audio, video, and multimedia APIs.&lt;/li&gt;
&lt;li&gt;Provide platform capability wrappers: networking, storage, payment, sharing, ads.&lt;/li&gt;
&lt;li&gt;Interface with the security sandbox, permission management, and performance isolation layers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Game engine responsibilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provide high-level abstractions for scene management, physics, animation, and asset management.&lt;/li&gt;
&lt;li&gt;Provide developer-friendly editors and debugging toolchains.&lt;/li&gt;
&lt;li&gt;Provide a cross-platform, component-based development paradigm (UI, skeletal animation, particle systems, etc.).&lt;/li&gt;
&lt;li&gt;Manage game lifecycle, state synchronization, and rendering scheduling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This article uses the Cocos engine rendering pipeline as a case study to walk through how a mini-game container loads assets and renders game components.&lt;/p&gt;
&lt;h2&gt;2. The Three Major Loops in a Game Engine&lt;/h2&gt;
&lt;p&gt;The game engine rendering pipeline is driven by three major loops: the Render Loop, the Event Loop, and the Game Loop. Here is an overview of all three:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2.1 RenderLoop&lt;/h3&gt;
&lt;p&gt;The render loop is first. Its main flow looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%201.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The entire render loop is driven by the system&apos;s Vsync signal. On iOS, this originates from &lt;code&gt;CADisplayLink&lt;/code&gt;, running rendering tasks through the main thread&apos;s RunLoop, with frame rate control capabilities — on iOS you can set 30/60/90/120 FPS.&lt;/p&gt;
&lt;p&gt;On the engine side, the core loop does three things each frame:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;glFlush&lt;/code&gt;&lt;/strong&gt; — flush GL command buffer: forces any queued OpenGL commands from the previous frame to execute, ensuring display memory and framebuffer data are consistent and preventing &quot;frame delay&quot; or stuttering from command backlog.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;UpdateScheduler&lt;/code&gt;&lt;/strong&gt; — async task scheduling: dispatches async tasks scheduled for the current frame, such as audio callbacks and network event responses. This decouples non-rendering logic (like data updates) from the rendering path, improving main-thread concurrency.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Tick&lt;/code&gt;&lt;/strong&gt; — drive JS layer logic: every frame, via Binding, calls the JS-side Tick method to execute animations and state updates related to rendering. This decouples the logic layer from the render layer and improves cross-platform adaptability.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the container side, iOS uses &lt;code&gt;CAEAGLLayer&lt;/code&gt; to get GL commands onto screen in two steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;glBindRenderbuffer&lt;/code&gt;&lt;/strong&gt; — binds the current frame&apos;s render result to the RenderBuffer, which serves as the on-screen buffer.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;PresentRenderbuffer&lt;/code&gt;&lt;/strong&gt; — presents the RenderBuffer content to the screen, producing the final visible image.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In iOS&apos;s rendering architecture, &lt;code&gt;CAEAGLLayer&lt;/code&gt; is the component ultimately responsible for display. As part of the Layer Tree, it directly references the shared-memory render buffer (Renderbuffer data). The system Compositor then composites &lt;code&gt;CAEAGLLayer&lt;/code&gt;&apos;s content with other UI elements (UIKit, SwiftUI) and outputs the final frame.&lt;/p&gt;
&lt;p&gt;In each frame&apos;s Tick task, JavaScript works with the game engine to produce the Framebuffer for that frame (covered in sections 3.5–3.10). Core Animation and OpenGL ES synchronize through the shared render buffer. This means the OpenGL render result is essentially just one canvas in the Layer Tree — it still needs to be composited with the system UI layer to produce the final display image.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%202.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Note: this article&apos;s mini-game container uses OpenGL as its rendering backend only. With the rise of Metal, Vulkan, and other next-generation graphics APIs, RenderBuffer binding and on-screen presentation are moving toward a &quot;parallel rendering + async display&quot; model, improving smoothness and reducing latency at high frame rates.&lt;/p&gt;
&lt;p&gt;The render loop runs synchronously, so if a frame&apos;s logic doesn&apos;t complete within 16.6ms at 60 FPS, it causes jank.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%203.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;For example, in this bad case, running a Tick task with 136ms of JS execution on the main thread caused game animation stutter:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/20250514171113@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;To keep the game running smoothly, you need to continuously optimize performance and minimize synchronous task latency. Profiling tools are essential — here are some commonly used ones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Xcode GPU Frame Debugger&lt;/strong&gt;: An iOS graphics debugging tool for deep analysis of render pipeline bottlenecks, especially useful for Metal and OpenGL ES.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RenderDoc&lt;/strong&gt;: A mainstream cross-platform graphics debugging tool; captures frame data and analyzes resource and performance bottlenecks across pipeline stages. Supports OpenGL, Vulkan, DirectX, and more.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;inspector.js&lt;/strong&gt;: Usable in web contexts; useful for analyzing DrawCalls, shaders, and resource bindings in WebGL scenarios.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mali Offline Shader Compiler&lt;/strong&gt;: &lt;a href=&quot;https://zhuanlan.zhihu.com/p/161761815&quot;&gt;https://zhuanlan.zhihu.com/p/161761815&lt;/a&gt; — An offline shader compilation and analysis tool for ARM Mali GPUs, used to evaluate shader complexity and instruction cost to optimize mobile rendering.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Snapdragon Profiler&lt;/strong&gt;: A frame capture tool that tracks Heavy DrawCalls and Overdraw, helping identify rendering bottlenecks and redundant computation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.2 EventLoop&lt;/h3&gt;
&lt;p&gt;Going deeper, from the Tick task we enter the second loop — the Event Loop.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%204.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Because the mini-game container is not a WebView — it only has a JS engine — we need to implement an event loop mechanism to drive JS execution (it doesn&apos;t need to fully align with the browser standard, just satisfy container requirements). As the diagram shows, it consists of three main tasks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Consume macrotasks&lt;/strong&gt; (timers, etc.): process tasks registered via &lt;code&gt;setTimeout&lt;/code&gt;, &lt;code&gt;setInterval&lt;/code&gt;, etc., ensuring timers fire correctly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consume rAF tasks&lt;/strong&gt;: this primarily drives GameLoop logic. The game&apos;s main loop is typically mounted in an rAF callback, updating rendering and logic frame by frame.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flush current-frame Commands&lt;/strong&gt;: execute render commands and queued interface update instructions, completing the current frame&apos;s render cycle.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A closer look at the rAF implementation is worth it. Early on, rAF was simulated with &lt;code&gt;setTimeout(0)&lt;/code&gt;, with this call chain:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%205.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This approach had problems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Non-standard&lt;/strong&gt;: simulated with &lt;code&gt;setTimeout(0)&lt;/code&gt; rather than driven directly by vsync.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Long chain&lt;/strong&gt;: Native maintained the Timer queue and would call back to JS only after consuming the vsync signal.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It was later refactored to follow the WHATWG standard:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%206.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Benefits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Standardized&lt;/strong&gt;: JS is called directly after vsync.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lower overhead&lt;/strong&gt;: JS maintains the Timers queue, eliminating the JSBinding call overhead of the native intermediary.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This illustrates how rendering performance optimization lives in implementation details — it takes digging and refinement.&lt;/p&gt;
&lt;p&gt;Through this event loop, the container maintains coordinated operation between the JS engine and the rendering system, keeping the game running and updating continuously.&lt;/p&gt;
&lt;h3&gt;2.3 GameLoop&lt;/h3&gt;
&lt;p&gt;The GameLoop expands into Chapter 3 — the life of a game component:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%207.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Before unrolling the full picture, here&apos;s the traditional rendering pipeline for a mini-game container using OpenGL as its rendering backend:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%208.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;First comes asset loading, which involves two completely different resource types — script assets and static assets. Script assets are handled by the JS Runtime; static assets each have their own handling depending on type — images, fonts, audio, video, and the special case of skeletal animation. Since this article focuses on rendering, we won&apos;t expand on the asset loading pipeline.&lt;/p&gt;
&lt;p&gt;These assets are then processed by the game engine&apos;s rendering pipeline. JS drives the generation of WebGL commands, which go through JS Binding and ultimately call into C++ or native-side OpenGL instructions — WebGL is a subset of OpenGL, so there&apos;s a one-to-one correspondence.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%209.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This process often produces rendering bottlenecks. The main hardware resources to monitor are CPU, GPU, and bandwidth. On today&apos;s resource-constrained mobile hardware, game optimization becomes an art of balance — when a bottleneck can&apos;t be eliminated, it needs to be shifted. A common example is moving bottlenecks from CPU to GPU using Compute Shaders, GPU skinning, Animation Baking, GPU particles, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CPU&lt;/strong&gt; is the most common bottleneck. Rather than covering business-side optimizations (Culling, Batching to reduce DrawCalls), here are some container-side optimization approaches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JSBinding calls can create bottlenecks — one approach is batching: batching call counts with CommandBuffer to increase throughput, and merging call implementations with high-level graphics libraries like GFX.&lt;/li&gt;
&lt;li&gt;Synchronous JS tasks that block the main thread can be moved to Native for compute-intensive work.&lt;/li&gt;
&lt;li&gt;For JS interpretation overhead, consider JIT or WASM.&lt;/li&gt;
&lt;li&gt;GC is also an area with room for optimization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;GPU&lt;/strong&gt; bottlenecks generally stem from overly complex Fragment Shaders, or oversized Vertex Buffers (e.g., triangle counts exceeding thresholds — typically 500K–1.5M triangles on mobile). High Overdraw also causes the GPU to do a lot of unnecessary work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bandwidth&lt;/strong&gt; bottlenecks are primarily addressed with texture compression (desktop can also use deferred rendering and post-processing). A rule of thumb from the community:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If your game runs at 60 fps, each frame has roughly 2*1024/60 = 34 MB of bandwidth. If your GBuffer resolution is 1280×1080, writing one GBuffer (RGBA, 4 bytes) costs 1280*1080*4/1024/1024 = 5.2 MB. Three GBuffers = 15.6 MB.&lt;/p&gt;
&lt;p&gt;Assuming a reasonable Overdraw of 1.5x, that&apos;s 15.6 × 1.5 = 23.4 MB. Add scene, UI, and character rendering on top of that, and you easily exceed the recommended 34 MB/frame budget.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here&apos;s a typical synchronous rendering pipeline:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Application layer provides vertex data.&lt;/li&gt;
&lt;li&gt;Vertex shader normalizes the vertices.&lt;/li&gt;
&lt;li&gt;Primitive assembly builds geometric primitives.&lt;/li&gt;
&lt;li&gt;Rasterization discretizes primitives into fragments, each corresponding to a pixel area on screen.&lt;/li&gt;
&lt;li&gt;Fragment shader executes texture sampling, color calculation, fog effects, and other per-pixel processing.&lt;/li&gt;
&lt;li&gt;Testing and blending operations (Alpha, depth, stencil tests) run, and results are written to the Framebuffer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2010.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Once the Framebuffer is built, we return to the &lt;code&gt;CAEAGLLayer&lt;/code&gt; on-screen presentation described in section 2.1.&lt;/p&gt;
&lt;p&gt;Now let&apos;s unroll the full picture and follow a game component through its entire life.&lt;/p&gt;
&lt;h2&gt;3. The Life of a Game Component&lt;/h2&gt;
&lt;p&gt;Here&apos;s the full diagram of a game component&apos;s journey from load to screen:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%207.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This pipeline can be broken into 10 stages:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2011.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;To make this concrete, I prepared a minimal Cocos game demo. Here&apos;s the scene:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2012.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And here&apos;s the main scene code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const { ccclass } = cc._decorator;

@ccclass
export default class Helloworld extends cc.Component {

    protected onLoad(): void {
        console.log(&apos;onLoad&apos;);
    }

    start () {
        console.log(&apos;Hello World&apos;);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.1 Load Assets&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2013.png&quot; alt=&quot;&quot; /&gt;First comes asset loading. As mentioned earlier, game assets split into static assets and script assets. Since static asset loading involves a lot of complexity, this section covers only script asset loading.&lt;/p&gt;
&lt;p&gt;There are three types of script assets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Built-in scripts&lt;/strong&gt;: Loaded when the engine starts. These include registering JS Bindings, implementing the &lt;code&gt;window&lt;/code&gt; object (basic BOM and Canvas DOM objects), and polyfilling ES standard compliance. The scripts are bundled in the container and loaded immediately when the JS engine launches. This step can support multiple instances and pre-execution to speed up startup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Entry scripts&lt;/strong&gt;: The container needs an entry script — similar to HTML on the web — to import the game&apos;s entry assets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dynamically loaded scripts&lt;/strong&gt;: Imported by the entry assets: game framework code, JS assets from the game bundle, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On the container side, optimizations include offline assets, preload, prefetch, and pre-execution. On the JS engine side, Code Cache can be added to avoid repeated compilation overhead.&lt;/p&gt;
&lt;h3&gt;3.2 Component Scheduler&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2014.png&quot; alt=&quot;&quot; /&gt;After script assets load and execute, game component code enters the component scheduler for priority scheduling.&lt;/p&gt;
&lt;p&gt;The Cocos component lifecycle is shown on the left in the diagram below. Three key lifecycle phases each have a corresponding scheduler, and each scheduler is designed with three priority queues. Each queue is organized as a linked list, executing registered invokers in order.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2015.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;From the business perspective: when a Node is created in the scene editor, developers can name it and toggle the &quot;active&quot; property to set its default activation state. Once a node is marked active, the Load phase hands it off to the &lt;strong&gt;Node Activator&lt;/strong&gt;, which activates the node. The &lt;strong&gt;Component Activator&lt;/strong&gt; (part of the component scheduler) then sequentially activates each component mounted on the node and triggers the activation of the Scene that contains it. Finally, the activated scene attaches the node to the hierarchy tree and registers the component Invokers with the scheduler for unified scheduling and management.&lt;/p&gt;
&lt;p&gt;The overall flow:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2016.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Our demo component logs &quot;Hello World&quot; in the &lt;code&gt;start&lt;/code&gt; lifecycle. The call stack looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2017.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2018.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2019.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.3 Render Scene&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2020.png&quot; alt=&quot;&quot; /&gt;Once the scene is activated and components are mounted, the next step is rendering the scene — which involves calling from JS into Native: Scene data must be passed to the Native side to trigger the Native rendering pipeline.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2021.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;There are many ways for JS and Native to call each other, each suited to different scenarios — we won&apos;t expand on those here. One architectural note worth making: the Binding layer should be abstracted so the container can interface with different JS engine implementations.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2022.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Also important: the Binding must handle GC properly on both sides. Therefore, Binding implementations must follow the RAII principle:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2023.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.4 Batcher&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2024.png&quot; alt=&quot;&quot; /&gt;Once Native receives the nodes, they need to be batched. This step is compute-intensive, which is why it&apos;s done on the Native side.&lt;/p&gt;
&lt;p&gt;The batching process is complex. The core idea is to traverse the scene&apos;s Nodes via DFS, compute and assemble vertex data (Assembler), and produce a VertexBuffer and IndexBuffer:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2025.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Our demo&apos;s scene tree is relatively simple. Traversal starts from root and goes downward (don&apos;t forget the Camera):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2026.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The assembly computation is complex; here I&apos;ll just break down the final result to help readers understand where the data comes from. Our little dinosaur is a Sprite2D — during assembly it&apos;s converted to Texture2D processing. The critical output at this stage is the Mesh Buffer:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2027.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The Mesh Buffer is made up of Vertex Buffers. This assembled Mesh Buffer is 80 bytes total. At 20 bytes per vertex, we can extract 4 Vertex Buffers, and using the &lt;code&gt;a_uv&lt;/code&gt; definition and offsets we can recover the UV coordinates for each:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2028.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;For example, from the vertex shader code we know each Vertex Buffer contains 3 data components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;a_position&lt;/code&gt;: offset 0, 8 bytes. &lt;code&gt;vec2&lt;/code&gt; — one coordinate.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a_uv0&lt;/code&gt;: offset 8, 8 bytes. &lt;code&gt;vec2&lt;/code&gt; — x, y — evaluates to (0, 1).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a_color&lt;/code&gt;: offset 16, 4 bytes. &lt;code&gt;vec4&lt;/code&gt; — RGBA — value 0xFFFFFFFF, i.e., opaque white.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2029.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Computing all four vertex coordinates gives us the width, height, and top-left coordinate — and indeed, this data matches exactly what the developer set for the Node&apos;s size and position in the scene editor:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2030.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;After vertex assembly, the Nodes are placed into the Models list and assembled into &lt;code&gt;models&lt;/code&gt; nodes within the Scene Tree:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2031.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.5 Setup&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2032.png&quot; alt=&quot;&quot; /&gt;This stage consists of two main operations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Setting up the Framebuffer and Viewport&lt;/li&gt;
&lt;li&gt;Converting each Model in the Scene into a DrawItem queue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First, setting up the Framebuffer and Viewport:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2033.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;setFrameBuffer&lt;/code&gt; calls &lt;code&gt;glBindFramebuffer&lt;/code&gt; to bind the Framebuffer Object, attaching a color buffer (&lt;code&gt;COLOR_ATTACHMENT&lt;/code&gt;, storing rendered color information), a depth buffer (&lt;code&gt;DEPTH_ATTACHMENT&lt;/code&gt;, storing per-pixel depth for depth testing), and a stencil buffer (&lt;code&gt;STENCIL_ATTACHMENT&lt;/code&gt;, storing stencil test results) — ensuring subsequent drawing has the correct render targets.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setViewport&lt;/code&gt; calls &lt;code&gt;glViewport&lt;/code&gt; to set the viewport, determining the mapping area of the final render onto the screen.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setup clear&lt;/code&gt; sequentially calls &lt;code&gt;glClearColor&lt;/code&gt;, &lt;code&gt;glClearDepth&lt;/code&gt;, and &lt;code&gt;glClearStencil&lt;/code&gt; to initialize clear values for the color, depth, and stencil buffers, providing a clean initial state for each frame.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;unsigned int fbo;
glGenFramebuffers(1, &amp;amp;fbo);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, the game engine converts each Model in the Scene into a one-to-one DrawItem. A DrawItem&apos;s data structure:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2034.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Finally, the engine assembles these DrawItems into a DrawItems queue for subsequent processing:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2035.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.6 Render Stage&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2036.png&quot; alt=&quot;&quot; /&gt;The pipeline enters the Render Stage, where DrawItems are classified and dispatched. Based on each DrawItem&apos;s Material requirements, they&apos;re distributed into three different Passes — Opaque, Shadowcast, and Transparent — corresponding to material properties and shadow casting behavior:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Opaque&lt;/strong&gt;: For objects that completely block light, like walls, floors, and character models. Rendered first; uses the depth buffer (Z-Buffer) for occlusion culling, avoiding unnecessary subsequent draws and improving rendering efficiency.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shadowcast&lt;/strong&gt;: Handles shadow casting in the scene. Based on light source information, this pass draws shadows for objects that cast them, adding realism and spatial depth — especially effective in scenes with strong light sources or prominent light/shadow effects.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transparent&lt;/strong&gt;: For semi-transparent objects that allow light through, like glass, water surfaces, and particle effects. Transparent objects typically need depth sorting based on view angle to ensure correct front-to-back layering and avoid visual z-fighting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By distributing DrawItems into different Passes based on object characteristics, the pipeline can apply effects in a targeted way.&lt;/p&gt;
&lt;p&gt;On the business side, you can create a specific Material in code and the pipeline will route it to the corresponding pass:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// Create a cube mesh
const cube = new cc.MeshRenderer();
cube.mesh = cc.GizmoMesh.createBox(1, 1, 1);

// Set material to opaque
const opaqueMaterial = cc.Material.create();
opaqueMaterial.initialize({
    effectName: &apos;builtin-unlit&apos;,
    technique: &apos;opaque&apos;,
});
cube.setMaterial(opaqueMaterial, 0);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Because our demo is simple, the final StageInfo only includes the Opaque Pass:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2037.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Cocos also supports custom render pipelines — essentially customizing the Passes in this stage. Once defined, they can be applied directly across the Opaque, Shadowcast, and Transparent stages:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2038.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.7 ModelView Transformation&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2039.png&quot; alt=&quot;&quot; /&gt;After the Passes, scene DrawItems are sent to the OpaqueStage Renderer, Shadowcast Renderer, and Transparent Renderer based on their properties for initial processing. Each Renderer at this stage primarily updates view-related Uniforms (matrices, material parameters, etc.) to ensure the correct viewpoint and spatial information are available for subsequent rendering. This can be classified as the View Transformation stage — preparing transformation data in view coordinate space.&lt;/p&gt;
&lt;p&gt;After that, different render stages apply differentiated pre-processing: opaque and transparent objects both execute SubmitLight to submit lighting information, while the shadow stage exclusively executes SubmitShadow to generate shadow data. Additionally, the transparent stage calculates depth information (Calculate zdist) for depth sorting.&lt;/p&gt;
&lt;p&gt;Once all pre-processing completes, everything enters the ModelView Transformation stage, which produces the view-projection matrix and completes the transformation from model space to screen space, enabling subsequent primitive rasterization and pixel shading.&lt;/p&gt;
&lt;p&gt;Before diving into ModelView Transformation, let&apos;s define the coordinate systems used in a game:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Object (local) coordinate system&lt;/strong&gt;: Origin at the object&apos;s own center (anchor typically set to (0.5, 0.5)). Describes the relative positions of parts within the object — useful for defining the internal atomic structure of complex objects.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;World coordinate system&lt;/strong&gt;: Origin at the center of the entire scene. Uniformly describes the positions of all objects, cameras, and lights in the scene, ensuring consistent global spatial relationships.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Camera coordinate system&lt;/strong&gt;: Origin at the camera&apos;s position. Used to transform 3D space into a 2D image for rendering calculations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2040.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Under this coordinate system, the Viewing Transformation involves three steps: view transformation, model transformation, and projection transformation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;View transformation&lt;/strong&gt;: Placing the camera in the scene — defining the camera&apos;s orientation and position.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Model transformation&lt;/strong&gt;: Positioning, rotating, and scaling objects in the scene.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Projection transformation&lt;/strong&gt;: Like photography — mapping 3D object information onto a 2D screen space through a projection.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2041.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s focus on &lt;strong&gt;Projection Transformation&lt;/strong&gt;, which comes in two forms: &lt;strong&gt;Orthographic Projection&lt;/strong&gt; and &lt;strong&gt;Perspective Projection&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Orthographic projection is common in engineering drawing software — no near-far perspective effect.&lt;/li&gt;
&lt;li&gt;Perspective projection is widely used in games and rendering engines — it more realistically simulates the perspective effect the human eye perceives.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Mathematically, perspective projection is a combination of frustum squishing and orthographic projection — it transforms an infinitely extending view space (frustum) into a convenient box for computation.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2042.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A quick illustration: &lt;strong&gt;fov&lt;/strong&gt; (field of view) defines the camera&apos;s viewing angle width — there&apos;s a horizontal fov and a vertical fov. &lt;strong&gt;distance&lt;/strong&gt; defines the distance from the projection plane to the camera. The view space is defined by near and far clipping planes that bound the rendering range. Using similar triangles, the 3D space is ultimately mapped to a 2D screen (Canvas).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2043.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Now for the other type — &lt;strong&gt;Orthographic Projection&lt;/strong&gt;. Two common implementations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simply drop the Z coordinate, converting 3D objects to 2D directly. Intuitive but can&apos;t express spatial depth.&lt;/li&gt;
&lt;li&gt;Transform the view space into a normalized cube, then apply a transformation matrix.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2044.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In summary, the coordinate transformation flow is: object coordinates → world coordinates → camera coordinates → projected coordinates → screen coordinates.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the editor, define coordinate relationships to place objects in the scene.&lt;/li&gt;
&lt;li&gt;Apply view transformation to position the camera, and model transformation to position objects.&lt;/li&gt;
&lt;li&gt;Apply projection transformation to project 3D space onto 2D.&lt;/li&gt;
&lt;li&gt;Finally, convert to screen coordinates for correct on-screen rendering.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2045.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This process produces the &lt;strong&gt;View Matrix&lt;/strong&gt; and &lt;strong&gt;Projection Matrix&lt;/strong&gt;; multiplying them gives the &lt;strong&gt;Model-View-Projection (MVP) Matrix&lt;/strong&gt;. Let&apos;s look at how each is computed using our demo&apos;s breakpoint data.&lt;/p&gt;
&lt;p&gt;First, the &lt;strong&gt;View Matrix&lt;/strong&gt; — it transforms world coordinates to camera coordinates, including axis scaling and translation. In practice this involves homogeneous coordinate padding to ensure valid matrix operations.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2046.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Next, the &lt;strong&gt;Projection Matrix&lt;/strong&gt; — maps camera space to Normalized Device Coordinates (NDC). The scaling coefficients in the matrix are computed from the screen&apos;s aspect ratio and the configured orthographic height.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2047.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The final rendering step uses the &lt;strong&gt;MVP Matrix&lt;/strong&gt; (Model-View-Projection Matrix) — a combination of the view and projection matrices, used for final vertex transformation and shader rendering calculations.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2048.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.8 Link Program&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2049.png&quot; alt=&quot;&quot; /&gt;Next comes shader creation and linking. First, creating the primitive:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2050.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Then creating the vertex shader and fragment shader:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2051.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Worth noting: Cocos has 11 built-in shaders. The first 5 handle 2D rendering, &lt;code&gt;builtin-clear-stencil|vs|fs&lt;/code&gt; clears the stencil buffer, shaders 7–10 handle 3D rendering, and the last handles 3D lighting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;builtin-2d-spine|vs|fs&lt;/li&gt;
&lt;li&gt;builtin-2d-graphics|vs|fs&lt;/li&gt;
&lt;li&gt;builtin-2d-label|vs|fs&lt;/li&gt;
&lt;li&gt;builtin-2d-sprite|vs|fs&lt;/li&gt;
&lt;li&gt;builtin-2d-gray-sprite|vs|fs&lt;/li&gt;
&lt;li&gt;builtin-clear-stencil|vs|fs&lt;/li&gt;
&lt;li&gt;builtin-3d-trail|particle-trail:vs_main|tinted-fs:add&lt;/li&gt;
&lt;li&gt;builtin-3d-trail|particle-trail:vs_main|tinted-fs:multiply&lt;/li&gt;
&lt;li&gt;builtin-3d-trail|particle-trail:vs_main|no-tint-fs:addSmooth&lt;/li&gt;
&lt;li&gt;builtin-3d-trail|particle-trail:vs_main|no-tint-fs:premultiplied&lt;/li&gt;
&lt;li&gt;builtin-unlit|unlit-vs|unlit-fs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The demo uses a built-in shader template.&lt;/p&gt;
&lt;p&gt;Next, create the shader program and link the vertex and fragment shaders to it. Then set the required Uniform variables — including the texture and the view-projection matrix computed in the previous step:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2052.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;At this point, the Framebuffer will have the color attachment, depth attachment, and stencil attachment:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2053.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Note that a freshly created Framebuffer cannot be used immediately — it isn&apos;t yet complete. A complete Framebuffer requires:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;At least one attached buffer (color, depth, or stencil).&lt;/li&gt;
&lt;li&gt;At least one &lt;code&gt;GL_COLOR_ATTACHMENT&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;All attachments must be complete (memory allocated).&lt;/li&gt;
&lt;li&gt;If Multisampling is enabled, all buffers must have the same sample count.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Therefore, use &lt;code&gt;glCheckFramebufferStatus&lt;/code&gt; to verify completeness:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) {
    // ...
    // notify native: getInstance()-&amp;gt;glErrorCallback(GL_ERROR, errMsg);
    return;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.9 Blend &amp;amp; Test&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2054.png&quot; alt=&quot;&quot; /&gt;Next comes Blend, Depth Test, and Stencil Test in sequence.&lt;/p&gt;
&lt;p&gt;First, &lt;strong&gt;Blend&lt;/strong&gt; — literally blending two colors together. The diagram below shows how the blend equation works:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2055.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Common blend functions in OpenGL:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2056.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A simple example — using a shader to create a red mask Blend effect:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2057.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2058.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Depth Test&lt;/strong&gt; determines whether each pixel is displayed. When depth testing is enabled, OpenGL compares the current fragment&apos;s depth value against the depth buffer. If the fragment passes the test, the depth buffer updates to the new depth value; otherwise the fragment is discarded. Common depth test functions in OpenGL:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2059.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stencil Test&lt;/strong&gt; restricts the render area. Through the stencil buffer, you can create special region markers during rendering — only fragments that satisfy the stencil buffer&apos;s conditions get rendered to screen. The stencil buffer enables complex effects like shadows, mirror reflections, and outline highlights. Common stencil test functions in OpenGL:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2060.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;All of these results tie back to the Framebuffer&apos;s Attachment mechanism, which determines how render results are written to the buffers. A Framebuffer typically carries multiple buffers — the color buffer (&lt;code&gt;GL_COLOR_ATTACHMENT&lt;/code&gt;), depth buffer (&lt;code&gt;GL_DEPTH_ATTACHMENT&lt;/code&gt;), and stencil buffer (&lt;code&gt;GL_STENCIL_ATTACHMENT&lt;/code&gt;) — which together determine the final rendered output.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2061.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.10 Commit &amp;amp; Draw Pass&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2062.png&quot; alt=&quot;&quot; /&gt;The final stage in the pipeline: Commit and Draw.&lt;/p&gt;
&lt;p&gt;In Cocos, each frame stores two states: the &lt;strong&gt;current frame state&lt;/strong&gt; (&lt;code&gt;currentState&lt;/code&gt;) and the &lt;strong&gt;upcoming render frame state&lt;/strong&gt; (&lt;code&gt;nextState&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2063.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We compute each component of &lt;code&gt;nextState&lt;/code&gt; in sequence, then diff &lt;code&gt;nextState&lt;/code&gt; against &lt;code&gt;currentState&lt;/code&gt;. If any stage&apos;s state value differs, a commit operation is triggered — allowing the pipeline to maximize cache reuse.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2064.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The state values managed in the pipeline:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Blend States, Depth States, Stencil States&lt;/li&gt;
&lt;li&gt;Cull Mode&lt;/li&gt;
&lt;li&gt;Vertex Buffer&lt;/li&gt;
&lt;li&gt;Program&lt;/li&gt;
&lt;li&gt;Textures&lt;/li&gt;
&lt;li&gt;Uniforms&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: the Program is typically prepared for all shaders during pipeline initialization; under normal conditions its cache never invalidates, so it&apos;s not shown in the diagram above.&lt;/p&gt;
&lt;p&gt;Blend States, Depth States, and Stencil States store the GL call parameters and partial results from the Blend, Depth Test, and Stencil Test stages described earlier — no need to expand on those here.&lt;/p&gt;
&lt;p&gt;Next is &lt;strong&gt;Cull Mode&lt;/strong&gt; — uses vertex index winding order (clockwise vs counterclockwise) to distinguish front from back faces. If the state differs from &lt;code&gt;currentState&lt;/code&gt;, &lt;code&gt;glCullFace&lt;/code&gt; is called to commit:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2065.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Vertex Buffer&lt;/strong&gt; also has state management. If it&apos;s dirty, &lt;code&gt;glBindBuffer&lt;/code&gt; is called to rebind:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2066.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;shader program&lt;/strong&gt; is the same — if dirty, &lt;code&gt;glUseProgram&lt;/code&gt; is called to reset it:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2067.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Then &lt;strong&gt;Textures&lt;/strong&gt; are checked and committed. Two key points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Texture activation&lt;/strong&gt;: Involves &lt;code&gt;glActiveTexture&lt;/code&gt; and &lt;code&gt;glBindTexture&lt;/code&gt;. First, &lt;code&gt;glActiveTexture&lt;/code&gt; selects which texture unit to activate — determining which unit the subsequently bound texture will act on. Then &lt;code&gt;glBindTexture&lt;/code&gt; binds a specific texture object to a particular texture target. This mechanism associates texture objects with texture units and targets, completing texture activation and binding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Texture units&lt;/strong&gt;: Represent the multiple textures a GPU can manage simultaneously. By default, &lt;code&gt;GL_TEXTURE0&lt;/code&gt; is always active. OpenGL guarantees at least 16 texture units (&lt;code&gt;GL_TEXTURE0&lt;/code&gt; through &lt;code&gt;GL_TEXTURE15&lt;/code&gt;). Since they&apos;re defined sequentially, you can access a specific unit conveniently with expressions like &lt;code&gt;GL_TEXTURE0 + 8&lt;/code&gt;, enabling multiple textures in complex rendering scenarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2068.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Once the preceding state values are prepared and committed, the final state to manage is &lt;strong&gt;Uniforms&lt;/strong&gt;. If this is dirty, the Uniform variables must also be resubmitted. In our demo, the Uniform variables involved are &lt;code&gt;cc_matViewProj&lt;/code&gt; and &lt;code&gt;texture&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2069.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Finally, the Draw. Before drawing each frame, &lt;code&gt;glClear&lt;/code&gt; must be called to clear the Framebuffer state. The diagram below shows the timing sequence of GL command calls:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2070.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Because the demo is simple, drawing only requires the texture and Uniforms to be ready. The final call is &lt;code&gt;glDrawArrays&lt;/code&gt; or &lt;code&gt;glDrawElements&lt;/code&gt; to draw the prepared Framebuffer onto the screen:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2071.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And with that, after traversing the entire pipeline, our demo game has completed its journey to the screen inside the mini-game container.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/game-engine/image%2072.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;GAMES 101&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Introduction to Computer Graphics: A Guide to 3D Rendering&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learnopengl.com/&quot;&gt;LearnOpenGL&lt;/a&gt; (Chinese: &lt;a href=&quot;https://learnopengl-cn.github.io/&quot;&gt;LearnOpenGLCN&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=game-engine-renderer&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Weekly #29: A New Life</title><link>https://ursb.me/en/posts/weekly-29/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-29/</guid><description>Covers a six-month gap after leaving TME: building MoFlow while job-hunting, landing offers from TikTok and Bilibili, and starting a new life and job in Singapore.</description><pubDate>Fri, 18 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This issue is a record of and reflection on February through April 2025.&lt;/p&gt;
&lt;h2&gt;What&apos;s Been Going On&lt;/h2&gt;
&lt;p&gt;Two months and no monthly update — this piece is a catch-up on where things stand.&lt;/p&gt;
&lt;h3&gt;The Plan&lt;/h3&gt;
&lt;p&gt;I left TME in October last year. During this gap period I mapped out two paths and set a hard deadline: six months, no more. Within those six months I needed to complete either Plan A or Plan B. I gave Plan A — MoFlow — three months of development time and two months for operations and testing. If early traction metrics weren&apos;t hit, I would pause work on the project and hand it off to my co-founder. The tight timeline is exactly why the early development pace was so intense. Even living in Dali, I barely stepped outside to explore, and looking back I genuinely regret that.&lt;/p&gt;
&lt;p&gt;Plan B was a fallback: avoid the startup risk and return to the job market. I&apos;d always had a long-term plan to work abroad, so this time I wanted to go straight for a position based overseas. The last month of the gap period would go entirely toward interview prep, and I needed an offer within that month.&lt;/p&gt;
&lt;p&gt;The timeline was tight, especially for overseas roles that required polishing my English. But I believe, whenever it comes, there are always options for what we can do. If at the first sign of difficulty we decide we can&apos;t do something, the door to infinite possibility closes on us right then. I wasn&apos;t willing to let that happen. I wanted to reach for as many possibilities as I could.&lt;/p&gt;
&lt;h3&gt;Interviews&lt;/h3&gt;
&lt;p&gt;After the new year I started preparing and sending out applications. This was my second job, so I was selective about where I applied.&lt;/p&gt;
&lt;p&gt;Thinking carefully about future direction, I divided applications into three tracks: overseas — TikTok and Apple; management roles — Bilibili and Anker; and as a hedge, WeChat as a backup. Bilibili came through with a scope of about 15 people, so I skipped Anker. Apple was only offering Beijing-based roles and the role wasn&apos;t a strong fit, so I passed.&lt;/p&gt;
&lt;p&gt;Final results: TikTok and Bilibili both offered. I withdrew from WeChat voluntarily in the fourth round because I was already in TikTok&apos;s HR interview by then. The interview experiences themselves also told a story — TikTok &amp;gt; Bilibili &amp;gt; the others. I was lucky enough to get the outcome I was hoping for: TikTok, with the offer I&apos;d aimed for.&lt;/p&gt;
&lt;h3&gt;Farewells&lt;/h3&gt;
&lt;p&gt;TikTok&apos;s role is based in Singapore. The company handled all the paperwork, but there was still a lot to sort out personally. I sold everything I could — old devices, miscellaneous things — but I kept putting off a decision about the Mini. I drove it everywhere that last month — to nearby cities, to places I&apos;d been meaning to go. Finally, the day before I left for the airport, I sold it. I went back to the dealership where I&apos;d originally bought it, and the price they offered was fair enough.&lt;/p&gt;
&lt;p&gt;That last month I returned to Shenzhen and saw former colleagues, old classmates, and made a trip to Suzhou to say goodbye to a college roommate. By my count I&apos;d been in Guangdong for eleven years, and in Shenzhen for almost six. All that time — and somehow without many earth-shaking memories to show for it. When the moment of leaving came, what I felt most was a quiet sadness.&lt;/p&gt;
&lt;p&gt;A line from &lt;em&gt;Youth Babylon&lt;/em&gt; came to me: &quot;Farewells are always tinged with sorrow, and because of the sorrow, they can&apos;t really be put into words — like a fine spring rain you can&apos;t quite make out with the naked eye, and you&apos;re not sure whether to put up an umbrella.&quot; That was more or less my state. I wasn&apos;t sure what I was losing. But I could feel that some thread was fraying.&lt;/p&gt;
&lt;p&gt;There&apos;s something about endings that has always unsettled me. I often leave the last few episodes of a show unwatched, sometimes for a long time, only going back when I&apos;ve gathered enough courage. I&apos;m afraid of endings — and yet I face every ending with hope and anticipation for what comes after.&lt;/p&gt;
&lt;p&gt;This chapter of my life ended here. So what does what comes next look like?&lt;/p&gt;
&lt;h3&gt;A New Life&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Those who live in horizon never simply arrive somewhere, but are always on the way. — James P. Carse, &lt;em&gt;Finite and Infinite Games&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We are always on the way. Every ending is a new beginning, a chance to look at yourself again and reshape the story you&apos;re living. Change is the only constant. Our understanding of ourselves keeps developing. And I&apos;ve always had a deep love for this world and a lasting curiosity about it — I&apos;m lucky that both have stayed with me until now.&lt;/p&gt;
&lt;p&gt;Arriving in Singapore alone, about to step into a new job — especially with the reputation TikTok and Singapore tend to get on Chinese social media — I was nervous. But my impressions from the interviews were good, and I trust my impressions. I know this is just the fear that comes with facing the unknown. But I also know this is an opportunity, and I can dig down into it and find what I love about it. Life, for us, may be something like a continual transformation of everything we encounter into light and fire.&lt;/p&gt;
&lt;p&gt;After one week here, I&apos;m certain this is a team I can pour myself into for the second chapter of my career. The atmosphere is warm — no walls between levels, no walls between colleagues, no information asymmetry within the project. If you want to learn and grow, the door is always open.&lt;/p&gt;
&lt;p&gt;On my first evening, a teammate who was moving to another team treated everyone to dinner. The conversation at the table had me laughing nonstop.&lt;/p&gt;
&lt;p&gt;Day three: the team had a company outing to Universal Studios. I lost the Chinese-speaking group and ended up spending the day with the foreign colleagues. In the queues everyone looked out for me — even when my English faltered or I missed something, they&apos;d gesture and work around it together with me.&lt;/p&gt;
&lt;p&gt;Day four evening: the lead of the server team next to ours took us for bak kut teh. It wasn&apos;t just the immediate team — the whole department turned out to be warmer than I&apos;d expected.&lt;/p&gt;
&lt;p&gt;Today is day five. Good Friday holiday. I&apos;m writing this in the hotel room. Looking back at the week: full and happy.&lt;/p&gt;
&lt;p&gt;James P. Carse writes in &lt;em&gt;Finite and Infinite Games&lt;/em&gt;: &quot;If I am to know the whole story of my life, I must have already translated it into an explanation — as though I could become the spectator of my own life, seeing both its first and last scene simultaneously. If this were so, I would not be living — I would be performing a life already performed.&quot;&lt;/p&gt;
&lt;p&gt;I&apos;m glad I don&apos;t know the whole story. I still hold curiosity and a sense of possibility about what&apos;s ahead. I still love this world. I&apos;m still in it, living.&lt;/p&gt;
&lt;p&gt;Grateful for all of it.&lt;/p&gt;
&lt;h2&gt;🌺 Snippets from Life&lt;/h2&gt;
&lt;p&gt;A few moments from this period.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🌍 Shenzhen&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;These are all the places I went to in my years in Shenzhen. There&apos;s still so much fog of war I never cleared — I hope I get the chance to keep exploring.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418140323.png&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;🌸 Suzhou&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Went to see Ding, a roommate I used to be close to. A while ago I happened to receive a letter from him — we caught each other up on the past few years, and I realized we hadn&apos;t seen each other in ages. I went before leaving. I&apos;m genuinely envious of his setup: big apartment, his own gaming room, a calm Microsoft job that leaves him plenty of time. The night before I left, we went to an immersive role-playing mystery dinner together — he was Monday, I was Tuesday.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418131851.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418131843.png&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;✈️ First Day in Singapore&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Afternoon flight. I got pulled into a small room by immigration at the airport and wasn&apos;t let out until evening. Everything here was a first. The next day I walked around the company neighborhood.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418140924.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418140928.png&quot; alt=&quot;&quot; /&gt;Also: the office is a building with ocean views! (Work rules don&apos;t allow photos inside — this is from the canteen on the lower floor.)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418141042.png&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;⛱️ Team Outing&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My first time at Universal Studios — and I got lucky, right after joining there was a team outing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418141213.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418141218.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418141233.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418141239.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj29/20250418141317.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🎬 Books, Films, and More&lt;/h2&gt;
&lt;p&gt;What I&apos;ve been reading, watching, and playing this period:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finished: Biography | &lt;em&gt;Maybe You Should Talk to Someone&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Fiction | &lt;em&gt;Youth Babylon&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Philosophy | &lt;em&gt;Zen in the Art of Archery&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Currently reading: Biography | &lt;em&gt;Lei Jun&apos;s Startup Thinking&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Currently reading: Essays | &lt;em&gt;Ordinary Loves&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Anime | &lt;em&gt;Frieren: Beyond Journey&apos;s End&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Ripples of Life&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Ne Zha 2&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Drama | &lt;em&gt;The Chess Player&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Drama | &lt;em&gt;Bleach: Thousand-Year Blood War&lt;/em&gt; | ★☆☆☆☆&lt;/li&gt;
&lt;li&gt;Played: Game | &lt;em&gt;Triangle Strategy&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-29&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>2024: Farewell, Midsummer</title><link>https://ursb.me/en/posts/summary-2024/</link><guid isPermaLink="true">https://ursb.me/en/posts/summary-2024/</guid><description>A 2024 year in review: leaving a five-year job at TME to build the AI wellness app MoFlow, an App Store review holdup, and reflecting on the fear of losing control.</description><pubDate>Sat, 01 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Seven years of annual reviews now. This year brought a great deal: in many areas, I broke deliberately or involuntarily from past patterns and routines. I was courageous, uncertain, confused, disappointed, and in pain — but perhaps all of that was necessary. I&apos;m approaching thirty, and as they say: nothing new can begin until something old breaks.&lt;/p&gt;
&lt;h2&gt;Work&lt;/h2&gt;
&lt;h3&gt;Five Years, Done&lt;/h3&gt;
&lt;p&gt;This year&apos;s theme is &quot;Farewell, Midsummer&quot; — from the essay I wrote this year with the same title. Drawn by the pull of uncertainty, a startup I believed in, and other reasons I won&apos;t enumerate here, I left TME (Tencent Music Entertainment), where I&apos;d spent five years since graduating.&lt;/p&gt;
&lt;p&gt;Honestly, the leaving hurt — both then and in hindsight. There&apos;s regret. But no guilt.&lt;/p&gt;
&lt;p&gt;March 2018. I submitted my new grad resume to Tencent and Ant Financial. A recruiter named Chuang from SNG&apos;s QQ Music team added me the same evening, and set up a phone interview for the next morning — a Saturday. He came into the office on a Saturday just to interview me. When I left, he told me he&apos;d been worried I&apos;d accept somewhere else after he spotted my resume, which is why he moved so fast. He felt he&apos;d held me back somehow — that my future could have been wider — while I felt nothing but gratitude for our crossing paths.&lt;/p&gt;
&lt;p&gt;I&apos;m grateful I found that team. When SNG&apos;s music division was being spun off into a separate company (TME), the HR kept checking whether I wanted to renew my contract — technically it would no longer be Tencent but a subsidiary. Meanwhile Ant&apos;s hot frontend team, right ahead of their IPO, was everyone&apos;s dream destination. But after even a short taste of the music team&apos;s culture, I chose to stay. I loved the atmosphere: a mentor who actually mentored, colleagues who joked and thought together, product and engineering people who genuinely respected each other. Five years later I still miss the energy of those early days; most of the friends I stay in close contact with are from that first team.&lt;/p&gt;
&lt;h3&gt;The Bottleneck and the Path Through It&lt;/h3&gt;
&lt;p&gt;Memory softens things, but reality didn&apos;t cooperate.&lt;/p&gt;
&lt;p&gt;At work, I gave 100% — I believed I could push any project to its limit. After making T10 in two and a half years, I hit the first real wall: no more growth-stage projects.&lt;/p&gt;
&lt;p&gt;The internet was contracting. Companies were cutting. Our team, under business pressure, was grinding through fragments — parallel requirements, scope shifting mid-development. Projects I&apos;d put real overtime into got cancelled the next day. Unstable. No way to see where effort led. No visible path to growth. So I optimized for efficiency and tried to adapt.&lt;/p&gt;
&lt;p&gt;My background was deep-focus research work, which left me poorly equipped for parallel processing. I used this season deliberately — building multitasking ability, cross-team communication skill. But when I got good enough to handle three streams at once, four or five would appear. It became a perpetual machine. At peak: seven or eight concurrent requirements.&lt;/p&gt;
&lt;p&gt;That stretch was anxiety-inducing. My standard was precision; parallelism made precision impossible. I&apos;d attack my own output. After problems appeared, I couldn&apos;t forgive the delivery quality.&lt;/p&gt;
&lt;p&gt;I also saw clearly: if I stayed in this fragmented spiral, I&apos;d stop growing. I had to find my own way out. My department had no projects — other departments did. I started going after opportunities externally, on weekends, essentially volunteering to help other teams. Simultaneously I was building technical projects in my free time with no official mandate, hoping to make something real enough that it had to be recognized. Eventually a restructure moved me to the team I&apos;d been moonlighting for, and I shipped new projects, reaching T11.&lt;/p&gt;
&lt;p&gt;From the outside, making T11 in four years looks like being lucky with projects. But tracing it back: almost all the resources were earned, not given. Luck is the context; luck doesn&apos;t determine the ceiling. If we attribute everything to luck, we underestimate our own potential, mistake the path as unrepeatable, and lose the motivation to push forward — and possibly the trust of the people around us.&lt;/p&gt;
&lt;p&gt;Name a clear goal. Then find a path to it, by any means necessary.&lt;/p&gt;
&lt;h2&gt;Startup&lt;/h2&gt;
&lt;h3&gt;MoFlow&lt;/h3&gt;
&lt;p&gt;After leaving TME, I started a company. After a month of market research in August, I pulled together a small team and launched an AI-powered mental wellness product — &lt;a href=&quot;https://moflowapp.com/&quot;&gt;MoFlow&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&apos;ve written a full breakdown of MoFlow in &lt;a href=&quot;https://blog.ursb.me/posts/moflow/&quot;&gt;&lt;em&gt;Exploring and Building an AI Mental Wellness App&lt;/em&gt;&lt;/a&gt;, so I won&apos;t repeat it here. What I wanted to build was something that could make mental health a more everyday conversation — encouraging users toward self-dialogue, self-growth, and self-care.&lt;/p&gt;
&lt;p&gt;As I wrote in &lt;a href=&quot;https://blog.ursb.me/posts/weekly-28/&quot;&gt;Monthly #28: AI Has No Capacity to Experience the World&lt;/a&gt;: &quot;Attention, care, and love — these are gifts we receive and gifts we can give, because they only become alive in a life lived generously. We don&apos;t study theory to show off our erudition; the point is to change the world. Every act of practice carries the energy of many souls, and ultimately lands somewhere real, bringing benefit to others — that&apos;s the practical meaning we&apos;re after.&quot;&lt;/p&gt;
&lt;h3&gt;Development&lt;/h3&gt;
&lt;p&gt;Through this project I got to fully engage with, experience, research, and build products at the AI application layer — filling a gap that had existed throughout my career. More than that: I found again the original excitement I had for building products, for engineering itself.&lt;/p&gt;
&lt;p&gt;October: I left TME. From there: product, design, engineering, LLM, and operations all running at full speed simultaneously. Three days per feature cycle, 9am–12pm–6am. By late November we shipped the closed beta on schedule, maintaining one release per day through the beta period, and launched on the App Store in late December.&lt;/p&gt;
&lt;p&gt;The sheer volume of work was enormous for a small team — but we maintained good communication and real enthusiasm throughout. Everyone&apos;s energy pointed the same direction. Exhausting, but alive in a way I hadn&apos;t been for a while.&lt;/p&gt;
&lt;p&gt;After launch, investors reached out. We chose not to raise — product revenue was sufficient to keep things running healthily. So we focused on polishing core metrics and serving users well. When the first pieces of user feedback came back:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/IMG_5141.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;The Challenge&lt;/h3&gt;
&lt;p&gt;In the first days after launch, one of our submitted builds got stuck in &quot;In Review&quot; on the App Store — for over a month. Bug fixes couldn&apos;t ship. Four versions of planned features sat in the queue. The only response from App Review: &quot;We need more time.&quot;&lt;/p&gt;
&lt;p&gt;Unable to ship because of a live bug, we couldn&apos;t safely run any kind of growth. Anxiety, panic, and uncertainty spread through the team. I tried everything: withdraw and resubmit, change ASO/description/screenshots/title, communicate through review notes, email Apple Support, call Apple customer service, find expediting services, use the Review Status tool, submit expedite requests, request a WWDR consultation. The only response: &quot;Please be patient.&quot; The developer forums were full of people in the same situation, typically stuck for 2+ months.&lt;/p&gt;
&lt;p&gt;Without a dynamic update mechanism, and without adequate contingency planning, we slowed feature development and shifted focus to backend and LLM optimization. We planned to begin a new module after New Year&apos;s, one less dependent on rapid iteration. Still — hitting this right after launch rattled me.&lt;/p&gt;
&lt;h3&gt;Reflection&lt;/h3&gt;
&lt;p&gt;For about two weeks I kept logging everything in MoFlow itself. Then one Monday morning the MoFlow weekly service pushed me a message that made me stop:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/Picsew_20250121095546.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&quot;Patterns: whenever you encounter things outside your control, your mood takes a bigger hit.&quot;&lt;/p&gt;
&lt;p&gt;I thought about that. It was true. I&apos;ve always needed to fully control the things I&apos;m responsible for. If something slips out of that grip — if I can&apos;t ensure the quality of what I&apos;m building — I get anxious, even volatile. That includes the work anxiety I described earlier: getting overwhelmed by fragmented tasks meant I couldn&apos;t control the output quality, which sent me spiraling.&lt;/p&gt;
&lt;p&gt;Going deeper: I&apos;ve never let myself stop. I&apos;ve always been chasing, trapped in the pursuit of the future.&lt;/p&gt;
&lt;p&gt;A few days earlier I&apos;d written this in a response to a reader&apos;s letter:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I used to be terrified of standing still in fog. Every day, every minute, every second — terrified. So I ran as hard as I could, trying to grab hold of time as it passed, studying and working furiously, hoping to reach clarity by grasping the certain within the uncertain. When I finally broke through, I realized: what I feared wasn&apos;t &quot;uncertainty&quot; itself. It was the act of standing still. That kept me living entirely in pursuit of &quot;the future.&quot; Every time I caught up to the future, it lost its value the moment it arrived, and I&apos;d have to chase another one — exhausting.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Uncertainty isn&apos;t the enemy. Failure isn&apos;t either. What matters is how you face the fog — with enjoyment of the challenge, the exploration, the present. Refine your character. Slow down. &quot;It&apos;s not the goal that makes you — it&apos;s every step you take toward it.&quot; The right direction is in the process of arriving, not the arrival itself; not entering the inn, but walking toward it; not wearing the crown, but reaching for it.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Like the concept in &lt;em&gt;Zen in the Art of Archery&lt;/em&gt; — &quot;the present true heart&quot; — what matters is full presence and awareness in this moment, uncontaminated by the weight of the past or the anxiety of the future. Focus on current experience and sensation. Release the projected self. Experience pure being.&lt;/p&gt;
&lt;p&gt;Life isn&apos;t a race. It&apos;s an exploration. The journey doesn&apos;t consist of a series of endpoints — it&apos;s a series of journeys. Every goal reached is just a temporary stop. The real meaning is in how you hold each present moment as you move toward those stops.&lt;/p&gt;
&lt;h2&gt;Energy&lt;/h2&gt;
&lt;p&gt;Life this year was difficult. A lot of pain. The hardest New Year of my adult life — I spent it away from home for the first time. I&apos;ll leave the painful parts unspoken, and instead share some of the light I collected along the way.&lt;/p&gt;
&lt;h3&gt;The Energy in Letters&lt;/h3&gt;
&lt;p&gt;This year&apos;s reader letters were fewer than past years — thirty-one total. I&apos;ve always thought of replying as energy-consuming. As I wrote in &lt;a href=&quot;https://blog.ursb.me/posts/moflow/&quot;&gt;&lt;em&gt;Exploring and Building an AI Mental Wellness App&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Honestly, on days when fewer letters arrive, I feel lighter. Each reply requires me to fully inhabit the writer&apos;s perspective, to experience their words, to try to feel what they feel — &quot;if I were them, in their situation, what would I do?&quot; Then I collect myself and translate my energy into the reply. It usually takes one to two weeks per letter, because I need a quiet space to do it properly. If trying to empathize is this demanding, I can barely imagine what it&apos;s like to actually live the experiences people write to me about.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But I&apos;ve come to think I was wrong. Replying isn&apos;t only draining. In writing back, I also reflect on my own patterns — like that letter I mentioned, where I examined my own obsession with the future.&lt;/p&gt;
&lt;p&gt;And some letters gave me energy I wasn&apos;t expecting.&lt;/p&gt;
&lt;p&gt;At the start of the year, a reader sent what they called a &quot;fulfilled promise&quot; message:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Happy New Year&apos;s Eve! Seeing you move in a direction you&apos;re satisfied with makes me really happy. I wanted to thank you for something you said (and for your writing) — it showed me how many ways there are to realize yourself.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Anyway — thank you for the guidance you gave to someone who was lost. I&apos;m looking forward to graduating and whatever comes next (hoping to take the civil service exam). Wishing you success in everything!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&apos;m grateful to you too. Reading this at the time, I didn&apos;t feel much. I didn&apos;t expect that a message sent a year earlier would circle back and replenish me at exactly the right moment.&lt;/p&gt;
&lt;p&gt;And from another reader, more recently:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;After reading &quot;Farewell, Midsummer&quot; in September, I forwarded it to a friend. He told me his biggest feeling was sadness — seeing that kind of freedom and openness toward an uncertain future, a life he said he might never live. And after seeing someone living that way, he began to look more closely at what was keeping him stuck.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&apos;d received a lot of comments on that piece in the blog, but this letter landed differently — more real. I was deep in my own confusion when it arrived. Reading it felt like finding a few torn pages from my own diary, and picking up courage and strength from them.&lt;/p&gt;
&lt;p&gt;And a friend&apos;s message of comfort:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Perhaps when someone is struggling, that&apos;s exactly when they need to love themselves more. Life is very practical — very few people will look past the surface to reach for the heart.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What I love about letters — beyond the asynchronous format that suits my schedule — is what I once described in &lt;a href=&quot;https://blog.ursb.me/posts/weekly-18/&quot;&gt;Monthly #18: Escaping Social Networks&lt;/a&gt;: &quot;Writing email instead of fragmentary chat lets you distill your everyday thoughts and train your expression. It brings your attention back to language itself, giving words and feelings their most honest, textured form. And letter-writing is a kind of ceremony — it cultivates a sense of ritual in everyday life.&quot;&lt;/p&gt;
&lt;p&gt;I can&apos;t see, from any single point, how it connects to what comes next. But looking back after a few years, the connections appear across dimensions. As Steve Jobs said in his Stanford commencement: &quot;You can&apos;t connect the dots looking forward; you can only connect them looking backwards. So you have to trust that the dots will somehow connect in your future. You have to trust in something — your gut, destiny, life, karma, whatever. This approach has never let me down, and it has made all the difference in my life.&quot;&lt;/p&gt;
&lt;h3&gt;The Kindness of Others&lt;/h3&gt;
&lt;p&gt;Beyond reader letters, I&apos;m also grateful for the many moments of human generosity this year.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thank you for all the encouragement.&lt;/strong&gt; When I left, old friends sent gifts and words of support. New friendships appeared unexpectedly, steadying me as I moved.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thank you for all the appreciation.&lt;/strong&gt; Once you&apos;re working for yourself, there&apos;s no manager to affirm your direction and no colleagues to give feedback. I questioned everything I was building — its value, its purpose, its right to exist. User feedback told me it mattered. User subscriptions told me it could sustain itself.&lt;/p&gt;
&lt;p&gt;Before MoFlow launched, NetEase Cloud Music reached out. When the video call connected, I found two VPs and a department head on the other side — a 1-versus-3 meeting. We talked about product vision, key metric frameworks, potential challenges. Everything was pleasant. Near the end, I asked: &quot;But none of this really intersects with your business — what do you get out of this?&quot; They said: &quot;Partnership is really just an excuse to build a connection. We saw your background and what you&apos;re doing. We respect it. Getting to know you — that was the real goal.&quot; I could only joke: &quot;Thank you for the appreciation from a friendly competitor.&quot; But it genuinely gave me energy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thank you for all the encounters.&lt;/strong&gt; Not only the people in my life, but strangers&apos; comments. This one in particular — a small note that could have not existed — made me feel a real thread between us:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/20250131171524@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Thank you for all the stories.&lt;/strong&gt; After &lt;a href=&quot;https://blog.ursb.me/posts/2024-summer/&quot;&gt;&lt;em&gt;Farewell, Midsummer&lt;/em&gt;&lt;/a&gt; was published, many people left comments sharing their own stories. I saw the astonishing range of ways a life can be lived. One WeChat message stayed with me:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/IMG_5143_2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;She wrote: &quot;Only doing something you can imagine makes you feel alive.&quot; I&apos;ve kept that close.&lt;/p&gt;
&lt;p&gt;Writing all this in one stretch, I looked up at the bookstore lamp above the table. Maybe coincidence, maybe something else:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/IMG_5139.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Life passes like a white horse glimpsed through a crack — suddenly, it is gone.&lt;/em&gt; — Zhuangzi, &lt;em&gt;Knowing the North&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Perhaps separation and death are not the most frightening things. What&apos;s frightening is reaching the end without having figured out how to live — whether the life was tumultuous or quiet, brilliant or plain, it&apos;s all the finest gift. Every last bit of it.&lt;/p&gt;
&lt;p&gt;Grateful for everything.&lt;/p&gt;
&lt;h2&gt;Books, Films &amp;amp; Music&lt;/h2&gt;
&lt;p&gt;Year-end tradition.&lt;/p&gt;
&lt;h3&gt;TV&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Anna&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Inquisitor (Zhui Feng Zhe)&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Story of Rose (Mei Gui de Gu Shi)&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Joy of Life Season 2&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Never Go Home (Qian Wan Bie Hui Jia)&lt;/em&gt;: ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Judge (Zhi Xing Fa Guan)&lt;/em&gt;: ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Bleach (Piao Bai)&lt;/em&gt;: ★★☆☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Ice Hunter (Lie Bing)&lt;/em&gt;: ★★☆☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;White Night: Dawn (Bai Ye Po Xiao)&lt;/em&gt;: ★★☆☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Prosecutor (Jiu Bu de Jian Cha Guan)&lt;/em&gt;: ★★☆☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Resonance (Hui Xiang)&lt;/em&gt;: ★★☆☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Film&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;The Pig, the Snake and the Pigeon (Zhou Chu Chu San Hai)&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;To the Ends of the Earth (Wo de A Le Tai)&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Drishyam 2 (Wu Sha Man Tian Ji 2)&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;[REC] House for Rent (Ji Wu Chu Zu)&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Alien: Romulus (Yi Xing: Duo Ming Jian)&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;[REC] (Si Wang Lu Xiang)&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Three Squadrons (San Da Dui)&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Mute (Mo Sha)&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Karma (Yin Guo Bao Ying)&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Pegasus 2 (Fei Chi Ren Sheng 2)&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;A Mother&apos;s Revenge (Yi Ge Mu Qin de Fu Chou)&lt;/em&gt;: ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Ocean&apos;s Eleven (Man Tian Guo Hai)&lt;/em&gt;: ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Road to Valor (Yu Huo Zhi Lu)&lt;/em&gt;: ★★☆☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Rescue Operation (Jing Tian Da Ying Jiu)&lt;/em&gt;: ★★☆☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Godzilla x Kong 2&lt;/em&gt;: ★★☆☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Aquaman 2&lt;/em&gt;: ★★☆☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Lost You Forever (Bei Wo Diu Diao de Ni)&lt;/em&gt;: ★★☆☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Last to Go (Mo Lu Kuang Hua Qian)&lt;/em&gt;: ★☆☆☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;UN Peacekeepers (Wei He Fang Bao Dui)&lt;/em&gt;: ☆☆☆☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Anime&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Frieren: Beyond Journey&apos;s End&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Matthew the Magical Physicist (Wu Li Mo Fa Shi Ma Xiu)&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Why Fish Don&apos;t Exist (Yu Bu Cun Zai)&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Finite and Infinite Games&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Dear Me, I&apos;m Full of Murderous Intent (Qin Ai de Wo Bao Han Sha Yi)&lt;/em&gt; (manga): ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Six Lying Students (Liu Ge Shuo Huang de Da Xue Sheng)&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Philosophy 100: The Sting of the Postmodern&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Writing as a Way of Healing (Shu Xie Zi Yu Li)&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Don&apos;t Believe Everything You Think (Bu Yao Xiang Xin Ni Suo Xiang de Yi Qie)&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Get Rich Slowly (Man Man Bian Fu)&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Zen in the Art of Archery&lt;/em&gt;: ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Writing Down the Soul (Xin Ling Shu Xie)&lt;/em&gt;: ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Summer, Fireworks, and My Corpse (Xia Ri Yan Huo Yu Wo de Shi Ti)&lt;/em&gt;: ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Warren Buffett Teaches You to Read Financial Statements&lt;/em&gt;: ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Nothing: The Best State of Life (Wu: Sheng Ming de Zui Jia Zhuang Tai)&lt;/em&gt;: ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Seven Witnesses (Qi Ge Zheng Ren)&lt;/em&gt;: ★★☆☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Games&lt;/h3&gt;
&lt;p&gt;Barely played this year. The one I did play: &lt;em&gt;The Legend of Zelda: Echoes of Wisdom&lt;/em&gt; — didn&apos;t finish.&lt;/p&gt;
&lt;h3&gt;Writing&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-25/&quot;&gt;Monthly #25: Love Concrete People&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-26/&quot;&gt;Monthly #26: Journey&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-27/&quot;&gt;Monthly #27: Living Nomadically&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-28/&quot;&gt;Monthly #28: AI Has No Capacity to Experience the World&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/2024-summer/&quot;&gt;Farewell, Midsummer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/moflow/&quot;&gt;Exploring and Building an AI Mental Wellness App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/tools/&quot;&gt;My Personal Toolkit and Favorite Things&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/mac-app-share-2024/&quot;&gt;Niche Mac Apps and Workflow Sharing (2024)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Unveiling the Atum Rendering Engine: The Life of a Game Component, From Load to Screen&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;New Year Goals&lt;/h2&gt;
&lt;p&gt;Twenty-nine years old — a year that can go in many directions. Full of possibility. After this year&apos;s breaking-apart, I hope to spend my thirties rebuilding something coherent.&lt;/p&gt;
&lt;p&gt;A few days ago I finished &lt;em&gt;The Story of Rose&lt;/em&gt;. The show ended with a poem I want to use to close this post:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I walk the open road, easy and free,
I am healthy and free.&lt;/p&gt;
&lt;p&gt;The world before me,
the long brown road before me,
leading wherever I choose.&lt;/p&gt;
&lt;p&gt;Henceforth I ask not good fortune — I myself am good fortune,
henceforth I whimper no more, postpone no more, need nothing.&lt;/p&gt;
&lt;p&gt;Done with indoor complaints, libraries, querulous criticisms,
strong and content, I travel the open road.&lt;/p&gt;
&lt;p&gt;I am not afraid — I am complete.
I master myself, and nothing else masters me.
I go where I wish, to whomever I wish.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The world before me, leading wherever I choose. From here, I no longer chase after happiness — I am happiness.&lt;/p&gt;
&lt;p&gt;May everything in the world find its moment of flowering.&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2024&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>Weekly #28: AI Has No Capacity for Experience</title><link>https://ursb.me/en/posts/weekly-28/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-28/</guid><description>Marking MoFlow&apos;s App Store launch, explores why AI lacks the capacity for lived experience, the limits of language, and the pitfalls of simulated emotional companionship.</description><pubDate>Wed, 01 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This issue is a record of and reflection on November and December 2024.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;AI Has No Capacity for Experience&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://moflowapp.com&quot;&gt;MoFlow&lt;/a&gt; launched on the &lt;a href=&quot;https://itunes.apple.com/app/id6737146258&quot;&gt;App Store&lt;/a&gt; last night — New Year&apos;s Eve 2024. Three months of intensity have produced something tangible. And so, at last, I have time to write this issue.&lt;/p&gt;
&lt;p&gt;The question people have asked me most often while building MoFlow: &quot;Can AI actually help people heal emotionally?&quot; This piece is my attempt at a simple answer.&lt;/p&gt;
&lt;p&gt;Note: &quot;AI&quot; in this piece refers to LLMs.&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;Part 1: What Separates AI from Humans — AI Has No Capacity for Experience&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;When people ask about MoFlow, the conversation inevitably turns to the difference between an AI counselor and a human one. We say AI can&apos;t communicate &quot;face to face,&quot; can&apos;t &quot;interact with&quot; another person in a physical, shared reality — the subtle shifts in tone, the meaning in silence, the emotions that never get put into words. These are distinctly human experiences, born from the full complexity of feeling.&lt;/p&gt;
&lt;p&gt;Human cognition isn&apos;t just information processing. It&apos;s experience, woven from the intersection of sensation and emotion. We perceive reality through the body and give meaning to things through feeling. This mode of engagement gives us a unique way of understanding — one that allows us to make judgments and decisions in complex situations.&lt;/p&gt;
&lt;p&gt;If experience is our most direct way of interacting with the world — sensory, emotional, an immediate state of being — then understanding is what happens when we reflect on, analyze, and integrate those experiences. It&apos;s a rational activity.&lt;/p&gt;
&lt;p&gt;AI is impressive at processing information and generating text, but it lacks this experiential dimension. It can handle enormous amounts of data and produce plausible output, but it cannot experience what that data represents in the real world. It does not have the capacity for direct experience that humans do.&lt;/p&gt;
&lt;p&gt;Experience is more than perceiving information. It includes emotion, consciousness, and subjectivity — the heart of what it means to be human. Experience is the key that links inner consciousness with outer reality, individual with society (Dilthey).&lt;/p&gt;
&lt;p&gt;And understanding, it&apos;s often argued, is inseparable from experience. We come to a deep understanding of the world through lived events, emotional turmoil, and interaction with others. AI can process vast data and extract patterns from it, but it cannot truly &quot;experience&quot; what that data represents. It cannot meet the temporal and practical requirements of experience. By contrast, AI&apos;s &quot;understanding&quot; is algorithmically simulated — not understanding in any genuine sense.&lt;/p&gt;
&lt;h3&gt;Part 2: The Infinite of Concept and the Limits of Language&lt;/h3&gt;
&lt;p&gt;Next, the problem of language in LLMs.&lt;/p&gt;
&lt;p&gt;In a 2020 piece, &lt;a href=&quot;https://blog.ursb.me/posts/sky/&quot;&gt;&lt;em&gt;On &quot;Game Aesthetics,&quot; Starting from Sky: Children of the Light&lt;/em&gt;&lt;/a&gt;, I wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Because of the inherent limitations of human spoken and written language — and because the properties of things are infinitely rich — there can be no perfectly precise expression. And since emotion and things are constantly changing and developing, all verbal expression can only ever be an exhausted pursuit of a moving target.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At the Tower of Babel, God fractured language and humanity shattered with it. But the meaning of language isn&apos;t determined by God — it&apos;s determined by those who use it, and language isn&apos;t the only medium of communication. Countless other behaviors can close the distance between a person and a concept. But only close — the concept itself is infinite. &lt;em&gt;Siddhartha&lt;/em&gt; makes the same point: language cannot fully transmit truth or wisdom.&lt;/p&gt;
&lt;p&gt;In logic, a proposition places an object under a concept. We can treat any object as having properties and individuality. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Fa: Confucius is a philosopher
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here &lt;em&gt;a&lt;/em&gt; is an individual constant representing Confucius, and &lt;em&gt;F&lt;/em&gt; is a predicate saying that this individual is a philosopher. What we notice is that concrete individuals resist full grasp — in any form of artistic expression, what we capture is only certain characteristics of a particular individual. &lt;strong&gt;The concept we hold in mind is formed by the fusion of countless such perspectives. The higher our vantage point, the broader our historical and cultural horizon, and the more accurately we can assess the significance of everything within that view — large and small, near and far.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Beyond this, translating subjective experience into objective language is itself inherently problematic. An observer&apos;s subjective feeling cannot be fully shared — because no one else can become the observer, or have an experience identical to the original one&apos;s. As Wittgenstein put it: &lt;strong&gt;&quot;The limits of my language mean the limits of my world.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI&apos;s text-based processing and expression therefore necessarily makes understanding and empathy difficult.&lt;/p&gt;
&lt;h3&gt;Part 3: The Cold Reflection of AI Companionship&lt;/h3&gt;
&lt;p&gt;Earlier we established that the authenticity of emotion comes from experience. Human emotional complexity lies not just in how emotion is expressed, but in its roots — in personal history, cultural context, biological instinct. AI lacks the capacity for lived experience, and that absence means AI&apos;s emotional responses are likely superficial and shallow. AI&apos;s &quot;understanding&quot; of human emotion may be more like a mirror&apos;s reflection than any form of genuine resonance. A painting can imitate nature, but can never be nature itself.&lt;/p&gt;
&lt;p&gt;Understanding might still be logical, computational — but resonance requires an inner experience and an emotional connection.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is not understanding. It is not resonance. It is like a reflection in a cold, still pool: a perfect, icy image of the world&apos;s surface.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In 2019 I wrote a piece called &lt;a href=&quot;https://blog.ursb.me/posts/ai-consciousness/&quot;&gt;&lt;em&gt;How Could Artificial Consciousness Be Possible?&lt;/em&gt;&lt;/a&gt;, which explored whether AI could have genuine self-consciousness. I used examples like the Chinese Room experiment and philosophical zombies to argue that humans possess a unique capacity for subjective experience — private, unobservable from the outside. What we can say with confidence today is that current LLMs lack genuine inner experience.&lt;/p&gt;
&lt;p&gt;Emotion is at the core of human experience. It isn&apos;t just a response to external stimuli — it&apos;s a genuine expression of our inner world. Yet &lt;strong&gt;as emotion-simulating technology becomes ubiquitous, we risk a kind of emotional dilution: complex, deep experience flattened into replicable patterns&lt;/strong&gt; — which is precisely the trap that most AI companion apps fall into.&lt;/p&gt;
&lt;p&gt;The particularity of emotion comes from individual life history and cultural context. Each person&apos;s emotions reflect their own life story, their own way of engaging with the world. We need to honor the uniqueness of individual experience rather than reducing it to universal patterns. We can write backstories into an agent&apos;s prompt, give it a relationship history and a personality and hobbies and life experiences — but the AI hasn&apos;t lived any of that. Everything becomes simulation. Its emotional feedback becomes performative, formulaic. Users can spin up multiple agents in a companion app, chat with each of them, and see how each persona handles a given emotional situation. Even if things feel formulaic, no big deal — get bored with one, create the next.&lt;/p&gt;
&lt;p&gt;What we actually need is to help users cultivate a critical awareness — to be able to distinguish between emotions that are genuinely their own and those steered by external technology. &lt;strong&gt;We need to protect the authenticity of human emotion, and that requires ongoing self-reflection and self-understanding. Only through genuine inner exploration can we truly understand where our feelings come from — and discover their authentic value in that process.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In an age of simulated emotion, &lt;strong&gt;what we need is not simply companionship products — we need a deep and genuine respect for the nature of human emotion.&lt;/strong&gt; Only then can we, in this complicated world, &lt;strong&gt;preserve the uniqueness and authenticity of what we feel.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Part 4: Meaning Emerges from Practice&lt;/h3&gt;
&lt;p&gt;If AI&apos;s emotional understanding is simulation, does that mean any interaction between humans and AI loses its deeper meaning?&lt;/p&gt;
&lt;p&gt;In human relationships, meaning often emerges from genuine emotional exchange, resonance, and understanding.&lt;/p&gt;
&lt;p&gt;But meaning doesn&apos;t come from emotional authenticity alone. Meaning can also arise from function, from usefulness, from outcomes. When AI helps us solve complex problems or improves our lives, that interaction itself is meaningful — even if the emotional understanding is simulated.&lt;/p&gt;
&lt;p&gt;It&apos;s also worth reflecting on human emotion itself. Are our emotions always authentic? Or are they also shaped — &quot;programmed,&quot; in a sense — by social, cultural, and biological forces? If we accept that human emotion is sometimes itself a complex kind of simulation, does AI&apos;s simulated emotion seem quite so different? In my earlier piece, &lt;a href=&quot;https://blog.ursb.me/posts/ai-consciousness/&quot;&gt;&lt;em&gt;How Could Artificial Consciousness Be Possible?&lt;/em&gt;&lt;/a&gt;, I wrote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Chinese Room argument neglects the engineering dimension. A real implementation would require building a model or function — and even if symbols lack inherent semantics, the fact that input and output are predictable means that human consciousness has already shaped them. When the model or function is defined, formal semantics is already built in. This makes it semantic, not merely syntactic. In NLP research today, whether the empiricist approach of building deep learning models or the rationalist approach of formal logic — the moment the system is constituted, it is already semantic. For the latter, obviously. For the former, the labels used in supervised learning carry semantic content explicitly assigned by humans.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So &lt;strong&gt;what we call &quot;meaning&quot; does not reside in experience, or even in understanding — it depends more on how we choose to see and use these interactions.&lt;/strong&gt; AI&apos;s emotional simulation can serve as a tool: helping us understand ourselves better, facilitating emotional communication between people, and in some circumstances, providing a form of emotional support. The meaning of human-AI interaction may not lie in the authenticity of emotion, but in what value and purpose we assign to those interactions. In exploring AI, we are both observing and creating, being observed and being redefined. &lt;strong&gt;This two-way dynamic may be the necessary path toward truth.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Part 5: The Answer MoFlow Is Pursuing&lt;/h3&gt;
&lt;p&gt;True understanding and wisdom are not just accumulated information — they are deep insights obtained through experience, reflection, and emotion. This is uniquely human, and it&apos;s the core value we should protect and cherish in the face of AI. It is also MoFlow&apos;s guiding philosophy.&lt;/p&gt;
&lt;p&gt;Every design decision in MoFlow centers the user. Features de-emphasize AI&apos;s presence. We fully leverage AI as a tool while avoiding any role as emotional companion.&lt;/p&gt;
&lt;p&gt;For example: after you write about something that happened to you in MoFlow, the app quietly extracts your thoughts and surfaces those with positive emotional valence. When you catch a glimpse of that externalized energy unexpectedly, you start to build more positive beliefs without even noticing. MoFlow encourages positive self-dialogue.&lt;/p&gt;
&lt;p&gt;From the piece &lt;a href=&quot;https://m.huxiu.com/article/3684208.html?type=text&quot;&gt;&lt;em&gt;A Method for Rapid Mental Growth: Increasing Your Own Agency&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&quot;Many people default to negative self-talk, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Self-negation: I&apos;m not good at this, so I should avoid it.&lt;/li&gt;
&lt;li&gt;Self-doubt: This problem seems tricky — might it be beyond me?&lt;/li&gt;
&lt;li&gt;Self-criticism: I acted so badly just now. How did I perform so poorly?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These seem harmless, but the brain has a particular trait: it believes information that is repeated. These apparently ordinary internal dialogues, through the brain&apos;s repetition and consolidation, gradually form fixed patterns.&lt;/p&gt;
&lt;p&gt;Over time, the brain starts to believe them — lowering our self-assessment and causing us to actually become what we&apos;ve been telling ourselves. This severely constrains our agency; when difficulty arrives, we hesitate, hold back, and find it hard to act effectively.&lt;/p&gt;
&lt;p&gt;So the first step toward change is converting negative dialogue into positive self-talk:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I&apos;m not good at this, so I should avoid it → I have another chance to gain experience.&lt;/li&gt;
&lt;li&gt;This problem seems tricky — might it be beyond me? → Am I becoming stronger? Let me test myself with this problem.&lt;/li&gt;
&lt;li&gt;I acted so badly just now. How did I perform so poorly? → I&apos;ve already improved compared to before. Maybe next time will be even better.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One important note: many books teach &apos;self-suggestion&apos; — telling yourself &apos;I&apos;m great,&apos; &apos;I&apos;m strong,&apos; &apos;I&apos;m capable.&apos; This is wrong.&lt;/p&gt;
&lt;p&gt;Research shows that vague, imprecise self-suggestion, or suggestion the brain doesn&apos;t believe, is not just ineffective — it backfires. It highlights the problem and makes something that wasn&apos;t so serious feel more serious.&quot;&lt;/p&gt;
&lt;p&gt;When you&apos;re facing a real difficulty, MoFlow will say something like: &quot;You&apos;ve solved similar problems before. You have the transferable experience, and you have what it takes to handle this.&quot; Or: &quot;Even getting it wrong is fine — it enriches your life and becomes new experience.&quot;&lt;/p&gt;
&lt;p&gt;Today&apos;s AI can analyze large datasets to reveal patterns in human behavior, helping us better understand ourselves and society. But ultimately, genuine understanding still flows back to individual experience and personal reflection.&lt;/p&gt;
&lt;p&gt;AI&apos;s understanding is instrumental, not existential. &lt;strong&gt;It can help us better understand certain aspects of the human condition, but it cannot replace the deep insight we gain through lived experience and inner reflection.&lt;/strong&gt; This is why MoFlow&apos;s AI design is guiding and evocative — encouraging self-dialogue, self-growth, and self-care.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Care, attention, and love — these are gifts we receive, and gifts we can give to others. They only come alive in a life of generosity.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We study theory not to show off by citing books, but to change the world through what we do. &lt;strong&gt;Behind every act of practice are the forces of many souls, and those efforts ultimately land in the world — bringing something good to others. That is the meaning of practice we&apos;re after.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&quot;Can AI actually help people heal emotionally?&quot;&lt;/p&gt;
&lt;p&gt;— &lt;strong&gt;&quot;Yes. Absolutely.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;🎬 Books, Films, and More&lt;/h2&gt;
&lt;p&gt;What I&apos;ve been reading, watching, and playing this period:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finished: Biography | &lt;em&gt;Why Fish Don&apos;t Exist&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Psychology | &lt;em&gt;Nothing: The Optimal State&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: Psychology | &lt;em&gt;Don&apos;t Believe Everything You Think&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: Fiction | &lt;em&gt;Six Lying Undergrads&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Popular science | &lt;em&gt;How Far Are the Stars?&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Korean drama | &lt;em&gt;Anna&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Drama | &lt;em&gt;White Night Breaks&lt;/em&gt; | ★★☆☆☆&lt;/li&gt;
&lt;li&gt;Currently reading: Philosophy | &lt;em&gt;Worldviews&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Currently reading: Psychology | &lt;em&gt;The Knowledge Illusion&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Currently reading: Philosophy | &lt;em&gt;What We Live For&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-28&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Exploring and Building an AI Mental Wellness App</title><link>https://ursb.me/en/posts/moflow/</link><guid isPermaLink="true">https://ursb.me/en/posts/moflow/</guid><description>Chronicles the design behind MoFlow, an AI wellness app that breaks expressive writing into five stages, paired with mood tracking and CBT-based analysis.</description><pubDate>Fri, 29 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Opening: Letters of Consultation and Reflections on Self-Healing&lt;/h2&gt;
&lt;p&gt;Over the past two years, I have continued to receive letters of consultation through my blog. These letters led me to open a &lt;a href=&quot;https://blog.ursb.me/posts/service/&quot;&gt;dedicated consultation service&lt;/a&gt; earlier this year — an asynchronous channel for answering readers&apos; questions. To date I have received nearly a hundred letters. Some correspondents explicitly expressed gratitude after I replied; others went silent. I often wonder whether my responses had any positive impact on their lives — perhaps they found their footing again and no longer needed to write back.&lt;/p&gt;
&lt;p&gt;Honestly, on days when fewer letters arrive, I feel considerable relief. Each time I reply, I have to put myself in the writer&apos;s shoes, carefully absorb their words, and try to empathize: &quot;If I were them, in their situation, how would I respond?&quot; Then I collect my thoughts and transform my own energy into the reply. A letter typically takes one to two weeks to answer, because I too need a quiet environment to give the most fitting response. Trying to empathize is already hard enough; I can only imagine the real pain the writers are living through.&lt;/p&gt;
&lt;p&gt;In these letters, I&apos;ve noticed that most people face similar struggles and challenges — self-development, relationships, family dynamics, career planning — with a great deal in common. It is very difficult for us to break free from these problems through individual effort alone. Reading these letters, I see that most people lack effective methods — or even the awareness — to handle the problems of daily life. Every person experiences the pressures of the human condition in a highly personal way, and so when problems arise, people tend to absorb them alone until they can no longer bear it, then try to talk. Very few people systematically seek out and address the root causes of their problems.&lt;/p&gt;
&lt;p&gt;I therefore want to build a broadly applicable and systematic healing approach that can address these problems at scale — one that allows individuals to heal themselves. I have broken this systematic process into: &lt;strong&gt;expression, release, understanding, allowing, and exploration.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E4%BA%94%E4%B8%AA%E7%8E%AF%E8%8A%82.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Expression: Expressive Writing as the Vehicle&lt;/h2&gt;
&lt;p&gt;Self-reflection is the starting point for solving problems. In the process of replying to readers, I also reflect on how I trace the root of issues for myself. If it were me, I would choose a quiet environment, review the difficulty and my current situation in my mind, and write it down. Within the words, I try to find the hidden factors behind the events. Over the years I have developed the habit of spending ten minutes before bed recording the experiences of the day.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_5031.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://blog.ursb.me/posts/weekly-19&quot;&gt;&lt;em&gt;Monthly Digest #19: The Meaning of Keeping a Diary&lt;/em&gt;&lt;/a&gt;, I explored the meaning I&apos;ve discovered in years of diary-keeping — three points in total:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A tool for self-awareness&lt;/li&gt;
&lt;li&gt;A mirror reflecting life&apos;s meaning&lt;/li&gt;
&lt;li&gt;A record of the beautiful things around me&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E6%97%A5%E8%AE%B0%E7%9A%84%E4%B8%89%E4%B8%AA%E6%84%8F%E4%B9%89.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A diary is more than a record of life — it is a form of dialogue with oneself and a path of growth. Through writing, I am able to transform the inner chaos and distress into clear words. The process itself is healing. In the quiet moments of writing, I can temporarily step back from daily noise and focus on listening to the inner voice.&lt;/p&gt;
&lt;p&gt;Keeping a diary has helped me develop the habit of talking with myself, allowing me to examine my own emotions and thoughts from a more objective perspective. Through sustained writing, I not only record the moments of life but also observe the trajectory of my growth, discover patterns in my emotional shifts, and thereby better understand and manage my psychological state.&lt;/p&gt;
&lt;p&gt;Journaling is just one vehicle for developing the habit of recording — it can also take the form of weekly reflections, personal essays, memos, or other formats. This style of writing is known in psychology as expressive writing, a commonly used method for helping people manage stress and improve mental health. The writing process allows people to genuinely express their feelings and thoughts, fully baring the inner self. It helps to reach into deep loneliness, reconnect with the self, and find inner peace.&lt;/p&gt;
&lt;p&gt;As written in the third edition of Oxford&apos;s &lt;em&gt;Handbook of Positive Psychology&lt;/em&gt;: &quot;In the months following a writing exercise, people who wrote about the &apos;deepest thoughts and feelings&apos; about a traumatic event visited a clinic 50% less often. This writing has been called &apos;emotional disclosure writing.&apos; To examine physiological factors, researchers designed another study. Blood was drawn before writing began, at the last session, and six weeks after the end, to assess immune function. The results showed that those who wrote about their thoughts and feelings experienced a significant improvement in immune function. This effect peaked at the last day of writing and often lasted more than six weeks. Researchers also found that participants often said how useful the writing was in helping them understand and process things.&quot;&lt;/p&gt;
&lt;p&gt;As a form of psychotherapy, expressive writing reveals an important truth about the human interior: expression itself is liberation. From a philosophical angle, expressive writing is a practice of self-reflection — not only an emotional release but a renewed examination of one&apos;s own existence. By writing, we externalize inner chaos into tangible words; this process allows us to revisit our emotions and thoughts from a spectator&apos;s perspective. This method works because it allows a person to have a dialogue with themselves, breaking through inner loneliness. If you can express your deepest thoughts and feelings, that act is in itself healing.&lt;/p&gt;
&lt;p&gt;We cannot encounter ourselves because we don&apos;t give time to ourselves. Expressive writing teaches us to face ourselves gently — to gently set aside our masks and approach ourselves in a tender, soft way.&lt;/p&gt;
&lt;p&gt;As Heidegger said, the essence of human existence is &quot;Being-in-the-world,&quot; meaning we are always connected to the world and to others. But in today&apos;s fast-paced, high-pressure society, people often feel alienated from themselves and from others. Expressive writing offers a path to reconnect with the self and find inner stillness.&lt;/p&gt;
&lt;p&gt;So we define the vehicle of this systematic solution as expressive writing. The emphasis of the approach is not on &quot;writing&quot; but on &quot;expression.&quot; The next question is: how do we use this vehicle to solve real problems?&lt;/p&gt;
&lt;h2&gt;Release: Awakening to Emotion Through Free Writing&lt;/h2&gt;
&lt;p&gt;Within the stillness of expressive writing, we begin to seek the deep source of emotion. The basic premise of Rational Emotive Behavior Therapy (REBT) is that it is not events themselves that cause our emotional responses, but our cognition and interpretation of events that determine our feelings and behaviors. So the first thing to establish is: what has already happened cannot be changed, but memory and experience can be changed. This is the precondition for healing.&lt;/p&gt;
&lt;p&gt;From this premise we can derive that the primary goal of healing is to regulate one&apos;s own cognition and emotion. The most crucial step in regulating cognition and emotion is learning to notice and identify emotions — and this is the core of our systematic approach. The precondition for identification is being able to notice emotions. So how can we effectively notice our own emotions?&lt;/p&gt;
&lt;p&gt;Emotional awareness is closely linked to our capacity for feeling. Bob Dylan once said: &quot;Some people can feel the rain; others just get wet.&quot; Different individuals experience the same events differently, depending on their perception and inner state.&lt;/p&gt;
&lt;p&gt;In life we are often passive recipients of events, not actively perceiving and understanding the world around us. We first need to reactivate our capacity for feeling in order to explore our core emotions deeply, thereby gaining a richer life experience. This deep perceptual capacity not only fosters personal growth but also strengthens our connection and understanding with others. The art of living lies in distilling meaningful experience from each moment — not merely passing through it.&lt;/p&gt;
&lt;p&gt;The most direct way to reactivate the capacity for feeling is release — a self-repair mechanism for emotion. In the context of modern society, however, we need a safe channel for harmless release. Our answer is free writing. We encourage individuals to let go in free writing — to clear the mind, write whatever comes, without following logic or rhetorical rules, without concern for formatting, coherence, or grammatical correctness. Follow the flow of thought; let emotions move freely. Record what happened today; write down your mood. This is also a form of narrative therapy. We advocate writing because writing better enables emotional separation and release, and is more conducive to object separation.&lt;/p&gt;
&lt;p&gt;I know well that restoring the capacity for feeling is not easy. Turning raw feeling into something refined and delicate is like sifting gold from murky water. Yet through free writing, I believe individuals can gradually begin to notice their own emotions — because in the writing process, we have already learned to &quot;meet ourselves.&quot;&lt;/p&gt;
&lt;p&gt;If free writing is the exploration of the inner world, then the next step is a deepening of self-understanding.&lt;/p&gt;
&lt;h2&gt;Understanding: Identifying Core Emotions in the Moment&lt;/h2&gt;
&lt;p&gt;In free writing, we often express our reactions through inhibitory emotions like anxiety. The task of this stage is to penetrate these inhibitory emotions, locate the core emotion in the event, and identify it within the free-written text. Through this process, we can achieve precise emotional healing and a deeper understanding of our inner world.&lt;/p&gt;
&lt;p&gt;The most important task while writing is therefore to find the core emotion we face regarding this event — as if tracing the thousand strands of feeling to find their source: the core emotion.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E6%A0%B8%E5%BF%83%E6%83%85%E7%BB%AA%E4%B8%8E%E5%85%B6%E4%BB%96%E6%83%85%E7%BB%AA%E7%9A%84%E5%85%B3%E7%B3%BB%E5%9B%BE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Core emotions hide behind various inhibitory emotions. The search often runs into difficulty, and this is where a new concept comes in: emotional granularity. Just as a painter can distinguish fine color differences invisible to most people, our perception of emotions works similarly.&lt;/p&gt;
&lt;p&gt;If our perception of emotions is too vague — if we can only say &quot;I feel terrible&quot; or &quot;my mood is bad&quot; — then every time we feel &quot;not good,&quot; we tend to get caught in a negative mind-body reaction. This state continually drains our energy, because we neither know exactly what we&apos;re dealing with nor how to address it. When we develop the ability to quickly distinguish different emotions, these clearly labeled emotions form a kind of &quot;linguistic protective barrier&quot; for our mental world.&lt;/p&gt;
&lt;p&gt;There are two ways to develop emotional granularity: learning new vocabulary, and labeling emotions. We can think of this emotional identification capacity as an inner &quot;linguistic barrier.&quot; Once we learn to attach precise labels to emotions, they are no longer hazy feelings — they become clear, understandable, and manageable information. This capacity both protects us and drives personal growth, because it helps us more accurately recognize the needs and boundaries of our inner life.&lt;/p&gt;
&lt;p&gt;This identification process, however, requires us to rationalize our feelings — which brings a new challenge: in pursuing emotional identification and heightened self-awareness, how do we ensure we don&apos;t lose the appreciation for life&apos;s unpredictability and spontaneity? Furthermore, could this kind of emotional identification lead us to over-rationalize our feelings, ignoring the natural flow and change of emotion?&lt;/p&gt;
&lt;p&gt;This is where MoFlow&apos;s key concept comes in: letting emotions flow freely.&lt;/p&gt;
&lt;h2&gt;Allowing: Let Emotions Flow Freely&lt;/h2&gt;
&lt;p&gt;Labeling emotions can, in some circumstances, lead people to over-rationalize their feelings. Using emotional identification tools may incline people toward analyzing and labeling emotions rather than naturally experiencing and processing them. This kind of over-analysis can make people ignore the natural flow and change of emotion — or even lead to excessive control or suppression of emotion.&lt;/p&gt;
&lt;p&gt;We need to allow emotions to occur naturally. For instance, negative emotions are a &quot;survival tool&quot; for humans — they evolved to help us adapt more quickly to change: anger reminds us when our boundaries are violated and gives us the courage to act; anxiety sharpens the focus we need to handle problems; loneliness reminds us of our need for close relationships; sadness reminds us that we have just lost something or someone important. Without negative emotions, we cannot skillfully respond to external threats.&lt;/p&gt;
&lt;p&gt;Beyond that, emotions are an important driver of action. Fear is being afraid of something; worry is being afraid of nothing; anger motivates us to correct injustice; sadness makes us cherish and care for others more; passion and enthusiasm drive us to pursue our goals and realize our dreams. People grieve for the loss of love, and maintain grief in order to regain it.&lt;/p&gt;
&lt;p&gt;All events in life are there to shape us. Looking at our past with a different attitude, we can find in it resources and strength, discern patterns, discover our life mission, and plan the path of our future lives well. Suffering itself is not the goal — it is a process. By changing how we view suffering, we can draw experience and strength from it.&lt;/p&gt;
&lt;p&gt;So in pursuing inner peace, what matters is finding balance: maintaining equanimity while not ignoring the positive role of emotions. This is exactly MoFlow&apos;s slogan: &lt;strong&gt;&quot;Let emotions flow freely; write your healing power.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/Slogan.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Writing-based healing encompasses three overall stages: noticing, identifying, and healing. In the healing stage, MoFlow emphasizes the immediacy of experience and a grounding therapeutic approach — guiding us to accept ourselves and allow emotions to occur, turning toward inner peace. Acceptance means being willing to face and receive things as they are in this moment; acceptance is not suppressing the occurrence of emotions, but watching the various emotions and thoughts arise, develop, and pass away.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E5%8D%B3%E6%97%B6%E6%80%A7%E5%92%8C%E7%9D%80%E9%99%86.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;First, &quot;immediacy of experience&quot; refers to a state of mind that does not focus on facts removed from one&apos;s own experience — in simple terms, an attitude of accepting things as they are; an individual&apos;s direct perception and experience of an event or situation in the present moment. This immediacy emphasizes full engagement with and feeling of the current experience, rather than recalling the past or anticipating the future. In &lt;a href=&quot;https://sspai.com/post/83743&quot;&gt;&lt;em&gt;On the Value of Existence and the Experience of Life&lt;/em&gt;&lt;/a&gt;, I emphasized the importance of &quot;the present&quot;: &quot;The only certainty is the present. The only thing that matters is now, this very moment. A person must first exist before anything about life can be discussed.&quot; In other words, as Adler said: &quot;Life is a series of moments. The most important thing is this very moment.&quot;&lt;/p&gt;
&lt;p&gt;Second, &quot;grounding&quot; is a method used in psychotherapy — a collective term for techniques that bring the mind back to &quot;now.&quot; A person&apos;s real existence lies in experiencing &quot;this moment,&quot; not in being mired in the past or anxious about the future. A person can only truly live in the present: in fact, it is impossible to live longer than the present — the present is always with you. Even in the moment of reviewing one&apos;s past life, even in the final moment of life, a person is still experiencing, still living. The permanent tense is the present, not the future. Living in the shadow of the past or in anxiety about the future often causes us to miss the real experience of the present moment and the meaning of existence. This perspective helps us reduce unnecessary suffering, avoid having the wound struck by a &quot;second arrow,&quot; and allows the self to &quot;land&quot; and find inner peace.&lt;/p&gt;
&lt;p&gt;This is also the core philosophy of Acceptance and Commitment Therapy (ACT): emphasizing acceptance of reality and commitment to action — helping individuals accept what cannot be changed, focus on the present moment, and take action aligned with personal values, thereby achieving psychological flexibility.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Write Yourself Healed&lt;/em&gt; says: &quot;Healing means we see our wounds, understand where they come from, and transform the emotions around those traumas — so that in our daily lives we no longer react as intensely to specific events as we once did, and can think and act more objectively and rationally. Healing means opening the eyes of the heart to see the needs hidden beneath our wounds, needs that are difficult to express, so that we stop driving ourselves from within, thereby reducing or even eliminating inner conflict and facing life with greater ease and freedom.&quot;&lt;/p&gt;
&lt;p&gt;But we must acknowledge that not all writing leads to healing — as when Iron Plum in the film &lt;em&gt;A Good Day to Be Bad&lt;/em&gt; writes about her experiences as a single mother and gets cyberbullied. There are many uncertainties and pains in life that are unavoidable, but we can choose how to respond to these challenges. Accepting reality does not mean giving up — it means finding inner peace through acceptance, and building on that foundation to take positive action.&lt;/p&gt;
&lt;p&gt;This is an inward journey: focus on this moment; when the self is immersed in recording the feelings of the present, allow emotions to occur, let emotions flow freely. Allow yourself to experience these emotions — after going through the whole process, you will receive life&apos;s gift: &quot;When lost, the heart is surrounded by scenery. After awakening, scenery is surrounded by the heart.&quot;&lt;/p&gt;
&lt;h2&gt;Exploration: MoFlow&apos;s Mental Healing Scenarios&lt;/h2&gt;
&lt;p&gt;The above is MoFlow&apos;s design philosophy. Around this theoretical framework, we have explored and designed a series of product features.&lt;/p&gt;
&lt;h3&gt;Mood Tracking&lt;/h3&gt;
&lt;p&gt;MoFlow offers basic mood tracking — allowing you to record your current emotional state with a simple mood check-in, without needing to write anything. MoFlow encourages you to turn your gaze inward and set aside time each day to listen to your heart: Am I happy right now? Do I feel content? What am I really seeking? What am I afraid of? What am I avoiding? What changes should I make? How can I live as my true self? Only when you&apos;re willing to spend time in stillness and listening can you hear your most authentic inner voice.&lt;/p&gt;
&lt;p&gt;In the Insight module, MoFlow displays your emotional calendar and the connections between mood and activities — helping you visualize mood changes and revealing potential links between emotions and daily activities, providing support for deeper self-awareness.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E6%83%85%E7%BB%AA%E8%BF%BD%E8%B8%AA.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Writing Assistant&lt;/h3&gt;
&lt;p&gt;MoFlow&apos;s writing assistant is seamlessly integrated into the writing experience. When you hit a mental block during free writing, you can summon the writing assistant for help expanding your thinking. Through this guidance, you can write more and dig deeper into your core emotions. This process both promotes self-expression and supports more in-depth emotional exploration.&lt;/p&gt;
&lt;p&gt;On the thinking level, if you&apos;re curious during writing about &quot;why you feel this way,&quot; you can use a method of questioning yourself — also called Socratic questioning. In counseling and psychotherapy, questioning is the fundamental tool of talk therapy and reflects the depth of a therapist&apos;s skill. MoFlow provides a questioning tool you can use to ask yourself questions while writing. More features will be added to the writing assistant in the future to better support free writing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E4%B9%A6%E5%86%99%E5%8A%A9%E6%89%8B.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Writing Reports&lt;/h3&gt;
&lt;p&gt;After writing is complete, MoFlow uses a fine-tuned model to conduct personalized analysis of your writing and generate a structured writing report. For different core emotions, the model provides corresponding coping strategies. This analysis not only helps you better understand your emotions but also provides concrete guidance for emotional management. Through MoFlow&apos;s analysis, we continually wipe the fogged mirror of the mind — clearing the blur between the false self and the true self, allowing ourselves to become more real. This is also the process of stretching our psychological elasticity and expanding our psychological boundaries.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E4%B9%A6%E5%86%99%E6%8A%A5%E5%91%8A.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Thought Distillation&lt;/h3&gt;
&lt;p&gt;During writing, thoughts gradually crystallize. All psychotherapy is based on a fact: under certain controlled conditions, neurons in the brain will move and connect with each other in predictable ways, forming new connections. Without the restructuring of brain cells, learning cannot occur.&lt;/p&gt;
&lt;p&gt;In certain writing content, MoFlow triggers Cognitive Behavioral Therapy (CBT) analysis, attempting to uncover the core beliefs underlying your thoughts. By relying on a thought classification model, MoFlow can handle the dependency relationships between thoughts. This process not only deepens understanding of your own thinking but also provides you with a more systematic means of organizing thoughts and analyzing emotions.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E6%83%B3%E6%B3%95%E6%8F%90%E7%82%BC.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Action Suggestions&lt;/h3&gt;
&lt;p&gt;In certain writing content, MoFlow combines Dialectical Behavior Therapy (DBT) to provide targeted action suggestions. MoFlow hopes to regulate emotions, improve interpersonal skills, and strengthen the sense of control over life through skill training. MoFlow emphasizes the relationship between inner peace and outward action. In pursuing life at its best, we need to not only focus on inner acceptance and understanding but also take active steps to realize our values and goals. As Suzuki Yuki may explore in his work, life at its best is perhaps not perfection but a dynamic process of continuously pursuing personal value and meaning while accepting reality.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E8%A1%8C%E5%8A%A8%E5%BB%BA%E8%AE%AE.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Energy Cards&lt;/h3&gt;
&lt;p&gt;MoFlow&apos;s Energy module provides mindfulness cards and reflection cards based on specific events. Through mindfulness practice and self-reflection, we can not only better understand and manage emotions but also transform them into sources of creativity and action. This process of energy transformation aligns with what the law of attraction in manifestation theory emphasizes — when we maintain a positive mindset and clear intention, we more easily attract corresponding energy and opportunities. Additionally, this module helps cultivate curiosity: staying curious about the surrounding world, trying new things, exploring the unknown — all of these are important components of manifesting an ideal life.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E8%83%BD%E9%87%8F%E5%8D%A1%E7%89%87.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Resonance Moments&lt;/h3&gt;
&lt;p&gt;In certain writing content, MoFlow shows you historical events, famous quotes, and books/films/music related to your current emotions and events. This is intended to better achieve self-separation — drawing inspiration from external reference points to gain new perspectives and understanding, thereby deepening insight into your own emotions and experiences.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E5%85%B1%E9%B8%A3%E6%97%B6%E5%88%BB.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Regular Reflection&lt;/h3&gt;
&lt;p&gt;MoFlow offers a feature akin to a psychology counseling follow-up — an emotional weekly digest. Through this feature, you can reflect on your emotions and behavior and identify areas where you might better balance self-awareness with spontaneity. Additionally, for certain extreme emotions, it may not be possible to perform rational emotional analysis in the moment — so regular reviews will provide you with deeper insights and suggestions.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E5%AE%9A%E6%9C%9F%E5%8F%8D%E6%80%9D.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Privacy &amp;amp; Security&lt;/h3&gt;
&lt;p&gt;MoFlow places great importance on user privacy and provides end-to-end encrypted communication and data storage. At registration, a unique key is generated for you, and all data is encrypted through this key — ensuring that no unauthorized third party can access it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E5%AE%89%E5%85%A8%E9%9A%90%E7%A7%81.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Companionship in Healing&lt;/h3&gt;
&lt;p&gt;MoFlow encourages you to enjoy each small step of progress and each unexpected discovery, and to enjoy the whole process of using MoFlow. We hope you can feel the flow of emotions rather than only focusing on the healing report results. To that end, MoFlow plans to launch a series of emotional support and companionship features in the future — stay tuned.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/moflow/%E9%99%AA%E4%BC%B4%E7%96%97%E6%84%88.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The past is where our ties come from; the future is what drives us forward. Going forward, we plan to continuously improve and expand MoFlow&apos;s features. The version released today is only the tip of the iceberg of MoFlow&apos;s self-contained loop.&lt;/p&gt;
&lt;p&gt;We hope that MoFlow can give every person their own gift — inner peace and stillness.&lt;/p&gt;
&lt;p&gt;We hope that MoFlow can create a more understanding, inclusive, and compassionate social environment.&lt;/p&gt;
&lt;p&gt;&quot;Let emotions flow freely; write your healing power.&quot; — MoFlow.&lt;/p&gt;
&lt;p&gt;MoFlow is now available for pre-order on the App Store for iOS. Search &quot;MoFlow&quot; to pre-order.&lt;/p&gt;
&lt;p&gt;More product details:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MoFlow website: &lt;a href=&quot;https://moflowapp.com&quot;&gt;https://moflowapp.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;App Store: &lt;a href=&quot;https://apps.apple.com/cn/app/id6737146258&quot;&gt;https://apps.apple.com/cn/app/id6737146258&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;This post is by &lt;a href=&quot;https://ursb.me&quot;&gt;Airing&lt;/a&gt;, MoFlow Founder. Blog at &lt;a href=&quot;https://ursb.me&quot;&gt;ursb.me&lt;/a&gt;.
Illustrations by &lt;a href=&quot;https://www.xiaohongshu.com/user/profile/65cc47e7000000000401c841&quot;&gt;LZH&lt;/a&gt;, MoFlow designer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=moflow&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Mac Niche App Recommendations and Workflow Sharing (2024)</title><link>https://ursb.me/en/posts/mac-app-share-2024/</link><guid isPermaLink="true">https://ursb.me/en/posts/mac-app-share-2024/</guid><description>Shares niche Mac apps and workflows built over years of work, covering note-taking tools, task management, developer tools, and AI search and chat products.</description><pubDate>Mon, 04 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This post covers the best Mac apps I&apos;ve discovered over my years working in software — many of which I still use daily. They&apos;ve helped me enormously along the way, and some combinations have turned my work itself into something genuinely enjoyable. I hope sharing them is useful.&lt;/p&gt;
&lt;h2&gt;1. Notes&lt;/h2&gt;
&lt;h3&gt;1.1 Writing Apps&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Drafts&lt;/strong&gt; — Truly a gem. I use it as a scratchpad for quick thoughts: anything I want to capture instantly but don&apos;t know where to file goes straight into Drafts. It has excellent automation capabilities. My workflow: write first, organize later. Drafts is the entry point for everything.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bear&lt;/strong&gt; — My main long-form writing tool, beautiful and simple. The typography is lovely, and its nested tag system is flexible without being overwhelming.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Typora&lt;/strong&gt; — The cleanest Markdown editor I&apos;ve found. It renders inline as you type, keeping you in the flow of writing. I use it for technical documentation and longer posts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;iA Writer&lt;/strong&gt; — Another excellent distraction-free writing experience. iA Writer has a cult following for a reason: it strips away everything except the words.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apple Notes&lt;/strong&gt; — Underrated. With iOS 18&apos;s new features, it&apos;s become significantly more capable. It&apos;s fast, syncs everywhere, and handles images and PDFs well. For a lot of people, it&apos;s genuinely all they need.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Obsidian&lt;/strong&gt; — The king of local-first, Markdown-based knowledge management. Highly extensible via plugins. My main concern has always been that the default UI feels a bit rough, but it keeps improving.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NotePlan&lt;/strong&gt; — A beautiful fusion of calendar, tasks, and notes. The daily note feature is excellent, and it handles Markdown well. If you&apos;re looking for something that handles planning and writing in one place, this is worth a look.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agenda&lt;/strong&gt; — Date-focused notes. Agenda ties notes to calendar events and dates, making it ideal for meeting notes and project journals.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mem&lt;/strong&gt; — AI-native notes. It uses AI to surface connections between your notes automatically. Promising direction, though still maturing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Flomo&lt;/strong&gt; — A simple, WeChat-like note card tool. Low friction: just type and hit send. Great for capturing fleeting thoughts and reflections.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raycast Notes&lt;/strong&gt; — Built into Raycast, it&apos;s quick and convenient for temporary notes you want in your launcher.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lazy&lt;/strong&gt; — A surprisingly capable newer entrant for quick note-taking with a clean interface.&lt;/p&gt;
&lt;h3&gt;1.2 Bidirectional Linking / Knowledge Graphs&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Roam Research&lt;/strong&gt; — The original bidirectional linking tool. My knowledge management home for years. It&apos;s powerful but has a steep learning curve and requires a subscription plus VPN access in China.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Logseq&lt;/strong&gt; — Open-source, local-first, with a great graph view. A strong Roam alternative and increasingly my recommendation for people who want offline-first.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reflect&lt;/strong&gt; — A slick, polished app that nails the bidirectional linking concept without feeling overwhelming. Fast sync, good mobile app.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tana&lt;/strong&gt; — The most powerful and flexible structured notes tool I&apos;ve used. Its tag (supertag) and field system essentially turns your note-taking database. The learning curve is real, but the payoff is massive. Tana is where I now manage complex projects.&lt;/p&gt;
&lt;h3&gt;1.3 Database / All-in-One&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Notion&lt;/strong&gt; — The original all-in-one workspace. Extremely powerful for databases, project management, and structured content. Heavy for personal use but unbeatable for team wikis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anytype&lt;/strong&gt; — A local-first Notion alternative with a graph structure. Privacy-focused and open-source. Still growing, but a serious option.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Capacities&lt;/strong&gt; — A &quot;studio for your mind&quot; — objects-based notes. You create typed objects (books, people, projects) and they relate to each other naturally. Beautiful design.&lt;/p&gt;
&lt;h3&gt;1.4 Whiteboards&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Heptabase&lt;/strong&gt; — My current knowledge management setup centerpiece. Cards on infinite canvases, tied together with maps and PDFs. Excellent for research deep dives and building out complex topics visually.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AFFiNE&lt;/strong&gt; — Open-source Notion + whiteboard hybrid. Ambitious project combining structured databases with a canvas interface.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Excalidraw&lt;/strong&gt; — The best hand-drawn-style whiteboard tool. Lightweight, free, and open-source. I use it for quick diagrams and architecture sketches.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;2. Productivity&lt;/h2&gt;
&lt;h3&gt;2.1 Calendar&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Fantastical&lt;/strong&gt; — The best Mac/iOS calendar app, full stop. Natural language event creation, beautiful design, and smart integrations. The subscription is worth it.&lt;/p&gt;
&lt;h3&gt;2.2 Time Tracking&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Rize&lt;/strong&gt; — Automatic time tracking that runs silently in the background and categorizes your time. Great for understanding how you actually spend your day versus how you think you do.&lt;/p&gt;
&lt;h3&gt;2.3 Tasks&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Todoist&lt;/strong&gt; — Clean, cross-platform, and reliable. Natural language input, great integrations. My go-to for personal task management.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TickTick&lt;/strong&gt; — A strong Todoist competitor with a built-in Pomodoro timer and calendar view. Popular in China and globally.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linear&lt;/strong&gt; — The best project and issue tracker for engineering teams. Fast, keyboard-driven, opinionated in the best way. I use it for all software projects.&lt;/p&gt;
&lt;h3&gt;2.4 Development Tools&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Warp&lt;/strong&gt; — A modern terminal reimagined. It has AI assistance, block-based history, and collaborative features. Once you use it, going back to iTerm2 feels like a step backward.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; — An AI-native code editor built on VS Code. GitHub Copilot integration is built-in, but Cursor goes further with chat-driven editing, codebase-aware context, and more. My primary editor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apifox&lt;/strong&gt; — A comprehensive API development platform combining Postman-style request testing, API documentation, and mock server in one. Great for full-stack development.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;oh-my-zsh&lt;/strong&gt; — Still the best shell enhancement framework. Themes, plugins, and sensible defaults that make the terminal infinitely more enjoyable.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;3. AI&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Perplexity&lt;/strong&gt; — AI search done right. It cites sources, gives direct answers, and handles complex research queries well. It&apos;s replaced Google for a lot of my research queries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raycast AI&lt;/strong&gt; — AI directly in your launcher. Ask questions, summarize text, draft emails — all without switching apps. Deeply integrated into my daily flow.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dify&lt;/strong&gt; — An open-source LLM application development platform. Think of it as a low-code way to build custom AI workflows and agents. Powerful for developers.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;4. Workflow Automation&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;IFTTT&lt;/strong&gt; — The original &quot;if this then that&quot; automation. Simple, broad integrations, good for consumer-level automations.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zapier&lt;/strong&gt; — IFTTT for power users and teams. More complex workflows, better reliability, more integrations. Worth the cost for the right use cases.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;n8n&lt;/strong&gt; — Open-source, self-hostable workflow automation. The most flexible of the three, with a visual node-based editor. If you&apos;re technical and care about data privacy, n8n is the way to go.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;5. Reading&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Readwise Reader&lt;/strong&gt; — My primary reading inbox. It handles RSS feeds, newsletters, web highlights, PDFs, and Twitter threads in one place. The highlight sync to Readwise is excellent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inoreader&lt;/strong&gt; — A powerful RSS reader with robust filtering and search. Reliable and fast, with a good web and mobile experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WeRead (微信读书)&lt;/strong&gt; — The best e-book app for Chinese-language content. Huge library, excellent reading experience, good sync.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cubox&lt;/strong&gt; — A smart reading list and web clipper. Article summarization, tagging, and a clean reading view. Good for archiving and revisiting saved content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Instapaper&lt;/strong&gt; — The original read-later app. Clean, simple, and reliable. I still use it for articles I want to read carefully offline.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Follow&lt;/strong&gt; — A newer RSS/social feed aggregator with a beautiful design. Worth watching as it develops.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Reeder&lt;/strong&gt; — The best-designed RSS reader on Mac and iOS. Fast, clean, and a joy to use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Me.bot&lt;/strong&gt; — An interesting personal knowledge aggregation tool that connects your reading and highlights.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;6. System Tools&lt;/h2&gt;
&lt;h3&gt;Screenshots and Screen Capture&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;CleanShot X&lt;/strong&gt; — The best screenshot tool for Mac. Scrolling captures, annotations, cloud upload, video recording — it does everything and does it beautifully.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Snipaste&lt;/strong&gt; — A lighter alternative to CleanShot X. Free tier is generous, and the pin-to-screen feature for reference images is uniquely useful.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Shottr&lt;/strong&gt; — Fast, OCR-capable screenshot tool. The text extraction from images is excellent.&lt;/p&gt;
&lt;h3&gt;Translation&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Bob&lt;/strong&gt; — The best translation app for Mac. Supports multiple translation engines, has excellent OCR translation (screenshot to translate), and integrates seamlessly with the system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Immersive Translation&lt;/strong&gt; — A browser extension that provides bilingual parallel translation of web pages. Excellent for reading English content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Monica&lt;/strong&gt; — An AI assistant browser extension. Summarize pages, chat about content, translate — all from a sidebar.&lt;/p&gt;
&lt;h3&gt;Browser&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Arc&lt;/strong&gt; — My daily driver browser. Spaces, vertical tabs, and built-in tools make it feel like a genuine reinvention of the browser. Not for everyone, but once you&apos;re used to it, going back feels painful.&lt;/p&gt;
&lt;h3&gt;System Monitoring and Utilities&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Stats&lt;/strong&gt; — A beautiful, open-source system monitor for the menu bar. CPU, RAM, network, disk — all in customizable menu bar widgets.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bartender 5&lt;/strong&gt; — Manage your menu bar with precision. Hide, show, or rearrange any menu bar items.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RunCat&lt;/strong&gt; — A little animated cat in your menu bar that runs faster when your CPU is working harder. Delightfully useless and yet I&apos;ve kept it for years.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vimac&lt;/strong&gt; — Vim-style keyboard navigation for any Mac app. Mouse-optional workflow through the whole system.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NinjaMouse&lt;/strong&gt; — Enhances mouse behavior on Mac with additional pointer customization options.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input Source Pro&lt;/strong&gt; — Switch input methods automatically based on the app you&apos;re in. Eliminates the constant manual toggling between Chinese and English input.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AltTab&lt;/strong&gt; — Windows-style app switcher for Mac. Thumbnail previews of all windows, including minimized ones. A small thing that makes a big daily difference.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hookmark&lt;/strong&gt; — Deep linking between apps. Create bidirectional links between files, emails, notes, and tasks. Underused and underappreciated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AlDente&lt;/strong&gt; — Battery charge limiter for Mac. Cap your battery at 80% to extend long-term battery health. Essential for anyone who primarily uses their MacBook plugged in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tencent Lemon&lt;/strong&gt; — A Mac cleanup and monitoring tool. Handles duplicate files, large file discovery, and gives you a disk usage overview.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Paste&lt;/strong&gt; — A rich clipboard manager. Search, organize, and quickly access your clipboard history. One of those tools you don&apos;t know you needed until you have it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Raycast&lt;/strong&gt; — My single most-used utility. A Spotlight replacement that is infinitely extensible: launch apps, run scripts, manage clipboard, use AI, access integrations — all from a single keystroke. If you&apos;re not using Raycast, start today.&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=mac-app-share-2024&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Weekly #27: A New Way of Living</title><link>https://ursb.me/en/posts/weekly-27/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-27/</guid><description>Reflects on leaving Shenzhen for Dali to build the AI mental-wellness startup MoFlow with a six-person team, and on tools for remote collaboration.</description><pubDate>Wed, 30 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This issue is a record of and reflection on life from September to October 2024.&lt;/p&gt;
&lt;h2&gt;🌿 Slow Travel and Startup Life&lt;/h2&gt;
&lt;p&gt;On September 27th, after returning my company assets, I said goodbye to Shenzhen — and to Guangdong, where I&apos;d lived since I first came here as a student, all of ten years. A new chapter began.&lt;/p&gt;
&lt;p&gt;The night before I left, I had a long, warm conversation with Kami over drinks at a bar in Mixc. He was surprised, saying it was the first time in all the years he&apos;d known me that he&apos;d seen me so talkative. I probably gave off a quiet, introverted impression at the company — but only because I&apos;d chosen to put most of my energy into the work itself.&lt;/p&gt;
&lt;p&gt;In the week leading up to my departure I said individual goodbyes to teammates. What struck me was that without exception, everyone brought up the same memory: the days we built the Flutter hybrid framework from scratch. Those months of shared effort and mutual growth had left a mark that time hadn&apos;t dimmed. I&apos;m deeply grateful for that chapter.&lt;/p&gt;
&lt;p&gt;While saying goodbye to old friends, I also got to meet some new ones. A &lt;a href=&quot;https://blog.ursb.me/posts/2024-summer/&quot;&gt;post I wrote that went on to reach 100,000+ reads across platforms&lt;/a&gt; brought people to me in unexpected ways. Some paid to have a conversation. A few sent emails wanting to connect. Some turned out to be people I&apos;d worked alongside, who somehow only became real acquaintances now, at the moment of parting.&lt;/p&gt;
&lt;p&gt;There should be many different kinds of people in a life, and their stories are worth listening to. Our own lives may only happen once — but when our path touches someone else&apos;s and something sparks between them, that&apos;s an extraordinary stroke of luck.&lt;/p&gt;
&lt;p&gt;After leaving Shenzhen I drove myself to Dali. I rented a small courtyard and buried myself in development work every day. &quot;Slow travel&quot; is the label, but it felt more like simply moving somewhere quiet and cool to get things done. And by that point, it was no longer just my project.&lt;/p&gt;
&lt;p&gt;The idea had been mine for years. I did extensive market research, product research, and user research. A few months earlier my co-founder on the design side happened to be in a gap period, so we sat down and refined the concept together — eventually landing on an AI and mental wellness product.&lt;/p&gt;
&lt;p&gt;The team now has six people — four full-time and two part-time. Everyone is passionate about the project. We brainstorm together, discuss together, design and build together, and every day feels full and satisfying, much like those Flutter days I described.&lt;/p&gt;
&lt;p&gt;As for the product itself: things are progressing well. We&apos;re targeting an external test flight in late November. Based on the current design and internal experience, the team is eager to get it in front of users — everyone feels it could genuinely help them personally.&lt;/p&gt;
&lt;p&gt;We&apos;re staying clear-headed, though, constantly using and refining the product details. If we don&apos;t hit the Beta test target by late November, it just means we&apos;re not satisfied with the product yet. We want to put something complete and genuinely useful in front of people. Stay tuned.&lt;/p&gt;
&lt;h2&gt;🌺 Snippets from Life&lt;/h2&gt;
&lt;p&gt;A few moments from this period.&lt;/p&gt;
&lt;p&gt;🎁 &lt;strong&gt;Gifts&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A complete surprise from friends — gifts (and home-cooked food). Deeply appreciated.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/FotoJet.jpg&quot; alt=&quot;&quot; /&gt;Those farewell days were more joyful than sad, honestly. Grateful for all of it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/4571730261295_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;🚗 National Day Road Trip&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Didn&apos;t realize the little Mini could hold so much. We packed: two cats, two 24-inch monitors, a 20-inch suitcase stuffed with clothes, a down duvet, two pillows, two sets of bedsheets, and several backpacks.&lt;/p&gt;
&lt;p&gt;Loaded up the car and drove for three days, covering 1,800 kilometers, all the way to Dali.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/4641730261540_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;🏡 Slow Travel and the Courtyard&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In Dali we rented a small courtyard with a rooftop terrace, at the foot of Cangshan Mountain. Morning sunlight pours into the courtyard and makes everything glow. Afternoons: tea on the terrace while working, with a view that&apos;s genuinely hard to beat. What I love most is how quiet this area is — perfect for deep, uninterrupted work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🌊 Erhai Lake&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the month we&apos;ve been here, I&apos;ve worked twelve hours a day and only gone out one Sunday — to drive around Erhai Lake.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/WechatIMG467.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/WechatIMG465.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;💰 Insurance&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The rear window of the car shattered unexpectedly on the drive, so I filed my first-ever insurance claim. I assumed it would just be a window replacement — turns out there&apos;s no OEM part for the rear window, so the shop said the entire convertible top would need to go. I was a bit upset at first, consoling myself with &quot;broken things bring peace,&quot; but swapping the whole convertible top for what was going to be just a window replacement is actually not a bad outcome.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🐱 Puffin&apos;s Two Borrowed Lives&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Things haven&apos;t gone smoothly since arriving in Dali. One afternoon Puffin and Mittens escaped through a gap in the courtyard railing. I rushed out as soon as I realized — one indoor cat on the loose in an unfamiliar place could run into anything. I found Mittens almost immediately. Being hopelessly incapable, she&apos;d stepped outside and fallen straight into the gutter by the front gate, too short to jump out, just meowing helplessly (I really wish I&apos;d taken a photo for posterity). Puffin, however, was nowhere to be found. I eventually put up missing-cat notices and a neighbor sent her back — turns out Puffin had been sunbathing on his balcony all day, and he&apos;d assumed she was a stray.&lt;/p&gt;
&lt;p&gt;The day after Puffin came back she started drooling nonstop, then began convulsing on the floor — full rigid seizures at the worst moments. I was scared to touch her in case I made it worse. When she finally calmed down I rushed her to the vet. Initial diagnosis: poisoning. But five days of broad-spectrum antidotes and liver support made no difference; in fact things seemed to be getting worse, with more frequent seizures and increasingly low energy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/4591730261327_.pic.jpg&quot; alt=&quot;&quot; /&gt;We stopped the antidotes, and the vet suspected a neurological problem. We started anti-epileptic medication — immediate improvement, the drooling and convulsions stopped. But after a day, a new symptom emerged: weakness in all four limbs, leaving her unable to walk normally for two days. Back to the vet, and combined with the seizure history, a neurological cause seemed clear. The vet said it likely couldn&apos;t be cured and there were few places in the country equipped to diagnose it properly — long-term medication was the path. We started vitamins B1 and B12, and within two days she was completely fine. Running and jumping all over the place like nothing had happened. Same mischievous energy, same liveliness. If anything she&apos;s become more clingy, and seems to understand some of what we say — call her even when she&apos;s playing hard and she&apos;ll come trotting over.&lt;/p&gt;
&lt;p&gt;They say cats have nine lives. She may have used another one. The last time was four years ago: she chewed through the balcony screen on the 12th floor and walked along the edge, eventually falling down to the roof of a second-floor shop. We didn&apos;t find her until the next afternoon. The vet said the only damage was a bitten tongue and some shock — no fractures, no internal injuries. The vet called it a miracle.&lt;/p&gt;
&lt;p&gt;Hoping both cats stay healthy from here on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;📊 Final Tech Talk&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On my last day at the company I gave a technical session I&apos;d spent over two weeks preparing. Walking through an entire rendering pipeline — from loading to display on screen — is genuinely hard to make clear. I built a demo game and used runtime breakpoints and mathematical calculations to explain ten steps in the rendering process. Tracing through all of it was fascinating, and made me feel the real excitement of graphics engineering.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/202410301213062x.png&quot; alt=&quot;&quot; /&gt;Due to time constraints, I went through three versions of the outline before landing here (no point in blurring it — you can&apos;t read it at this size anyway). The original plan was even more comprehensive — over 200 slides.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/202410301218082x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;✨ Startup Notes&lt;/h2&gt;
&lt;h3&gt;Communication: Slack&lt;/h3&gt;
&lt;p&gt;We&apos;d been using Lark as an all-in-one workplace tool — more efficient than WeCom in many ways. We&apos;d also set up topic channels in Lark where team members would post news and articles to stay sharp on the industry. But after two months of use we found things that weren&apos;t working for us:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Read receipts create reading anxiety&lt;/strong&gt;: Lark shows when messages have been read, which subtly creates pressure — both to watch whether others have seen what you sent, and to read new messages quickly yourself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Documents feel heavy&lt;/strong&gt;: Lark Docs are powerful but the overall experience isn&apos;t smooth. Switching between and searching documents makes the knowledge base feel cumbersome. Tasks can be linked to Lark&apos;s task system, but Lark Tasks is honestly hard to use. And the free tier caps meetings at 60 minutes, which isn&apos;t enough for our weekly discussions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Limited native integrations&lt;/strong&gt;: Tools like GitHub and Linear need custom bot development to integrate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We chose between Slack and Discord and landed on Slack. A few reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Public channel design&lt;/strong&gt;: channels are open to everyone, not a closed group chat. Team members can join channels they&apos;re interested in. We&apos;ve also set up information channels for rolling updates — like our old Lark topic groups — to keep everyone&apos;s product instincts sharp.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Efficient communication&lt;/strong&gt;: Slack groups consecutive messages into a distinct style, nudging users to write the way they&apos;d write an email — one message, complete context. Good communication means gathering background, problem, reason, and proposed solution before sending, without worrying whether the person sees it immediately. It&apos;s fine as a note. No &quot;are you there?&quot; before slowly getting to the point.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/slack-message.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Do-not-disturb design&lt;/strong&gt;: Slack&apos;s notifications are quiet by default. Unless it&apos;s a DM or an @mention, you&apos;ll only see things in the activity or unread tabs. If you want to @channel, there&apos;s a confirmation prompt first — it&apos;s a disruptive action, and Slack knows it. Raycast has a plugin for setting your Slack status, and combined with scheduled messages and &quot;save for later,&quot; you can catch what matters without disturbing others.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/slack-notify.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lightweight voice huddles&lt;/strong&gt;: We love Slack&apos;s Huddle feature. Many tools in China call this a &quot;meeting&quot; — you schedule it, the notification sounds like a ringing phone, and it all feels very formal. A Huddle is different: when you need to talk or share a screen, you start one and others join when they&apos;re ready. It&apos;s more like jumping into a voice chat in a game — lightweight and casual, which makes each conversation feel less weighty.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rich integrations&lt;/strong&gt;: Slack&apos;s app ecosystem is well-known. We&apos;ve integrated GitHub, Notion, Linear, Loom, and Xcode Cloud — combined with automations, it&apos;s essentially another kind of all-in-one.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/slack-linear.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/slack-app.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Meetings: Loom &amp;amp; Slack Huddles&lt;/h3&gt;
&lt;p&gt;As mentioned, full-team meetings tend to run long, so we made some changes.&lt;/p&gt;
&lt;p&gt;Each week I record an async update in Loom first — summarizing what everyone accomplished last week, what&apos;s coming up, and a few key items for discussion. Team members watch it and read the supporting doc whenever they have time.&lt;/p&gt;
&lt;p&gt;When a proposal moves into the design or development phase, we start a Huddle in the relevant channel to discuss it.&lt;/p&gt;
&lt;p&gt;This eliminates the need to find a time that works for everyone — which in itself slows the project down.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/loom.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Task Management: Linear&lt;/h3&gt;
&lt;p&gt;We use Linear for task management. The Slack integration is excellent. Fill in estimates, and the Insights feature gives you an earliest and latest projected completion date for the entire project — great for keeping a handle on pace.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/linear-progress.png&quot; alt=&quot;&quot; /&gt;We organize work into two-week Cycles, each with one or two themes, which helps us stay focused on what&apos;s most important right now.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj27/linear-cycle.png&quot; alt=&quot;&quot; /&gt;The milestones, task dependencies, and other foundational features are also well-crafted.&lt;/p&gt;
&lt;h2&gt;🎬 Books, Films, and More&lt;/h2&gt;
&lt;p&gt;What I&apos;ve been reading, watching, and playing this period:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finished: Philosophy | &lt;em&gt;The Thorn of Postmodernism&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Fiction | &lt;em&gt;Seven Witnesses&lt;/em&gt; | ★☆☆☆☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Retribution&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Alien: Romulus&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Drishyam 2&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Silent River&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Played: Game | &lt;em&gt;Thronefall&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Currently playing: Game | &lt;em&gt;The Legend of Zelda: Echoes of Wisdom&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-27&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Farewell, Summer</title><link>https://ursb.me/en/posts/2024-summer/</link><guid isPermaLink="true">https://ursb.me/en/posts/2024-summer/</guid><description>The author reflects on quitting Tencent Music after five years, exploring the purpose of work, the trap of worldly success, and the search for meaning through the goose cage, happiness, and courage.</description><pubDate>Sat, 31 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Part One: Present, Past, and Future&lt;/h2&gt;
&lt;h3&gt;1.1 Present&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Like the morning dew. — &lt;em&gt;Short Song Ballad&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I handed in my resignation. My last day is set for National Day — a clean break, no next job lined up.&lt;/p&gt;
&lt;p&gt;When I told my manager I was leaving, he couldn&apos;t understand why. Good prospects, a stable high income, a pile of unvested stock, and a core project that could earn me a T12 — why would I walk away? Later the director and GM both sat down with me. I just said I wanted to experience more possibilities; I&apos;d been here too long. According to my original plan, I should have left a long time ago.&lt;/p&gt;
&lt;p&gt;Twenty-nine years old. Former elementary-school teacher. Philosophy master&apos;s degree. Four and a half years at Tencent, currently T11. Plenty of labels surround me — the occasional awards, strong projects, polished business skills — and gradually I slipped into a comfort zone. I&apos;m afraid of a future I can already see in its entirety. I want to break free from where I am now. This predetermined highway is not one I&apos;m willing to walk to the end.&lt;/p&gt;
&lt;p&gt;The summer my monthly digest went quiet, my father was diagnosed with a brain tumor. He was admitted to the hospital. After surgery, repeated lung infections set in, and his recovery was poor. Three hospital transfers. Four trips in and out of the ICU. Every time I visited, I was counting the visits I might have left. Looking at him in that hospital bed, I was stunned at how much he had aged. In my memory he was always a towering mountain, and past scenes flickered through my eyes like a reel. In an instant, twenty-nine years had passed — and I don&apos;t know how many years of my own life remain.&lt;/p&gt;
&lt;p&gt;Fortunately, my father has recovered and is now in rehabilitation. I also decided to resign — to shed every title and step into an unknown future.&lt;/p&gt;
&lt;h3&gt;1.2 Past&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Drifting like dust on the road. — &lt;em&gt;Miscellaneous Poems&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Looking back at my years at TME after graduation, I gained a great deal. Year 1: green-diamond membership campaigns on QQ Music. Year 2: Flutter framework for live streaming. Year 3: 3D metaverse. Year 4: game rendering engine on WeSing. The business changed every year, and every year I pushed myself as hard as I could to grow within it — T9 after 2 years, T10 after 2.5 years, T11 after 4.5 years. Honestly, by Year 3 I already wanted to leave when growth opportunities dried up. I did submit a resignation that time, but the director offered me a core rendering engine project to lead, and I grabbed the opportunity and made it to T11. But my joy lasted exactly one night — the night I got the promotion news. Then what? Keep growing? Set my sights on T12?&lt;/p&gt;
&lt;p&gt;I suddenly realized I had been treating everything I&apos;d been through as some kind of countdown death game, with 35 as the finish line. So every year before that, I needed to level up — grind, grow, get promoted as early as possible before the clock ran out. Up to this point I&apos;d played the game well. In every likely scenario for how it ends, I had a very high chance of &quot;winning.&quot;&lt;/p&gt;
&lt;p&gt;But I chose to quit partway through, because I realized what I&apos;d be doing next in this game held no real interest for me. What I would gain wasn&apos;t worth the life energy I&apos;d have to spend. Given that, continuing to play was only wasting time. I should actively seek change.&lt;/p&gt;
&lt;p&gt;A while ago a &lt;a href=&quot;https://tinystruggles.com/posts/google_postmortem/&quot;&gt;blog post&lt;/a&gt; was making the rounds — an outstanding Google SRE engineer who quit after nine years. She felt that although she&apos;d received fair compensation, she had regrets. She had recognized early on that the job wasn&apos;t quite right for her, but she waited passively for change instead of transitioning sooner to explore new possibilities.&lt;/p&gt;
&lt;p&gt;Losing possibility is one part of it, but more importantly you fall into a comfortable cycle. Most people grow accustomed to expanding within their comfort zone, but the comfort zone itself erodes individual agency and possibility.&lt;/p&gt;
&lt;p&gt;Beyond that — similar to how chasing dopamine continually reinforces the pleasure circuit — life must not fall into &quot;growth addiction.&quot; You can&apos;t pin all your achievements and happiness on a permanently ascending self. Desires that expand without limit will eventually consume you. The day your capabilities can no longer satisfy your desires, your sense of worth collapses instantly into endless emptiness and pain.&lt;/p&gt;
&lt;p&gt;Every year after writing my year-end reflection, I sketch a five-year plan — all the possible goals and life paths in the next five years. If you want a life that keeps moving, you have to push yourself into the next phase at regular intervals: finish one goal, then strive toward a new one. Now it&apos;s time to update the path. It came sooner than I expected — it arrived in this summer.&lt;/p&gt;
&lt;p&gt;To close this section, I&apos;ll do a postmortem on this chapter of my career, just as &lt;a href=&quot;https://tinystruggles.com/posts/google_postmortem/&quot;&gt;Postmortem of my 9 year journey at Google&lt;/a&gt; did:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The summer before my final year of grad school, at twenty-three, I joined Tencent Music during campus recruiting. TME was still part of Tencent&apos;s SNG at the time.&lt;/p&gt;
&lt;p&gt;I had already been an active independent developer on GitHub for over five years, but I had never worked on an enterprise-scale project. Through this internship I gained end-to-end project experience and developed a deep respect for production systems and the individual users behind the traffic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Expectations when I joined&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After the internship I was genuinely enthusiastic about Tencent. The team had a great vibe. I decided to stay without even looking at other options.&lt;/p&gt;
&lt;p&gt;I wanted to pick up as much technical skill and growth as possible, and to connect with as many of my colleagues — the &quot;geese&quot; — as I could. I wanted to feel the energy of a motivated team, and to collect a unique life experience. My career plan was simple then: reach T9 within three years, and I&apos;d be satisfied.&lt;/p&gt;
&lt;p&gt;I saved this lyric for myself at that time, and I&apos;m grateful to my younger self for it:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2018/IMG_0317.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Career experience&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The reality was much more turbulent. I joined the internet industry right as it was entering a volatile period — the pandemic hit almost immediately, followed by waves of layoffs. My business unit and team changed multiple times over five years, and I actively sought growth opportunities throughout.&lt;/p&gt;
&lt;p&gt;What I gained:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adequate compensation, and the satisfaction of being a Tencent employee&lt;/li&gt;
&lt;li&gt;Software engineering skills — today, when any requirement lands in front of me, I can instantly sketch out an implementation plan&lt;/li&gt;
&lt;li&gt;Problem-solving ability — a personal methodology for root-cause analysis that earned the recognition of colleagues&lt;/li&gt;
&lt;li&gt;Efficient, structured planning — I handled up to seven parallel tasks simultaneously without dropping anything&lt;/li&gt;
&lt;li&gt;A focused work ethic — the ability to bring 100% effort and accountability to whatever I&apos;m doing&lt;/li&gt;
&lt;li&gt;A spirit of deep exploration — broad, deep technical understanding across platforms, driven by genuine curiosity&lt;/li&gt;
&lt;li&gt;Communication and coordination skills — especially in the later years, including managing urgent, complex projects coordinating nearly 10 teams&lt;/li&gt;
&lt;li&gt;Data analysis intuition — I developed business sensitivity and the ability to intuitively attribute basic metrics, as well as deeper analytical skills&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What I was less satisfied with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Growing disillusionment with big tech&lt;/li&gt;
&lt;li&gt;Team-building trips disappeared (though I later heard they were restored this year)&lt;/li&gt;
&lt;li&gt;No real opportunities to build management experience; individual growth trajectory became unclear&lt;/li&gt;
&lt;li&gt;And some other things I won&apos;t get into&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Self-reflection&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What went well:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fast promotions — T10 in two years, T11 in four. My performance scores kept me on the green track almost continuously; all three promotion panels ranked me first, a 100% pass rate&lt;/li&gt;
&lt;li&gt;Ending at T11 exceeded my original expectations&lt;/li&gt;
&lt;li&gt;Accumulated a pile of awards that I&apos;m not sure what to do with now that I&apos;m out&lt;/li&gt;
&lt;li&gt;Led four core projects across four different technical domains&lt;/li&gt;
&lt;li&gt;Soft skills improved significantly — including communication, presenting upward, and technical talks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/img_trophy.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;What didn&apos;t go well:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Proactivity gradually weakened in the later period; passion eroded as people around me kept leaving&lt;/li&gt;
&lt;li&gt;Push was weak — I was too concerned with appearances. Though I later worked through that: if everyone is working toward the same goal, then keeping feedback focused on the issue rather than the person is the right approach.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Where I was lucky:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The inclusiveness and friendliness of the team in the early days&lt;/li&gt;
&lt;li&gt;Collaboration with designers; co-authored many patents&lt;/li&gt;
&lt;li&gt;Consistently decent performance scores&lt;/li&gt;
&lt;li&gt;Good managers throughout&lt;/li&gt;
&lt;li&gt;Exposure to many different types of business&lt;/li&gt;
&lt;li&gt;More than half my career was spent focused on technical work&lt;/li&gt;
&lt;li&gt;Opportunities to lead interesting technical projects, including cross-platform and rendering engine work; chances to work on iOS and C++ codebases, and to expand and pivot within the front-end domain&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What I would change if I could do it over:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;More technical output — my individual technical writing and sharing was too sparse&lt;/li&gt;
&lt;li&gt;Set aside a portion of energy for technical exploration outside of work&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now, a few words on what comes next.&lt;/p&gt;
&lt;h3&gt;1.3 Future&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;I urge you: don&apos;t force a foot onto the snake — one cup of fine wine is not to be passed up. — &lt;em&gt;On Feeling&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;About the road ahead, I have so many questions I want to explore: Can we ever truly understand another person&apos;s feelings? Are the memories in each person&apos;s heart real? Or do we only believe what we ourselves have seen? What is the structure of consciousness? How does perception grant things their essence? How does a subject construct meaning in the lived world? Why do we always end up confiding deeply in strangers? Can our lives really rise like the sun — warm and upward? Or is that just a beautiful wish we hold inside?&lt;/p&gt;
&lt;p&gt;There are countless more questions I want to ask. I want to spend my life submerged in exploring them — exploring the endless possibilities of what a life can be. For now, I&apos;ve decided to start by attempting to realize an idea I&apos;ve carried for years. I hope it will genuinely help people solve real problems.&lt;/p&gt;
&lt;p&gt;In last year&apos;s year-end reflection, &lt;a href=&quot;https://blog.ursb.me/posts/summary-2023/&quot;&gt;&lt;em&gt;2023: Escaping Confusion&lt;/em&gt;&lt;/a&gt;, I shared some examples of how my writing reached readers:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240113164230.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240113164313.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240113164354.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/IMG_1129.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I once heard: &quot;The happiest moment for a baby is when it discovers it can affect the world around it.&quot; In writing — in this creative act — perhaps I too am chasing a kind of &quot;sense of presence&quot;: a small way of influencing and changing the world. The product I want to build for my startup carries that same quality and value.&lt;/p&gt;
&lt;p&gt;When I told the people around me I was preparing to start a company, almost everyone was pessimistic. But I knew with absolute clarity that this was the path I had to take. Refusing to do something simply because it&apos;s hard or the immediate payoff is low — that&apos;s not how I operate. I&apos;ve always gravitated toward doing things that are difficult and right, even when others think I&apos;m wrong.&lt;/p&gt;
&lt;p&gt;In my 2018 year-end reflection, &lt;a href=&quot;https://blog.ursb.me/posts/summary-2018/&quot;&gt;&lt;em&gt;2018: Settling the Heart&lt;/em&gt;&lt;/a&gt;, I wrote about meeting two VCs. My decision then was not to start a company yet — to spend a few years honing myself in a big company first, leave around T9 after about three years. I had many ideas and things I desperately wanted to do, but I knew my abilities and experience at the time weren&apos;t sufficient to see them through. That was my original intention. The buried thread in that title has now been answered, many years later. The time is right. It&apos;s time to act. Whether I succeed or fail, I will have no regrets.&lt;/p&gt;
&lt;p&gt;Some say I&apos;m stubborn. Some say I&apos;m baffling, or that I don&apos;t fit in. On reflection, I think all of this comes from the greatest fortune of my life: experiencing an awareness of death at exactly the right moment. In &lt;a href=&quot;https://blog.ursb.me/posts/summary-2017/&quot;&gt;&lt;em&gt;Farewell, My College Years&lt;/em&gt;&lt;/a&gt; I wrote about two hospitalizations and one near-death experience. Since then, every day has felt like a gift of new life. I want to make the most of every day — to keep searching for the meaning of my existence.&lt;/p&gt;
&lt;p&gt;Three years ago I put some of these thoughts into a short essay, &lt;a href=&quot;https://sspai.com/post/83743&quot;&gt;&lt;em&gt;On the Value of Existence and the Experience of Life&lt;/em&gt;&lt;/a&gt;, published on Sspai. It found a large audience and many comments. In this post I want to revisit the theme of life&apos;s meaning from another angle — through the lens of work.&lt;/p&gt;
&lt;p&gt;Frankl identified three ways of discovering meaning in life: work, love, and courage. The rest of this piece is organized around those three pillars — and what I call the Goose Cage, Happiness, and Courage.&lt;/p&gt;
&lt;h2&gt;Part Two: The Goose Cage, Happiness, and Courage&lt;/h2&gt;
&lt;h3&gt;2.1 The Goose Cage&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/banner-goose.png&quot; alt=&quot;&quot; /&gt;&amp;gt; The cage is no wider; the scholar is no smaller — and yet he sits side by side with two geese, undisturbed. — &lt;em&gt;The Scholar of Yangxian&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&quot;Goose Cage&quot; is not a pejorative. It comes from an image in the Tang tale &lt;em&gt;The Scholar of Yangxian&lt;/em&gt;, and it symbolizes a kind of constraint and limitation. In the original story, the peddler carrying the goose cage reflects the various restraints and pressures of modern life. Director Hu Rui, who adapted it into the animated short &lt;em&gt;Goose Goose Goose&lt;/em&gt;, noted that the goose cage represents all the limitations life places on us — a hint that when we pursue freedom and ideals, we are often trapped by the constraints of reality. The cage is not just a physical container; it is a space where fantasy and reality interweave. &quot;The scholar produces beautiful food and beautiful women from inside the cage, displaying the desires and fantasies deep in the human heart. The realization of that fantasy and its collision with reality reflects the struggle and loss people experience in pursuit of the good life.&quot;&lt;/p&gt;
&lt;p&gt;The Goose Cage thus becomes a charged symbol — a representation of both our longing for an ideal life and our helplessness before reality. In this section I want to render the Goose Cage faithfully — to show the individual struggle and search.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The purpose of work&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Most middle-class workers in times of difficulty inevitably ask themselves: why am I working? The answers they arrive at generally fall into one of the following categories:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The first: working for money.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Several forces produce this outcome.&lt;/p&gt;
&lt;p&gt;First, social conditioning. In modern society we tend to derive social recognition from our jobs, and income level directly shapes how others perceive us. This cultural pattern causes us to link work with money, and even to treat income as a measure of success. When former classmates or relatives back home hear I work at a big tech company, most of them are envious — and only because of the salary.&lt;/p&gt;
&lt;p&gt;Second, income satisfies subjective material desire. In an era of rampant consumerism, the purpose of work becomes consumption, and the drive to work for money is a pursuit of endless material desire.&lt;/p&gt;
&lt;p&gt;So most people — even when they&apos;re being manipulated or constantly complaining that their job is bad, even when they&apos;re seriously overtaxing their own health — won&apos;t change jobs. When I hear such complaints I tell people to just leave. But usually they only talk the talk. When I push further and ask what company they&apos;d want to go to, the answer is invariably: one that pays more. The Goose Cage of working for money has them firmly locked in.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The second: working for the future.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As I mentioned earlier, the big tech environment is basically a countdown death game, and most employees have a single goal: earn as much as possible before the countdown ends to achieve financial freedom and early retirement. Over the past decade-plus in the internet industry, this path has proven very viable.&lt;/p&gt;
&lt;p&gt;On the surface this looks the same as the first type, but it represents a step forward in thinking — at least the person knows what they want. And to achieve that future, the individual keeps pushing themselves to get promoted and grow. During this period, no matter how much they suffer or endure — even if the work feels meaningless, even if they&apos;re just tightening bolts — there are few complaints, because everyone holds a beautiful vision in their hearts, knowing the pain is in service of future sweetness.&lt;/p&gt;
&lt;p&gt;Under this vicious cycle, the sole goal of work becomes not working.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The third: working in order not to work.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After passing through the earlier stages, labor has undergone alienation. Workers with this purpose view selling their labor and time as a price to pay for a happy life — not as happy living itself.&lt;/p&gt;
&lt;p&gt;What is alienation? Susan Sontag once wrote in &lt;em&gt;On Photography&lt;/em&gt;: &quot;People become compulsive photographers: making an experience into an image, a souvenir, is both a way of certifying the experience and of refusing it.&quot; As photography became widespread, people increasingly tend to experience and document life through taking photos. Photography becomes a compulsive behavior, as if an experience only becomes complete when captured in an image. People start to equate real life with the images in photos: traveling is no longer about immersing yourself in scenery and culture, but about taking photos and curating what you&apos;ll share. Photography distorts our understanding of reality, making perception shallow and experience illusory. That is alienation — the tool itself becomes the goal, estranging people from real living.&lt;/p&gt;
&lt;p&gt;Work in this scenario is similar. Making &quot;not working&quot; the purpose of work ignores whatever value and meaning the work itself might have.&lt;/p&gt;
&lt;p&gt;So what kind of work purpose is healthy and constructive?&lt;/p&gt;
&lt;p&gt;Frankl identified three ways of discovering meaning in life, the first of which is work: we find our self-worth by engaging in meaningful work. We must ask: in our individual creative output, what have we accomplished — what have we contributed to the world?&lt;/p&gt;
&lt;p&gt;The main reason I chose programming as a career is that the act of creating through code has brought me the most purely joyful feeling I know. However many years have passed, I can still remember those early days of fumbling with VB late into the night — and the moment the program was complete and I opened the interface for the first time, that welling-up of delight has never left me.&lt;/p&gt;
&lt;p&gt;In middle school politics class we actually learned that labor is about creating social value and realizing personal value — yet as adults we&apos;ve somehow come to treat that as a joke. This is not individual cognitive failure. It is the result of a distorted social conditioning.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Worldly success&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Worldly success has defined a template for our lives. &lt;em&gt;The Score of Happiness&lt;/em&gt; describes it vividly:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;For Chinese youth born in reform-era first- and second-tier cities, the typical template includes roughly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Studying hard through at least a bachelor&apos;s degree;&lt;/li&gt;
&lt;li&gt;Joining a high-growth sector like finance or tech;&lt;/li&gt;
&lt;li&gt;Purchasing an apartment in one of the top-ten GDP cities (Shanghai, Beijing, Shenzhen, Guangzhou, Chongqing, Suzhou, Chengdu, Hangzhou, Nanjing, or Wuhan);&lt;/li&gt;
&lt;li&gt;Marrying and having children between 30 and 35;&lt;/li&gt;
&lt;li&gt;One to two overseas trips per year, or an equivalent &quot;middle-class lifestyle&quot; in purchasing power.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;The vast majority of people around me follow this success template to construct their own happy life — and its end state can only be illusion.&lt;/p&gt;
&lt;p&gt;&quot;In the past, people like animals on a millstone chased the carrot in front of them — some would always get the carrot, but the point was to make everyone believe that walking in one direction would get them a carrot. The carrot is more like an ultimate fantasy. It doesn&apos;t matter who eats it; what matters is that as long as one carrot exists, countless people will chase it.&quot; (&lt;em&gt;The Score of Happiness&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;In &lt;em&gt;Discipline and Punish&lt;/em&gt;, Foucault points out that this disciplinary power is pervasive in society — he calls it micro-power. This disciplinary micro-power controls individual behavior through norms, turning society into a panopticon-like prison where individuals are forced to self-discipline and become conforming social members.&lt;/p&gt;
&lt;p&gt;This worldly success largely defines our modes of behavior. It tells us which behaviors are normal and which are not. This discipline not only determines our actions but also, to a large extent, shapes our value judgments of others — stamping certain behaviors with the label &quot;should.&quot; In a sense, social discipline is a form of deprivation of our freedom to choose. It defines what we &quot;should&quot; do while ignoring the other possibilities open to us.&lt;/p&gt;
&lt;p&gt;This is what Foucault called &quot;the death of man&quot; in &lt;em&gt;The Order of Things&lt;/em&gt; — the loss of human subjectivity. We have lost the freedom and infinite possibility that makes us human.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The disappearing subject&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The structure of modern society forces people to objectify themselves in order to gain social recognition and worldly success, producing a kind of false individuality performed under disciplinary constraint. Struggling under the logic of sameness further intensifies the erosion of individual subjectivity.&lt;/p&gt;
&lt;p&gt;The disappearance of subjectivity means losing the chance to know yourself. If a person has never truly made a decision for themselves, they will have little drive to look inward — and so lose the opportunity to understand their real self. This is the modern predicament: unable to listen to instinct and know what one must do; unable to follow tradition and know what one should do; and not knowing what one wants at all.&lt;/p&gt;
&lt;p&gt;A friend once confided in me that even though he knew his current job wasn&apos;t what he most wanted to do — full of complaints and pain — he wasn&apos;t ready to leave, because he didn&apos;t know what he would do if he did. In that situation many people choose to semi-coast at work, putting some energy into exploring a side project during their spare time, then waiting for the right moment to transition. That approach is a compromise — a resistance to micro-power, and an active inward exploration. But it&apos;s not for me, because I believe that whatever you do, you have to give it 100%. That&apos;s what it means to have truly lived.&lt;/p&gt;
&lt;p&gt;Beyond this kind of active inward seeking, Frankl identified the two most common behavioral responses to the value crisis of disappearing subjectivity: conformity (doing what everyone else does) and submitting to authority (doing what others want you to do).&lt;/p&gt;
&lt;p&gt;And even if you&apos;re lucky enough to know what you want, you may still find yourself unable to act on it for many reasons. Being yourself is hard. &quot;The world will do everything it can, day and night, to make you like everyone else. If you want to be yourself, it means fighting the hardest battle of your life.&quot; (E. E. Cummings)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/fish.jpg&quot; alt=&quot;&quot; /&gt;— &quot;But darling, isn&apos;t life so much more than that? We are here to feel the sunshine.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Work and life&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Siddhartha once reflected: &quot;Everything he had done was nothing but a game, this game that made him happy and sometimes had filled him with gladness. But true life streamed past him, untouched.&quot; If we treat the life template or the corporate ladder as a game, where does actual living fit?&lt;/p&gt;
&lt;p&gt;How to balance work and life has always been a thorny problem. My way through it is &quot;genuine experience.&quot; When working, bring 100% energy to the work. In the remaining time, truly live. The prerequisite for bringing 100% to work is that my purpose in working is growth — so that in the future I&apos;ll have the capacity to realize personal value.&lt;/p&gt;
&lt;p&gt;So &quot;work-life balance&quot; is a slippery formulation. Its hidden implication is that work and life sit at equal footing. But life is everything; work is only work — it is a means in service of the former. What&apos;s really needed is not &quot;balance&quot; so much as finding appropriate integration of the two. Meaning is already within life. Pursuing a happy life is every person&apos;s actual goal; a career is just a means of achieving it.&lt;/p&gt;
&lt;p&gt;Perhaps in the future, as &lt;em&gt;Work, Consumerism and the New Poor&lt;/em&gt; predicts, work will be imbued with aesthetic value — viewed as a form of personal experience and enjoyment, with the boundary between work and personal interest blurring; work itself becomes a source of pleasure and satisfaction rather than merely a livelihood. In that world, work is not only economic activity but a path to self-realization and personal expression. Those who manage to align their work with their personal interests will tend to be the biggest winners.&lt;/p&gt;
&lt;p&gt;How to break out of the Goose Cage — I place the answer in &quot;Happiness&quot; and &quot;Courage.&quot;&lt;/p&gt;
&lt;h3&gt;2.2 Happiness&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/banner-happiness.png&quot; alt=&quot;&quot; /&gt;&amp;gt; From love comes worry; from love comes fear. — &lt;em&gt;The Verse of King Miaose Seeking the Dharma&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Coping with the anxiety of loss&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Before we get to happiness, let&apos;s address a prior question: how do we cope with anxiety?&lt;/p&gt;
&lt;p&gt;First, we need to clarify what anxiety actually is. In a rapidly changing social environment, the uncertainty of the future is a major source of our anxiety. There&apos;s a saying: &quot;The opposite of anxiety is specificity.&quot; Specificity means making decisions — and the essence of a decision is not what you choose, but what you give up.&lt;/p&gt;
&lt;p&gt;So letting go always accompanies deciding. You must relinquish all other options, and usually once you let go, they don&apos;t come back. But deciding is painful, because it means constraining possibility — and the more constrained a person&apos;s possibilities are, the less free they are. The possibilities of a life collapse at the moment a decision is made.&lt;/p&gt;
&lt;p&gt;Imagine: if you take no step toward any life, you retain infinite possibility. Like the mother played by Michelle Yeoh in &lt;em&gt;Everything Everywhere All at Once&lt;/em&gt; — she is chosen to fight the BOSS precisely because she is the least capable version of herself in all parallel universes; and therefore she has the potential to become any better version of herself. Or as &lt;em&gt;Demian&lt;/em&gt; says: &quot;Each man had only one genuine vocation — to find the way to himself... but there was no virtue in it.&quot;&lt;/p&gt;
&lt;p&gt;But time keeps ticking. It pushes us toward one decision after another; we must choose, and choosing means giving up another possibility — which produces anxiety. Milan Kundera wrote in &lt;em&gt;The Unbearable Lightness of Being&lt;/em&gt;: &quot;Human time does not turn in a circle; it runs ahead in a straight line. That is why man cannot be happy: happiness is the longing for repetition.&quot;&lt;/p&gt;
&lt;p&gt;So how do we cope? The old monkey in &lt;em&gt;Black Myth: Wukong&lt;/em&gt; gives an answer near the end of the game:&lt;/p&gt;
&lt;p&gt;Old Monkey: Throughout history, gifted and extraordinary people have been countless — but those who achieved truly immortal deeds were very few. Do you know why?&lt;/p&gt;
&lt;p&gt;Zhu Bajie: The world is unfair?&lt;/p&gt;
&lt;p&gt;Old Monkey: The world has always been unfair.&lt;/p&gt;
&lt;p&gt;Zhu Bajie: Bad luck?&lt;/p&gt;
&lt;p&gt;Old Monkey: Luck is only what the strong call modesty.&lt;/p&gt;
&lt;p&gt;Zhu Bajie: Then it can only be... that they weren&apos;t as handsome as me.&lt;/p&gt;
&lt;p&gt;Old Monkey: Because they had talent but no ambition, were satisfied with small gains, and sank into pleasure. Wanting comfort yet wanting fame; wanting to roam free yet wanting to become a Buddha. Where is such a thing? Our bodies are full of troubles — how can we expect to get everything?&lt;/p&gt;
&lt;p&gt;Our bodies are full of troubles — how can we expect everything? Every day of our life is new; every second is new. But then again — if we spend this precious life cramming ourselves into the Goose Cage and worrying about our anxiety, is that truly worth it? What happens if we lose something? In my limited life experience, loss almost never turns out as catastrophic as we imagined. I am still me. Whether or not those external things are there, we must believe we are 100% precious. We permanently possess our own value — unconditionally.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1689677717149_0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;From love comes worry; from love comes fear. Every relationship and circumstance is impermanent, difficult to keep forever. Life in this world generates anxiety, and life is as brief as morning dew. The ancients described people as duckweed on a river — jostling shoulder to shoulder in the current, bumping into each other, all flowing into the sea together.&lt;/p&gt;
&lt;p&gt;Adrift like duckweed for one lifetime, I have a responsibility to live this one and only life well. Paulo Coelho, in his preface to &lt;em&gt;Siddhartha&lt;/em&gt;, wrote: &quot;Then I thought about Siddhartha, who was determined to plunge into the very reality of life to find his own path. That morning I took a deep breath, wanting to taste everything the world had to offer. I swore I would choose life.&quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1689658461558_0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Finding a stable inner core&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&quot;Your mind is the whole world — but where is the true self?&quot; Hesse&apos;s Siddhartha spent his entire life seeking the Atman within himself — a state he called the harmonious unity of soul or inner self. He said a person must find the inner source within themselves; throughout a lifetime one must possess it. The human mission is nothing other than returning to the self, finding one&apos;s path — anchored in a stable inner core, that peaceful and harmonious experience of life.&lt;/p&gt;
&lt;p&gt;In a late night before my undergraduate graduation, I wrote &lt;a href=&quot;https://blog.ursb.me/posts/summary-2017/&quot;&gt;&lt;em&gt;Farewell, My College Years&lt;/em&gt;&lt;/a&gt;, which touched on this inner core.&lt;/p&gt;
&lt;p&gt;That period was a low point. My body was also at its limit: I came down with a high fever the day after my graduate entrance exam and ended up lying in the hospital for a month. During that month, with nothing to do, I thought about many things. I was reading Feng Youlan&apos;s &lt;em&gt;New Treatise on the Nature of Man&lt;/em&gt;, where he divides human life into four realms. When discussing the &quot;natural realm,&quot; he notes that those who live in it tend to lack self-awareness — whether their life is long or short, they simply &quot;act from habit,&quot; as I mentioned earlier with conformity and submission to authority. They have no real understanding of their own life and actions. I kept asking myself: have I just been &quot;acting from habit&quot;? Do I have things I genuinely love? If I do, can I pursue them single-mindedly? In what relationship do all the things I&apos;ve lost and gained stand to each other?&lt;/p&gt;
&lt;p&gt;Then everything clarified — &quot;In truth, with an inner openness and a lucid awareness, going with the flow outwardly, not competing with the world — that is how we can live each present moment better, and walk through the whole of life with grace.&quot; &quot;Right now, in this moment, everything is at peace. All the honors I&apos;ve earned are nothing worth mentioning. All the failures I face are nothing to fear. What I have gained is also what I have given up.&quot;&lt;/p&gt;
&lt;p&gt;Plato wrote in &lt;em&gt;The Republic&lt;/em&gt;: &quot;What we are looking for is what we already have; we always look around but miss what we want — that is why we so rarely get what we wish for.&quot;&lt;/p&gt;
&lt;p&gt;But objectively, there are many things in the world that we cannot change and lack the courage to change. Then we must accept them calmly and find inner peace within them. As &lt;em&gt;Zhuangzi: Human World&lt;/em&gt; says: &quot;To understand what cannot be changed and to rest in it as one&apos;s lot — that is the height of virtue.&quot; Man is a thinking reed — Pascal used the reed to show that humans are fragile, easily broken, but our thinking can encompass the universe, making us both small and great. No matter how miserable, we must search for a stable inner core.&lt;/p&gt;
&lt;p&gt;&quot;Eyes full of starlight, heart holding the cosmos&quot; — this is like what Siddhartha experienced at his enlightenment: &quot;All of this, yes all of this, had always been and he had never seen it; he was never present. Now he was present and belonged to it.&quot; The stable inner core begins with harmony. In every instant of life, thinking in a harmonious and integrated way is the path to a stable inner spirit.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1689658437726_0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A thin stream flows without ceasing; each drop of water is different. Bubbles float on the murky surface — they form and dissolve. Nothing persists for long. The people, creatures, and resting places of this world — none are exempt.&lt;/p&gt;
&lt;h3&gt;2.3 Courage&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/banner-brave.png&quot; alt=&quot;&quot; /&gt;&amp;gt; The bird fights its way out of the egg. The egg is the world. Whoever wants to be born must destroy a world. — &lt;em&gt;Demian&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The courage to face uncertainty&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On the road to seeking happiness, may you have the courage to face uncertainty.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In a very unstable world, stand firm and bravely build your immediate surroundings — don&apos;t sacrifice the everyday. If we place too much emphasis on the uncertainty of our environment, it is equivalent to surrendering our agency and submitting without resistance to environmental determinism: the macro environment is bad, the economic situation is rough, so I don&apos;t know what to do.&lt;/p&gt;
&lt;p&gt;The truth is that our environment is often shaped by the very individuals who inhabit it — especially by ourselves.&lt;/p&gt;
&lt;p&gt;We can be certain: achievement is not defined externally. It all depends on whether you are living according to your own will.&lt;/p&gt;
&lt;p&gt;We can be certain: real, small-scale social interaction is within reach. The emotional support of people around us can rescue us from bewilderment about the world. Being a good person, doing things that are meaningful to yourself, to others, and to the world — building connections with yourself, with others, and with the world in that process, so as to feel happiness, satisfaction, and joy — this is always a reliable strategy.&lt;/p&gt;
&lt;p&gt;We can be certain: if the macro environment cannot be changed, if fate cannot be fought, then the last freedom humans have is the attitude they choose toward their own life. Everything can be taken away except one thing — man&apos;s last freedom: to choose one&apos;s own attitude in any given circumstance, to choose one&apos;s own way.&lt;/p&gt;
&lt;p&gt;Today, everything solid seems to dissolve into air eventually. Yet it is precisely in this era — when values have no anchor, when there is no identity to constrain us — that we are given the freedom to choose and to act. You are not your past. You are not your present. You will always have the capacity to plan and change your circumstances, and to look forward. In an age when everything is changing rapidly, in an age when there is no choice but freedom, we need to be brave.&lt;/p&gt;
&lt;p&gt;Just before graduation I won a WWDC Scholarship and attended the WWDC of my dreams. On the way home, I wrote &lt;a href=&quot;https://blog.ursb.me/posts/wwdc-19/&quot;&gt;&lt;em&gt;WWDC19 Travel Journal&lt;/em&gt;&lt;/a&gt;, ending with this:&lt;/p&gt;
&lt;p&gt;&quot;There was a time I had such moments — believing without reason that my future was full of possibility, convinced that a rose-colored future lay ahead.&lt;/p&gt;
&lt;p&gt;But more often, faced with the unfamiliar, feeling admiration and envy, I would be lost, at a loss for what to do.&lt;/p&gt;
&lt;p&gt;No matter which step of the staircase you reach, there are people looking up from below and people looking down from above. The one who looks up feels small; the one who looks down feels pleased — only by looking inward can you see your true self.&lt;/p&gt;
&lt;p&gt;Every person needs to know what they want, know what is irreversible, know how to realize their dream, know how to face suffering with the right spirit — and then the answers to advancing and retreating, gaining and losing will all come.&lt;/p&gt;
&lt;p&gt;Yet all of this is very, very hard. I don&apos;t know how to face suffering when it comes; I don&apos;t know how to realize my dream; I don&apos;t know what I will miss, what regrets I will carry. I don&apos;t know where fate will take me — but I believe: as long as you run toward the light, you leave the shadow behind.&lt;/p&gt;
&lt;p&gt;When IT Home interviewed me and asked for a parting thought, I said: &apos;Learn meaningful knowledge, do what you love, build products that contribute to society.&apos;&lt;/p&gt;
&lt;p&gt;That was also what I once wrote to my advisor in a letter — the letter in which I decided not to continue toward a PhD, choosing instead to explore more of what the world has to offer. But today I suddenly feel: perhaps the greatest meaning of a life is to spend the rest of it finding those things you love most.&lt;/p&gt;
&lt;p&gt;I think this world is unimaginably beautiful — trees bursting into bloom, willows swaying. Sunshine sweeps through the city; a breeze passes between your fingers. This world is beautiful. It is worth fighting for. It is worth fighting for the things you love.&quot;&lt;/p&gt;
&lt;p&gt;In an uncertain world, hold steady to the certain self. May your journey be long, and full of wonder.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The courage to embrace ordinariness&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In an uncertain world, may you have the courage to embrace being ordinary.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Many people are constantly criticized for being &quot;unfocused&quot; — as if the skills you&apos;ve developed and the hobbies you love only have value when monetized. But life shouldn&apos;t be like that. &quot;If your nature is a bat, you certainly can&apos;t become an ostrich.&quot; (&lt;em&gt;Demian&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;Our life is our own. Every minute, every second we live is real, lived experience. If we can&apos;t live in the way we love, what is the point? To have a hobby, to have something you want to do — however niche, however &quot;unfocused&quot; — that is the light of our life.&lt;/p&gt;
&lt;p&gt;&quot;The short sword has the ambition of a legendary blade; the firefly hopes to rival the light of the sun and moon.&quot; What we must do is extend those hobbies, develop them, and find in them a sense of meaning, purpose, achievement, and support.&lt;/p&gt;
&lt;p&gt;Concretely: whenever we&apos;re about to do something — regardless of its scale or its prestige in the social evaluation system — commit to it fully, investing your talent, attention, and time without calculating gain or loss. From the depths of your heart, a kind of joy and self-affirmation will arise. I believe this is happiness. The thing will often turn out quite well — but that is just a &quot;byproduct&quot; of happiness, not the target we keep our eyes on during the process. Frankl said that what people need is &quot;not a state of no tension, but something worth striving for.&quot; &quot;It is a feature of the human being to always be oriented toward something beyond itself.&quot;&lt;/p&gt;
&lt;p&gt;So what is real courage? It is a clear awareness of your own capability, grounded in a healthy, stable self-regard — and a willingness to do hard things, to do things you are good at, to do things only you can do — carrying a sense of mission about it, realizing your continuous growth. It is not fearlessness, but a willingness to believe: the future is good; I have value; everything will be alright. Courage is not the absence of fear of darkness — it is the willingness to move toward the dawn.&lt;/p&gt;
&lt;p&gt;&quot;The brave moment has rung our bell.&quot; May the journey be long — may you be sincere and brave, free and fulfilled.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The courage to say goodbye to summer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In the long journey, may you have the courage to say goodbye to summer.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Find yourself. Hold to yourself. Walk your own path forward, wherever it leads. When you feel afraid, remember what Naval Ravikant said: &quot;99% of efforts will ultimately come to nothing.&quot; Once you accept this reality — if you&apos;re afraid to fail, if you stay comfortable, if you do nothing and seek no change — you will never find that 1% of possibility.&lt;/p&gt;
&lt;p&gt;At the end of Bilibili&apos;s 2024 New Year&apos;s Eve concert, a toast was offered — the final glass raised to oneself:&lt;/p&gt;
&lt;p&gt;I want to clink glasses with myself, and also with each of you who love yourselves.&lt;/p&gt;
&lt;p&gt;I hope that in the future, whatever happens, in the new year, we will all quietly say to ourselves:&lt;/p&gt;
&lt;p&gt;I will certainly follow my heart.&lt;/p&gt;
&lt;p&gt;I will certainly love all things.&lt;/p&gt;
&lt;p&gt;I will certainly pursue my dreams.&lt;/p&gt;
&lt;p&gt;I will certainly become the person I want to be.&lt;/p&gt;
&lt;p&gt;Here&apos;s to myself!&lt;/p&gt;
&lt;p&gt;Here&apos;s to myself — and I hope that after we say goodbye to this summer, we will still have an infinite spring ahead.&lt;/p&gt;
&lt;p&gt;— &quot;You fly away with pride; the summer where I rest.&quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2024/rainbow.jpg&quot; alt=&quot;&quot; /&gt;Written on the night of August 31, 2024.&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=2024-summer&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>Airing&apos;s Consultation Service</title><link>https://ursb.me/en/posts/service/</link><guid isPermaLink="true">https://ursb.me/en/posts/service/</guid><description>Airing launches two consultation options: free letters for listening and advice, plus a paid 50-minute call covering career, tech, and writing questions.</description><pubDate>Mon, 13 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;m offering two forms of consultation. If you&apos;d like to get in touch, pick whichever works best for you.&lt;/p&gt;
&lt;h2&gt;Option 1: Letter Consultation&lt;/h2&gt;
&lt;p&gt;You are very welcome to reach out this way. I look forward to building genuine connections with readers and am very willing to listen to people&apos;s inner worlds and independent thoughts. If you&apos;re facing any difficulty, feel free to email me directly. I&apos;ll share my own thinking in hopes of offering some inspiration or help. Of course, letters that are simply looking to make a friend are equally welcome~&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fee: None.&lt;/strong&gt; However, with full protection of the writer&apos;s privacy, letter content may be shared as an anonymized case study on my blog.&lt;/p&gt;
&lt;p&gt;Response time: Please refer to the auto-reply you&apos;ll receive after sending. Currently I receive about 2–4 consultation letters per month, and my typical turnaround is around 14 days. If volume increases, I may extend the response window — the auto-reply will always reflect the current estimate.&lt;/p&gt;
&lt;p&gt;How to reach me: Email airing@ursb.me.&lt;/p&gt;
&lt;h2&gt;Option 2: Paid Consultation&lt;/h2&gt;
&lt;p&gt;I offer one-on-one 50-minute sessions (Chinese only).&lt;/p&gt;
&lt;p&gt;Based on my current areas of knowledge, I can offer guidance on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Career development planning and advice&lt;/li&gt;
&lt;li&gt;Software and technology questions&lt;/li&gt;
&lt;li&gt;Any difficulties encountered during job or graduate school applications&lt;/li&gt;
&lt;li&gt;Writing tips, reflections, and encouragement&lt;/li&gt;
&lt;li&gt;Productivity tool recommendations and guidance&lt;/li&gt;
&lt;li&gt;Any other conversation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: This service does not cover commercial consulting or data consulting, and sessions will be fully recorded (audio and video).&lt;/p&gt;
&lt;p&gt;You can book and pay directly at &lt;a href=&quot;https://cal.com/airing/50-min-meeting-paid&quot;&gt;https://cal.com/airing/50-min-meeting-paid&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Price: $200 USD&lt;/strong&gt; (originally $600 USD — limited-time 70% off). Full refunds are available.&lt;/p&gt;
&lt;p&gt;For any questions, feel free to email airing@ursb.me at any time. Looking forward to connecting.&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=service&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Weekly #26: The Journey</title><link>https://ursb.me/en/posts/weekly-26/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-26/</guid><description>A travel diary of a nine-day New Zealand road trip in April 2024, from Christchurch to Wanaka and Queenstown, with alpaca farms, the Milky Way, and paragliding.</description><pubDate>Tue, 07 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This issue is a record of and reflection on life in April 2024.&lt;/p&gt;
&lt;p&gt;Thanks to relatively cheap flights, I&apos;d booked a trip to New Zealand for the May Day holiday back on New Year&apos;s Day. I had almost no experience with international travel, and I ended up putting together my itinerary on the plane from an offline map. I never expected the trip to turn out this rich.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/map.jpg&quot; alt=&quot;&quot; /&gt;It&apos;s the last night of the trip now, and I&apos;m sitting in the airport waiting for the flight home. With nothing else to do, I&apos;m writing down the whole journey from memory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 1: Flight – Christchurch – Chinese Restaurant&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ten hours by plane to Auckland. My spoken English being what it is, I&apos;d cleared check-in but still had no idea how to connect to my next flight. A staff member noticed and simply walked us to where we needed to go. Most of the airport&apos;s signs had Chinese on them too, and after that we didn&apos;t run into any more obstacles.&lt;/p&gt;
&lt;p&gt;While waiting at the gate I noticed two small birds pecking around at my feet, and then spotted a bird flying freely inside the terminal. I suddenly understood what the inflight customs video had meant by &quot;this fragile land is our most precious treasure.&quot;&lt;/p&gt;
&lt;p&gt;After arriving in Christchurch that evening we picked up a rental car. The lanes are reversed compared to China, but driving turned out to be surprisingly easy. Partly because the roads have fewer lanes and almost no need to change them — but mostly because the other drivers are extraordinarily courteous. No one cut in, flashed their lights aggressively, or overtook dangerously. If anything, everyone seemed overly happy to give way: at roundabouts, drivers would rather wait an extra thirty seconds than merge while anyone else was close; on narrow roads, both cars often pulled to the side at the same time with neither wanting to go first (laughs). Oncoming drivers almost always gave a little wave, and one did a finger-gun at me that I found genuinely charming.&lt;/p&gt;
&lt;p&gt;Speaking of charming: I noticed little things in front of people&apos;s houses as we drove — a Peppa Pig stuffed toy on a doorstep, a candy box next to a mailbox, some stickers on the back of road signs.&lt;/p&gt;
&lt;p&gt;Cute and kind — that was my first impression of this place.&lt;/p&gt;
&lt;p&gt;After checking into the motel that evening we walked around the area. It was barely past six, but dark had already fallen. No one on the streets, almost all the shops shut. Only a Chinese home-cooking restaurant nearby was still open, and it was empty.&lt;/p&gt;
&lt;p&gt;After dinner the owners chatted with us — a couple who&apos;d moved here from Shenzhen. They talked about housing prices, education, work, income, the local pace of life, and what to watch out for on the road. I came away knowing a lot more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 2: Alpacas – Coastal Town&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Day two was around Christchurch. I&apos;d booked an alpaca farm visit the night before, and we drove out there through flat farmland, pastures, and mountain scenery heavy with autumn color. Cresting the last hill and seeing the bay below felt like discovering why this place is sometimes called &quot;the land the world forgot.&quot;&lt;/p&gt;
&lt;p&gt;The farm had a Chinese employee who introduced us to each animal and their very individual personalities — she clearly knew them all by heart. Looking back, the alpaca farm ranks in my top two highlights of the whole trip. Interacting with a whole hillside full of big alpacas and little ones, the valley filled with laughter.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/sheep.jpg&quot; alt=&quot;&quot; /&gt;The afternoon we spent drifting through the seaside village of Akaroa — a boat trip, lying on the beach staring at things, ice cream, a slow walk, until the sun went down. The village was quiet, the bay glassy and still, the pace unhurried. I love that feeling of settling into the present and letting time slip through your fingers.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/akarola.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;Day 3: West Coast – Fox Glacier Night Drive – Milky Way&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After returning the keys in the morning we drove to the West Coast. From town to open plain, then up into mountain roads, through river valleys, into gorges, over rolling hills — and then suddenly an endless black sea spread out before us. Overwhelming.&lt;/p&gt;
&lt;p&gt;Through the small town of Hokitika, the sky overcast, the sea dark. A little further on the sky opened up, the water turned blue, and the scale of it made me feel small.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/sea.jpg&quot; alt=&quot;&quot; /&gt;We had a flight lesson booked in Wanaka the next morning, so we needed to push further along the West Coast mountain roads that night. We took a wrong turn and ended up late, but the motel host had stayed up waiting for us to check in rather than going home. Getting there around nine o&apos;clock and finding a light still on for us felt like warmth and home.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/chat-2.jpg&quot; alt=&quot;&quot; /&gt;Back in signal range I also found a message from the previous night&apos;s host:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/chat-1.jpg&quot; alt=&quot;&quot; /&gt;The motel host told us the Milky Way was often visible here — I looked up, and there it was. We&apos;d been driving the whole time without ever looking at the sky.&lt;/p&gt;
&lt;p&gt;No tripod, so I just hand-held a shot with iPhone&apos;s night mode.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/star.jpg&quot; alt=&quot;&quot; /&gt;Staring at the universe stretched out above me, I suddenly felt how small I really am. Humans are made of the same stuff as stars, but we have consciousness. When we look up at the Milky Way, humanity becomes the universe&apos;s way of knowing itself — &quot;the landscape thinks itself in me, and I am its consciousness.&quot;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 4: Wanaka – Flying a Plane&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Morning light revealed that last night&apos;s surroundings had been otherworldly.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/fox.jpg&quot; alt=&quot;&quot; /&gt;We drove to Wanaka, whose lake views speak for themselves. The Airbnb host checked us in with incredible warmth and patience — even when our English stumbled, she kept saying &quot;don&apos;t worry&quot; and giving us encouraging looks, showing us around her big house like a friendly neighbor rather than a landlord. When we discovered we&apos;d lost our power adapter, we messaged through Booking.com and the host&apos;s husband showed up at the door cradling an armful of every adapter known to mankind. Genuinely adorable.&lt;/p&gt;
&lt;p&gt;That afternoon we got to fly a plane:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/aircraft.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;Days 5–6: Queenstown&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Breakfast at the lakeside in Wanaka, a walk to see the famous lone tree:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/wanaka-tree.jpg&quot; alt=&quot;&quot; /&gt;Ice cream cone in hand, wandering along the shore, a casual photo of the lake:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/wanaka.jpg&quot; alt=&quot;&quot; /&gt;We drove to Queenstown in the afternoon. Nothing else had been booked, so we had a free day — which we spent sitting by the lake watching people, watching ducks, simply existing.&lt;/p&gt;
&lt;p&gt;Such idleness. Such slowness. Watching scenery I&apos;d never seen before, a quiet curiosity gathering in me. I wanted to stay longer, to really know this place, to find something in it that was uniquely its own.&lt;/p&gt;
&lt;p&gt;Even though I&apos;d be leaving tomorrow, I barely felt like I was leaving at all. Time and space felt as though they belonged to us — not us to them.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/queenstown.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/town.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;Day 7: Deer Park – Luge – Paragliding&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Last full day in Queenstown. Morning at Deer Park — the animals were very cooperative and I got some great shots:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/deerpark.jpg&quot; alt=&quot;&quot; /&gt;Afternoon on the mountain for the luge — unexpectedly great fun. On the way up I met a Chinese guy who came bouncing over, ecstatic, telling me how good it was. He&apos;d done it a few years back and had been thinking about it ever since, so he flew all the way back just to do it again.&lt;/p&gt;
&lt;p&gt;Then we tried paragliding — running down the hilltop, jumping, taking off, and then that feeling of gliding free above everything. That was the number one highlight of the whole trip.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/sky.jpg&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;Day 8: Oamaru – Penguins – Backpackers Hostel&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Drove from Queenstown along the east coast to Oamaru, saw fur seals and little blue penguins. (No photos of the penguins — photography isn&apos;t allowed.)&lt;/p&gt;
&lt;p&gt;That night at a backpacker hostel with a warm, cozy feel. The kitchen wall was covered with notes from travelers who&apos;d passed through.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day 9: Homeward&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Back in Christchurch — where it all began. On the first night of this trip, eight days ago, I had felt profoundly alone in this city. Night had fallen, the streets were empty, shops were shut, the only signs of life a few faint streetlights. A foreign country, darkness, the unknown ahead, the familiar stripped away, an estrangement from this world — all of it made me lonely.&lt;/p&gt;
&lt;p&gt;But after eight days of traveling, tonight the darkness doesn&apos;t bring that loneliness. Because now I know the sun will rise again tomorrow and light up this land; because now I know that friendly, kind people live here, and that if something goes wrong, you don&apos;t face it alone.&lt;/p&gt;
&lt;p&gt;The fundamental mode of existence is relation, and the best relations are those in which individuals connect without needing anything from each other. We don&apos;t exist as isolated entities — we are beings of relationship — and the people here proved it, through their warmth and kindness.&lt;/p&gt;
&lt;p&gt;Can travel make our lives better? Can our lives, like the sunrise, move upward and stay warm? I can&apos;t say for certain. But I want to run toward that certainty.&lt;/p&gt;
&lt;p&gt;To close, here&apos;s a passage from Bilibili&apos;s New Year toast that I loved — it feels right as an ending for this trip journal:&lt;/p&gt;
&lt;p&gt;&quot;I want to raise a glass to persistence in ordinary moments, to failures worth being proud of, to everything that deserves respect. To existence.&quot;&lt;/p&gt;
&lt;p&gt;&quot;I want to raise a glass to the earth — to the mountains and seas I haven&apos;t yet seen, to the cultures that stir my heart, to this brilliant planet that billions of people have built with love. To the world.&quot;&lt;/p&gt;
&lt;p&gt;&quot;I want to raise a glass to tomorrow. I won&apos;t ask whether you&apos;ll bring joy or sorrow, or what you&apos;ve come to do. I&apos;ll simply take whatever gift you hold out with no fear, and treasure every experience. Without asking about partings, without asking about endings. To tomorrow.&quot;&lt;/p&gt;
&lt;p&gt;&quot;I want to raise a glass to myself, and to each of you who loves yourself. I hope that whatever comes our way in the new year, we each quietly tell ourselves: I will follow my heart, I will love all things, I will chase my dreams, I will become who I want to be. To ourselves.&quot;&lt;/p&gt;
&lt;h2&gt;🌺 Snippets from Life&lt;/h2&gt;
&lt;p&gt;A few moments from this period.&lt;/p&gt;
&lt;p&gt;🚀 &lt;strong&gt;Work: Promoted to T11&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The March review went smoothly. I&apos;d been preparing materials through the holiday, and the project results over the past year or so were genuinely strong — even with a low promotion rate this cycle, I was fairly confident going in.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj26/t11.jpg&quot; alt=&quot;&quot; /&gt;I was stuck at T5 for a year after the campus hire, and T10 took two years because of a new policy. Aside from those, everything else moved through the fast track. So: two years post-graduation to T9, two and a half to T10, four and a half to T11 — comparatively fast, overall. The ceiling at TME frontend right now is one T12. Next small goal: T12 within three years.&lt;/p&gt;
&lt;p&gt;Onward. Keep going.&lt;/p&gt;
&lt;h2&gt;🎬 Books, Films, and More&lt;/h2&gt;
&lt;p&gt;What I&apos;ve been reading, watching, and playing this period:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finished: Drama | &lt;em&gt;The Ferryman: Legends of Nanyang&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Anime | &lt;em&gt;Mashle: Magic and Muscles&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: Anime | &lt;em&gt;Mashle: Magic and Muscles&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Godzilla x Kong: The New Empire&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Aquaman and the Lost Kingdom&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Forever Love&lt;/em&gt; | ★★☆☆☆&lt;/li&gt;
&lt;li&gt;Rewatched: Drama | &lt;em&gt;Joy of Life&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-26&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Personal Toolkit and Gear Recommendations</title><link>https://ursb.me/en/posts/tools/</link><guid isPermaLink="true">https://ursb.me/en/posts/tools/</guid><description>A rundown of the author&apos;s personal tech stack, from MacBook, iPhone, and HHKB keyboard hardware picks to the Raycast, HeptaBase, Readwise, Todoist, and Fantastical software he actually relies on daily.</description><pubDate>Fri, 29 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&apos;ve wanted to write about this for a long time. I&apos;m an avid tech enthusiast and a committed tool obsessive — I&apos;ve tried a lot of products over the years, retired wave after wave of them, and what&apos;s settled out is a fairly stable toolkit that I&apos;m genuinely happy with.&lt;/p&gt;
&lt;p&gt;This is also a deeply personal topic. Everyone&apos;s perspective is shaped by their own experience and context, and what works brilliantly for me might not resonate with you at all. That said, I still want to share what I&apos;m currently using — in hopes that some of it sparks something useful for you.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Updated: 2024-03-29&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Hardware&lt;/h2&gt;
&lt;h3&gt;Computers and Accessories&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Apple MacBook Pro (2021, 16-inch, M1 Max, Space Gray, 32GB RAM, 1TB SSD)&lt;/strong&gt; — My main work machine. It&apos;s a 2021 model with not a massive amount of RAM, but the M-series chip manages memory so efficiently that swap usage is high and I&apos;ve had no real issues in practice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apple MacBook Air (2022, M2, Midnight, 24GB RAM, 1TB SSD)&lt;/strong&gt; — My portable machine. This is what I take out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apple iMac (2020, 27-inch Retina, Intel Core i7-10700K, 96GB RAM, 1TB SSD)&lt;/strong&gt; — Company-issued. I upgraded the RAM myself, but the CPU can&apos;t keep up with my current workload. It sits on my desk now connected via Luna Display as an external monitor, and I occasionally use it for long-running jobs.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Studio Display (Nano-texture glass)&lt;/strong&gt; — The monitor at home. I regret paying extra for nano-texture — it genuinely affects clarity, and the study has stable lighting where regular glass would have been perfectly fine.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LG UltraFine 4K Display&lt;/strong&gt; — Bought at a company discount in 2021. I liked it enough that I bought a second one a month later. Daisy-chaining support makes it convenient with the MBP.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HHKB Studio&lt;/strong&gt; — Mechanical HHKB. Very comfortable. Used at the office.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HHKB Professional HYBRID Type-S (White, with legends)&lt;/strong&gt; — Retired from the office by the HHKB Studio. Now in the study.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HHKB Professional HYBRID Type-S (White, blank keycaps)&lt;/strong&gt; — Bought alongside the above as a keycap collector&apos;s item. Same model, but the tactile feel is slightly softer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Magic Trackpad (Silver)&lt;/strong&gt; — Paired with the white keyboard setup. Study use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Magic Trackpad (Space Gray)&lt;/strong&gt; — Paired with the black HHKB. Office use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Magic Keyboard (Blue, Touch ID)&lt;/strong&gt; — Picked up secondhand as an iMac (M1) accessory. Didn&apos;t end up using it — still prefer the HHKB layout.&lt;/p&gt;
&lt;h3&gt;Mobile Devices&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;iPhone 15 Pro&lt;/strong&gt; — Primary phone.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;iPhone 6s&lt;/strong&gt; — Company test device. Low-end hardware for performance testing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Samsung Galaxy Z Flip4&lt;/strong&gt; — Personal Android device, for experiencing Android software and the more open ecosystem. Occasionally used as a reader.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Xiaomi Mi 9&lt;/strong&gt; — Company test device. Frequently used to run projects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apple Watch Ultra&lt;/strong&gt; — I personally prefer the stainless steel Series version aesthetically, but the Ultra&apos;s features won out.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;iPad Pro 12.9 (M1)&lt;/strong&gt; — &quot;Your next computer is still a computer.&quot; The filesystem, window management, and software ecosystem are all disappointing enough that it functions primarily as a Bilibili player.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;iPad Pro Magic Keyboard&lt;/strong&gt; — Used with the iPad Pro, but I don&apos;t enjoy the combo — it ends up heavier than the MacBook Air.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;iPad mini (6th generation)&lt;/strong&gt; — My most-used iPad. Reading e-books and gaming on the go. High daily use frequency.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BOOX Leaf 2&lt;/strong&gt; — Good open Android experience. The side page-turn buttons (same as KO3) are genuinely useful. Primarily for WeRead.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kindle Oasis 3&lt;/strong&gt; — Better display clarity than the Leaf 2, but Kindle&apos;s exit from the Chinese market hurt the experience, and it doesn&apos;t support WeRead — so I stopped using it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zendure 10000mAh Power Bank (Hiking Green)&lt;/strong&gt; — I&apos;ve tried many power banks. This one is affordable, compact, and looks great. My favorite.&lt;/p&gt;
&lt;h3&gt;Audio&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;AirPods Pro (2nd generation, USB-C)&lt;/strong&gt; — The original pair survived a two-hour washing machine cycle, but noise cancellation and transparency mode were wrecked. Time for a replacement.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AirPods Max&lt;/strong&gt; — Light use. Prolonged wear puts too much pressure on the ears.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HomePod (1st generation)&lt;/strong&gt; — HomeKit hub, and plays music regularly.&lt;/p&gt;
&lt;h3&gt;Camera and Video&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Fujifilm X100VI&lt;/strong&gt; — Excellent straight-out-of-camera results.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;907X &amp;amp; CFV 100C + XCD 4/28P&lt;/strong&gt; — The simplest path to the highest image quality.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Insta360 GO 3&lt;/strong&gt; — Average low-light performance, but incredibly small. Getting the shot matters more than getting the perfect shot.&lt;/p&gt;
&lt;h3&gt;Gaming&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Nintendo Switch (OLED Model)&lt;/strong&gt; — Zelda launcher.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nintendo Switch Lite&lt;/strong&gt; — Occasionally brought along for portable gaming on the go.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Steam Deck&lt;/strong&gt; — Light use. A few Steam games here and there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PlayStation 4 Pro&lt;/strong&gt; — Sitting in a corner collecting dust. Bought it for &lt;em&gt;God of War&lt;/em&gt; right after graduating.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Xbox Elite Wireless Controller&lt;/strong&gt; — Excellent build quality, rich accessories and software ecosystem. Compatible with iPad and Steam Deck.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nintendo Switch Pro Controller&lt;/strong&gt; — Rounds out the Switch experience properly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nuts N1S Pro 4K&lt;/strong&gt; — Three-primary-color laser projector with impressive specs on paper, but the software is poor and it went in for repairs within six months. In the bedroom.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;XGIMI H3S&lt;/strong&gt; — Redeemed with points from the company store. Three years in with no issues. In the living room.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Software and Services&lt;/h2&gt;
&lt;h3&gt;System&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Arc&lt;/strong&gt; — My browser. The design philosophy fits how I think about browsing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CleanShot X&lt;/strong&gt; — Screenshot and screen recording tool. The annotation shortcuts are excellent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bob&lt;/strong&gt; — Translation app with great shortcut support. I use it less often now — most translation goes through Raycast + AI Command.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stats&lt;/strong&gt; — Menu bar display for CPU, RAM, network, disk, and power status.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keynote&lt;/strong&gt; — For presentations and thesis defenses. I tried iA Present for a while, but Keynote is still the best.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Numbers&lt;/strong&gt; — For charts and data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bartender 5&lt;/strong&gt; — Essential Mac utility. Full control over what appears in your menu bar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;RunCat&lt;/strong&gt; — A small animated cat whose running speed reflects CPU load. Charming and useless in the best way.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vimac&lt;/strong&gt; — Vim-style keyboard navigation throughout macOS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NinjaMouse&lt;/strong&gt; — Used alongside Vimac. Automatically moves the mouse pointer to the center of the active window when switching apps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input Source Pro&lt;/strong&gt; — Automatically switches input method based on the active app. Very useful during development: switch to IDE or terminal → auto-switch to English; switch to documents or WeChat → auto-switch to Chinese.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AltTab&lt;/strong&gt; — Windows-style app switcher with thumbnail previews, including minimized windows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hookmark&lt;/strong&gt; — Used with Drafts to create deep links and bookmarks between any apps.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Geekbench 6&lt;/strong&gt; — System performance benchmarking.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AlDente&lt;/strong&gt; — Battery charge management. Lets you cap charging at 80% for long-term battery health. More precise and customizable power policy control.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tencent Lemon&lt;/strong&gt; — Disk cleanup utility. Compact and practical. Hoping it doesn&apos;t go the bloatware route.&lt;/p&gt;
&lt;h3&gt;Services&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Perplexity&lt;/strong&gt; — Replaced Google as the default search in Arc. Running 20–40 searches a day, combined with custom prompts and Claude 3 Opus. Output quality is genuinely high and has significantly improved my learning speed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tencent Docs&lt;/strong&gt; — For work or anything collaborative.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; — Using it free since 2022. Massive productivity boost, especially in Jupyter where natural language data processing becomes practical.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Readwise&lt;/strong&gt; — All my highlights from every reading source flow into Readwise. From there I take notes and process them in HeptaBase.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;IFTTT&lt;/strong&gt; — Automation service supporting AI and Webhooks. I use it to aggregate, organize, and route all kinds of records — web saves flow into Cubox, notifications flow into a personal Telegram channel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Last.fm&lt;/strong&gt; — Tracks listening history across all platforms. Beautiful charts. Used alongside musicfox.&lt;/p&gt;
&lt;h3&gt;Productivity&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Raycast&lt;/strong&gt; — I&apos;m on Raycast Pro with the GPT-4 extension pack. The features I use most: HotKey shortcuts to open apps instantly, AI Chat, and Clipboard History.&lt;/p&gt;
&lt;p&gt;Plugins I use regularly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI Chat &amp;amp; Quick AI&lt;/strong&gt; — One keystroke to summon AI anywhere on the machine. Makes Microsoft&apos;s dedicated Copilot key look a bit silly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI Command&lt;/strong&gt; — Runs copied text through custom pre-written prompts. I use it to extract key info from CI results and generate configs, format/compress JSON, analyze stack traces, and translate between English and Chinese.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clipboard History&lt;/strong&gt; — More efficient than Rewind for my use case. Direct access to everything I&apos;ve copied.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;My IP&lt;/strong&gt; — Quick lookup and copy of local IP. Essential for development.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Search&lt;/strong&gt; — Since Arc&apos;s default search is Perplexity, this shortcut is for when I specifically want Google.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QR Code Generator&lt;/strong&gt; — Convert URLs to QR codes without opening a browser. Comes up surprisingly often at work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Todoist&lt;/strong&gt; — Surface today&apos;s tasks in the menu bar or a popup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linear&lt;/strong&gt; — Linear integration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scrcpy&lt;/strong&gt; — Scrcpy integration.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Rize&lt;/strong&gt; — Time tracking and focus management. Runs automatically in the background.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fantastical&lt;/strong&gt; — My unified calendar and task management tool. Seven years and counting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apple Calendar&lt;/strong&gt; — Used alongside Fantastical.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Todoist&lt;/strong&gt; — I&apos;ve tried OmniFocus, Things 3, Sorted3, Apple Reminders, TickTick, and Taskade over the years. I landed on Todoist for its open API, excellent Vim keyboard support, and solid integration with Fantastical and other third-party apps. If those three factors don&apos;t matter to you, TickTick offers the best overall experience and value.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Drafts&lt;/strong&gt; — With keyboard shortcuts and the desktop sticky note feature, it works perfectly as a scratchpad and desktop clipboard.&lt;/p&gt;
&lt;h3&gt;Reading&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Readwise Reader&lt;/strong&gt; — Excellent integration with Readwise. Smooth experience, shortcut support, RSS subscriptions, newsletter subscriptions, and image highlighting. I use the web version mostly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Inoreader&lt;/strong&gt; — RSS feed management. Combined with email, IFTTT + AI, Telegram subscriptions, and keyword monitoring for automated alerts and summaries.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WeRead (微信读书)&lt;/strong&gt; — The new AI outline feature is excellent. Combined with Readwise for saving highlights after finishing a book.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cubox&lt;/strong&gt; — Web clipping inbox. Used with IFTTT — all subscribed content eventually flows into Cubox.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Instapaper&lt;/strong&gt; — Free, and integrates well with IFTTT, browser extensions, and Inoreader. Functions as a transfer service for web saves.&lt;/p&gt;
&lt;h3&gt;Notes&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;HeptaBase&lt;/strong&gt; — Over seven to eight years I&apos;ve tried Notion, Bear, NotePlan, Tana, Roam Research, Capacities, Logseq, Obsidian, Craft, Mem, and MWeb. HeptaBase is the one I&apos;ve kept — it produces the highest output efficiency for me. Beyond card-based notes, it has canvas/whiteboard functionality, PDF annotation, and excellent Readwise integration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Obsidian&lt;/strong&gt; — I&apos;ve tinkered with many plugins, but ultimately I only use Obsidian for one thing: the Excalidraw plugin. At this point Obsidian is essentially an Excalidraw client. I use it daily as a whiteboard for rough drafts and thinking through work problems.&lt;/p&gt;
&lt;h3&gt;Development&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Editors:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Visual Studio Code&lt;/strong&gt; — For quickly browsing projects, analyzing logs, or working in Jupyter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WebStorm&lt;/strong&gt; — I used to be fully in the VS Code camp, then discovered what paid software feels like (covered by company license). The built-in Git tools, conflict resolution, file management, and memory tuning are excellent — no plugin wrangling required, and it performs noticeably better than a VS Code setup loaded with extensions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CLion&lt;/strong&gt; — JetBrains family. For C++ projects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Xcode&lt;/strong&gt; — For iOS projects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Android Studio&lt;/strong&gt; — For Android projects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cocos Creator&lt;/strong&gt; — For game projects.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Editor Plugins:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Vim&lt;/strong&gt; — Installed in JetBrains, VS Code, and Xcode.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MetaJump&lt;/strong&gt; — Pairs with Vim for fast cursor movement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Banish Pointer&lt;/strong&gt; — Hides the mouse pointer when focus is in the editor. Pairs with Vim.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Error Lens&lt;/strong&gt; — Enhanced inline error display.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Filter Line&lt;/strong&gt; — Filter log output by keyword.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot&lt;/strong&gt; — AI coding assistance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitToolbox&lt;/strong&gt; — JetBrains Git enhancement. Shows inline commit info.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitLens&lt;/strong&gt; — VS Code equivalent of GitToolbox.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git Graph&lt;/strong&gt; — VS Code. JetBrains&apos; built-in is sufficient there.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TODO++&lt;/strong&gt; — VS Code. Unified comment annotation management. JetBrains&apos; built-in is sufficient.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bookmarks&lt;/strong&gt; — VS Code. JetBrains&apos; built-in is sufficient.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Jupyter&lt;/strong&gt; — For data analysis.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WakaTime&lt;/strong&gt; — Tracks coding time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Browser Extensions:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Readwise&lt;/strong&gt; — Highlight directly on web pages; syncs to Reader.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Instapaper&lt;/strong&gt; — Save web pages, works with IFTTT, Cubox, and Readwise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Immersive Translation&lt;/strong&gt; — For reading English-language sites with bilingual parallel translation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1Password&lt;/strong&gt; — Auto-fill for registration and login.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vimium C&lt;/strong&gt; — Vim-style keyboard navigation for web browsing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Whistle Rule Manager&lt;/strong&gt; — Proxy management for development. A replacement for Proxy SwitchyOmega, which stopped working when Chrome dropped Manifest V2 extensions in mid-2024.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Terminal:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Warp&lt;/strong&gt; — Works out of the box, looks good, and most importantly requires zero setup or plugin configuration. Replaced iTerm2, which I had used for years.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Command-Line Tools:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;oh-my-zsh&lt;/strong&gt; — Primarily the git aliases, git plugin, and zsh-autosuggestions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;tig&lt;/strong&gt; — CLI Git enhancement. Heavy daily use.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Homebrew&lt;/strong&gt; — Essential Mac package manager.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;musicfox&lt;/strong&gt; — Command-line music player. No music app installed; this handles everything through Vim shortcuts and connects to Last.fm.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nvm&lt;/strong&gt; — Node version manager.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scrcpy&lt;/strong&gt; — For Android development. Screen mirror and control from the desktop for testing and recording.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Version Control:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GitKraken&lt;/strong&gt; — Reserved for complex scenarios: multiple submodules, or tracing a long commit history to pinpoint where something changed. Otherwise I use tig.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Network Debugging:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Whistle&lt;/strong&gt; — My most-used tool at work. View raw requests, configure proxies, save/restore sessions, simulate/replay requests, intercept and modify responses. Flexible and powerful — genuinely indispensable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chrome&lt;/strong&gt; — Standard proxy-based local development, occasional Devtools use, sometimes inspect for real-device debugging or net-log for deep network issue diagnosis.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Safari&lt;/strong&gt; — For debugging JSCore or WKWebView on iOS devices.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other Dev Tools:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Linear&lt;/strong&gt; — Issue tracker with milestone and roadmap support, effort estimation, time prediction, and IFTTT sync to Todoist.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Console&lt;/strong&gt; — Capturing iOS client logs. Similar to LogCat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PerfDog&lt;/strong&gt; — Performance testing. Regularly used to analyze frame drops.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Xcode Instruments&lt;/strong&gt; — Performance profiling. For analyzing time-consuming stack traces.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Other&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Pixelmator Pro&lt;/strong&gt; — Picked it up during a free promotion. Powerful, smooth, and easy to use for image editing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Money Things&lt;/strong&gt; — Personal finance management, used with the mobile version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1Password&lt;/strong&gt; — Unified management of passwords, documents, licenses, and certificates. Built-in two-factor authentication, Passkey support, and SSH agent.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Mobile Apps&lt;/h2&gt;
&lt;h3&gt;Journaling and Tracking&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Fog of World&lt;/strong&gt; — Turns life into explorer mode. I&apos;ve taken so many detours because of this app, but the sense of accomplishment is immense.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rond&lt;/strong&gt; — Passive location logging.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Life Journal&lt;/strong&gt; — Passive movement track recording.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Day One&lt;/strong&gt; — Diary app. See &lt;a href=&quot;https://blog.ursb.me/posts/weekly-19/&quot;&gt;Weekly #19: On the Meaning of Keeping a Diary&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Daylio&lt;/strong&gt; — Daily mood logging.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Douban&lt;/strong&gt; — Books, films, and music tracking. Some Douban groups are quite good; Daily Douban also has nice recommendations, and you can subscribe via RSS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Money Things&lt;/strong&gt; — I&apos;ve tried many expense-tracking apps. Money Things handles payment scheduling, automated bookkeeping, scenario management, quick entry, and spending statistics well. Desktop version available.&lt;/p&gt;
&lt;h3&gt;Reading&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;WeRead (微信读书)&lt;/strong&gt; — Usually on iPad or BOOX Leaf2.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Readwise Reader&lt;/strong&gt; — Paired with the desktop version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Unread&lt;/strong&gt; — RSS reader. Free, and the mobile experience is better than Reeder on mobile. No desktop version — for desktop RSS, use the web version or Reeder.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cubox&lt;/strong&gt; — Paired with the desktop version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dimo Highlights (滴墨书摘)&lt;/strong&gt; — For physical books. OCR text capture is convenient; export to Readwise.&lt;/p&gt;
&lt;h3&gt;Productivity&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Fantastical&lt;/strong&gt; — Paired with the desktop version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apple Calendar&lt;/strong&gt; — Paired with Fantastical.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Todoist&lt;/strong&gt; — Paired with the desktop version.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Drafts&lt;/strong&gt; — Paired with the desktop version. Quick input on mobile is also excellent.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Niagara Launcher&lt;/strong&gt; — Must-have for Android. Significantly improves the efficiency of launching apps from the home screen.&lt;/p&gt;
&lt;h3&gt;Web and Search&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Arc Search&lt;/strong&gt; — For quick mobile searches. Default search engine set to Perplexity.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Readwise&lt;/strong&gt; — Complements desktop reading. Mobile is mainly for periodic review.&lt;/p&gt;
&lt;h3&gt;Health and Fitness&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Health&lt;/strong&gt; — Occasional mood and weight logging; monitoring health trend charts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fitness&lt;/strong&gt; — For workouts; I like the Activity ring design.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WorkOutDoors&lt;/strong&gt; — Supports importing routes. Better suited than Fitness for route-based outdoor activities like hiking and cycling.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Grow&lt;/strong&gt; — Beautiful chart statistics.&lt;/p&gt;
&lt;h3&gt;Travel&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Caiyun Weather (彩云天气)&lt;/strong&gt; — Most accurate real-time rain forecasting. The free tier has too many ads, unfortunately.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Apple Maps&lt;/strong&gt; — Occasionally for driving. More accurate real-time positioning than Gaode, and syncs with Apple Watch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gaode Maps (高德地图)&lt;/strong&gt; — Better congestion prediction and route recommendations than Baidu or Tencent Maps. The traffic light display in urban areas is also useful.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Trip.Biz (航旅纵横 Pro)&lt;/strong&gt; — The most comprehensive and timely flight information app. Notifications beat the airport PA system.&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=tools&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Weekly #25: Love Concrete People</title><link>https://ursb.me/en/posts/weekly-25/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-25/</guid><description>A written version of an internal TED talk arguing that engineering quality assurance should treat user feedback as coming from real people, not just metrics.</description><pubDate>Sun, 17 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This issue is a record of and reflection on life from January to March 2024.&lt;/p&gt;
&lt;p&gt;I missed the last two issues. From Chinese New Year through the holidays and weekends, I&apos;d been in preparation mode for my T11 performance review. Got through it this week — finally a bit of breathing room, and quiet weekends are back.&lt;/p&gt;
&lt;p&gt;A couple of days ago I participated in an internal TED-style talk at the company. The night before I put together some slides, and the morning of I ran through the flow twice to get the pacing right, then walked on stage. I&apos;ve always believed a talk doesn&apos;t need a script — what matters is composure, and adjusting your content and rhythm in response to the room. But it had been a full six years since I&apos;d spoken in front of an audience, and I was nervous at first. As I got into my rhythm, though, things clicked — and to my complete surprise, I ended up winning first place. More than anything I felt genuinely delighted.&lt;/p&gt;
&lt;p&gt;This issue is a written version of that talk: &lt;em&gt;Love Concrete People — A Human Approach to Quality Assurance in Engineering&lt;/em&gt; (details have been anonymized).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.001.jpeg&quot; alt=&quot;&quot; /&gt;Imagine you&apos;re facing a choice: on one side, a one-off user complaint that can&apos;t be reproduced; on the other, a feature urgently waiting to ship. Given the constraints and ROI considerations, I think most people — including me — would instinctively choose to prioritize the feature. My hope is that after hearing this talk, that instinct gives you just a little pause.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.002.jpeg&quot; alt=&quot;&quot; /&gt;In our product&apos;s context, user feedback rates are quite low — partly because of the scale of the product and large denominators, but that doesn&apos;t mean individual feedback isn&apos;t worth taking seriously. When user problems go unresolved, users get frustrated fast. I took a screenshot just a couple of days ago — and there&apos;s a lot more like it, with language that really can&apos;t be quoted. At that point, in my view, the bond between that user and the product has become brittle.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.004.jpeg&quot; alt=&quot;&quot; /&gt;But if you actually pay attention, you&apos;ll find that the vast majority of users are friendly and sincere the first time they reach out. They&apos;re reaching out because they love the product — a problem came up and they want it fixed. Their intention is to help us make it better.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.005.jpeg&quot; alt=&quot;&quot; /&gt;Let me give you another example. A few days ago I grey-released a technical container, and monitoring picked up an interface throwing a few errors. I went to investigate — the errors were blocking users from entering the game. I found that over two days, only two users had been affected. Looking at one user&apos;s logs, I could see that after hitting the error, they&apos;d tried logging in again every few hours — morning, noon, evening. Every single time it failed. They kept trying anyway. I could feel their frustration, and that evening I made fixing it the priority.&lt;/p&gt;
&lt;p&gt;The point isn&apos;t that this bug was severe or subtle. What matters is that this user, from start to finish, never filed a single report. If the issue had kept being overlooked, we would have lost them — both of them. And even then, we&apos;d never have known. Their individual numbers wouldn&apos;t have moved the conversion curve by a single visible tick.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.006.jpeg&quot; alt=&quot;&quot; /&gt;And for users who do reach out — when we solve their problem, they respond with gratitude, praise, and encouragement. In those moments I can really feel that the feedback on the other side of the screen is from real, living people — not a UID plus a User-Agent string. People I know personally also use our products. Imagine an elderly family member who can&apos;t figure out how to send a gift, or finishes a task but can&apos;t claim their reward, or wants to play and can&apos;t log in. How would you handle it then?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.007.jpeg&quot; alt=&quot;&quot; /&gt;Altman has a startup course at Stanford GSB, and two things he said really stuck with me.&lt;/p&gt;
&lt;p&gt;The first is about &lt;strong&gt;emotion&lt;/strong&gt;. He argues we shouldn&apos;t analyze our products through a purely rational lens — always chasing DAU, conversion rates, retention, ARPPU. We should mix in some feeling, think about product growth through an emotional lens. The relationship between a product and its users should be more like a courtship, or a marriage — something to build, maintain, and nurture over time.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.008.jpeg&quot; alt=&quot;&quot; /&gt;The second is about &lt;strong&gt;respect&lt;/strong&gt;. He gives the example of WUFOO, an online form builder. Their team of 10 was serving 500,000 users, with over 1,000 issues to resolve every week. They assigned dedicated people to work through those issues on a rolling basis, aiming to clear the queue each week. The respect they showed their users is itself something to be respected.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.009.jpeg&quot; alt=&quot;&quot; /&gt;That made me think of a product I poured myself into back in school — and the warmth, support, and kind words I received in its feedback section. Those responses fed back into my love for building things, my stubborn desire to get products right. Even all these years later, recalling that feedback leaves me with a warmth inside, a sense of belief and strength.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.010.jpeg&quot; alt=&quot;&quot; /&gt;The last keyword is &lt;strong&gt;meaning&lt;/strong&gt;. I recently read &lt;em&gt;Finite and Infinite Games&lt;/em&gt;, in which the author frames every human activity as a kind of game — either finite or infinite. The latter carries a far stronger sense of purpose and value.&lt;/p&gt;
&lt;p&gt;Returning to the scenario at the start of the talk: if you flip the perspective slightly, you get a completely different answer. If we&apos;re just pushing features from the outside in, resolving issues in order to build a better product, there&apos;s a clear endpoint and a repeatable cycle to it. That&apos;s a finite game.&lt;/p&gt;
&lt;p&gt;But what if it&apos;s the other way around? If we&apos;re driven by a genuine belief in building something great — and the features and fixes flow from that — the internal motivation is incomparably stronger. From the inside out, the possibilities are infinite.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.011.jpeg&quot; alt=&quot;&quot; /&gt;To sum it all up: we should start from the lived experience of real users, pay attention to each one of them, and build the kind of warm connection between product and people that these things deserve.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.012.jpeg&quot; alt=&quot;&quot; /&gt;All of that, condensed into a single sentence we all know by heart: &quot;User value above all else.&quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.013.jpeg&quot; alt=&quot;&quot; /&gt;Thank you.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/%E7%88%B1%E5%85%B7%E4%BD%93%E7%9A%84%E4%BA%BA%E2%80%94%E2%80%94%E7%A0%94%E5%8F%91%E8%B4%A8%E9%87%8F%E4%BF%9D%E9%9A%9C%E7%9A%84%E4%BA%BA%E6%96%87%E5%85%B3%E6%80%80.014.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🌺 Snippets from Life&lt;/h2&gt;
&lt;p&gt;A few moments from this period.&lt;/p&gt;
&lt;p&gt;🏮 &lt;strong&gt;Chinese New Year: The Moon Is Brightest Over Home&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4111710590875_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4101710590872_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4091710590872_.pic.jpg&quot; alt=&quot;&quot; /&gt;🛫 &lt;strong&gt;On the way back: shot of the Canton Tower from the plane&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4081710590871_.pic.jpg&quot; alt=&quot;&quot; /&gt;🇭🇰 &lt;strong&gt;Hong Kong: went to open a bank account&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4151710590881_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4161710590882_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4141710590879_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4131710590878_.pic.jpg&quot; alt=&quot;&quot; /&gt;🌇 &lt;strong&gt;Sunset&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4071710590867_.pic.jpg&quot; alt=&quot;&quot; /&gt;🏆 &lt;strong&gt;Outstanding Individual Award &amp;amp; TED Talk&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4041710590865_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4051710590866_.pic.jpg&quot; alt=&quot;&quot; /&gt;🐱 &lt;strong&gt;Mittens: still blissfully clueless&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/4121710590877_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🎬 Books, Films, and More&lt;/h2&gt;
&lt;p&gt;What I&apos;ve been reading, watching, and playing this period:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finished: Psychology | &lt;em&gt;Existential Psychotherapy&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Personal Finance | &lt;em&gt;Getting Rich Slowly&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Philosophy | &lt;em&gt;Finite and Infinite Games&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Manga | &lt;em&gt;My Dearest Self with Malice Aforethought&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Pegasus 2&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;A Mother&apos;s Revenge&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;The Long Way Round&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Across the Ocean&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Swap&lt;/em&gt; | ★☆☆☆☆&lt;/li&gt;
&lt;li&gt;Finished: US series | &lt;em&gt;Loki Season 2&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Drama | &lt;em&gt;Hunt&lt;/em&gt; | ★★☆☆☆&lt;/li&gt;
&lt;li&gt;Finished: Drama | &lt;em&gt;If Running Is My Life&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: Anime | &lt;em&gt;Mashle: Magic and Muscles (Season 1)&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Anime | &lt;em&gt;Jujutsu Kaisen Season 2&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Currently watching: Anime | &lt;em&gt;Frieren: Beyond Journey&apos;s End&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Highly recommend &lt;em&gt;Frieren: Beyond Journey&apos;s End&lt;/em&gt; 🎉&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/wj25/Capture-2024-03-17-145239.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-25&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>2023: Escaping the Drift</title><link>https://ursb.me/en/posts/summary-2023/</link><guid isPermaLink="true">https://ursb.me/en/posts/summary-2023/</guid><description>A 2023 year in review: near-resignation amid burnout, then a transfer into Cocos and iOS/Android work with a promotion, a new relationship, and a blog migration.</description><pubDate>Sun, 14 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Another year-end review — the sixth since I started writing them. I&apos;m quietly sliding toward 29, and I&apos;ve started feeling the anxiety of it in ways I couldn&apos;t have understood when I was younger. I didn&apos;t even mention my birthday on social media this year. That&apos;s when I finally got it — why some people don&apos;t want to celebrate.&lt;/p&gt;
&lt;p&gt;This year at work was a long stretch of uncertainty, and my efforts to break out of it were winding and difficult. I thought hard, tried a lot, and did my best to escape the drift. So this year&apos;s theme: &lt;strong&gt;Escaping the Drift&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Life&lt;/h2&gt;
&lt;p&gt;Every year I start with work, but not this time. This year, I&apos;ll start with life.&lt;/p&gt;
&lt;h3&gt;Romance&lt;/h3&gt;
&lt;p&gt;Big news: I finally started dating someone! This is the most important thing that happened to me this year, so it goes first. I&apos;ve always kept relationships private — they&apos;re personal things, not for broadcasting — so I&apos;ll leave it at that.&lt;/p&gt;
&lt;h3&gt;People&lt;/h3&gt;
&lt;p&gt;My college roommate and close colleague Zyktrcn left the company and moved back to Guangzhou, taking Xiaoxi (our adopted cat) with him. There&apos;s a hollow feeling left behind. The friends I&apos;ve made since starting work keep moving on and scattering. My old college buddy and his girlfriend moved to Suzhou; the study group I was part of — Wall-E and Ellia — both left; our legendary team mom Sara left two years ago, and her departure quietly shifted the whole team&apos;s weight. Sometimes I&apos;ll be going through old code and see a commit from a former colleague, and I&apos;m back in those years when the office felt like home.&lt;/p&gt;
&lt;p&gt;As a team leader once said at a farewell dinner: &quot;Together we burn as a single flame; apart we scatter into a sky full of stars.&quot; I just hope they&apos;re not only passing through.&lt;/p&gt;
&lt;p&gt;I also moved apartments this year. Before packing up, I took one last photo from the balcony — still breathtaking.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG67.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Travel&lt;/h3&gt;
&lt;p&gt;Lots of travel this year.&lt;/p&gt;
&lt;p&gt;👪 &lt;strong&gt;Dapeng, Shenzhen&lt;/strong&gt;: Family came for the New Year; took them around the Dapeng Peninsula.&lt;/p&gt;
&lt;p&gt;🍺 &lt;strong&gt;Beijing&lt;/strong&gt;: Business trip early in the year — conferences, but also old friends I hadn&apos;t seen in years, wandering through winter alleyways and catching up.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG70.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;🐚 &lt;strong&gt;Huizhou Shuangyue Bay&lt;/strong&gt;: First trip with my girlfriend. We collected shells on the beach.&lt;/p&gt;
&lt;p&gt;⛰ &lt;strong&gt;Fuding, Fujian&lt;/strong&gt;: Took a long holiday over Dragon Boat Festival, stayed at a guesthouse deep in the mountains. A different kind of stillness.&lt;/p&gt;
&lt;p&gt;🐂 &lt;strong&gt;Shunde&lt;/strong&gt;: Wandered through Qinghui Garden. The beef offal noodles nearby were incredible — we actually detoured back for them on the way home from Zhuhai.&lt;/p&gt;
&lt;p&gt;🐬 &lt;strong&gt;Zhuhai Chimelong&lt;/strong&gt;: Ocean Kingdom. Pleasant, though I was too scared for the roller coasters.&lt;/p&gt;
&lt;p&gt;🎏 &lt;strong&gt;Qingyuan – Yingde – Conghua&lt;/strong&gt; (National Day road trip): The Qingyuan river rafting was shockingly fun.&lt;/p&gt;
&lt;p&gt;🌊 &lt;strong&gt;Xunliao Bay, Santiaoshi Island&lt;/strong&gt;: Team retreat. Sparse supplies on the island, but gorgeous photos from the sailboat.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG65.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;👻 &lt;strong&gt;Changsha&lt;/strong&gt;: Drove up ourselves — 20 hours round trip. Ironically, what stuck with me wasn&apos;t the food but a late-night highway stretch past a roadside cemetery while listening to ghost stories.&lt;/p&gt;
&lt;p&gt;🎰 &lt;strong&gt;Guangzhou&lt;/strong&gt;: Reunited with high school friends. VR zombie shooting, claw machines, escape rooms. We had an absolutely brilliant time.&lt;/p&gt;
&lt;h3&gt;Things I Bought&lt;/h3&gt;
&lt;p&gt;Some notable purchases this year:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Steam Deck&lt;/strong&gt;: Collecting dust, but the moment I hold it in my hands — even before starting a game — I already feel happy. An entire game library in your grip. Pure childhood dream energy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BOOX Left2&lt;/strong&gt;: Switched from my Kindle Oasis because Kindle&apos;s WeChat Reading support is awkward. The BOOX physical page-turn buttons are excellent. Had to send it back for repairs after six months though. My Kindles ran for years without issue, for context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Insta360 GO 3&lt;/strong&gt;: Perfect little camera for travel — I leave it in the car now. Wear it on a pendant for river rafting; attach it to a tripod for vlogs; the auto-edit software is painless. Two downsides: night photography is genuinely bad, and the built-in storage can&apos;t be expanded, which makes offloading footage a bit annoying.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Biyuanquan Water Dispenser&lt;/strong&gt;: Instant hot or cold water, any temperature you want. Regret not knowing about it sooner.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dyson Hair Dryer&lt;/strong&gt;: My girlfriend swears it&apos;s in a different category. She hasn&apos;t used conditioner since.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AirPods Pro 2 (USB-C)&lt;/strong&gt;: My Pro 1s survived a full washing machine cycle but lost their noise cancellation. Upgraded when the USB-C version dropped.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Momentum e-bike&lt;/strong&gt;: My daily commute vehicle. Three levels of assist, ~35km range (enough for a full week of commutes). Uphill it&apos;s like cheating. Without assist it&apos;s a regular 7-speed bike — a bit heavy to pedal unassisted, but manageable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG69.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Test Drives&lt;/h3&gt;
&lt;p&gt;Went along for test drives with different friends this year. My impressions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AITO M5&lt;/strong&gt;: The intelligent driving feature had a navigation hiccup — missed a turn and went straight. Interior style felt dated to me.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Avatr 12&lt;/strong&gt;: The design hits exactly my taste. The electronic side mirrors take adjustment (though they&apos;re optional). No HUD.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Porsche 718&lt;/strong&gt;: Stunning to look at, though they&apos;ve become so common in Shenzhen that the garages feel like a mix-and-match puzzle. Posture is comfortable, driving feel is sporty. Interior is dated; the speakers are just functional. Below 100km/h it shakes noticeably and the cabin noise is high. Didn&apos;t get to experience the supercharger.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NIO ET5T&lt;/strong&gt;: Good-looking, great driving feel — balances sport and comfort. The NOMI voice assistant is charming. No HUD though, and the driver&apos;s seat sits high enough that the side mirror blocks about a quarter of the forward sightline. Battery drain is a bit heavy. NIO&apos;s battery-swap system helps though, and the high seating position matters less in an SUV format. Might go back to try the EC8 or ES8.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Exercise&lt;/h3&gt;
&lt;p&gt;This year I committed to badminton (also how my girlfriend and I met). Played 59 matches — I can hold my own now, no longer a complete beginner. Self-titled &quot;front-court windshield wiper.&quot; Actually hitting decent clears from the back now.&lt;/p&gt;
&lt;p&gt;Also climbed Tanglang Mountain once.&lt;/p&gt;
&lt;p&gt;Overall: my physical state has improved noticeably since I started moving more.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG64.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Emotions&lt;/h3&gt;
&lt;p&gt;Still keeping a daily mood journal. iOS 17 even released Journal and the Psychological State feature in Health this year — apps I&apos;d been imagining building myself.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG71.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This year&apos;s mood log, below. Aside from a particularly difficult stretch in June (more in the work section), I&apos;ve maintained a sense of small daily contentment.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG79.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Why keep a mood log? I went into this in &lt;a href=&quot;https://blog.ursb.me/posts/weekly-19/&quot;&gt;Monthly #19: The Meaning of a Diary&lt;/a&gt;: recording is how we prevent information from escaping us — and how we prevent ourselves from escaping ourselves. Recording your life is how life becomes whole.&lt;/p&gt;
&lt;p&gt;Closing this section with a line from Douban&apos;s 2023 community retrospective: &quot;We invest fully in life itself — with love and attention, piercing the most concrete details, crowning ourselves in our own micro-universes.&quot;&lt;/p&gt;
&lt;h3&gt;The Cats&lt;/h3&gt;
&lt;p&gt;Gloves and Puff are doing well. Gloves especially: 50% sleeping (in a completely spread-out dead pose) and 50% eating (with his whole face jammed into the bowl). Puff is still mischievous but more responsive — at least she&apos;ll turn around when you call her now.&lt;/p&gt;
&lt;p&gt;No recent photos, so here&apos;s one just taken:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG75.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Learning&lt;/h2&gt;
&lt;p&gt;This was the year of large language models and AI. With AI assistance and better tooling, I absorbed knowledge more efficiently than before. Here&apos;s a quick overview of my setup.&lt;/p&gt;
&lt;p&gt;In 2022&apos;s &lt;a href=&quot;https://blog.ursb.me/posts/weekly-16/&quot;&gt;Monthly #16: My Personal Information Flow&lt;/a&gt;, I described how I process information. Some refinements this year:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Whiteboard thinking&lt;/strong&gt;: LogSeq, Obsidian, and Heptabase all support whiteboards and Readwise integration (Muse, Wujianji, GoodNotes don&apos;t). When synthesizing highlights and notes, whiteboard view helps organize the flow. I&apos;ve used this approach for both planning documents and this year&apos;s monthly letters.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240114152239.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240114152314.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;For research rough drafts, I prefer Excalidraw — I&apos;ve talked about this in &lt;a href=&quot;https://blog.ursb.me/posts/weekly-24/&quot;&gt;Monthly #24: Ten Years in Programming&lt;/a&gt;. A topic graph can grow to 200+ MB and Excalidraw handles it without breaking a sweat.&lt;/p&gt;
&lt;p&gt;For AI tools: OpenAI Plus is my first recommendation, followed by Perplexity, DALL-E 3, and Poe. These do require a VPN to access in China; a Microsoft cloud server works well as a proxy. Perplexity deserves special mention — it&apos;s essentially replaced Google for me. It integrates search results into its answers and handles PDF and image analysis. GPT-4 quality output:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240114153100.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Perplexity&apos;s free tier is entirely sufficient (it just doesn&apos;t use GPT-4). If you sign up via &lt;a href=&quot;https://perplexity.ai/pro?referral_code=0ZSAD0VT&quot;&gt;https://perplexity.ai/pro?referral_code=0ZSAD0VT&lt;/a&gt;, you&apos;ll get $5 off if you upgrade later.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For users without reliable VPN access, Raycast AI works without network restrictions and supports GPT-4 and other models. I use it for most in-depth conversations (this is the usage counter from my work laptop):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/raycast-2023-2.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It also supports custom AI commands via prompts. My regulars: extract JSON config from WeChat Bot responses, compress JSON, summarize URLs, convert JCE protocols to TypeScript interfaces, generate mock data for Whistle responses —&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240114153518.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And beyond AI, Raycast itself is exceptional. Work usage stats: launched Arc 23,000 times through Raycast; launched Terminal 2,000 times.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/raycast-2023-1.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can sign up at: &lt;a href=&quot;https://raycast.com/?via=airing&quot;&gt;https://raycast.com/?via=airing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Also worth mentioning: Rize, which I covered in &lt;a href=&quot;https://blog.ursb.me/posts/weekly-23/&quot;&gt;Monthly #23: Time Management in a Multitasking World&lt;/a&gt;. Genuinely helps with focus and distraction resistance. Sign up for a free trial month at &lt;a href=&quot;https://rize.io?code=291287&quot;&gt;https://rize.io?code=291287&lt;/a&gt; (Mac only).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231006123244@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Arc has also fully displaced Chrome and Safari as my main browser. Tree-style tabs, custom spaces, split view, AI tab renaming — all legitimately useful. Sign up at &lt;a href=&quot;https://arc.net/gift/ab29c0b8&quot;&gt;https://arc.net/gift/ab29c0b8&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240114154311.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This year I automated several parts of my information flow using IFTTT and its AI features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;IFTTT monitors my Inoreader subscriptions and sends items matching specific keywords (like &quot;annual review&quot;) to Cubox, with Telegram notifications.&lt;/li&gt;
&lt;li&gt;Rize&apos;s daily focus summary emails get forwarded to Inoreader; IFTTT then summarizes and shares them to my Telegram channel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG72.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Starred articles in Cubox trigger a webhook to Inoreader, then IFTTT forwards them (with AI summary) to the Telegram channel.&lt;/li&gt;
&lt;li&gt;A GitHub Action + IFTTT pipeline generates a weekly coding report from WakaTime.&lt;/li&gt;
&lt;li&gt;Similarly: a weekly Last.fm listening summary.&lt;/li&gt;
&lt;li&gt;GitHub Stars, Douban updates, and Weibo activity all feed into IFTTT subscriptions.&lt;/li&gt;
&lt;li&gt;New blog posts are auto-notified via RSS + IFTTT to the Telegram channel.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also tried Notion AI briefly but dropped it. Notion did release a Q&amp;amp;A beta — the concept is excellent, letting you query your Notion knowledge base via AI. I got beta access, and here&apos;s what it looked like:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG73.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In practice: it requires very precise questions, can&apos;t target a specific knowledge source, quality is notably below GPT-4, and often it&apos;s faster to just search manually. Promising concept, but not mature yet.&lt;/p&gt;
&lt;h2&gt;Work&lt;/h2&gt;
&lt;p&gt;Now for the part that gave this year its title.&lt;/p&gt;
&lt;p&gt;In January–February, I found myself uncertain about where I was going professionally. That uncertainty crystallized in May–June when I got COVID and spent days lying flat. Questions I&apos;d been suppressing finally broke through. I&apos;m passionate. I work hard. My reviews are good. My resume looks great. But — was I doing work I actually cared about? I realized I&apos;d been giving 100% not because I loved the work, but because the people around me believed in me, and I didn&apos;t want to let them down.&lt;/p&gt;
&lt;p&gt;Since the Flutter project wrapped up, nothing at work had genuinely ignited me. The past two years had been routine at best — fragmented, simple, repetitive. No breakthrough, no meaningful growth in sight.&lt;/p&gt;
&lt;p&gt;So I submitted my resignation. In the letter to my manager, I wrote:&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&quot;Right now I need to break out of this particular maze, and the key is my own mindset — but even if I solved my mindset, the maze itself would still be deteriorating. If I just adjust my attitude and keep advancing through levels, I&apos;ll grow increasingly numb — handling projects with robotic efficiency, until the parts of me I care about — what I love, what I pursue, what I dream of — gradually disappear in this endless maze-clearing. I think about a line by E.E. Cummings: &apos;To be nobody-but-yourself in a world which is doing its best, night and day, to make you everybody else — means to fight the hardest battle which any human being can fight; and never stop fighting.&apos; All I want is to remain myself. That is my bottom line.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;To not lose myself — I&apos;ve been writing annual reviews since 2018. I know the way to stay grounded is to keep examining and reflecting, then look forward. You&apos;ve probably noticed: I do best with research-type, deep-focus work. That&apos;s why Flutter went well, why my philosophy thesis went well, and why it&apos;s always been that way. I think about staying up until 3am alone in the lab working on a robotics project in junior year — I was genuinely happy. I can&apos;t remember the last time technology excited me that way. And beyond work: because of my life experiences, I want a rich life. I won&apos;t give 100% to projects I don&apos;t care about.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;What I hadn&apos;t expected: my manager agreed with me. He said he&apos;d try to keep almost anyone else, but for me — he understood, and he&apos;d support whatever I chose. Whether things went well or not, he&apos;d be in my corner.&lt;/p&gt;
&lt;p&gt;That conversation resolved something I&apos;d been carrying for years. A big part of why I&apos;d been reluctant to leave was my gratitude for his support and my attachment to the team — I hadn&apos;t realized those ties had become chains. But they weren&apos;t chains at all. They were the force that would carry me forward.&lt;/p&gt;
&lt;p&gt;In the end: I didn&apos;t leave. Three levels of leadership kept me in conversations, and I finally agreed to a team transfer and a project change.&lt;/p&gt;
&lt;p&gt;The new assignment brought real growth — a proper feel for the business, A/B test fluency, understanding how cohort segmentation affects data, learning to pull attribution from multiple angles. Technically too: I went deep into Cocos rendering, wrote a C++ library integrating a GFX module into the game engine. Got hands-on with Android development, implemented multiple resource-loading modes, built out iOS game engine functionality from scratch. At some point I was writing JS, iOS, Android, and C++ simultaneously, debugging the full game engine pipeline — while my 96GB iMac started struggling to keep up.&lt;/p&gt;
&lt;p&gt;PS. A particular week&apos;s WakaTime coding stats:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/536246ac76ccd45f8e4c29b8b7184b88.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I can&apos;t call this luck. I can only say I&apos;ve been grateful, all the way along, for the people who gave me understanding and belief and support — who kept me from drifting.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG66.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Through all of it, the original intention never got lost. I&apos;ve always hoped to use the things I can build to make the world a little better. It&apos;s not much yet, but I joined the W3C Accessibility Working Group this year — a small first step.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG74.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The company also ran IDP career assessments. My data:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240114152553.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ambition is supposedly the core of career development — my &quot;Success Motivation&quot; came in at 9.8. Strong marks in thinking and execution too. Interpersonal dynamics scored low, which tracks: I&apos;m genuinely built for heads-down, research-style work.&lt;/p&gt;
&lt;h2&gt;Writing&lt;/h2&gt;
&lt;p&gt;Seven monthly letters this year — paused for a few months in the middle due to work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-18/&quot;&gt;Monthly #18: Escaping Social Networks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-19/&quot;&gt;Monthly #19: The Meaning of a Diary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-20/&quot;&gt;Monthly #20: Restarting Life&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-21/&quot;&gt;Monthly #21: Short-form Video in a Fast-Paced Age&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-22/&quot;&gt;Monthly #22: Present Happiness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-23/&quot;&gt;Monthly #23: Time Management in a Multitasking World&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/weekly-24/&quot;&gt;Monthly #24: Ten Years in Programming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also published an old piece on Sspai that got an unexpected wave of grateful comments:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240113164230.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240113164313.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/Pasted%20image%2020240113164354.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Reading those, I felt a warmth I hadn&apos;t expected. Writing used to feel purely personal — a way to preserve thoughts before they slipped. I hadn&apos;t considered that what I thought could reach someone else.&lt;/p&gt;
&lt;p&gt;Someone once observed that one of the first joys of infancy is discovering you can affect the world around you. In writing — this act of creation — maybe I&apos;m seeking something like that: the feeling of leaving a small trace on the world.&lt;/p&gt;
&lt;p&gt;Then a Zhihu (Chinese Quora) private message arrived, and I understood concretely what writing can do for others:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/IMG_1129.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I started inviting readers to write to me in the monthly letters after that. Slowly, letters began arriving. I&apos;ve been replying carefully to each one. A reader correspondence initiative is planned for early 2024.&lt;/p&gt;
&lt;p&gt;Technical articles this year — just two:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;The Atum Game Engine&apos;s High-Performance Architecture&lt;/em&gt;: Not published externally yet (still needs desensitization).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.ursb.me/posts/cross-end/&quot;&gt;&lt;em&gt;Technical Deep-Dive: In-House Cross-Platform Framework&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fewer technical articles than in past years — partly time, partly that a lot of what I wanted to write couldn&apos;t be published without redaction. Need to fix that next year.&lt;/p&gt;
&lt;p&gt;Also: the blog moved. After a server attack caused losses, I migrated to a new platform at &lt;a href=&quot;https://blog.ursb.me&quot;&gt;blog.ursb.me&lt;/a&gt;. The old site and the newsletter site are both retired — core pages have 302 redirects pointing here. Comments from the old sites were too complicated to migrate, so they&apos;re gone. Subscribe for email updates on new posts.&lt;/p&gt;
&lt;h2&gt;Books, Films &amp;amp; Music&lt;/h2&gt;
&lt;p&gt;A lot of TV this year. Ranked by personal score:&lt;/p&gt;
&lt;h3&gt;TV&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Unmissable:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Restart Life (Jusei wo Yarinaosu)&lt;/em&gt;: ★★★★★ — six stars if I could. Rewatching reveals warm little details every time.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Long Season (Man Chang de Ji Jie)&lt;/em&gt;: ★★★★★ — a literary masterwork wrapped in mystery, with remarkable narrative structure and emotional depth.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Excellent:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35465232/&quot;&gt;Gangster (Kuang Biao)&lt;/a&gt;&lt;/em&gt;: ★★★★★ — regret not watching sooner. Only saw the censored version so docking half a star.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/36178641/&quot;&gt;The Glory Parts 1 &amp;amp; 2&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35991840/&quot;&gt;Loki Season 2&lt;/a&gt;&lt;/em&gt;: ★★★★★ — but why is the Time Stone green?&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35991840/&quot;&gt;Nirvana in Fire (Yin Mi de Jiao Luo)&lt;/a&gt;&lt;/em&gt;: ★★★★★ — rewatch of a classic.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35991840/&quot;&gt;The Last of Us Season 1&lt;/a&gt;&lt;/em&gt;: ★★★★★ — the source material is strong.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35991840/&quot;&gt;Death&apos;s Game (Si Qi Jiangzhi)&lt;/a&gt;&lt;/em&gt;: ★★★★★ — unexpectedly excellent.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/36178641/&quot;&gt;The Three-Body Problem&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/36178641/&quot;&gt;News Girl (Xin Wen Nu Wang)&lt;/a&gt;&lt;/em&gt;: ★★★★★ — solid, reliable TVB craft.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/36178641/&quot;&gt;Old Skeletons (Fan Cheng Zhi Xia)&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35991840/&quot;&gt;Nagi no Oitama (New Life, Nagisa)&lt;/a&gt;&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Worth watching:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;White Night Chase (Bai Ye Zhui Xiong)&lt;/em&gt;, &lt;em&gt;Everything is Fine (Dou Ting Hao)&lt;/em&gt;, &lt;em&gt;Evil Spirit (E Gui)&lt;/em&gt;, &lt;em&gt;Lotus Tower (Lian Hua Lou)&lt;/em&gt;, &lt;em&gt;Graduation Season (Bie Ban)&lt;/em&gt;, &lt;em&gt;Two Weddings and a Funeral (Hao Shi Cheng Shuang)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Take it or leave it:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Home Away From Home (Gu Xiang, Bie Lai Wu Yang)&lt;/em&gt;, &lt;em&gt;Dream of Splendor (Ning An Ru Meng)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG62.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Film&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Masterclass:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;Spider-Man: Across the Spider-Verse&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35991840/&quot;&gt;Love Letter (Qing Shu)&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Excellent:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;Oppenheimer&lt;/a&gt;&lt;/em&gt;: ★★★★★ (4.5) — Nolan at his most ambitious, but the black-and-white POV switch reads as overly cryptic without a guide.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;Lost in the Stars (Xiao Shi de Ta)&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;Full River Red (Man Jiang Hong)&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;Guardians of the Galaxy Vol. 3&lt;/a&gt;&lt;/em&gt;: ★★★★★ — by Marvel&apos;s recent standards, five stars is just passing. This cleared it.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;Searching 2 (Wang Luo Mi Zong 2)&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;No More Bets (Year-End Party Not Possible)&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Worth watching:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;Save the Boss (Bao Ni Ping An)&lt;/a&gt;&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;No More Bets (Gu Zhu Yi Zhi)&lt;/a&gt;&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;Fireworks of My Heart (Jian Ru Pan Shi)&lt;/a&gt;&lt;/em&gt;: ★★★★☆ — veteran performers remain veterans.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;The Platform (Ji E Zhan Tai)&lt;/a&gt;&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Mediocre to bad:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;NOPE&lt;/a&gt;&lt;/em&gt;: ★★☆☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;Transformers: Rise of the Beasts&lt;/a&gt;&lt;/em&gt;: ★★☆☆☆ (great effects)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Parrot Kill (Ying Wu Sha)&lt;/em&gt;: ★☆☆☆☆ — one star because that&apos;s the minimum.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Anime&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;Jujutsu Kaisen Seasons 1 &amp;amp; 2&lt;/a&gt;&lt;/em&gt;: ★★★★★ — fell for Gojo in the manga right before he got written out.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;Three-Body (Animation)&lt;/a&gt;&lt;/em&gt;: ★☆☆☆☆ — dropped halfway through. The comments section was funnier than the show.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Existential Psychotherapy&lt;/em&gt; (Irvin Yalom): ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Human Extinction&lt;/em&gt; (Toshiro Kagawa): ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Vanishing 13th Step&lt;/em&gt; (Soji Shimada): ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Siddhartha&lt;/em&gt; (Hermann Hesse): ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;How to Read Capital&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Young Babylon&lt;/em&gt; (Lu Nei): ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Games&lt;/h3&gt;
&lt;p&gt;Barely played this year. Forced through the Genshin Impact Sumeru main story; didn&apos;t open Fontaine. Tears of the Kingdom: defeated one boss. Baldur&apos;s Gate 3: made it out of the tutorial village. Dave the Diver: dove a few times.&lt;/p&gt;
&lt;h2&gt;New Year Goals&lt;/h2&gt;
&lt;p&gt;Another year, and I&apos;m still not setting specific goals — just trying to stay urgently aware.&lt;/p&gt;
&lt;p&gt;Romain Rolland once wrote: &quot;Most people die at twenty or thirty; thereafter they are only the shadow of themselves. The rest of their lives they are imitating themselves, repeating more and more mechanically and affectedly what they did, thought, loved and hated when they were alive.&quot;&lt;/p&gt;
&lt;p&gt;To stay grounded in what I care about and keep moving forward, I&apos;m giving myself three lines to carry into 2024:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&quot;Even a dull knife has a sword-maker&apos;s ambition; even a candle-flame hopes to rival the sun.&quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&quot;Life is finite, knowledge is infinite — to live toward death is to learn without ceasing.&quot;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;And to recite each day: &quot;I respect everything that happens. I pursue what my heart truly wants. I believe I grow better every day.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2023/WechatIMG63.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2023&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>Weekly #24: Ten Years of Programming</title><link>https://ursb.me/en/posts/weekly-24/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-24/</guid><description>Traces a decade of programming from 2014 to 2023, from VB and Java Swing through web frontend, iOS, and Flutter, and distills lessons on love-driven learning.</description><pubDate>Thu, 09 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This issue is a record of and reflection on life in October 2023.&lt;/p&gt;
&lt;h2&gt;Ten Years of Programming&lt;/h2&gt;
&lt;p&gt;Time flies. Looking back, it&apos;s been nearly ten years since I first got into programming in any systematic way. This monthly is a chance to trace that journey.&lt;/p&gt;
&lt;p&gt;Growing up with an internet café at home, I was always comfortable around computers and games. But I never imagined I&apos;d end up programming for a living. In 2007, my middle school ran an olympiad class on Pascal and I dropped out halfway. In 2013, I enrolled in Educational Technology after the college entrance exam — a science major in an education school with a passing connection to computers. If things had followed the expected path, I probably would have used my teaching credential to go back to a primary or secondary school in my hometown.&lt;/p&gt;
&lt;p&gt;But everything changed in early 2014.&lt;/p&gt;
&lt;h3&gt;2014: First Contact&lt;/h3&gt;
&lt;p&gt;That year began with a &lt;a href=&quot;https://me.ursb.me/archives/72.html&quot;&gt;near-death experience&lt;/a&gt; that changed me profoundly. Every day after felt like living toward death, deliberately. As &lt;em&gt;Existential Psychotherapy&lt;/em&gt; describes the effect of confronting mortality: &quot;The awareness of death moves us away from trivial concerns and gives life a new depth, intensity, and perspective.&quot; After that, my view of life shifted fundamentally — I wanted to leave something behind in the world. I wasn&apos;t willing to follow the path already laid out for me. So I rearranged my priorities and started searching for direction. Around that time I took a VB course that genuinely hooked me, and that&apos;s how I walked through the door into programming.&lt;/p&gt;
&lt;p&gt;I remember staying up until one or two in the morning every night building a text RPG in VB, and still not wanting to stop.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109134159-1.jpg&quot; alt=&quot;&quot; /&gt;That RPG — a game called Name Battle — went through 6 complete versions:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109133726@2x.jpg&quot; alt=&quot;&quot; /&gt;The excitement I felt during those late nights building that game hasn&apos;t faded at all in memory. That, I think, was pure love for the craft.&lt;/p&gt;
&lt;p&gt;Because of strong performance in the course, my teacher pulled me into a project team. I went on to teach myself Java Swing and databases, building gamified courseware and management platforms.&lt;/p&gt;
&lt;p&gt;During the VB and Java Swing period I was directly connecting my GUIs to databases (I know, I know). To bridge that gap — and because I wanted to build networked apps — I also learned ASP.Net and JSP. At the time, every API I built got the full Struts + Hibernate + Spring treatment. I felt invincible. GUI, JSP, Access — clearly I had everything under control.&lt;/p&gt;
&lt;p&gt;Then, like every developer, I bought a domain and got it registered (&lt;a href=&quot;https://ursb.me&quot;&gt;ursb.me&lt;/a&gt;, which I still use today), modded a WordPress theme, and deployed a blog to shared hosting. (Shared hosting was a thing of the era — just a directory on a server that you could do whatever you wanted with.)&lt;/p&gt;
&lt;p&gt;This is roughly what the blog looked like back then (3G internet, iPhone 5):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/04b0d14653332a6699b3171ea12679%201.jpg&quot; alt=&quot;&quot; /&gt;In my sophomore year, the school opened some secondary majors and I applied to minor in Computer Science. I spent the day in my primary program&apos;s classes and the evening in CS classes that didn&apos;t end until after nine. I&apos;d get back to the dorms and tinker until late. Exhausting, but I look back on it as one of the most fulfilling periods of my life — and somehow I kept ending up at the top of the class.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/3d1f1c4f311d701f2fac3f4d0c7773.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2015: Web Frontend&lt;/h3&gt;
&lt;p&gt;In 2015 I got into HTML, CSS, and JavaScript — what we now call web frontend. When I first touched H5, I was still using Dreamweaver… then I discovered Sublime and never looked back.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/afa372be5a1f3f23eee5d46d63d3ba%201.jpg&quot; alt=&quot;&quot; /&gt;While learning JavaScript I built a WeChat chat interface simulator using Canvas, and the project shot past 100 stars quickly.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109192948@2x.jpg&quot; alt=&quot;&quot; /&gt;After that I wrote a Canvas tutorial, which also picked up a solid following:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109193106@2x.jpg&quot; alt=&quot;&quot; /&gt;Printing it out and teaching classmates in person was deeply satisfying:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/a75270287ac6dfb1ea89dba5b217ab%201.jpg&quot; alt=&quot;&quot; /&gt;Early that year I teamed up with classmates for my first Hackathon. We decided to build an Android app called AskNow. Since I didn&apos;t know Android, I got assigned to UI design. That project introduced me to Sketch and basic mobile UI conventions, and I got curious enough about mobile development to spend a while learning Android.&lt;/p&gt;
&lt;p&gt;Not having an Android device and always developing on the simulator got old fast. Swift had just launched less than a year earlier, so I pivoted straight to iOS, diving in at what felt like the golden age of iOS development. My desire to learn felt bottomless — I could get excited about almost anything.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/69d124a038d6637dc5fe09ce2f2de6%201.jpg&quot; alt=&quot;&quot; /&gt;That year Apple released the first Apple Watch. I was completely starry-eyed watching the launch, went to the Apple Store immediately, bought a developer account, and started building Apple Watch apps:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109135133@2x.jpg&quot; alt=&quot;&quot; /&gt;I feel genuinely lucky to have grown up at a time when new technologies kept emerging and I could freely learn whatever caught my interest.&lt;/p&gt;
&lt;h3&gt;2016: Infinite Possibilities&lt;/h3&gt;
&lt;p&gt;After getting comfortable with Swift, I built an app and shipped it to the App Store — the sense of accomplishment was massive:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/3f4621fa4bccdd3afb856c9eb5b7dd%201.jpg&quot; alt=&quot;&quot; /&gt;Then I built FeedMe — a virtual pet plus English learning app for Apple Watch:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/Capture-2023-11-09-195333%20%281%29.png&quot; alt=&quot;&quot; /&gt;This year I also got into R and Python, did some web scraping and data analysis projects, and fell in love with Kaggle. I ended up not going further in that direction, figuring at the time it wasn&apos;t directly useful for building software. (Funnily enough, early this year I ended up doing technical attribution analysis on a phenomenon from abroad and actually used it — I could barely believe it.)&lt;/p&gt;
&lt;p&gt;I entered a lot of competitions that year. One involved building a transport robot for an electrical engineering project. I knew nothing about microcontrollers going in, so I basically moved into the lab for the duration to cram the knowledge and keep up with the project. The lab center gave me my own dedicated room — tired but happy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/da41799d63df979f0b1c8b5f3f62b2%201.jpg&quot; alt=&quot;&quot; /&gt;After finishing that project I realized I&apos;d become something like a full-stack engineer in the broadest sense: UI design, web, backend, client apps, hardware. I was interested in all of it.&lt;/p&gt;
&lt;p&gt;Around the same time, cross-platform frameworks were starting to make noise. I immediately picked up Ionic and Cordova and banged out a few apps for competitions. My energy felt unlimited.&lt;/p&gt;
&lt;p&gt;Most of the competitions went well — a good haul overall.&lt;/p&gt;
&lt;p&gt;PS. During any downtime that year I was still tinkering with my blog:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/3b14912d5c6ef4def505534a1e8d67.jpg&quot; alt=&quot;&quot; /&gt;(It was just Hexo, but I managed to make it bloated and unwieldy.)&lt;/p&gt;
&lt;h3&gt;2017: Frontend Everything&lt;/h3&gt;
&lt;p&gt;Speaking of the blog — this was the last time I touched it. I wanted simplicity, so I redesigned it into what it is now (&lt;a href=&quot;https://me.ursb.me&quot;&gt;me.ursb.me&lt;/a&gt;). I haven&apos;t touched the design since. A blog should be about the quality of the writing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109210317@2x.jpg&quot; alt=&quot;&quot; /&gt;During Chinese New Year 2017, I ended up in the hospital again. I remember WeChat launched Mini Programs while I was there, and I sat in bed coding one up from the official docs:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109135857@2x.jpg&quot; alt=&quot;&quot; /&gt;(Looking back, I can&apos;t believe I was coding with my non-dominant hand.)&lt;/p&gt;
&lt;p&gt;That year I learned Vue and built a community:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/sophia-shot%20%281%29.jpg&quot; alt=&quot;&quot; /&gt;My undergraduate thesis was a recommendation system.&lt;/p&gt;
&lt;p&gt;I bought a label printer and a Raspberry Pi and made a fun little toy:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/gugu3.jpg&quot; alt=&quot;&quot; /&gt;I entered many competitions that year, formed an online team called ZeroMates, and used React Native + Express to build and ship multiple apps to the App Store — including one picture app, Twin, and Four Seasons:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/_%20Oh_Bear%20-%20https___oh-bear_github_io_%201.jpg&quot; alt=&quot;&quot; /&gt;I also took on a freelance contract for a gym chain — built a complete system covering course sales, booking, scheduling, check-ins, and workout tracking. Good pocket money.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109195704@2x.jpg&quot; alt=&quot;&quot; /&gt;Year-end reflection: &lt;a href=&quot;https://me.ursb.me/archives/72.html&quot;&gt;Goodbye, My College Years&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;2018: Internship&lt;/h3&gt;
&lt;p&gt;The first half of the year was mostly a rewrite of Twin 2.0, which eventually won second place in a Mini Program competition.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109195513@2x.jpg&quot; alt=&quot;&quot; /&gt;I started applying for internships in March. With my &lt;a href=&quot;http://ursb.me/resume/&quot;&gt;resume&lt;/a&gt; and decent algorithmic interview prep, I landed at Tencent as a web frontend intern. I&apos;ve been on the same team ever since.&lt;/p&gt;
&lt;p&gt;My badge photo from those days (I was so young…):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109140130@2x.jpg&quot; alt=&quot;&quot; /&gt;Year-end reflection: &lt;a href=&quot;https://me.ursb.me/archives/153.html&quot;&gt;2018: Settling In&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;2019: WWDC and Full-Time Work&lt;/h3&gt;
&lt;p&gt;That year I finished my master&apos;s just in time for the two-year program cutoff. Before graduation I received a WWDC Scholarship ticket and accommodation, and Zhejiang University generously covered flights for students from my school — a free trip to the US.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109140340@2x.jpg&quot; alt=&quot;&quot; /&gt;I met a lot of impressive people on that trip and came back with a clearer sense that there&apos;s always further to go.&lt;/p&gt;
&lt;p&gt;I joined full-time after graduating. The first few months the team was still on jQuery, but by year-end we&apos;d adopted React. Beyond React-based activity pages, I also built a Mini Program that year, and a standalone app using Hippy.&lt;/p&gt;
&lt;p&gt;Year-end reflection: &lt;a href=&quot;https://me.ursb.me/archives/2019.html&quot;&gt;2019: Walking and Stopping&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;2020: Flutter&lt;/h3&gt;
&lt;p&gt;Cross-platform was exploding that year. I was lucky enough to spend it on Flutter — leading the development of a Flutter hybrid framework within the team, alongside some iOS work. I gave several internal and external technical talks based on the project and earned two five-star performance ratings. It was the first time I&apos;d hit five stars since graduating, and the boost it gave me was real.&lt;/p&gt;
&lt;p&gt;This project reignited my interest in native development and the desire to dig deep into lower-level technology. From here, my technical breadth started narrowing — and the depth started growing.&lt;/p&gt;
&lt;p&gt;Year-end reflection: &lt;a href=&quot;https://me.ursb.me/archives/2020.html&quot;&gt;2020: Chasing the Spark&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;2021: Platforms and the Metaverse&lt;/h3&gt;
&lt;p&gt;Middle-platform architectures were the big trend that year; we built one. Then at the end of the year the metaverse hype hit, and we pivoted to 3D rendering.&lt;/p&gt;
&lt;p&gt;A busy year. Mostly being pushed along, not much time to consolidate.&lt;/p&gt;
&lt;p&gt;That year I went from T6 to T9.&lt;/p&gt;
&lt;p&gt;Year-end reflection: &lt;a href=&quot;https://me.ursb.me/archives/2021.html&quot;&gt;2021: Crossing on My Own&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;2022: Engineering&lt;/h3&gt;
&lt;p&gt;Promoted to T10 early in the year.&lt;/p&gt;
&lt;p&gt;Focused on 3D rendering and web engineering, but growth felt slow. Looking back, growth rate = knowledge gained ÷ time, and for these past two years it was pretty low. So I pushed for a breakthrough — open source projects in my spare time, reading browser engine source, writing articles. Not much hands-on practice, but the knowledge base expanded considerably.&lt;/p&gt;
&lt;p&gt;Year-end reflection: &lt;a href=&quot;https://me.ursb.me/archives/2022.html&quot;&gt;2022: Peace and Joy&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;2023: iOS and Game Rendering&lt;/h3&gt;
&lt;p&gt;This year has been mostly game rendering — iOS container work and C++ cross-platform development, with some TypeScript and Android debugging mixed in.&lt;/p&gt;
&lt;p&gt;Ten years. That&apos;s roughly it.&lt;/p&gt;
&lt;p&gt;To close with some thoughts on learning to program: from everything above you can probably tell that passion is the core. The other essentials are project-based learning — whatever you pick up, build something with it — and a third thing the story above doesn&apos;t quite capture: consolidation.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Learning&lt;/strong&gt;: official docs are usually enough.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Applying&lt;/strong&gt;: building toward a project deepens understanding and gives you real satisfaction when something ships.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Consolidating&lt;/strong&gt;: keep development notes, write about what you learn, share it on a blog.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;While learning, beyond taking notes:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109204530@2x.jpg&quot; alt=&quot;&quot; /&gt;Deep dives into specific problems benefit from drawing out the core structure:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109161956@2x.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109141638@2x.jpg&quot; alt=&quot;&quot; /&gt;A sketch can be photographed for the record, and the whiteboard-style sprawl is better for thinking than linear notes.&lt;/p&gt;
&lt;p&gt;And finally, nothing beats consistently writing technical blog posts as a form of output.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109210427@2x.jpg&quot; alt=&quot;&quot; /&gt;I hope I can walk this road I love for another ten years that are just as surprising.&lt;/p&gt;
&lt;h2&gt;🌺 Snippets from Life&lt;/h2&gt;
&lt;p&gt;A few moments from October.&lt;/p&gt;
&lt;p&gt;🚗 &lt;strong&gt;National Day Road Trip&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Route: Shenzhen → Shunde → Guangzhou → Qingyuan → Yingde → Conghua → Guangzhou → Shenzhen&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/1048d08dfe540604a2f9d324078bea7.jpg&quot; alt=&quot;&quot; /&gt;Verdict: Qingyuan river rafting is fantastic.&lt;/p&gt;
&lt;p&gt;🧟‍♀️ &lt;strong&gt;VR Zombie Shooting&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Met up with high school friends in Guangzhou at the end of the break. Four of us played VR zombie shooting — surprisingly great fun.&lt;/p&gt;
&lt;p&gt;And grabbed a pile of stuffed animals from the claw machines:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109211134@2x.jpg&quot; alt=&quot;&quot; /&gt;🎧 &lt;strong&gt;AirPods Pro&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My old earphones went through the washing machine and have been crackling ever since, but I squeezed another two years out of them. Finally replaced them with the new USB-C AirPods:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109211408@2x.jpg&quot; alt=&quot;&quot; /&gt;🚗 &lt;strong&gt;Porsche&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Went to test-drive a 718 Boxster with a well-off friend. Came away deciding I like my Mini better.&lt;/p&gt;
&lt;p&gt;🏄🏻 &lt;strong&gt;Team Building&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Department outing to an island near Huizhou. My first time on a sailboat.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109211643@2x.jpg&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109211557@2x.jpg&quot; alt=&quot;&quot; /&gt;🏃🏻‍♀️ &lt;strong&gt;Weight&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&apos;ve been around 55 kg my whole life, never over 60. Lately it&apos;s been creeping up — might actually crack 65 for the first time.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109211709@2x.jpg&quot; alt=&quot;&quot; /&gt;🐱 &lt;strong&gt;Mittens&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Mittens has been absolutely bullying this toy dog lately — hiding it every night, only for Mittens to dig it out every morning and give it a good beating:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231109211241@2x.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🎬 Books, Films, and More&lt;/h2&gt;
&lt;p&gt;What I&apos;ve been reading, watching, and playing this month:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Currently reading: Psychology | &lt;em&gt;Existential Psychotherapy&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Currently watching: US series | &lt;em&gt;Loki Season 2&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Currently watching: Anime | &lt;em&gt;Jujutsu Kaisen Season 2&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Currently watching: Anime | &lt;em&gt;Spy × Family Season 2&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Currently watching: Documentary | &lt;em&gt;Planet Earth III&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Rewatched: Drama | &lt;em&gt;The Silence&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Drama | &lt;em&gt;Blossoms Shanghai&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Be a Hero&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Anatomy of a Fall&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Gee, Gee Man&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-24&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #23: Time Management When You&apos;re Doing Too Much</title><link>https://ursb.me/en/posts/weekly-23/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-23/</guid><description>Shares a calendar-plus-reminders system for separating fixed events from flexible tasks, arguing focus and fewer context switches beat any productivity app.</description><pubDate>Fri, 06 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This issue is a record of and reflection on life in September 2023.&lt;/p&gt;
&lt;h2&gt;Time Management When You&apos;re Doing Too Much&lt;/h2&gt;
&lt;p&gt;This issue, by reader request, I&apos;m talking about time management.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/IMG_0207.jpg&quot; alt=&quot;&quot; /&gt;Managing time comes down to two basic things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Before you work: how you allocate time&lt;/li&gt;
&lt;li&gt;While you work: how you actually use it&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Allocating Time: Prioritizing&lt;/h3&gt;
&lt;p&gt;Everyone has limited energy, but tasks are basically endless — work piles up with things to schedule, and life adds its own assortment of chores. So how do you sensibly arrange your finite time?&lt;/p&gt;
&lt;p&gt;Here&apos;s my simple approach: calendar + reminders. Specifically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Calendar&lt;/strong&gt;: for anything with a fixed time that has to happen. This is a block of time committed to a specific &lt;strong&gt;Event&lt;/strong&gt; — meetings, badminton games, dinners out. (The dot-prefixed items in the screenshot below are Events.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reminders&lt;/strong&gt;: for collecting loose tasks and to-dos. These are individual &lt;strong&gt;Things&lt;/strong&gt; that can be flexibly scheduled based on priority — work tasks, life errands, that sort of thing. (The checkmark-prefixed items below are Things; tick them off once done.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231006155233@2x.png&quot; alt=&quot;&quot; /&gt;My setup uses Fantastical, pulling from iCloud&apos;s Apple Calendar and Todoist. I went with Todoist because of its openness and integration support — it plays nicely with Obsidian, Raycast, and other tools. There are plenty of to-do apps out there; use whichever feels right to you.&lt;/p&gt;
&lt;p&gt;If you don&apos;t have particular needs, Apple Calendar and Apple Reminders work just fine.&lt;/p&gt;
&lt;p&gt;Now, the tools aside — how do you actually allocate time? The flexible part is mostly the Things. A few tips:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;By priority&lt;/strong&gt;: High-priority and urgent things get done immediately. Lower-priority or life-admin items I batch together in the morning or right before bed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;By your peak focus window&lt;/strong&gt;: Figure out when you&apos;re sharpest — late afternoon? evening? — and carve out a solid unbroken block for your harder or more important work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, new things will land in your lap throughout the day. When something non-urgent comes in, don&apos;t stop what you&apos;re doing — drop it into the Reminders inbox and revisit it at a natural transition point. Then reassess priorities and see if anything needs to move around.&lt;/p&gt;
&lt;h3&gt;Using Time: Stay Focused, Give It Everything&lt;/h3&gt;
&lt;p&gt;Time is the great equalizer — everyone gets 24 hours a day. The key is using that time well enough to have energy left over for what matters.&lt;/p&gt;
&lt;p&gt;A couple of years ago in my year-end review I admitted I wasn&apos;t great at multitasking. I&apos;ve since made some adjustments, and the core insight is this: spend as much of the day in a focused state as possible, and switch contexts as rarely as possible.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&quot;https://www.nytimes.com/2023/05/28/opinion/artificial-intelligence-thinking-minds-concentration.html&quot;&gt;piece in the New York Times&lt;/a&gt; from a few weeks back put it well:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Multitasking is largely a myth. We can only truly focus on one thing at a time. &quot;It&apos;s like we have a mental whiteboard,&quot; says Mark. &quot;If I&apos;m working on one task, my whiteboard is full of everything I need for it. Then I switch to email — I have to erase all of that and rewrite everything I need to write the email. And like a real whiteboard, there&apos;s residue. I might still be thinking about something from three tasks ago.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Working across multiple things at once drains cognitive resources, disrupts working memory, and makes flow states nearly impossible. That&apos;s why staying focused — minimizing distractions and interruptions — matters so much. Come to think of it, almost everything humanity has achieved in culture and philosophy can be traced back to deep, singular attention. And yet as the age of achievement culture rises, that depth of attention keeps getting pushed aside.&lt;/p&gt;
&lt;p&gt;Economics studies how scarce resources are allocated in society. If we replace &quot;social resources&quot; with &quot;personal resources,&quot; the same logic applies. &lt;strong&gt;The scarcest things any individual has are time, energy, attention, and focus&lt;/strong&gt; — spend them on one thing and you can&apos;t spend them on another.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Scarcity&lt;/em&gt; makes the point this way:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The human brain is like a road with its own &quot;bandwidth.&quot; When that road gets jammed with something, cognitive resources run dry — you enter a state of cognitive overload with no room to think about anything else.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The upshot: the secret to effectiveness is &lt;strong&gt;focus&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I&apos;ve been using Rize, which isn&apos;t just a simple time tracker:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231006123136@2x.png&quot; alt=&quot;&quot; /&gt;It&apos;s a tool for building focus. If you stay within the same app or work context for a sustained stretch, you enter a Focus state (similar to flow), and it tracks that time. But if you suddenly jump out — say, you open WeChat or browse a website unrelated to what you&apos;re doing — Rize reads that as distraction, shows a focus reminder, and ends the current focus session.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231006123244@2x.png&quot; alt=&quot;&quot; /&gt;The whole thing is remarkably simple to use — nothing to configure, AI-powered monitoring running entirely in the background, only making itself known when you&apos;re slacking or breaking focus. (Not sponsored, but if you want to try it, you can sign up at &lt;a href=&quot;https://rize.io?code=291287&amp;amp;utm_source=refer&amp;amp;name=Airing&quot;&gt;https://rize.io?code=291287&lt;/a&gt;…)&lt;/p&gt;
&lt;p&gt;Of course, no app can substitute for actually doing the work. There are plenty of time management masters out there operating with nothing more than a blank sheet of paper. No amount of methodology beats just getting things done. What determines the value of your time isn&apos;t what tools you have — it&apos;s what you produce.&lt;/p&gt;
&lt;p&gt;The question for our time isn&apos;t &quot;what does it return right now?&quot; but &quot;how much will it grow, and what possibilities does it open?&quot; Develop your sense of your own abilities and your relationship with time, and learn to allocate your energy and attention wisely — so that from limited time and resources, you can produce more of what matters.&lt;/p&gt;
&lt;p&gt;And there&apos;s no need to be anxious about limited time. Whatever you&apos;re facing, giving it your full effort is its own kind of happiness. Whenever you&apos;re about to do something — big or small, however it ranks in the world&apos;s eyes — throwing yourself into it completely, investing your talent, attention, and time without calculating returns, brings a quiet joy and a sense of self-affirmation from deep inside.&lt;/p&gt;
&lt;p&gt;Maybe it&apos;s as &lt;em&gt;The Shape of Time&lt;/em&gt; from last issue said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Rather than struggling and searching, perhaps it&apos;s better to simply meet it — and maybe in doing so, trace a more beautiful arc of life.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;🌺 Snippets from Life&lt;/h2&gt;
&lt;p&gt;A few moments from the month.&lt;/p&gt;
&lt;p&gt;🔨 &lt;strong&gt;The Engineer Who Does Everything&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Since switching roles I&apos;ve been touching everything — essentially full-stack at this point. My daily deep-dives into rendering keep getting deeper; I&apos;ll get stuck on a small problem for two or three days, and then feel completely triumphant when I crack it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231006124058@2x.png&quot; alt=&quot;&quot; /&gt;Since then, my mood and outlook have kept improving.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/IMG_0409.jpg&quot; alt=&quot;&quot; /&gt;📱 &lt;strong&gt;iPhone 15 Pro&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Got a new phone. Honestly can&apos;t tell much difference =.=&lt;/p&gt;
&lt;p&gt;🐬 &lt;strong&gt;Off-Peak Vacation&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Took a Friday off the week before National Day to make a three-day mini-break, and went to Chimelong for the day.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/IMG_0046.jpg&quot; alt=&quot;&quot; /&gt;🌇 &lt;strong&gt;Sunset&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Walking back to my desk after dinner one evening and catching this sunset.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/IMG_6518.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🎬 Books, Films, and More&lt;/h2&gt;
&lt;p&gt;Here&apos;s what I&apos;ve been reading, watching, and playing recently:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Currently reading: Philosophy | &lt;em&gt;How to Read Das Kapital&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Fiction | &lt;em&gt;Human Extinction&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Oppenheimer&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;No More Bets&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Creation of the Gods I&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;San Andreas&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Transformers: Rise of the Beasts&lt;/em&gt; | ★★☆☆☆&lt;/li&gt;
&lt;li&gt;Currently watching: Anime | &lt;em&gt;Jujutsu Kaisen Season 2&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Anime | &lt;em&gt;Jujutsu Kaisen&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Anime | &lt;em&gt;Fullmetal Alchemist: Brotherhood&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Currently watching: K-drama | &lt;em&gt;Moving&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: J-drama | &lt;em&gt;VIVANT&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: Historical drama | &lt;em&gt;Mysterious Lotus Casebook&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: Modern drama | &lt;em&gt;Pretend Lovers&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Documentary | &lt;em&gt;Planet Earth II&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Currently playing: Switch | &lt;em&gt;The Legend of Zelda: Tears of the Kingdom&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Currently playing: Steam | &lt;em&gt;Forza Horizon 5&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Just got obsessed with Gojo Satoru from anime — and then the manga killed him the very next day… Anyway, &lt;em&gt;Fullmetal Alchemist: Brotherhood&lt;/em&gt; truly earns its legendary status.&lt;/p&gt;
&lt;p&gt;One small announcement: I&apos;ve set up a Telegram channel, using a bot and webhook to build a kind of activity feed. Whenever I publish a new monthly post, blog article, or save a bookmark or article, the bot automatically posts a notification to the channel. If that sounds interesting, feel free to subscribe: &lt;a href=&quot;https://t.me/airingchannel&quot;&gt;https://t.me/airingchannel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20231006125707@2x.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-23&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #22: The Joy of the Present</title><link>https://ursb.me/en/posts/weekly-22/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-22/</guid><description>Reflects on finding joy amid pressure by cherishing the present, alongside a rough stretch of illness, a switch to iOS development, and moving house.</description><pubDate>Sun, 13 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This issue is a record of and reflection on life from May to August 2023.&lt;/p&gt;
&lt;p&gt;I&apos;ve been busy on weekends lately, which caused me to miss a few updates. Thanks to those who nudged me to keep going:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20230810231510@2x.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20230810231537@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;💐 The Joy of the Present&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;The title of this post comes from Omar Khayyam&apos;s &lt;em&gt;Rubaiyat&lt;/em&gt;: &quot;&lt;strong&gt;Enjoy the pleasures of the present, for this moment is your life.&lt;/strong&gt;&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;PS. I&apos;ve always thought of the essays in this monthly as &quot;conversations with myself.&quot; Only when I&apos;m satisfied with how those conversations turn out do I tidy them up and publish them on the blog. So if this one ends up a bit rambling, please be patient — I&apos;m not sure I can fully unpack this topic in a single piece. And if anything reads as preachy, please ignore it; if it is, it&apos;s me preaching to myself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;The Meaning We Chase but Never Quite Catch&lt;/h3&gt;
&lt;p&gt;Has it been a long time since you last felt genuinely happy?&lt;/p&gt;
&lt;p&gt;In today&apos;s environment, the sense of meaning people pursue is often wrapped up in anxiety. We chase the meaning of life, search for our reason for existing, and eventually land on the same conclusion: &quot;work harder&quot; — and so we squeeze ourselves for output, for productivity, for a life packed full of accomplishment, defining our existence under the label of &quot;striving and anxiety.&quot;&lt;/p&gt;
&lt;p&gt;It feels like rowing upstream through fate — stop pushing and you start drifting back. Under that kind of pressure, it&apos;s hard to find peace, hard to fully let go and ask what joy even feels like. Some people go in the opposite direction and give up on meaning altogether, lying flat to escape the anxiety of striving. Others bob endlessly between grinding hard and doing nothing. (How to balance work and life is its own big topic, one tied to each person&apos;s own rhythm — I&apos;ll leave that for another time.)&lt;/p&gt;
&lt;p&gt;Growing up, I often found that moments of happiness outside of studying and work came with a strange and inexplicable sense of guilt. Not by design, but because I&apos;d been raised on stories that glorified suffering — &quot;the bitterness you swallow today will sweeten tomorrow, but if you taste sweetness today, bitterness is just around the corner.&quot;&lt;/p&gt;
&lt;p&gt;Thinking about it now, I believe we only feel fear when we&apos;re out of alignment with our own hearts. That misalignment is what gives rise to anxiety and guilt.&lt;/p&gt;
&lt;p&gt;We&apos;re afraid of not being able to face ourselves honestly.&lt;/p&gt;
&lt;p&gt;We&apos;re afraid of drifting through life without making a mark.&lt;/p&gt;
&lt;p&gt;We&apos;re afraid of chasing meaning and never quite grasping it.&lt;/p&gt;
&lt;p&gt;A mentor once told me: &quot;If your inner world is full, then even a life spent selling buns is a life well lived.&quot;&lt;/p&gt;
&lt;p&gt;I thought about it. He wasn&apos;t encouraging withdrawal from the world, nor resignation in the face of circumstance. If you&apos;ve given everything and found that fate truly cannot be fought, then accept it — &quot;The truth is this sad: not everyone gets to make it big. Some of us are destined to search for meaning in the everyday details of ordinary life.&quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1691909877629_0.png&quot; alt=&quot;&quot; /&gt;Even so, don&apos;t forget the courage it takes to embrace being ordinary.&lt;/p&gt;
&lt;p&gt;If the world can&apos;t be changed, if fate can&apos;t be resisted, the one freedom left to us is how we choose to respond to our circumstances. As Frankl put it: &quot;Everything can be taken from a person but one thing: the last of human freedoms — to choose one&apos;s attitude in any given set of circumstances, to choose one&apos;s own way.&quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1691909958474_0.png&quot; alt=&quot;&quot; /&gt;That reminds me of a line from a behind-the-scenes interview for &lt;em&gt;Soul&lt;/em&gt; that stayed with me: &quot;&lt;strong&gt;Achievement isn&apos;t defined by the outside world — it&apos;s whether you&apos;re living on your own terms.&lt;/strong&gt;&quot;&lt;/p&gt;
&lt;p&gt;So the answer to this problem comes down to &quot;the joy of the present,&quot; with two specific approaches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cherish each moment as it comes&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Develop an awareness of joy in everyday life&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cherishing Each Moment&lt;/h3&gt;
&lt;p&gt;We exist as a series of individual, fleeting moments. What makes us human is precisely that we exist. As Adler put it: &quot;&lt;strong&gt;Life is a succession of instants. The most important thing is this moment, right now.&lt;/strong&gt;&quot;&lt;/p&gt;
&lt;p&gt;The present moment is only the present — no past, no future. Regret about the past and worry about the future are the greatest enemies of our wellbeing, the chief destroyers of our happiness.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1689677717149_0.png&quot; alt=&quot;&quot; /&gt;We often mourn the roads we didn&apos;t take, wondering whether things would have turned out better if we&apos;d chosen differently. But none of it is knowable. The Japanese drama &lt;em&gt;Reset&lt;/em&gt; playfully shows that even the &quot;optimal choices&quot; in life, when you replay them over and over, don&apos;t necessarily lead somewhere better than the original path. Sophia in &lt;em&gt;Finding Heaven&lt;/em&gt; says: &quot;Life is so short, we can&apos;t possibly do everything we want to do. Whatever we do, there&apos;s always something else worth trying, always another road worth walking. So in the end, all we can do — and must do — is make peace with the road we&apos;ve chosen.&quot;&lt;/p&gt;
&lt;p&gt;There is no &quot;what if&quot; in reality. All we have is one present moment after another, and whatever choices we make in each of those moments, given what we know at the time, are the best possible ones.&lt;/p&gt;
&lt;p&gt;Cherish the present. Cherish this very moment. Cherish everything around you. I genuinely hope everyone can learn to feel these moments — and not let them slip away unnoticed.&lt;/p&gt;
&lt;h3&gt;Developing an Awareness of Joy&lt;/h3&gt;
&lt;p&gt;First: it&apos;s joy that forms the bedrock of our happiness, not anything else.&lt;/p&gt;
&lt;p&gt;Under pressure, I tend to gravitate toward lighter, simpler outlets. Maybe the simpler and more unadorned things are, the more they purify the soul. I love reading the posts that show up in the &quot;Daily Douban&quot; feeds — in all those wonderfully odd Douban groups, there&apos;s always someone sharing what made them happy today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;A lot of the time, I feel like I subconsciously think happiness isn&apos;t a serious thing the way work or studying is. So I schedule work and study time, but not time for joy. But sometimes I do spontaneous joyful things — learning a song I love, practicing guitar, watching a movie, journaling, looking up recipes, making milk tea, lying by the windowsill staring into space (watching clouds, watching the elderly and kids downstairs), reading a book related to something I&apos;m wrestling with.&quot; — Luo Tiantian&lt;/li&gt;
&lt;li&gt;&quot;I love watching the sky — watching clouds roll in and out, watching sunsets change color. It&apos;s so relaxing. The sky in Dali lately has been full of rainbow clouds; I waited an entire evening the other day and finally saw just a little bit, which made me so happy. I also love reading with sunlight coming through the curtains, casting light and shadow on the pages — dappled, but quietly joyful. Tidying up a room, sorting things into categories, getting rid of what&apos;s not needed — that&apos;s healing too.&quot; — Romantic Child&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Being able to notice joy in everyday life is an enviable gift, but it&apos;s also a genuinely rare one. In a previous essay, &lt;a href=&quot;https://me.ursb.me/archives/299.html#directory095888137327391123&quot;&gt;&lt;em&gt;On the Value of Existence and the Experience of Life&lt;/em&gt;&lt;/a&gt;, I wrote that &quot;sensitivity defines the boundaries of how we perceive the world.&quot; &lt;em&gt;Demian&lt;/em&gt; continually emphasizes the importance of perception: &quot;As long as he has no awareness of it, he is only a tree, a stone — at most an animal. But when that first glimmer of awareness lights up, he becomes a person.&quot;&lt;/p&gt;
&lt;p&gt;So how do we cultivate this capacity to notice joy? I&apos;ve identified four approaches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Slow down&lt;/li&gt;
&lt;li&gt;Cultivate focus&lt;/li&gt;
&lt;li&gt;Extend your time horizon&lt;/li&gt;
&lt;li&gt;Stay kind&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1. Slow Down&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pull your attention back from the endlessly churning outside world. Don&apos;t let the information flood drag you under. Pay more attention to your inner life, to how each day actually feels. Keeping a journal is a great way to do this — &quot;recording happy experiences and revisiting those feelings makes us happier. Writing about hard things, venting them out, helps release negative emotions and supports emotional recovery.&quot; I wrote about the value of journaling in &lt;a href=&quot;https://weekly.ursb.me/posts/weekly-19/&quot;&gt;&lt;em&gt;WJ.19: The Meaning of a Diary&lt;/em&gt;&lt;/a&gt;, so I won&apos;t repeat it here.&lt;/p&gt;
&lt;p&gt;Our lives only truly exist when we slow down enough to pay attention to them. We pursue efficiency so we can slow down and experience life — not so that we lose life in the process.&lt;/p&gt;
&lt;p&gt;Nothing is more important than sleeping well, being happy, and staying healthy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Cultivate Focus&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;How to Deal with What&apos;s Hard Inside&lt;/em&gt; says: &quot;When we truly deploy all our mental and physical resources — with genuine curiosity about &apos;what&apos;s actually happening here&apos; — to fully perceive an apple, a tree, a person, an event, or the sensations of our own muscles, temperature, heartbeat, or breathing, we instantly enter a state of &apos;selflessness,&apos; and through it, we experience calm, peace, and an unconscious joy.&quot;&lt;/p&gt;
&lt;p&gt;When we pour ourselves completely into whatever we&apos;re doing — immersing ourselves in the feedback and sensation it gives us, living each moment in full — the mind in that flow state becomes perfectly still. No worries, no anxieties. It&apos;s an incredibly comfortable state, a feeling of merging with the world, as though time has stopped and the soul is filled with satisfaction. A true sense of being alive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Extend Your Time Horizon&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Our lives belong to us. Every minute, every second we live is our actual life. If we can&apos;t live it in a way we love, aren&apos;t we just wasting it?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1689659167533_0.png&quot; alt=&quot;&quot; /&gt;Zoom out, and life is vast. Most of us may be ordinary, but none of us are mediocre. We all share the same origin, the same beginning. We come from the same depths — and yet each of us is rushing toward our own destination, trying to leap out of that abyss. We can understand each other, but only each of us can truly understand ourselves.&lt;/p&gt;
&lt;p&gt;Everyone is different. Every life is a journey toward the self — an attempt at a particular path, a quiet call along a particular trail. No one can ever exist as their fully realized, absolute self; every person is striving to find and become that self. Some arrive slowly, others more quickly, but each does it in their own way. Choose to spend your life the way you love, seek out as many experiences as possible, and each present moment will carry its own joy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1689658461558_0.png&quot; alt=&quot;&quot; /&gt;Not everything is such a big deal that it requires this level of constant vigilance and anxiety. Life is supposed to have some unexpected good things in it, things that drift our way by chance.&lt;/p&gt;
&lt;p&gt;See through the world&apos;s pretensions, and the world will be yours.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/image_1689658437726_0.png&quot; alt=&quot;&quot; /&gt;&lt;strong&gt;4. Stay Kind&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I touched on this in &lt;a href=&quot;https://me.ursb.me/archives/299.html#directory095888137327391123&quot;&gt;&lt;em&gt;On the Value of Existence and the Experience of Life&lt;/em&gt;&lt;/a&gt; from the angle of building connection, so I won&apos;t repeat that here.&lt;/p&gt;
&lt;p&gt;What I want to add is something from &lt;em&gt;Siddhartha&lt;/em&gt;: the Buddha Gautama, who understood perfectly the impermanence and illusion of human nature, still deeply loved the world and devoted his entire life to helping and guiding others. &quot;In the heart of this great teacher, love for things outweighed love for words. His actions and his life outweighed his teachings. His bearing meant more than his speech. His greatness lay not in his doctrine or his thoughts, but in his life itself.&quot;&lt;/p&gt;
&lt;p&gt;Having recognized Gautama&apos;s great wisdom, Siddhartha says: &quot;For me, love is the supreme thing. Observing the world, explaining it, or despising it may be what thinkers do. My only concern is to love this world. Not to despise it, not to hate it and myself, but to regard all things with love, wonder, and awe.&quot;&lt;/p&gt;
&lt;p&gt;I think that if one can reach that state — holding love for the world, carrying kindness toward all things — then every moment of life will be the purest joy.&lt;/p&gt;
&lt;h2&gt;🌺 Snippets from Life&lt;/h2&gt;
&lt;p&gt;The past two months have been eventful — the rockiest stretch since I started working. I&apos;ll spare the details, but I went through a period of anxiety and unhappiness before finding my way back (which is why I chose this topic for the issue). Here are a few moments from along the way.&lt;/p&gt;
&lt;p&gt;🐑 &lt;strong&gt;June 1st — COVID&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I finally caught it. The first infection hit hard; I could barely move and had to stay flat in bed, which is why the May issue didn&apos;t happen. On the second day, mid-fever, I noticed my hands and feet going numb, until I could only hold one strange posture and couldn&apos;t move at all. Thank goodness Belle was there — she took me to the hospital. The diagnosis was respiratory alkalosis from hyperventilating, causing tetany in my extremities. Controlling my breathing fixed it. Nothing serious in the end, but the experience had me thinking — I should hold onto every moment, make good use of this precious and finite life.&lt;/p&gt;
&lt;p&gt;🎂 &lt;strong&gt;June 30th — Birthday&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I didn&apos;t post anything for my birthday this year. Honestly, I&apos;ve been dreading it — 28 feels like the age where you start feeling anxious about getting older.&lt;/p&gt;
&lt;p&gt;🤒 &lt;strong&gt;July — Gastroenteritis + Tonsillitis&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Something I ate went wrong, and both hit at once, spiking me to 40°C. The doctor gave me a whole array of medications (to be taken and stored in a specific order). They worked fast — two days and I was back on my feet.&lt;/p&gt;
&lt;p&gt;🏸 &lt;strong&gt;Badminton&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;After recovering, I got back to playing. I choose two out of Wednesday, Saturday, and Sunday each week — roughly two sessions a week.&lt;/p&gt;
&lt;p&gt;👨🏻‍💻 &lt;strong&gt;Work — Transitioning to iOS Development&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A lot has shifted at work lately. I&apos;ve met some genuinely impressive people, and a few who seem to believe in me in a big way. I can feel the weight of their expectations, and I&apos;m honestly afraid of letting them down. All I can do is try my best — focus on the present, do what&apos;s in front of me well. Content-wise, I&apos;ve also moved from web to iOS development, getting into the technical work I actually love. I&apos;ve always wanted to work on client-side development and I finally have that chance. Hoping things keep getting better.&lt;/p&gt;
&lt;p&gt;🏠 &lt;strong&gt;Moving&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Left behind what I&apos;d call a perfect apartment — here&apos;s one last photo in its memory:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/IMG_6288.jpg&quot; alt=&quot;&quot; /&gt;(But the new place is 120 out of 100!)&lt;/p&gt;
&lt;p&gt;👩🏻‍🦯 &lt;strong&gt;W3C&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Joined the W3C Accessibility Working Group. Attended my first working group meeting and saw how the community operates — got to meet a whole lineup of impressive people from around the world. If I can eventually contribute something meaningful to the accessibility space, I&apos;ll feel like I&apos;ve realized one of my career dreams.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20230813143809@2x.png&quot; alt=&quot;&quot; /&gt;🏆 &lt;strong&gt;Company Training&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Participated in a company-level training program over these two months. Met some great people through it — hoping we can stay in touch long after.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/Pasted%20image%2020230810234446.jpeg&quot; alt=&quot;&quot; /&gt;🍵 &lt;strong&gt;Campus Recruiting Talk&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Had the honor of participating in a campus recruiting panel. Met some impressive people around my own age.&lt;/p&gt;
&lt;h2&gt;🎬 Books, Films, and More&lt;/h2&gt;
&lt;p&gt;Here&apos;s what I&apos;ve been reading, watching, and playing over the past two-plus months:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finished: Philosophy | &lt;em&gt;Demian&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Currently reading: Economics | &lt;em&gt;Principles of Economics: Microeconomics&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Drama series | &lt;em&gt;The Fiends&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Drama series | &lt;em&gt;D.P.&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Drama series | &lt;em&gt;The Long Season&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Drama series | &lt;em&gt;The Bad Kids&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Drama series | &lt;em&gt;All Is Well&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: Drama series | &lt;em&gt;Day and Night&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Spider-Man: Across the Spider-Verse&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Missing&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Thor: Love and Thunder&lt;/em&gt; | ★★☆☆☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Guardians of the Galaxy Vol. 3&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Lost in the Stars&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;The Shadowless Tower&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Lost on You&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Rewatched: Film | &lt;em&gt;Shutter Island&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Rewatched: Film | &lt;em&gt;Interstellar&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Rewatched: Film | &lt;em&gt;Inception&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Rewatched: Film | &lt;em&gt;Tenet&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Played: Steam | &lt;em&gt;Thronefall&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Played: Steam | &lt;em&gt;The Shape of Time&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Currently playing: Switch | &lt;em&gt;The Legend of Zelda: Tears of the Kingdom&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Currently playing: Steam | &lt;em&gt;Dave the Diver&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A special recommendation for the indie game &lt;em&gt;The Shape of Time&lt;/em&gt; by NExTStudios and oooooohmygosh:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/Pasted%20image%2020230813164144.png&quot; alt=&quot;&quot; /&gt;&lt;em&gt;The Shape of Time&lt;/em&gt; is composed of &lt;strong&gt;15 scenes&lt;/strong&gt;, drawing on the ideas of many philosophers about time. To borrow from the official description: &quot;Philosophy is usually expressed in words, and time in the numbers of a digital clock — both are hard to make concrete. Unbound by language, &lt;em&gt;The Shape of Time&lt;/em&gt; uses motion, feedback, and sound and visuals to bring time and philosophy into richer, more tangible form. Playing it, you seem to see, hear, and touch the shape of time — and find yourself thinking about life and philosophy, especially in the quiet of late night.&quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/Pasted%20image%2020230813164317.png&quot; alt=&quot;&quot; /&gt;Thought is a finite fragment. Time is a continuous feeling. Rather than struggling and searching, perhaps it&apos;s better to simply meet it — and maybe in doing so, &lt;strong&gt;trace a more beautiful arc of life.&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-22&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #21: Short Video in the Age of Speed</title><link>https://ursb.me/en/posts/weekly-21/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-21/</guid><description>Examines how playback speed, three-minute recaps, and viral songs erode attention, extending to cultural frenzies like Zibo barbecue and the loss of depth.</description><pubDate>Wed, 03 May 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is a record and reflection on my life in April 2023.&lt;/p&gt;
&lt;h2&gt;🚀 Short Video in the Age of Speed&lt;/h2&gt;
&lt;p&gt;I keep a Logseq whiteboard for newsletter topic ideas. When a topic has accumulated enough material, I pull it out and write it up — one way of closing a loop. Once I publish something, I cross it off the board. The backlog tends to hover around five topics.&lt;/p&gt;
&lt;p&gt;Short video has been sitting in the corner of that whiteboard for over half a year. Every time I thought about writing it, the material felt incomplete, the topic too sprawling, and I&apos;d push it off again. What finally motivated me to tackle it now was a confluence of recent news and some changes to Bilibili&apos;s monetization approach that left me with a lot of feelings worth putting into words.&lt;/p&gt;
&lt;h3&gt;The Fracturing of Attention: Playback Speed, Three-Minute Movies, Earworm Hits&lt;/h3&gt;
&lt;p&gt;Since the mobile internet era began, we&apos;ve been absorbing new information almost without pause — trending searches, headlines, push notifications clamoring for eyeballs constantly. At the same time, everyone has choices, so information scatters in all directions. This daily barrage has made our attention increasingly restless. Over time, the window in which people can actually focus keeps shrinking. We become less patient with anything slow-paced or carefully structured, and more insistent on getting more fresh stimulation in less time. The product perfectly designed for this impulse: &lt;strong&gt;playback speed control&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Personally, I dislike speed controls. Film and television are the result of directors and writers distilling their visions — thoughts about life, imaginings of other worlds — into hours of image and sound. They deserve slow watching. The sound design, the rhythm, the cuts, the emotional arcs — all of it depends on the one thing that crosses the boundary between screen and viewer: the flow of time. Speed it up and you lose the signal.&lt;/p&gt;
&lt;p&gt;Take the Miller planet sequence in &lt;em&gt;Interstellar&lt;/em&gt;: the ticking of a stopwatch runs beneath the score, signaling that one hour here equals seven years on Earth, creating the urgent pressure of the team&apos;s situation. There are countless examples like it. If a piece of work requires speed-watching to get through, that probably says something about its information density or lack of depth — in which case, it may not be worth watching at all.&lt;/p&gt;
&lt;p&gt;But in short video, fast-pacing takes an even more extreme form: the three-minute movie recap.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Three-minute movie recaps are neither movies nor commentary — they&apos;re more like highly concentrated dopamine, injected through your eyes, giving you the high of absorbing more information than humanly possible in a very short time. The cost is a slow loss of the ability to empathize with characters, a loss of patience for appreciating light and music — and eventually, the viewing sensibility you worked so hard to build gets completely dismantled. — &lt;a href=&quot;https://www.ifanr.com/1524332&quot;&gt;&quot;&apos;Little Handsome&apos; and &apos;Little Pretty&apos;: Three Minutes to Ruin a Film,&quot; &lt;em&gt;iFanr&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In those three-minute food-for-the-eyes sessions, exquisite cinematography is stripped out entirely, leaving only shocking images to grab attention; carefully layered soundtracks are swapped for aggressive rave beats to keep the adrenaline spiking; taut narrative arcs are reduced to abrupt curiosity-bait. Everything serves the eyeball. Information density is maximized, runtime minimized, the AI voiceover rushed, as if the next second you might leave. And we&apos;ve apparently decided we love this — it hooks our fragile attention and never lets go, a kind of hypnosis that has us swiping forever. Our time gets stolen along with our attention.&lt;/p&gt;
&lt;p&gt;Music isn&apos;t immune either.&lt;/p&gt;
&lt;p&gt;By raw play counts, Jay Chou&apos;s songs might actually be trailing some of the earworm hits from Douyin with ten-billion-plus streams. The fundamental difference between today&apos;s pop and yesterday&apos;s is this: music is no longer driven by aesthetic vision — it&apos;s driven by &lt;strong&gt;user behavior&lt;/strong&gt;. The pipeline for manufacturing Douyin hits is now mature: identify trending emotions, compose, produce, release — the whole process in a single day, every beat calculated by data to land precisely where users feel the most pleasure.&lt;/p&gt;
&lt;p&gt;A 2017 peer-reviewed paper in &lt;em&gt;Musicae Scientiae&lt;/em&gt; analyzed 303 US Top 10 singles from 1986 to 2015 and found that song introductions, which used to run longer than 20 seconds in the 1980s, now come in under 10 seconds. The average song length dropped from about 4:10 to roughly 3:30, and the average among the top 50 US songs of 2021 was just 3:07 — with 38% under three minutes. Attention spans keep shrinking; if a song doesn&apos;t get to something good quickly, listeners leave.&lt;/p&gt;
&lt;p&gt;I&apos;ve been loving Cai Jianya&apos;s &lt;em&gt;Darwin&lt;/em&gt; lately — 28-second intro, 4:25 total runtime — and the classic &lt;em&gt;Love Before Christ&lt;/em&gt; with its intro that, as music producer Chen Jikun says, can stay with you for a lifetime. Today&apos;s productions often open with a wall of sound from the very first note, because holding a listener through an entire song is already an achievement. All you need is a 15-second earworm — something like &lt;em&gt;105 Degrees&lt;/em&gt; — that loops in your head like a virus, relentless while it&apos;s there, and completely forgotten once the season passes, unless you play it again.&lt;/p&gt;
&lt;p&gt;What we can do is slow down. Be patient. Pull our attention back from the relentless churn outside, stop chasing the latest thing, and pay more attention to our inner lives — to what we feel each day, to the sensation of doing something with our hands, to the feedback and reflection that comes from thinking things through.&lt;/p&gt;
&lt;h3&gt;The Cultural Carnival of the Fast Lane: Panda Madness, Zibo BBQ, Toxic Positivity&lt;/h3&gt;
&lt;p&gt;According to Bakhtin&apos;s theory of the carnival, carnival culture has four defining dimensions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Free and familiar contact between people who would normally be separated&lt;/li&gt;
&lt;li&gt;Eccentric, clowning behavior&lt;/li&gt;
&lt;li&gt;Mésalliance — the breakdown of hierarchies&lt;/li&gt;
&lt;li&gt;Profanation — a democratic, &quot;low&quot; sense of life&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Beyond these, carnival has two external characteristics: universality and ritualism. Under Bakhtin&apos;s framework, short video is itself a form of cultural carnival.&lt;/p&gt;
&lt;p&gt;A clear example: the recent nationwide obsession with pandas. I personally love panda photos just because they&apos;re ridiculously cute (especially the giant round-necked Huahua). But after the farewell to Xiang Xiang trended, the emotional register of panda coverage shifted into something distinctly off — I won&apos;t get into the details here.&lt;/p&gt;
&lt;p&gt;Then there was the sudden explosion of Zibo barbecue. Plenty of media analysis tried to explain what made Zibo catch fire and whether the phenomenon could be replicated. The piece from Quanmeipai — &lt;a href=&quot;https://36kr.com/p/2224474401195137&quot;&gt;&lt;em&gt;Zibo BBQ Floods Every Feed: Short Video&apos;s Deity-Making Machine, Social Platform Word-of-Mouth, and the &quot;Internet Sensibility&quot; of Internet Cities&lt;/em&gt;&lt;/a&gt; — highlights two key ideas: short video&apos;s &quot;internet sensibility&quot; and its &quot;sense of presence.&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Short video visibility: presenting vivid, detail-rich footage with visual impact, enhanced by filters and effects. But this kind of high-impact, spectacle-driven visual is hard to sustain — it inevitably enters &quot;deity-making 2.0,&quot; where the emotional, carnivalesque, entertainment-first experience gives way to a process of meaning-production.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On &quot;internet sensibility&quot;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Internet sensibility&quot; refers to the cognitive habits and expressive styles built on internet-mediated information flow and connection. &lt;strong&gt;It means the thoughts and feelings of ordinary internet users finally get noticed — expressed as fragmented, entertainment-oriented, youth-inflected content with emotional hooks, surprising moments, and strong user participation and experiential engagement.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Short video is both visible and connective, which makes manufacturing &quot;presence&quot; its native strength: &quot;creating immersion, retaining user attention and time. In a fragmented, overabundant media environment, enhancing the audience&apos;s sense of scene is the key to spreading more effectively.&quot; (Same source.)&lt;/p&gt;
&lt;p&gt;The viral spread of &quot;toxic positivity&quot; short videos also validates the &quot;presence&quot; theory. From a god&apos;s-eye view, we can easily see that the stories in these videos — daughter-in-law hitting mother-in-law, etc. — are staged fiction. But while we&apos;re actually watching, we get pulled in, we start to believe it, we feel as if we&apos;re there. That&apos;s the &quot;presence&quot; effect.&lt;/p&gt;
&lt;p&gt;Compared to text, short video creates a sense of presence more easily, through performance and dramatization. The feeling is almost immersive — as if you&apos;ve joined a family argument, a collapsing friendship — amplified by exaggerated language, theatrical gestures, and hyper-real simulation. More and more users find themselves unable to stop scrolling.&lt;/p&gt;
&lt;p&gt;Neil Postman once said: &lt;strong&gt;&quot;Modern technology has fundamentally changed people&apos;s relationship to information. In the past, people sought information to solve real problems in their lives. Now they manufacture problems so that useless information has somewhere to go.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Toxic positivity relentlessly pursues the counterintuitive, even the anti-rational — inventing stranger and stranger &quot;problems&quot; to hook eyeballs. That novelty attracts people, and it also warps their cognition.&lt;/p&gt;
&lt;p&gt;As short video producers proliferate and the interaction between creator and audience tightens, these carnival phenomena intensify — and the carnival itself weakens and dissolves people&apos;s capacity to engage with anything serious.&lt;/p&gt;
&lt;p&gt;Which brings me to one last thought, on what I see as the dangerous game being played on Bilibili.&lt;/p&gt;
&lt;h3&gt;The Dangerous Game: Deconstructing the Sacred, Obsessing Over the Surface&lt;/h3&gt;
&lt;p&gt;Recently I saw the story about Bilibili creators stopping their uploads, and the creator &quot;Wooden Fish Water Heart&quot; posted a response:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Going forward, we&apos;ll be producing more and more content. Without abandoning long-form deep dives, we&apos;ll expand into more formats, and we&apos;ll explore more commercial possibilities.&lt;/p&gt;
&lt;p&gt;&apos;Work hard, make good content&apos; — this shouldn&apos;t be a heroic tragedy. It should be the story of standing tall, surviving, and thriving.&lt;/p&gt;
&lt;p&gt;I often think: in an era like this, to be able to produce work like this, and interact with viewers like these — isn&apos;t that the luckiest thing imaginable?&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That prompted me to look into Bilibili&apos;s monetization model and short-video strategy. I won&apos;t go into the Huahuo platform issues, ad revenue problems, or user demographic gaps here — I&apos;ve listed references below for anyone interested. What I do want to talk about is the quiet tragedy of creators doing serious long-form work in an era that is slowly phasing them out.&lt;/p&gt;
&lt;p&gt;Right now, whether it&apos;s long video, short video, written articles, or viral marketing campaigns — the content that breaks through and generates traffic tends to fall into three buckets:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Content that triggers mass anxiety&lt;/strong&gt;: money, poverty, gender dynamics, education, work — think &quot;new grad unemployment,&quot; &quot;layoff waves,&quot; &quot;how to build a side income,&quot; &quot;quitting the city to farm.&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content that latches onto social flashpoints, stirs outrage, and courts curiosity&lt;/strong&gt;: like the Yaya and Tofoo incidents.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content that makes the audience feel superior&lt;/strong&gt;: think NetEase Cloud Music&apos;s various flattering personality quizzes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ask yourself honestly: do I actually need this? &lt;strong&gt;We don&apos;t acquire knowledge to manufacture traffic and signal superiority, or to trick people into clicking. We acquire knowledge to transmit it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The more fragmented and attention-deprived the era, the more we need excellent creators to break through with quality, to sink patiently into long-form work with the warmth of sustained companionship. The more &quot;lay-flat culture&quot; spreads, the more we need bright and passionate moments to pierce the grey fog hanging in the atmosphere of the age.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;It&apos;s undeniable that modern life has become materially rich and stimulating. Modern people happily marinate in fast-consumption culture. They feel no need to think about essence, because they&apos;ve concluded that essence is just a fiction humans made up anyway. Modern people are too clear-eyed for the Sphinx&apos;s riddle to trouble them — they simply don&apos;t need to think about those kinds of strange questions. Live, and be happy. That&apos;s the modern life-hack.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But is this actually &quot;happiness&quot;?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Short video, games, entertainment — these pleasures require no thought and come very easily, but they can also make you lose yourself. We spend a great deal of energy chasing happiness, and yet happiness starts to feel like fast food — thin, momentary, something always missing.&lt;/p&gt;
&lt;p&gt;Short video dunks us briefly into cheap pleasure, lets us forget the version of ourselves that feels purposeless and doesn&apos;t want to try, and it manufactures a feeling of fullness — but in the end, it leaves us emptier and more unsettled than before. The kind of deep, sustained happiness that comes from hard thinking and genuine effort — that&apos;s something none of these substitutes can touch.&lt;/p&gt;
&lt;p&gt;Today&apos;s humans are playing a dangerous game: we&apos;ve abandoned everything sacred, everything essential, convinced ourselves nothing is truly elevated. We deconstruct what&apos;s holy, mock what&apos;s deep, and have elevated self-consciousness and present-moment sensation to an almost absolute position. Phenomenology and existentialism are in vogue — cast aside all essence and depth, follow your feelings, live fully in the present.&lt;/p&gt;
&lt;p&gt;But here&apos;s what that leads to: &lt;strong&gt;when we abandon essence and chase surfaces, when we believe we&apos;ve grown wise, we&apos;ve already begun the journey from human to animal.&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;References and further reading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ifanr.com/1524332&quot;&gt;&quot;&apos;Little Handsome&apos; and &apos;Little Pretty&apos;: Three Minutes to Ruin a Film&quot; | iFanr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mp.weixin.qq.com/s?__biz=MjgzMTAwODI0MA==&amp;amp;mid=2652130451&amp;amp;idx=1&amp;amp;sn=81b0435a420fb1f62d0227f73923f6ac&amp;amp;chksm=9b62da0cac15531a69b2b178a608257848490594bb5b11dfc177f535b1824b1054783b44066a&amp;amp;mpshare=1&amp;amp;scene=1&amp;amp;srcid=0706gGbppEo5FWzQYf6LpaAQ&amp;amp;sharer_sharetime=1657156135777&amp;amp;sharer_shareid=b3d3816607a91fd20809bd0f9b8507f6#rd&quot;&gt;Jay Chou&apos;s &lt;em&gt;Greatest Works of Art&lt;/em&gt;: Full Analysis — He&apos;s Still the King of Music&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://36kr.com/p/2224474401195137&quot;&gt;Zibo BBQ Floods Every Feed: Short Video&apos;s Deity-Making Machine, Social Platform Word-of-Mouth, and the &quot;Internet Sensibility&quot; of Internet Cities&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1XN411w7ro&quot;&gt;How Should Bilibili Save Itself? Reflections from Four Years as a Creator | Smart Roadblock&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mp.weixin.qq.com/s?__biz=MjM5NDAzMjk2MA==&amp;amp;mid=2653590032&amp;amp;idx=1&amp;amp;sn=1f1f78bf0755ed8bcea8c12a854e0d96&amp;amp;chksm=bd53ce3f8a244729e4534ea04536bbe4d9fe48abf0f52739a00e020fff5f4e061f22999981b4&amp;amp;mpshare=1&amp;amp;scene=1&amp;amp;srcid=0430U7vKys8HmcMmNEokjYHV&amp;amp;sharer_sharetime=1682829152935&amp;amp;sharer_shareid=b3d3816607a91fd20809bd0f9b8507f6#rd&quot;&gt;The Difficulty of Making Money on Bilibili | Yicai | &lt;em&gt;Business Is Like This&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🎬 Books, Films &amp;amp; Shows This Month&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Reading: Philosophy | &lt;em&gt;Lectures on Western Philosophy&lt;/em&gt; (Zhao Lin) | ★★★★★ (5.0)&lt;/li&gt;
&lt;li&gt;Reading: Philosophy | &lt;em&gt;Philosophy and Life&lt;/em&gt; (Fu Peirong) | ★★★★☆ (3.5)&lt;/li&gt;
&lt;li&gt;Reading: Non-fiction | &lt;em&gt;Sapiens&lt;/em&gt; | ★★★★☆ (3.5)&lt;/li&gt;
&lt;li&gt;Reading: Science | &lt;em&gt;The Selfish Gene&lt;/em&gt; | ★★★☆☆ (3.0)&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Demon Slayer: Swordsmith Village Arc&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Rewatching: UK Drama | &lt;em&gt;Sherlock&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Rewatching: Film | &lt;em&gt;Buried&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;The Wandering Earth II&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Born to Fly&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Light reading month — I&apos;ll make up for it next month. By the way, strongly recommend Zhao Lin&apos;s &lt;em&gt;Lectures on Western Philosophy&lt;/em&gt;. It brought back the genuine love for philosophy I felt reading his textbooks (co-authored with Deng Xiaomang) while preparing for graduate school entrance exams. That&apos;s the kind of philosophy worth engaging with. No drama-watching or gaming this month — partly because nothing new caught my eye, partly because the off-day schedule disrupted my rhythm, and the project is at a critical stage with a lot of knowledge to absorb.&lt;/p&gt;
&lt;p&gt;This month I took a GPI personality assessment: exceptionally high drive for achievement (9.8/10), emotional regulation also came in at 9.8 as expected (I did manage to stay calm through nine hours of bumper-to-bumper traffic on a holiday weekend — so that tracks). Critical thinking and organization also scored high. But interpersonal and adaptability metrics — sociability, flexibility — came in around 1-something. Something to work on.&lt;/p&gt;
&lt;p&gt;April was a tender, fragrant season. Looking forward to finally playing &lt;em&gt;Tears of the Kingdom&lt;/em&gt; next month.&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-21&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #20: Restart</title><link>https://ursb.me/en/posts/weekly-20/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-20/</guid><description>A March 2023 monthly log centered on the Japanese drama Restart, praising its emotional honesty and warmth, alongside notes on badminton and cycling to work.</description><pubDate>Sun, 02 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is a record and reflection on my life in March 2023.&lt;/p&gt;
&lt;h2&gt;🎬 Books, Films &amp;amp; Shows This Month&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Reading: Novel | &lt;em&gt;Demian&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Reading: Novel | &lt;em&gt;Young Babylon&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Reading: Literature | &lt;em&gt;A History of Western Literature&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: J-Drama | &lt;em&gt;Restart&lt;/em&gt; (&lt;em&gt;Mirai ni Mukatte Hoero&lt;/em&gt;) | ★★★★★★&lt;/li&gt;
&lt;li&gt;Finished: K-Drama | &lt;em&gt;The Glory&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: US Drama | &lt;em&gt;The Last of Us&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Love Letter&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;I&apos;ll Protect You&lt;/em&gt; (&lt;em&gt;Bao Ni Ping An&lt;/em&gt;) | ★★★★☆&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Fullmetal Alchemist: Brotherhood&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;March was basically all shows — no games to speak of. Every weekend I was watching something: &lt;em&gt;The Last of Us&lt;/em&gt;, then &lt;em&gt;The Glory&lt;/em&gt;, then &lt;em&gt;Restart&lt;/em&gt;. Let me go through each one, starting with my all-time favorite: &lt;em&gt;Restart&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Five stars isn&apos;t enough to capture what I want to say about &lt;em&gt;Restart&lt;/em&gt; — so for the first time ever, I&apos;m giving a show six stars. It may only be March, but I&apos;m already calling it my show of the year. The premise: Asami dies in an accident and is told that in her next life she&apos;ll be reincarnated as a giant anteater — unless she lives enough good lives to earn a human rebirth. So she keeps restarting. What makes this show genuinely unlike any other reincarnation drama is how it manages to be, in the truest sense, &quot;quietly extraordinary.&quot; A few of its strengths:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One: Quietly truthful&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The opening forty minutes of Episode 1 are entirely mundane — Asami&apos;s colleagues debating whether you have to say &quot;welcome&quot; to customers if you work at a city hall, a birthday dinner where no one remembered to bring a cake (would the restaurant staff mind?), calculating where her dad hides his secret spending money. The story is dense with dialogue, almost entirely made up of trivial daily back-and-forth, seemingly forgetting that the big &quot;reincarnation&quot; premise even exists. My first reaction was that the first episode felt flat, even a little boring. But this meticulous writing, these small character habits and throwaway observations — all of it is doing something. The scenes accumulate like sediment, creating a quiet sense of reality, until the audience finds themselves believing these characters are close friends, genuinely invested in their fates.&lt;/p&gt;
&lt;p&gt;By the third cycle, I started to see fragments of myself: exhausted from overwork, but late-night visits from good friends somehow make everything feel okay, and that moment of warmth feels like grace.&lt;/p&gt;
&lt;p&gt;By the fourth cycle, everything turns bittersweet. If Asami has spent a hundred years across multiple lives growing distant from her best friends and family, what does human rebirth even mean? After a hundred years of cycling through lifetimes, the thing Asami misses most of all is a distant afternoon in childhood when she and her friends traded stickers. And so do we, as viewers.&lt;/p&gt;
&lt;p&gt;Breaking through the internal emotional momentum of the text, catching the faint fluctuations of a character&apos;s present-moment thought — this truthfulness becomes an incredibly delicate emotional transmission. Without realizing it, I came to think of these characters as real friends.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402165042.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Two: Sees every character as an equal; doesn&apos;t mock any way of living&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A minor character named Shofuku deserves attention. He overestimates his musical ability throughout his life, his career never takes off, he ends up divorced, and eventually works as a karaoke staff member. By conventional metrics, it&apos;s a sad life. But the show&apos;s depiction of him carries a quiet subtext: &lt;strong&gt;no one has the right to evaluate or pity his life&lt;/strong&gt;. As Camus wrote: &quot;&lt;strong&gt;One must imagine Sisyphus happy.&lt;/strong&gt;&quot;&lt;/p&gt;
&lt;p&gt;In the second cycle, Asami briefly considers steering Shofuku&apos;s life toward something &quot;better.&quot; In the end she doesn&apos;t. Years later, she runs into him at the karaoke bar, and their conversation confirms that he&apos;s genuinely content — that his smile is full of happiness. Asami feels a deep relief at her choice not to interfere.&lt;/p&gt;
&lt;p&gt;Ordinary is not the same as mediocre. An ordinary life is at least one you&apos;ve made your own; a mediocre life is one you might look back on and despise. Shofuku is an ordinary working person, but he is trying hard, and he is happy.&lt;/p&gt;
&lt;p&gt;This brings us to the warmer idea underneath the whole show: &lt;strong&gt;living isn&apos;t the point — being happy while living is.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402165118.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Three: A warmer, stronger core&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This drama gives us life as it is — but at the same time it holds something richer, simpler, and more powerful.&lt;/p&gt;
&lt;p&gt;The same is true of great works in general. &lt;strong&gt;A great work doesn&apos;t exist to make the audience relive reality; it takes reality and transforms it into something — transmitting a more intense emotion to the audience.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Too many contemporary works are full of condescension, mockery of their characters and even their viewers. &lt;strong&gt;Deformed aesthetics produce hollow values.&lt;/strong&gt; They treat every natural thing — material, emotional, or moral — as an enemy to be cut away, abandoned, or destroyed, and the more thoroughly it&apos;s cut away, the more &quot;elevated&quot; the work claims to be. The result is a fundamental disconnect from the actual world. Arbitrarily inflicting harm on embodied, natural human feeling doesn&apos;t produce aesthetic pleasure; the spiritual reward it tries to claim is a kind of distorted psychological pathology.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yet here in this world, a person does not exist merely as an individual. Each of us is also a singular, unique point — always a crucial and miraculous node where the world&apos;s ten thousand phenomena cross, full of unrepeatable contingency.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As the anime &lt;em&gt;Nichijou&lt;/em&gt; put it: &lt;strong&gt;Every ordinary day we live through is a string of small, continuous miracles.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;And all we need to do is &lt;strong&gt;feel the waywardness of emotion, reaching for freedom and exploring human nature.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In each of those quiet ordinary days, &lt;em&gt;Restart&lt;/em&gt; writes its story in the colors of kindness, without a word of moralizing, and earns every round of applause. It accepts that individual strength is limited — that even with a chance to reset, you can only improve a little each time. But through those small incremental efforts, you can still polish your own life into something luminous.&lt;/p&gt;
&lt;p&gt;And the ending — the warmest thing of all. Watching the final moments, you feel as if time has stopped and everyone has come back. After a hundred years of wandering in circles, you finally hold on to the people you love most. Rather than becoming human alone, let&apos;s all become pigeons together!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402164927.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;PS: The behind-the-scenes chemistry among the cast is wonderful — the bonus episodes are worth watching!&lt;/p&gt;
&lt;p&gt;Beyond &lt;em&gt;Restart&lt;/em&gt;, both &lt;em&gt;The Last of Us&lt;/em&gt; and &lt;em&gt;The Glory&lt;/em&gt; are perfect-score works in my book. Both have unconventional endings — revenge carried out, abusers not forgiven, no intervention by some lofty &quot;greater good&quot; — and both are deeply satisfying to watch.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Last of Us&lt;/em&gt; stays faithful to the original game but makes smart, restrained adjustments — trimming combat sequences that would have made the show feel like a straightforward video game adaptation. The source material was already a masterpiece, so a faithful adaptation naturally works well, and the performances are exceptional. Joel and Ellie&apos;s actors are just stunning.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402165703.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;With &lt;em&gt;The Glory&lt;/em&gt;, I found myself more drawn to its visual language than its revenge plot. The frequent first-person perspective during bullying sequences deepens audience identification and makes the later revenge feel more cathartic. The lighting contrast when the female lead reveals her scars in moonlight, the four-seasons changes of the banyan tree in the go scenes between teacher and student — gorgeous frames throughout. Some of the sound design is worth studying too.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402165435.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;🌺 Life Moments This Month&lt;/h2&gt;
&lt;p&gt;🏸 Started playing badminton again this month. I hadn&apos;t played since the pandemic hit at the end of last year. Picking the sport back up and meeting interesting people through it — that feels like a gift.&lt;/p&gt;
&lt;p&gt;🚴🏻 Started cycling to work this month. Actually faster than driving, and I&apos;m saving a fair bit on parking every day. By the way, a pedal-assist e-bike on the road feels like cheating in the best possible way.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402222644.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;👩🏻‍🍳 Under the tutelage of Chef B, I&apos;ve been learning to cook — so far: rice cooker chicken legs, blanched shrimp, and oyster-sauce greens. (No photos. It&apos;s edible, and that&apos;s what counts.)&lt;/p&gt;
&lt;p&gt;🦆 One weekend afternoon I sat by the river below my building for hours, just zoning out — watching an egret catch fish, watching the water move, feeling time pass through my fingertips. In that moment I think I finally caught a glimpse of why people enjoy fishing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402222654.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402222701.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;👨‍💻 Feeling a bit adrift about the direction of my work. On a Sunday I went to lunch with senior colleague B, and after that conversation, everything clicked into place. I&apos;d been too fixated on the immediate, too eager for quick results — that was the source of the drift. So I went home and mapped out a career goal for every year of the next seven years. One step at a time, and eventually I&apos;ll reach the top.&lt;/p&gt;
&lt;p&gt;Also that afternoon: went with a friend to test drive an Avatr. The sales person made a strong impression — though very young, their dedication to the job was clear, full of enthusiasm and genuine care. They told me: treat your work with both passion and humility; when it&apos;s time to work, don&apos;t let anything else in, do things beautifully, and good results will follow naturally.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402222715.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;⛺️ Team camping at the foot of Wutong Mountain. Traffic was brutal, but the convertible finally had its moment in the mountains. By the way, a campfire evening in the wilderness hits differently.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402222719.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In short: March was joyful, full, and satisfying — the most satisfying March since I started working. Here&apos;s hoping April is an April of abundance and bloom, an April that catches you off guard with its beauty, a tender and fragrant April. 💐&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230402224028.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-20&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #19: The Meaning of Keeping a Journal</title><link>https://ursb.me/en/posts/weekly-19/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-19/</guid><description>Reflects on six years of journaling as a tool for self-awareness, a way to find meaning in daily life, and a record of small beautiful moments.</description><pubDate>Fri, 03 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;The Meaning of Keeping a Journal&lt;/h2&gt;
&lt;p&gt;At the end of the month, while reviewing my diary to gather material for the monthly post, I stumbled across my entries from February 28th of 2017, 2018, and 2019 on DayOne, and from 2020, 2021, and 2022 on Daylio.&lt;/p&gt;
&lt;p&gt;It was only then I realized — this habit of journaling has been quietly going on for six years. Reading back through those six years felt genuinely strange and moving. So this post is about journals: what they&apos;re actually for.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_5031.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;For me, keeping a journal does three things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&apos;s a tool for self-awareness&lt;/li&gt;
&lt;li&gt;It reflects the meaning back out of daily life&lt;/li&gt;
&lt;li&gt;It records the beautiful things nearby&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;1. A tool for self-awareness&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Self-awareness means noticing your real feelings and emotions, and understanding what you actually need and want, so you can find purpose and meaning in your life.&lt;/p&gt;
&lt;p&gt;One of the great things about journaling is that it helps you understand your own thinking through the accumulation of small daily reflections — like a mindfulness aid that reveals who you are by helping you observe your own emotional states.&lt;/p&gt;
&lt;p&gt;A few years ago in college, I even built an app called &quot;Twin Diary&quot; — its core matching and psychological reporting features were both designed around exactly this idea of self-awareness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Reflecting the meaning back out of daily life&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is fundamentally the same idea as self-awareness, since self-awareness is itself one of the main paths toward finding meaning. But I wanted to pull it out separately and explore it a bit more.&lt;/p&gt;
&lt;p&gt;In an earlier post — &lt;a href=&quot;https://me.ursb.me/archives/299.html&quot;&gt;&lt;em&gt;Thoughts on the Value and Experience of Life&lt;/em&gt;&lt;/a&gt; — I wrote that &quot;life is a string of fleeting moments, and what matters most is the here and now,&quot; and that &quot;the meaning of life is not granted by so-called &apos;milestones&apos; but by the ordinary, unpredictable texture of daily living.&quot;&lt;/p&gt;
&lt;p&gt;The sense of meaning we seek but can&apos;t quite grasp begins, first and foremost, with genuinely throwing yourself into life. Only when you are &quot;truly present&quot; do you build a deep, honest connection with life — and life finds its own way to give back to you.&lt;/p&gt;
&lt;p&gt;In the Japanese tea ceremony tradition, there is the concept of &quot;ichigo ichie&quot; — the idea that this meeting can never happen again, that it is a once-in-a-lifetime encounter, and so both host and guest must give it everything they have. It comes from the Buddhist concept of impermanence: &lt;strong&gt;cherish each passing moment, and pour your whole heart into what may be the only time this ever happens.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The delicious meal in front of you, the fish jumping in the river, the petals falling by the roadside — every moment, every thing can bring a genuine inner joy, a welling-up of happiness. Even fear or anger belongs to the present. All we ever have is our current experience. To be aware of the emotions of the moment, to experience them, to welcome them — that is what it means to be alive.&lt;/p&gt;
&lt;p&gt;And journaling captures each of these &quot;present moments&quot; — these awarenesses and feelings. The notes may never be useful later. But simply writing them down is itself a reflection of life&apos;s meaning, and it produces a kind of quiet fullness: at least this feeling was real, at least this moment wasn&apos;t wasted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Recording the beautiful things nearby&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This one took me four years of journaling to discover: if you&apos;re going to record anything at all, why not record only the good things?&lt;/p&gt;
&lt;p&gt;In last year&apos;s year-end review, I wrote: &quot;When I look back on the day before sleep, I deliberately choose to record only the beautiful things that happened — partly hoping for good dreams, and partly hoping tomorrow might be even better.&quot; And when you look back years later, what you&apos;ll find is a collection of beautiful things. Isn&apos;t that something wonderful in itself?&lt;/p&gt;
&lt;p&gt;May we not spend our whole lives rushing and drifting, but instead bring joy and enthusiasm to the living of a beautiful life.&lt;/p&gt;
&lt;p&gt;I&apos;ll close with a passage from my &lt;a href=&quot;https://me.ursb.me/archives/wwdc19.html&quot;&gt;WWDC 19 travel diary&lt;/a&gt; from 2019:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230304173158.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;This Month&apos;s Log&lt;/h2&gt;
&lt;p&gt;At the start of the month I went on my first-ever work trip, to Beijing for GMTC. The Beijing edition of this conference has been repeatedly postponed since 2020 due to the pandemic, so it was quite the journey just to make it happen.&lt;/p&gt;
&lt;p&gt;In Beijing I got to see an old friend I hadn&apos;t seen in five years. We&apos;d been closest friends once, and I&apos;d assumed we might simply grow apart for good. But when we met again, neither of us could even remember why we&apos;d lost touch. He was exactly the same.&lt;/p&gt;
&lt;p&gt;A few moments from February:&lt;/p&gt;
&lt;p&gt;P1: 🍶 An evening in a quiet, cool Beiluogu Lane. Not run-down — just cool and still, a few scattered lights illuminating the deep hutong. I loved the &quot;bookshop that doesn&apos;t sell books&quot; and a chocolate-focused spot called &quot;Cacao Ballet.&quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230303220049@2x.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;P2: 🍻 Someone jumped in, a small bar deep in the hutong. That night we walked through endless dark alleys for over an hour before finding this place to duck in out of the cold. A few days after returning from Beijing, I saw a blogger I follow had also visited the same bar (I borrowed the photo below from his newsletter). There was a strange sense of time folding over itself. Side note: Beijing shops close incredibly early — almost nowhere to go after 8 or 9pm, and past 10pm you can barely find a ride home QAQ.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_4945.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;P3: 🌺 The plumeria tree downstairs bloomed. Spring is here. I really love the street below my building — it runs alongside a small river, quiet and lovely.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_4974.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;P4: 🍩 Sunset over the sea, with a plane crossing overhead.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_5004.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;P5: 🚗 A rare trip to Guangzhou, but it took nearly eight hours round trip — a day of relentless traffic jams. I seem to attract accidents wherever I go.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_4935.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;P6: 🍾 Friday night, I had friends over to snack, vent, and watch movies.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_4955.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;P7: 🎮 Found an incredibly beautiful scene while doing a Genshin Impact quest.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/IMG_0126.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;P8: 📮 Since I encouraged letter-writing in last month&apos;s post, more friends have started writing. Last month: 20 letters exchanged. Letter correspondence really does feel calmer and more substantial. Readers are welcome to write to me too — airing@ursb.me — about anything at all~&lt;/p&gt;
&lt;p&gt;P9: 📝 On the work front: gave a department presentation, wrote a &lt;a href=&quot;https://me.ursb.me/archives/cross-end.html&quot;&gt;technical article&lt;/a&gt;, took on a sponsored post on Zhihu, studied Android JNI programming, and integrated a debugger into the project&apos;s V8 engine.&lt;/p&gt;
&lt;p&gt;P10: 🎬 This month&apos;s books, films, and shows (apparently my most active month yet):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finished: Novel | &lt;em&gt;Letter from an Unknown Woman&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Novel | &lt;em&gt;The Thirteen Steps&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Reading: Novel | &lt;em&gt;Demian&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Ant-Man and the Wasp: Quantumania&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;The Platform&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Finished: J-Drama | &lt;em&gt;Nagi&apos;s Long Vacation&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watching: US Drama | &lt;em&gt;The Last of Us&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watching: Drama | &lt;em&gt;Three-Body&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Fullmetal Alchemist: Brotherhood&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Playing: Switch | &lt;em&gt;Persona 5 Royal&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Playing: Steam | &lt;em&gt;Red Dead Redemption 2&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-19&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Inside Big Tech&apos;s In-House Cross-Platform Frameworks</title><link>https://ursb.me/en/posts/cross-end/</link><guid isPermaLink="true">https://ursb.me/en/posts/cross-end/</guid><description>A deep dive into four directions behind big tech&apos;s in-house cross-platform frameworks, unpacking how Kun, WebF, and Weex 2.0 choose script engines and implement CSS, with trade-offs compared.</description><pubDate>Sat, 25 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;This article explores cross-platform framework technology — analyzing the technical goals and three evolutionary directions, then diving into the implementation details of custom-rendering cross-platform solutions built internally at major companies, including Kun, WebF, TDF, Weex 2.0, Waft, and MiniX. I&apos;ll examine each framework&apos;s characteristics and limitations, distill the key engineering principles, and close with some thoughts on where the space is headed.&lt;/p&gt;
&lt;p&gt;Along the way, I&apos;ll also touch on script engine selection trade-offs, the challenges each framework faces, how debuggers work, and the engineering thinking behind &quot;one core, multiple ecosystems.&quot;&lt;/p&gt;
&lt;p&gt;Here&apos;s the outline:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Technical goals of cross-platform frameworks (skipped)&lt;/li&gt;
&lt;li&gt;Technical directions&lt;/li&gt;
&lt;li&gt;Technical deep-dives&lt;/li&gt;
&lt;li&gt;Key technical considerations&lt;/li&gt;
&lt;li&gt;Development trends (skipped)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Note 1: This post is the written summary of an offline talk. It omits the background sections (sections 1 and 5) and some extended technical details (parts of sections 3–4), keeping only the core content.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Note 2: The material here comes from publicly available GMTC conference talks, public WeChat official accounts from various companies, open-source framework code, and my own past presentations. Any internal materials have been desensitized.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Technical Directions&lt;/h2&gt;
&lt;p&gt;I&apos;ve grouped cross-platform frameworks into four broad directions.&lt;/p&gt;
&lt;h3&gt;Direction 1: Enhanced WebView&lt;/h3&gt;
&lt;p&gt;WebView enhancement leans frontend — the upper layer still uses web technologies, but the client-side adds capabilities on top. Examples include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hybrid frameworks like Ionic and Cordova&lt;/li&gt;
&lt;li&gt;Mini-programs built on WebView&lt;/li&gt;
&lt;li&gt;Client-side preloading solutions like Sonic&lt;/li&gt;
&lt;li&gt;Offline package solutions for web pages in apps&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These frameworks share a few characteristics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Render using WebView, but supplement it with native capabilities&lt;/li&gt;
&lt;li&gt;Development ecosystem is web-based (mini-programs technically qualify too)&lt;/li&gt;
&lt;li&gt;Various strategies to improve web UX&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Direction 2: DSL-based Native Enhancement&lt;/h3&gt;
&lt;p&gt;DSL-based native enhancement leans toward the client side while borrowing from web design. The development model is native, but the framework architecture draws inspiration from WebView patterns. These frameworks typically define a custom DSL for cross-platform support and dynamic updates.&lt;/p&gt;
&lt;p&gt;Examples: DinamicX (Taobao accessibility framework), MTFlexbox (Meituan), and Alibaba&apos;s &lt;a href=&quot;http://tangram.pingguohe.net/&quot;&gt;Tangram&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Browse their docs and you&apos;ll see a strong resemblance to React Native — the key difference is that developers use the DSL to wire in components.&lt;/p&gt;
&lt;h3&gt;Direction 3: Code Sharing&lt;/h3&gt;
&lt;p&gt;Code sharing is a &quot;big terminal&quot; approach. The best-known implementation is KMM (Kotlin Multiplatform Mobile), which uses the K2 compiler to compile Kotlin source to native output for each platform. Concretely, Kotlin&apos;s compiler frontend generates FIR (with semantic information), which backend compilers for each platform (JVM, LLVM, etc.) then optimize and emit as platform-specific executables.&lt;/p&gt;
&lt;p&gt;KMM&apos;s project structure is straightforward — a shared module and platform-specific shell apps (Android/iOS).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225222623.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;At the moment, the iOS code generation path doesn&apos;t handle multi-threading especially well, which means teams often need to do extra work to optimize for it.&lt;/p&gt;
&lt;h3&gt;Direction 4: GPL-based Native Enhancement&lt;/h3&gt;
&lt;p&gt;I think of GPL-based native enhancement as the &quot;big terminal&quot; synthesis. The concept traces back through history: the PC era had .NET, JVM, and Qt for desktop development; the mobile era had native client developers chasing dynamism while frontend cross-platform developers chased performance. These two paths eventually converged into today&apos;s cross-platform frameworks — mini-programs, Flutter, DSL frameworks, and WASM are all products of this convergence.&lt;/p&gt;
&lt;p&gt;Direction 4 has several categories:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Native rendering components&lt;/strong&gt;: React Native / Hippy 1.0 / Weex 1.0 and similar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-rendering engine&lt;/strong&gt;: Flutter — worth putting in its own tier.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flutter-based self-rendering frameworks&lt;/strong&gt;: Many exist (I once catalogued 20+), including WebF (formerly Kraken), Kun, FMP, and Skyline-based mini-programs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;System graphics library-based self-rendering frameworks&lt;/strong&gt; (Skia / Vulkan / Metal / OpenGL): TDF, Hippy 3.0, Weex 2.0, Waft, etc. Flutter technically belongs here too.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first three directions and the first two categories of Direction 4 are open-source and well-documented. This post focuses on the latter two categories of Direction 4.&lt;/p&gt;
&lt;h2&gt;Technical Deep-Dives&lt;/h2&gt;
&lt;p&gt;I&apos;ve selected a few representative frameworks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Kun&lt;/li&gt;
&lt;li&gt;WebF&lt;/li&gt;
&lt;li&gt;Weex 2.0&lt;/li&gt;
&lt;li&gt;TDF (desensitized, skipped)&lt;/li&gt;
&lt;li&gt;Waft&lt;/li&gt;
&lt;li&gt;MiniX (skipped)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I picked these because they represent distinct technical approaches in their respective niches — worth studying for their application development model, script engine choices, and rendering engine decisions.&lt;/p&gt;
&lt;h3&gt;Kun&lt;/h3&gt;
&lt;p&gt;Kun is a cross-platform framework built by Xianyu (Alibaba&apos;s second-hand goods app) on top of Flutter. It&apos;s not open-source, and the only publicly available writeups are three articles on Xianyu&apos;s WeChat account. The architecture is fairly straightforward — even without the source code you can piece together a reasonable picture.&lt;/p&gt;
&lt;p&gt;The core idea: Kun runs a JS Runtime on top of Flutter. Developers write frontend-style pages; a JS interpreter acts as a glue layer, translating source to Flutter Widgets, which are then passed to Flutter Engine for rendering.&lt;/p&gt;
&lt;p&gt;For the JS engine, they use QuickJS — likely Alibaba&apos;s internal QKing (a QuickJS fork). The debugger supports CDP, and tests are based on Flutter Golden tests.&lt;/p&gt;
&lt;p&gt;For CSS parsing, they use Yoga as a polyfill, converting styles to CSS-in-JS. The parsing module itself borrows from Kraken&apos;s CSSLib. Inline styles are passed from the JS side to Dart via FFI, then parsed into Flutter Widgets.&lt;/p&gt;
&lt;p&gt;Since CSS&apos;s box model and document flow are fundamentally different from Flutter Widget&apos;s styling model, they use a Widget-compositing approach where each Widget layer handles a specific style property. Here&apos;s what a single &lt;code&gt;div&lt;/code&gt; element looks like after composition:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225222654.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Key characteristics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No full W3C standard support (and this is inherently impossible — for instance, CSS-in-JS can&apos;t implement pseudo-classes). Supports subsets of: HTML tags, CSS properties, Web APIs.&lt;/li&gt;
&lt;li&gt;Provides custom Element components implemented in Dart; business teams can implement their own custom Elements on the Dart side.&lt;/li&gt;
&lt;li&gt;Component rendering uses Widget composition.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The New Species in the Big Terminal Domain — KUN&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s/26SCEM6QPhAazydRUq9h3Q&quot;&gt;Third-Generation Terminal Container KUN&apos;s First Big Test&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Exploring KUN&apos;s Loading Performance and Enhanced Experience on Double Eleven&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WebF&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/openwebf/webf&quot;&gt;WebF&lt;/a&gt; was formerly Alibaba&apos;s Kraken. When that team disbanded, part of the codebase went to Kun; the remaining engineers formed the open-source openwebf org, renamed the project WebF, and continued development.&lt;/p&gt;
&lt;p&gt;Here&apos;s WebF&apos;s architecture:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225224007.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Unlike Kun, WebF not only provides JSBinding but also does significant work on the Dart side — enriching RenderObject&apos;s capabilities to align with W3C standards. CSS is implemented in the Dart layer; WebAPIs are implemented in C++, both aligned with W3C specs.&lt;/p&gt;
&lt;p&gt;The script engine is still QuickJS, but with &lt;a href=&quot;https://github.com/openwebf/quickjs&quot;&gt;notable optimizations&lt;/a&gt; worth studying.&lt;/p&gt;
&lt;p&gt;Comparing Kun and WebF reveals two different philosophies for handling CSS.&lt;/p&gt;
&lt;p&gt;Kun&apos;s approach has several issues:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Two Layout passes&lt;/strong&gt; in a single render pipeline — completely unnecessary overhead. Layout is called very frequently, and running it twice significantly impacts performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dart FFI can&apos;t handle the volume of style updates&lt;/strong&gt;. Style changes generate large amounts of data that hit FFI&apos;s throughput limits.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Inline styles are awkward to work with&lt;/strong&gt;, and many CSS properties simply can&apos;t be expressed this way.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are two good solutions for CSS:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Implement CSS in the Dart layer&lt;/strong&gt;, where style updates go through RenderObject&apos;s Layout directly — no FFI needed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implement DOM and CSS entirely in C++&lt;/strong&gt;, cutting Dart out of the loop.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;WebF is Solution 1; Weex 2.0 and TDF go with Solution 2.&lt;/p&gt;
&lt;p&gt;Solution 1 has its own challenge: introducing CSS makes the RenderObject Tree hard to manage. There are two approaches here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Keep RenderObject thin&lt;/strong&gt;: use Flutter Widgets as atomic rendering units, compose them to implement complex styles. This is what Kun does.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Make RenderObject thick&lt;/strong&gt;: embed extensive layout and rendering capabilities directly, letting the style sheet drive RenderObject rendering.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Making RenderObject &quot;thick&quot; is clearly the better approach — the alternative is extremely high complexity (you can see this in Kun&apos;s deeply nested Widget chains). Every style rule requires reasoning through layer after layer, which destroys maintainability.&lt;/p&gt;
&lt;p&gt;I&apos;m bullish on WebF&apos;s approach, and it&apos;s the only one of these frameworks that&apos;s fully open-source. If you&apos;re interested, join the &lt;a href=&quot;https://github.com/openwebf/webf/blob/main/GOVERNANCE.zh-CN.md&quot;&gt;TSC&lt;/a&gt; and help build it.&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwebf/webf&quot;&gt;https://github.com/openwebf/webf&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Shenghuai: &quot;How WebF Achieves High-Performance Flutter + Web Integration&quot; (2022 QCon)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Weex 2.0&lt;/h3&gt;
&lt;p&gt;Weex 2.0 is Alibaba&apos;s internal cross-platform solution, and it has largely achieved a &quot;one core, multiple ecosystems&quot; architecture internally. The technical architecture was completely rebuilt from scratch — the team explored many paths along the way. Based on public presentations, the overall solution is mature and comprehensive, representing a substantial engineering effort.&lt;/p&gt;
&lt;p&gt;Here&apos;s Weex 2.0&apos;s architecture:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225225458.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Key components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WeexAbility&lt;/strong&gt;: Container and capability extension — URL interception, caching, basic APIs, third-party extension support.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WeexFramework&lt;/strong&gt;: Common foundational layer — encapsulates page instances, implements DOM/CSSOM/WebAPI standards, decouples script and rendering engines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QKing&lt;/strong&gt;: Script engine — a heavily customized fork of QuickJS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unicorn&lt;/strong&gt;: Self-built rendering engine — implements full CSS support including node construction, animation, gesture handling, layout, painting, compositing, rasterization, and the full rendering pipeline. Cross-platform.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WeexUIKit&lt;/strong&gt;: Native UI rendering engine — wraps native components.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Like previous frameworks, Weex 2.0 outputs bytecode from jsbundle source. But there are significant improvements: SSA optimizations in the compiler, a heavily optimized JS runtime, and the full pipeline is implemented in C++ — no extra communication overhead, no redundant abstractions, a shorter critical path. The custom Unicorn engine delivers streamlined layout algorithms, fine-grained gesture and animation control, and direct access to the system graphics layer. The entire solution is unrelated to 1.0, and it systematically resolves 1.0&apos;s issues: cross-language communication problems, rendering inconsistencies between platforms, layout algorithm deficiencies, and poor script execution performance.&lt;/p&gt;
&lt;p&gt;By building on Weex 2.0, Alibaba moved away from siloed &quot;stovepipe&quot; solutions. A shared multi-ecosystem kernel pushes standardization of foundational capabilities while still supporting differentiated business scenarios:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225230055.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Menliu: &quot;Architecture and Practice of Taobao&apos;s Next-Generation Self-Rendering Engine&quot; (2023 GMTC)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note: Tencent&apos;s TDF is working toward similar goals — desensitized and not covered here.&lt;/p&gt;
&lt;h3&gt;Waft&lt;/h3&gt;
&lt;p&gt;Waft (WebAssembly Framework for Things) is a self-rendering framework built by the Tmall Genie team using WebAssembly Runtime and Skia. It&apos;s not open-source. While it currently only supports AIoT scenarios rather than general cross-platform use, its technical approach is inherently generalizable — worth examining for its ideas.&lt;/p&gt;
&lt;p&gt;Tmall Genie went through several attempts in AIoT. They started with Android apps, but memory constraints (only a few hundred MB) caused performance problems. They tried cloud-rendered apps — decent experience but server costs were prohibitive. So they explored on-device rendering, leading to Waft.&lt;/p&gt;
&lt;p&gt;Here&apos;s Waft&apos;s architecture:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225230654.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;They also redesigned the loading and rendering pipelines:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225230717.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The scope of work here is considerable, and it doesn&apos;t align well with web standards or the frontend ecosystem.&lt;/p&gt;
&lt;p&gt;For the script engine, they chose WebAssembly and provided this comparison chart:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225230748.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I have some reservations about this choice (they may have internal considerations I&apos;m not aware of):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Fibonacci benchmark is too simple — it doesn&apos;t showcase JS engine strengths in realistic scenarios.&lt;/li&gt;
&lt;li&gt;Comparing AOT against interpreted execution is unfair by definition.&lt;/li&gt;
&lt;li&gt;The QuickJS used appears to be the original version, which has significant headroom for optimization.&lt;/li&gt;
&lt;li&gt;No comparison against JIT-capable engines like V8 or JavaScriptCore.&lt;/li&gt;
&lt;li&gt;No clarification on which WASM implementation was used — different runtimes have very different performance characteristics, some favoring interpreted execution, others AOT/JIT.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Waft itself has known limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Only supports a subset of CSS&lt;/li&gt;
&lt;li&gt;Incomplete W3C standard support (DOM Element, WebAPI)&lt;/li&gt;
&lt;li&gt;Package size may be large (unclear at this point)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These limitations also define Waft&apos;s current applicability — it&apos;s best suited for simple IoT pages.&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nie Xinxin: &quot;Waft: An AIoT Application Development Framework Based on WebAssembly and Skia&quot; (2023 GMTC)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Key Technical Considerations&lt;/h2&gt;
&lt;h3&gt;Dynamism&lt;/h3&gt;
&lt;p&gt;Surveying these frameworks, their use cases include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dynamic content delivery&lt;/li&gt;
&lt;li&gt;IoT&lt;/li&gt;
&lt;li&gt;Desktop&lt;/li&gt;
&lt;li&gt;In-vehicle&lt;/li&gt;
&lt;li&gt;One core, multiple ecosystems&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&apos;s a saying: &quot;A cross-platform framework without dynamic capabilities has no soul.&quot; And it&apos;s worth noting that dynamic update frameworks and cross-platform frameworks actually overlap substantially. I&apos;ve previously summarized five approaches to dynamism:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;WebView-based enhancement&lt;/li&gt;
&lt;li&gt;DSL-based native enhancement&lt;/li&gt;
&lt;li&gt;GPL-based native enhancement&lt;/li&gt;
&lt;li&gt;Plugin-based (Android)&lt;/li&gt;
&lt;li&gt;ObjC runtime dynamism (iOS)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I made a diagram for this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/20230225231814.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: This diagram is from an earlier time — the top-left quadrant should now say &quot;Flutter and other self-rendering frameworks.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The core requirement for all of these is loading and executing code at runtime. Notice that the first three dynamic update approaches map exactly to the three cross-platform technical directions covered earlier.&lt;/p&gt;
&lt;p&gt;The key technical considerations I see:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Script engine&lt;/li&gt;
&lt;li&gt;Rendering engine&lt;/li&gt;
&lt;li&gt;Debugger&lt;/li&gt;
&lt;li&gt;Engineering tooling&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let me go through each.&lt;/p&gt;
&lt;h3&gt;Script Engine&lt;/h3&gt;
&lt;p&gt;Three high-level choices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JS engine&lt;/strong&gt;: Used as a glue layer, doesn&apos;t need JIT for most scenarios.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dart VM&lt;/strong&gt;: Chosen when Flutter Engine is the rendering foundation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WASM&lt;/strong&gt;: Requires designing a DSL and implementing a rendering engine from scratch.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you go the JS engine route, more specific choices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dual-engine approach&lt;/strong&gt;: Use each platform&apos;s native engine — V8 (via j2v8) on Android, JSCore on iOS (zero binary size increment). However, JSCore on iOS can&apos;t enable JIT directly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hermes&lt;/strong&gt;: Meta&apos;s JS engine, designed specifically for Hybrid UI systems like React Native. Works out of the box.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QuickJS&lt;/strong&gt;: Written by Fabrice Bellard, extremely small footprint, solid performance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom JS engine&lt;/strong&gt;: In practice, almost everyone in the industry builds on a QuickJS fork.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Known issues with QuickJS today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No JIT — implement as needed. JIT improves execution speed by an order of magnitude, but as a glue language the priority is different. JIT also increases cold-start time, memory footprint, and binary size — and doesn&apos;t work on iOS.&lt;/li&gt;
&lt;li&gt;Manual GC — hard to manage and maintain, room for improvement.&lt;/li&gt;
&lt;li&gt;Missing line number tracking.&lt;/li&gt;
&lt;li&gt;Missing debugger support — some open-source plugins address this.&lt;/li&gt;
&lt;li&gt;No code cache.&lt;/li&gt;
&lt;li&gt;No inline cache.&lt;/li&gt;
&lt;li&gt;No memory leak detection.&lt;/li&gt;
&lt;li&gt;Bytecode has significant optimization headroom.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Rendering Engine&lt;/h3&gt;
&lt;p&gt;Two main approaches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Based on Flutter Engine&lt;/li&gt;
&lt;li&gt;Based on system graphics libraries: Skia / OpenGL / Metal / Vulkan&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Regardless of choice, the overarching goal is a lean pipeline with synchronous rasterization.&lt;/p&gt;
&lt;h3&gt;Debugger&lt;/h3&gt;
&lt;p&gt;A debugger lets you pause JavaScript runtime execution and inspect internal state in real time — an essential tool for any framework. The major debugging protocols (all the frameworks above implement at least one):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CDP&lt;/strong&gt;: Chrome DevTools Protocol&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DAP&lt;/strong&gt;: Debug Adapter Protocol&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom protocol&lt;/strong&gt;: WeChat mini-programs used a custom protocol in their early days&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Engineering Tooling&lt;/h3&gt;
&lt;p&gt;Engineering tooling should at minimum cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resource loading strategies&lt;/li&gt;
&lt;li&gt;Degradation/fallback handling&lt;/li&gt;
&lt;li&gt;Version management&lt;/li&gt;
&lt;li&gt;Development workflow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Kant framework we built for QQ Music had a detailed design and implementation in this area — worth a separate post.&lt;/p&gt;
&lt;h2&gt;Summary&lt;/h2&gt;
&lt;p&gt;Common problems in self-rendering frameworks and how to address them:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Problem&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Poor developer experience&lt;/td&gt;
&lt;td&gt;Use frontend ecosystem with JS Runtime; provide a debugger; support language services in IDE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incomplete CSS&lt;/td&gt;
&lt;td&gt;Align with standards; if CSS is in Dart, make RenderObject thick&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Style inconsistencies with H5&lt;/td&gt;
&lt;td&gt;Build comprehensive test cases, validate with WPT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Android/iOS inconsistencies&lt;/td&gt;
&lt;td&gt;Leverage existing resources, e.g. build on Flutter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Too few components, poor ecosystem&lt;/td&gt;
&lt;td&gt;Align with W3C standards as fully as possible&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slow JS execution&lt;/td&gt;
&lt;td&gt;Build or heavily optimize the JS engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-standard behavior, can&apos;t reuse community libraries&lt;/td&gt;
&lt;td&gt;Align with W3C standards as fully as possible&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Lessons worth taking away:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Standards first&lt;/li&gt;
&lt;li&gt;Invest in documentation&lt;/li&gt;
&lt;li&gt;Minimize custom work — reuse existing resources wisely&lt;/li&gt;
&lt;li&gt;Developer experience matters deeply&lt;/li&gt;
&lt;li&gt;Pay attention to low-end device performance&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;References and Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Slide deck (desensitized): &lt;a href=&quot;https://weekly.ursb.me/slide/cross-end/&quot;&gt;https://weekly.ursb.me/slide/cross-end/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Menliu: &quot;Architecture and Practice of Taobao&apos;s Next-Generation Self-Rendering Engine&quot; (2023 GMTC)&lt;/li&gt;
&lt;li&gt;Nie Xinxin: &quot;Waft: An AIoT Application Development Framework Based on WebAssembly and Skia&quot; (2023 GMTC)&lt;/li&gt;
&lt;li&gt;Shenghuai: &quot;How WebF Achieves High-Performance Flutter + Web Integration&quot; (2022 QCon)&lt;/li&gt;
&lt;li&gt;Jifeng: &quot;KUN — A New Species in the Big Terminal Domain&quot;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/openwebf/webf/pull/227/files&quot;&gt;openwebf/WebF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Airing: &quot;Kant in QQ Music&quot; (unpublished)&lt;/li&gt;
&lt;li&gt;Airing: &quot;Flutter Dynamic Update Solutions&quot; (unpublished)&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=cross-end&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Weekly #18: Escaping Social Media</title><link>https://ursb.me/en/posts/weekly-18/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-18/</guid><description>Reflects on escaping social media: how it weakens expression, fragments attention, and erodes identity, and shares habits like RSS reading and letter writing.</description><pubDate>Fri, 03 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Escaping Social Media&lt;/h2&gt;
&lt;p&gt;This month I experimented with &quot;escaping social media.&quot; I came away with some thoughts and insights, and I want to share them here in two parts: &lt;strong&gt;why&lt;/strong&gt; I did it, and &lt;strong&gt;how&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;0x01 Why&lt;/h3&gt;
&lt;p&gt;In &lt;a href=&quot;https://weekly.ursb.me/posts/weekly-9/&quot;&gt;Weekly #9: From High Efficiency to High Burnout&lt;/a&gt; I wrote that &quot;mobile internet brings more drain than anything else, and simply being online has started to feel anxious.&quot; Looking back, I think that was imprecise. It&apos;s not the internet itself that drains us — it&apos;s specifically &lt;strong&gt;social media&lt;/strong&gt; within the internet.&lt;/p&gt;
&lt;p&gt;This drain shows up in three specific ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Expressive ability atrophied&lt;/li&gt;
&lt;li&gt;Attention span stolen&lt;/li&gt;
&lt;li&gt;Individual identity erased&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;First: expressive ability atrophied.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Pay attention to the written forms that catch fire on social media — over the past few months we&apos;ve had &quot;Crazy Wednesday Literature,&quot; &quot;Puppy Literature,&quot; &quot;Kitty Literature,&quot; &quot;Unhinged Literature,&quot; &quot;Rat Rat Literature,&quot; all template-driven, fill-in-the-blank formats where virtually every iteration has zero original expressive value. Living in this kind of environment, day after day, does real damage to your ability to articulate yourself, and it creates a split between your online and offline self. Online you can dash off any meme format without thinking, but offline you can&apos;t write a coherent report with a logical flow.&lt;/p&gt;
&lt;p&gt;In an essay called &lt;em&gt;On the Inflation of Language&lt;/em&gt;, the author introduces the concept of &quot;linguistic inflation&quot; — &quot;Currency is the medium for exchanging wealth; language is the medium for expressing thought and emotion. Just as currency inflation comes from a mismatch between money and the wealth behind it, linguistic inflation comes from a mismatch between language and the thoughts and emotions it&apos;s supposed to convey.&quot; When a word or phrase is used carelessly and too often, its meaning erodes. And when the meaning erodes, so does its power to carry real feeling.&lt;/p&gt;
&lt;p&gt;Take &quot;haha.&quot; Once upon a time, &quot;ha&quot; or &quot;haha&quot; genuinely expressed amusement. Now, online, more &quot;ha&quot;s supposedly mean more emotion, and plain &quot;haha&quot; reads as passive-aggressive dismissal — so even when you want to write &quot;haha,&quot; you feel compelled to add extras to avoid seeming cold. That&apos;s linguistic inflation in action. On social media, inflation and the erosion of expressive ability are unavoidable.&lt;/p&gt;
&lt;p&gt;And behind linguistic inflation is a poverty of language — and &lt;strong&gt;a poverty of feeling&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Recommended: &lt;a href=&quot;https://www.bilibili.com/video/BV1he4y1i7cX/&quot;&gt;&lt;em&gt;On the Inflation of Contemporary Language&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Second: attention stolen.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Social media fragments our attention and makes sustained focus feel impossible. There is always new content, always a new notification, and for anyone without ironclad self-discipline, the impulse to check is constant. Information now arrives from so many directions. Even if you&apos;ve never watched &lt;em&gt;Kuang Biao&lt;/em&gt;, you somehow know who the lead actor is, what the memes are, and what scenes were cut. Even if you&apos;ve never heard of a celebrity, if something happens to them, that news will find its way to you. But what does any of it actually matter? What value does it have for my actual life?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;One of the primary reasons social media took hold is that it snapped the connection between the effort required to create something of real value and the amount of attention it received. Instead, it replaced the timeless trade of capitalism with a shallow collectivist exchange: if you pay attention to what I say, I&apos;ll pay attention to what you say, regardless of whether either of us has anything worth saying. — &lt;em&gt;Deep Work&lt;/em&gt;, Cal Newport&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Too much information creates information overload — the brain&apos;s capacity gets packed with a constant churn of meaningless updates, which is itself draining. Beyond that, exposure to an unending stream of social noise desensitizes you. Your threshold rises. You stop reacting to smaller things and find yourself craving bigger and bigger &quot;tea&quot; to satisfy the curiosity itch that social media has cultivated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Third: individual identity erased.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The internet has become our spiritual home and our medium of connection with the world. We live in a &quot;connected society,&quot; where the relationships between people — and between people and things — are now mediated and replaced by &quot;connectivity.&quot; But in this vast network, every unique, multidimensional person is reduced to a thin, abstract node that sends and receives. Individual identity is swallowed up in the ocean of social media. Almost no one quietly contemplates the inner life of some anonymous stranger in a corner of the internet; the steady traffic of emotionless attention is mostly harvested to fuel promotional content. A network like that isn&apos;t worth staying in.&lt;/p&gt;
&lt;h3&gt;0x02 How&lt;/h3&gt;
&lt;p&gt;I tried a few approaches to escape this dynamic. Here are the ones I found genuinely workable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Method 1: Shift from passive consumption to active seeking.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Most of what arrives passively is noise, or content that an algorithm decided you should see. The core move is to flip from passive to active: use RSS to subscribe to newsletters, blogs, email lists, websites, forums, Weibo accounts, and public accounts that you actually care about. Set aside 1–2 fixed windows per day to actively scan what&apos;s there, and only read what you&apos;ve chosen to follow. Maintain your own &quot;input rhythm.&quot; We should be using the internet — not being used by it.&lt;/p&gt;
&lt;p&gt;Beyond that, actively reduce the time you spend &quot;in contact with social media.&quot; Close the Moments feed, turn off WeChat notifications, move WeChat off your home screen. If you genuinely care about a friend, you should choose to go visit their Moments — not wait until their post happens to float up in your feed. The same logic applies to notifications: if someone needs to reach you, they&apos;ll find a way.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Method 2: Write emails instead of chatting.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Replacing quick messages with longer emails is a surprisingly good practice. It forces you to slow down, consolidate your thoughts, and exercise your expressive range — returning your attention to language itself, giving words and feelings their proper texture. Writing a letter also has a certain weight and formality to it, which adds a pleasant sense of ritual to daily life.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Method 3: Set aside time for yourself every day.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Every day I block out time just for myself — about half an hour at noon and another half at night. During this time, no interruptions, no incoming messages; I focus entirely on whatever I want to do: reading, or working on something I care about. This has been invaluable for building sustained focus and making it easier to enter a flow state.&lt;/p&gt;
&lt;h2&gt;This Month&apos;s Log&lt;/h2&gt;
&lt;p&gt;January was genuinely full. I brought my family to Shenzhen to celebrate New Year&apos;s together, used the holiday to do a fairly systematic deep dive into compiler theory (filling some gaps in my foundations), and got to put some of that knowledge to work through a project using Babylon. I settled in to read, exchanged letters with friends, went to see &lt;em&gt;Man Jiang Hong&lt;/em&gt; with family at midnight, dug out my PC and an Xbox Elite controller to finally play &lt;em&gt;Red Dead Redemption 2&lt;/em&gt; — which I&apos;d been wanting to play for ages. Probably the best January I&apos;ve ever had.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Finished: Philosophy | &lt;em&gt;Siddhartha&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Reading: Novel | &lt;em&gt;Young Babylon&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Man Jiang Hong&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Finished: Anime | &lt;em&gt;Spy × Family&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watching: J-Drama | &lt;em&gt;Nagi&apos;s Long Vacation&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Watching: Drama | &lt;em&gt;Three-Body&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Chinese Strange Tales&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Playing: Switch | &lt;em&gt;Persona 5 Royal&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Playing: Steam | &lt;em&gt;Red Dead Redemption 2&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Playing: PS4 | &lt;em&gt;It Takes Two&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-18&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>2022: Peace and Joy</title><link>https://ursb.me/en/posts/summary-2022/</link><guid isPermaLink="true">https://ursb.me/en/posts/summary-2022/</guid><description>A 2022 year in review: a promotion, a deep dive into Chromium and JS engines, better emotional control, a brief romance, and thoughts on Messi and Faker&apos;s title runs.</description><pubDate>Mon, 02 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;And just like that, this is the fifth year-end review. From 2018&apos;s &quot;Settling Into First Principles&quot; to 2019&apos;s &quot;Moving Through, Stopping Often,&quot; then 2020&apos;s &quot;Chasing Sparks,&quot; and last year&apos;s &quot;Finding My Own Way Forward&quot; — this year&apos;s theme, after much deliberation, is &lt;strong&gt;Peace and Joy&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Peace and Joy is partly a summary, but &lt;strong&gt;more than that, it&apos;s an aspiration&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Work&lt;/h2&gt;
&lt;p&gt;Work comes first every year, and this year is no exception — it&apos;s where I put the most energy.&lt;/p&gt;
&lt;p&gt;The year started well: my promotion review in January went through, making me T10 just two and a half years after graduation. Whether this was unprecedented, I don&apos;t know — but the new company policy limiting promotion frequency means it likely won&apos;t be repeated. I&apos;ll be the last.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://me.ursb.me/archives/2021.html&quot;&gt;last year&apos;s review&lt;/a&gt;, I&apos;d flagged &quot;multitasking&quot; as my biggest weakness. Looking back now, that&apos;s essentially solved. My daily reality is managing multiple parallel streams. When something new comes in, I don&apos;t handle it immediately — I capture it in an inbox first. Then, when I reach a natural stopping point, I go to the inbox and prioritize. I check for anything P0; if so, I switch over immediately. Otherwise I handle the next P1 or continue what I was doing.&lt;/p&gt;
&lt;p&gt;Put simply: &lt;strong&gt;inbox + priority levels&lt;/strong&gt; solve the problem.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The inbox prevents anything from falling through the cracks, and filing something there &lt;em&gt;is&lt;/em&gt; a form of handling it — it doesn&apos;t break my current focus. Frequent context-switching is the single biggest source of inefficiency; staying focused is the goal.&lt;/li&gt;
&lt;li&gt;Priority levels let high-stakes items get resolved quickly without derailing overall progress.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This year in Q3 I received the company&apos;s Young Talent Award, with performance scores of 4 and 5 (no sixth consecutive five-star, which I suppose counts as a step back — though honestly, this exceeded my own expectations). The real issue is that this year I didn&apos;t own any particularly complex projects, and I wasn&apos;t satisfied with how far I pushed my technical depth. If I tried to go up for T11 right now, I&apos;d have trouble pointing to much. I talked about this with my manager at year-end and also examined it for myself: my view of problems during day-to-day projects has been too limited.&lt;/p&gt;
&lt;p&gt;Every project — easy or hard, important or routine — has something to teach. Project A, which I complained was just integration work (the core tech was held by an external company), is a case in point: I never stopped to ask myself what it would take to build the equivalent functionality ourselves, without that dependency.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Open Mind&lt;/em&gt; describes something called an &quot;experience-point mindset&quot; — treating work like a co-op game where everything gives XP:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;If a task is repetitive and dull: fine — it&apos;s building my proficiency, making me more fluent with this skill.&lt;/p&gt;
&lt;p&gt;If something unexpected breaks: great — I&apos;ve triggered a hidden challenge, there&apos;s a new objective to complete.&lt;/p&gt;
&lt;p&gt;If a problem was predictable: no problem — this is the main quest I&apos;ve been grinding toward.&lt;/p&gt;
&lt;p&gt;If a task is difficult and demanding: excellent — it offers massive XP and fast growth.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If I could think this way consistently — and not just look for completion — growth would stop being constrained by what projects come my way. I could have done better. That&apos;s this year&apos;s main regret.&lt;/p&gt;
&lt;p&gt;This year I mentored an intern who reminded me strongly of my own internship in 2018 — the first year I ever wrote a review, titled &lt;a href=&quot;https://me.ursb.me/archives/153.html&quot;&gt;&quot;Settling Into First Principles.&quot;&lt;/a&gt; Looking at them made me ask: how much of that original spirit — the one that made me love building things — is still alive in me? When I feel lost, I remind myself: nothing I&apos;m doing is wasted. It&apos;s all nutrients that will help me clear the next level&apos;s boss when the time comes.&lt;/p&gt;
&lt;p&gt;Technical reading this year dug into Chromium and JS engine internals. Articles I wrote:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://me.ursb.me/archives/js-string-to-number-1.html&quot;&gt;Engine Dissection: String-to-Number in JS (Part 1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://me.ursb.me/archives/js-string-to-number-2.html&quot;&gt;Engine Dissection: String-to-Number in JS (Part 2)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://me.ursb.me/archives/case-sensitivity.html&quot;&gt;Case Sensitivity Problems in Frontend Development&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://me.ursb.me/archives/360.html&quot;&gt;Chromium Rendering Pipeline — From Bytecode to Pixels&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://weekly.ursb.me/posts/weekly-14/&quot;&gt;Chromium Rendering Pipeline — Introduction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://weekly.ursb.me/posts/weekly-15/&quot;&gt;Chromium Rendering Pipeline — Parsing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The enthusiasm for technology hasn&apos;t faded. And I see clearly how much more room there is to grow.&lt;/p&gt;
&lt;p&gt;2023 hope: stay steady, stay focused, keep building depth.&lt;/p&gt;
&lt;h2&gt;Learning&lt;/h2&gt;
&lt;p&gt;Two changes in how I learn this year.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First: a new input method.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I started listening to podcasts. I only listen to a couple — &lt;em&gt;Business Is Like This&lt;/em&gt; and Sound-Alive&apos;s &lt;em&gt;Jump Down the Rabbit Hole&lt;/em&gt; — but it&apos;s a useful channel. I also realized my information sources were too slow and too subject to algorithmic filter bubbles. Whole platforms (like Sspai or Juejin) would disappear from my awareness if I forgot to visit them; the tech public accounts I followed kept recycling the same posts. So I built a personal RSS and email digest system (&lt;a href=&quot;https://weekly.ursb.me/posts/weekly-16/&quot;&gt;WJ.16: Personal Information Flow&lt;/a&gt;). The improvement in how I find and organize information is one of the year&apos;s most satisfying wins.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Second: I started writing a newsletter.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Why? Explained in detail in &lt;a href=&quot;https://weekly.ursb.me/posts/weekly-1/&quot;&gt;WJ.1: Why Write a Newsletter&lt;/a&gt;. Worth noting: I paused for two months partway through, realizing my non-technical reading wasn&apos;t rich enough to support weekly issues, and the weekend time wasn&apos;t there either. Quality was sliding. So I shifted to monthly in the last two months.&lt;/p&gt;
&lt;p&gt;Whether anyone reads it or not, I&apos;ll keep writing — for the future version of myself.&lt;/p&gt;
&lt;h2&gt;Emotions&lt;/h2&gt;
&lt;p&gt;Last year&apos;s review flagged &quot;falling into anxiety too easily,&quot; and I set a goal to cultivate emotional steadiness. This year I focused seriously on emotional management. Here&apos;s my mood log for the year — noticeably more green than in previous years.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-emotion.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;When something triggers a rush of irritation, anger, or sadness, I feel it immediately. But I also know, in that moment, that the emotion has taken the wheel. Acting from pure emotion rarely resolves anything.&lt;/p&gt;
&lt;p&gt;I think of emotions as an alarm system — a kind of guard. When the guard announces &quot;you should be angry right now,&quot; I do feel angry. But I also tell myself: this emotion isn&apos;t controllable, and venting it might not solve anything. So I say to the angry guard: &quot;Noted. Stand down. I&apos;ve registered this feeling. Now let&apos;s calm down and analyze the situation — we can process the anger later.&quot;&lt;/p&gt;
&lt;p&gt;And most of the time, by the time I&apos;ve handled the situation — or accepted that I can&apos;t — the negative feeling has dissolved on its own. No need to go back and &quot;process&quot; it.&lt;/p&gt;
&lt;p&gt;I&apos;m not suppressing the anger or sadness. I&apos;m accepting it.&lt;/p&gt;
&lt;p&gt;Another method I love: &lt;em&gt;&quot;Whenever I face something I can&apos;t bring myself to do, I close my eyes and imagine myself at 80 years old, full of regret for every difficulty I avoided, every time I gave up or ran away. I say to myself: how wonderful it would be to be young again. Then I open my eyes — and I&apos;m young again.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Before sleep, I also look back at the day&apos;s mood and selectively record the good things — partly to invite good dreams, partly to greet tomorrow more gently. This is another reason the mood log has trended greener this year.&lt;/p&gt;
&lt;p&gt;A diary should be honest. But choosing to remember the beautiful moments over the petty annoyances — isn&apos;t that a more beautiful way to live?&lt;/p&gt;
&lt;h2&gt;Romance&lt;/h2&gt;
&lt;p&gt;There&apos;s a &lt;a href=&quot;https://me.ursb.me/archives/weekly-3.html&quot;&gt;brief relationship from this past spring&lt;/a&gt; I won&apos;t recount. Even now, looking back, the only thing I find there is warmth. Now it really is just &lt;em&gt;一瞬の夢&lt;/em&gt; — a moment&apos;s dream.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I hope to keep going with the same openness and courage that I carried then.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-006.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Life&lt;/h2&gt;
&lt;p&gt;Moved this year — traded a small flat I&apos;d lived in for three years for a much bigger one.&lt;/p&gt;
&lt;p&gt;I love the sunset view from my window.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-001.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I love the little canal on my way to work.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-002.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Started &lt;strong&gt;intentional spending&lt;/strong&gt; this year. I&apos;d been tracking expenses for six years, but mechanically — recording without thinking. Every month-end summary left me baffled by the total. This year I switched to &lt;em&gt;MoneyThings&lt;/em&gt;, set weekly and monthly spending budgets with a visual progress bar, and actually feel in control now.&lt;/p&gt;
&lt;p&gt;I also bought a car — a MINI F57. I&apos;d originally put a deposit on a Tesla in April (when I was briefly dating someone and thought a car would be convenient for trips to Guangzhou). But I was following the crowd; I didn&apos;t have a real reason. Then I saw a MINI convertible in a TV show and it was instant, complete infatuation. Went home that night, researched the brand&apos;s history and model lineup, test drove the next day, put a deposit down by afternoon. Impulsive? Maybe. But I have zero regrets. It&apos;s got personality, it&apos;s adorable-tough, and I&apos;ve never once spotted the same car in the wild.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-003.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The cats are doing well. Gloves and Puff are fine.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-004.jpeg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-005.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Still haven&apos;t caught COVID as of New Year&apos;s. Hoping that holds a little longer.&lt;/p&gt;
&lt;h2&gt;Dreams Come True&lt;/h2&gt;
&lt;p&gt;A lot happened this year. Filtering out the negative news from society, if I had to pick a theme, I&apos;d say &quot;dreams fulfilled.&quot;&lt;/p&gt;
&lt;p&gt;First, Messi&apos;s World Cup win — from age 19 to 35, how many 16-year chapters does a career contain?&lt;/p&gt;
&lt;p&gt;Then, EDG&apos;s League of Legends world championship — Dasin&apos;s last dance, ten years of chasing a trophy. From fourth-seed underdog to champion, beating the odds in the most dramatic fashion. A perfect final chapter for a competitive career.&lt;/p&gt;
&lt;p&gt;And Ash (Satoshi), Pokémon&apos;s protagonist, finally winning the World Coronation Series Masters Tournament. Twenty-five years: from 1999&apos;s Top 16 in the Indigo League to 2002&apos;s Top 8 in the Johto League, 2005 Top 8 in Hoenn, 2010 Top 4 in Sinnoh, 2013 Top 8 in Unova, then heartbreaking runner-up at the Kalos League in 2016, finally taking the Alola Championship in 2019, and now — 2022 World Champion. Twenty-five years. The writers put him through endless torment, but Ash had long since become the definitive Pokémon Master in everyone&apos;s heart. His story is wrapping up now — I hope the finale gives him and Pikachu the send-off they deserve.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PS. I really wanted the finale to feature his original partners — the promise with the &quot;World&apos;s Strongest Charizard,&quot; the prophecy about climbing to the top with Greninja. Fans never saw those resolved. Twenty-five years, and I don&apos;t want a single loose end.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And then: the &lt;em&gt;Slam Dunk&lt;/em&gt; national finals arc, finally animated. Watching Shohoku play again fulfilled a dream from childhood.&lt;/p&gt;
&lt;p&gt;A year of fulfilled dreams. I hope yours get their moment too.&lt;/p&gt;
&lt;h2&gt;Books, Films &amp;amp; Music&lt;/h2&gt;
&lt;p&gt;Best purchase of the year: a projector. Watched a lot on weekends.&lt;/p&gt;
&lt;h3&gt;TV&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35141236/&quot;&gt;Dont Quit Your Day Job (Zenchi ni Kakareru Mono)&lt;/a&gt;&lt;/em&gt;: ★★★★★ — love the anti-consumerism heroine, love Haruma Miura&apos;s smile.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35142915/&quot;&gt;Confidence Man JP&lt;/a&gt;&lt;/em&gt;: ★★★★★ — watched the series and all four films. Perfect mix of humor, catharsis, and tears. Flawless script. Masami Nagasawa is flawless.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/26720117/&quot;&gt;The Woman Who Sells Houses (Ie wo Uru Onna)&lt;/a&gt;&lt;/em&gt;: ★★★★☆ — fire in the belly when you need it.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35030325/&quot;&gt;All of Us Are Dead (Zombie Hagyo)&lt;/a&gt;&lt;/em&gt;: ★★★★☆ — I&apos;m powerless against zombie content. Every episode hits like Train to Busan.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35524446/&quot;&gt;Extraordinary Attorney Woo&lt;/a&gt;&lt;/em&gt;: ★★★★★ — warm, healing, inexplicably mood-lifting. Also: the MINI F57 in episode... I booked a test drive the next morning.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/30156074/&quot;&gt;The Possessed (Geum Syo Daeha)&lt;/a&gt;&lt;/em&gt;: ★★★☆☆ — watched while eating; soul-swapping concept was fun, execution was melodramatic.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/30291070/&quot;&gt;Reborn Rich (Jabeol-jip Meonnal)&lt;/a&gt;&lt;/em&gt;: ★★★☆☆ — fell apart at the end.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Film&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/6844868/&quot;&gt;A Werewolf Boy&lt;/a&gt;&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35183042/&quot;&gt;Moon Man (Du Xing Yue Qiu)&lt;/a&gt;&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35700395/&quot;&gt;Fall&lt;/a&gt;&lt;/em&gt;: ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/1329562/&quot;&gt;Initial D&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/1296339/&quot;&gt;Before Sunrise&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/1291990/&quot;&gt;Before Sunset&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/26419637/&quot;&gt;Drishyam (Misunderstood Murder)&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/7059671/&quot;&gt;The Best Offer&lt;/a&gt;&lt;/em&gt;: ★★★★★ — the ending is stunning. No spoilers, no subtitles.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/1300613/&quot;&gt;Groundhog Day&lt;/a&gt;&lt;/em&gt;: ★★★★★ — a timeless classic.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/30469922/&quot;&gt;Escape Room 2&lt;/a&gt;&lt;/em&gt;: ★★★☆☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/1300299/&quot;&gt;Memories of Murder (Salinui Chueok)&lt;/a&gt;&lt;/em&gt;: ★★★★★ — Korean cinema really is operating at another level.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/30304994/&quot;&gt;Doctor Strange in the Multiverse of Madness&lt;/a&gt;&lt;/em&gt;: ★★★★☆ — the two magic IPs should have been electrifying; the final product feels thin. Wanda&apos;s personality shift makes me think the director never saw WandaVision.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35505100/&quot;&gt;The Policeman&apos;s Lineage (Yi Gae Gaeong Sa)&lt;/a&gt;&lt;/em&gt;: ★★★★☆ — title screamed &quot;B movie,&quot; actual quality was a pleasant surprise.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/30314848/&quot;&gt;Everything Everywhere All at Once&lt;/a&gt;&lt;/em&gt;: ★★★★★ — boundless imagination with equal technical execution. Masterpiece.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/34874432/&quot;&gt;Loving Someone (Hanataba no You na Koi wo Shita)&lt;/a&gt;&lt;/em&gt;: ★★★★★ — a film that saddens you and then makes you feel strangely free.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/5912992/&quot;&gt;Silenced (Dogani)&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/26933210/&quot;&gt;Spider-Man: No Way Home&lt;/a&gt;&lt;/em&gt;: ★★★★★ — nostalgia points for the three-Spider-Man frame alone.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35613853/&quot;&gt;The Battle at Lake Changjin: Water Gate Bridge&lt;/a&gt;&lt;/em&gt;: ★★★★☆ — watched in theaters with family over Lunar New Year.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/26628357/&quot;&gt;A Man Called Ove&lt;/a&gt;&lt;/em&gt;: ★★★★★ — I adore this kind of quietly warm, slice-of-life film.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Anime&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35118256/&quot;&gt;Cyberpunk: Edgerunners&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/1865703/&quot;&gt;Paprika&lt;/a&gt;&lt;/em&gt;: ★★★★★ — perfect.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/1395091/&quot;&gt;Perfect Blue&lt;/a&gt;&lt;/em&gt;: ★★★★★ — perfect, and terrifying to watch at night.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Summer Time Rendering&lt;/em&gt;: ★★★★★ — the anime pacing is a bit off and the ending music doesn&apos;t land; the manga is better.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/35258427/&quot;&gt;Spy × Family&lt;/a&gt;&lt;/em&gt;: ★★★★★ — consistently delightful.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://movie.douban.com/subject/34813210/&quot;&gt;Demon Slayer: Entertainment District Arc&lt;/a&gt;&lt;/em&gt;: ★★★★★ — great source material plus outstanding animation = perfection.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Pokémon Journeys&lt;/em&gt;: ★★★★☆ (starting from the Eight Masters arc onward)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://book.douban.com/subject/36089614/&quot;&gt;Open Mind (Da Kai Xin Zhi)&lt;/a&gt;&lt;/em&gt;: ★★★★★ — genuinely useful; lots to take away.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://book.douban.com/subject/27200261/&quot;&gt;Masked City (Jia Mian Shan Zhuang)&lt;/a&gt;&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://book.douban.com/subject/35789345/&quot;&gt;Memory Traveler (Ji Yi Lu Xing Zhe)&lt;/a&gt;&lt;/em&gt;: ★★★★☆ — beautiful setup, compelling pace, ending rushed.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://book.douban.com/subject/30210250/&quot;&gt;Who Killed Her (Shei Sha Le Ta)&lt;/a&gt;&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://book.douban.com/subject/34786086/&quot;&gt;The Silent Parade (Chen Mo de Xun You)&lt;/a&gt;&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://book.douban.com/subject/35579316/&quot;&gt;See You in Writing (Jian Zi Ru Mian)&lt;/a&gt;&lt;/em&gt;: ★★★★☆ — first half 4 stars, second half 2 stars.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://book.douban.com/subject/26651926/&quot;&gt;Red Fingers (Hong Zhi)&lt;/a&gt;&lt;/em&gt;: ★★★★★&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://book.douban.com/subject/10740776/&quot;&gt;The Honjin Murders (Zhan Xing Shu Sha Ren Mo Fa)&lt;/a&gt;&lt;/em&gt;: ★★★★★ — pure locked-room mystery; had to read it slowly and watch the video analysis afterward to understand the method fully.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://book.douban.com/subject/35094680/&quot;&gt;The Stalker Who Killed (Tong Chuan Gen Zong Kuang Sha Ren Shi Jian)&lt;/a&gt;&lt;/em&gt;: ★★★★★ — narrative nonfiction by a journalist who never let go of the story. Admirable.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://book.douban.com/subject/26877752/&quot;&gt;Malice (E Yi)&lt;/a&gt;&lt;/em&gt;: ★★★★★ — the unreliable narrator technique is used beautifully.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://book.douban.com/subject/26118072/&quot;&gt;Praying for Rain (Qi Dao Luo Mu Shi)&lt;/a&gt;&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://book.douban.com/subject/25957816/&quot;&gt;Paradox 13&lt;/a&gt;&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;a href=&quot;https://book.douban.com/subject/35494160/&quot;&gt;Project Hail Mary (Wan Jiu Ji Hua)&lt;/a&gt;&lt;/em&gt;: ★★★★☆&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Su Dongpo: A Biography (Su Dong Po Zhuan)&lt;/em&gt;: ★★★★★ — &quot;The greatest happiness in my life is having a brush in my hand and putting words on the page; all the complexities of my heart can flow through it freely. I believe there is no greater pleasure in life than this.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Games&lt;/h3&gt;
&lt;p&gt;Skipping ratings for games — the fact that I finished them means they held me.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Triangle Strategy&lt;/em&gt;: A feast for strategy/tactics fans, and pixel art to boot. Loved it.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Xenoblade Chronicles 3&lt;/em&gt;: Played a few hours, realized it was extremely time-intensive, dropped it.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Pokémon Sword/Shield&lt;/em&gt;: Completed. Plot is weak, gyms are too easy. Haven&apos;t touched the online content.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;13 Sentinels: Aegis Rim&lt;/em&gt;: Playing through it. Story feels slow to open up; withholding judgment.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Persona 5 Royal&lt;/em&gt;: Absolutely deserving of its reputation. Playing at roughly one palace every two weeks; currently at the casino.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Genshin Impact 3.0&lt;/em&gt;: Dendro Archon is great!&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Honor of Kings&lt;/em&gt;: Rarely played before; was usually stuck around Platinum/Diamond. A few months of one daily match and somehow I&apos;ve climbed to the high tiers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;New Year Goals&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Life&lt;/strong&gt;: Cultivate &lt;strong&gt;gratitude&lt;/strong&gt;. Connect with people more. Build real relationships actively. (I met almost no new friends this year.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learning&lt;/strong&gt;: Maintain &lt;strong&gt;curiosity&lt;/strong&gt;. Keep learning openly, for the sake of learning itself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Work&lt;/strong&gt;: Maintain &lt;strong&gt;humility&lt;/strong&gt;. Complete projects, but refuse to set internal limits. Think more. Question more. Act more. Reflect more. Find and grow your influence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mindset&lt;/strong&gt;: Maintain &lt;strong&gt;joy&lt;/strong&gt;. Notice and record the beauty around you. Live a little poetically.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ending with a line from &lt;em&gt;Confidence Man JP&lt;/em&gt;: &lt;strong&gt;&quot;Streams flow ceaselessly, yet every drop is different; foam forms and dissolves on muddy water; nothing lasts forever — so it is with people, creatures, and everything that dwells in this world.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/2022-007.jpeg&quot; alt=&quot;&quot; /&gt;
&lt;strong&gt;May your wishes, and mine, and all the ones floating out there in the air — may they all find their way to a gentle shore.&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2022&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>Weekly #17: Go Where Your Heart Leads</title><link>https://ursb.me/en/posts/weekly-17/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-17/</guid><description>Weekly #17 follows a Bilibili creator drifting across China by bicycle, weaving in Liu Cixin&apos;s The Mountain and Xu Xiake&apos;s travels to reflect on wanderlust and living life on your own terms.</description><pubDate>Sun, 25 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Go Where Your Heart Leads&lt;/h2&gt;
&lt;p&gt;Lately I&apos;ve been obsessed with a Bilibili series called &quot;Xu Yun Roaming China.&quot; The creator posts roughly every two days, documenting his life as a drifter cycling across China and living off the land.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/20221225192143%402x%202.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Xu Yun grew up in the countryside. He hasn&apos;t held a job in two years. He travels with a bicycle, a tent, a sleeping bag, a windbreak, a foam pad, a folding wood-burning stove, a lighter, a pressure cooker, and a power bank with his phone and action camera. He&apos;s ridden to the Sichuan highlands at 5,000 meters elevation and to the northeastern borderlands at minus 30 degrees Celsius.&lt;/p&gt;
&lt;p&gt;Every day he cycles in the wild, avoiding crowds, wandering through nature. At night he pitches his tent alone under bridges, beside roads, in gullies, or in abandoned buildings — which he considers five-star accommodation. Almost every dinner involves gathering firewood, making a fire, and cooking from scratch. He barely sets foot in cities except to resupply.&lt;/p&gt;
&lt;p&gt;Nearly half of each video is him chatting to the camera while he cooks. For him, it&apos;s an asynchronous record of connection; for us, he becomes our eyes into the world.&lt;/p&gt;
&lt;p&gt;When I recommended the videos to friends, they struggled to understand why anyone would choose this life. The comments online are a mix of encouragement, skepticism, sympathy, and gentle warnings.&lt;/p&gt;
&lt;p&gt;In &lt;a href=&quot;https://www.bilibili.com/video/BV1xW4y1s7se/&quot;&gt;one episode&lt;/a&gt;, Xu Yun answered: &lt;strong&gt;&quot;But the road is there, and you have to keep going.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This reminded me of Liu Cixin&apos;s short story &lt;em&gt;The Mountain&lt;/em&gt;. The protagonist is obsessed with climbing, and his answer is: &lt;strong&gt;&quot;We climb the mountain because it is there.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The underground civilization in the story also mirrors humanity&apos;s history of exploration — generation after generation venturing out into the unknown. Curiosity or the desire to conquer, it doesn&apos;t matter: because it is there, they must go. And through the accumulated sacrifice of explorers across generations, the civilization&apos;s Gagarin finally escapes the lightless core to see a brilliant sky full of stars.&lt;/p&gt;
&lt;p&gt;If your heart points somewhere, why not go? Even if it feels like a dream?&lt;/p&gt;
&lt;p&gt;Back in high school, I read &lt;em&gt;Those Things in Ming Dynasty&lt;/em&gt; (&lt;em&gt;Ming Chao Na Xie Shi Er&lt;/em&gt;). Beyond the big names — Wang Yangming, Hai Rui, Zhang Juzheng, Yu Qian — there was one person who quietly moved me the most: Xu Xiake. At the very end of the seven-volume saga, the author used &lt;a href=&quot;https://blog.sina.com.cn/s/blog_49861fd50100culs.html&quot;&gt;Xu Xiake&apos;s story&lt;/a&gt; to close the entire work. It&apos;s one of the most beautifully written passages I&apos;ve read. I&apos;d encourage anyone to revisit it when they have time.&lt;/p&gt;
&lt;p&gt;The author spent all those volumes recounting the rise and fall of a dynasty — emperors and generals, power and ruin — and chose to end with the story of a man who simply traveled. Why?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Before this, I have spoken of many things — rise and fall, lords and kings, the helpless turning of fate, the shifting winds. But this thing, in my personal view, is the most important of all.&lt;/p&gt;
&lt;p&gt;Because I want to tell you: all those great enterprises, all that eternal fame — it&apos;s compost. First it becomes dung, then it becomes dirt.&lt;/p&gt;
&lt;p&gt;You may not understand this now. You will understand it later. If you still don&apos;t understand later, wait longer. If you never understand in your entire life — that&apos;s fine too.&lt;/p&gt;
&lt;p&gt;But this last thing I want to say, it surpasses all of the above, at least in my view.&lt;/p&gt;
&lt;p&gt;Yet this thing, no matter how long I thought about it, I could not find the right words or phrases to express it — in the most annoying terms, it&apos;s something you feel but cannot say.&lt;/p&gt;
&lt;p&gt;Still, I am not the type to annoy people. After exhausting all my books and finding no way to begin, I finally found the right words in an unremarkable, seemingly worthless little item.&lt;/p&gt;
&lt;p&gt;It was a desk calendar — sitting right in front of me, untouched for who knows how long, long past its expiration date.&lt;/p&gt;
&lt;p&gt;I believe heaven placed this calendar on my desk. It watched my years of effort and unbroken persistence, and quietly, patiently, it waited for the end.&lt;/p&gt;
&lt;p&gt;It waited. And on the last day before it would end, I finally opened it — this companion that had been with me all along, that I had never once opened — and there, on its pages, was the final answer.&lt;/p&gt;
&lt;p&gt;I opened it, and there on that calendar was a quote from a famous person whose name wasn&apos;t even clearly identified.&lt;/p&gt;
&lt;p&gt;Yes. This is what I wanted to say. This is what I wanted to express through Xu Xiake — the most perfect closing words, enough to make all kings and heroes look small:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;There is only one definition of success: to live life on your own terms.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;em&gt;Xu Xiake Travels&lt;/em&gt; contain the line: &quot;On the fourth day, I sat quietly all day listening to the sound of melting snow.&quot;&lt;/p&gt;
&lt;p&gt;I stopped to ask myself: what was I doing on the fourth day of this month? Racing after wealth and status? Worn out by family obligations? Anxious about work? Meanwhile, Xu Xiake sat at the summit of Huangshan and listened to snow melt for an entire day.&lt;/p&gt;
&lt;p&gt;Xu Xiake didn&apos;t travel because he intended to write the &lt;em&gt;Xu Xiake Travels&lt;/em&gt;. Xin Qiji didn&apos;t fight to save the country because he intended to compile his &lt;em&gt;Jiaxuan Poetry Collection&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We need to love life itself — not what life is &quot;for.&quot; As Wang Xiaobo said: &quot;I came into this world not to multiply. I came to see how flowers bloom and rivers flow. How the sun rises and where the sunset goes. I live in this world for nothing more than to understand a few things and meet a few interesting ones. Life is an accident, and within it I search for cause and effect.&quot;&lt;/p&gt;
&lt;p&gt;There&apos;s a song I&apos;ve been loving called &quot;A Traveler Passing Through the World.&quot; The lyrics trace a traveler&apos;s encounters and feelings, and end with the line: &quot;That is you — the mark that proves you once existed as a human being.&quot; Life has no inherent meaning; all we have is &quot;a string of fleeting moments,&quot; and those are the traces of our existence.&lt;/p&gt;
&lt;p&gt;What matters most in this life is the experience, the feeling — to embrace the beautiful, to live the life you want.&lt;/p&gt;
&lt;p&gt;I&apos;ll close with something a Pixar designer I admire said in an interview: &lt;strong&gt;&quot;Success is not defined by what&apos;s outside you. It&apos;s whether you&apos;re living the way you want to live.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Float through the world, soul aglow.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Go where your heart leads, with unhurried steps.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;This Month&apos;s Log&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Finished: K-Drama | &lt;em&gt;Reborn Rich&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Watching: J-Drama | &lt;em&gt;Nagi&apos;s Long Vacation&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Three-Body&lt;/em&gt; | ★★☆☆☆&lt;/li&gt;
&lt;li&gt;Playing: Switch | &lt;em&gt;Persona 5 Royal&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Reborn Rich&lt;/em&gt; is a standard power-fantasy isekai setup — started strong, trailed off (though &quot;starting strong&quot; might be generous). Three stars overall. Swapping the leads might have helped; almost all the acting was carried by the grandfather. Looking forward to seeing the finale tonight.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Nagi&apos;s Long Vacation&lt;/em&gt; — still watching. Not loving the forced rehabilitation arc; the writers try to trace genuine harm done to others back to a personal character flaw, which feels like a stretch. That said, I do enjoy the quiet, slice-of-life warmth of Japanese dramas.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Three-Body&lt;/em&gt; (animated) — a single word: disappointing. Gave up after episode four. Many problems, but I&apos;ll leave critique aside and give it this: the marketing team did a fantastic job.&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-17&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #16: My Personal Information Feed</title><link>https://ursb.me/en/posts/weekly-16/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-16/</guid><description>Weekly #16 diagrams a personal information-feed pipeline: Inoreader subscriptions with keyword alerts, Reeder reading shortcuts, and Readwise highlights syncing into Logseq and Obsidian.</description><pubDate>Sat, 03 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The weekly format felt like a bit too much pressure, so I&apos;ve been on a break for a while. After some reflection, I&apos;ve settled into a rhythm of roughly one post every three weeks — which honestly means just going monthly. So this issue is a monthly digest! Here&apos;s a roundup of the interesting things I discovered in November.&lt;/p&gt;
&lt;h2&gt;My Personal Information Feed&lt;/h2&gt;
&lt;p&gt;This issue I want to share how I manage my information diet. Here&apos;s a simple diagram I sketched:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/%E4%BF%A1%E6%81%AF%E6%B5%81%E5%88%86%E4%BA%AB@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This setup works really well for me. Everything funnels into Inoreader or Reeder for reading, and with Readwise, any highlights I make automatically sync to Logseq and other note-taking tools.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: Input — subscribing to information sources.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I subscribe to a mix of WeChat public accounts, notifications for Bilibili uploaders I follow, and RSS feeds from V2EX, Sspai, Juejin, Douban groups, Zhihu trending, and Weibo hot topics. For newsletters I subscribe to, I set up email forwarding so everything flows into Inoreader as a single unified stream.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20221203141149@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 2: Collection — using automation to pre-filter the stream.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I use Inoreader&apos;s rules and monitoring features to watch for keywords in new content. For example, I monitor &quot;Vite&quot; — I built a small webhook forwarding service so whenever Juejin, Zhihu, or the frontend WeChat account &quot;前端Q&quot; publishes something about Vite, Inoreader fires my custom webhook and delivers it to my WeChat Work bot. Instant keyword monitoring.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20221203141427@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Similarly, I monitor the Shenzhen Health Commission&apos;s public account — if a new post&apos;s title contains &quot;daily new cases,&quot; it gets pushed to the bot too, giving me an on-demand Shenzhen pandemic tracker.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 3: Reading — annotating as I go.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I read in either Reeder or directly in Inoreader. Reeder is a native app with a better experience, but both support the same vim-style shortcuts, which makes reading a pleasure:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;J: previous article&lt;/li&gt;
&lt;li&gt;K: next article&lt;/li&gt;
&lt;li&gt;M: mark unread&lt;/li&gt;
&lt;li&gt;S: star&lt;/li&gt;
&lt;li&gt;Space: scroll / next page&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With these shortcuts, I can get through 300+ articles a day, picking out ten or so to star for deeper reading.&lt;/p&gt;
&lt;p&gt;Highlighting is simple — just select text while reading, and annotations sync to Readwise automatically, whether I&apos;m in the reader or taking inline notes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20221203140918@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 4: Organization and output — consolidating notes in Logseq or Obsidian.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Both Logseq and Obsidian have official Readwise plugins that periodically sync highlight notes to local files for further processing and elaboration.&lt;/p&gt;
&lt;p&gt;Readwise highlights output in Logseq:
&lt;img src=&quot;https://airing.ursb.me/image/blog/20221203140509@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Readwise highlights output in Obsidian (with DataView integration):
&lt;img src=&quot;https://airing.ursb.me/image/blog/20221203140653@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;This Month&apos;s Log&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Finished: J-Drama | &lt;em&gt;Love and Fortune&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: J-Drama | &lt;em&gt;Confidence Man JP: Hero Episode&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Anime | &lt;em&gt;Detective Conan: Halloween no Hanayome&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Spy × Family&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Pantheon&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Watching: J-Drama | &lt;em&gt;World&apos;s Strangest Stories (Tales of the Unusual)&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Playing: Switch | &lt;em&gt;Persona 5 Royal&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Confidence Man JP&lt;/em&gt; — highly recommend. I rewatched the Hero episode just this week. Even knowing a twist is coming, when it finally lands, it still manages to get your blood pumping. (PS. Really love Daichi&apos;s character.)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;World&apos;s Strangest Stories&lt;/em&gt; feels like opening a mystery box — you never know if any given short will be brilliant or dull. Averaging it out gives four stars.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Love and Fortune&lt;/em&gt; was advertised as a comedy, but the fourth episode wrecked me. I finally understand why so many people adore Haruma Miura — his smile genuinely reaches right into your chest. He makes you feel the character&apos;s warmth and joy from the inside out. I&apos;m slowly coming to terms with the fact that as you get older, farewells outnumber new encounters, and loss outnumbers gain.&lt;/p&gt;
&lt;p&gt;— &quot;The stream flows on without pause, yet each drop is different. Bubbles form on the surface and dissolve. Nothing lasts. Such is the way of all things in this world.&quot;&lt;/p&gt;
&lt;p&gt;I also loved the female lead&apos;s anti-consumerism philosophy: before buying anything, ask yourself — is this a consumption, a waste, or an investment? Money is exchanged life energy. If what you&apos;re buying isn&apos;t worthy of that life energy, you should love yourself more than you love the material purchase.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/Pasted%20image%2020221203141247.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-16&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>The Chromium Rendering Pipeline — From Bytes to Pixels</title><link>https://ursb.me/en/posts/chromium-renderer/</link><guid isPermaLink="true">https://ursb.me/en/posts/chromium-renderer/</guid><description>A breakdown of Chromium&apos;s browser architecture and process model, tracing how Blink and V8 evolved, and detailing what the main and compositor threads do inside the Render Process.</description><pubDate>Sun, 16 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📌 2026 Expanded Rewrite:&lt;/strong&gt; This 2022 original has been reworked into an &lt;strong&gt;immersive expanded edition&lt;/strong&gt; — Chromium source paths, class hierarchies, algorithm skeletons and diagrams added for every stage, with new deep-dives into LayoutNG / PaintController / SkiaRenderer.&lt;/p&gt;
&lt;p&gt;👉 &lt;strong&gt;Read the new version: &lt;a href=&quot;/immersive/chromium-renderer/&quot;&gt;Bytecode to Pixels — A field map of Chromium&apos;s rendering pipeline&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The original is kept below for archival reference.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Modern Browser Architecture&lt;/h2&gt;
&lt;p&gt;Before diving into the rendering pipeline, let&apos;s establish some foundational knowledge about Chromium&apos;s browser architecture and process model.&lt;/p&gt;
&lt;h3&gt;Two Formulas&lt;/h3&gt;
&lt;p&gt;Formula 1: Browser = Browser Engine + Services&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Safari&lt;/strong&gt; = WebKit + other components, libraries, services&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chrome&lt;/strong&gt; = Chromium + Google service integrations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Edge&lt;/strong&gt; (Chromium) = Chromium + Microsoft service integrations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yandex Browser&lt;/strong&gt; = Chromium + Yandex service integrations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;360 Safe Browser&lt;/strong&gt; = Trident + Chromium + 360 service integrations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chromium&lt;/strong&gt; = Blink + V8 + other components, libraries, services&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Formula 2: Engine = Rendering Engine + JavaScript Engine + Other&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Browser&lt;/th&gt;
&lt;th&gt;Rendering Engine&lt;/th&gt;
&lt;th&gt;JavaScript Engine&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Internet Explorer&lt;/td&gt;
&lt;td&gt;Trident (MSHTML)&lt;/td&gt;
&lt;td&gt;JScript/Chakra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Edge&lt;/td&gt;
&lt;td&gt;EdgeHTML → Blink&lt;/td&gt;
&lt;td&gt;Chakra → V8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Firefox&lt;/td&gt;
&lt;td&gt;Gecko&lt;/td&gt;
&lt;td&gt;SpiderMonkey&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safari&lt;/td&gt;
&lt;td&gt;KHTML → WebKit&lt;/td&gt;
&lt;td&gt;JavaScriptCore&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chrome&lt;/td&gt;
&lt;td&gt;WebKit → Blink&lt;/td&gt;
&lt;td&gt;V8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Opera&lt;/td&gt;
&lt;td&gt;Presto → WebKit → Blink&lt;/td&gt;
&lt;td&gt;Carakan → V8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Notably: aside from Firefox and the long-dead IE, most browsers on the market have converged on either Blink + V8 or WebKit + JavaScriptCore.&lt;/p&gt;
&lt;h3&gt;Rendering Engine&lt;/h3&gt;
&lt;p&gt;The rendering engine parses HTML, CSS, and JavaScript, then renders the page.&lt;/p&gt;
&lt;p&gt;Firefox&apos;s rendering engine includes components for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Document parser (HTML and XML)&lt;/li&gt;
&lt;li&gt;Layout engine with content model&lt;/li&gt;
&lt;li&gt;Style system (CSS, etc.)&lt;/li&gt;
&lt;li&gt;JavaScript runtime (SpiderMonkey)&lt;/li&gt;
&lt;li&gt;Image library&lt;/li&gt;
&lt;li&gt;Networking library (Necko)&lt;/li&gt;
&lt;li&gt;Platform-specific graphics and widget sets for Win32, X, and Mac&lt;/li&gt;
&lt;li&gt;User preferences library&lt;/li&gt;
&lt;li&gt;Mozilla Plug-in API (NPAPI)&lt;/li&gt;
&lt;li&gt;Open Java Interface (OJI) with Sun Java 1.2 JVM&lt;/li&gt;
&lt;li&gt;RDF back end&lt;/li&gt;
&lt;li&gt;Font library&lt;/li&gt;
&lt;li&gt;Security library (NSS)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Now for WebKit&apos;s history: Apple built WebKit in 2001, based on KHTML, as Safari&apos;s rendering engine. Google then based Chromium on WebKit in 2008 — at that point Chrome used WebKit too. In 2010, Apple revamped WebKit into what&apos;s now known as WebKit2 (used in WKWebView and Safari). In 2013, Google forked WebKit and created Blink as Chromium&apos;s rendering engine. Because of the shared open-source lineage, you&apos;ll still see plenty of Apple and WebKit fingerprints in Blink&apos;s source today.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015171504.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Web Platform Tests scores show just how good Chromium&apos;s compatibility is:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015203034.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;JavaScript Engine&lt;/h3&gt;
&lt;p&gt;JavaScript engines are typically embedded modules within a rendering engine, but they&apos;re also highly self-contained and can be used standalone.&lt;/p&gt;
&lt;p&gt;Notable JS engines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SpiderMonkey&lt;/strong&gt;: Mozilla&apos;s engine, written in C/C++, powers Firefox.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rhino&lt;/strong&gt;: Mozilla&apos;s open-source engine, written in Java.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nashorn&lt;/strong&gt;: Bundled with JDK 8+, written in Java.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScriptCore&lt;/strong&gt;: WebKit&apos;s built-in engine, provided as a system library on iOS. Mobile apps can use it without any size overhead — but JIT can&apos;t be enabled in that context.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ChakraCore&lt;/strong&gt;: Microsoft&apos;s open-source engine. Now that Edge uses Chromium, ChakraCore is only used for Edge on iOS (which uses JavaScriptCore) — all other platforms use V8.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;V8&lt;/strong&gt;: Google&apos;s open-source engine, written in C++. Blink&apos;s built-in JS engine, also the engine powering Android WebView. Outstanding performance with JIT enabled, strong ECMAScript compatibility.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JerryScript&lt;/strong&gt;: Samsung&apos;s open-source engine, used in IoT.js.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hermes&lt;/strong&gt;: Meta&apos;s open-source engine, designed for Hybrid UI systems like React Native. Supports loading bytecode directly, shortening JS load time and improving TTI. Optimized bytecode with incremental loading — friendly to mid/low-end devices. Intentionally no JIT — mobile JIT adds warmup latency, increases binary size and memory, and doesn&apos;t work on iOS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QuickJS&lt;/strong&gt;: By FFmpeg author Fabrice Bellard. Extremely small (210 KB), good compatibility. Directly emits bytecode, supports native C module imports, strong performance. Startup time of ~300 μs on single-core machines, minimal memory footprint, uses reference counting. Excellent for Hybrid architectures, game scripting systems, and embedded use.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Engine performance comparison:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015202658.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;ECMAScript standard support:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015202855.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Chromium Process Model&lt;/h2&gt;
&lt;p&gt;Chromium has five process types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Browser Process: 1 instance&lt;/li&gt;
&lt;li&gt;Utility Process: 1 instance&lt;/li&gt;
&lt;li&gt;Viz Process: 1 instance&lt;/li&gt;
&lt;li&gt;Plugin Process: multiple&lt;/li&gt;
&lt;li&gt;Render Process: multiple&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Setting aside Plugin Processes (for Chrome extensions), the three most relevant to rendering are Browser Process, Render Process, and Viz Process.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015203410.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Render Process&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Count: multiple&lt;/li&gt;
&lt;li&gt;Responsibilities: Handles rendering, animation, scrolling, and input events for a single site within a single tab (note: cross-site iframes get their own Render Process).&lt;/li&gt;
&lt;li&gt;Threads:
&lt;ul&gt;
&lt;li&gt;Main thread × 1&lt;/li&gt;
&lt;li&gt;Compositor thread × 1&lt;/li&gt;
&lt;li&gt;Raster thread × 1&lt;/li&gt;
&lt;li&gt;Worker thread × N&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Render Process covers the WebContent area:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015205533.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Main thread&lt;/strong&gt; responsibilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Execute JavaScript&lt;/li&gt;
&lt;li&gt;Event Loop&lt;/li&gt;
&lt;li&gt;Document lifecycle&lt;/li&gt;
&lt;li&gt;Hit-testing&lt;/li&gt;
&lt;li&gt;Event dispatch&lt;/li&gt;
&lt;li&gt;Parsing HTML, CSS, and other data formats&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015204128.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compositor Thread&lt;/strong&gt; responsibilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Input Handler &amp;amp; Hit Tester&lt;/li&gt;
&lt;li&gt;Scroll and animation within WebContent&lt;/li&gt;
&lt;li&gt;Compute optimal layer decomposition&lt;/li&gt;
&lt;li&gt;Coordinate image decoding, drawing, and rasterization tasks (via helpers)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The number of Compositor thread helpers scales with CPU core count.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015204233.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Browser Process&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Count: 1&lt;/li&gt;
&lt;li&gt;Responsibilities: Full ownership of Browser UI (everything outside WebContent) — rendering, animation, routing, input events, etc.&lt;/li&gt;
&lt;li&gt;Threads:
&lt;ul&gt;
&lt;li&gt;Render &amp;amp; Compositing Thread&lt;/li&gt;
&lt;li&gt;Render &amp;amp; Compositing Thread Helpers&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Viz Process&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Count: 1&lt;/li&gt;
&lt;li&gt;Responsibilities: Receives &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/common/quads/compositor_frame.h%3Bl=26?q=viz::CompositorFrame&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;viz::CompositorFrame&lt;/a&gt; from Render Process and Browser Process, composites (Aggregates) them, and uses the GPU to display (Display) the result on screen.&lt;/li&gt;
&lt;li&gt;Threads:
&lt;ul&gt;
&lt;li&gt;GPU main thread&lt;/li&gt;
&lt;li&gt;Display Compositor Thread&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Chromium Process Modes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Process-per-site-instance&lt;/strong&gt; (old default): Tabs that open from each other and belong to the same site (same root domain + protocol) share a Render Process.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Process-per-site&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Process-per-tab&lt;/strong&gt; (current default): Each tab gets its own Render Process. Cross-site iframes within a tab also get a separate Render Process.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Single Process&lt;/strong&gt;: Single-process mode, enabled via startup flags for debugging.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;p&gt;Three tabs open foo.com, bar.com, and baz.com. bar.com and baz.com have no iframes; foo.com&apos;s HTML is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;html&amp;gt;
  &amp;lt;iframe id=one src=&quot;foo.com/other-url&quot;&amp;gt;&amp;lt;/iframe&amp;gt;
  &amp;lt;iframe id=two src=&quot;bar.com&quot;&amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With Process-per-tab, the process model looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015205446.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The Chromium Rendering Pipeline&lt;/h2&gt;
&lt;p&gt;Now for the core subject — the Chromium Rendering Pipeline.&lt;/p&gt;
&lt;p&gt;The rendering pipeline transforms raw bytes from the network into pixels on screen. It consists of 13 stages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Parsing&lt;/li&gt;
&lt;li&gt;Style&lt;/li&gt;
&lt;li&gt;Layout&lt;/li&gt;
&lt;li&gt;Pre-paint&lt;/li&gt;
&lt;li&gt;Paint&lt;/li&gt;
&lt;li&gt;Commit&lt;/li&gt;
&lt;li&gt;Compositing&lt;/li&gt;
&lt;li&gt;Tiling&lt;/li&gt;
&lt;li&gt;Raster&lt;/li&gt;
&lt;li&gt;Activate&lt;/li&gt;
&lt;li&gt;Draw&lt;/li&gt;
&lt;li&gt;Aggregate&lt;/li&gt;
&lt;li&gt;Display&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here&apos;s the full pipeline mapped to module, process, and thread:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015205821.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: This post is an overview — concise, no source code dumps, but with links to the relevant source for each section. Some stages have more detailed companion posts, linked at the top of the relevant section.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Parsing&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;Recommended: &lt;a href=&quot;https://weekly.ursb.me/posts/weekly-15/&quot;&gt;Chromium Rendering Pipeline - Parsing&lt;/a&gt; for an in-depth treatment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015205840.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Module: blink&lt;/li&gt;
&lt;li&gt;Process: Render Process&lt;/li&gt;
&lt;li&gt;Thread: Main thread&lt;/li&gt;
&lt;li&gt;Responsibility: Parse the bytes received from the Browser Process&apos;s network thread and construct a DOM Tree&lt;/li&gt;
&lt;li&gt;Input: bytes&lt;/li&gt;
&lt;li&gt;Output: DOM Tree&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Data flow: bytes → characters → tokens → nodes → DOM Tree&lt;/p&gt;
&lt;p&gt;Five steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Loading&lt;/strong&gt;: Blink receives bytes from the network thread&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conversion&lt;/strong&gt;: HTMLParser converts bytes to characters&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tokenizing&lt;/strong&gt;: Characters are converted to W3C-spec tokens&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lexing&lt;/strong&gt;: Tokens are lexed into Element objects&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DOM construction&lt;/strong&gt;: Elements are assembled into the DOM Tree&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015210704.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Loading&lt;/strong&gt;: Browser process downloads page content → passes to Render Process Content module → &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/loader/document_loader.h;l=123?q=blink::DocumentLoader&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;blink::DocumentLoader&lt;/a&gt; → &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/parser/html_document_parser.h;l=84?q=blink::HTMLDocumentParser&amp;amp;ss=chromium/chromium/src&quot;&gt;blink::HTMLDocumentParser&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015211156.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conversion&lt;/strong&gt; core stack:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#0 blink::HTMLDocumentParser::Append(WTF::String const&amp;amp;)
#1 blink::DecodedDataDocumentParser::UpdateDocument(WTF::String&amp;amp;)
#2 blink::DecodedDataDocumentParser::AppendBytes(char const*, unsigned long)
#3 blink::HTMLDocumentParser::AppendBytes(char const*, unsigned long)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Tokenizing&lt;/strong&gt; core functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;HTMLDocumentParser::Append&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/parser/html_tokenizer.cc;l=221&quot;&gt;HTMLTokenizer::NextToken&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Important: when the parser encounters &lt;code&gt;link&lt;/code&gt;, &lt;code&gt;script&lt;/code&gt;, or &lt;code&gt;img&lt;/code&gt; tags, it fires additional network requests. When it hits &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;, it must finish executing the JavaScript before continuing to parse HTML — JS could modify the DOM (e.g., via &lt;code&gt;document.write()&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lexing&lt;/strong&gt; core function: &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/parser/html_construction_site.h;l=257?q=HTMLConstructionSite::CreateElement&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;HTMLConstructionSite::CreateElement&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nodes are managed with a stack structure: &lt;code&gt;StartTag&lt;/code&gt; tokens push; &lt;code&gt;EndTag&lt;/code&gt; tokens pop.&lt;/p&gt;
&lt;p&gt;For this DOM tree:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div&amp;gt;
  &amp;lt;p&amp;gt;
    &amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/p&amp;gt;
  &amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The push/pop sequence looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015211837.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DOM construction&lt;/strong&gt;: Elements are instantiated into the DOM Tree.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015211940.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Use DevTools to see the Parsing timeline:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016103824@2x.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;For C++-level call stacks, use &lt;a href=&quot;https://perfetto.dev/&quot;&gt;Perfetto&lt;/a&gt; — it shows per-thread call stacks and cross-process communication.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015212114.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Updated pipeline after Parsing:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015212322.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Style&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015212330.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Module: blink&lt;/li&gt;
&lt;li&gt;Process: Render Process&lt;/li&gt;
&lt;li&gt;Thread: Main thread&lt;/li&gt;
&lt;li&gt;Responsibility: Style Engine traverses the DOM, matches CSSOM rules, computes styles (style recalc), and builds the Render Tree&lt;/li&gt;
&lt;li&gt;Input: DOM Tree&lt;/li&gt;
&lt;li&gt;Output: Render Tree&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Render Tree is composed of RenderObjects, each corresponding to a DOM node with attached ComputedStyle.&lt;/p&gt;
&lt;p&gt;ComputedStyle is visible in DevTools&apos; Styles panel:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016103738@2x.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Core function: &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/dom/document.h%3Bl=706?q=document::updateStyle&amp;amp;ss=chromium/chromium/src&quot;&gt;Document::UpdateStyleAndLayout&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The style computation pipeline:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015213034.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Three sub-stages:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CSS Loading&lt;/strong&gt;: Note that the browser blocks rendering until both DOM and CSSOM are ready — rendering a DOM without styles would be meaningless.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;The browser blocks rendering until it has both the DOM and the CSSOM.&quot; — Render blocking CSS&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;CSS Parsing&lt;/strong&gt;: Data flow is bytes → characters → tokens → StyleRules → RuleMap.&lt;/p&gt;
&lt;p&gt;CSS tokens include types like:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015213557.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Worth noting: &lt;code&gt;FunctionToken&lt;/code&gt; requires extra computation. Blink stores colors as RGBA32 internally (&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/css/css_color.h;l=23?q=CSSColor::Create&amp;amp;ss=chromium/chromium/src&quot;&gt;CSSColor::Create&lt;/a&gt;). In my micro-benchmarks, hex color parsing is about 15% faster than rgb().&lt;/p&gt;
&lt;p&gt;tokens → StyleRule: StyleRules = selectors + property sets. CSS selectors are parsed &lt;strong&gt;right-to-left&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For this CSS:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.text .hello {
    color: rgb(200, 200, 200);
    width: calc(100% - 20px);
}
#world {
    margin: 20px;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The parse result:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;selector text = &quot;.text .hello&quot;
value = &quot;hello&quot; matchType = &quot;Class&quot; relation = &quot;Descendant&quot;
tag history selector text = &quot;.text&quot;
value = &quot;text&quot; matchType = &quot;Class&quot; relation = &quot;SubSelector&quot;
selector text = &quot;#world&quot;
value = &quot;world&quot; matchType = &quot;Id&quot; relation = &quot;SubSelector&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Blink&apos;s default style loading order: &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/resources/html.css&quot;&gt;html.css&lt;/a&gt; → &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/resources/quirks.css&quot;&gt;quirk.css&lt;/a&gt; → platform CSS (android/linux/mac.css) → page styles.&lt;/p&gt;
&lt;p&gt;StyleRules → RuleMap: All StyleRules are grouped by selector type into separate Maps for efficient matching. The Maps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;id_rules_&lt;/code&gt;: ID selector rules&lt;/li&gt;
&lt;li&gt;&lt;code&gt;class_rules_&lt;/code&gt;: Class selector rules&lt;/li&gt;
&lt;li&gt;&lt;code&gt;attr_rules_&lt;/code&gt;: Attribute selector rules&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tag_rules_&lt;/code&gt;: Tag selector rules&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ua_shadow_pseudo_element_rules_&lt;/code&gt;: Pseudo-class selector rules&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Recommended reading: &lt;code&gt;blink/renderer/core/css/rule_set.h&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;CSS Computation&lt;/strong&gt;: Produces ComputedStyle.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015214137.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Why compute? Multiple selectors may match a DOM node; inherited and UA-provided properties also apply. Style priority order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://css-tricks.com/css-cascade-layers/&quot;&gt;Cascade layers&lt;/a&gt; order&lt;/li&gt;
&lt;li&gt;Selector specificity&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://drafts.csswg.org/css-cascade-6/Overview.bs&quot;&gt;Proximity&lt;/a&gt; ordering&lt;/li&gt;
&lt;li&gt;Declaration order&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Many people know that specificity is additive — but that&apos;s just priority level 2. When the first three levels are tied, the rule declared &lt;em&gt;later&lt;/em&gt; in the source wins.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015214542.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;h1&lt;/code&gt; here is blue regardless of the class order (&lt;code&gt;main-heading 2 main-heading&lt;/code&gt; or reversed) — because &lt;code&gt;.main-heading2&lt;/code&gt; is declared later and wins on declaration order.&lt;/p&gt;
&lt;h3&gt;Layout&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215600.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Module: blink&lt;/li&gt;
&lt;li&gt;Process: Render Process&lt;/li&gt;
&lt;li&gt;Thread: Main thread&lt;/li&gt;
&lt;li&gt;Responsibility: Compute geometric properties (position and size) for elements&lt;/li&gt;
&lt;li&gt;Input: Render Tree&lt;/li&gt;
&lt;li&gt;Output: Layout Tree&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each LayoutObject records position and size for its corresponding RenderObject. A LayoutObject has a LayoutRect with &lt;code&gt;x&lt;/code&gt;, &lt;code&gt;y&lt;/code&gt;, &lt;code&gt;width&lt;/code&gt;, &lt;code&gt;height&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Note: LayoutObject and DOM Node are not in 1:1 correspondence.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215041.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Core function: &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/dom/document.h%3Bl=706?q=document::updateStyle&amp;amp;ss=chromium/chromium/src&quot;&gt;Document::UpdateStyleAndLayout&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;To minimize layout (reflow), key strategies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Change &lt;code&gt;className&lt;/code&gt; instead of inline &lt;code&gt;style&lt;/code&gt; — avoids CSSOM regeneration and compositing&lt;/li&gt;
&lt;li&gt;Take frequently reflowing elements &quot;offline&quot;&lt;/li&gt;
&lt;li&gt;Replace properties that trigger reflow with equivalents that don&apos;t&lt;/li&gt;
&lt;li&gt;Isolate reflow to specific layers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Reference &lt;a href=&quot;https://www.lmame-geek.com/&quot;&gt;CSS Triggers&lt;/a&gt; for which CSS properties trigger Layout, Paint, and Compositor on each browser engine.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215506.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Pre-paint&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215607.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Module: blink&lt;/li&gt;
&lt;li&gt;Process: Render Process&lt;/li&gt;
&lt;li&gt;Thread: Main thread&lt;/li&gt;
&lt;li&gt;Responsibility: Generate Property Trees for the Compositor thread, preventing redundant rasterization&lt;/li&gt;
&lt;li&gt;Input: Layout Tree&lt;/li&gt;
&lt;li&gt;Output: Property Tree&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Using Property Trees, Chromium can independently apply transforms, clips, effects, and scrolls to a node without affecting its children.&lt;/p&gt;
&lt;p&gt;Core functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/paint/pre_paint_tree_walk.h%3Bl=34?q=Prepainttreewalk::walk&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;Prepainttreewalk::WalkTree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/paint/paint_property_tree_builder.h&quot;&gt;PaintPropertyTreeBuilder&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215716.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Newer Chromium versions use CAP (composite after paint) mode.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Property Trees&lt;/strong&gt; consist of four trees:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215807.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Paint&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015215947.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Module: blink&lt;/li&gt;
&lt;li&gt;Process: Render Process&lt;/li&gt;
&lt;li&gt;Thread: Main thread&lt;/li&gt;
&lt;li&gt;Responsibility: Blink calls cc&apos;s drawing interfaces to produce &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/layers/layer.h;l=86;drc=416bc691f0aab3a1f344b673df60a00b26cd482a;bpv=1;bpt=1?q=cc::Layer&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::Layer&lt;/a&gt; as the data source for the cc module&lt;/li&gt;
&lt;li&gt;Input: Layout Object&lt;/li&gt;
&lt;li&gt;Output: PaintLayer (cc::Layer)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: cc = content collator — not Chromium Compositor.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Core functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/frame/local_frame_view.h%3Bl=911?q=LocalFrameView::PaintTree&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;LocalFrameView::PaintTree&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/paint/paint_canvas.h%3Bl=148?q=PaintCanvas::drawRect&amp;amp;ss=chromium/chromium/src&quot;&gt;PaintCanvas::drawRect&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015220145.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The Paint stage converts Layout Objects to drawing instructions, encapsulated in &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/paint/display_item_list.h;l=49?q=cc::DisplayItemList&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::DisplayItemList&lt;/a&gt;, which are injected into cc::PictureLayer.&lt;/p&gt;
&lt;p&gt;Generating the display item list uses a stack traversal:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015220721.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;For this HTML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;style&amp;gt; #p {
  position: absolute; padding: 2px;
  width: 50px; height: 20px;
  left: 25px; top: 25px;
  border: 4px solid purple;
  background-color: lightgrey;
} &amp;lt;/style&amp;gt;
&amp;lt;div id=p&amp;gt; pixels &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The resulting display items:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015220823.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;cc::Layer&lt;/strong&gt; runs on the main thread; each Render Process has exactly one cc::Layer tree. Subtypes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;cc::PictureLayer&lt;/strong&gt;: Self-drawing UI components. Provides a &lt;code&gt;cc::DisplayItemList&lt;/code&gt; via &lt;code&gt;cc::ContentLayerClient&lt;/code&gt;. After going through the cc pipeline, this becomes one or more &lt;code&gt;viz::TileDrawQuad&lt;/code&gt;s stored in a &lt;code&gt;viz::CompositorFrame&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cc::TextureLayer&lt;/strong&gt;: For components doing their own rasterization (Flash plugins, WebGL, etc.) — corresponds to &lt;code&gt;viz::TextureDrawQuad&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cc::UIResourceLayer / cc::NinePatchLayer&lt;/strong&gt;: Like TextureLayer, used in software rendering.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cc::SurfaceLayer&lt;/strong&gt;: Embeds other CompositorFrames — used for iframes and video players.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cc::SolidColorLayer&lt;/strong&gt;: Solid color UI components.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Commit&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015220154.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Module: cc&lt;/li&gt;
&lt;li&gt;Process: Render Process&lt;/li&gt;
&lt;li&gt;Thread: Compositor thread&lt;/li&gt;
&lt;li&gt;Responsibility: Transfer Paint-stage output (&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/layers/layer.h&quot;&gt;cc::Layer&lt;/a&gt;) to the Compositor thread&lt;/li&gt;
&lt;li&gt;Input: cc::Layer (main thread)&lt;/li&gt;
&lt;li&gt;Output: LayerImpl (compositor thread)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Core function: &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/layers/layer.h;l=717&quot;&gt;PushPropertiesTo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Core logic: commit &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/trees/layer_tree_host.h&quot;&gt;LayerTreeHost&lt;/a&gt; data to LayerTreeHostImpl.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cc::PictureLayer::PushPropertiesTo
cc::PushLayerPropertiesInternal
cc::TreeSynchronizer::PushLayerProperties
cc::LayerTreeHost::FinishCommitOnImplThread
cc::SingleThreadProxy::DoCommit
...
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Compositing&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015221354.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Module: cc&lt;/li&gt;
&lt;li&gt;Process: Render Process&lt;/li&gt;
&lt;li&gt;Thread: Compositor thread&lt;/li&gt;
&lt;li&gt;Responsibility: Decompose the full page into independent layers for isolated updates&lt;/li&gt;
&lt;li&gt;Input: PaintLayer (cc::Layer)&lt;/li&gt;
&lt;li&gt;Output: GraphicsLayer&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Core function: &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:ui/compositor/compositor.h%3Bl=368&quot;&gt;Compositor::UpdateLayerTreeHost&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015223151.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Why have a Compositor thread at all? Without it, if we rasterize and display directly after Paint — what happens?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015223404.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If rasterization data isn&apos;t ready when the vsync signal arrives, you drop frames and get &quot;janky&quot; rendering.&lt;/p&gt;
&lt;p&gt;Even with caching at each pipeline stage (Style, Layout, Paint, Raster) to minimize unnecessary redraws:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015223848.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A simple scroll would still cause all pixels to re-Paint + re-Raster!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015223926.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The Compositing stage decomposes the page into GraphicsLayers. Chromium only needs to re-render the affected layers — others just participate in compositing:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015224050.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A div with a CSS &lt;code&gt;transform&lt;/code&gt; animation becomes its own independent GraphicsLayer — only that layer needs re-rendering during the animation.&lt;/p&gt;
&lt;p&gt;DevTools&apos; Layers panel shows all layers, their creation reasons, memory usage, and how many times they&apos;ve been painted — useful for memory and rendering optimization.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015224223.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This explains why CSS animations perform well: the Compositor thread handles CSS animations independently using Property Tree-based layer compositing. You can also use &lt;code&gt;will-change&lt;/code&gt; to hint to the Compositor thread ahead of time. The trade-off: each extra layer consumes memory.&lt;/p&gt;
&lt;p&gt;The Compositor thread can also handle input events — monitoring events from the Browser Process:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015224441.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;However: if JavaScript has registered event listeners, the Compositor thread forwards input events to the main thread for handling.&lt;/p&gt;
&lt;h3&gt;Tiling&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015224507.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Module: cc&lt;/li&gt;
&lt;li&gt;Process: Render Process&lt;/li&gt;
&lt;li&gt;Thread: Compositor thread&lt;/li&gt;
&lt;li&gt;Responsibility: Split a &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/layers/picture_layer_impl.h;l=36&quot;&gt;cc::PictureLayerImpl&lt;/a&gt; into multiple &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/raster/tile_task.h;l=14&quot;&gt;cc::TileTask&lt;/a&gt; tasks at various scale levels for the Raster thread&lt;/li&gt;
&lt;li&gt;Input: LayerImpl (compositor thread)&lt;/li&gt;
&lt;li&gt;Output: cc::TileTask (raster thread)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tiles are the basic unit of rasterization. After Commit, &lt;code&gt;cc::RasterTaskImpl&lt;/code&gt; tasks are created and posted to the Raster thread.&lt;/p&gt;
&lt;p&gt;Core function: &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/tiles/tile_manager.h;l=170&quot;&gt;PrepareTiles&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015224749.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Tiles are typically 256×256 or 512×512 pixels. Why tile?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPU limitations&lt;/strong&gt;: GPU compositing via OpenGL ES uses textures (GL Texture), and many GPUs have texture size limits. The GPU can&apos;t handle arbitrarily large textures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Shared buffer pool&lt;/strong&gt;: A unified buffer pool manages tiles for all WebViews. Tiles are allocated from the pool when pages open and returned when they close.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If Compositing provides macro-level rendering efficiency improvements, Tiling provides micro-level improvements.&lt;/p&gt;
&lt;p&gt;Tiling optimization strategies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Prioritize tiles near the viewport&lt;/strong&gt;: Closer tiles raster first; farther ones get lower priority.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lower resolution on first composite&lt;/strong&gt;: Reduces texture compositing and upload time on initial load.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Raster&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015225228.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Module: cc&lt;/li&gt;
&lt;li&gt;Process: Render Process&lt;/li&gt;
&lt;li&gt;Thread: Raster thread&lt;/li&gt;
&lt;li&gt;Responsibility: Execute each TileTask, producing resources stored in LayerImpl. Playback drawing instructions from DisplayItemList into viz&apos;s CompositorFrame.&lt;/li&gt;
&lt;li&gt;Input: cc::TileTask&lt;/li&gt;
&lt;li&gt;Output: LayerImpl (&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/layers/picture_layer_impl.h&quot;&gt;cc::PictureLayerImpl&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016002044.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Pixel bitmaps and their OpenGL references are stored in GPU memory. (The GPU can also perform rasterization — &lt;strong&gt;hardware acceleration&lt;/strong&gt;.)&lt;/p&gt;
&lt;p&gt;Raster also handles image decoding:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016002024.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The core class &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/raster/raster_buffer_provider.h&quot;&gt;cc::RasterBufferProvider&lt;/a&gt; has key subclasses:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;cc::GpuRasterBufferProvider&lt;/strong&gt;: GPU-based rasterization, results stored directly in SharedImage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cc::OneCopyRasterBufferProvider&lt;/strong&gt;: Skia-based rasterization, results go to GpuMemoryBuffer, then copied to SharedImage via CopySubTexture.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cc::ZeroCopyRasterBufferProvider&lt;/strong&gt;: Skia-based rasterization, results go to GpuMemoryBuffer, then directly create a SharedImage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cc::BitmapRasterBufferProvider&lt;/strong&gt;: Skia-based rasterization, results stored in shared memory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;GPU SharedImage&lt;/strong&gt;: Abstracts GPU data storage — allows applications to write to and read from GPU memory directly, crossing shared-group boundaries. Earlier Chromium used the Mailbox mechanism; modern code uses &lt;strong&gt;GPU SharedImage&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;SharedImage has Client and Service sides. Clients (Browser, Render, GPU processes) can be multiple; the Service runs in the GPU process.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016002810.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;SharedImage usage scenarios:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CC module&lt;/strong&gt;: Rasterize to SharedImage, send to Viz for compositing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OffscreenCanvas&lt;/strong&gt;: Rasterize canvas to SharedImage, send to Viz.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Image processing&lt;/strong&gt;: One thread decodes images to GPU; another thread modifies or renders them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Video playback&lt;/strong&gt;: One thread decodes video to GPU; another renders it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Rasterization strategies&lt;/strong&gt;: Synchronous and asynchronous.&lt;/p&gt;
&lt;p&gt;Synchronous rasterization is used by Android, iOS, and Flutter. It also supports layer-based off-screen pixel buffers for indirect rasterization.&lt;/p&gt;
&lt;p&gt;Synchronous pipeline is simple:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016003249.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Asynchronous rasterization is used by browsers and WebViews. Except for special layers (Canvas, Video), layers are tiled and rasterized asynchronously. Each rasterization task handles drawing instructions for its tile, writing results to the tile&apos;s pixel buffer. &lt;strong&gt;Rasterization and compositing run on different threads and are not synchronized&lt;/strong&gt; — if a tile hasn&apos;t finished rasterizing during compositing, it shows blank or a checkerboard pattern.&lt;/p&gt;
&lt;p&gt;Comparison:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Synchronous&lt;/th&gt;
&lt;th&gt;Asynchronous&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Memory usage&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;Poor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First-screen performance&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;Fair&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dynamic content rendering&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Layer animations&lt;/td&gt;
&lt;td&gt;Fair&lt;/td&gt;
&lt;td&gt;Inertial animation advantage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rasterization performance&lt;/td&gt;
&lt;td&gt;Lower on low-end&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Memory&lt;/strong&gt;: Synchronous has a clear advantage. Async rasterization is memory-hungry — browsers essentially trade memory for performance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First-screen&lt;/strong&gt;: Synchronous&apos;s leaner pipeline typically displays 1-2 frames (~20ms) earlier, though this advantage is modest.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dynamic content&lt;/strong&gt;: Frequently changing content invalidates async rasterization caches repeatedly. Synchronous&apos;s leaner pipeline handles re-rendering more efficiently.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Layer animations&lt;/strong&gt;: Async has a clear advantage here. Property Trees + Compositing let it control which layers re-render, with minimal overhead (~2ms). For momentum scrolling (inertial scroll), async pre-rasterizes areas outside the viewport. Synchronous compensates with cell-level reuse mechanisms on iOS, Android, and Flutter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rasterization performance&lt;/strong&gt;: Synchronous requires more CPU computation; low-end devices may drop frames. But as mobile CPUs improve, synchronous&apos;s absolute memory advantage becomes more significant.&lt;/p&gt;
&lt;p&gt;Async rasterization also has unavoidable issues like white-flash during fast scrolling and DOM updates not syncing during scroll.&lt;/p&gt;
&lt;h3&gt;Activate&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015225235.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Module: cc&lt;/li&gt;
&lt;li&gt;Process: Render Process&lt;/li&gt;
&lt;li&gt;Thread: Compositor thread&lt;/li&gt;
&lt;li&gt;Responsibility: Buffer mechanism — &lt;strong&gt;ensures rasterized data is ready before the Draw phase&lt;/strong&gt;. Splits the Layer Tree into a &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/trees/layer_tree_host_impl.h;l=656&quot;&gt;Pending Tree&lt;/a&gt; and &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/trees/layer_tree_host_impl.h;l=654&quot;&gt;Active Tree&lt;/a&gt;. Activate copies layers from Pending Tree to Active Tree.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Core function: &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/trees/layer_tree_host_impl.cc;l=3322&quot;&gt;LayerTreeHostImpl::ActivateSyncTree&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Compositor thread maintains three cc::LayerImpl trees:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pending tree&lt;/strong&gt;: Receives commits and rasterizes LayerImpl&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Active tree&lt;/strong&gt;: Provides rasterized LayerImpl for the Draw phase&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recycle tree&lt;/strong&gt;: The Pending tree isn&apos;t destroyed after activation — it becomes the Recycle tree to avoid frequent LayerImpl object creation&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;// Tree currently being drawn.
std::unique_ptr&amp;lt;LayerTreeImpl&amp;gt; active_tree_;

// In impl-side painting mode, tree with possibly incomplete rasterized content.
// May be promoted to active by ActivateSyncTree().
std::unique_ptr&amp;lt;LayerTreeImpl&amp;gt; pending_tree_;

// In impl-side painting mode, inert tree with layers that can be recycled
// by the next sync from the main thread.
std::unique_ptr&amp;lt;LayerTreeImpl&amp;gt; recycle_tree_;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Commit targets the Pending tree; rasterization results also live in the Pending tree. The Active tree allows display of the previous commit while rasterizing the new one simultaneously.&lt;/p&gt;
&lt;h3&gt;Draw&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015225242.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This stage is also called Submit. We&apos;ll use &quot;Draw&quot; throughout.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Module: cc&lt;/li&gt;
&lt;li&gt;Process: Render Process&lt;/li&gt;
&lt;li&gt;Thread: Compositor thread&lt;/li&gt;
&lt;li&gt;Responsibility: Convert rasterized tiles to draw quads&lt;/li&gt;
&lt;li&gt;Input: cc::LayerImpl (Tiling)&lt;/li&gt;
&lt;li&gt;Output: viz::DrawQuad&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Draw doesn&apos;t do actual drawing — it traverses Active Tree&apos;s cc::LayerImpl objects and calls &lt;code&gt;cc::LayerImpl::AppendQuads&lt;/code&gt; to create appropriate &lt;code&gt;viz::DrawQuad&lt;/code&gt; objects, placing them into the CompositorFrame&apos;s RenderPass.&lt;/p&gt;
&lt;p&gt;Core functions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/layers/append_quads_data.h%3Bl=18&quot;&gt;PictureLayerImpl::AppendQuads&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:cc/trees/layer_tree_frame_sink.h;l=46?q=cc::LayerTreeFrameSink&amp;amp;sq=&amp;amp;ss=chromium/chromium/src&quot;&gt;cc::LayerTreeFrameSink&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016005258.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Introducing viz&lt;/strong&gt; (visuals): The key on-screen display module in Chromium.&lt;/p&gt;
&lt;p&gt;Viz&apos;s core logic runs in the Viz Process. It receives &lt;code&gt;viz::CompositorFrame&lt;/code&gt; (CF) from other processes, composites them, and renders the result to the window.&lt;/p&gt;
&lt;p&gt;Core classes:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016005803.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A CF represents one frame of a rectangular display area.&lt;/strong&gt; It contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Metadata: CompositorFrameMetadata&lt;/li&gt;
&lt;li&gt;Referenced resources: TransferableResource&lt;/li&gt;
&lt;li&gt;Drawing operations: RenderPass/DrawQuad&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;CompositorFrameMetadata&lt;/strong&gt; records page scale, scroll regions, referenced surfaces, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TransferableResource&lt;/strong&gt; records resources (images) referenced by the CF. Resources come in two forms:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Software resources (stored in memory)&lt;/li&gt;
&lt;li&gt;Textures (stored on GPU)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Hardware acceleration requires GPU-based resources; without it, only software resources are available.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;DrawQuad types:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;viz::TextureDrawQuad&lt;/strong&gt;: References a resource.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;viz::TileDrawQuad&lt;/strong&gt;: Represents a tile. DisplayItemList is rasterized by cc into TileDrawQuads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;viz::PictureDrawQuad&lt;/strong&gt;: Stores DisplayItemList directly. Currently only available for Android WebView.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;viz::SolidColorDrawQuad&lt;/strong&gt;: Solid color.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;viz::RenderPassDrawQuad&lt;/strong&gt;: References another RenderPass by ID.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;viz::SurfaceDrawQuad&lt;/strong&gt;: Embeds another CompositorFrameSinkClient&apos;s output — used for OOPIF, OffscreenCanvas, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Aggregate&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015225249.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Module: Viz&lt;/li&gt;
&lt;li&gt;Process: Viz Process&lt;/li&gt;
&lt;li&gt;Thread: Display Compositor thread&lt;/li&gt;
&lt;li&gt;Responsibility: &lt;strong&gt;Surface aggregation&lt;/strong&gt; — receive CFs from multiple processes and composite them&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Core class: &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/surface_aggregator.h%3Bl=41&quot;&gt;SurfaceAggregator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015230002.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The Display compositor receives CFs from multiple processes and calls SurfaceAggregator to composite them.&lt;/p&gt;
&lt;h3&gt;Display&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221015225256.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Module: Viz&lt;/li&gt;
&lt;li&gt;Process: Viz Process&lt;/li&gt;
&lt;li&gt;Thread: GPU main thread&lt;/li&gt;
&lt;li&gt;Responsibility: Call GL instructions to render draw quads to screen&lt;/li&gt;
&lt;li&gt;Input: Composited viz::CompositorFrame (draw quads)&lt;/li&gt;
&lt;li&gt;Output: Rendered pixels&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Three rendering modes based on &lt;code&gt;viz::DirectRenderer&lt;/code&gt; and &lt;code&gt;viz::OutputSurface&lt;/code&gt; combinations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Software rendering&lt;/strong&gt;: &lt;code&gt;viz::SoftwareRenderer&lt;/code&gt; + &lt;code&gt;viz::SoftwareOutputSurface&lt;/code&gt; + &lt;code&gt;viz::SoftwareOutputDevice&lt;/code&gt; — used when hardware acceleration is disabled.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skia rendering&lt;/strong&gt;: &lt;code&gt;viz::SkiaRenderer&lt;/code&gt; + &lt;code&gt;viz::SkiaOutputSurface&lt;/code&gt; + &lt;code&gt;viz::SkiaOutputDevice&lt;/code&gt; — most flexible, supports GL, Vulkan, and offscreen rendering.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenGL rendering&lt;/strong&gt;: &lt;code&gt;viz::GLRenderer&lt;/code&gt; + &lt;code&gt;viz::GLOutputSurface&lt;/code&gt; — &lt;strong&gt;deprecated&lt;/strong&gt;, being replaced by Skia renderer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Skia rendering&lt;/strong&gt;: SkiaRenderer draws DrawQuads to a canvas provided by SkiaOutputSurfaceImpl. The canvas doesn&apos;t execute drawing immediately — instead it records operations via Skia&apos;s DDL (SkDeferredDisplayListRecorder). Once all RenderPasses finish, the recorded operations are sent to &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.h&quot;&gt;SkiaOutputSurfaceImplOnGpu&lt;/a&gt; for actual rendering.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016104901.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;OpenGL rendering&lt;/strong&gt;: GL calls (frame data) from the viz compositor thread are proxied through a command buffer and written into the main thread&apos;s back buffer.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016105249.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: GLRenderer is deprecated and will be replaced by SkiaRenderer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It uses a CommandBuffer-based GL Context to render DrawQuads onto GLOutputSurface, which creates a Native GL Context using a window handle. GL calls originate in the Compositor thread and are ultimately executed in the CrGpuMain thread via InProcessCommandBuffer.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016105347.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;See &lt;a href=&quot;https://www.chromium.org/developers/design-documents/gpu-command-buffer/&quot;&gt;GPU Command Buffer&lt;/a&gt; for details.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Final GL calls vary by OS and GPU driver:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016105418.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Double buffering&lt;/strong&gt;: Graphics engines use double buffering — drawing to a buffer first, then swapping to screen — to prevent screen tearing and optimize rendering performance.&lt;/p&gt;
&lt;p&gt;Display uses Front Buffer (for screen output) and Back Buffer (for drawing). The screen reads from the Front Buffer. Viz calls &lt;a href=&quot;https://source.chromium.org/chromium/chromium/src/+/main:components/viz/service/display/display.h%3Bl=154&quot;&gt;Display::DrawAndSwap&lt;/a&gt; to swap pointers between them. When the vsync signal arrives, the GPU driver executes the drawing commands, and pixels appear on screen.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/images/blog/chromium/20221016105832.png?max_age=624800&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;That&apos;s the complete Chromium rendering pipeline. This post is an overview — for deeper dives, check out the companion articles listed in Further Reading, or explore the source code links throughout.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://notes.ursb.me/posts/weekly-14/&quot;&gt;Chromium Rendering Pipeline - Introduce&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://notes.ursb.me/posts/weekly-15/&quot;&gt;Chromium Rendering Pipeline - Parsing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://notes.ursb.me/posts/chromium-style/&quot;&gt;Chromium Rendering Pipeline - Style&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.chromium.org/developers/design-documents/multi-process-architecture&quot;&gt;Multi-process Architecture - The Chromium Projects&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/blog/inside-browser-part3/&quot;&gt;Inside look at modern web browser (part 3)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://chromium.googlesource.com/chromium/src/+/master/docs/how_cc_works.md&quot;&gt;How cc Works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/articles/renderingng-architecture/&quot;&gt;Overview of the RenderingNG architecture - Chrome Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/articles/renderingng/&quot;&gt;RenderingNG - Chrome Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/articles/renderingng-data-structures/&quot;&gt;Key data structures and their roles in RenderingNG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.google.com/presentation/d/1boPxbgNrTU0ddsc144rcXayGA_WF53k96imRH8Mp34Y/&quot;&gt;Life of a pixel - Google Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/articles/layoutng/&quot;&gt;RenderingNG deep-dive: LayoutNG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/articles/blinkng/&quot;&gt;RenderingNG deep-dive: BlinkNG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://source.chromium.org/chromium/chromium/src&quot;&gt;Chromium Code Search&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.lmame-geek.com/&quot;&gt;CSS Triggers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wpt.fyi/interop-2022&quot;&gt;Web Platform Tests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=chromium-renderer&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Weekly #13: The Mysticism Lever and the Isekai Groups</title><link>https://ursb.me/en/posts/weekly-13/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-13/</guid><description>Weekly #13 looks at young people&apos;s growing embrace of online divination and the mysticism lever, plus Douban&apos;s isekai groups, framing both as coping tools for the pressure of alienated labor.</description><pubDate>Sun, 31 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;The Mysticism Lever and the Isekai Groups&lt;/h2&gt;
&lt;p&gt;This weekend I listened to a podcast episode about online divination among young people: &lt;a href=&quot;https://therabbithole.fireside.fm/3&quot;&gt;EP03 The &quot;Spectacle&quot; of Online Divination: Gen Z Giving Life Advice to Boomers – Jump Down the Rabbit Hole&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Online divination has become a career path for young people, and most practitioners trace their origin story to simple curiosity. Low barrier to entry, zero startup cost, decent returns. Most diviners are self-taught — a couple of days on Bilibili or a few books is usually enough. On Xiaohongshu, the typical tarot reader is a post-2000s kid who&apos;s been studying for a few months. Turning tarot from zero to a side hustle — or even a full-time gig — isn&apos;t especially difficult, and the market seems promising. Today&apos;s young people tend toward social anxiety, so working from home without face-to-face contact fits the current climate pretty well.&lt;/p&gt;
&lt;p&gt;But dig deeper into the podcast and you find that the clients actually span ages 25 to 55. Younger clients almost always want to talk about love; clients in their 40s tend to focus on family and children. What unifies these groups, though, is that many of them simply want someone to talk to — an emotional outlet. The diviner, in this sense, functions more like a hollow tree: a safe place to whisper your secrets.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Because these people have no way to vent their feelings. Sometimes they can&apos;t tell their parents, can&apos;t tell their friends, and don&apos;t have the resources or money to seek real, long-term professional psychological help. In those moments, the diviner can play a small healing role. — &lt;em&gt;The &quot;Spectacle&quot; of Online Divination&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After listening, I remembered a report I&apos;d seen earlier — the &lt;a href=&quot;https://docs.qq.com/pdf/DZVV5aXBOSWZ5TEFW?&quot;&gt;2022 Big Social Trends Observation Report by Maozeconsulting&lt;/a&gt;, which identifies a trend it calls the &quot;Mysticism Lever&quot;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The bewildered turn their emotional projections onto the stars and the flow of wind and water, adopting a &quot;believing without being obsessed&quot; attitude and weaving mysticism into a key link in their everyday decision-making chains. — &lt;em&gt;2022 Big Social Trends Observation Report&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Mysticism Lever has three defining characteristics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Using mysticism as a small seasoning in daily life&lt;/li&gt;
&lt;li&gt;Believing without being obsessed&lt;/li&gt;
&lt;li&gt;Using mysticism as a tool for self-knowledge&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Contemporary mysticism is more like a tool of positive psychology — given an unfalsifiable pivot point, young people seem able to pry loose the boulders of life that block them and press down on their fate. At the same time, they position themselves as &quot;the measure of all things,&quot; refusing to surrender their own agency: a bad reading simply means the reading was wrong; a temple that doesn&apos;t respond is simply not efficacious. Precisely because they feel confused and lost, young people seek the support of mysticism — but if things don&apos;t work out, they feel even more helpless and won&apos;t sink into it. — &lt;em&gt;2022 Big Social Trends Observation Report&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Moreover, the young people who embrace mysticism aren&apos;t simply looking for answers. As the podcast analyzes, they often want something to talk to — and they use the vocabulary of mysticism as a way to reflect on themselves. Through the dialogue with mystical frameworks, they trace and examine &quot;why am I this way,&quot; and find their own coordinates.&lt;/p&gt;
&lt;p&gt;Online divination can be understood as a tool of positive psychology in the face of alienated labor pressure. A similar phenomenon from last year is the Douban Isekai Groups:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220731122013.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;These groups not only organize forums around shared topics and interests, but actually build parallel &quot;other worlds&quot; alongside reality. It&apos;s remarkable.&lt;/p&gt;
&lt;p&gt;The article &lt;a href=&quot;http://www.woshipm.com/it/4442929.html&quot;&gt;Douban Isekai Groups: Human Imagination of Time Travel, Embedded in Spectacular Media&lt;/a&gt; offers an analysis:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;From monologue to carnival: how social media shapes the form&lt;/li&gt;
&lt;li&gt;From imagination to action: the seduction of embodied participation&lt;/li&gt;
&lt;li&gt;From escape to return: reflecting on the conditions of existence&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The first point is about the collective carnival of social media.&lt;/p&gt;
&lt;p&gt;The second is about &quot;embodiment&quot; — participants feel as though they&apos;ve joined a video game, controlling a &quot;body&quot; in the other world through posting, replying, and rule-making. The imagined rearrangement of time and space becomes something tangible and participatory. That&apos;s what makes isekai worlds so irresistible.&lt;/p&gt;
&lt;p&gt;The third echoes the Mysticism Lever: it&apos;s an escape from ordinary life, and the very act of escaping implies a reflection on reality.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On one hand, the atomization of life brought about by urbanization has increased modern people&apos;s sense of loneliness and estrangement. On the other hand, a wave of new social issues has flooded the public sphere, making various social problems more visible. — &lt;em&gt;Douban Isekai Groups&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;From a Marxist lens: in the process of labor, people produce things that stand opposed to and constrain them — this is alienated labor. When the mounting pressure of alienated labor engulfs young people, the uncertainty of objective reality and the subjective feeling of helplessness lead some of them to treat contemporary mysticism as a positive-psychology tool that provides emotional value.&lt;/p&gt;
&lt;p&gt;The isekai groups and online divination are exactly this kind of tool.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On social platforms, young people bring their alienated struggles to mysticism communities: they exchange confessions, empathize with one another, offer comfort, and share a collective hope. In some sense, &quot;doing mysticism&quot; is like any other leisure activity — it&apos;s one of the main ways young people process negative emotions. — &lt;em&gt;2022 Big Social Trends Observation Report&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That said, these social media phenomena — isekai groups, online divination, and all the rest — are ultimately sparks struck when human practice meets the many technical possibilities of social media. And these sparks are simultaneously shaping our daily lives and opening new imaginative spaces.&lt;/p&gt;
&lt;p&gt;This brings to mind Neil Postman&apos;s &quot;medium as metaphor&quot; from &lt;em&gt;Amusing Ourselves to Death&lt;/em&gt;: the medium we choose reshapes us in return. The medium we choose determines where we end up.&lt;/p&gt;
&lt;p&gt;We don&apos;t know how to understand ourselves — so we build mystical mirrors and isekai landscapes, and we interact with ourselves by projection. We fill in our self-knowledge this way, giving individual life more texture and meaning.&lt;/p&gt;
&lt;p&gt;Cherish the everyday. Looking inward and looking backward is also a way of seeing outward and moving forward more clearly. Whatever the case, reading more and thinking more is always the right path.&lt;/p&gt;
&lt;h2&gt;Weekly Pick&lt;/h2&gt;
&lt;h3&gt;Technical Read: How Blink Works&lt;/h3&gt;
&lt;p&gt;This week I&apos;ve been reading Blink&apos;s source code. I found a great article: &lt;a href=&quot;https://docs.google.com/document/d/1aitSOucL0VHZa9Z2vbRJSyAIsAz24kX8LFByQ5xQnUg/edit?pli=1#&quot;&gt;How Blink Works&lt;/a&gt;. It&apos;s an official Chromium team document that covers the design and implementation details of Blink, the rendering engine at the heart of Chrome. If you want to understand Chrome&apos;s internals, this is an excellent starting point.&lt;/p&gt;
&lt;h2&gt;This Week&apos;s Log&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Finished: Sci-fi | &lt;em&gt;The Time Traveler&apos;s Wife&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Perfect Blue&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Before Sunset&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Paprika&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Played: Cozy | &lt;em&gt;Dorfromantik&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have such a soft spot for games with Dorfromantik&apos;s gentle, healing visual style~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220731124503.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript        21 hrs 1 min   █████████▋░░░░░░░░░░░  45.9%
TypeScript React  19 hrs 56 mins █████████▏░░░░░░░░░░░  43.6%
C++               1 hr 21 mins   ▋░░░░░░░░░░░░░░░░░░░░   3.0%
JSON              1 hr 8 mins    ▌░░░░░░░░░░░░░░░░░░░░   2.5%
JavaScript        56 mins        ▍░░░░░░░░░░░░░░░░░░░░   2.0%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-13&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Case Sensitivity in Frontend Development</title><link>https://ursb.me/en/posts/case-sensitivity/</link><guid isPermaLink="true">https://ursb.me/en/posts/case-sensitivity/</guid><description>This post catalogs case-sensitive scenarios in frontend development: HTTP headers, URLs, cookies, CSS, and traces Chromium and Blink source code to find where header names get lowercased.</description><pubDate>Sun, 24 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Case sensitivity in software development refers to situations where the same &quot;word&quot; behaves differently depending on whether its letters are uppercase or lowercase.&lt;/p&gt;
&lt;p&gt;Let&apos;s look at common case-sensitive and case-insensitive scenarios in frontend development:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP Header&lt;/li&gt;
&lt;li&gt;HTTP Method&lt;/li&gt;
&lt;li&gt;URL&lt;/li&gt;
&lt;li&gt;Cookie&lt;/li&gt;
&lt;li&gt;E-Mail Address&lt;/li&gt;
&lt;li&gt;HTML5 Tags and Attribute Names&lt;/li&gt;
&lt;li&gt;CSS Properties&lt;/li&gt;
&lt;li&gt;File Names in Git&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Is the HTTP Header Case-Sensitive?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;HTTP Header field names are case-insensitive.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc7230#section-3.2&quot;&gt;RFC 7230 — HTTP/1.1, Section 3.2&lt;/a&gt; states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Each header field consists of a case-insensitive field name followed
by a colon (&quot;:&quot;), optional leading whitespace, the field value, and
optional trailing whitespace.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;However, HTTP/2 adds a stricter requirement due to header compression — header names must be lowercase before encoding.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc7540#section-8.1.2&quot;&gt;RFC 7540 — HTTP/2, Section 8.1.2&lt;/a&gt; states:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;However, header field names MUST be converted to lowercase prior to their
encoding in HTTP/2.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Most modern HTTP clients and servers automatically normalize header field names to lowercase, saving developers from having to handle case conversion themselves.&lt;/p&gt;
&lt;p&gt;For example, Node.js&apos;s HTTP module automatically lowercases header fields &lt;a href=&quot;https://github.com/nodejs/node/blob/main/lib/_http_outgoing.js#L187&quot;&gt;node/_http_outgoing.js at main · nodejs/node · GitHub&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// lib/_http_outgoing.js
ObjectDefineProperty(OutgoingMessage.prototype, &apos;_headers&apos;, {
  __proto__: null,
  get: internalUtil.deprecate(function() {
    return this.getHeaders();
  }, &apos;OutgoingMessage.prototype._headers is deprecated&apos;, &apos;DEP0066&apos;),
  set: internalUtil.deprecate(function(val) {
    if (val == null) {
      this[kOutHeaders] = null;
    } else if (typeof val === &apos;object&apos;) {
      const headers = this[kOutHeaders] = ObjectCreate(null);
      const keys = ObjectKeys(val);
      // Retain for(;;) loop for performance reasons
      // Refs: https://github.com/nodejs/node/pull/30958
      for (let i = 0; i &amp;lt; keys.length; ++i) {
        const name = keys[i];
        headers[StringPrototypeToLowerCase(name)] = [name, val[name]];
      }
    }
  }, &apos;OutgoingMessage.prototype._headers is deprecated&apos;, &apos;DEP0066&apos;)
});
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;PS. While writing this post, I noticed an error in the Node.js docs — the example used a header with uppercase letters. I submitted a PR that has since been merged: &lt;a href=&quot;https://github.com/nodejs/node/pull/43933/&quot;&gt;doc: fix typo in http.md by airingursb · Pull Request #43933 · nodejs/node · GitHub&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Rust&apos;s HTTP module also defaults header names to lowercase, because &lt;code&gt;HeaderMap&lt;/code&gt; processes them faster that way.&lt;/p&gt;
&lt;p&gt;From the &lt;a href=&quot;https://docs.rs/http/0.1.3/http/header/index.html#headername&quot;&gt;http::header - Rust docs&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &lt;code&gt;HeaderName&lt;/code&gt; type represents both standard header names as well as custom header names. The type handles the case insensitive nature of header names and is used as the key portion of &lt;code&gt;HeaderMap&lt;/code&gt;. Header names are normalized to lower case. In other words, when creating a &lt;code&gt;HeaderName&lt;/code&gt; with a string, even if upper case characters are included, when getting a string representation of the &lt;code&gt;HeaderName&lt;/code&gt;, it will be all lower case. This allows for faster &lt;code&gt;HeaderMap&lt;/code&gt; comparison operations.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Source: &lt;a href=&quot;https://docs.rs/crate/http/0.1.3/source/src/header/name.rs&quot;&gt;src/headers/name.rs - http 0.1.3 - Docs.rs&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As frontend developers, we&apos;re more interested in how Chromium and WebKit handle this.&lt;/p&gt;
&lt;p&gt;Let&apos;s experiment with request headers in Chrome:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var ajax = new XMLHttpRequest();
ajax.open(&quot;GET&quot;, &quot;https://y.qq.com/lib/interaction/h5/interaction-component-1.2.min.js&quot;);
ajax.setRequestHeader(&quot;X-test&quot;, &quot;AA&quot;);
ajax.send();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For HTTP/2 requests, packet capture shows that &lt;code&gt;X-test&lt;/code&gt; is rewritten to lowercase &lt;code&gt;x-test&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220723154829@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;To be thorough, I also checked with Chrome&apos;s built-in netlog-viewer — the header was indeed lowercased:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220724104811@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: The same result appears in Safari, but Safari&apos;s DevTools display has case issues — Chrome&apos;s DevTools doesn&apos;t. This appears to be a Safari bug.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I looked into the Blink source for &lt;code&gt;XMLHttpRequest&lt;/code&gt; but couldn&apos;t find where exactly the lowercasing happens. The XHR standard (&lt;a href=&quot;https://xhr.spec.whatwg.org/#the-setrequestheader()-method&quot;&gt;XMLHttpRequest Standard&lt;/a&gt;) doesn&apos;t specify it either.&lt;/p&gt;
&lt;p&gt;There was even a proposal to have XHR lowercase headers automatically (&lt;a href=&quot;https://github.com/whatwg/xhr/issues/34&quot;&gt;Should XHR store and send HTTP header names in lower case? · Issue #34 · whatwg/xhr&lt;/a&gt;), but it was rejected.&lt;/p&gt;
&lt;p&gt;Testing against an HTTP/1.1 site:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;var ajax = new XMLHttpRequest();
ajax.open(&quot;get&quot;, &quot;http://www.cn1t.com/airing.js&quot;);
ajax.setRequestHeader(&quot;X-test&quot;, &quot;AA&quot;);
ajax.send();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The header name is &lt;em&gt;not&lt;/em&gt; lowercased here:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220724092209@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This tells us: lowercasing request headers isn&apos;t done by &lt;code&gt;XMLHttpRequest&lt;/code&gt; — it&apos;s handled by the underlying network library.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PS. I spent quite a while debugging this and couldn&apos;t find the exact spot where the lowercasing happens. If anyone knows, please leave a comment — I&apos;d really appreciate it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For response headers, it&apos;s different. When you use &lt;code&gt;getAllResponseHeaders&lt;/code&gt; on an &lt;code&gt;XMLHttpRequest&lt;/code&gt;, Blink explicitly lowercases header names:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;String XMLHttpRequest::getAllResponseHeaders() const {
  // ...
  for (const auto&amp;amp; header : headers) {
    string_builder.Append(header.first.LowerASCII());
    string_builder.Append(&apos;:&apos;);
    string_builder.Append(&apos; &apos;);
    string_builder.Append(header.second);
    string_builder.Append(&apos;\r&apos;);
    string_builder.Append(&apos;\n&apos;);
  }
  // ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Additionally, when Chromium parses HTTP/2 response packets, any uppercase header field names cause the packet parse to fail:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;absl::optional&amp;lt;ParsedHeaders&amp;gt; ConvertCBORValueToHeaders(
    const cbor::Value&amp;amp; headers_value) {
  // ...

  for (const auto&amp;amp; item : headers_value.GetMap()) {
    if (!item.first.is_bytestring() || !item.second.is_bytestring())
      return absl::nullopt;
    base::StringPiece name = item.first.GetBytestringAsString();
    base::StringPiece value = item.second.GetBytestringAsString();

    // If name contains any upper-case or non-ASCII characters, return an error.
    // This matches the requirement in Section 8.1.2 of [RFC7540].
    if (!base::IsStringASCII(name) ||
        std::any_of(name.begin(), name.end(), base::IsAsciiUpper&amp;lt;char&amp;gt;))
      return absl::nullopt;
// ...
  }

  return result;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Is the HTTP Method Case-Sensitive?&lt;/h2&gt;
&lt;p&gt;Per &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc7230#section-3.1.1&quot;&gt;RFC 7230 — HTTP/1.1, Section 3.1.1&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The method token indicates the request method to be performed on the target resource. The request method is case-sensitive.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;HTTP Methods are case-sensitive and must be uppercase.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That said, passing a lowercase method to &lt;code&gt;XMLHttpRequest&lt;/code&gt; (e.g., &lt;code&gt;ajax.open(&quot;get&quot;, &quot;https://ursb.me&quot;)&lt;/code&gt;) actually works fine — Blink normalizes it to uppercase internally &lt;a href=&quot;https://chromium.googlesource.com/chromium/blink/+/master/Source/core/xmlhttprequest/XMLHttpRequest.cpp#618&quot;&gt;XMLHttpRequest.cpp - Chromium/blink&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void XMLHttpRequest::open(const AtomicString&amp;amp; method,
                          const KURL&amp;amp; url,
                          bool async,
                          ExceptionState&amp;amp; exception_state) {
  //...
  method_ = FetchUtils::NormalizeMethod(method);
  // ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;AtomicString FetchUtils::NormalizeMethod(const AtomicString&amp;amp; method) {
  // https://fetch.spec.whatwg.org/#concept-method-normalize

  // GET and POST first because they&apos;re most common
  const char* const kMethods[] = {
      &quot;GET&quot;, &quot;POST&quot;, &quot;DELETE&quot;, &quot;HEAD&quot;, &quot;OPTIONS&quot;, &quot;PUT&quot;,
  };

  for (auto* const known : kMethods) {
    if (EqualIgnoringASCIICase(method, known)) {
      return method == known ? method : known;
    }
  }
  return method;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Is the URL Case-Sensitive?&lt;/h2&gt;
&lt;p&gt;Per &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc7230#section-2.7.3&quot;&gt;RFC 7230 — HTTP/1.1, Section 2.7.3&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The scheme and host are case-insensitive and normally provided in lowercase; all other components are compared in a case-sensitive manner.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;The HTTP scheme (protocol) and host are case-insensitive. The path, query, and fragment are case-sensitive.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Chromium normalizes URLs via the &lt;code&gt;kUrl&lt;/code&gt; class, which canonicalizes &lt;code&gt;protocol&lt;/code&gt; and &lt;code&gt;host&lt;/code&gt; to lowercase during parsing.&lt;/p&gt;
&lt;p&gt;The interesting case is &lt;code&gt;path&lt;/code&gt;. The spec says &lt;code&gt;path&lt;/code&gt; is case-sensitive, but in practice &lt;strong&gt;it depends on the web server&apos;s file system&lt;/strong&gt;. IIS on Windows doesn&apos;t distinguish case, because NTFS and FAT (Windows file systems) are case-insensitive by default (while preserving case). Similarly, Apache deployed on macOS (HFS) is case-insensitive by default.&lt;/p&gt;
&lt;p&gt;A quick overview of major OS file systems:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows (NTFS, FAT): case-insensitive by default, but case-preserving&lt;/li&gt;
&lt;li&gt;macOS (APFS, HFS+): case-insensitive by default, but case-preserving&lt;/li&gt;
&lt;li&gt;Linux (ext3/ext4): case-sensitive&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Server configuration also matters. For example, &lt;a href=&quot;https://en.wikipedia.org/wiki/Case_sensitivity&quot;&gt;https://en.wikipedia.org/wiki/Case_sensitivity&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/case_sensitivity&quot;&gt;https://en.wikipedia.org/wiki/case_sensitivity&lt;/a&gt; point to the same article — but that doesn&apos;t mean the server is case-insensitive, because &lt;a href=&quot;https://en.wikipedia.org/wiki/CASE_SENSITIVITY&quot;&gt;https://en.wikipedia.org/wiki/CASE_SENSITIVITY&lt;/a&gt; returns 404.&lt;/p&gt;
&lt;h2&gt;Is the Cookie Case-Sensitive?&lt;/h2&gt;
&lt;p&gt;Short answer: &lt;strong&gt;yes, Cookie names are case-sensitive.&lt;/strong&gt; The spec history is a bit bumpy though.&lt;/p&gt;
&lt;p&gt;The early &lt;a href=&quot;http://www.ietf.org/rfc/rfc2109.txt&quot;&gt;RFC 2109&lt;/a&gt; actually said Cookie names were case-insensitive:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Attributes (names) (attr) are case-insensitive.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But &lt;a href=&quot;https://www.ietf.org/rfc/rfc2965.txt&quot;&gt;RFC 2965&lt;/a&gt; obsoleted RFC 2109:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This document reflects implementation experience with RFC 2109 and obsoletes it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The current spec &lt;a href=&quot;http://tools.ietf.org/html/rfc6265&quot;&gt;RFC 6265&lt;/a&gt; doesn&apos;t explicitly state whether Cookie names are case-sensitive. By default, this implies they are — and Chrome and Firefox both treat Cookie names as case-sensitive.&lt;/p&gt;
&lt;h2&gt;Is an E-Mail Address Case-Sensitive?&lt;/h2&gt;
&lt;p&gt;Per &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc5321#section-2.3.11&quot;&gt;RFC 5321: SMTP, Section 2.3.11&lt;/a&gt;, the local part (before &lt;code&gt;@&lt;/code&gt;) is interpreted solely by the destination host. The domain part follows &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc1035&quot;&gt;RFC 1035&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Name servers and resolvers must compare [domains] in a case-insensitive manner&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;The domain part of an email address is case-insensitive. Whether the local part (username) is case-sensitive depends on the email service provider.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Are HTML5 Tags and Attribute Names Case-Sensitive?&lt;/h2&gt;
&lt;p&gt;Per &lt;a href=&quot;https://html.spec.whatwg.org/multipage/syntax.html&quot;&gt;HTML Living Standard, Section 13.1&lt;/a&gt;, &lt;strong&gt;HTML tags and attribute names are case-insensitive&lt;/strong&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Many strings in the HTML syntax (e.g. the names of elements and their attributes) are case-insensitive, but only for characters in the ranges U+0041 to U+005A (LATIN CAPITAL LETTER A to LATIN CAPITAL LETTER Z) and U+0061 to U+007A (LATIN SMALL LETTER A to LATIN SMALL LETTER Z).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This means &lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;!doctype html&amp;gt;&lt;/code&gt; are both valid.&lt;/p&gt;
&lt;p&gt;One exception: &lt;code&gt;data-*&lt;/code&gt; attributes must be lowercase. Per &lt;a href=&quot;https://html.spec.whatwg.org/multipage/dom.html#custom-data-attribute&quot;&gt;HTML Living Standard, Section 3.2.6.6&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A custom data attribute is an attribute in no namespace whose name starts with the string &quot;&lt;code&gt;data-&lt;/code&gt;&quot;, has at least one character after the hyphen, is XML-compatible, and contains no ASCII upper alphas.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Blink has correction logic — even if you write &lt;code&gt;&amp;lt;div data-Name=&quot;airing&quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/code&gt;, it normalizes it. But for compatibility, always use lowercase: &lt;code&gt;data-name&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Is CSS Case-Sensitive?&lt;/h2&gt;
&lt;p&gt;Per &lt;a href=&quot;http://www.w3.org/TR/css3-selectors/#casesens&quot;&gt;CSS Selectors Level 3&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;All Selectors syntax is case-insensitive within the ASCII range (i.e. [a-z] and [A-Z] are equivalent), except for parts that are not under the control of Selectors. The case sensitivity of document language element names, attribute names, and attribute values in selectors depends on the document language.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;CSS selector syntax is case-insensitive. Whether property names and values are case-sensitive depends on the document language&lt;/strong&gt; — in XHTML DOCTYPE they&apos;re case-sensitive; in HTML DOCTYPE they&apos;re not.&lt;/p&gt;
&lt;h2&gt;Is Git Case-Sensitive for File Names?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Git ignores case differences in file names by default.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This can cause problems in practice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A developer on Linux (or macOS/Windows with a case-sensitive filesystem) might create a new file &lt;code&gt;rankItem.tsx&lt;/code&gt; without realizing &lt;code&gt;RankItem.tsx&lt;/code&gt; already exists, and successfully commit it.&lt;/li&gt;
&lt;li&gt;Now the Git server has both &lt;code&gt;RankItem.tsx&lt;/code&gt; and &lt;code&gt;rankItem.tsx&lt;/code&gt;. Developers on Windows or macOS (with the default case-insensitive filesystem) can&apos;t properly pull both files.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The fix: disable Git&apos;s case-ignoring behavior:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git config --global core.ignorecase false
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When renaming a file by case on Windows or macOS, use &lt;code&gt;git mv&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git mv --force rankItem.jsx RankItem.jsx
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Without this, renaming &lt;code&gt;readme.md&lt;/code&gt; to &lt;code&gt;README.md&lt;/code&gt; won&apos;t even appear in &lt;code&gt;git status&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220723122534@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;git mv&lt;/code&gt;, it shows up correctly:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220723123320@2x.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Strongly recommended: disable Git&apos;s case-insensitive setting and always use &lt;code&gt;git mv&lt;/code&gt; for case renames. If your environment allows it, you can also convert the volume to a case-sensitive filesystem on macOS or Windows.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Here&apos;s a summary of all the case sensitivity rules we covered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP Header keys are case-insensitive, but most frameworks normalize response header keys to lowercase. [RFC 7230]&lt;/li&gt;
&lt;li&gt;HTTP/2 requires lowercase headers due to header compression; browsers enforce this. [RFC 7540]&lt;/li&gt;
&lt;li&gt;HTTP Methods are case-sensitive and must be uppercase. [RFC 7230]&lt;/li&gt;
&lt;li&gt;URL protocol and host are case-insensitive; browsers normalize them to lowercase. [RFC 7230]&lt;/li&gt;
&lt;li&gt;URL path is case-sensitive per the spec, but in practice depends on the web server&apos;s filesystem and configuration. [RFC 7230]&lt;/li&gt;
&lt;li&gt;URL query and fragment are case-sensitive. [RFC 7230]&lt;/li&gt;
&lt;li&gt;Cookie keys are case-sensitive, though the spec doesn&apos;t explicitly say so. [RFC 6265]&lt;/li&gt;
&lt;li&gt;E-mail domain is case-insensitive. [RFC 1035]&lt;/li&gt;
&lt;li&gt;E-mail local part (username) case sensitivity depends on the provider. [RFC 5321]&lt;/li&gt;
&lt;li&gt;HTML5 tag names and most attribute keys are case-insensitive. [HTML Living Standard 13.1]&lt;/li&gt;
&lt;li&gt;HTML5 &lt;code&gt;data-*&lt;/code&gt; attributes are case-sensitive. [HTML Living Standard 3.2.6.6]&lt;/li&gt;
&lt;li&gt;CSS selector syntax is case-insensitive; property names and values depend on the document language. [CSS Selectors Level 3]&lt;/li&gt;
&lt;li&gt;Git ignores file name case by default.&lt;/li&gt;
&lt;li&gt;Windows (NTFS, FAT): case-insensitive, case-preserving.&lt;/li&gt;
&lt;li&gt;macOS (APFS, HFS+): case-insensitive, case-preserving.&lt;/li&gt;
&lt;li&gt;Linux (ext3/ext4): case-sensitive.&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=case-sensitivity&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Weekly #12: The Three Great Romances of Frontend</title><link>https://ursb.me/en/posts/weekly-12/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-12/</guid><description>Weekly #12 covers frontend&apos;s so-called three great romances (rich text editors, in-browser spreadsheets, CRDTs) and path dependency in everyday life, from QWERTY keyboards to train seat numbering.</description><pubDate>Sun, 24 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Case Sensitivity in Frontend Development&lt;/h2&gt;
&lt;p&gt;I was nudged to write a technical post this week, so I spent the weekend writing &lt;a href=&quot;https://me.ursb.me/archives/case-sensitivity.html&quot;&gt;Case Sensitivity in Frontend Development&lt;/a&gt;. Since the article itself is fairly substantial, I&apos;ll skip the main essay section in this issue and let the post speak for itself.&lt;/p&gt;
&lt;p&gt;If you&apos;re curious, go ahead and read it directly: &lt;a href=&quot;https://me.ursb.me/archives/case-sensitivity.html&quot;&gt;Case Sensitivity in Frontend Development&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Weekly Picks&lt;/h2&gt;
&lt;h3&gt;The Three Great Romances of Frontend&lt;/h3&gt;
&lt;p&gt;I came across an article discussing &lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=MzI1NDU3NzM5Mg==&amp;amp;mid=2247490079&amp;amp;idx=1&amp;amp;sn=f57f3de3ac593023f351fe7d52250216&amp;amp;chk&quot;&gt;what &quot;the three great romances of frontend&quot; on Maimai actually are&lt;/a&gt;. They are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rich text editors&lt;/li&gt;
&lt;li&gt;Browser-based spreadsheets (in-browser Excel)&lt;/li&gt;
&lt;li&gt;CRDTs — Conflict-free Replicated Data Types&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are called &quot;romances&quot; because they&apos;re notoriously complex, endlessly fascinating, and extremely hard to get right — yet frontend developers keep falling for them.&lt;/p&gt;
&lt;h3&gt;Path Dependency&lt;/h3&gt;
&lt;p&gt;A friend shared this article with me last week, and it&apos;s a good read: &lt;a href=&quot;http://mp.weixin.qq.com/s?__biz=MzA3MzQ1MzQzNA==&amp;amp;mid=2656986367&amp;amp;idx=1&amp;amp;sn=537b461106fa3a53643b58e9cb7696fd&quot;&gt;Did we form our current media habits much earlier than we think?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Some everyday examples of path dependency:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QWERTY keyboard&lt;/strong&gt;: Far from the most efficient layout, yet it endures.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Train seat labels skipping D&lt;/strong&gt;: The labeling goes A, B, C, E, F — D is missing because window seats have always been A and F, and the convention carried over.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Songs under 5 minutes&lt;/strong&gt;: Early vinyl records had a physical capacity limit, so songs had to stay under five minutes. The convention stuck.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On what path dependency actually does, the article says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Past experience, inherited customs, and collective memory can be understood as &lt;strong&gt;social preservatives&lt;/strong&gt; — they help members of a society develop a &lt;strong&gt;sense of group belonging&lt;/strong&gt;, and serve the important function of establishing identity and social recognition. From a spatiotemporal perspective, they provide society&apos;s members with a shared imagination and historical consciousness, and carry the function of transmitting shared cultural meaning and tradition. This goes beyond path dependency itself; it concerns &lt;strong&gt;how a society remembers itself&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The article also analyzes path dependency at both the individual and social level, which is worth reading carefully. I may return to this topic in a future issue.&lt;/p&gt;
&lt;h2&gt;This Week&apos;s Log&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Reading: Sci-fi | &lt;em&gt;The Time Traveler&apos;s Wife&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Summer Time Rendering&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Reading: Manga | &lt;em&gt;Spy × Family&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Before Sunrise&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Who Am I – No System Is Safe&lt;/em&gt; | ★★★★☆&lt;/li&gt;
&lt;li&gt;Played: Mobile | &lt;em&gt;League of Legends: Wild Rift Esports Manager&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript React  17 hrs 45 mins █████████▎░░░░░░░░░░░  44.3%
TypeScript        15 hrs 7 mins  ███████▉░░░░░░░░░░░░░  37.7%
JSON              1 hr 34 mins   ▊░░░░░░░░░░░░░░░░░░░░   3.9%
C++               1 hr 32 mins   ▊░░░░░░░░░░░░░░░░░░░░   3.8%
JavaScript        1 hr 18 mins   ▋░░░░░░░░░░░░░░░░░░░░   3.3%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-12&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #11: How Divination Works</title><link>https://ursb.me/en/posts/weekly-11/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-11/</guid><description>Weekly #11 breaks down the mechanics of I Ching yarrow-stalk divination step by step, plus picks for the file-linking app Hook and the Emojimix web toy, alongside the week&apos;s viewing log.</description><pubDate>Sun, 17 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;How Does Divination Work?&lt;/h2&gt;
&lt;p&gt;A few days ago I came across a video called &lt;a href=&quot;https://www.bilibili.com/video/BV1yY4y1G7SU&quot;&gt;How the I Ching Is Used for Divination&lt;/a&gt;, and I found the process surprisingly fascinating. (Ah, the blood of a Chinese philosophy major starts to stir again.) I learned enough to jot down some notes.&lt;/p&gt;
&lt;p&gt;In ancient times, divination was called &quot;bushi&quot; — &quot;bu&quot; referred to reading the cracks on tortoise shells, though the exact technique has been lost to history; &quot;shi&quot; (yarrow divination) used stalks of yarrow grass arranged in random combinations to perform readings. The process is described in the &lt;em&gt;Great Commentary&lt;/em&gt; of the I Ching:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The number of the Great Expansion is fifty, of which forty-nine are used. They are divided into two parts to represent the two principles. One stalk is set apart to represent the three powers. They are counted by fours to represent the four seasons. The remainder is put aside to represent the intercalary month. In five years there are two intercalary months, hence two operations with the remainder before a new set begins. The number of heaven is five, and of earth five. When the five positions of heaven and earth are matched together, each has its proper correlate. The total of the numbers of heaven is twenty-five; the total of the numbers of earth is thirty. The total of heaven and earth is fifty-five. It is by these numbers that the changes and transformations are effected, and the spiritual agencies kept in movement.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Preparation: &quot;The number of the Great Expansion is fifty, of which forty-nine are used.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Fifty stalks&quot;: Begin with 50 yarrow stalks, representing the primordial undifferentiated whole.&lt;/li&gt;
&lt;li&gt;&quot;Forty-nine used&quot;: Remove one at random, leaving 49. That single removed stalk represents the &quot;loss&quot; inherent in manifestation. The Taiji — the interplay of yin and yang — must operate within the imbalance of an odd number.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Counting: &quot;Divided into two parts to represent the two principles; one set apart to represent the three powers; counted by fours to represent the four seasons; the remainder set aside to represent intercalation.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The four operations are: divide, suspend, count by fours, and collect the remainder.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Divide&lt;/strong&gt;: Split the 49 stalks randomly into two groups, one representing Heaven and one representing Earth.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Suspend&lt;/strong&gt;: Take one stalk at random from either group — this is the &quot;suspended&quot; stalk representing Humanity. Now &quot;Heaven, Earth, and Humanity&quot; are the three powers referenced in the text. 48 stalks remain.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Count by fours&lt;/strong&gt;: Count through the Heaven group in sets of four, setting aside any remainder; do the same for the Earth group. The remaining stalks total 50 − (1 + 1 + (Heaven mod 4) + (Earth mod 4)). The groups of four represent the four seasons.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collect&lt;/strong&gt;: Gather the remaining stalks and repeat the whole process. This cycle is performed three times in total — the &quot;four operations, three changes.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After three rounds, count what remains. After working through these steps, only four outcomes are possible: 36, 32, 28, or 24 stalks (with probabilities 3/16, 7/16, 5/16, and 1/16). Dividing each by 4 gives the numbers 9, 8, 7, and 6 — the &quot;Four Images.&quot;&lt;/p&gt;
&lt;p&gt;Following the rule &quot;odd is yang, even is yin&quot;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;9: Greater Yang (Old Yang)&lt;/li&gt;
&lt;li&gt;7: Lesser Yang&lt;/li&gt;
&lt;li&gt;8: Lesser Yin&lt;/li&gt;
&lt;li&gt;6: Greater Yin (Old Yin)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are then converted into lines (yao):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Yang line (—): 9 or 7&lt;/li&gt;
&lt;li&gt;Yin line (- -): 6 or 8&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The probability of getting a yin line ((1+7)/16) and a yang line ((3+5)/16) are each exactly 1/2.&lt;/p&gt;
&lt;p&gt;Every three lines combine to produce one of the eight basic trigrams, so the full process must be repeated six times to generate the six lines of a full hexagram.&lt;/p&gt;
&lt;p&gt;Say three rounds produce &quot;7, 8, 7&quot; — that&apos;s yang, yin, yang — giving the Li (Fire) trigram. But 6 and 9 are special: &quot;when things reach their extreme, they reverse.&quot; So a hexagram of all 9s (Qian, pure yang) can transform into all 6s (Kun, pure yin). Lines of 7 or 8 are &quot;stable&quot; and don&apos;t change.&lt;/p&gt;
&lt;p&gt;Two trigrams stacked gives the full hexagram — 8×8 = 64 possible combinations. So six full rounds of the process are needed. If the result is 9-7-8-9-7-6, for example, you might get the hexagram Xun over Xun (Wind/Wind), with the changing lines producing a second &quot;relating hexagram.&quot; You&apos;d then consult the I Ching for the interpretation of both.&lt;/p&gt;
&lt;h2&gt;Weekly Picks&lt;/h2&gt;
&lt;h3&gt;Hook: Link Any Two Files&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://hookproductivity.com/&quot;&gt;Hook – Links Beat Searching&lt;/a&gt; is a paid macOS app that lets you link two files by registering their file-type-specific &lt;code&gt;open&lt;/code&gt; scheme URLs — which is exactly what &quot;Hook&quot; means.&lt;/p&gt;
&lt;p&gt;My two main use cases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linking: requirements notes + ticket + design mockup + technical spec&lt;/li&gt;
&lt;li&gt;Linking: code + code notes + technical spec&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With any one of these files open, I can press &lt;code&gt;Ctrl+H&lt;/code&gt; to instantly see all the files and links associated with it.&lt;/p&gt;
&lt;p&gt;There&apos;s also a popular use case for linking GTD tasks to related files (though sadly my current app, TickTick, doesn&apos;t support custom schemes):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022071701.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Emojimix&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://tikolu.net/emojimix/&quot;&gt;emojimix&lt;/a&gt; is a web app that combines two emoji into a new one. It&apos;s delightfully silly.&lt;/p&gt;
&lt;p&gt;A couple of examples:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/emojimix.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;This Week&apos;s Log&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Watching: Anime | &lt;em&gt;Pokémon Ultimate Journeys&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finished: Novel | &lt;em&gt;Silent Parade&lt;/em&gt; | ★★★☆☆&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Watched: Esports | IEM - Navi vs AST | ★★★★★&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Watched: Anime | &lt;em&gt;Spy × Family&lt;/em&gt; | ★★★★★&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Watched: Film | &lt;em&gt;Groundhog Day&lt;/em&gt; | ★★★★★&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Watched: Film | &lt;em&gt;The Best Offer&lt;/em&gt; | ★★★★★&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Watched: Film | &lt;em&gt;Drishyam&lt;/em&gt; | ★★★★★&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Watched: Film | &lt;em&gt;Hana to Alice&lt;/em&gt; (rewatch) | ★★★★★&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Pokémon&lt;/em&gt;: The little dumb thing saved his 100%-accuracy Thunderbolt for the very first match of the quarterfinals — bold move. My bold prediction: the final will be Dragonite vs. Mega Lucario, and Ash still won&apos;t take the championship this year.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Silent Parade&lt;/em&gt;: An interesting premise, but the plot twists felt a bit forced — like the story was manufactured around the reversal rather than building naturally toward it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Last night&apos;s Navi match was absolutely electric. The crowd energy was incredible. Navi&apos;s mantra: &quot;3 points to draw, 4 points to win.&quot;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Spy × Family&lt;/em&gt;: Season 1 wrapped. Apparently Season 2 won&apos;t come until October — and we still haven&apos;t even seen Yuri make a proper appearance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Groundhog Day&lt;/em&gt;: Finally got around to it. I expected a horror film; I got a heartwarming comedy. Life really is just ordinary days repeating themselves. If &lt;em&gt;The Truman Show&lt;/em&gt; is about being trapped in space and breaking free, &lt;em&gt;Groundhog Day&lt;/em&gt; is about being trapped in time and breaking free. Change a little each day, become a little better, and learn to love and live.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;The Best Offer&lt;/em&gt;: Absolutely blew me away. Italian thriller at its finest — highly recommend.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript 28 hrs 49 mins ██████████████████▏░░  86.6%
JSON       1 hr 41 mins   █░░░░░░░░░░░░░░░░░░░░   5.1%
JavaScript 58 mins        ▌░░░░░░░░░░░░░░░░░░░░   2.9%
HTML       43 mins        ▍░░░░░░░░░░░░░░░░░░░░   2.2%
YAML       26 mins        ▎░░░░░░░░░░░░░░░░░░░░   1.3%
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PS. Not sure if WakaTime had a bug this week — TypeScript React somehow didn&apos;t get counted at all…&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-11&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #10: Games I Love (Vol. 1)</title><link>https://ursb.me/en/posts/weekly-10/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-10/</guid><description>Weekly #10 rounds up favorite games: Undertale, To the Moon, Don&apos;t Starve, Darkest Dungeon, The Stanley Parable, Breath of the Wild, and Hollow Knight, each with the author&apos;s personal take.</description><pubDate>Sun, 10 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Two months in, and I&apos;ve managed to hit every single issue without missing one — ten issues on the dot. Give yourself a hand~&lt;/p&gt;
&lt;p&gt;I&apos;ve put together a table of everything I&apos;ve recommended in the newsletter so far — products, games, articles — and I&apos;ll keep updating it: &lt;a href=&quot;https://oh-oh-bear.feishu.cn/base/bascndYl8ECUu9T3RczKwHiAYCg&quot;&gt;Airing - Best Product&lt;/a&gt;. I&apos;ve also set up a &lt;a href=&quot;https://oh-oh-bear.feishu.cn/share/base/shrcn6QeZoXbI7bffuCXt2nf4be&quot;&gt;submission form&lt;/a&gt; — if you have something worth recommending, fill it out and I&apos;ll share it with everyone. Good things are meant to be shared!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022071001.png&quot; alt=&quot;&quot; /&gt;You can also scan to fill in the form:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022071002.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Games I Love (Vol. 1)&lt;/h2&gt;
&lt;p&gt;No particular ranking order.&lt;/p&gt;
&lt;h3&gt;1. Undertale&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/15447573419246.jpg&quot; alt=&quot;&quot; /&gt;&amp;gt; You refused to hurt anyone.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Even when you had to run away,
you kept smiling.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Platform: Steam / Nintendo Switch&lt;/li&gt;
&lt;li&gt;Playtime: ~6 hours (first run)&lt;/li&gt;
&lt;li&gt;Genre: Pixel art, RPG, story-driven, music&lt;/li&gt;
&lt;li&gt;Themes: Warmth (or darkness?), emotional&lt;/li&gt;
&lt;li&gt;Awards: Countless&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Story summary:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Long ago, two races governed the earth equally: humans and monsters. One day, war shattered the peace between them. After a near-genocidal human conquest, humans drove the monsters underground and sealed them there with a powerful barrier cast by seven mages. Humans could enter the underground through Mt. Ebott, but escaping required the souls of both a human and a monster. No human who entered ever came back, giving the mountain a reputation for doom.&lt;/p&gt;
&lt;p&gt;I&apos;ve written a review of this game before — it was also my first answer on Zhihu. To avoid spoiling anything, I won&apos;t link it here. This is a deeply moving story, and the music is extraordinary. &lt;strong&gt;Playing through it, you don&apos;t feel like you&apos;re playing a game — you feel like you&apos;ve lived through a kind, warm life.&lt;/strong&gt; Four years later, I can still picture the characters and remember the adventure we went on together.&lt;/p&gt;
&lt;p&gt;This is a perfect score game, no question.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS: Some of the battles are hard, which might frustrate players with less dexterous hands — but I still don&apos;t recommend looking up guides on your first run. The Switch version is a bit pricey and has no Chinese, so I&apos;d suggest the Steam version instead.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;2. To the Moon&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/15447584173797.jpg&quot; alt=&quot;&quot; /&gt;&amp;gt; And if you ever forget, or you get lost...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;we&apos;ll always meet again on the moon.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Platform: Steam / iOS / Android&lt;/li&gt;
&lt;li&gt;Playtime: ~3 hours&lt;/li&gt;
&lt;li&gt;Genre: Pixel art, story, music, indie&lt;/li&gt;
&lt;li&gt;Themes: Love, memory, life&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Story summary:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the world of &lt;em&gt;To the Moon&lt;/em&gt;, a company called Sigmund Corp. offers a service: they rewrite the memories of the dying so that the deceased can live out a dream in their final moments. Because the artificial memory permanently overwrites real memory, the procedure can only be used on people who are already dying.&lt;/p&gt;
&lt;p&gt;The story follows two doctors from Sigmund Corp., Dr. Eva Rosalene and Dr. Neil Watts, tasked with fulfilling the dying wish of an old man named Johnny — to go to the moon, though he doesn&apos;t know why he wants to go. To accomplish this, the two doctors enter his memories and travel backwards through his life, using significant objects as stepping stones. Gradually, they witness the key moments of Johnny&apos;s past and come to understand the circumstances that led him to where he is. When they finally reach his childhood, they attempt to implant the desire to go to the moon, creating a new set of memories built around that wish, so Johnny can die without regret.&lt;/p&gt;
&lt;p&gt;But nothing goes entirely according to plan. The doctors discover that Johnny&apos;s desire, his past, and his late wife River all hold secrets far deeper than expected.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;To the Moon&lt;/em&gt; is another deeply moving story. What&apos;s remarkable is that the music, writing, programming, and artwork were all created by a single person. The music is beautiful — I&apos;ve downloaded several tracks to listen to on their own. The story is top-tier; it could easily be adapted into a film. Apparently there&apos;s a sequel, but I don&apos;t feel any particular urgency to play it — because this ending is already perfect.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;This is a game. A great story. A pure love.&lt;/strong&gt; If life could be replayed, I would still choose to fall in love with you. I believe this game will teach you what &quot;love&quot; means.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS: The collectibles section isn&apos;t great design — if you genuinely can&apos;t find something, it&apos;s okay to check a guide. Don&apos;t let the collection mechanics interrupt the flow of the story.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;3. Don&apos;t Starve (Together)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/15447588484452.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Platform: Steam / WeGame / iOS&lt;/li&gt;
&lt;li&gt;Playtime: ∞&lt;/li&gt;
&lt;li&gt;Genre: RPG, co-op, survival&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Story summary:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Don&apos;t Starve&lt;/em&gt; follows a scientist named Wilson who is teleported by a demon into a hostile wilderness. He must survive using his wits. Players gather natural resources, craft tools, and fend off the dangers of a hostile world.&lt;/p&gt;
&lt;p&gt;The game is great fun with high replayability — especially the multiplayer version, which I used to play with friends. I think it&apos;s genuinely better with other people; solo play leans heavier into pure survival and can get a bit lonely.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS: New players should probably check a guide first — otherwise you&apos;ll discover a lot of creative ways to die, which isn&apos;t the best introduction to the game.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;4. Darkest Dungeon&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/15447592653514.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Platform: Steam / Nintendo Switch / iOS&lt;/li&gt;
&lt;li&gt;Genre: RPG, survival, strategy, turn-based, Lovecraftian, Roguelike&lt;/li&gt;
&lt;li&gt;Playtime: ∞&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Story summary:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Darkest Dungeon&lt;/em&gt; is a turn-based RPG with Roguelike permadeath mechanics. A noble ancestor uncovered a portal that pours out monsters without end, unleashing a cascade of horrors. As a distant relative, the burden of restoring the family estate falls to you. You must recruit a variety of heroes, build a party, and clear dungeons crawling with terrifying creatures.&lt;/p&gt;
&lt;p&gt;The class selection is varied, and the random events are surprisingly authentic and interesting. Even on normal difficulty it&apos;s punishing — but that&apos;s exactly what makes it compelling.&lt;/p&gt;
&lt;p&gt;What makes this game distinctive is that it deliberately doesn&apos;t center your attention on hero leveling and power growth. What you&apos;re actually managing are the quirks and ailments heroes accumulate over time — and the stress system, which can drive heroes to madness or kill them outright. Simply put: the real enemy in this game isn&apos;t the monstrous creatures in the dungeons. It&apos;s each character&apos;s own inner demons.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS: The late-game experience gets a little rough around the edges; the iOS version apparently has a lot of bugs according to reviews. The Switch version costs significantly more than Steam, but this type of game really is more fun on a handheld.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;5. Lost Castle&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/15447596747350.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Platform: Steam&lt;/li&gt;
&lt;li&gt;Genre: Action-adventure, side-scrolling, Roguelike, RPG&lt;/li&gt;
&lt;li&gt;Playtime: 1–2 hours (single run)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Story summary:&lt;/strong&gt; Not important.&lt;/p&gt;
&lt;p&gt;This one is also best played with friends. My buddies and I used to run it regularly. Since a single run only takes about an hour, you never get sucked in for too long. Weirdly, despite being a dungeon crawler, the art style feels kind of cute. Apparently this game was made by a college dorm room of students from South China University of Technology — genuinely impressive.&lt;/p&gt;
&lt;h3&gt;6. The Stanley Parable&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/15447598661804.jpg&quot; alt=&quot;&quot; /&gt;&amp;gt; By making a choice, you choose freedom.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Platform: Steam&lt;/li&gt;
&lt;li&gt;Genre: First-person, story-driven, multiple endings, adventure&lt;/li&gt;
&lt;li&gt;Themes: Philosophy, life, freedom&lt;/li&gt;
&lt;li&gt;Awards: Many&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Story summary:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Through the narrator&apos;s framing, the protagonist is living in a simulated virtual world where his mind is controlled. In the real world, he lives the same day on repeat — office, home, back and forth — while his consciousness exists within the system.&lt;/p&gt;
&lt;p&gt;The narrator orchestrates everything, perhaps for a scientific experiment, perhaps for reasons unknown, or perhaps it&apos;s all just a game.&lt;/p&gt;
&lt;p&gt;This game has no difficulty. It&apos;s pure story. But it has 22 different endings. It&apos;s also more than a game — its significance extends beyond itself. The beautiful logic and guidance are such that by the time you feel like the narrator is talking directly &lt;em&gt;to you&lt;/em&gt;, you&apos;ve already merged with the character. The narrator breaks the fourth wall, or maybe you&apos;ve realized that &quot;Stanley&quot; already lives within you.&lt;/p&gt;
&lt;p&gt;The game has no victory ending — much like life, which always seems to be trying to escape fate, yet always returns to the starting point. &lt;strong&gt;Every ending in this game is valid. Every one is free, because these are choices we made ourselves.&lt;/strong&gt; Whether you lock yourself in a room at the very beginning and end your &quot;life&quot; there, or whether you follow the narrator down a four-hour path of silly baby games — that was your choice. &lt;strong&gt;The moment &quot;you&quot; leave the room, your &quot;life&quot; has already begun.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Beyond all of this, there&apos;s much more worth thinking about — I won&apos;t spoil it. I hope anyone interested will sit quietly with this unusual &quot;game.&quot;&lt;/p&gt;
&lt;h3&gt;7. The Legend of Zelda: Breath of the Wild&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/15453169453547.jpg-yasuo.jpg&quot; alt=&quot;&quot; /&gt;&amp;gt; Freedom is to humanity as Nintendo is to games.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Platform: Nintendo Switch&lt;/li&gt;
&lt;li&gt;Genre: Open world, action-adventure&lt;/li&gt;
&lt;li&gt;Playtime: 200+ hours (excluding DLC)&lt;/li&gt;
&lt;li&gt;Awards: Perfect 10 from IGN, GameSpot, and Polygon; 97 Metacritic from 109 outlets — third highest in history.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Story summary:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A great calamity once struck the Kingdom of Hyrule and brought it to ruin. One hundred years later, Link awakens in an ancient underground shrine, drawn by a mysterious voice, and begins a new journey.&lt;/p&gt;
&lt;p&gt;I have to rave about this one. It is without question the best game on the Switch — not even close. And personally I think it&apos;s the best open-world game ever made, full stop. It&apos;s incredibly free, remarkably lifelike, visually stunning, endlessly playable, richly detailed, with interactions and thoughtful touches that are almost absurd in their care. The controls are approachable; new players get into it easily. And the game never stops surprising you — every hour it gives you something new to want to explore.&lt;/p&gt;
&lt;p&gt;Freedom, spontaneity, and exploration are the absolute core of what &lt;em&gt;Breath of the Wild&lt;/em&gt; is. In this game, you&apos;ll rarely find something you want to do that you simply can&apos;t.&lt;/p&gt;
&lt;h3&gt;8. Hollow Knight&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/15447541862261/v2-64560284aca2854743af5dd5cb634376_hd.jpg-yasuo.jpg&quot; alt=&quot;&quot; /&gt;&amp;gt; Hollow Knight is the best! (with Zelda reigning above all)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Platform: Nintendo Switch / Steam&lt;/li&gt;
&lt;li&gt;Genre: Animated art style, Metroidvania, action game&lt;/li&gt;
&lt;li&gt;Playtime: ~80 hours (excluding DLC)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Story summary:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the declining town of Dirtmouth lies a vast, abandoned kingdom beneath the earth. Many are drawn there by its mysteries, setting off in search of treasure, glory, or the answer to ancient secrets.&lt;/p&gt;
&lt;p&gt;This is an indie game built by three people. Using insects as its world-building foundation, it constructs a complete world of almost unbelievable scope and quality. The care and polish are extraordinary — once you get into it, you start asking: why don&apos;t other games meet this standard? Every area has depth and complexity that leaves you genuinely stunned. The art style is clean and fresh, the story is solid, the setting is original, and the music is fantastic. Countless details and Easter eggs. Most importantly: it&apos;s priced extremely fairly — one purchase covers all DLC forever. On the Switch it&apos;s about ¥30; a game of comparable quality from another studio might run ¥300+. Reviews on Steam have literally begged the developer to raise the price.&lt;/p&gt;
&lt;p&gt;Every NPC in the game feels &lt;em&gt;real&lt;/em&gt; — the last game to give me that feeling was Undertale. There&apos;s an old beetle who keeps working even in old age, till his last moment. There&apos;s Quirrel, who leaves his nail beside a lake and disappears; if you accompany him, you get a quiet final moment together. And then there&apos;s the Nailsmith, who after forging the final weapon asks if you&apos;ll use it on him — he just wants to know how sharp it is...&lt;/p&gt;
&lt;p&gt;The sense of accomplishment this game gives you is unmatched. Unlike Zelda or Odyssey, which in traditional fashion soften things for the player, and unlike deliberately punishing games that torment you for the sake of it — Hollow Knight is hard but fair. It gets a reputation for filtering out players with less precise inputs, but honestly it&apos;s manageable if you put the work in. A tricky boss might take 10 tries; a regular one 2–3. But when you finally beat them, the feeling is like nothing else. That&apos;s what games are for, isn&apos;t it?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: On Switch, using a controller in the late game can get awkward — charging the nail art tends to accidentally trigger regular attacks, and preparing for nail art makes jumping harder. This makes the second boss in the colosseum particularly rough in the air. Elsewhere it&apos;s mostly fine.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;This Week&apos;s Log&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Good Will Hunting&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Reading: Novel | &lt;em&gt;Silent Parade&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Summer Time Rendering&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Spy × Family&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Played: Switch | &lt;em&gt;Pokémon Shield&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Good Will Hunting&lt;/em&gt; deserves its own dedicated post sometime.&lt;/p&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript React  35 hrs 27 mins ██████████████▏░░░░░░  67.7%
TypeScript        14 hrs 46 mins █████▉░░░░░░░░░░░░░░░  28.2%
YAML              41 mins        ▎░░░░░░░░░░░░░░░░░░░░   1.3%
Bash              21 mins        ▏░░░░░░░░░░░░░░░░░░░░   0.7%
JSON              20 mins        ▏░░░░░░░░░░░░░░░░░░░░   0.7%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-10&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #9: From High Efficiency to High Drain — Observations and Reflections</title><link>https://ursb.me/en/posts/weekly-9/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-9/</guid><description>On how chasing efficiency in the mobile-internet era turns into exhaustion and self-denial, arguing for slowing down, plus picks on a social-trends report and the Muse 2.0 app.</description><pubDate>Sun, 03 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;From High Efficiency to High Drain — Observations and Reflections&lt;/h2&gt;
&lt;h3&gt;The Phenomenon: Information Consumption Goes from Efficient to Exhausting&lt;/h3&gt;
&lt;p&gt;I came across an article on the &lt;a href=&quot;https://www.tisi.org/&quot;&gt;Tencent Research Institute&lt;/a&gt; website titled &lt;a href=&quot;https://www.tisi.org/23404&quot;&gt;&lt;em&gt;Why Does the Internet Make Us Increasingly Unhappy?&lt;/em&gt;&lt;/a&gt;, which raised the point that the mobile internet has shifted from a source of high efficiency to a source of high drain. &quot;Going online&quot; has itself become an anxious activity.&lt;/p&gt;
&lt;p&gt;Today, the internet is our mental home — the medium through which we connect with the world. We live in a &quot;connected society&quot; where the relationships between people and things, and between people themselves, have all been replaced by &quot;connections.&quot;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Every concrete, multifaceted person has been reduced to an abstract, thin data-transmission node — treated as emotionally transparent traffic. — &lt;em&gt;2022 Big Social Trends Report&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Think about the last time you put down your phone or closed your laptop: were you satisfied, calm, content? We started going online to access information and learn new things. So we pursue efficiency — blocking noise, building tools, optimizing workflows. One hand tries to organize information, while the other hand can&apos;t settle down, caught in the whirlpool of &quot;productivity,&quot; unable to pull free.&lt;/p&gt;
&lt;p&gt;We want everything to move &lt;em&gt;faster&lt;/em&gt; — eat faster, walk faster, live faster. Time pushes us forward and we keep accelerating. At some point, &quot;being efficient&quot; itself becomes mentally exhausting.&lt;/p&gt;
&lt;p&gt;So why do we keep wanting to go faster? Why has the pursuit of efficiency turned into a drain?&lt;/p&gt;
&lt;h3&gt;The Root Cause: Self-Mutilation in the Pursuit of Efficiency&lt;/h3&gt;
&lt;p&gt;The article &lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=MzUxMzk0MjU2Ng==&amp;amp;mid=2247488149&amp;amp;idx=1&amp;amp;sn=7c819c115cfb91b22344d9714a5e6253&quot;&gt;&lt;em&gt;Life Is Not a Marathon&lt;/em&gt;&lt;/a&gt; describes a concept it calls &quot;self-mutilation&quot;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Modern people have only one track in life: wealth and success. Everyone has success anxiety. Chinese people have simplified life down to one thing — chasing a mythical grail called &quot;financial freedom,&quot; the moment you achieve it, you&apos;ve won the game. Before reaching financial success, they believe they have no right to marriage or children. It&apos;s like a video game where you only get rewards after finishing, and since you haven&apos;t finished, you don&apos;t deserve them — so they choose to self-mutilate. — &lt;em&gt;Life Is Not a Marathon&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The deeper drive behind efficiency-seeking is our pursuit of something we define as &quot;wealth&quot; — and that doesn&apos;t have to mean money; it can mean recognition, status, anything we&apos;ve designated as the goal.&lt;/p&gt;
&lt;p&gt;In the middle of a vast ocean, we keep setting navigational markers for this voyage called life. These markers are the &quot;rules of the voyage&quot; we assign to ourselves. We use these rules to reach each milestone, searching for what we call a sense of meaning.&lt;/p&gt;
&lt;p&gt;And because we want to reach those milestones as fast as possible, we put our heads down and push forward — chasing efficiency blindly, trying to make the engine run faster and faster.&lt;/p&gt;
&lt;p&gt;Meanwhile, we&apos;re losing sight of what&apos;s passing by. Too fast to feel it. Too fast to think about it. Too fast to appreciate it.&lt;/p&gt;
&lt;p&gt;Without any energy coming in, efficiency becomes consumption.&lt;/p&gt;
&lt;h3&gt;Reflection: People Need More Than Just High Efficiency&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;First: behind efficiency, it&apos;s not the tools that matter — it&apos;s the person.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Never forget that the point of pursuing efficiency is to do something &lt;em&gt;better&lt;/em&gt;, not to switch GTD apps every day while still forgetting to do anything; not to pay for the most expensive note-taking software while still procrastinating for days without writing a single word.&lt;/p&gt;
&lt;p&gt;The article &lt;a href=&quot;https://sspai.com/post/71518&quot;&gt;&lt;em&gt;How I Painfully Broke My Efficiency Addiction&lt;/em&gt;&lt;/a&gt; calls this &quot;efficiency addiction&quot; and offers five solutions. For a full read I&apos;d recommend checking the original; here are the points that resonated with me most:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Break the tool fixation:&lt;/strong&gt; Learn to distinguish between a toy and a tool. Use tools when they serve you, and use them for what they&apos;re actually for.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review the value tools actually create:&lt;/strong&gt; Use tools as much as possible, then check the input/output stats they produce and honestly ask yourself: has this tool genuinely added value to my life?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use powerful tools lightly:&lt;/strong&gt; Use tools in whatever way feels comfortable, not to justify the tool&apos;s existence — a tool&apos;s purpose is to create value, not to be used for the sake of using it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Second: do what you love.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Before optimizing for efficiency, figure out what you actually care about. Then direct your energy toward that. Don&apos;t let trivial busywork bury the thing you&apos;re actually here for.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Efficiency is not the goal itself — but pursuing it well can give us access to more of what truly matters.&lt;/strong&gt; Efficiency is meant to free up time so we can do what we love, experience life, take care of our health, have fun, and actually feel happiness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Finally: slow down and feel.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The article &lt;a href=&quot;https://sspai.com/post/71760&quot;&gt;&lt;em&gt;Behind Efficiency, It&apos;s Not Tools — It&apos;s People&lt;/em&gt;&lt;/a&gt; has a great line:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;An efficient life doesn&apos;t mean completing every single thing efficiently — eating efficiently, sleeping efficiently, socializing efficiently. That just sounds like dying efficiently.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So slow down, periodically. Shift attention away from the task at hand. Bring the focus back to yourself. Get quiet and reflect.&lt;/p&gt;
&lt;p&gt;People need more than efficiency. What we should pursue isn&apos;t &quot;faster&quot; — it&apos;s &quot;slower.&quot; What we&apos;re actually missing isn&apos;t productivity — it&apos;s the willingness to let go.&lt;/p&gt;
&lt;p&gt;Slow down. Pay attention to your own thoughts, emotions, and body. Savor life. Experience it. Don&apos;t become a cog in someone else&apos;s machine. I&apos;ve written about the importance of experience before in &lt;a href=&quot;https://me.ursb.me/archives/299.html&quot;&gt;&lt;em&gt;On Existence, Value, and the Experience of Life&lt;/em&gt;&lt;/a&gt; — no need to repeat it here.&lt;/p&gt;
&lt;p&gt;So how do we actually experience the world?&lt;/p&gt;
&lt;p&gt;L先生&apos;s article last week, &lt;a href=&quot;https://mp.weixin.qq.com/s?__biz=MzAxNTY0NjEzNg==&amp;amp;mid=2247486949&amp;amp;idx=1&amp;amp;sn=99796e747dc28decf35a0c48cf7dda79&quot;&gt;&lt;em&gt;Stop and Feel&lt;/em&gt;&lt;/a&gt;, talks about cultivating perceptivity — the capacity to connect with other people and with the world, to breathe with them as part of a shared whole. It has three components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Self-monitoring:&lt;/strong&gt; The ability to acutely sense subtle changes within your own body, to be aware of your own state.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Empathy:&lt;/strong&gt; The ability to genuinely feel another person&apos;s emotions, thoughts, and experiences — to stand in their shoes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;External immersion:&lt;/strong&gt; The ability to deliberately bring your attention into the environment around you, and experience and feel the world outside yourself.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Love specific people, not abstract humanity. Love life, not the meaning of life.&quot; — Dostoevsky&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Efficiency is just a personal choice — one means among many toward a life goal. And no one ever decreed that life is a marathon.&lt;/p&gt;
&lt;p&gt;At the end of &lt;em&gt;The Brilliant Friend&lt;/em&gt; (明朝那些事儿), the author uses &lt;a href=&quot;https://www.zhihu.com/question/47436256/answer/2385014334&quot;&gt;Xu Xiake&apos;s story&lt;/a&gt; to deliver what I think is the most perfect closing line anyone could write — one that holds its own against any king or general: &lt;strong&gt;&quot;There is only one kind of success — living your life in the way you choose.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Before this, I told you about many things: rises and falls, kings and ministers, helpless transitions, and shifting fates. But this one thing, I believe, is the most important. Because I want to tell you: all those dynasties, all that legacy, all that glory — it&apos;s just dust. First it becomes waste, then it becomes earth. — 当年明月&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Because in the end, all of it is external. Only health, dreams, memory, and love will stay with us for life.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;May you resist the current, keep love within reach, and let your heart overflow with light.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Weekly Picks&lt;/h2&gt;
&lt;h3&gt;&lt;em&gt;2022 Big Social Trends Report&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;PDF: &lt;a href=&quot;https://docs.qq.com/pdf/DZVV5aXBOSWZ5TEFW?&quot;&gt;2022 Big Social Trends Report — Maoze Consulting&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I really like the presentation format and content structure of this kind of research report. Each observation point is broken into four sections:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What&apos;s new&lt;/li&gt;
&lt;li&gt;Case&lt;/li&gt;
&lt;li&gt;Why&lt;/li&gt;
&lt;li&gt;How&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022070301.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Muse 2.0&lt;/h3&gt;
&lt;p&gt;Muse recently released version 2.0, which now runs on Mac. Still waiting with anticipation for the whiteboard app that iPadOS might bring.&lt;/p&gt;
&lt;p&gt;PS: The Muse developers are genuinely lovely people. They specifically lowered the price for China mainland users. I once emailed them in my broken English asking about file sync, and they replied thoughtfully and in detail. You can tell from using the app that someone cared deeply about making it right.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022070302.png&quot; alt=&quot;&quot; /&gt;Further reading: &lt;a href=&quot;https://sspai.com/post/74009&quot;&gt;Design and Experience Both Shine — Muse, Another Option for Whiteboard Tools — sspai&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;This Week&apos;s Log&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Finished: Letters | &lt;em&gt;The Letter with Your Handwriting&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Watched: Thriller | &lt;em&gt;Memories of Murder&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Spy × Family&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Watching: Documentary | &lt;em&gt;The Path of Heroes&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Playing: Switch | &lt;em&gt;13 Sentinels: Aegis Rim&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022070303.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScriptReact  32 hrs 30 mins ███████████████▋░░░░░  74.5%
TypeScript       7 hrs 31 mins  ███▌░░░░░░░░░░░░░░░░░  17.2%
JavaScript       1 hr 35 mins   ▊░░░░░░░░░░░░░░░░░░░░   3.7%
JSON             42 mins        ▎░░░░░░░░░░░░░░░░░░░░   1.6%
Dart             20 mins        ▏░░░░░░░░░░░░░░░░░░░░   0.8%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-9&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #8: Three-Act Structure and the Hero&apos;s Journey</title><link>https://ursb.me/en/posts/weekly-8/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-8/</guid><description>Breaks down the three-act structure and the Hero&apos;s Journey using World War Z, Kung Fu Panda, and The Invisible Guest, plus picks on note apps Obsidian, LogSeq, and Hepta.</description><pubDate>Sun, 26 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Three-Act Structure and the Hero&apos;s Journey&lt;/h2&gt;
&lt;p&gt;Before diving into the three-act structure, let&apos;s talk about how to analyze a story in the first place. From what I remember of language class, there are two main approaches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Element decomposition&lt;/li&gt;
&lt;li&gt;Narrative process decomposition&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Element decomposition&lt;/strong&gt; means analyzing the &quot;who, what, when, where, and why&quot; (5W). If you want to add how the story is &lt;em&gt;told&lt;/em&gt;, you get 5W1H:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Who (characters)&lt;/li&gt;
&lt;li&gt;What (events)&lt;/li&gt;
&lt;li&gt;When (time)&lt;/li&gt;
&lt;li&gt;Where (setting)&lt;/li&gt;
&lt;li&gt;Why (background and cause)&lt;/li&gt;
&lt;li&gt;How (narrative method)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Narrative process decomposition&lt;/strong&gt; typically follows a &quot;setup, development, turn, conclusion&quot; pattern common in classical Chinese storytelling — similar to Aristotle&apos;s &quot;beginning, middle, and end.&quot; The &lt;strong&gt;three-act structure&lt;/strong&gt; works on the same principle.&lt;/p&gt;
&lt;p&gt;The classic three-act (or dramatic) structure divides a story into three parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Setup (Act 1):&lt;/strong&gt; The opening and origin of the story. It brings the audience into the world, establishes the setting and context, and lays the groundwork for the conflict to come.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confrontation (Act 2):&lt;/strong&gt; The middle, where the protagonist faces obstacles or a major blow. Act 2 serves to push the character&apos;s emotional state to its lowest point and to intensify dramatic tension.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resolution (Act 3):&lt;/strong&gt; The ending. It addresses the conflict from Act 2, whether by overcoming the challenge or crossing an internal threshold. Act 3 needs to lift the protagonist back up, deliver the climax, and bring the story to a close.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220625181542.png&quot; alt=&quot;&quot; /&gt;The image above (from Wikipedia&apos;s three-act timeline) shows how each act connects through plot points. The three key moments are the inciting incident, the midpoint, and the climax.&lt;/p&gt;
&lt;p&gt;Worth noting: a story doesn&apos;t have to follow just one three-act cycle. You can chain multiple cycles together within a single narrative:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Trigger → Conflict → Resolution → Trigger → Conflict → Resolution → ……
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;World War Z&lt;/em&gt; is a great example. Part of why it never lets up is that the pacing is so tight — the film is essentially made of several consecutive three-act units, one after another. Watching it on Bilibili, the experience feels a lot like playing &lt;em&gt;Left 4 Dead&lt;/em&gt;, and the comments reflect this (&quot;mission complete,&quot; &quot;chapter one over&quot;):&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022062501.png&quot; alt=&quot;&quot; /&gt;Looking at the comment density graph for the film, there&apos;s an interesting pattern:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022062502.png&quot; alt=&quot;&quot; /&gt;I&apos;ve loosely divided the film into six chapters based on its story beats. Each chapter has one peak in comment density, corresponding to that chapter&apos;s climactic moment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Peak 1: End of Act 1 — zombies erupt on the street&lt;/li&gt;
&lt;li&gt;Peak 2: End of Act 2 — the group escapes from the building just before dawn&lt;/li&gt;
&lt;li&gt;Peak 3: End of Act 3 — a gun battle breaks out at the North Korean airport&lt;/li&gt;
&lt;li&gt;Peak 4: End of Act 4 — the zombie surge breaks through the &quot;salvation wall&quot; in Israel&lt;/li&gt;
&lt;li&gt;Peak 5: End of Act 5&lt;/li&gt;
&lt;li&gt;Peak 6: End of Act 6 — less pronounced&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Beyond stacking three-act structures, you can also expand into a five-part structure to improve narrative continuity:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Trigger → Conflict → Resolve Conflict → Conflict → Resolve Conflict
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;strong&gt;Hero&apos;s Journey&lt;/strong&gt; is a twelve-stage template developed by Hollywood screenwriters, based on common mythological and narrative patterns — a blueprint for how a heroic protagonist grows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The Ordinary World:&lt;/strong&gt; The hero&apos;s background and origin. Introduces them to the audience and builds identification.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Call to Adventure:&lt;/strong&gt; The challenge or invitation that sets the journey in motion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Refusal of the Call:&lt;/strong&gt; Highlights the danger and cost of the journey. The hero resists — but ultimately goes anyway.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Meeting the Mentor&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crossing the First Threshold:&lt;/strong&gt; The end of Act 1. The hero crosses the boundary between the ordinary and special worlds; the real story begins.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tests, Allies, and Enemies:&lt;/strong&gt; The hero enters the special world, faces trials, makes friends, makes enemies. Not necessarily in that order; rivals often substitute for outright enemies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Approach to the Inmost Cave:&lt;/strong&gt; Approaching the core of the special world, often shrouded in mystery. The second threshold appears.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Ordeal:&lt;/strong&gt; The story&apos;s central crisis — the hardship that precedes the hero&apos;s transformation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reward (Seizing the Sword):&lt;/strong&gt; Having survived, the hero claims something from the special world — a prize, insight, or ability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Road Back:&lt;/strong&gt; Act 3 begins. The hero either sets out again or turns back toward the ordinary world.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resurrection:&lt;/strong&gt; The story&apos;s climax — a final confrontation with the ultimate antagonist.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Return with the Elixir:&lt;/strong&gt; The story ends. The hero returns from the special world carrying something back. If the ending is open, the story continues.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The hero&apos;s journey also has earlier variants:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220626115259.png&quot; alt=&quot;&quot; /&gt;But all of them share the same three-part arc: departure → initiation → return.&lt;/p&gt;
&lt;p&gt;This template is extraordinarily common. &lt;em&gt;Kung Fu Panda&lt;/em&gt;, for example, follows the hero&apos;s journey almost step for step.&lt;/p&gt;
&lt;p&gt;That said, forcing stories into a template usually just produces clichés.&lt;/p&gt;
&lt;p&gt;The truth is, great plot structure isn&apos;t bound to any formula. Many excellent works use what you might call a &quot;cross-section of life&quot; structure instead: the opening seems almost incidental, the story begins mid-event, backstory gets woven in naturally, and there&apos;s no clean ending — things simply trail off. What would be the beginning in a traditional sense becomes something unimportant, almost background.&lt;/p&gt;
&lt;p&gt;Take &lt;em&gt;Invisible Guest&lt;/em&gt; — there&apos;s no conventional &quot;beginning.&quot; The plot is a tightly interlocked chain, embedding context within the story as it unfolds, constantly provoking curiosity, drawing viewers deeper.&lt;/p&gt;
&lt;p&gt;Or take &lt;em&gt;Kong Yiji&lt;/em&gt; — Lu Xun never explains who Kong Yiji is in any formal way. We learn everything about him through the small scenes at the tavern. He appears in only three of the settings, and in one of them he hasn&apos;t even arrived yet.&lt;/p&gt;
&lt;p&gt;Great stories have no eternal formula. &lt;em&gt;Story&lt;/em&gt; by Robert McKee puts it this way: &lt;strong&gt;&quot;Story is a metaphor for life.&quot;&lt;/strong&gt; Its core comes from the creator&apos;s deepest beliefs about life — the crystallization of their passions and ideas. Every scene, every moment, must be filled with that passionate conviction.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Film is materializing the spiritual. — John Carpenter&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So clichés don&apos;t actually come from following templates too closely. On the contrary, mastering the classic narrative structures is basic craft for any storyteller.&lt;/p&gt;
&lt;p&gt;The real root of all clichés comes down to one thing, and one thing only: the creator doesn&apos;t have a deep enough understanding of and insight into the world they&apos;re depicting.&lt;/p&gt;
&lt;p&gt;Narrative form isn&apos;t the most important thing — it&apos;s just the vehicle. What matters most is the story&apos;s core.&lt;/p&gt;
&lt;h2&gt;Weekly Picks&lt;/h2&gt;
&lt;p&gt;This week&apos;s picks are some note-taking apps I like.&lt;/p&gt;
&lt;h3&gt;Obsidian&lt;/h3&gt;
&lt;p&gt;The classic Zettelkasten-style note tool. I currently use it as my Markdown writing environment.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022062503.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;LogSeq&lt;/h3&gt;
&lt;p&gt;An outliner-style, bidirectional-link knowledge base — essentially a free and arguably better version of Roam Research. It&apos;s currently the only note tool I use consistently.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/2022062504.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Hepta&lt;/h3&gt;
&lt;p&gt;The developer is a recent Taiwanese college graduate who has his own coherent vision for how note-taking should work. What impresses me most is that he ships Hepta almost daily — that level of consistent output is something I genuinely admire.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220626122915.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;This Week&apos;s Log&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Reading: Letters | &lt;em&gt;The Letter with Your Handwriting&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Summer Time Rendering&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Spy × Family&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Rewatched: Film | &lt;em&gt;Tunnel&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Watched: Film | &lt;em&gt;Doctor Strange in the Multiverse of Madness&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Watched: Game playthrough | &lt;em&gt;The Quarry&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Played: Switch | &lt;em&gt;Snipperclips&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Played: Switch | &lt;em&gt;Fall Guys&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&apos;m too much of a coward to play horror games myself, but I&apos;m very curious about the stories. Watching someone else play them — with the safety net of live comments — is perfect. No fear at all.&lt;/p&gt;
&lt;p&gt;By the way, Fall Guys went free-to-play and came to Switch! The direct-play experience is solid. You have to try it — this is exactly the kind of pure, uncomplicated fun games should be.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220625180007.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript React    40 hrs 12 mins ██████████████▋░░░░░░ 70.1%
TypeScript          13 hrs 43 mins █████░░░░░░░░░░░░░░░░ 23.9%
JSON                1 hr 2 mins    ▍░░░░░░░░░░░░░░░░░░░░  1.8%
JavaScript          41 mins        ▎░░░░░░░░░░░░░░░░░░░░  1.2%
HTML                38 mins        ▏░░░░░░░░░░░░░░░░░░░░  1.1%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-8&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #7: Models for Impromptu Speaking</title><link>https://ursb.me/en/posts/weekly-7/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-7/</guid><description>Five speaking and communication frameworks: Yes And, the Pyramid Principle, FFC compliments, FFA reporting, and nonviolent communication, plus picks on an anime and a JS tutorial site.</description><pubDate>Sun, 19 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Models for Impromptu Speaking&lt;/h2&gt;
&lt;p&gt;I came across a &lt;a href=&quot;https://www.bilibili.com/video/BV16t4y1W7kZ&quot;&gt;video&lt;/a&gt; on Bilibili this week where the creator introduced several speaking frameworks. Here&apos;s my summary.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Yes And Principle&lt;/li&gt;
&lt;li&gt;Pyramid Principle&lt;/li&gt;
&lt;li&gt;FFC Compliment Method&lt;/li&gt;
&lt;li&gt;FFA Reporting Method&lt;/li&gt;
&lt;li&gt;NVC Technique&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Yes And Principle&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; When you need to express a differing opinion.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Core idea:&lt;/strong&gt; Don&apos;t negate — affirm instead.&lt;/p&gt;
&lt;p&gt;The &quot;Yes! And…&quot; technique comes from Italian improvisational comedy. &quot;Yes&quot; means accepting what the other person has said; &quot;And&quot; means building on it to add your own perspective. Because improv has no script, you need to accept what your partner gives you and add to it — that&apos;s how the scene flows. If both performers keep shooting each other down, the momentum breaks and the narrative collapses.&lt;/p&gt;
&lt;p&gt;Applied to everyday life: even when someone says something you disagree with, don&apos;t rush to say &quot;But.&quot; Start from a &quot;Yes&quot; — find what you can genuinely agree with, express acceptance and openness — and &lt;em&gt;then&lt;/em&gt; use &quot;And&quot; to introduce your own take.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A: I think this approach should XXXXX — what do you think?
B: Yeah, that sounds pretty solid (YES), and (AND) I also have another angle — want to hear it?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&quot;And&quot; and &quot;But&quot; can both introduce your point, but negation tends to put people on the defensive. Finding common ground first creates a climate where consensus becomes easier and new ideas emerge more freely.&lt;/p&gt;
&lt;h3&gt;Pyramid Principle&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; Whenever you need to hold an audience&apos;s attention or communicate efficiently — presentations, reports, writing, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Core idea:&lt;/strong&gt; The pyramid principle.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Top-down delivery: conclusion first.&lt;/li&gt;
&lt;li&gt;Bottom-up thinking: build from evidence up to summary.&lt;/li&gt;
&lt;li&gt;Vertical: summarize and consolidate.&lt;/li&gt;
&lt;li&gt;Horizontal: group arguments into parallel categories.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Why it works:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grabs attention from the start.&lt;/li&gt;
&lt;li&gt;Helps the audience process information efficiently, without wasting time.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;FFC Compliment Method&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; Giving someone a compliment.&lt;/p&gt;
&lt;p&gt;The FFC method breaks a compliment into three parts: first express your &lt;strong&gt;Feeling&lt;/strong&gt; in vivid language, then back it up with specific &lt;strong&gt;Facts&lt;/strong&gt; that show your feeling isn&apos;t baseless, and finally make a &lt;strong&gt;Comparison&lt;/strong&gt; that conveys deep recognition of the person.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think that dress you&apos;re wearing today looks so elegant and stylish! (Feeling) The cut really suits your energy, and the colors work beautifully with your complexion and figure (Facts). Honestly, it&apos;s the nicest summer dress I&apos;ve seen all year. (Compare)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Things to watch out for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Don&apos;t compliment qualities that aren&apos;t actually there — it reads as insincere.&lt;/li&gt;
&lt;li&gt;Don&apos;t compare directly to people present in the conversation; broaden the frame.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;FFA Reporting Method&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; Reporting to management or in professional settings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Core idea:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Facts&lt;/strong&gt; — present objective information.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feelings&lt;/strong&gt; — share your own read on the situation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action&lt;/strong&gt; — propose what you plan to do.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;Director, sales this month were down 30% (Facts). I think it&apos;s possible the new hires are still developing their client development skills (Feelings). I&apos;m going to organize a training session next week to address this (Actions).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;NVC Technique&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;When to use it:&lt;/strong&gt; Close relationships and intimate communication.&lt;/p&gt;
&lt;p&gt;Nonviolent Communication, detailed in the &quot;four components of loving speech&quot; from &lt;em&gt;Nonviolent Communication&lt;/em&gt; — I covered this in a previous issue, so I won&apos;t repeat it here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Core idea:&lt;/strong&gt; The four components of loving speech.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Observation&lt;/strong&gt; — describe what you observe.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feelings&lt;/strong&gt; — express how you feel.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Needs&lt;/strong&gt; — help the other person understand what you need.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Requests&lt;/strong&gt; — make a specific request.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Weekly Picks&lt;/h2&gt;
&lt;h3&gt;Manga / Anime: Summer Time Rendering&lt;/h3&gt;
&lt;p&gt;Compared to the infamously punishing 486-loop time travel in &lt;em&gt;Re:Zero&lt;/em&gt;, the protagonist here is on literal hell difficulty — fighting supernatural beings with nothing but his bare human body.&lt;/p&gt;
&lt;p&gt;Unlike &lt;em&gt;The Loop&lt;/em&gt;, where dying moves the restart point earlier each time, here it moves &lt;em&gt;later&lt;/em&gt; — meaning certain things that happen are already locked in and can&apos;t be changed. The antagonists also possess [spoiler] abilities that let them use information asymmetry to dominate the protagonist&apos;s team. There are moments of genuine despair where it feels like they&apos;ve been cornered at their own respawn point.&lt;/p&gt;
&lt;p&gt;Both sides — protagonist and antagonist — are playing smart. The plot is tightly woven, the rules are internally consistent, and every foreshadowing pays off. Easily one of the best anime of the year.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220619121615.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Programming: Modern JavaScript Tutorial&lt;/h3&gt;
&lt;p&gt;Stumbled across this one by accident — a free, beautifully designed website for learning front-end development. The content has both depth and breadth, making it worthwhile for beginners and a solid refresher for veterans.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://javascript.info/&quot;&gt;The Modern JavaScript Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;This Week&apos;s Log&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Reading: Letters | &lt;em&gt;The Letter with Your Handwriting&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Reading: Philosophy | &lt;em&gt;At the Existentialist Café: Freedom, Being, and Apricot Cocktails&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Summer Time Rendering&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Spy × Family&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Finished: Manga | &lt;em&gt;Summer Time Rendering&lt;/em&gt; (3rd read)&lt;/li&gt;
&lt;li&gt;Rewatched: Film | &lt;em&gt;Green Book&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Played: Game | &lt;em&gt;20 Minutes Till Dawn&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;20 Minutes Till Dawn&lt;/em&gt; is a compact, well-paced roguelite. Just ¥15 on Steam, a single run takes 10–20 minutes, and the main fun is finding a combat style that clicks for you.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220617225658.png&quot; alt=&quot;&quot; /&gt;PS: For anyone who wants to watch it played rather than play themselves, check out this video → &lt;a href=&quot;https://www.bilibili.com/video/BV18t4y1h7Ck&quot;&gt;Wang Laoju shooting in the dark on Bilibili&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript React  32 hrs 23 mins █████████████░░░░░░░░  61.9%
TypeScript        18 hrs 50 mins ███████▌░░░░░░░░░░░░░  36.0%
JSON              32 mins        ▏░░░░░░░░░░░░░░░░░░░░   1.0%
JavaScript        10 mins        ░░░░░░░░░░░░░░░░░░░░░   0.3%
Markdown          6 mins         ░░░░░░░░░░░░░░░░░░░░░   0.2%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-7&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #6: Perception Checking in the Art of Communication</title><link>https://ursb.me/en/posts/weekly-6/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-6/</guid><description>How perception checking from Looking Out, Looking In reduces noise from perceptual gaps in communication, plus picks: an input switcher, a vocab plugin, and screenshot tools.</description><pubDate>Sat, 11 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Perception Checking in the Art of Communication&lt;/h2&gt;
&lt;p&gt;I came across an &lt;a href=&quot;https://sspai.com/post/73626&quot;&gt;article&lt;/a&gt; this week that summarized key ideas from &lt;a href=&quot;https://book.douban.com/subject/27117578/&quot;&gt;&lt;em&gt;Looking Out, Looking In&lt;/em&gt;&lt;/a&gt;. This issue focuses on what the book calls &quot;perception.&quot;&lt;/p&gt;
&lt;p&gt;Different people assign different meanings to the world around them. The capacity humans have to make meaning of their environment is called &quot;perception.&quot; Because every person&apos;s perceptual process is different, the same event gets interpreted differently by different people — which means we often fail to understand each other. This is the source of all the noise that makes human communication so difficult.&lt;/p&gt;
&lt;p&gt;The article describes perception as a four-stage process: &lt;strong&gt;Selection → Organization → Interpretation → Negotiation&lt;/strong&gt;. This is very similar to the &quot;ladder of inference&quot; I wrote about in a previous post, &lt;a href=&quot;https://me.ursb.me/archives/265.html&quot;&gt;&lt;em&gt;How to Communicate Effectively&lt;/em&gt;&lt;/a&gt;, so I won&apos;t go over it again here.&lt;/p&gt;
&lt;p&gt;Let me instead look at the &quot;communication model&quot; introduced in &lt;em&gt;Looking Out, Looking In&lt;/em&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611171302.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Senders and receivers operate from overlapping but distinct backgrounds.&lt;/strong&gt; The non-overlapping parts are what create &quot;communication gaps&quot; — the unique context each person brings, shaped by cultural background, family background, education, and other factors.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Communication is bidirectional — there&apos;s no such thing as a pure sender or pure receiver.&lt;/strong&gt; Even just listening involves active thought, a nod, a slight frown, or other body language that sends signals back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Noise is everywhere in the model.&lt;/strong&gt; Not only do the participants&apos; different backgrounds introduce noise, but the channel itself, and the encoding/decoding process, introduce noise too — tone, pacing, and word choice all create gaps in understanding. And beyond all of that, each communicator&apos;s internal perception differences generate noise of their own.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&quot;Perception checking,&quot; then, is the practice of reducing the noise caused by perceptual differences — developing empathy and getting as close as possible to understanding what the other person actually means.&lt;/p&gt;
&lt;p&gt;In my earlier post &lt;a href=&quot;https://me.ursb.me/archives/265.html&quot;&gt;&lt;em&gt;How to Communicate Effectively&lt;/em&gt;&lt;/a&gt;, I introduced the concept of fixed standpoints. Perception checking is the practice of examining &lt;em&gt;all&lt;/em&gt; possible standpoints — thinking from multiple perspectives in order to accurately understand what the other person is trying to express. All standpoints can be grouped into five types:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611170513.png&quot; alt=&quot;&quot; /&gt;The article also outlines the steps for perception checking:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Describe the behavior you&apos;ve noticed in the other person.&lt;/li&gt;
&lt;li&gt;List at least two different interpretations of that behavior.&lt;/li&gt;
&lt;li&gt;Ask the person to clarify which interpretation, if any, is accurate.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&apos;s important to note that the goal of perception checking is to &lt;strong&gt;accurately understand the other person&lt;/strong&gt;. This is different from the &quot;four components of nonviolent communication&quot; in &lt;em&gt;Nonviolent Communication&lt;/em&gt; (observation, feelings, needs, requests), whose goal is to &lt;strong&gt;help the other person understand you&lt;/strong&gt;. Communication is bidirectional, and &lt;em&gt;Looking Out, Looking In&lt;/em&gt; fills in the half that &lt;em&gt;Nonviolent Communication&lt;/em&gt; leaves out.&lt;/p&gt;
&lt;p&gt;Perception checking also helps minimize the noise that emotions introduce into communication.&lt;/p&gt;
&lt;p&gt;In &lt;em&gt;Awakening&lt;/em&gt; (认知觉醒), the author describes the human &quot;triune brain&quot;: the rational brain, the emotional brain, and the instinctual brain.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611172204.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611172208.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;All emotions are essentially motivators for action — the brain&apos;s on-the-spot plans for handling various situations, shaped by evolution. — &lt;em&gt;Emotional Intelligence&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The instinctual and emotional brains process information at extraordinary speeds — at least 11,000,000 operations per second — while the rational brain maxes out at around 40 per second. This means the rational brain has very weak control over our overall behavior. In everyday life, most of our decisions are driven by instinct and emotion, not reason — which is why communication is so easily hijacked by feelings.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A person who can master their emotions is greater than a general who can conquer a city. — Napoleon&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Put simply: &lt;strong&gt;our emotions are more often the result of the meanings we assign to things than the result of the things themselves.&lt;/strong&gt; Different interpretations of the same event produce different feelings — different emotional responses.&lt;/p&gt;
&lt;p&gt;Making perception checking a regular habit helps you see yourself more clearly. It also makes you realize that communication is not just a conversational technique — it&apos;s a way of thinking. It&apos;s less about what&apos;s said on the surface and more about excavating the emotions and expectations hidden beneath both sides&apos; words. &lt;strong&gt;When we focus on mutual observation, feelings, and needs rather than reflexively defending our position, we find tenderness within ourselves and arrive at new understandings of both ourselves and others.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is nonviolent communication. This is the art of communication.&lt;/p&gt;
&lt;p&gt;Further reading:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://sspai.com/post/73136&quot;&gt;The Art of Communication: The Course School Missed, and It&apos;s Not Too Late to Learn It — sspai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sspai.com/post/73626&quot;&gt;The Art of Communication: Understanding Others, Managing Emotions, Expressing Yourself — sspai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://me.ursb.me/archives/265.html&quot;&gt;How to Communicate Effectively — Starting from the &quot;Standpoint Problem&quot; in Zhuangzi — Airing&apos;s Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://book.douban.com/subject/3533221/&quot;&gt;&lt;em&gt;Nonviolent Communication&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Weekly Picks&lt;/h2&gt;
&lt;h3&gt;Optimize Your Input Method: Input Source Pro&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://inputsource.pro/zh-CN&quot;&gt;Input Source Pro&lt;/a&gt; automatically switches your input method based on the active app or website, and displays a small notification showing the current input method whenever you switch windows. For example, you can set VSCode, iTerm, and Xcode to default to English, while your notes app and work chat default to Chinese — so you never have to press Shift to switch again. (I&apos;ve recommended this to teammates and they&apos;ve all loved it. Genuinely essential for developers.)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611155646.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Progressive Vocabulary Learning Plugin&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://relingo.net/zh/index&quot;&gt;Relingo&lt;/a&gt; is a free Chrome extension that automatically highlights unfamiliar words on any webpage. Based on how well you know each word, you can add it to your vocabulary list with one click — learning English progressively through your everyday browsing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/SCR-20220611-m9h.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Screenshot Tools&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;http://zh.snipaste.com/&quot;&gt;Snipaste&lt;/a&gt; is the free screenshot tool I&apos;ve used for years, available on both Windows and macOS. My favorite feature: you can pin screenshots directly to your desktop like sticky notes — great for keeping reference images, key information, code comparisons, or QR codes visible while you work.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611154247.png&quot; alt=&quot;&quot; /&gt;&lt;a href=&quot;https://shottr.cc/#/&quot;&gt;Shottr&lt;/a&gt; is a newer macOS screenshot app with a strong feature set, beautiful design, and no price tag. Compared to Snipaste, it adds scrolling capture, window capture, and OCR — but it&apos;s missing the desktop pinning feature I love most, and when annotating screenshots I find Snipaste more intuitive.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611154458.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Further reading: &lt;a href=&quot;https://sspai.com/post/71485&quot;&gt;macOS Free Lightweight Screenshot Tool Shottr — Scrolling Capture, Pixel Measurement, Color Picker, OCR — sspai&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://cleanshot.com/&quot;&gt;CleanShot X&lt;/a&gt; is the veteran powerhouse of macOS screenshot tools. It covers everything the other two do, plus video recording, GIF recording, cloud image upload, sequential annotation, and a beautiful UI. Its &quot;all in one&quot; mode is uniquely elegant, and its Raycast integration is excellent. The only downside: it costs money (618 sale price: ¥104/device).&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611155321.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;This Week&apos;s Log&lt;/h2&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Finished: Novel | &lt;em&gt;Red Finger&lt;/em&gt; | ★★★★&lt;/li&gt;
&lt;li&gt;Reading: Philosophy | &lt;em&gt;At the Existentialist Café: Freedom, Being, and Apricot Cocktails&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Summer Time Rendering&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Spy × Family&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Léon: The Professional&lt;/em&gt; | ★★★★&lt;/li&gt;
&lt;li&gt;Played: Game | &lt;em&gt;Genshin Impact&lt;/em&gt; 2.7 Story Quest | ★★★★&lt;/li&gt;
&lt;li&gt;Played: Game | &lt;em&gt;Shotgun King&lt;/em&gt; | ★★★★&lt;/li&gt;
&lt;li&gt;Playing: Game | &lt;em&gt;Overcooked! 2&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Shotgun King is a wonderfully creative game — a completely remixed chess variant where you play as the black king, alone against the world, armed with a shotgun.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220611160836.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Recent Code&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript React   45 hrs 11 mins ███████████████▊░░░░░  75.3%
TypeScript         10 hrs 14 mins ███▌░░░░░░░░░░░░░░░░░  17.1%
Markdown           1 hr 50 mins   ▋░░░░░░░░░░░░░░░░░░░░   3.1%
JavaScript         1 hr 17 mins   ▍░░░░░░░░░░░░░░░░░░░░   2.2%
JSON               1 hr 1 min     ▎░░░░░░░░░░░░░░░░░░░░   1.7%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-6&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #5: A Day in My Life at TME</title><link>https://ursb.me/en/posts/weekly-5/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-5/</guid><description>A day in the life working at TME, plus picks on programming design decisions, 1Password 8&apos;s Electron rewrite, and a new weekly log of reading and coding time.</description><pubDate>Sat, 04 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;A Day in My Life at TME&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;7:30 — Wake up&lt;/li&gt;
&lt;li&gt;8:10 — Leave home, take the company shuttle to work&lt;/li&gt;
&lt;li&gt;8:50–9:30 — Arrive at the office; breakfast + reading through my reading list&lt;/li&gt;
&lt;li&gt;9:30–10:00 — Review carry-overs from yesterday and plan today&apos;s tasks, then start working&lt;/li&gt;
&lt;li&gt;10:00 — Morning standup; back to work afterward&lt;/li&gt;
&lt;li&gt;12:00 — Lunch&lt;/li&gt;
&lt;li&gt;12:30–13:30 — Read articles from my reading list, or read a book&lt;/li&gt;
&lt;li&gt;13:30–14:15 — Nap; back to afternoon work afterward&lt;/li&gt;
&lt;li&gt;18:00 — Dinner&lt;/li&gt;
&lt;li&gt;19:00–21:00 — Evening coding session, until it&apos;s time to go home&lt;/li&gt;
&lt;li&gt;22:00–23:30 — Entertainment / downtime&lt;/li&gt;
&lt;li&gt;23:30–00:00 — Pre-sleep reading, away from screens, winding down&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The walk to the shuttle stop:
&lt;img src=&quot;https://airing.ursb.me/image/blog/20220604114354.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;My desk at the office:
&lt;img src=&quot;https://airing.ursb.me/image/blog/20220604114352.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;My desk at home:
&lt;img src=&quot;https://airing.ursb.me/image/blog/20220604114353.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Weekly Picks&lt;/h2&gt;
&lt;h3&gt;Tech: Why&apos;s THE Design&lt;/h3&gt;
&lt;p&gt;Came across a great blog this week: &lt;a href=&quot;https://draveness.me/whys-the-design/&quot;&gt;Why&apos;s THE Design — Programming with Faith&lt;/a&gt;. The author has written a series of articles about design decisions in computer science. Each post poses a specific question and examines the pros, cons, and implementation implications of the design choice from multiple angles. This &quot;ask a question, then dig deep&quot; approach to learning is well worth adopting.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220604113130.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;App: 1Password 8&lt;/h3&gt;
&lt;p&gt;As a long-time 1Password user, I&apos;d been sitting on version 7 and hadn&apos;t bothered upgrading. A while back, news broke that the new version was built with Electron, and the comments were full of people complaining about performance and lamenting the move away from native development. But this week I actually looked at the 1Password 8 landing page, and the new UI completely won me over — I caved and upgraded.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220604114351.png&quot; alt=&quot;&quot; /&gt;After a few days of use, I can say: for a password manager, there&apos;s really nothing that demands heavy CPU resources, and the Electron performance is perfectly smooth throughout. If the team hadn&apos;t publicly mentioned switching tech stacks, I don&apos;t think anyone would have noticed the new 1Password isn&apos;t built natively.&lt;/p&gt;
&lt;p&gt;This reminded me of an article I read a while back (I can&apos;t find the link, unfortunately) about an iOS developer who quietly replaced a native app with a PWA shell in a new version — and none of the users noticed.&lt;/p&gt;
&lt;p&gt;User experience isn&apos;t just about theoretical peak performance. It&apos;s about the overall interaction design, animation quality, and the intelligence of loading sequences — understanding the real user&apos;s experience and tolerance. Start from that, and then choose the technology stack that fits your product and workflow best.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;PS: I have three open slots on my 1Password Family plan. If anyone&apos;s interested, reach out.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;This Week&apos;s Log&lt;/h2&gt;
&lt;p&gt;This is a new section starting this issue — a short personal digest tracking my reading, watching, and coding for the week. For books and films I&apos;ve finished, I&apos;ll include a quick personal rating. The coding stats are pulled from Wakatime, which a GitHub Action fetches weekly and syncs to my &lt;a href=&quot;https://gist.github.com/airingursb/ca03eaa58db87fc814e0fe6ba3c48215&quot;&gt;Gist&lt;/a&gt;. Since I only set up the Wakatime plugin on June 1st, the coding data starts from that date.&lt;/p&gt;
&lt;p&gt;I&apos;ll also set up a CI pipeline so that when I publish each issue, it automatically fetches my Douban and Gist data and generates this section.&lt;/p&gt;
&lt;h3&gt;Recent Viewings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Finished: Novel | &lt;em&gt;The Decagon House Murders&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: Film | &lt;em&gt;Everything Everywhere All at Once&lt;/em&gt; | ★★★★★&lt;/li&gt;
&lt;li&gt;Finished: TV | &lt;em&gt;The Ghetto at the Top of the World&lt;/em&gt; | ★★★☆☆&lt;/li&gt;
&lt;li&gt;Reading: Novel | &lt;em&gt;Red Finger&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Summer Time Rendering&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Watching: Anime | &lt;em&gt;Spy × Family&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Playing: Game | &lt;em&gt;Overcooked! 2&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Playing: Game | &lt;em&gt;Outer Wilds&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Recent Code (June 1–2)&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;TypeScript React   11 hrs 3 mins  ██████████████▌░░░░░░  69.5%
TypeScript         4 hrs 45 mins  ██████▎░░░░░░░░░░░░░░  30.0%
Objective-C        3 mins         ░░░░░░░░░░░░░░░░░░░░░   0.3%
Bash               0 secs         ░░░░░░░░░░░░░░░░░░░░░   0.1%
Markdown           0 secs         ░░░░░░░░░░░░░░░░░░░░░   0.1%
&lt;/code&gt;&lt;/pre&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-5&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #4: The Evolution of Personal Blogs</title><link>https://ursb.me/en/posts/weekly-4/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-4/</guid><description>A look at how personal blogs have evolved over the years.</description><pubDate>Fri, 27 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This is a sample English translation of Weekly #4 for development testing.&lt;/p&gt;
&lt;p&gt;The original Chinese article discusses the evolution of personal blogs, from early platforms to modern static site generators.&lt;/p&gt;
&lt;h2&gt;The Early Days&lt;/h2&gt;
&lt;p&gt;Personal blogs started as simple HTML pages, hand-crafted by individuals who wanted to share their thoughts online.&lt;/p&gt;
&lt;h2&gt;Modern Era&lt;/h2&gt;
&lt;p&gt;Today, tools like Astro, Next.js, and Hugo make it easy to build fast, beautiful blog sites with minimal effort.&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-4&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #3: A Bouquet of Love</title><link>https://ursb.me/en/posts/weekly-3/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-3/</guid><description>A farewell letter on a brief 20.5-day romance, framed by the film A Bouquet of Love, on what love is, why we need it, and how to move on after losing it.</description><pubDate>Sat, 21 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This issue wasn&apos;t what I had originally planned. Last night I changed everything at the last minute and decided to write through the night. This is a belated &quot;announcement&quot; — and a farewell letter — to mark the end of a love story with a &quot;bloom&quot; of just 20.5 days.&lt;/p&gt;
&lt;p&gt;We didn&apos;t know each other for long, and the time we spent together was brief (May 1st–May 21st). But I&apos;m grateful for everything you gave me. This was the sweetest relationship I&apos;ve ever had — one that fulfilled everything I&apos;d ever imagined love could be. I also owe you an apology: I didn&apos;t take good enough care of what we had, and let it wither before its time. You walked away with grace and dignity, and in doing so, you preserved it forever at its most beautiful. Thank you.&lt;/p&gt;
&lt;p&gt;This issue is my long-overdue reflection on &lt;em&gt;A Bouquet of Love&lt;/em&gt; — the only film we ever saw together in a theater. You insisted on that one. I said the ending was a bad ending and I didn&apos;t want to watch it. But whether in that moment after the credits, or right now at this hour, the image of love at its most beautiful that &lt;em&gt;A Bouquet of Love&lt;/em&gt; showed me has stayed buried in my heart ever since, as something I yearn for. I never wrote this piece because I was too embarrassed to express affection in writing. I&apos;ve never written about love before.&lt;/p&gt;
&lt;p&gt;But what&apos;s done is done. The past is the past. Today I&apos;m using this newsletter as a way to finally &quot;announce&quot; what happened, and to talk about how I understand love — with &lt;em&gt;A Bouquet of Love&lt;/em&gt; as my frame.&lt;/p&gt;
&lt;p&gt;Mugi and Kinu are two people who fit together almost perfectly. They meet by chance, get to know each other, fall in love, and spend one or two years in bliss. After graduating from college, Mugi gets absorbed into working life. Under the pressure of promotions and raises, he changes. He stops remembering the plot of &lt;em&gt;Houseki no Kuni&lt;/em&gt;, gives up on &lt;em&gt;Golden Kamuy&lt;/em&gt; after volume seven, stops talking to Kinu about Natsuko Imamura&apos;s new work. Kinu stays much as she was in college — she can quit a respectable job to chase work she loves, watch theatre she cares about, follow novels and manga she&apos;s obsessed with.&lt;/p&gt;
&lt;p&gt;The incompatible rhythms, the diverging values — by year five, it&apos;s over. As they part, Mugi proposes. His logic: if dating doesn&apos;t work anymore, get married; if marriage fails, have a child; if that doesn&apos;t work either, just muddle through. Romantic love turns into family love eventually — isn&apos;t that just how it goes?&lt;/p&gt;
&lt;p&gt;And maybe it does. In the fast-paced, disposable culture we live in, young people walk through one procedure after another, failing again and again, each time lowering the bar, compromising, conceding — filling one void with another, until they lose themselves in an endless darkness.&lt;/p&gt;
&lt;p&gt;But Kinu is still the girl she always was, the girl who still believes in love. Even though the person in front of her is the one she loves most, she refuses the proposal through tears and breaks it off. This confirms the line: &quot;The end of a love affair is inevitable; not ending is the exception.&quot; Mugi and Kinu — the most perfectly matched couple — arrive at a bad ending.&lt;/p&gt;
&lt;p&gt;That&apos;s the whole story of &lt;em&gt;A Bouquet of Love&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I want to try to answer four questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is love?&lt;/li&gt;
&lt;li&gt;Why do we need love?&lt;/li&gt;
&lt;li&gt;What holds love together?&lt;/li&gt;
&lt;li&gt;How do you cope when love is gone?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What Is Love?&lt;/h2&gt;
&lt;p&gt;First, an attempt at a question with no fixed answer — what is love?&lt;/p&gt;
&lt;p&gt;You might say Mugi changed, and that&apos;s why this fairy-tale romance ended. But I&apos;d say: Mugi was not wrong, and neither was Kinu. This is just reality. Love, at its core, is nothing more than the pleasure caused by hormones — brief, fast to arrive, fast to fade. You can sustain it for a while through reunions, through stronger stimuli, but in the end it dissipates regardless.&lt;/p&gt;
&lt;p&gt;In Issue 1, I quoted &lt;em&gt;Chungking Express&lt;/em&gt;: &quot;I don&apos;t know when it started, but everything has an expiration date. Canned sardines. Canned ham. Even plastic wrap. I started wondering: is there anything in this world that doesn&apos;t expire?&quot;&lt;/p&gt;
&lt;p&gt;Everything expires. Scientifically, the longest shelf life for romantic love is 18 months. The shortest, as you&apos;ve shown me, is 21 days. We stopped at 20.5 days — while the love was still alive.&lt;/p&gt;
&lt;p&gt;So within the premise of expiration, what can love still be?&lt;/p&gt;
&lt;p&gt;Director Imaizumi Rikiya answers this way: love is &quot;a momentary dream&quot; — a moment when two souls somehow resonate, that precise, dream-like instant of perfect feeling. That instant &lt;em&gt;is&lt;/em&gt; love.&lt;/p&gt;
&lt;p&gt;That instant: you, beside me at the circus, clapping and laughing with delight.&lt;/p&gt;
&lt;p&gt;That instant: on the roller coaster, your scream, your hand gripping mine.&lt;/p&gt;
&lt;p&gt;That instant: a confession at four in the morning, the lights of Huangpu Avenue still burning.&lt;/p&gt;
&lt;p&gt;That instant: walking together under one umbrella along the Pearl River on a rainy night.&lt;/p&gt;
&lt;p&gt;That instant: the beginning of so much heartbreak.&lt;/p&gt;
&lt;p&gt;Yes — everything in this world expires. But &quot;that instant,&quot; for me, is eternal.&lt;/p&gt;
&lt;p&gt;That dream-like moment is, for me, what love is.&lt;/p&gt;
&lt;p&gt;Love is a series of small moments of genuine, positive resonance — real, positive, joyful experiences in a specific place and time. Which is to say: &quot;Forever is probably just a degree of intensity. &apos;I&apos;ll love you forever&apos; means: in that moment, I felt like I would love you forever.&quot; Love is the feeling of that instant.&lt;/p&gt;
&lt;p&gt;But this isn&apos;t impulsive or muddle-headed. It&apos;s the sense of eternity I feel in that moment — which makes me start imagining our future in detail, building the structure of something that belongs to us. Even if that structure later collapses for reasons beyond our control, the grief and pain don&apos;t erase the joy and anticipation of building it.&lt;/p&gt;
&lt;p&gt;This is how I see love: don&apos;t fixate on the past, or eternity, or the future. Many things have no ending — and not having one is already the best ending our circumstances allowed.&lt;/p&gt;
&lt;h2&gt;Why Do We Need Love?&lt;/h2&gt;
&lt;p&gt;Second question: why do we need love? Strictly speaking, I can only answer for myself — my reasons may not represent everyone&apos;s. So the question becomes: why do &lt;em&gt;I&lt;/em&gt; need love?&lt;/p&gt;
&lt;p&gt;My last relationship was in 2017, and it ended quickly too. I&apos;ve sometimes wondered whether I&apos;m just not suited for romance. But I&apos;ve kept searching all these years. Why?&lt;/p&gt;
&lt;p&gt;For me, it&apos;s because I&apos;m afraid of loneliness. There&apos;s a passage in &lt;em&gt;The Storied Life of A.J. Fikry&lt;/em&gt; that I love:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Because we are afraid, in our hearts, that we are not worth loving, we go it alone. But it is exactly because we go it alone that we come to believe we are not worth loving. One day — you won&apos;t know when — you will get in the car and drive. One day — you won&apos;t know when — you will meet her. You will be loved, because for the first time in your life you will truly not be alone. You will choose not to be alone anymore.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After being loved, I discovered how wonderful it feels to be seen as important — to realize there is someone this good in the world who cares about me. And so I&apos;ve kept searching for that person.&lt;/p&gt;
&lt;p&gt;In the age of fast love, the prevailing wisdom is: cast wide, cut fast. There&apos;s a saying: &quot;If you refuse to settle, you&apos;ll grow old alone. Life will get harder. You&apos;ll get lonelier.&quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220522040651.png&quot; alt=&quot;&quot; /&gt;But I won&apos;t settle. I&apos;ll keep waiting for that moment when love arrives. Maybe not settling means I&apos;ll spend my whole life without finding it, without ever having &quot;that instant of a momentary dream.&quot; Maybe no one will ever love me. Or maybe it doesn&apos;t matter either way.&lt;/p&gt;
&lt;p&gt;What I seek is a real experience — not &quot;a momentary dream&quot; but &quot;a momentary truth.&quot;&lt;/p&gt;
&lt;p&gt;The feeling of being cherished lifts the weight of loneliness. It makes me feel, tangibly and physically, that I am alive. Not a dream — real. I don&apos;t want to look back on life and feel like it was a haze. I write in a journal every day. When I was with you, I also kept a daily hand-written log. I track my time to the second in ATracker. I let Traces silently collect my GPS coordinates as I move through the world.&lt;/p&gt;
&lt;p&gt;Why, in an age of surveillance capitalism, do I voluntarily log my own behavior? Because it makes me feel that I truly exist in this world.&lt;/p&gt;
&lt;p&gt;There&apos;s also another reason: I&apos;m someone who cares intensely about &lt;em&gt;experience&lt;/em&gt;. I wrote in an earlier post that &quot;the meaning of life lies in experience&quot; — in the most immediate, authentic experience of the present moment.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Storied Life of A.J. Fikry&lt;/em&gt; puts it this way:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;We are not the things we collect or read or buy. As long as we are alive, we are love, we are the things we love, we are the people we love. All of this, I think, truly survives us.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The meaning of life isn&apos;t handed to us by grand events. It lives in the incidental, ordinary fabric of daily existence. That&apos;s my life, and that&apos;s my meaning. So I want to document every moment — happy or sad — which is why I post my mood calendar in every annual review. Because those are the most authentic moments of my year. When I look back on them, I can feel what I felt then — and through that, I know I was really here.&lt;/p&gt;
&lt;p&gt;The only thing I&apos;m certain exists is the present. The only thing that matters is now, this moment, this feeling. A person has to exist before anything else about life can be discussed. I care about collecting memories because I care about my own existence and my own life.&lt;/p&gt;
&lt;p&gt;On this topic of souls connecting — it&apos;s genuinely hard. People can&apos;t be reduced to simple tags. I&apos;m always INFJ on every personality test; you&apos;re obviously ENFP. In theory, a perfect match. But theory is just a label.&lt;/p&gt;
&lt;p&gt;Strip away all our labels, and if two people can still love each other — and love each other more over time — then what they love is the real person underneath.&lt;/p&gt;
&lt;h2&gt;What Holds Love Together?&lt;/h2&gt;
&lt;p&gt;Third question: what ties an intimate relationship together?&lt;/p&gt;
&lt;p&gt;I once thought this through and wrote down seven things for you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Affection&lt;/strong&gt;: Mutual feeling — this is the foundation of everything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Honesty&lt;/strong&gt;: An honest attitude, open communication, not closing your heart.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Understanding&lt;/strong&gt;: Built on honesty — the ability to empathize with and make allowances for each other.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trust&lt;/strong&gt;: Built on understanding — real mutual trust.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Companionship&lt;/strong&gt;: Being there, consistently. Presence is the most enduring declaration of love.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The desire to share&lt;/strong&gt;: The impulse to want to share everything you experience with the other person.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Being in sync&lt;/strong&gt;: Shared interests, similar directions of growth, goals you pursue together.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Positivity&lt;/strong&gt;: Being each other&apos;s sunshine.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We were good at all of these, and we still ended. Maybe my answer was just wrong from the start.&lt;/p&gt;
&lt;p&gt;Intimate relationships are, above all, a continuous process of adjustment, deepening, and mutual self-disclosure. In this process, each person feels seen, understood, and cared for at a real level. When both people come to include their partner within their sense of self, a structure of interdependence forms — love for the other becomes part of one&apos;s own motivation, the most important part of one&apos;s life.&lt;/p&gt;
&lt;p&gt;When I fall, I fall completely and without reservation. But my friend told me tonight that in recent weeks I&apos;ve been unrecognizable. He said my priorities had all shifted — love had moved to the top, and everything else had been pushed down. I was giving so much there that there was almost nothing left. I stopped studying on weekends and evenings. I barely had time to hang out with friends. I even became slow to respond to people who needed me.&lt;/p&gt;
&lt;p&gt;I don&apos;t know what to do with that observation. In my heart, that order of priorities felt right. I know what I want, and I know what matters most to me. I&apos;m always pushing myself to be the best version of myself. But when love arrived, I lost my direction.&lt;/p&gt;
&lt;p&gt;I don&apos;t know if this is right or wrong. Maybe there&apos;s no right or wrong. I don&apos;t know what I&apos;ll miss or what I&apos;ll regret. I don&apos;t know how to achieve my dreams, or where fate is taking me. All I can do is follow the feeling, one step at a time, with your love as the engine.&lt;/p&gt;
&lt;h2&gt;How Do You Cope When Love Is Gone?&lt;/h2&gt;
&lt;p&gt;The last question — and honestly the one I want to think about most right now.&lt;/p&gt;
&lt;p&gt;When I was apartment hunting, I had a thought: I talked to so many agents, but only the last one got paid. All the others who worked hard, who showed me great places, who took me around — most of that effort went unrewarded, because only the last agent closed the deal.&lt;/p&gt;
&lt;p&gt;In the same way, every relationship is fertilizer for the next. In the end, only one person — the right one, the one you actually marry — will receive the full harvest. Everyone before is, in a sense, preparation.&lt;/p&gt;
&lt;p&gt;Does that mean everything before was meaningless?&lt;/p&gt;
&lt;p&gt;No.&lt;/p&gt;
&lt;p&gt;When I first started looking for an apartment, I had no criteria. Going from agent to agent, seeing place after place, I gradually discovered what I actually wanted: a living room that opens onto a balcony, a building with a shuttle bus, a large common area, a sunny bedroom. Each of those preferences was built up from experience. Eventually I found what is probably the most suitable place for me right now.&lt;/p&gt;
&lt;p&gt;And if I compare relationships to apartment hunting (an imperfect analogy), every one has brought me both growth and regret. As I came to understand while playing &lt;em&gt;Finding Paradise&lt;/em&gt; last year:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On loneliness, Faye says as she leaves: however it goes, moments of loneliness will always come. But that&apos;s part of growing up, and part of life. It&apos;s what makes every moment spent with the people we love so precious, and our memories worth a thousand times more.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;On choices, Sophia says: life is so short. We can&apos;t do everything we want to do. Whatever we choose, there will always be something else worth trying, another road worth walking. In the end, all we can do — all we must do — is find peace in the path we chose.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;On regret, Colin says at the end: &quot;Those chances I missed, those small accidents, all my unfinished wishes — yes, they&apos;re still my regrets. But they gave me everything I have. And what I have... nothing could take it away.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Each of us is caught in loneliness, yet we act as freely as we wish. I think that once you see through the world&apos;s pretenses, the world belongs to you.
Cherish the present. Cherish this moment. Cherish everything around you.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We fall for someone because they happen to meet certain needs we have at a particular point in time. There are many such people in the world, so there&apos;s no such thing as a fated one-and-only love. But in that specific moment, I happened to meet you — not someone else — and that&apos;s what fate is.&lt;/p&gt;
&lt;p&gt;I may not have been able to stay with you. I always told myself: love fully, leave no regrets. But now I realize that no matter how you choose, regrets are inevitable.&lt;/p&gt;
&lt;p&gt;That&apos;s the regret — Colin&apos;s deathbed regret, the road Sophia didn&apos;t take. But it&apos;s also Faye&apos;s most treasured moment, the experience I hold most dear.&lt;/p&gt;
&lt;p&gt;Every one of us is a unique individual. No memory can be duplicated; none of it can happen again. All I can do is cherish it, and keep it locked away in a small secret box inside me. So that one day in the future, if I happen to open it, I can —&lt;/p&gt;
&lt;p&gt;Remember the moment at the circus.&lt;/p&gt;
&lt;p&gt;Remember the moment on the roller coaster.&lt;/p&gt;
&lt;p&gt;Remember the moment of confession at four in the morning.&lt;/p&gt;
&lt;p&gt;Remember the moment beside the Pearl River in the rain.&lt;/p&gt;
&lt;p&gt;And when I remember that &quot;momentary dream,&quot; if I can still feel that genuine, heartfelt joy — that is the meaning of my life.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220522023008.png&quot; alt=&quot;&quot; /&gt;If I could do it all over, I&apos;d still chase after you. Even if the ending would only ever be a graceful goodbye.&lt;/p&gt;
&lt;p&gt;Back to the title — why is this film, and this piece, called &lt;em&gt;A Bouquet of Love&lt;/em&gt;?&lt;/p&gt;
&lt;p&gt;I used to hate receiving flowers. At my graduation ceremony I specifically told my closest friends not to bring them. If they had to give something, make it dried flowers. I couldn&apos;t bear to watch fresh flowers wilt — I knew they were beautiful now, but I couldn&apos;t endure seeing them die.&lt;/p&gt;
&lt;p&gt;That rigidity was finally broken by myself — the moment I was preparing flowers for you, I realized: flowers are so beautiful, and giving them to someone this wonderful is itself something beautiful.&lt;/p&gt;
&lt;p&gt;Maybe that&apos;s what flowers are for — even if love&apos;s bouquet will fade, it still blooms with everything it has, in brilliant, glorious color. Especially when that bouquet is a gift given with care.&lt;/p&gt;
&lt;p&gt;And the most precious souvenir of a love affair is the change it leaves on you — the way a river reshapes the landscape it flows through.&lt;/p&gt;
&lt;p&gt;The books you&apos;ve read, the films you&apos;ve seen, the music you&apos;ve heard, the food you&apos;ve tasted, the parks you&apos;ve walked through, the performances you&apos;ve attended, the people you&apos;ve loved — they&apos;ve all already entered your blood and bone, shaping who you are now, becoming part of you. These 20.5 days of bloom have already merged into my blood, into my habits, into the life I&apos;ll live from here.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220522012103.png&quot; alt=&quot;&quot; /&gt;The you I loved disappeared in the moment we parted. The love and longing that remain are mine alone — a memento of something I once had. I know some things can&apos;t be forgotten. Some things are worth holding on to. Some things you give to willingly. And some things you simply cannot help.&lt;/p&gt;
&lt;p&gt;I&apos;ve never been good at treasuring what&apos;s right in front of me. In some imagined future I always assumed we&apos;d stay in touch, that we&apos;d definitely see each other again, that there&apos;d be a chance to say sorry someday, that things would get better after today — but I never once thought that any goodbye could be the last one.&lt;/p&gt;
&lt;p&gt;So to close: please cherish what&apos;s in front of you. Treasure your own most authentic experiences. Hold that &quot;momentary dream&quot; gently.&lt;/p&gt;
&lt;p&gt;Thank you for the love you gave me — a beautiful bouquet with a bloom of 20.5 days.&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-3&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #2: Reclaiming Lost Curiosity</title><link>https://ursb.me/en/posts/weekly-2/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-2/</guid><description>Explores why curiosity fades with age and technology, using Leonardo da Vinci as an example to outline ways to rebuild it through observation and reflection.</description><pubDate>Sat, 14 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Reclaiming Lost Curiosity&lt;/h2&gt;
&lt;p&gt;I read two articles about curiosity this week — &lt;a href=&quot;https://sspai.com/post/72878&quot;&gt;&lt;em&gt;If Time Has Trimmed Our Curiosity as We Grow Up, Should We Blame Time?&lt;/em&gt;&lt;/a&gt; and &lt;a href=&quot;https://sspai.com/post/72993&quot;&gt;&lt;em&gt;Rediscovering Curiosity: A Self-Help Guide to Learning Motivation&lt;/em&gt;&lt;/a&gt;. This issue, I want to build on those two pieces and share my own thoughts on curiosity.&lt;/p&gt;
&lt;p&gt;First, a quick summary of the core ideas from each article.&lt;/p&gt;
&lt;p&gt;On where curiosity comes from: curiosity is described as &quot;the emotional drive that compels us to seek out knowledge.&quot; When triggered, it stimulates the caudate nucleus, which releases dopamine — the same chemical that makes us feel pleasure.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Curiosity is the primal force that leads us toward knowledge and pattern recognition.&lt;/strong&gt; Sadly, as we age, curiosity tends to shrink. The desire to read fades. Curiosity is like a sprite — hard to pin down, slipping away from us somewhere in the course of growing up.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On why we lose it, the articles point to two causes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internal: trimmed by time&lt;/li&gt;
&lt;li&gt;External: severed by technology&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&quot;Trimmed by time&quot; refers to the cognitive bias that develops as we enter society. We preferentially absorb information that fits our existing worldview, forming a kind of filter bubble — one that keeps reinforcing our beliefs until we slowly stop being curious about anything outside them. &quot;Because of social conditioning, our curiosity is steadily pruned; and because of busyness, it gets gradually exhausted.&quot;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220514120310.png&quot; alt=&quot;&quot; /&gt;&quot;Severed by technology&quot; is illustrated with this example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Internet search and algorithmic recommendation can deliver any information you want instantly. You might type the first character of a search query and the dropdown has already predicted the question. You might not even start typing before the platform has surfaced what you wanted. It&apos;s like Doraemon&apos;s Anywhere Door — one impulse and you&apos;re already at the destination. What you miss is the scenery along the way, or the spontaneous detour you might have taken.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The speed and immediacy of the internet cuts off many of our encounters with the world, and with them, many of our chances to feel curious.&lt;/p&gt;
&lt;p&gt;Both articles also discuss types of curiosity and pathological curiosity, but I won&apos;t go into those here — if you&apos;re interested, I recommend reading the originals. What I want to focus on is how to &lt;em&gt;cultivate&lt;/em&gt; curiosity.&lt;/p&gt;
&lt;p&gt;Reading &lt;em&gt;Leonardo da Vinci&lt;/em&gt; a while back gave me a new appreciation for just how remarkable Leonardo was. I knew he was a painter, but the scope of his work is almost unbelievable — music, architecture, mathematics, geometry, anatomy, physiology, zoology, botany, astronomy, meteorology, geology, geography, physics, optics, mechanics, civil engineering, and invention:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In astronomy, he hypothesized heliocentrism — the sun at the center — 40 years before Copernicus.&lt;/li&gt;
&lt;li&gt;In physics, he invented a hydraulic coupling device and proposed the concept of gravity 200 years before Newton.&lt;/li&gt;
&lt;li&gt;In optics, he was the first to suggest that light, like sound, travels as a wave, and that the speed of light is finite.&lt;/li&gt;
&lt;li&gt;In architecture, he designed bridges, churches, castles, and sewers, and was the first to propose separating pedestrian and vehicle traffic.&lt;/li&gt;
&lt;li&gt;In meteorology, he discovered refraction and explained why the sky is blue.&lt;/li&gt;
&lt;li&gt;In military science, he designed helicopters, aircraft, parachutes, machine guns, grenades, submarines, tanks, cranes, and diving equipment — not all built, but all drawn.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Reading this, I honestly wondered if he was a time traveler. The book&apos;s explanation: Leonardo&apos;s surviving notebooks run to nearly 30,000 pages. From what we can see in them, he was profoundly curious — seizing every opportunity to ask specialists detailed questions about their fields, living each day in a state of inquiry. His very last diary entry, written near death, reads: &lt;em&gt;&quot;Tomorrow I need to figure out exactly what shape a woodpecker&apos;s tongue is.&quot;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;How many of us today would even wonder that? Probably some — but the moment the question forms, we&apos;d just search it up and get an instant answer. This is an age of convenience, but also an age that erodes curiosity. Leonardo wasn&apos;t just interested in the &lt;em&gt;answers&lt;/em&gt; — he was in love with the &lt;em&gt;process&lt;/em&gt; of discovering them. He spent 169 pages trying to square a circle. He pursued a single question for years without stopping. He was deeply, joyfully absorbed — in a state of flow — throughout his life.&lt;/p&gt;
&lt;p&gt;The last person who left this kind of impression on me was Wittgenstein. Philosophy itself starts with curiosity about the world — the desire to know is part of human nature.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Both now and at first, wonder drove people to philosophize. At first they were struck by the more obvious difficulties, then advanced to wonder about greater things — the changes of the moon and sun and stars, and the origin of the universe. — Aristotle&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Most knowledge, in a practical sense, has no direct use in our daily lives. And yet we pursue it — purely because we&apos;re curious.&lt;/p&gt;
&lt;p&gt;So how do we keep curiosity alive? I&apos;ve distilled it into three points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Observe carefully and follow things to their roots&lt;/li&gt;
&lt;li&gt;Extend the points of contact between yourself and the world&lt;/li&gt;
&lt;li&gt;Keep expanding your thinking&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Observe carefully and follow things to their roots.&lt;/strong&gt; This means maintaining a childlike sense of wonder, keeping your senses sharp, and never stopping at the surface. &quot;Stay hungry, stay foolish.&quot; Keep asking until your curiosity is satisfied. The Chinese word for &quot;knowledge&quot; (学问) literally combines &quot;study&quot; and &quot;question&quot; — because asking is the more important part. So what should you ask about?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Extend your points of contact with the world.&lt;/strong&gt; For every new thing you encounter, ask: What is this? What does it bring? What does it mean? How does it connect to me? Most opportunities emerge from the collision of possibilities — keep colliding with the world, generating new connections and &quot;touchpoints.&quot; And once you have answers, then what?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keep expanding your thinking.&lt;/strong&gt; Use each answer to generate new questions. Seek out more information, update your mental model, build more touchpoints, link them together, and keep growing your web of understanding. Don&apos;t just admire the view from where you&apos;re standing — keep moving. Technology can feel like an enemy of curiosity, the ease of search seemingly making us complacent. But if you stay in an active, exploratory mindset — using technology as a tool rather than a crutch — you&apos;ll find that it actually gives curiosity wings. You can swim through oceans of information and forests of ideas, generating more creativity and vitality than ever before.&lt;/p&gt;
&lt;p&gt;To put it simply: all curiosity begins with observation. When something surprises or intrigues you, keep asking — about its nature, about its connection to you, about the possibilities it suggests. Then expand outward, discovering ever-larger spaces and more possibilities, like a widening spiral that feeds more and more curiosity.&lt;/p&gt;
&lt;h2&gt;Weekly Picks&lt;/h2&gt;
&lt;h3&gt;App: AltTab (macOS)&lt;/h3&gt;
&lt;p&gt;Switching between windows on a Mac can be frustrating. &lt;code&gt;Cmd+Tab&lt;/code&gt; doesn&apos;t show a window preview, and it only switches between apps — not between individual windows within the same app.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://alt-tab-macos.netlify.app&quot;&gt;AltTab&lt;/a&gt; fixes this problem elegantly. Install it via Homebrew:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;brew install alt-tab
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once installed, &lt;code&gt;Alt+Tab&lt;/code&gt; lets you cycle through every open window on the system (including multiple windows within the same app), with a live preview so you can jump exactly where you want.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220511221000.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;App: Contexts (macOS)&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://contexts.co/&quot;&gt;Contexts&lt;/a&gt; is a competing app in the same space — a more established &quot;context switching&quot; tool for Mac.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220514133901.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Flutter 3.0 Released&lt;/h3&gt;
&lt;p&gt;Flutter 3.0 was announced at Google I/O on Wednesday, with a strong focus on multi-platform support — this version adds macOS and Linux app builds. Worth thinking about what this means for Electron.&lt;/p&gt;
&lt;p&gt;Reference: &lt;a href=&quot;https://medium.com/flutter/whats-new-in-flutter-3-8c74a5bc32d0&quot;&gt;What&apos;s new in Flutter 3 | Medium&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;React State Management Libraries&lt;/h3&gt;
&lt;p&gt;Finally, a roundup of popular React state management libraries worth knowing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://redux.js.org/&quot;&gt;Redux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/pmndrs/zustand&quot;&gt;Zustand&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/pmndrs/jotai&quot;&gt;Jotai&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://recoiljs.org/&quot;&gt;Recoiljs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mobx.js.org/README.html&quot;&gt;Mobx&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220514133624.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/statelyai/xstate&quot;&gt;XState&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220514133641.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-2&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Weekly #1: The Beginning — Why I&apos;m Starting a Newsletter</title><link>https://ursb.me/en/posts/weekly-1/</link><guid isPermaLink="true">https://ursb.me/en/posts/weekly-1/</guid><description>The debut issue of a weekly newsletter, explaining the shift from long, heavy blog essays to lighter, more frequent writing, with reflections on impermanence and Nintendo&apos;s game design philosophy.</description><pubDate>Sat, 07 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Why I&apos;m Starting a Newsletter&lt;/h2&gt;
&lt;p&gt;The posts on my &lt;a href=&quot;https://me.ursb.me/&quot;&gt;blog&lt;/a&gt; tend to be long and heavy — usually 4,000 words or more. Because I care about quality, writing each one takes a lot of energy and time, and that creates a kind of pressure that makes it hard to write consistently.&lt;/p&gt;
&lt;p&gt;A couple of years ago I set a goal to publish one post a month, but I only kept it up for six months before it fell apart. Once work got busy, I couldn&apos;t carve out the long, uninterrupted stretches of time needed to sit down and actually write. Looking back, the only periods when I could reliably produce writing were during national holidays — May Day, National Day. That made my output rate way too low, and the topics too narrow, which defeated the whole purpose.&lt;/p&gt;
&lt;p&gt;In my &lt;a href=&quot;https://me.ursb.me/archives/2021.html&quot;&gt;2021 Year in Review&lt;/a&gt; I described my knowledge pipeline: I use Drafts to capture quick highlights while reading — &quot;fragment intake&quot; — and then do a &quot;periodic consolidation&quot; once a week, organizing everything into LogSeq.&lt;/p&gt;
&lt;p&gt;Here&apos;s a screenshot of what those notes look like after a simple pass:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20220507110437.png&quot; alt=&quot;&quot; /&gt;But I&apos;ve come to realize that this is still just &lt;em&gt;input&lt;/em&gt;. I haven&apos;t been pushing my thoughts outward into real &lt;em&gt;output&lt;/em&gt;. Friends have complained that I don&apos;t produce much. Blogging is my preferred output format, but I want something lighter and more frequent — something like how I used to write back in 2014–2017, when my old blog was full of casual essays, unpolished and unguarded.&lt;/p&gt;
&lt;p&gt;Last week I stumbled across something on my blog that surprised me: one of my readers runs their own &lt;a href=&quot;https://4ark.me/post/weekly-01.html&quot;&gt;weekly newsletter column&lt;/a&gt;, and I found a few others who do the same kind of &lt;a href=&quot;https://www.codedump.info/post/20220116-weekly-1/&quot;&gt;weekly writing&lt;/a&gt; — combining a bit of depth and reflection with regular sharing. I really love that format.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The easiest way to make reading useful is this: the moment you have an insight or idea, write it down immediately and post it publicly on social media, even if it&apos;s unpolished. The act of writing is itself a step in deep thinking. Valuable feedback from others can help you refine the idea or give you new threads to pull on. Accumulate enough of this and real insights will emerge naturally. Reading and taking notes alone, in isolation, rarely sharpens thinking quickly. — &lt;a href=&quot;https://weibo.com/5339148412/L6LhDE7Zu&quot;&gt;Silicon Valley Wang Chuan on Weibo&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;After all that thinking, I&apos;ve decided to start a newsletter. I might miss an issue here and there, but now that I&apos;ve started, I&apos;ll use this regular rhythm to keep pushing myself forward. For me, it serves two purposes: it pressures me to keep my input high quality, and it closes the distance between me and my readers. I&apos;ve noticed that my blog has both tech posts and personal/life posts, but readers tend to prefer the personal ones — especially my annual year-in-review posts, which always get the most traffic. Some readers remind me every December not to be late with the year-end summary. Ha.&lt;/p&gt;
&lt;p&gt;So, the motivation is there. What will I actually share?&lt;/p&gt;
&lt;p&gt;If the newsletter is just a pile of notes and recommendations with no real substance, it won&apos;t serve the purpose of genuine output. So each issue will have two parts: a &lt;strong&gt;Featured Topic&lt;/strong&gt; and &lt;strong&gt;Weekly Picks&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Featured Topic&lt;/strong&gt;: A central theme for the issue. This is the main body of the newsletter — my observations and thoughts on that theme, written like an essay. This issue&apos;s featured topic is, naturally, &quot;why I&apos;m starting a newsletter.&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weekly Picks&lt;/strong&gt;: Split between tech and life. On the tech side: useful tools I&apos;ve found, high-quality articles, interesting technical problems I&apos;ve run into at work. On the life side: personal experiences, things I&apos;ve been reading, and whatever&apos;s been on my mind.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And now, on to the recommendations~&lt;/p&gt;
&lt;h2&gt;Weekly Picks&lt;/h2&gt;
&lt;h3&gt;On Expiration Dates&lt;/h3&gt;
&lt;p&gt;I finished reading &lt;em&gt;Paradox 13&lt;/em&gt; last week. In that end-of-world scenario, the main characters face a food shortage and spoilage problem, which made me think of this line from &lt;em&gt;Chungking Express&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I don&apos;t know when it started, but everything has a date stamped on it. Canned sardines. Canned ham. Even plastic wrap. I started wondering: is there anything in this world that doesn&apos;t expire?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Is there anything in this world that doesn&apos;t expire? Nothing lasts forever.&lt;/p&gt;
&lt;h3&gt;On Nintendo&apos;s Games&lt;/h3&gt;
&lt;p&gt;I came across a great &lt;a href=&quot;https://www.bilibili.com/video/BV1HS4y1a7ce?spm_id_from=333.880.header_right.fav_list.click&quot;&gt;video about Nintendo&lt;/a&gt; this week. When people talk about Nintendo games, one word always comes to mind: &lt;em&gt;fun&lt;/em&gt;. And it was Gunpei Yokoi who laid the foundation for Nintendo&apos;s design philosophy:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;An easy shortcut to compensate for insufficient game creativity is to compete on CPU performance, graphics, and sound — using raw hardware to paper over a game&apos;s weaknesses.&quot; — Gunpei Yokoi&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At its core, gameplay is the purest thing that draws players in. Nintendo&apos;s strategy of expanding its audience means their games are designed for everyone — including young children. On this point, Reggie Fils-Aime, then President of Nintendo of America, said in an interview with the &lt;em&gt;Toronto Star&lt;/em&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;We&apos;re very happy that our competitors don&apos;t focus on the kids&apos; and family game market. It&apos;s actually a very important market, because the 5- and 6-year-olds of today will grow into teenagers and adults who remain our loyal users. And when you play &lt;em&gt;Kirby&lt;/em&gt;, &lt;em&gt;The Legend of Zelda&lt;/em&gt;, or &lt;em&gt;Mario Kart&lt;/em&gt; with your family, it brings you closer together.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&apos;s hard to imagine a company like Nintendo emerging from China&apos;s gaming environment. Game licenses get restricted by government policy; a single directive can wipe out an entire genre of business overnight. Everyone&apos;s anxious, and the rules are opaque — the more unpredictable the rules, the more powerful the threat. So developers chase quick money, endlessly iterating on monetization schemes. Real quality, it seems, can barely take root.&lt;/p&gt;
&lt;p&gt;Recommended watching:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1HS4y1a7ce?spm_id_from=333.880.header_right.fav_list.click&quot;&gt;What Makes Nintendo So Remarkable? [Business 02]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1dt411W7Zf?spm_id_from=333.999.0.0&quot;&gt;Nintendo: The One and Only — Past, Present, and Future&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.sohu.com/a/236726930_100161178&quot;&gt;Nintendo Says: We&apos;re Glad Our Competitors Ignore the Kids&apos; and Family Market&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=weekly-1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>weekly</category></item><item><title>Engine Internals: String-to-Number Conversion in JavaScript</title><link>https://ursb.me/en/posts/js-string-to-number/</link><guid isPermaLink="true">https://ursb.me/en/posts/js-string-to-number/</guid><description>Compares nine ways to convert strings to numbers in JavaScript, benchmarks them, and traces how parseInt and parseFloat are implemented inside the V8 engine.</description><pubDate>Tue, 03 May 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;JavaScript offers nine ways to convert a string to a number:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;parseInt()&lt;/li&gt;
&lt;li&gt;parseFloat()&lt;/li&gt;
&lt;li&gt;Number()&lt;/li&gt;
&lt;li&gt;Double tilde (~~) Operator&lt;/li&gt;
&lt;li&gt;Unary Operator (+)&lt;/li&gt;
&lt;li&gt;Math.floor()&lt;/li&gt;
&lt;li&gt;Multiply with number&lt;/li&gt;
&lt;li&gt;The Signed Right Shift Operator (&amp;gt;&amp;gt;)&lt;/li&gt;
&lt;li&gt;The Unsigned Right Shift Operator (&amp;gt;&amp;gt;&amp;gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&apos;s a comparison table showing how these methods differ in behavior:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/media/20220503/covert_string_to_number.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The source code for this comparison table is available at &lt;a href=&quot;https://airing.ursb.me/web/int.html&quot;&gt;https://airing.ursb.me/web/int.html&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Beyond behavioral differences, there are also significant performance differences. Here are micro-benchmark results in Node.js (V8 engine):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;parseInt() x 19,140,190 ops/sec ±0.45% (92 runs sampled)
parseFloat() x 28,203,053 ops/sec ±0.25% (95 runs sampled)
Number() x 1,041,209,524 ops/sec ±0.20% (90 runs sampled)
Double tilde (~~) Operator x 1,035,220,963 ops/sec ±1.65% (97 runs sampled)
Math.floor() x 28,224,678 ops/sec ±0.23% (96 runs sampled)
Unary Operator (+) x 1,045,129,381 ops/sec ±0.17% (95 runs sampled)
Multiply with number x 1,044,176,084 ops/sec ±0.15% (93 runs sampled)
The Signed Right Shift Operator(&amp;gt;&amp;gt;) x 1,046,016,782 ops/sec ±0.11% (96 runs sampled)
The Unsigned Right Shift Operator(&amp;gt;&amp;gt;&amp;gt;) x 1,045,384,959 ops/sec ±0.08% (96 runs sampled)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;parseInt()&lt;/code&gt;, &lt;code&gt;parseFloat()&lt;/code&gt;, and &lt;code&gt;Math.floor()&lt;/code&gt; are dramatically slower — around 2% the speed of the others, with &lt;code&gt;parseInt()&lt;/code&gt; being the slowest at barely 1%.&lt;/p&gt;
&lt;p&gt;Why such dramatic differences? What&apos;s actually happening under the hood? Let&apos;s explore the concrete implementations in V8, JavaScriptCore, and QuickJS — three mainstream JS engines.&lt;/p&gt;
&lt;p&gt;Starting with &lt;code&gt;parseInt()&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;1. parseInt()&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://tc39.es/ecma262/#sec-parseint-string-radix&quot;&gt;ECMAScript (ECMA-262) parseInt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/media/20220503/Pasted%20image%2020220503111054.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;1.1 parseInt() in V8&lt;/h3&gt;
&lt;p&gt;In V8&apos;s [→ src/init/bootstrapper.cc], built-in JS language objects are registered. Here&apos;s the &lt;code&gt;parseInt&lt;/code&gt; registration:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Handle&amp;lt;JSFunction&amp;gt; number_fun = InstallFunction(isolate_, global, &quot;Number&quot;, JS_PRIMITIVE_WRAPPER_TYPE, JSPrimitiveWrapper::kHeaderSize, 0, isolate_-&amp;gt;initial_object_prototype(), Builtin::kNumberConstructor);

// Install Number.parseInt and Global.parseInt.
Handle&amp;lt;JSFunction&amp;gt; parse_int_fun = SimpleInstallFunction(isolate_, number_fun, &quot;parseInt&quot;, Builtin::kNumberParseInt, 2, true);

JSObject::AddProperty(isolate_, global_object, &quot;parseInt&quot;, parse_int_fun,
 native_context()-&amp;gt;set_global_parse_int_fun(*parse_int_fun);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Both &lt;code&gt;Number.parseInt&lt;/code&gt; and the global &lt;code&gt;parseInt&lt;/code&gt; are registered via &lt;code&gt;SimpleInstallFunction&lt;/code&gt;, binding the API to a Builtin. When JS calls &lt;code&gt;parseInt&lt;/code&gt;, the engine calls &lt;code&gt;Builtin::kNumberParseInt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Builtins in V8 are code blocks executable at VM runtime. V8 currently supports five implementation types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Platform-dependent assembly&lt;/strong&gt;: very efficient, but requires manual porting to each platform and is hard to maintain.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C++&lt;/strong&gt;: similar to runtime functions, full access to V8&apos;s runtime capabilities, but generally unsuitable for performance-sensitive areas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;: slow runtime calls, unpredictable performance from type pollution, complex JS semantics. V8 no longer uses JS builtins.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CodeStubAssembler&lt;/strong&gt;: efficient low-level code close to assembly, but platform-agnostic and readable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Torque&lt;/strong&gt;: an improved version of CodeStubAssembler with TypeScript-like syntax. Easier to write without sacrificing performance. Many modern builtins use Torque.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The function &lt;code&gt;Builtin::kNumberParseInt&lt;/code&gt; maps to &lt;code&gt;NumberParseInt&lt;/code&gt;, implemented in Torque at [→ src/builtins/number.tq]:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ES6 #sec-number.parseint
transitioning javascript builtin NumberParseInt(
    js-implicit context: NativeContext)(value: JSAny, radix: JSAny): Number {
  return ParseInt(value, radix);
}

transitioning builtin ParseInt(implicit context: Context)(
    input: JSAny, radix: JSAny): Number {
  try {
    // Check if radix should be 10 (i.e. undefined, 0 or 10).
    if (radix != Undefined &amp;amp;&amp;amp; !TaggedEqual(radix, SmiConstant(10)) &amp;amp;&amp;amp;
        !TaggedEqual(radix, SmiConstant(0))) {
      goto CallRuntime;
    }

    typeswitch (input) {
      case (s: Smi): {
        return s;
      }
      case (h: HeapNumber): {
        // Check if the input value is in Signed32 range.
        const asFloat64: float64 = Convert&amp;lt;float64&amp;gt;(h);
        const asInt32: int32 = Signed(TruncateFloat64ToWord32(asFloat64));
        // The sense of comparison is important for the NaN case.
        if (asFloat64 == ChangeInt32ToFloat64(asInt32)) goto Int32(asInt32);

        // Check if the absolute value of input is in the [1,1&amp;lt;&amp;lt;31[ range.
        const kMaxAbsValue: float64 = 2147483648.0;
        const absInput: float64 = math::Float64Abs(asFloat64);
        if (absInput &amp;lt; kMaxAbsValue &amp;amp;&amp;amp; absInput &amp;gt;= 1.0) goto Int32(asInt32);
        goto CallRuntime;
      }
      case (s: String): {
        goto String(s);
      }
      case (HeapObject): {
        goto CallRuntime;
      }
    }
  } label Int32(i: int32) {
    return ChangeInt32ToTagged(i);
  } label String(s: String) {
    // Check if the string is a cached array index.
    const hash: NameHash = s.raw_hash_field;
    if (IsIntegerIndex(hash) &amp;amp;&amp;amp;
        hash.array_index_length &amp;lt; kMaxCachedArrayIndexLength) {
      const arrayIndex: uint32 = hash.array_index_value;
      return SmiFromUint32(arrayIndex);
    }
    // Fall back to the runtime.
    goto CallRuntime;
  } label CallRuntime {
    tail runtime::StringParseInt(input, radix);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A quick intro to V8&apos;s data structures (see [→ src/objects/objects.h] for all definitions):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Smi&lt;/strong&gt;: inherits from Object; &quot;small immediate integer,&quot; only 31 bits&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HeapObject&lt;/strong&gt;: inherits from Object; superclass for everything allocated on the heap&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PrimitiveHeapObject&lt;/strong&gt;: inherits from HeapObject&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HeapNumber&lt;/strong&gt;: inherits from PrimitiveHeapObject; a heap object storing a number (used for large integers)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;parseInt&lt;/code&gt; accepts two parameters: &lt;code&gt;parseInt(string, radix)&lt;/code&gt;. The flow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First, check if &lt;code&gt;radix&lt;/code&gt; is absent, 0, or 10. If not, it&apos;s non-decimal — fall back to the runtime &lt;code&gt;runtime::StringParseInt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If it is decimal, check the type of the first argument.
&lt;ul&gt;
&lt;li&gt;If it&apos;s a Smi or an in-range (non-overflowing) HeapNumber, return the input directly — no conversion needed. If it overflows, &lt;code&gt;ChangeInt32ToTagged&lt;/code&gt; is called, which force-casts to Int32 — results may be unexpected.&lt;/li&gt;
&lt;li&gt;If it&apos;s a String, check whether it&apos;s a cached array index. If so, return the integer value; otherwise fall back to &lt;code&gt;runtime::StringParseInt&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The focus shifts to &lt;code&gt;runtime::StringParseInt&lt;/code&gt; in [→ src/runtime/runtime-numbers.cc]:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ES6 18.2.5 parseInt(string, radix) slow path
RUNTIME_FUNCTION(Runtime_StringParseInt) {
  HandleScope handle_scope(isolate);
  DCHECK_EQ(2, args.length());
  Handle&amp;lt;Object&amp;gt; string = args.at(0);
  Handle&amp;lt;Object&amp;gt; radix = args.at(1);

  Handle&amp;lt;String&amp;gt; subject;
  ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, subject,
                                     Object::ToString(isolate, string));
  subject = String::Flatten(isolate, subject);

  if (!radix-&amp;gt;IsNumber()) {
    ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, radix,
                                       Object::ToNumber(isolate, radix));
  }
  int radix32 = DoubleToInt32(radix-&amp;gt;Number());
  if (radix32 != 0 &amp;amp;&amp;amp; (radix32 &amp;lt; 2 || radix32 &amp;gt; 36)) {
    return ReadOnlyRoots(isolate).nan_value();
  }

  double result = StringToInt(isolate, subject, radix32);
  return *isolate-&amp;gt;factory()-&amp;gt;NewNumber(result);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Worth noting: per the standard, if &lt;code&gt;radix&lt;/code&gt; is outside the range [2, 36], &lt;code&gt;NaN&lt;/code&gt; is returned.&lt;/p&gt;
&lt;h3&gt;1.2 parseInt() in JavaScriptCore&lt;/h3&gt;
&lt;p&gt;JavaScriptCore registers built-in functions in [→ runtime/JSGlobalObjectFunctions.cpp]:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;JSC_DEFINE_HOST_FUNCTION(globalFuncParseInt, (JSGlobalObject* globalObject, CallFrame* callFrame))
{
    JSValue value = callFrame-&amp;gt;argument(0);
    JSValue radixValue = callFrame-&amp;gt;argument(1);

    // Optimized handling for numbers:
    // If the argument is 0 or a number in range 10^-6 &amp;lt;= n &amp;lt; INT_MAX+1, then parseInt
    // results in a truncation to integer.
    static const double tenToTheMinus6 = 0.000001;
    static const double intMaxPlusOne = 2147483648.0;
    if (value.isNumber()) {
        double n = value.asNumber();
        if (((n &amp;lt; intMaxPlusOne &amp;amp;&amp;amp; n &amp;gt;= tenToTheMinus6) || !n) &amp;amp;&amp;amp; radixValue.isUndefinedOrNull())
            return JSValue::encode(jsNumber(static_cast&amp;lt;int32_t&amp;gt;(n)));
    }

    return toStringView(globalObject, value, [&amp;amp;] (StringView view) {
        return JSValue::encode(jsNumber(parseInt(view, radixValue.toInt32(globalObject))));
    });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The comments are thorough — I&apos;ll let them speak for themselves. Ultimately it calls &lt;code&gt;parseInt&lt;/code&gt;, whose core implementation lives in [→ runtime/ParseInt.h]. The code follows the ECMAScript spec step by step with excellent comments — I highly recommend reading it directly.&lt;/p&gt;
&lt;h3&gt;1.3 parseInt() in QuickJS&lt;/h3&gt;
&lt;p&gt;QuickJS&apos;s core is in [→ quickjs.c]. The registration:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static const JSCFunctionListEntry js_global_funcs[] = {
    JS_CFUNC_DEF(&quot;parseInt&quot;, 2, js_parseInt ),
//...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;js_parseInt&lt;/code&gt; implementation:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static JSValue js_parseInt(JSContext *ctx, JSValueConst this_val,
                           int argc, JSValueConst *argv)
{
    const char *str, *p;
    int radix, flags;
    JSValue ret;

    str = JS_ToCString(ctx, argv[0]);
    if (!str)
        return JS_EXCEPTION;
    if (JS_ToInt32(ctx, &amp;amp;radix, argv[1])) {
        JS_FreeCString(ctx, str);
        return JS_EXCEPTION;
    }
    if (radix != 0 &amp;amp;&amp;amp; (radix &amp;lt; 2 || radix &amp;gt; 36)) {
        ret = JS_NAN;
    } else {
        p = str;
        p += skip_spaces(p);
        flags = ATOD_INT_ONLY | ATOD_ACCEPT_PREFIX_AFTER_SIGN;
        ret = js_atof(ctx, p, NULL, radix, flags);
    }
    JS_FreeCString(ctx, str);
    return ret;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Bellard&apos;s code has minimal comments but is wonderfully concise.&lt;/p&gt;
&lt;p&gt;All three engines implement &lt;code&gt;parseInt&lt;/code&gt; based on the ECMAScript standard, but each has its own style — reading them feels like comparing three authors with distinct voices.&lt;/p&gt;
&lt;p&gt;Looking at the standard vs. the implementations, we can see that &lt;code&gt;parseInt&lt;/code&gt; does a lot of preliminary work before the actual string-to-number conversion: input validation, default values, string normalization, range checks, and more. That&apos;s why it&apos;s slower — not because the core math is expensive, but because of all the setup.&lt;/p&gt;
&lt;p&gt;Next, let&apos;s look at &lt;code&gt;parseFloat&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;2. parseFloat()&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://tc39.es/ecma262/#sec-parsefloat-string&quot;&gt;ECMAScript (ECMA-262) parseFloat&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/media/20220503/Pasted%20image%2020220503110924.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Two key differences from &lt;code&gt;parseInt&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Only one parameter — no radix support&lt;/li&gt;
&lt;li&gt;Returns floating-point values&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2.1 parseFloat() in V8&lt;/h3&gt;
&lt;p&gt;The relevant code lives right next to &lt;code&gt;parseInt&lt;/code&gt;. The key part [→ src/builtins/number.tq]:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ES6 #sec-number.parsefloat
transitioning javascript builtin NumberParseFloat(
    js-implicit context: NativeContext)(value: JSAny): Number {
  try {
    typeswitch (value) {
      case (s: Smi): {
        return s;
      }
      case (h: HeapNumber): {
        // Take care of -0.
        return (Convert&amp;lt;float64&amp;gt;(h) == 0) ? SmiConstant(0) : h;
      }
      case (s: String): {
        goto String(s);
      }
      case (HeapObject): {
        goto String(string::ToString(context, value));
      }
    }
  } label String(s: String) {
    const hash: NameHash = s.raw_hash_field;
    if (IsIntegerIndex(hash) &amp;amp;&amp;amp;
        hash.array_index_length &amp;lt; kMaxCachedArrayIndexLength) {
      const arrayIndex: uint32 = hash.array_index_value;
      return SmiFromUint32(arrayIndex);
    }
    return runtime::StringParseFloat(s);
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And [→ src/runtime/runtime-numbers.cc]:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ES6 18.2.4 parseFloat(string)
RUNTIME_FUNCTION(Runtime_StringParseFloat) {
  HandleScope shs(isolate);
  DCHECK_EQ(1, args.length());
  Handle&amp;lt;String&amp;gt; subject = args.at&amp;lt;String&amp;gt;(0);

  double value = StringToDouble(isolate, subject, ALLOW_TRAILING_JUNK,
                                std::numeric_limits&amp;lt;double&amp;gt;::quiet_NaN());

  return *isolate-&amp;gt;factory()-&amp;gt;NewNumber(value);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Simpler than &lt;code&gt;parseInt&lt;/code&gt;, reflecting the simpler spec.&lt;/p&gt;
&lt;h3&gt;2.2 parseFloat() in JavaScriptCore&lt;/h3&gt;
&lt;p&gt;Even more concise:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static double parseFloat(StringView s)
{
    unsigned size = s.length();

    if (size == 1) {
        UChar c = s[0];
        if (isASCIIDigit(c))
            return c - &apos;0&apos;;
        return PNaN;
    }

    if (s.is8Bit()) {
        const LChar* data = s.characters8();
        const LChar* end = data + size;

        for (; data &amp;lt; end; ++data) {
            if (!isStrWhiteSpace(*data))
                break;
        }

        if (data == end)
            return PNaN;

        return jsStrDecimalLiteral(data, end);
    }

    const UChar* data = s.characters16();
    const UChar* end = data + size;

    for (; data &amp;lt; end; ++data) {
        if (!isStrWhiteSpace(*data))
            break;
    }

    if (data == end)
        return PNaN;

    return jsStrDecimalLiteral(data, end);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.3 parseFloat() in QuickJS&lt;/h3&gt;
&lt;p&gt;QuickJS fits it in 12 lines:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;static JSValue js_parseFloat(JSContext *ctx, JSValueConst this_val,
                             int argc, JSValueConst *argv)
{
    const char *str, *p;
    JSValue ret;

    str = JS_ToCString(ctx, argv[0]);
    if (!str)
        return JS_EXCEPTION;
    p = str;
    p += skip_spaces(p);
    ret = js_atof(ctx, p, NULL, 10, 0);
    JS_FreeCString(ctx, str);
    return ret;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The brevity is intentional — the latest ECMAScript spec doesn&apos;t require the ASCII/8-bit compatibility checks that JavaScriptCore includes, and QuickJS stays minimal.&lt;/p&gt;
&lt;h2&gt;3. Number()&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://tc39.es/ecma262/#sec-number-constructor-number-value&quot;&gt;ECMAScript (ECMA-262) Number ( value )&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/media/20220503/Pasted%20image%2020220503110831.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3.1 Number() in V8&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Number&lt;/code&gt; is registered in [→ src/init/bootstrapper.cc]. The constructor &lt;code&gt;Builtin::kNumberConstructor&lt;/code&gt; is implemented in Torque [→ src/builtins/constructor.tq]:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ES #sec-number-constructor
transitioning javascript builtin
NumberConstructor(
    js-implicit context: NativeContext, receiver: JSAny, newTarget: JSAny,
    target: JSFunction)(...arguments): JSAny {
  // 1. If no arguments were passed to this function invocation, let n be +0.
  let n: Number = 0;
  if (arguments.length &amp;gt; 0) {
    // 2. Else,
    //    a. Let prim be ? ToNumeric(value).
    //    b. If Type(prim) is BigInt, let n be the Number value for prim.
    //    c. Otherwise, let n be prim.
    const value = arguments[0];
    n = ToNumber(value, BigIntHandling::kConvertToNumber);
  }

  // 3. If NewTarget is undefined, return n.
  if (newTarget == Undefined) return n;

  const target: JSFunction = LoadTargetFromFrame();
  const result = UnsafeCast&amp;lt;JSPrimitiveWrapper&amp;gt;(
      FastNewObject(context, target, UnsafeCast&amp;lt;JSReceiver&amp;gt;(newTarget)));
  result.value = n;
  return result;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Steps 1–6 in the comments map directly to the ECMAScript spec. Notably, &lt;code&gt;Number&lt;/code&gt; explicitly supports BigInt — which is why our comparison table showed those results.&lt;/p&gt;
&lt;h3&gt;3.2 Number() in JavaScriptCore&lt;/h3&gt;
&lt;p&gt;Same logic as V8, closely following the spec [→ runtime/NumberConstructor.cpp]:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// ECMA 15.7.1
JSC_DEFINE_HOST_FUNCTION(constructNumberConstructor, (JSGlobalObject* globalObject, CallFrame* callFrame))
{
    VM&amp;amp; vm = globalObject-&amp;gt;vm();
    auto scope = DECLARE_THROW_SCOPE(vm);
    double n = 0;
    if (callFrame-&amp;gt;argumentCount()) {
        JSValue numeric = callFrame-&amp;gt;uncheckedArgument(0).toNumeric(globalObject);
        RETURN_IF_EXCEPTION(scope, { });
        if (numeric.isNumber())
            n = numeric.asNumber();
        else {
            ASSERT(numeric.isBigInt());
            numeric = JSBigInt::toNumber(numeric);
            ASSERT(numeric.isNumber());
            n = numeric.asNumber();
        }
    }
    // ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.3 Number() in QuickJS&lt;/h3&gt;
&lt;p&gt;QuickJS makes BigInt support configurable via &lt;code&gt;CONFIG_BIGNUM&lt;/code&gt; — a reflection of its philosophy of staying lean and customizable.&lt;/p&gt;
&lt;h2&gt;4. Double Tilde (~~) Operator&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://tc39.es/ecma262/#sec-bitwise-not-operator-runtime-semantics-evaluation&quot;&gt;ECMAScript (ECMA-262) Bitwise NOT Operator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/media/20220503/Pasted%20image%2020220503113745.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;~&lt;/code&gt; operator leverages step 2 of the spec — type conversion of the operand — to convert strings to numbers. Let&apos;s see where this happens in the engine.&lt;/p&gt;
&lt;h3&gt;4.1 BitwiseNot in V8&lt;/h3&gt;
&lt;p&gt;V8 identifies unary operators in [→ src/parsing/token.h]. During AST construction in the parsing phase, unary operators are handled via &lt;code&gt;ParseUnaryExpression&lt;/code&gt; and &lt;code&gt;BuildUnaryExpression&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Expression* Parser::BuildUnaryExpression(Expression* expression,
                                         Token::Value op, int pos) {
  DCHECK_NOT_NULL(expression);
  const Literal* literal = expression-&amp;gt;AsLiteral();
  if (literal != nullptr) {
    if (op == Token::NOT) {
      return factory()-&amp;gt;NewBooleanLiteral(literal-&amp;gt;ToBooleanIsFalse(), pos);
    } else if (literal-&amp;gt;IsNumberLiteral()) {
      double value = literal-&amp;gt;AsNumber();
      switch (op) {
        case Token::ADD:
          return expression;
        case Token::SUB:
          return factory()-&amp;gt;NewNumberLiteral(-value, pos);
        case Token::BIT_NOT:
          return factory()-&amp;gt;NewNumberLiteral(~DoubleToInt32(value), pos);
        default:
          break;
      }
    }
  }
  return factory()-&amp;gt;NewUnaryOperation(op, expression, pos);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the literal is a number and the operator is &lt;code&gt;BIT_NOT&lt;/code&gt;, the value is converted to Int32 and bitwise-negated.&lt;/p&gt;
&lt;h3&gt;4.2 BitwiseNot in JavaScriptCore&lt;/h3&gt;
&lt;p&gt;Similarly, during AST construction, when the &lt;code&gt;~&lt;/code&gt; (TILDE) token is encountered:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ExpressionNode* ASTBuilder::makeBitwiseNotNode(const JSTokenLocation&amp;amp; location, ExpressionNode* expr)
{
if (expr-&amp;gt;isNumber())
        return createIntegerLikeNumber(location, ~toInt32(static_cast&amp;lt;NumberNode*&amp;gt;(expr)-&amp;gt;value()));
    return new (m_parserArena) BitwiseNotNode(location, expr);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.3 BitwiseNot in QuickJS&lt;/h3&gt;
&lt;p&gt;QuickJS generates the &lt;code&gt;OP_not&lt;/code&gt; bytecode for &lt;code&gt;~&lt;/code&gt;, then handles it during interpretation in &lt;code&gt;JS_CallInternal&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CASE(OP_not):
{
JSValue op1;
op1 = sp[-1];
if (JS_VALUE_GET_TAG(op1) == JS_TAG_INT) {
sp[-1] = JS_NewInt32(ctx, ~JS_VALUE_GET_INT(op1));
} else {
if (js_not_slow(ctx, sp))
goto exception;
}
}
BREAK;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If it&apos;s already an integer, it just negates it. Otherwise it calls &lt;code&gt;js_not_slow&lt;/code&gt;, which calls &lt;code&gt;JS_ToInt32Free&lt;/code&gt; to perform type conversion first.&lt;/p&gt;
&lt;h2&gt;5. Unary Operator (+)&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://tc39.es/ecma262/#sec-unary-plus-operator-runtime-semantics-evaluation&quot;&gt;ECMAScript (ECMA-262) Unary Plus Operator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/media/20220503/Pasted%20image%2020220503114251.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The unary &lt;code&gt;+&lt;/code&gt; is personally my favorite way to convert strings to numbers. The spec is refreshingly simple — it&apos;s explicitly designed for numeric type conversion.&lt;/p&gt;
&lt;p&gt;The V8 and JavaScriptCore parsing phases work the same as for &lt;code&gt;~~&lt;/code&gt;, so I&apos;ll skip those. In QuickJS&apos;s interpreter:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CASE(OP_plus):
{
    JSValue op1;
uint32_t tag;
op1 = sp[-1];
tag = JS_VALUE_GET_TAG(op1);
if (tag == JS_TAG_INT || JS_TAG_IS_FLOAT64(tag)) {
} else {
if (js_unary_arith_slow(ctx, sp, opcode))
 goto exception;
}
BREAK;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If it&apos;s already Int or Float64, nothing happens — consistent with the spec. For other types, &lt;code&gt;js_unary_arith_slow&lt;/code&gt; handles conversion via &lt;code&gt;JS_ToFloat64Free&lt;/code&gt;, then returns the value as-is for &lt;code&gt;OP_plus&lt;/code&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;That covers five of the nine conversion methods:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;parseInt()&lt;/li&gt;
&lt;li&gt;parseFloat()&lt;/li&gt;
&lt;li&gt;Number()&lt;/li&gt;
&lt;li&gt;Double tilde (~~) Operator&lt;/li&gt;
&lt;li&gt;Unary Operator (+)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The remaining four won&apos;t be covered here due to length constraints:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Math.floor()&lt;/li&gt;
&lt;li&gt;Multiply with number&lt;/li&gt;
&lt;li&gt;The Signed Right Shift Operator (&amp;gt;&amp;gt;)&lt;/li&gt;
&lt;li&gt;The Unsigned Right Shift Operator (&amp;gt;&amp;gt;&amp;gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each method has tradeoffs. Here&apos;s my personal guide for choosing:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you need an integer result:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clean code and maximum performance, with predictable input → use Unary Operator (+)&lt;/li&gt;
&lt;li&gt;Defensive coding for unknown inputs → use parseInt()&lt;/li&gt;
&lt;li&gt;Need BigInt support → prefer Number(); if using Double tilde (~~), watch out for the 31-bit overflow issue&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;If you need a floating-point result:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clean code and maximum performance, with predictable input → use Unary Operator (+)&lt;/li&gt;
&lt;li&gt;Defensive coding for unknown inputs → use parseFloat()&lt;/li&gt;
&lt;li&gt;Need BigInt support → use parseFloat()&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=js-string-to-number&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>2021: Finding My Own Way Forward</title><link>https://ursb.me/en/posts/summary-2021/</link><guid isPermaLink="true">https://ursb.me/en/posts/summary-2021/</guid><description>A 2021 year in review: shipping Flutter Kant into QQ Music, a fast promotion followed by a loss of direction, and reflections on multitasking and anxiety.</description><pubDate>Sun, 30 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Another year, another review. 2021 felt like it went by so fast that I&apos;m still not sure what to call it. After some thought, &quot;finding my own way forward&quot; feels right. The ancient saying goes: &quot;When things don&apos;t go as planned, look inward.&quot; When obstacles appear, the first response shouldn&apos;t be to blame circumstances — it should be self-examination. This year, my most significant growth came through introspection, and this post is more about reflection than summary. Like Murakami, I&apos;m someone who needs to physically write things down to revisit the past and look at it clearly. The act of writing — and re-reading what I&apos;ve written — makes me feel, as he once put it, as though I&apos;m gradually becoming transparent: &quot;like holding up my hand to the light and finding I can see through it to the faint glow beyond.&quot; I hope keeping this habit continues to push me forward.&lt;/p&gt;
&lt;p&gt;Let&apos;s start with work.&lt;/p&gt;
&lt;h2&gt;Work&lt;/h2&gt;
&lt;p&gt;The first half of the year was Flutter Kant — completing the development and integrating Flutter into QQ Music. A milestone. After that, opportunities to do client-side development became rare, and I returned to traditional web work.&lt;/p&gt;
&lt;p&gt;In the middle of the year, having accumulated three consecutive five-star reviews, I became eligible to be evaluated for promotion to T9. After a month of preparation, I passed — with the highest score in my cohort, which surprised me a bit, though in the end a promotion is just a pass or fail. Before joining the company, I&apos;d never imagined reaching T9 within two years of graduation. And yet here I was, a year ahead of my own target.&lt;/p&gt;
&lt;p&gt;At that moment, I experienced the disorientation of losing a goal. If I just reflexively aimed for T10 next year — what would happen if I reached it? What if I didn&apos;t? Did I need to keep chasing?&lt;/p&gt;
&lt;p&gt;That was this year&apos;s central work struggle, though I eventually found my way through it. More on that later, in the section on goals.&lt;/p&gt;
&lt;p&gt;Midyear, as Ross took over as CEO of TME (Tencent Music Entertainment), an Interactive Live division was formed, and our team moved to the Hexing campus. The second half of the year I led two major projects for the new division: the Lazy Expert initiative and the TMELAND metaverse. These were brutal — cross-department, cross-business-line, cross-company remote coordination, late nights as a given. But by New Year&apos;s, both wrapped up. In the aftermath, I identified two real weaknesses in myself:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Multitasking&lt;/strong&gt;: The moment things multiplied, I forgot about priorities. Whoever came to me most urgently got my attention first — cutting into whatever I was already doing without being able to &quot;restore context&quot; after. I&apos;d always worked on focused, research-type projects before, so I could sustain flow states and produce well. But managing a project touching 10 different teams revealed exactly how unequipped I was for this kind of coordination. Hard, but useful.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anxiety spirals&lt;/strong&gt;: When things slipped out of my control, I fell into anxiety, which degraded my output and fed a vicious cycle. I was used to being the one holding the thread — when it left my hands, I didn&apos;t know what to do. This had never really happened to me before: whenever something went wrong (a bad exam, a failed test round), I could always find a corrective path. But I had no experience of situations where control was distributed among many people, none of whom were me.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There were other gaps. Ownership mindset: I had it, but anxiety eroded it. I couldn&apos;t keep it in first position throughout a project.&lt;/p&gt;
&lt;p&gt;Both projects finished, but through them I identified where I still need to grow — and knowing where to go is itself a kind of direction.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/131643536507_.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Year-end brought another five-star — four consecutive now. I can attempt T10 promotion soon. I&apos;m not confident, but the result matters less than what I learn from the process.&lt;/p&gt;
&lt;h2&gt;Life&lt;/h2&gt;
&lt;p&gt;In May, my roommate Dingting moved out and my college buddy Jierong moved in. We&apos;d been close in undergrad; reconnecting now feels like a gift.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/111643536492_.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And then — we adopted a cat from a shelter where Gloves&apos; sister lives: Xiao Xiong Mao (Little Panda), an aloof beauty born on exactly the same month and day as me.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/121643536499_.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;For a team outing we went to Changsha. We lounged around playing Switch (Switch is definitively not a solo game), drank endless cups of Chayan Yuese tea, and felt wonderfully aimless and free.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/141643536519_.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I also gave a talk at CVTE in Guangzhou and finally met my friend Shubao in person. We missed the legendary &quot;Motor Canteen&quot; I&apos;d been craving, so we ate at a little bar I&apos;d loved in college — &quot;The Old Tavern.&quot; The taste had changed, though maybe the timing was what mattered: I found out afterward that was its last night open.&lt;/p&gt;
&lt;h2&gt;Books, Films &amp;amp; Music&lt;/h2&gt;
&lt;p&gt;Watched a lot of films, anime, and series:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;The Beginning (Kai Duan)&lt;/em&gt;: Fantastic!&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Demon Slayer: Mugen Train&lt;/em&gt;: The only anime that&apos;s made me cry. (QAQ)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Ranking of Kings&lt;/em&gt;: Went viral, which is how I found it. Quality has dropped noticeably in recent weeks — heading toward a disappointing ending.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Free Guy&lt;/em&gt;: Basically a GTA5 movie.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Departures (Okuribito)&lt;/em&gt;: A slow, careful work of art. Worth watching more than once.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Stand by Me Doraemon 2&lt;/em&gt;: Watched because of the first one&apos;s quality. Too juvenile.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Persian Lessons&lt;/em&gt;: Beautiful lies told over the bones of atrocity.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Odd Family: Zombie on Sale&lt;/em&gt;: Classic Korean horror comedy. Watched with my eyes mostly closed.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Edge of Tomorrow&lt;/em&gt;: Another excellent time-loop film. Recommended.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Tomorrow&apos;s War&lt;/em&gt;: ...&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Hello World&lt;/em&gt;: —&lt;/li&gt;
&lt;li&gt;&lt;em&gt;A Quiet Place Part II&lt;/em&gt;: The three-strand parallel cutting is handled beautifully; story itself is a bit thin. Expected something grander.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Soul&lt;/em&gt;: Very aligned with my values.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Children of the Sea&lt;/em&gt;: Ambitious, consciousness-expanding anime — though the director may be reaching for more than the film can hold.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Inside Out&lt;/em&gt;: Extraordinary storytelling and imagination. Spins a little girl&apos;s emotional journey into something that feels like magic.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Loki&lt;/em&gt;: Great MCU villain work — Female Loki is the best!&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Falcon and the Winter Soldier&lt;/em&gt;: Sam&apos;s character arc.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;WandaVision&lt;/em&gt;: Absolutely brilliant idea, and only Marvel would dare pull it off. Strongly recommended.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Godzilla vs. Kong&lt;/em&gt;: I mostly remember them fighting. Stop bullying Kong.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Moon Knight (2022)&lt;/em&gt;: I remember wasting a Saturday morning.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Hi, Mom (Ni Hao, Li Huanying)&lt;/em&gt;: Worth watching with family.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Okko&apos;s Inn (Wago Ryokan no Oshokuji)&lt;/em&gt;: A carefully crafted world, lovingly arranged — not quite a fairy tale, but warmer than one.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Didn&apos;t read as many books this year; most were audiobooks I won&apos;t list. But these I read properly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Summer Time Rendering&lt;/em&gt;: Six stars (out of five). Read the manga in a weekend. A logically coherent, emotionally resonant, supernatural mystery thriller — compulsively readable. Anime adaptation is coming in April!&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Courage to Be Disliked (Kirai na Kimochi o Motsu Yūki)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Kokoro&lt;/em&gt; (Soseki Natsume)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Abandoned Cat (Neko wo Suteru)&lt;/em&gt; (Haruki Murakami)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Presentations&lt;/h2&gt;
&lt;p&gt;Besides the CVTE tech talk and some short internal Flutter sessions, I also gave a talk at the Apple Developer Center in Shenzhen for their iOS Club, and I spoke to incoming freshmen in my old undergraduate program. The freshmen talk is the one I want to record here.&lt;/p&gt;
&lt;p&gt;I called it: &lt;em&gt;Why Do We Learn?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Three sections: Perception and Reality / Learning Methods / Ideas and Dreams. Three questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why learn? (Why)&lt;/li&gt;
&lt;li&gt;How to learn well? (How)&lt;/li&gt;
&lt;li&gt;What should we learn? (What)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the first question, here&apos;s the line of reasoning I followed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Started with &quot;Why can&apos;t we perceive the world directly?&quot; — introduced the &lt;strong&gt;model theory&lt;/strong&gt; of how we interpret reality.&lt;/li&gt;
&lt;li&gt;Then asked &quot;Having interpreted the world, how do we evaluate actions?&quot; — introduced the concept of &lt;strong&gt;standpoint&lt;/strong&gt;, drawing on &lt;em&gt;Qi Wu Lun&lt;/em&gt; (Zhuangzi&apos;s essay on the equality of things): &quot;Seen from the other side, nothing is clear; seen from one&apos;s own standpoint, knowledge becomes possible.&quot; Only from a standpoint can we grasp anything at all.&lt;/li&gt;
&lt;li&gt;Then asked &quot;Does standpoint really matter?&quot; — examined why we pursue truth, derived a model of how the brain makes decisions.&lt;/li&gt;
&lt;li&gt;Finally, through the proposition &quot;logic is an object falling under a concept,&quot; concluded: &quot;what we can grasp is only the features of individual things — the concrete individual itself cannot be fully grasped. Every concept we form in our minds is the result of countless perspectives fused together.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From this, four reasons to learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Refine the model&lt;/strong&gt;: To correctly understand the world we inhabit and build a sound worldview.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expand the horizon&lt;/strong&gt;: To elevate the level from which we see, enriching our historical and cultural perspective.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Discern right from wrong&lt;/strong&gt;: To know what is right and have the courage to practice it — and to resist what is wrong.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cultivate empathy&lt;/strong&gt;: To sense the suffering of the world, to feel the emotions of those around you, and to find the beauty and goodness in everyday life.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/101643536454_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Goals&lt;/h2&gt;
&lt;p&gt;Looking back at last year&apos;s goals, most went unmet. I talked this through with a friend: what&apos;s the real purpose of a year-end review? For some people, it&apos;s about identifying last year&apos;s problems, setting targets, fixing weaknesses. For others, it&apos;s pure documentation — capturing vivid scenes before they fade, so that rereading them later brings back the feeling. For me, it&apos;s closer to what I said at the start: reflection, so that future-me can return to these pages and encounter something new each time.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/91643536453_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;By that logic, flags aren&apos;t that important. But I should examine why I didn&apos;t keep last year&apos;s. I think it was the absence of a regular review mechanism. So this year I want to try &lt;strong&gt;specific goals + monthly reviews&lt;/strong&gt;: goals that are dynamic and short-term (ideally completable within three weeks), paired with monthly retrospective write-ups.&lt;/p&gt;
&lt;p&gt;I also want to record some good habits from this year worth carrying forward:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fragments, not voids&lt;/strong&gt;: Outside weekends, I have almost no long stretches of free time, but the walk to and from work is perfect for audiobooks — a full day&apos;s commute is about enough for one book. Articles read on mobile or PC get quickly captured as drafts in Drafts (the app), ready to revisit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Periodic integration&lt;/strong&gt;: The danger of fragmented learning in a fast-paced environment is that you become a &quot;fragmented person&quot; — constantly absorbing without digesting, accumulating without understanding. So every Saturday I clear the week&apos;s Drafts captures and fold them into notes. Fragments collected but never integrated produce only input without processing.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/81643536452_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Life goals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cultivate equanimity. Accept success and failure with gratitude and humility. Don&apos;t be moved by desires that aren&apos;t worth it — like the calm Confucius showed when stranded without food at Chencai, like Wang Yangming&apos;s steadiness when told he had failed the imperial exam: &quot;Only being moved by failure would be a cause for shame.&quot;&lt;/li&gt;
&lt;li&gt;Aspire to Su Dongpo&apos;s kind of poetic life — not escapism, but a lightness beyond circumstances, an untroubled tranquility that neither wealth nor hardship can disturb.&lt;/li&gt;
&lt;li&gt;Stay curious, always. Pursue knowledge for its own sake.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Work goal, borrowed from Satoru Iwata (Nintendo&apos;s late president): &quot;Collaborate in a way that makes others say: &apos;I want to work with that person again.&apos;&quot;&lt;/p&gt;
&lt;p&gt;Finally — here&apos;s to a 2022 in which I can still live with genuine enthusiasm.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/media/16434480158905/151643536520_.pic.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2021&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>On the Value of Existence and the Experience of Life</title><link>https://ursb.me/en/posts/life/</link><guid isPermaLink="true">https://ursb.me/en/posts/life/</guid><description>Explores the existentialist question of life&apos;s meaning and the collapse of assigned value, offering practices for living fully, from ordinariness to connection.</description><pubDate>Sun, 11 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The question of how to live is a battlefield of everyone against everyone. This post simply shares where I currently stand on it. I&apos;ll approach it through two questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What is the meaning of life?&lt;/li&gt;
&lt;li&gt;How can we experience life more fully?&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What Is the Meaning of Life?&lt;/h2&gt;
&lt;h3&gt;Existence and the Collapse of Meaning&lt;/h3&gt;
&lt;p&gt;First, my answer to the first question: &lt;strong&gt;life has no meaning.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We are thrown by chance into a disordered world. We appear to have absolute freedom and infinite possibility — but the journey of life is extremely brief, and the possibilities are extremely limited. We arrive by chance and leave by chance. Nothing in this process requires us to do anything in particular. In other words, &lt;strong&gt;our entire lives have no predetermined purpose.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Even so, we must carry this meaningless life — carry this soul with nowhere to rest — and bravely sail on. This voyage has no destination, but out on the open sea we keep setting new waypoints. These waypoints are the &quot;rules of sailing&quot; we set for ourselves; we use these rules to reach each marker, to seek what we call &lt;strong&gt;&quot;a sense of meaning.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Existence precedes essence. We exist first, then explore meaning, then give meaning to existence.&lt;/strong&gt; The voyage has no destination; we ourselves set waypoint after waypoint and give the voyage meaning. Through this act of anchoring, we seek meaning in this endless ocean journey and give meaning to our existence. &lt;strong&gt;After all, what defines us is not &quot;the voyage itself&quot; but &quot;the meaning we give to the voyage.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This retrospectively assigned &quot;sense of meaning,&quot; however, carries two hidden dangers.&lt;/p&gt;
&lt;p&gt;First, &lt;strong&gt;it determines that value is internal and relative.&lt;/strong&gt; Everything we do is ultimately just following the course we&apos;ve laid for ourselves. This anchoring is always a kind of self-generated illusion — it exists by virtue of our own, immediate, tangible feedback. In our own eyes, this course exists and has value. You might find value consensus with some people, but values differ from person to person; your actions cannot win everyone&apos;s approval. Fortunately, our actions don&apos;t need to seek others&apos; approval — as long as we ourselves feel it has meaning, that&apos;s enough.&lt;/p&gt;
&lt;p&gt;Second, &lt;strong&gt;this anchoring is prone to losing feedback and producing a sense of collapse.&lt;/strong&gt; A workaholic who anchors their sense of meaning in work, for example — if their hard work doesn&apos;t bring the expected performance review or their boss&apos;s recognition, they fall into self-doubt or inferiority complex, lose enthusiasm for life, and feel a kind of collapse.&lt;/p&gt;
&lt;p&gt;Or the reverse: in &lt;em&gt;Soul&lt;/em&gt;, Joe Gardner spends his whole life pursuing his jazz dream, and after many trials he finally gets to perform alongside a famous musician — to great success. That night after the show, he suddenly feels strangely empty. His lifelong effort has gotten him what he wanted, and he discovers that beyond a brief rush of excitement, nothing is actually different. His next-day goal is gone. &quot;So... what now?&quot; he murmurs.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20210711-01.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Or, in the fast-paced city life, we&apos;re always rushing; there are always urgent things to do. Each one looks like a P0 priority on its own. We exhaust ourselves trying to do everything as well as possible, and the more we try to do everything perfectly, the less we can achieve completeness — life becomes a hollow collection of fragments. The sudden sense of absurdity makes us feel that the shape of our life has already broken.&lt;/p&gt;
&lt;h3&gt;The Present Moment and the Experience of Life&lt;/h3&gt;
&lt;p&gt;Before addressing these problems we need to establish an existentialist proposition: &lt;strong&gt;a person exists as a series of individual moments. It is precisely because a person exists that a person is a person. In other words, as Adler said: &quot;Life is a series of moments. The most important thing is this very moment.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The only &quot;real&quot; thing I have ever been deeply convinced of is this: right now, I am alive — I exist, I breathe, I perceive the world around me — and that is the only reality. Some say the highest value is to contribute a brick to the edifice of human progress. Others say the greatest meaning is to give light and warmth to the cause of world peace. Never mind that these lofty ideals are too distant for ordinary people to see — even if they exist, what of it? The universe has existed for billions of years; human history spans only a few thousand. Earth is a drop in the ocean; human history is a mayfly. Those so-called ideals — &lt;strong&gt;from the scale of the cosmos, everything is meaningless.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;img src=&quot;https://airing.ursb.me/image/blog/20210711-04.jpeg&quot; alt=&quot;&quot; style=&quot;width: 50%; max-height: none; margin-inline: auto;&quot; /&amp;gt;&lt;/p&gt;
&lt;p&gt;Yet even so, we still exist — isn&apos;t that already an extraordinary miracle? &lt;strong&gt;The only certainty is the present. The only thing that matters is now, this very moment. A person must first exist before anything about life can be discussed.&lt;/strong&gt; Understanding this, we need to pay attention to each step underfoot and find in each one solid, powerful support and joy — to experience the scenery, the setbacks, and the bitterness of the journey.&lt;/p&gt;
&lt;p&gt;What life aesthetics calls &quot;experience&quot; is the key to connecting a person&apos;s inner consciousness with external reality, and the individual with society. Life is composed of a continuous stream of experiential fragments from reality — an uneven mixture of suffering, choice, regret, solitude, hope, and happiness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We wander through the great river of time: discovering life, experiencing the world, embracing what is beautiful, using our minds in an experimental and expansive way, stirring our emotions, appreciating, learning, adding depth to our lives, experiencing the world as richly as possible.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Then, gradually, we come to understand: &lt;strong&gt;the meaning of life is not given by so-called &quot;major life events&quot; — it falls into the unremarkable, impermanent details of daily living.&lt;/strong&gt; Like the nurse who brought me a blanket while I waited in the hospital for a COVID test result in the middle of the night. The stray cat that was waiting at my door begging for food when I got home. The neighbor who brought milk tea to thank me for taking in a package. The moment I opened a music app and heard &lt;em&gt;Wandering in the River of Time&lt;/em&gt;, looking forward to the season finale of &lt;em&gt;Loki&lt;/em&gt; that Wednesday.&lt;/p&gt;
&lt;p&gt;These are my present. My life. My meaning.&lt;/p&gt;
&lt;h2&gt;How Can We Experience Life More Fully?&lt;/h2&gt;
&lt;p&gt;I&apos;ve talked about the absurdity of meaning-free existence and the remedy: experiencing the life of the present moment. Now to the second question — how can we experience life more fully? Here are some approaches I&apos;ve practiced and found genuinely useful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The courage to embrace ordinariness&lt;/li&gt;
&lt;li&gt;Lengthening the view, seeing life from above&lt;/li&gt;
&lt;li&gt;Openness and variety; accumulating sweet moments&lt;/li&gt;
&lt;li&gt;Seeking connection; staying kind&lt;/li&gt;
&lt;li&gt;Knowledge, sensitivity, and imagination&lt;/li&gt;
&lt;li&gt;Living seriously and positively&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;The Courage to Embrace Ordinariness&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;The Courage to Be Disliked&lt;/em&gt; points to &lt;strong&gt;&quot;the courage to embrace ordinariness&quot;&lt;/strong&gt; — which asks us to accept the ordinary self. Being ordinary means being unremarkable; we are simply one among countless people, arriving here by chance. But ordinary does not mean incapable. We have no need to specially flaunt our superiority.&lt;/p&gt;
&lt;p&gt;Today&apos;s society sells anxiety; articles and courses that manufacture anxiety are everywhere, because everyone wants to be the most excellent version of themselves. But when anxiety becomes pervasive, people&apos;s hearts grow restless, forgetting that every person is an ordinary but unique individual — you can strive and improve, pursue and challenge yourself — but don&apos;t forget the courage to embrace ordinariness.&lt;/p&gt;
&lt;p&gt;As that line goes: &lt;strong&gt;&quot;Achievement is not defined externally. It all depends on whether you are living according to your own will.&quot;&lt;/strong&gt; (Yuxi, Pixar designer)&lt;/p&gt;
&lt;h3&gt;Lengthening the View, Seeing Life from Above&lt;/h3&gt;
&lt;p&gt;&quot;Bird&apos;s-eye view&quot; is the unique thinking style of the protagonist in &lt;em&gt;Summer Time Rendering&lt;/em&gt; — in moments of confusion, another self appears in the mind to view the scene from above for objective analysis. This thinking mode is in fact &quot;self-distancing&quot; with a lengthened field of view, helping you avoid becoming so absorbed in yourself that you can&apos;t let go.&lt;/p&gt;
&lt;p&gt;The workaholic and Joe Gardner from &lt;em&gt;Soul&lt;/em&gt; both suffered a sense of collapse because they suddenly lost immediate feedback from their anchor point. The root cause is that their &quot;sense of meaning&quot; came from too narrow a single source, and their pursuit of it was too single-minded. If you lengthen your view — even if things aren&apos;t going well in your job, you can try a different job; or step back further and realize that work is not the whole of life, that there are many other meaningful things still to do. No rule requires you to be the best at anything.&lt;/p&gt;
&lt;p&gt;Lengthening the view and seeing life from above is a good remedy for the sense of collapse.&lt;/p&gt;
&lt;h3&gt;Openness and Variety; Accumulating Sweet Moments&lt;/h3&gt;
&lt;p&gt;The sense of collapse of meaning arises when your anchor is too narrow and you chase that single sense of meaning too intently. If you diversify your life — seek out more things you&apos;re interested in — even if you lose feedback from one anchor, another will continue to replenish your sense of meaning.&lt;/p&gt;
&lt;p&gt;The character designer for &lt;em&gt;Soul&lt;/em&gt;, Yuxi, said in an interview: &lt;strong&gt;&quot;A lifetime is one long experience. If you can experience as many things as possible in the same amount of time, that&apos;s absolutely worthwhile.&quot;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If we compare the fragments of our life to the memory balls in &lt;em&gt;Inside Out&lt;/em&gt;, we find that those balls never store a single, pure emotion — they&apos;re colorful, rich emotional mixtures. In such a varied wealth of life experience, we encounter a multidimensional sense of meaning.&lt;/p&gt;
&lt;p&gt;Beyond that, accumulating the sweet moments you discover unexpectedly is also a key part of experiencing life — and the secret to accumulating them is openness.&lt;/p&gt;
&lt;p&gt;We mentioned that value is relative; so we should not anchor meaning to value alone (especially practical value). Instead, we should recognize the complex richness of the real world. Only doing things you consider &quot;valuable&quot; is very one-sided, and a shame — it means missing the many round, sharp, niche, and humble beauties of life. Lowering the threshold of value actually makes it easier to find &quot;sweet moments&quot; in daily life.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;So by lowering our value priorities, we can accumulate sweet moments more effectively — because we become more open, and therefore happier, and also better at experiencing life objectively and continuing to improve.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the world, some people set themselves up as authorities and some blindly follow; some people celebrate niche aesthetics and others see it as showing off. These are just different people, at different times, in different places, in different moods, observing the world in their own ways. &lt;strong&gt;Ultimately, as long as you can see the essence of things and accumulate sweet moments from many different vantage points, does it matter which method you use?&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Seeking Connection; Staying Kind&lt;/h3&gt;
&lt;p&gt;The life experience we want is not vague, ethereal happiness; the meaning we give to our lives should not be empty and hollow. It needs something real to anchor it. If you were told right now that you&apos;re in a &quot;brain-in-a-vat&quot; experiment — that all your friends, family, and the surrounding world are your own illusions — every achievement and joy you&apos;ve ever felt would be swallowed by loneliness.&lt;/p&gt;
&lt;p&gt;So when we give meaning to existence, we must &lt;strong&gt;seek connection with real things&lt;/strong&gt; — that is, connection and interaction with the external world, with others, even with our future selves.&lt;/p&gt;
&lt;p&gt;In positive psychology, giving and sharing are very important sources of happiness. Whether giving someone a gift, offering affirmation and thanks, helping someone with a small task, or sharing your life and joy with others — all of these build a bridge of goodwill between you and the external world. &lt;strong&gt;Being a kind person, doing things that are meaningful to yourself, to others, and to the world, and in that process building connection with yourself, with others, and with the world — feeling happiness, satisfaction, and joy — this is always a reliable strategy.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So if you want to experience a happy life, it often comes less from what you have than from what you can give — from how many bridges of goodwill you can build.&lt;/p&gt;
&lt;h3&gt;Knowledge, Sensitivity, and Imagination&lt;/h3&gt;
&lt;p&gt;The experience of life is grounded in our perception of the world. In my view, the three most important elements for improving perceptual capacity come from &lt;em&gt;The Moon and Sixpence&lt;/em&gt;: knowledge, sensitivity, and imagination.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Knowledge&lt;/strong&gt;
&lt;strong&gt;Knowledge determines the scope of our perception of the world (content).&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Learning and growing is a lifelong endeavor. Drawing in knowledge sharpens our cognitive capacity so we can understand and engage with things we previously couldn&apos;t fully grasp — or couldn&apos;t grasp at all. If limited knowledge causes us to miss some life experiences, that is ultimately a loss.&lt;/p&gt;
&lt;p&gt;The broader and deeper our knowledge, the more deeply and simply we can understand the world.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sensitivity&lt;/strong&gt;
&lt;strong&gt;Sensitivity determines the edges of our perception of the world (outline).&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As I said above, the only real certainty is &lt;strong&gt;&quot;I am alive&quot;&lt;/strong&gt; — and to make that aliveness full and meaningful, we have to give it meaning ourselves. How? The key is to experience and feel life.&lt;/p&gt;
&lt;p&gt;Our lived experience is made up of scattered fragments. What we call &quot;feeling&quot; is the response to experience — the projection of ourselves onto the world. &quot;Sensitivity&quot; is the range of that projection.&lt;/p&gt;
&lt;p&gt;The world&apos;s experiences are vast and complex. &quot;Projective capacity&quot; is like a circle whose center is your own perspective — the radius of projection is how far you can feel, and the area it covers is the world you can perceive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cultivating knowledge keeps our perception honest and lets us see the essence of things clearly; cultivating sensitivity makes our perception richer&lt;/strong&gt; — expanding the perceptual edge, experiencing more, deeper, or previously &quot;unimaginable&quot; things. Raising your vantage point — regardless of direct experience — expands the horizon of the world you can perceive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The value of our existence lies in the fact that we fixed this center; the meaning of being alive lies in expanding that boundary.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Imagination&lt;/strong&gt;
&lt;strong&gt;Imagination determines the radiated reach of our perception of the world (extension).&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Uta Hagen wrote in &lt;em&gt;Respect for Acting&lt;/em&gt;: &quot;Talent is a combination of high sensitivity, an easily wounded heart, a high-performance intuitive apparatus (strong visual, auditory, tactile, gustatory, and olfactory senses), a lively imagination, a grasp of reality, a strong wish to communicate personal experience and feelings, and an impulse to have one&apos;s whole being seen and heard.&quot; Robert McKee in &lt;em&gt;Story&lt;/em&gt; also emphasizes that a playwright must have &quot;perceptiveness&quot; and &quot;extraordinary imagination.&quot;&lt;/p&gt;
&lt;p&gt;I came across an interesting graphic novel recently — &lt;em&gt;Montage of Life&lt;/em&gt; — where the author drew her imagined world from her own perspective and shared it with us in the experiential world.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20210711-03.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In the eyes of those who cannot hear the music, those who dance look like madmen. The dancers know the rhythm of the world; they understand that &lt;strong&gt;what is enough to resist the absurdity and emptiness of life is making life itself into an interesting adventure.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Imagination can give us a world we cannot access through experience. It determines the radiated reach of our perception and expands the world&apos;s extension.&lt;/p&gt;
&lt;h3&gt;Living Seriously and Positively&lt;/h3&gt;
&lt;p&gt;Last and most importantly, we need a positive attitude toward life — to live seriously.&lt;/p&gt;
&lt;p&gt;I recently bought a graphic novel called &lt;em&gt;The Crocodile That Died 100 Days Later&lt;/em&gt;. On the first page, the author establishes that the crocodile protagonist will die in 100 days. The reader knows; the crocodile doesn&apos;t. The author drew one panel per day for the remaining days, depicting the crocodile&apos;s daily life — extraordinarily ordinary.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://airing.ursb.me/image/blog/20210711-02.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Perhaps every person is like the crocodile — bound to be gone some day 100 days from now, arriving by chance and leaving by chance. It seems absurd and beyond control. But if you&apos;re conscious that life has an end, you work harder to make life go in a good direction. When we know everyone has a final day, we should live every day seriously.&lt;/p&gt;
&lt;p&gt;I particularly love quiet, calm living, because it lets me engage more attentively. Before my graduate entrance exam I was anxious and restless — preparing for a cross-discipline exam while also doing a teaching practicum. But one day after teaching elementary school students, I sat in the schoolyard under a tree and read &lt;em&gt;Zhuangzi&lt;/em&gt; to the sound of students reading aloud in the classroom. A sense of happiness washed over me. The quiet atmosphere of learning and the mysterious sense of the natural order made me forget the chaos and noise of daily life. I felt a sense of life that was complete and beautiful. To this day I still miss that exam-preparation period.&lt;/p&gt;
&lt;p&gt;I once saw a sentence on the window of a Sisyphus bookstore: &quot;Life is a pure flame, and we live by an invisible sun within us.&quot; But I prefer its other half: &lt;strong&gt;&quot;Life is a succession of happy moments; we do not live merely to exist.&quot;&lt;/strong&gt; Each person is caught in solitude — yet wild and carefree, swept by the great wind. I think: &lt;strong&gt;once you see through the world&apos;s pretense, the world is yours.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As long as you have lived seriously, everything is enough. &lt;strong&gt;I wish you — reading this — a hopeful and earnest life.&lt;/strong&gt;&lt;/p&gt;
&lt;img src=&quot;https://ursb.me/api/rss-track?post=life&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>essays</category></item><item><title>Flutter Build Artifact Analysis and Size Reduction</title><link>https://ursb.me/en/posts/flutter-reduce/</link><guid isPermaLink="true">https://ursb.me/en/posts/flutter-reduce/</guid><description>A two-part look at Flutter build artifact composition and size-reduction techniques, covering the principles, methods, and implementation details for slimming down iOS and Android Flutter apps.</description><pubDate>Sat, 01 May 2021 00:00:00 GMT</pubDate><content:encoded>A two-part look at Flutter build artifact composition and size-reduction techniques, covering the principles, methods, and implementation details for slimming down iOS and Android Flutter apps.&lt;img src=&quot;https://ursb.me/api/rss-track?post=flutter-reduce&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Roam Research Best Practices — Knowledge Management and Task Management</title><link>https://ursb.me/en/posts/roam-research/</link><guid isPermaLink="true">https://ursb.me/en/posts/roam-research/</guid><description>Shares a knowledge and task management workflow built around Roam Research, covering its Page/Block linking, tagging system, and daily task review habits.</description><pubDate>Sat, 03 Apr 2021 00:00:00 GMT</pubDate><content:encoded>Shares a knowledge and task management workflow built around Roam Research, covering its Page/Block linking, tagging system, and daily task review habits.&lt;img src=&quot;https://ursb.me/api/rss-track?post=roam-research&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>How to Communicate Effectively — Through the Lens of Zhuangzi&apos;s Qiwulun</title><link>https://ursb.me/en/posts/homogeneous/</link><guid isPermaLink="true">https://ursb.me/en/posts/homogeneous/</guid><description>Starting from the problem of standpoints in Zhuangzi&apos;s Qiwulun, this essay uses the Ladder of Inference to analyze how attitudes and judgments form in communication, seeking effective consensus.</description><pubDate>Tue, 09 Mar 2021 00:00:00 GMT</pubDate><content:encoded>Starting from the problem of standpoints in Zhuangzi&apos;s Qiwulun, this essay uses the Ladder of Inference to analyze how attitudes and judgments form in communication, seeking effective consensus.&lt;img src=&quot;https://ursb.me/api/rss-track?post=homogeneous&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>essays</category></item><item><title>Flutter Exception Handling: Canary Rollout and Graceful Degradation</title><link>https://ursb.me/en/posts/flutter-downgrade/</link><guid isPermaLink="true">https://ursb.me/en/posts/flutter-downgrade/</guid><description>A rundown of Flutter exception types and capture methods, followed by a canary rollout and graceful degradation scheme designed to improve production stability for Flutter apps.</description><pubDate>Thu, 18 Feb 2021 00:00:00 GMT</pubDate><content:encoded>A rundown of Flutter exception types and capture methods, followed by a canary rollout and graceful degradation scheme designed to improve production stability for Flutter apps.&lt;img src=&quot;https://ursb.me/api/rss-track?post=flutter-downgrade&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>2020: Chasing Sparks</title><link>https://ursb.me/en/posts/summary-2020/</link><guid isPermaLink="true">https://ursb.me/en/posts/summary-2020/</guid><description>A 2020 year in review: moving from Green Diamond to livestreaming, a year immersed in Flutter, notes on work habits, and a long essay on the game Sky.</description><pubDate>Sat, 06 Feb 2021 00:00:00 GMT</pubDate><content:encoded>A 2020 year in review: moving from Green Diamond to livestreaming, a year immersed in Flutter, notes on work habits, and a long essay on the game Sky.&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2020&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>The &apos;Zen&apos; of Sky: Children of the Light</title><link>https://ursb.me/en/posts/sky/</link><guid isPermaLink="true">https://ursb.me/en/posts/sky/</guid><description>An essay reading the game Sky: Children of the Light through aesthetics, psychology, hermeneutics, and existentialism, examining its art, gameplay, and social design.</description><pubDate>Thu, 08 Oct 2020 00:00:00 GMT</pubDate><content:encoded>An essay reading the game Sky: Children of the Light through aesthetics, psychology, hermeneutics, and existentialism, examining its art, gameplay, and social design.&lt;img src=&quot;https://ursb.me/api/rss-track?post=sky&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>essays</category></item><item><title>Flutter Core Principles and Hybrid Development Modes</title><link>https://ursb.me/en/posts/flutter-kant/</link><guid isPermaLink="true">https://ursb.me/en/posts/flutter-kant/</guid><description>Starting from Flutter&apos;s rendering principles, this post compares three cross-platform approaches and systematically explains four Flutter hybrid development modes with engineering practices.</description><pubDate>Tue, 30 Jun 2020 00:00:00 GMT</pubDate><content:encoded>Starting from Flutter&apos;s rendering principles, this post compares three cross-platform approaches and systematically explains four Flutter hybrid development modes with engineering practices.&lt;img src=&quot;https://ursb.me/api/rss-track?post=flutter-kant&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Exploring Flutter Hybrid Development Framework Patterns</title><link>https://ursb.me/en/posts/flutter-hybrid/</link><guid isPermaLink="true">https://ursb.me/en/posts/flutter-hybrid/</guid><description>An analysis of the core capabilities a Flutter hybrid framework needs, such as navigation stack and lifecycle management, examined through Flutter Boost, Thrio, and QFlutter architectures.</description><pubDate>Sat, 18 Apr 2020 00:00:00 GMT</pubDate><content:encoded>An analysis of the core capabilities a Flutter hybrid framework needs, such as navigation stack and lifecycle management, examined through Flutter Boost, Thrio, and QFlutter architectures.&lt;img src=&quot;https://ursb.me/api/rss-track?post=flutter-hybrid&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Flutter Boost Hybrid Development: Practice and Source Code Walkthrough</title><link>https://ursb.me/en/posts/flutter-boost-android/</link><guid isPermaLink="true">https://ursb.me/en/posts/flutter-boost-android/</guid><description>An overview of Flutter Boost, Xianyu&apos;s open-source Flutter hybrid framework, walking through its shared-engine architecture, page lifecycle management, and container communication source code.</description><pubDate>Sat, 07 Mar 2020 00:00:00 GMT</pubDate><content:encoded>An overview of Flutter Boost, Xianyu&apos;s open-source Flutter hybrid framework, walking through its shared-engine architecture, page lifecycle management, and container communication source code.&lt;img src=&quot;https://ursb.me/api/rss-track?post=flutter-boost-android&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>2019: Moving Through, Stopping Often</title><link>https://ursb.me/en/posts/summary-2019/</link><guid isPermaLink="true">https://ursb.me/en/posts/summary-2019/</guid><description>A 2019 year in review: finishing a thesis, joining QQ Music full-time, stalling on Twin Diary 3.0, a WWDC trip, and a year of games, shows, books, and cats.</description><pubDate>Thu, 09 Jan 2020 00:00:00 GMT</pubDate><content:encoded>A 2019 year in review: finishing a thesis, joining QQ Music full-time, stalling on Twin Diary 3.0, a WWDC trip, and a year of games, shows, books, and cats.&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2019&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>React Hooks Source Deep Dive (4): useEffect</title><link>https://ursb.me/en/posts/react-hooks-4/</link><guid isPermaLink="true">https://ursb.me/en/posts/react-hooks-4/</guid><description>Fourth in a React Hooks source-code series, explaining why useEffect replaces lifecycle methods, its dependency array, and how it&apos;s implemented in React.</description><pubDate>Tue, 03 Dec 2019 00:00:00 GMT</pubDate><content:encoded>Fourth in a React Hooks source-code series, explaining why useEffect replaces lifecycle methods, its dependency array, and how it&apos;s implemented in React.&lt;img src=&quot;https://ursb.me/api/rss-track?post=react-hooks-4&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>React Hooks Source Deep Dive (3): useState</title><link>https://ursb.me/en/posts/react-hooks-3/</link><guid isPermaLink="true">https://ursb.me/en/posts/react-hooks-3/</guid><description>Third in a React Hooks source-code series, focused on useState: its usage and rules, building a minimal implementation before dissecting the React source.</description><pubDate>Sat, 09 Nov 2019 00:00:00 GMT</pubDate><content:encoded>Third in a React Hooks source-code series, focused on useState: its usage and rules, building a minimal implementation before dissecting the React source.&lt;img src=&quot;https://ursb.me/api/rss-track?post=react-hooks-3&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>React Hooks Source Deep Dive (2): Component Logic Reuse and Extension</title><link>https://ursb.me/en/posts/react-hooks-2/</link><guid isPermaLink="true">https://ursb.me/en/posts/react-hooks-2/</guid><description>Second in a React Hooks source-code series, comparing five ways to reuse component logic: Mixins, class inheritance, higher-order components, and render props.</description><pubDate>Wed, 11 Sep 2019 00:00:00 GMT</pubDate><content:encoded>Second in a React Hooks source-code series, comparing five ways to reuse component logic: Mixins, class inheritance, higher-order components, and render props.&lt;img src=&quot;https://ursb.me/api/rss-track?post=react-hooks-2&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>React Hooks Source Deep Dive (1): Class Components, Function Components, and Pure Components</title><link>https://ursb.me/en/posts/react-hooks-1/</link><guid isPermaLink="true">https://ursb.me/en/posts/react-hooks-1/</guid><description>First in a React Hooks source-code series, comparing class, function, and pure components, and tracing how PureComponent controls re-rendering in React.</description><pubDate>Tue, 03 Sep 2019 00:00:00 GMT</pubDate><content:encoded>First in a React Hooks source-code series, comparing class, function, and pure components, and tracing how PureComponent controls re-rendering in React.&lt;img src=&quot;https://ursb.me/api/rss-track?post=react-hooks-1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>WWDC19 Travel Journal</title><link>https://ursb.me/en/posts/wwdc-19/</link><guid isPermaLink="true">https://ursb.me/en/posts/wwdc-19/</guid><description>A travel journal of attending WWDC19 in San Jose as a Scholar: flight mishaps, meeting a mentor and a YouTuber, touring Apple Park and Stanford, and reflections on growth and life&apos;s meaning.</description><pubDate>Thu, 13 Jun 2019 00:00:00 GMT</pubDate><content:encoded>A travel journal of attending WWDC19 in San Jose as a Scholar: flight mishaps, meeting a mentor and a YouTuber, touring Apple Park and Stanford, and reflections on growth and life&apos;s meaning.&lt;img src=&quot;https://ursb.me/api/rss-track?post=wwdc-19&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>Development Experience Sharing: 2life Diary</title><link>https://ursb.me/en/posts/2life-develop-experience/</link><guid isPermaLink="true">https://ursb.me/en/posts/2life-develop-experience/</guid><description>The founder of 2life Diary shares the team&apos;s product workflow: initiation, design, development, and maintenance, plus tooling choices and issue-tracking practices.</description><pubDate>Sat, 11 May 2019 00:00:00 GMT</pubDate><content:encoded>The founder of 2life Diary shares the team&apos;s product workflow: initiation, design, development, and maintenance, plus tooling choices and issue-tracking practices.&lt;img src=&quot;https://ursb.me/api/rss-track?post=2life-develop-experience&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Frontend Security | HPP Attack Examples and Prevention</title><link>https://ursb.me/en/posts/hpp/</link><guid isPermaLink="true">https://ursb.me/en/posts/hpp/</guid><description>An explanation of HTTP Parameter Pollution (HPP) attacks, illustrated with a real HackerOne social-share-button vulnerability, covering common attack techniques and corresponding defenses.</description><pubDate>Wed, 10 Apr 2019 00:00:00 GMT</pubDate><content:encoded>An explanation of HTTP Parameter Pollution (HPP) attacks, illustrated with a real HackerOne social-share-button vulnerability, covering common attack techniques and corresponding defenses.&lt;img src=&quot;https://ursb.me/api/rss-track?post=hpp&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Frontend Security | XST Attack Principles and Prevention</title><link>https://ursb.me/en/posts/xst/</link><guid isPermaLink="true">https://ursb.me/en/posts/xst/</guid><description>Explains how Cross-Site Tracing (XST) abuses TRACE/TRACK requests to expose httpOnly cookies and other sensitive headers, plus defenses like disabling TRACE and browser restrictions.</description><pubDate>Tue, 09 Apr 2019 00:00:00 GMT</pubDate><content:encoded>Explains how Cross-Site Tracing (XST) abuses TRACE/TRACK requests to expose httpOnly cookies and other sensitive headers, plus defenses like disabling TRACE and browser restrictions.&lt;img src=&quot;https://ursb.me/api/rss-track?post=xst&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Frontend Security | CSRF Attack Techniques and Defenses</title><link>https://ursb.me/en/posts/csrf/</link><guid isPermaLink="true">https://ursb.me/en/posts/csrf/</guid><description>A guide to CSRF: how GET, POST, and link-based attacks work, and how same-origin checks, SameSite cookies, and synchronizer tokens compare as defenses.</description><pubDate>Mon, 08 Apr 2019 00:00:00 GMT</pubDate><content:encoded>A guide to CSRF: how GET, POST, and link-based attacks work, and how same-origin checks, SameSite cookies, and synchronizer tokens compare as defenses.&lt;img src=&quot;https://ursb.me/api/rss-track?post=csrf&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Frontend Security | XSS Attack Techniques and Prevention</title><link>https://ursb.me/en/posts/xss/</link><guid isPermaLink="true">https://ursb.me/en/posts/xss/</guid><description>A technical rundown of reflected, stored, DOM-based, and JSONP XSS attacks with examples, plus defenses covering input/output escaping, CSP headers, and HttpOnly cookies.</description><pubDate>Sun, 07 Apr 2019 00:00:00 GMT</pubDate><content:encoded>A technical rundown of reflected, stored, DOM-based, and JSONP XSS attacks with examples, plus defenses covering input/output escaping, CSP headers, and HttpOnly cookies.&lt;img src=&quot;https://ursb.me/api/rss-track?post=xss&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>How Is Artificial Consciousness Possible?</title><link>https://ursb.me/en/posts/ai-consciousness/</link><guid isPermaLink="true">https://ursb.me/en/posts/ai-consciousness/</guid><description>Drawing on Detroit: Become Human and other sci-fi works, this piece surveys mind-body dualism, behaviorism, physicalism, and functionalism, using the Chinese Room to ask whether artificial consciousness is even theoretically possible.</description><pubDate>Sat, 09 Mar 2019 00:00:00 GMT</pubDate><content:encoded>Drawing on Detroit: Become Human and other sci-fi works, this piece surveys mind-body dualism, behaviorism, physicalism, and functionalism, using the Chinese Room to ask whether artificial consciousness is even theoretically possible.&lt;img src=&quot;https://ursb.me/api/rss-track?post=ai-consciousness&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>essays</category></item><item><title>My Approach to Reading Papers and Writing Essays</title><link>https://ursb.me/en/posts/how-write-essay/</link><guid isPermaLink="true">https://ursb.me/en/posts/how-write-essay/</guid><description>Personal reflections on reading academic literature and writing essays, breaking the process into five phases — collection, reading, study, construction, and writing — for readers to reference.</description><pubDate>Thu, 07 Feb 2019 00:00:00 GMT</pubDate><content:encoded>Personal reflections on reading academic literature and writing essays, breaking the process into five phases — collection, reading, study, construction, and writing — for readers to reference.&lt;img src=&quot;https://ursb.me/api/rss-track?post=how-write-essay&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>essays</category></item><item><title>2018: Settling Into First Principles</title><link>https://ursb.me/en/posts/summary-2018/</link><guid isPermaLink="true">https://ursb.me/en/posts/summary-2018/</guid><description>A 2018 year in review: an internship turned job offer at QQ Music, a philosophy thesis, building the indie app Twin Diary, and a breakup.</description><pubDate>Sun, 03 Feb 2019 00:00:00 GMT</pubDate><content:encoded>A 2018 year in review: an internship turned job offer at QQ Music, a philosophy thesis, building the indie app Twin Diary, and a breakup.&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2018&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>&quot;I&apos;m Fine Without You.&quot;</title><link>https://ursb.me/en/posts/wreak-it/</link><guid isPermaLink="true">https://ursb.me/en/posts/wreak-it/</guid><description>A personal essay on Ralph Breaks the Internet, reflecting on friendship and growing up through Ralph and Vanellope learning to let go, and how real friendship endures without constant closeness.</description><pubDate>Wed, 12 Dec 2018 00:00:00 GMT</pubDate><content:encoded>A personal essay on Ralph Breaks the Internet, reflecting on friendship and growing up through Ralph and Vanellope learning to let go, and how real friendship endures without constant closeness.&lt;img src=&quot;https://ursb.me/api/rss-track?post=wreak-it&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>essays</category></item><item><title>Web-Based Terminal Blog System</title><link>https://ursb.me/en/posts/web-terminal/</link><guid isPermaLink="true">https://ursb.me/en/posts/web-terminal/</guid><description>Walks through building a web-based terminal-emulator blog, covering the Mac Terminal-styled UI, keydown-driven rendering logic, and commands like help, clear, and ls backed by a Node.js API.</description><pubDate>Thu, 30 Aug 2018 00:00:00 GMT</pubDate><content:encoded>Walks through building a web-based terminal-emulator blog, covering the Mac Terminal-styled UI, keydown-driven rendering logic, and commands like help, clear, and ls backed by a Node.js API.&lt;img src=&quot;https://ursb.me/api/rss-track?post=web-terminal&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Research on an Intelligent Push System for Online Learning Resources</title><link>https://ursb.me/en/posts/learning-system/</link><guid isPermaLink="true">https://ursb.me/en/posts/learning-system/</guid><description>Examines building an intelligent push system for online learning, covering data storage, learner modeling, and a recommendation algorithm blending classic methods.</description><pubDate>Fri, 02 Jun 2017 00:00:00 GMT</pubDate><content:encoded>Examines building an intelligent push system for online learning, covering data storage, learner modeling, and a recommendation algorithm blending classic methods.&lt;img src=&quot;https://ursb.me/api/rss-track?post=learning-system&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Farewell, My College Years</title><link>https://ursb.me/en/posts/summary-2017/</link><guid isPermaLink="true">https://ursb.me/en/posts/summary-2017/</guid><description>A farewell to four years at Guangzhou University: from gaming and tech to philosophy after a health scare, ending in admission to a philosophy graduate program.</description><pubDate>Sun, 16 Apr 2017 00:00:00 GMT</pubDate><content:encoded>A farewell to four years at Guangzhou University: from gaming and tech to philosophy after a health scare, ending in admission to a philosophy graduate program.&lt;img src=&quot;https://ursb.me/api/rss-track?post=summary-2017&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>annually</category></item><item><title>Analysis of 60,000 Douban Movies</title><link>https://ursb.me/en/posts/douban-movie-analysis/</link><guid isPermaLink="true">https://ursb.me/en/posts/douban-movie-analysis/</guid><description>An analysis of over 60,000 scraped Douban Movie entries, comparing rating distributions between Chinese films and those from other countries, examining claims of a rating credibility crisis.</description><pubDate>Mon, 16 Jan 2017 00:00:00 GMT</pubDate><content:encoded>An analysis of over 60,000 scraped Douban Movie entries, comparing rating distributions between Chinese films and those from other countries, examining claims of a rating credibility crisis.&lt;img src=&quot;https://ursb.me/api/rss-track?post=douban-movie-analysis&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item><item><title>Analysis of Bilibili&apos;s 20 Million Users</title><link>https://ursb.me/en/posts/bilibili-user/</link><guid isPermaLink="true">https://ursb.me/en/posts/bilibili-user/</guid><description>The author scraped and analyzed all 20 million registered Bilibili users, profiling gender, age, region, and signup trends, finding a near-even gender split dominated by post-90s students.</description><pubDate>Tue, 23 Feb 2016 00:00:00 GMT</pubDate><content:encoded>The author scraped and analyzed all 20 million registered Bilibili users, profiling gender, age, region, and signup trends, finding a near-even gender split dominated by post-90s students.&lt;img src=&quot;https://ursb.me/api/rss-track?post=bilibili-user&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot; /&gt;</content:encoded><category>tech</category></item></channel></rss>