<?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>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><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://airingursb.github.io/how-to-train-your-llm&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://airingursb.github.io/claude-101/&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><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><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><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><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><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><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;p&gt;`const { ccclass } = cc._decorator;&lt;/p&gt;
&lt;p&gt;@ccclass
export default class Helloworld extends cc.Component {&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;protected onLoad(): void {
    console.log(&apos;onLoad&apos;);
}

start () {
    console.log(&apos;Hello World&apos;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;}
`&lt;/p&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;p&gt;&lt;code&gt;unsigned int fbo; glGenFramebuffers(1, &amp;amp;fbo); &lt;/code&gt;&lt;/p&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;p&gt;`// Create a cube mesh
const cube = new cc.MeshRenderer();
cube.mesh = cc.GizmoMesh.createBox(1, 1, 1);&lt;/p&gt;
&lt;p&gt;// 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;/p&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;p&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;/p&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><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><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><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><pubDate>Fri, 29 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Mon, 04 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Wed, 30 Oct 2024 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sat, 31 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Mon, 13 May 2024 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Tue, 07 May 2024 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Fri, 29 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 17 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 14 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Thu, 09 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Fri, 06 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 13 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Wed, 03 May 2023 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 02 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Fri, 03 Mar 2023 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sat, 25 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Fri, 03 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Mon, 02 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 25 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sat, 03 Dec 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 16 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 31 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 24 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 24 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 17 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 10 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 03 Jul 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 26 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 19 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sat, 11 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sat, 04 Jun 2022 00:00:00 GMT</pubDate><content:encoded>&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>A look at how personal blogs have evolved over the years.&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><pubDate>Sat, 21 May 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sat, 14 May 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sat, 07 May 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Tue, 03 May 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 30 Jan 2022 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 11 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sat, 01 May 2021 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sat, 03 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Tue, 09 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Thu, 18 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sat, 06 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Thu, 08 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Tue, 30 Jun 2020 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sat, 18 Apr 2020 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sat, 07 Mar 2020 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Thu, 09 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Tue, 03 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sat, 09 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Wed, 11 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Tue, 03 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Thu, 13 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sat, 11 May 2019 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Wed, 10 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Tue, 09 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Mon, 08 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 07 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sat, 09 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Thu, 07 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 03 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Wed, 12 Dec 2018 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Thu, 30 Aug 2018 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Fri, 02 Jun 2017 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Sun, 16 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Mon, 16 Jan 2017 00:00:00 GMT</pubDate><content:encoded>&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><pubDate>Tue, 23 Feb 2016 00:00:00 GMT</pubDate><content:encoded>&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>