<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Len Chou</title>
    <link>https://zhoulianglen.com/en/</link>
    <description>AI Product Manager turning ideas into products with Vibe Coding</description>
    <language>en</language>
    <copyright>All rights reserved 2026, Len Chou</copyright>
    <lastBuildDate>Mon, 14 Sep 2026 22:34:54 GMT</lastBuildDate>
    <generator>Hexo</generator>
    <atom:link href="https://zhoulianglen.com/en/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Build the Business Before You Chase Growth</title>
      <link>https://zhoulianglen.com/en/business-growth-methods</link>
      <description>Lessons from healthcare, social commerce, construction SaaS, blockchain, and API tokens on validating value exchange, finding product-market fit, and scaling what works.</description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/operations/">Operations</category>
      <category domain="https://zhoulianglen.com/en/categories/share/">Sharing</category>
      <category domain="https://zhoulianglen.com/en/tag/product-manager/">Product Manager</category>
      <category domain="https://zhoulianglen.com/en/tag/growth/">Growth</category>
      <pubDate>Tue, 15 Sep 2026 02:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<blockquote><p>This article is adapted from a talk I gave at an AI Going Global Meetup in Shenzhen. The event focused on AI and global expansion, but my subject was more fundamental: markets change, while the underlying logic of business and growth does not. These are lessons from roughly ten years of product and operations work.</p></blockquote><h2 id="heading-1">01. About Me</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-01-len-speaker-profile.png" alt="Len Chou and career background" decoding="async"></p><p>I’m Len Chou. Over the years, I have managed a fund, spent roughly a decade as a product manager, worked as an operations partner, and built businesses in ecommerce and digital healthcare. I later moved from Hangzhou to Shenzhen and joined a company focused on GPU rental and API token services.</p><p>The roles look unrelated, but the work underneath has always been the same: understand the business, find a value exchange that works, then replicate a proven loop.</p><p>Healthcare, ecommerce, construction SaaS, a Layer 1 network, and model APIs appear completely different. In practice, they repeatedly run into the same questions. I care less about the channel or tool of the moment than about the business logic they share.</p><h2 id="heading-2">02. Going Global Changes the Market, Not the Logic of Growth</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-02-ai-global-expansion-growth-logic.png" alt="Global expansion changes the market, not the logic of growth" loading="lazy" decoding="async"></p><p>Going global changes the language, channels, payment methods, and culture. AI changes product forms and delivery efficiency. Neither makes the fundamentals disappear. Why does a customer choose you? What are they willing to exchange? Can that exchange keep happening?</p><p>That is why this article is not about a particular overseas channel or AI tool. The deeper question is whether we can still build a working business after moving to a new market. Users still need a reason to buy, someone must make the decision, someone must pay, and the company must deliver.</p><h2 id="heading-3">03. Build the Business Before You Chase Growth</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-03-build-business-before-growth.png" alt="Build the business before growth" loading="lazy" decoding="async"></p><p>I have never been comfortable describing myself as a growth operator. I would rather call myself a businessperson. Growth is not simply more traffic. It is the repeated expansion of a value exchange that already works.</p><p>If the first exchange has not happened, growth only magnifies the problem. First prove that someone needs the value, is willing to pay its cost, and that you can keep delivering it. Scale comes later.</p><h2 id="heading-4">04. Six Questions Behind Growth</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-04-six-step-business-growth-framework.png" alt="Six-step business growth framework" loading="lazy" decoding="async"></p><p>I break a business into six connected questions: understand the business, define the value, find the central conflict, complete the exchange, close the loop, and replicate it.</p><p>The order matters. Without understanding the participants and incentives, a team cannot define the real value. Without finding the conflict, it may build features for a false problem. Without completing one exchange, the supposed business loop is only a diagram. Growth emerges after the earlier steps hold together.</p><h2 id="heading-5">05. Confirm That It Is a Business</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-05-business-value-exchange-model.png" alt="Business value exchange model" loading="lazy" decoding="async"></p><p>A business is a value exchange between people or groups. The customer receives something they need, and the company receives revenue that lets it continue operating.</p><p>The product is only the vehicle. An app, website, or agent matters less than whether the exchange could happen without it. Product work should make a valid exchange more efficient and reliable.</p><p>As a product manager, I see the job as balancing user value and business value. Instead of first asking what app to build, I ask whether the first transaction can happen. If it can happen without software, complete it first. That is the essence of an MVP.</p><h2 id="heading-6">06. A “User” Is Rarely One Person</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-06-user-roles-decision-payment.png" alt="User, decision-maker, payer, and promoter roles" loading="lazy" decoding="async"></p><p>The user, decision-maker, payer, and internal promoter may all be different people. There may also be someone who actively blocks adoption.</p><p>Many products solve a real need and still fail because the incentives do not line up. The person receiving the benefit may not bear the cost. The payer may not receive the benefit. A buyer may approve a product while the actual user refuses to change their habits. Calling all of them “the user” hides the most important conflict.</p><h2 id="heading-7">07. Metrics Should Lead to Action</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-07-actionable-metrics-north-star-metric.png" alt="Vanity, actionable, and north-star metrics" loading="lazy" decoding="async"></p><p>I divide metrics into three groups. Vanity metrics look impressive but do not change what the team does. Ten million downloads mean little if activation and retention are near zero. Actionable metrics reveal where to intervene, such as activation, retention, conversion, and meaningful commercial behavior.</p><p>A business usually needs only one or two north-star metrics. They represent the outcome at the heart of the product or business model. Metrics exist to diagnose problems, set priorities, and prompt action, not to prove that the team is doing well.</p><h2 id="heading-8">08. AARRR Is a Map of Business Problems</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-08-aarrr-growth-funnel-framework.png" alt="AARRR growth funnel" loading="lazy" decoding="async"></p><p>AARRR divides the customer journey into acquisition, activation, retention, revenue, and referral. A business may reorder them, but the framework still helps answer where customers come from, when they first experience value, why they stay, when they pay, and whether they bring others.</p><p>These are not five letters for a report. They are a map for diagnosing a business. Each stage must correspond to real behavior rather than an isolated field in an analytics system.</p><h2 id="heading-9">09. Start Funnel Optimization Upstream</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-09-upstream-funnel-optimization.png" alt="Prioritizing upstream funnel improvements" loading="lazy" decoding="async"></p><p>I usually look for the most important upstream break first. A payment rate of 5% may take enormous effort to raise to 6% or 7%. Retaining another ten to fifteen percentage points when customers first experience value can produce a much larger effect downstream.</p><p>This is not an absolute rule. It is ROI thinking. Time and resources are limited, so the team should prioritize problems with both a wide impact and meaningful room for improvement.</p><h2 id="heading-10">10. Healthcare: Focus on What the Customer Is Ready to Do</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-10-local-healthcare-growth-case.png" alt="Local digital healthcare growth case" loading="lazy" decoding="async"></p><p>The first case comes from Weimai, a digital healthcare platform. Many competitors displayed doctors from across China, yet patients still needed examinations, surgery, treatment, and follow-up care locally. A patient in Shenzhen might consult a doctor in Beijing or Nanjing but have no practical way to continue offline care.</p><p>We concluded that digital healthcare was not only about online consultation. It had to establish trust through local doctors and complete the service loop offline. Instead of competing on doctor count, we asked how patients could meet and trust a doctor during a real care journey.</p><h2 id="heading-11">11. Choose a Market Where You Can Win the Cold Start</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-11-cold-start-market-selection.png" alt="Cold-start market selection" loading="lazy" decoding="async"></p><p>We focused on local doctors and made smaller cities our primary market. A budget that covered one expensive first-tier city could cover several smaller ones. Those cities still needed digital healthcare, but competition and entry costs were lower.</p><p>A cold start is not an abstract search for a blue ocean. It is a choice of battlefield under resource constraints. We built local networks where larger competitors were less willing to invest, then used the number of cities to create scale.</p><h2 id="heading-12">12. Each Moment in a Hospital Has a Different Conversion Task</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-12-hospital-patient-journey-conversion.png" alt="Patient journey conversion in hospitals" loading="lazy" decoding="async"></p><p>We mapped the patient journey through registration, waiting, payment, test results, and the end of a visit. Intent differs at every moment.</p><p>Registration could lead to the relevant doctor’s service. Waiting created time to connect patients through hospital Wi-Fi and WeChat. Payment could bring them into a follow-up communication flow. After the visit, trust in the doctor was strongest, making it the right moment to offer follow-up consultations.</p><p>Our highest-converting touchpoint came after the appointment. We placed a QR code on the doctor’s desk and reframed an internal label, “patient check-in,” as language patients understood: “Add your doctor on WeChat.” Patients could scan it for three free questions. Many later purchased the doctor’s services after a meaningful conversation.</p><h2 id="heading-13">13. WeChat as Lifecycle Infrastructure</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-13-wechat-patient-lifecycle-management.png" alt="WeChat patient lifecycle management" loading="lazy" decoding="async"></p><p>We did not treat official WeChat accounts as follower pools. The system identified the hospital, department, doctor, and QR code that brought each patient in. Messages on the day of treatment, day three, day seven, and one month later reflected the patient’s condition and stage of care.</p><p>The accounts formed lifecycle infrastructure for identification, follow-up, and conversion. A small team of roughly two business staff and three engineers accumulated about 35 million followers and turned the network into a major source of orders. The important point was not the total. We knew why people arrived, what they needed, and where the next value exchange might occur.</p><h2 id="heading-14">14. Opening a Tool Can Create a Growth Flywheel</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-14-hospital-saas-growth-flywheel.png" alt="Hospital SaaS growth flywheel" loading="lazy" decoding="async"></p><p>After optimizing the process inside one hospital, implementation became the bottleneck. Our own team could not deploy hospital by hospital quickly enough, and healthcare was poorly suited to aggressive referral mechanics.</p><p>Many hospitals lacked product and operations capacity. We packaged registration, payment, report lookup, and lifecycle management as free tools embedded in hospital WeChat accounts. In return, doctors joined our doctor-facing platform. Hospitals received a usable system, while we continued serving patients through doctors and lifecycle operations. More than twenty hospitals launched in the first week. Growth came from turning our capability into something partners wanted to adopt.</p><h2 id="heading-15">15. Cross-City Growth Requires an Organizational Model</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-15-cross-city-organization-growth-model.png" alt="Cross-city organization growth model" loading="lazy" decoding="async"></p><p>The free tools improved deployment inside a hospital but did not solve expansion across cities. Product, data, and operations could be standardized. Hospital relationships and local execution could not be copied remotely from headquarters.</p><p>We opened the central capabilities to experienced local leaders and shared part of each local subsidiary’s profit. Headquarters supplied the product, people, funding, data, and operating model. The local CEO brought years of relationships and execution experience. Cross-city growth became the product of headquarters capability and local trust.</p><h2 id="heading-16">16. Trust Is Often the Scarcest Cold-Start Resource</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-16-campus-social-commerce-trust-network.png" alt="Campus social commerce trust network" loading="lazy" decoding="async"></p><p>After Weimai, I tried building a social commerce business. While the industry competed for mothers as customers, I chose university students because their relationships spread naturally across schools, cities, and even countries.</p><p>The scarce resource was not traffic but trust. I spent time on campuses and found the people students already relied on: phone-card sellers, club leaders, dorm-floor representatives, residence staff, and instructors. I was looking for existing trust nodes, not a way to insert an unfamiliar platform from outside.</p><h2 id="heading-17">17. The Most Minimal MVP Uses No Development</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-17-mvp-before-product-development.png" alt="MVP validation before product development" loading="lazy" decoding="async"></p><p>I had little money and no complete team. I found suppliers, recorded costs and margins in a spreadsheet, and gave it to those campus trust nodes. Without building a complex system, the business produced roughly RMB 5 million in profit in its first month. Students would buy, campus partners could sell, and suppliers could fulfill the orders.</p><p>That is my definition of an MVP. It is not a smaller platform. It is the cheapest way to validate the most important business assumption. Once the transaction worked, software became a tool for replicating it hundreds or thousands of times.</p><p>The business later moved toward student credit, but regulation no longer allowed those financial services. A business loop must work within policy and social boundaries, not only at the level of demand and fulfillment.</p><h2 id="heading-18">18. Construction SaaS: Adoption Is Not Just a Usability Problem</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-18-construction-saas-adoption-case.png" alt="Construction SaaS adoption case" loading="lazy" decoding="async"></p><p>The next case was a construction SaaS company. Its product covered 80% to 90% of competitors’ features, yet years of investment had produced no real customers or revenue.</p><p>After two or three weeks on construction sites, I found that features were not the core problem. Recording data created extra work for frontline staff, and transparency threatened some existing interests. Owners received the benefit while workers bore the adoption cost.</p><p>Even customers who had purchased competing products struggled to keep frontline staff using them. Asking workers to open an app, take photos, and enter data on top of their existing process was not a problem that another training session could solve.</p><h2 id="heading-19">19. “Can’t Use It” Often Means “Don’t Want to Use It”</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-19-saas-user-adoption-resistance.png" alt="Resistance to SaaS adoption" loading="lazy" decoding="async"></p><p>Adoption friction is not limited to interface complexity. On construction sites, transparent records could expose material loss and remove gray areas that benefited some people. Transparency created value for the owner and a loss for parts of the frontline organization.</p><p>“We can’t use it” can mean three different things: the operation is genuinely complex, changing habits carries an extra cost, or the user does not want the system to work. A team that fails to distinguish them may keep simplifying the interface without changing adoption.</p><h2 id="heading-20">20. Redesign Incentives Around Each Role</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-20-saas-stakeholder-incentive-design.png" alt="SaaS stakeholder incentive design" loading="lazy" decoding="async"></p><p>The answer was not more features. We had to redesign each role’s incentives. The owner had paid but could not see management value, so I built more than twenty dashboards in two weeks. At first they were nearly empty, but every blank chart identified missing data and the person responsible for it. Owners who wanted visibility now had a reason to drive data entry.</p><p>Frontline workers still bore the operational cost. From an annual software fee of RMB 80,000, we proposed monthly rewards for people who completed the data work. In the first month, every reward was claimed, management reports filled with data, and anomalies were flagged. Owners acted on the information, which further reinforced the process.</p><h2 id="heading-21">21. B2B Sales Depends on a Role-Based Adoption Formula</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-21-b2b-saas-sales-adoption-model.png" alt="B2B SaaS sales and adoption model" loading="lazy" decoding="async"></p><p>Selling a complex B2B product means making an adoption mechanism work inside the customer’s organization. Decision-makers need management value, frontline workers need sufficient motivation, and internal connectors need to reduce the friction between levels.</p><p>Actual use is a precondition for scalable sales, not a bonus after delivery. If the product cannot work inside one customer, more sales only create more implementation problems. Once adoption works, the company finally has something it can replicate.</p><h2 id="heading-22">22. A Customer’s First Rejection May Be About the Presentation</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-22-ecommerce-user-rejection-case.png" alt="Ecommerce advertising conversion case" loading="lazy" decoding="async"></p><p>I once ran an advertising business that bought a large share of traffic on a leading Chinese platform. Banner click-through reached 40%, but 60% to 70% of visitors left after reaching the product page. We bought traffic on a CPM basis, so every exit represented a cost without a transaction.</p><p>The strong entry metric showed that people were willing to look. The failure happened when they saw the first product set. Their first rejection did not necessarily mean they had no demand. It might mean they rejected the current products or presentation.</p><h2 id="heading-23">23. A Strong Entry Point Can Hide a Weak Landing Page</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-23-landing-page-conversion-bottleneck.png" alt="Landing-page conversion bottleneck" loading="lazy" decoding="async"></p><p>Looking only at orders could have led us to blame the audience and buy more traffic. The funnel showed something different. A 40% click-through rate had already proved interest. The break appeared on the landing page.</p><p>Instead of asking how to win more clicks, we asked what visitors were rejecting: the underlying need, the product itself, or this particular selection.</p><h2 id="heading-24">24. Another Choice Increased Orders</h2><p>We tested a linked image styled as a close button. Clicking it did not exit. It opened another group of products, and closing again revealed another selection. The pattern absorbed much of the original drop-off and increased orders, although I am not publishing the exact percentage.</p><p>I call it a hack, not an advanced method. It offered more choices but also made leaving harder and could harm the experience. The useful lesson is that metrics can improve without user value improving. A team still has to ask whether it is helping people find what they need or merely raising the cost of exit.</p><h2 id="heading-25">25. Remove an Industry’s Default Cost</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-25-blockchain-cold-start-strategy.png" alt="Blockchain cold-start strategy" loading="lazy" decoding="async"></p><p>On a North American Layer 1 project, I had one effective team member and a budget of USD 20,000 to acquire and retain early users. Competitors could spend tens of thousands of dollars a day on influencers and ads, so copying their playbook was impossible.</p><p>I thought about how 360 entered antivirus by making a paid category free. In blockchain, the default entry cost was gas. Before trying a new chain, users had to acquire its native asset, exchange funds, and transfer them. Our limited budget was better spent removing a universal barrier than buying more traffic.</p><h2 id="heading-26">26. Free Gas Only Opens the Door</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-26-free-gas-user-acquisition.png" alt="Free gas user acquisition" loading="lazy" decoding="async"></p><p>We used most of the budget to subsidize gas. After simple anti-bot actions, users received enough for roughly ten to twenty on-chain interactions. The amount had to remove friction without becoming attractive to professional farmers.</p><p>We spent only another USD 2,000 to 3,000 on distribution. Market expectations around future airdrops drove organic discussion. Activity grew quickly and ranked highly in major wallets, but free gas answered only how users would take the first step, not why they would stay.</p><h2 id="heading-27">27. Subsidies Ignite Growth but Cannot Replace Demand</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-27-subsidy-to-real-user-demand.png" alt="From subsidies to real user demand" loading="lazy" decoding="async"></p><p>Free gas attracted real users, airdrop seekers, and many sybil bots. The next task was to identify valuable demand in the address data rather than keep increasing subsidies.</p><p>We found users holding substantial Bitcoin-related assets who wanted both yield and liquidity. At the time, users often deposited Bitcoin into protocols for a receipt token and restaked that token. We created another exchange: deposit the receipt token and borrow dollars so locked assets could become liquid again.</p><p>The model carried serious risk. We had to verify the assets backing each token, build alerts and liquidation processes, and connect dollar liquidity providers. Subsidies produced the first addresses. A real need for capital efficiency created the continuing loop.</p><h2 id="heading-28">28. Rethinking Growth Through an API Token Business</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-28-api-token-business-growth-strategy.png" alt="API token business growth strategy" loading="lazy" decoding="async"></p><p>The final case comes from the API token business I currently lead. The market includes many aggregators that combine model quotas from different sources and resell them. We are building a compliant version through formal agreements with model providers in China and overseas, without serving gray or black-market supply.</p><p>The company also operates GPU infrastructure, so we can deploy some open-source models ourselves. That gives us more control over availability, pricing, and stability than pure resale. The business is still developing. The important work is to understand what business it really is and which supply constraints determine whether it can last.</p><h2 id="heading-29">29. Growth from Large Customers Can Hide an Unhealthy Business</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-29-api-token-customer-health-metrics.png" alt="API token customer health metrics" loading="lazy" decoding="async"></p><p>When I took over, I had to choose between recharge value, customer count, and other metrics. I focused on actual token consumption. A customer who prepays but never calls the API has not demonstrated lasting demand. Continued consumption means the API is creating value inside the customer’s product.</p><p>I also remove a few exceptional accounts when assessing business health. Large customers contribute revenue and profit, but they can hide the condition of everyone else. Use the full numbers to evaluate the financial result, then examine the broader customer base to judge whether the model can be replicated.</p><h2 id="heading-30">30. API Tokens Are a Supply-Chain Business</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-30-api-token-supply-chain-business.png" alt="API token supply-chain capabilities" loading="lazy" decoding="async"></p><p>Customers compare price and quality, but they also care whether quota remains available and models remain stable. If an upstream provider fails, can we switch to another resource, data center, or self-hosted model? These questions all point to supply-chain capability.</p><p>Low prices alone cannot create a lasting relationship. Marketing can bring one visit. Delivery means providing stable access when customers need it and switching resources when supply changes. Traffic determines whether customers arrive. Supply determines whether they trust us with a core workload.</p><h2 id="heading-31">31. Let Customer Growth Drive Your Growth</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-31-customer-success-driven-growth.png" alt="Customer-success-driven growth" loading="lazy" decoding="async"></p><p>First find high-consumption use cases such as agents, developer tools, and batch workloads. Then reduce compatibility and migration costs, help customers reach the first stable API call, and shield them from upstream volatility through active resource scheduling.</p><p>The deeper work is customer success. I speak directly with early customers about how their products can attract more real users and grow. Token consumption should rise because their products create more value, not because we repeatedly push them to recharge. Their growth then drives our consumption and revenue.</p><p>This business does not yet have a finished ending. I am still looking for the decisive leverage point in the API token market. Without an answer, the honest response is to keep operating and observing rather than manufacture a conclusion for a presentation.</p><h2 id="heading-32">32. Growth Is Not One Department’s Job</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-32-company-wide-growth-collaboration.png" alt="Company-wide growth collaboration" loading="lazy" decoding="async"></p><p>I often say that design should move closer to product, product closer to operations, and operations closer to the CEO. Job boundaries need not disappear. Each role should understand one more step of the downstream result.</p><p>Designers need to know whether a solution helps users receive value. Product managers need to connect features to business results. Operations must understand revenue, cost, and supply. The CEO must align these roles around the same business loop.</p><p>A growth team cannot repair a business whose value is invalid, supply is unstable, or incentives conflict. The whole company must understand how its work affects the value exchange.</p><h2 id="heading-33">33. Six Principles to Remember</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-33-six-business-growth-principles.png" alt="Six principles of business growth" loading="lazy" decoding="async"></p><ol><li><strong>Understand the business before pursuing growth.</strong> It must support a real transaction. Otherwise more traffic only wastes more resources.</li><li><strong>A product must carry a sustainable value exchange.</strong> Apps, websites, clients, and agents are forms. Both user value and business value must hold.</li><li><strong>Find the central business conflict first.</strong> Local trust mattered in healthcare, incentive misalignment blocked construction SaaS, and entry cost constrained the blockchain cold start.</li><li><strong>Apply ROI thinking to the MVP and cold start.</strong> Complete the first transaction before investing heavily in software that may never be used.</li><li><strong>Subsidies can only ignite the process.</strong> People who enter for an incentive still need real value if retention and conversion are to continue.</li><li><strong>Own the business loop, not only the metric.</strong> Metrics guide decisions. The destination is a sustainable business that respects legal and ethical boundaries.</li></ol><h2 id="heading-34">34. Growth Is How the Whole Company Understands the Business</h2><p><img src="https://cdn.imzl.com/wp-content/uploads/2026/09/ai-global-growth-cases-34-business-growth-value-exchange.png" alt="Growth as value exchange" loading="lazy" decoding="async"></p><p>Hospital registration, campus trust nodes, incentives on construction sites, a close button on an ecommerce page, gas on a blockchain, and supply for model APIs appear unrelated. Each asks the same questions: in what context will a customer act, who can drive the transaction, what blocks the value exchange, and how can a valid result be replicated?</p><p>Frameworks organize thinking but cannot replace contact with a real business. The answers often live outside the meeting room, in hospital corridors, university dormitories, construction sites, customer usage data, and frontline incentives.</p><p>Whether the work is product, operations, growth, or international expansion, it must keep completing an exchange that both sides accept. Build the business first. Then use product, organization, channels, and capital to replicate it. Growth is not one department’s responsibility. It is how the whole company understands the business.</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>AI Advice for My Friends</title>
      <link>https://zhoulianglen.com/en/ai-usage-tips</link>
      <description>Three years of hands-on lessons on how to actually use AI, not prompt tricks, but the habits and judgment that make it work.</description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/ai/">AI</category>
      <category domain="https://zhoulianglen.com/en/tag/ai/">AI</category>
      <pubDate>Sun, 07 Jun 2026 02:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>From the day ChatGPT opened to the public in late 2022, I dove in headfirst. Three-plus years later, after watching the major models take turns in the spotlight, I’ve gone from treating it as “a toy that writes poems” to having it help me turn an idea into a product, and then into my first real revenue. By now AI has become the tool I use most often, invest the most in, and get the highest ROI from.</p><p>Because of that, more and more friends keep asking me the same question: <strong>how are you actually supposed to use AI?</strong></p><p>The market is already drowning in AI tutorials, most of them selling an illusion: copy one magic prompt and you’ll turn lead into gold. The reality is that most people try it twice, decide it’s unreliable, and never touch it again.</p><p>This piece won’t teach you prompts. I’ve collected the pitfalls I fell into over these three years, along with a few habits that have actually held up, in the hope that they help friends who are still finding their footing.</p><p><strong>What matters has never been the tricks. It’s the feel.</strong></p><p><img src="/img/ai-usage-tips/cover.png" alt="" decoding="async"></p><hr><h2 id="heading-1">1. AI Has Read Every Book, But Hasn’t Worked a Single Day at Your Company</h2><p>Here’s how I think about AI: <strong>a genius who has read every book and aced every exam, but has never worked a single day at your company.</strong></p><p>Its knowledge is flawless and it’s quick on its feet. But it knows nothing about your business: it hasn’t sat in your meetings, met your customers, or learned where your resources run out, and it certainly doesn’t know what your boss decided last week.</p><p>Worse, when it doesn’t know something, it won’t say “I don’t know.” It will keep a straight face and invent an answer that looks perfectly right.</p><p>So two things matter:</p><ul><li><strong>Anything beyond common knowledge, you have to feed it.</strong> Industry reports, competitor research, your own read on things, put them in first. Ask AI to generate judgment out of thin air and you’ll get filler.</li><li><strong>Treat it as a brilliant new colleague, not an industry expert.</strong> It can build the scaffolding and weave your raw material into readable text, but the direction and the judgment still have to come from you. This company, this client, the backstory of this particular situation, AI will never know.</li></ul><p>Over these three years I’ve grown more and more certain of one thing: what’s truly valuable in the AI era isn’t technical depth, <strong>it’s business judgment × tool fluency.</strong> AI does the work, but you have to know what work needs doing.</p><hr><h2 id="heading-2">2. It Will Quietly Mislead You, and the More Confident It Sounds, the More You Should Watch Out</h2><p>The way AI makes mistakes is deceptive: <strong>the more confidently it speaks, the more you tend to believe it,</strong> yet there’s no real link between its confidence and its accuracy.</p><p>A few lines you have to hold:</p><ul><li><strong>Anything factual, always cross-check.</strong> Names, dates, figures, citations, statute numbers, AI’s talent for fabricating these is second to none.</li><li><strong>Anything requiring professional judgment, AI is reference only.</strong> Legal clauses, medical advice, financial decisions, fine for preliminary research, but the final call must be signed off by a professional.</li><li><strong>Anything involving privacy or sensitive information, mind your data security.</strong> Company secrets, personal identities, non-public business data, don’t feed them straight into public AI services.</li></ul><p>And some things are <strong>best not handed to AI at all:</strong></p><ul><li>Fields you genuinely don’t understand and can’t verify, where you’re most likely to be taken in by its confident nonsense</li><li>Judgments tied to critical decisions that you personally have to answer for</li><li>Matters that lean heavily on tacit knowledge and long-term relationships, like whether to advise a friend to get a divorce</li></ul><p><strong>Trust, but verify.</strong> That’s been my baseline stance in working with AI, unchanged for three years.</p><hr><h2 id="heading-3">3. AI Makes the “Super Individual” Possible</h2><p>In the past, it wasn’t easy for one person to handle cross-functional work efficiently. A product manager who wanted to write their own code had to take months off to learn it; a designer who wanted to build and run a product solo had to fill in a lot of fundamentals; a content creator who wanted to do data analysis had to grind through the basics of statistics.</p><p>Every additional field meant a whole pile of fundamentals to catch up on, so the economical move was division of labor. That’s also why companies kept growing larger and teams kept getting more bloated.</p><p><strong>AI is changing that equation.</strong></p><p>Future competitiveness no longer depends on what “role” you hold, but on <strong>how much business you understand × how many tools you can use × how well you use them.</strong></p><p>The following aren’t hypotheticals, they’re happening around me right now:</p><ul><li><strong>Me:</strong> product validation that used to take 7-8 people two months, I can now run a full round of solo in 4-10 days: writing code, building prototypes, producing PRDs, writing test cases, crunching data, all of it. While working I often have a dozen-plus AI chat windows open at once (these days I mostly work in the terminal), like carrying a miniature team around with me.</li><li><strong>A stay-at-home mom</strong> running a network of accounts with hundreds of thousands of followers across a public account and short-video platforms, all by herself: writing, illustrating, editing, replying to comments, handling brand deals. At that scale, you used to need a whole editorial team plus an MCN agency.</li><li><strong>A 16-year-old high schooler</strong> who single-handedly built an app, shipped it to the app store, and crossed ten thousand downloads. That used to be work only a formally trained programmer would dare take on.</li><li><strong>A couple in their sixties</strong> who opened an online store from zero: sourcing products, shooting photos, writing copy, running livestreams, all themselves. That used to take an entire small company; they keep it going with one phone and one computer.</li><li><strong>An ordinary office worker</strong> who takes on brand consulting gigs with AI after hours, with a side income closing in on their day job. That kind of work used to require the letterhead of a consulting firm to land.</li></ul><p>AI won’t replace teams, but it has dramatically lowered the bar for “completing something complex on your own.” <strong>It’s extending everyone’s radius of capability.</strong> You don’t need to be an expert in every field; you just need to describe the task clearly, hand it to AI, and then gatekeep the quality.</p><p><img src="/img/ai-usage-tips/fig1.png" alt="" loading="lazy" decoding="async"></p><hr><h2 id="heading-4">4. Don’t Make Wishes, Give Instructions</h2><p>A lot of people using AI are really just making wishes:</p><blockquote><p>“Write me a good article.”<br>“Come up with a plan for me.”<br>“Write a video script.”</p></blockquote><p>It’s like telling a brand-new intern to “handle this well.” They have no idea what standard you want, who it’s for, what style to use, or what’s off-limits.</p><p>AI is not Aladdin’s lamp. It’s an extremely diligent colleague who <strong>doesn’t know the subtext in your head.</strong> The more your instructions read like a proper assignment brief, the more presentable what it hands back will be.</p><p>After all these years, what I’ve settled on is still the plainest template:</p><pre><code class="highlight plaintext">[Role] You are ___[Context] The current situation is ___[Task] Please help me ___[Requirements] The output should ___ (length / tone / off-limits / format)</code></pre><p>An example. Instead of “write me a meeting notice,” do this:</p><ul><li><strong>Role:</strong> You are a senior administrative assistant</li><li><strong>Context:</strong> The company is holding its quarterly review next Wednesday, location xxxx, attendees xxxx…</li><li><strong>Task:</strong> Write a formal meeting notice, format requirements: xxxx…</li><li><strong>Requirements:</strong> Include time, place, and agenda; formal tone; under 500 words</li></ul><p>Just those four lines of difference can take the output quality from a 40 straight to a 75.</p><p>(Plain, but it works. AI doesn’t need flash; it needs clarity.)</p><p><img src="/img/ai-usage-tips/fig2.png" alt="" loading="lazy" decoding="async"></p><hr><h2 id="heading-5">5. Edit Your Instructions, Not the Output</h2><p>This one is especially for friends who have real professional skills.</p><p>AI hands you a 60-point draft, your fingers itch and you tweak it to 80, then the tweaking turns into a full rewrite, and finally you say “I’ll just do it myself,” and never use AI again.</p><p>I’ve watched far too many people quit this way.</p><p>The right move: when you’re unhappy with the output, <strong>don’t fix its result, fix your instruction.</strong></p><ul><li>Add a clearer role definition</li><li>Give a reference example (“mimic this style”)</li><li>Set off-limits zones (“don’t use these words”)</li><li>Break it into steps (“outline first for my sign-off, then expand”)</li></ul><p>Your goal isn’t to make AI output a 100 in one shot, but to make the workflow reliably produce a 75-80; the remaining 20 is your final judgment and polish.</p><p><strong>Iterate the process, not the result.</strong></p><hr><h2 id="heading-6">6. Early On, Ask the Same Question to at Least Three AIs</h2><p>My first piece of advice for friends just getting started with AI: <strong>in the early days, throw the same question at at least three different AIs.</strong></p><p>Every model has its own “personality”:</p><ul><li><strong>Claude</strong> writes with taste and reasons solidly, but is sometimes too polite and too cautious</li><li><strong>ChatGPT</strong> is the all-rounder, great for divergent ideas, but prone to “making things up that sound very real”</li><li><strong>Gemini</strong> is strong at search integration, good for information-dense preliminary research</li><li><strong>DeepSeek and Kimi,</strong> the Chinese models, each have their own strengths in Chinese-language contexts</li></ul><p>You don’t need to crown the “strongest model.” What you want is to <strong>develop a feel:</strong> knowing which task suits whom, who writes the “first draft,” who plays “reviewer.” It’s no different from managing a small team; you have to know each member’s strengths and weaknesses.</p><p>(By the way: this doesn’t contradict the previous point. Comparing multiple models early on is about “picking your people”; once you’re in a stable workflow, lock in your mainstays. The comparison isn’t a substitute for “fixing the process.”)</p><p>The process might take a week or two. But once the feel kicks in, the jump in efficiency is a step change.</p><p><img src="/img/ai-usage-tips/fig3.png" alt="" loading="lazy" decoding="async"></p><hr><h2 id="heading-7">7. Break Big Tasks into Small Steps</h2><p>AI’s biggest strength isn’t “giving you the right answer in one leap,” but its ability to <strong>reliably complete many small steps within a process you’ve designed.</strong></p><p>The more you ask it to knock out a complex task in one go, the more likely it is to deliver something that “looks complete but quietly cuts corners.”</p><p>Say you want AI to help write a product requirements document. Don’t say “write me a PRD.” Break it down:</p><ol><li>First describe the user scenario and the problem to be solved</li><li>Output the product goals and core success metrics</li><li>Lay out the priorities of the main feature modules</li><li>For each module, expand into user stories / flows / edge cases</li><li>Finally, have it review the whole thing for logical gaps</li></ol><p>Each step is a clear, small task, and AI’s completion rate on small tasks is far higher than on “reaching the sky in a single bound.”</p><p>The essence of this approach <strong>isn’t teaching AI one all-powerful incantation, it’s teaching yourself a workflow.</strong></p><hr><h2 id="heading-8">8. Have It Produce Several Versions, Then Pick</h2><p>Ask AI for just one answer and what you usually get is the most middle-of-the-road, safest, most “AI-flavored” one, that even-keeled, lifeless tone where everything is correct and nothing actually lands.</p><p>My own habits:</p><ul><li>Writing headlines? Ask for 10 at once</li><li>Writing a social post? Get 5 versions at once</li><li>Brainstorming topics? Ask for 30-50 at once, then group and filter</li><li>Naming a product? Ask for 20 at once, sorted by different styles</li></ul><p><strong>Fight mediocrity with volume.</strong> When you raise both the average and the output count, a few standouts naturally emerge from the distribution.</p><p>This thinking shares the same foundation as growth work on the internet: the essence of A/B testing is replacing gut calls with volume and probability.</p><p><img src="/img/ai-usage-tips/fig4.png" alt="" loading="lazy" decoding="async"></p><hr><h2 id="heading-9">9. Feed It Clean Material Before Putting It to Work</h2><p>Many people fall into a counterintuitive trap with AI: using a 100-word prompt to demand a 3,000-word article. That’s like asking someone with no materials at all to write a paper from nothing; what comes out is bound to be vague filler.</p><p>The right approach is the reverse:</p><blockquote><p><strong>Give it a mountain of material and let it compress, distill, and organize for you.</strong></p></blockquote><p>Feed in meeting transcripts, industry reports, competitive analyses, customer feedback, and let it extract the key information, structure it, and produce a summary. Compressing is easier than expanding: squeezing 100,000 words down to 10,000, AI does well; blowing 100 words up to 10,000, nine times out of ten it’s padding.</p><p>But there’s a craft to feeding it: AI takes the path of least effort. Give it a PDF and it might skim the table of contents before it starts inventing; give it a web link and it might never actually finish reading.</p><p>So you have to do a bit of the “grunt work” for it:</p><ul><li>PDFs and web pages: convert them to plain text or Markdown first; strip out the navigation, ads, and formatting noise</li><li>Long articles: split them up manually and tell it explicitly, “here is part one, handle this part first”</li><li>Image content: supplement it with text descriptions; AI understands images far less well than text</li></ul><p>Put in a little preparation and AI’s intellectual output gets a lot sharper. <strong>Just like handing an intern a tidy, organized briefing pack, their work naturally goes faster.</strong></p><p><img src="/img/ai-usage-tips/fig5.png" alt="" loading="lazy" decoding="async"></p><hr><h2 id="heading-10">10. Start with the Small Problems Around You</h2><p>Don’t start out thinking “let AI restructure my entire business.” <strong>Starting with the small problems right next to you</strong> is a far more reliable opening.</p><p>General use cases:</p><ul><li><strong>Cleaning up meeting notes:</strong> drop in the transcript and have it distill the key points and action items</li><li><strong>Polishing an email:</strong> give it your draft and tell it the audience and tone</li><li><strong>Quickly getting up to speed on an unfamiliar field:</strong> have it explain things “like you’re a beginner”</li><li><strong>Batch-generating headlines / copy:</strong> give it examples and requirements, get 10 at once, then pick</li><li><strong>Writing Excel formulas:</strong> describe what you want in plain language and let it write the formula and organize the report for you</li><li><strong>Translating or rewriting:</strong> turn Chinese into an English business email, or technical docs into product copy</li></ul><p>A “first task” tailored to different friends:</p><ul><li><strong>In sales:</strong> drop in the client company’s website, their last 10 social posts, and their latest article, and have AI list 3 conversation angles and the pain points they might care about</li><li><strong>In content:</strong> feed in your 10 most-read articles, have AI summarize your style profile, then use that profile to generate new topics</li><li><strong>In product:</strong> scrape the review sections of competing apps and have AI sort out “what users complain about most and love most”</li><li><strong>Just curious:</strong> pick a book you’ve wanted to read but never had time for, and use AI as a study partner, walking you through one chapter a day plus 3 discussion questions</li></ul><p>Each small task saves you 15-30 minutes. Do three or four a day and that’s an hour or two. <strong>The more you use it, the better your feel gets, and the clearer you become on when to use it and when not to.</strong></p><hr><h2 id="heading-11">11. Start Now, Don’t Wait for “Better AI”</h2><p>Watching countless AI products rise and fall over these three years, one pattern is crystal clear:</p><blockquote><p><strong>The people who truly benefit from AI are the ones who started using it while it was still “not good enough.”</strong></p></blockquote><p>Don’t wait for the perfect model, don’t wait for best practices to settle. AI gets a major upgrade every few months, but the “feel” of working with it can only be built up slowly over time:</p><ul><li>Knowing which tasks are worth handing to AI</li><li>Knowing how to describe a need to get a good result</li><li>Knowing when to push back with follow-ups and when to switch models</li><li>Knowing when to just do it yourself</li></ul><p><strong>There’s no shortcut to this experience. You only get it by using it.</strong></p><p>Models will iterate and tools will update, but your understanding and command of AI is an asset that’s truly yours. Just like learning computers twenty years ago or smartphones ten years ago, the earlier you start the more you gain, and the more you use it the smoother it gets.</p><hr><h2 id="heading-12">Final Thoughts</h2><p>AI is neither magic nor a scam. It’s a tool that’s rapidly getting stronger.</p><p>Like every tool, what it amplifies is the user’s own ability. If you have good judgment, good taste, and a good grasp of the business, AI can magnify all of that tenfold; conversely, if you have none of that and only make wishes at it, all it can hand back is a pile of plausible-sounding nonsense.</p><blockquote><p><strong>Material × Taste × Tool Fluency</strong></p><p>That’s the real output formula for a person in the AI era.</p></blockquote><p><img src="/img/ai-usage-tips/fig6.png" alt="" loading="lazy" decoding="async"></p><p>I hope this was useful. If you have questions, reach out anytime.</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>
        <![CDATA[Internal Presentation & Document: A Brief Analysis of SEO Ranking Optimization Techniques]]>
      </title>
      <link>https://zhoulianglen.com/en/seo-ppt-document</link>
      <description>
        <![CDATA[<p>SEO has been making a comeback lately, especially in the going-global community, and many friends have been privately reaching out to me]]>
      </description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/operations/">Operations</category>
      <category domain="https://zhoulianglen.com/en/categories/share/">Sharing</category>
      <category domain="https://zhoulianglen.com/en/tag/seo/">SEO</category>
      <category domain="https://zhoulianglen.com/en/tag/pdf/">PDF</category>
      <pubDate>Fri, 23 Aug 2024 06:44:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>SEO has been making a comeback lately, especially in the going-global community, and many friends have been privately reaching out to me for advice. So here’s an SEO presentation I did internally at Wemai back in 2017, along with related documents. The content may be dated, but it covers the core principles of SEO that remain effective in practice today. I hope it helps those in need.</p><p>(Diyu was my work alias — don’t laugh…)</p><iframe src="https://cdn.imzl.com/docs/SEO%E5%91%A8%E4%BC%9A%E5%88%86%E4%BA%AB@%E5%9C%B0%E6%A6%86%EF%BC%88%E5%91%A8%E8%89%AF%E7%B2%A5%E5%87%89%EF%BC%89_2017.11.03.pdf" width="100%" height="2000px"></iframe><p><a href="https://cdn.imzl.com/docs/SEO%E5%91%A8%E4%BC%9A%E5%88%86%E4%BA%AB@%E5%9C%B0%E6%A6%86%EF%BC%88%E5%91%A8%E8%89%AF%E7%B2%A5%E5%87%89%EF%BC%89_2017.11.03.pdf">Download the SEO Presentation (PDF)</a></p><p>SEO Basic Standards Document: <a href="https://shimo.im/doc/aLMG4FtoLZ8JRoKC">https://shimo.im/doc/aLMG4FtoLZ8JRoKC</a></p><p>SEO Casual Discussion Notes: <a href="https://shimo.im/doc/7GVFl8rwU2snuY6X">https://shimo.im/doc/7GVFl8rwU2snuY6X</a></p>]]>
      </content:encoded>
    </item>
    <item>
      <title>Setting Up a Custom Domain for Bento.me Using Cloudflare Workers</title>
      <link>https://zhoulianglen.com/en/bento-add-domain</link>
      <description>
        <![CDATA[<p><a href="http://Bento.me">Bento.me</a> is a no-code platform for creating personal homepages, known for its elegant design and ease of us]]>
      </description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/experimentation/">Experimentation</category>
      <category domain="https://zhoulianglen.com/en/tag/cloudflare/">Cloudflare</category>
      <category domain="https://zhoulianglen.com/en/tag/bento/">Bento</category>
      <pubDate>Tue, 14 May 2024 21:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p><a href="http://Bento.me">Bento.me</a> is a no-code platform for creating personal homepages, known for its elegant design and ease of use.</p><p>But it has one drawback: <strong>it doesn’t support custom domains.</strong></p><p>Don’t worry though — this article will walk you through the simplest, zero-cost method to bind a custom domain to your <a href="http://Bento.me">Bento.me</a> page.</p><h2 id="heading-1">1. Prerequisites</h2><ol><li>You need to have a <a href="http://Bento.me">Bento.me</a> personal page</li><li>Register / prepare a Cloudflare account</li><li>Own an independent domain and transfer its DNS management to Cloudflare</li></ol><h2 id="heading-2">2. Create a Cloudflare Worker Project</h2><p>Enter the following command in your terminal to create a basic Cloudflare Worker:</p><p><code>npm create cloudflare@latest</code></p><p><img src="https://cdn.imzl.com/wp-content/uploads/2024/05/bento-add-domain.png" alt="Terminal operation" decoding="async"></p><p>Then follow the prompts in the terminal:</p><ul><li><p>In which directory do you want to create your application?</p><ul><li><strong>Default or custom — either is fine</strong></li></ul></li><li><p>What type of application do you want to create?</p><ul><li><strong>Select “Hello World” Worker</strong></li></ul></li><li><p>Do you want to use TypeScript?</p><ul><li><strong>Select NO (use the arrow keys to choose)</strong></li></ul></li><li><p>Do you want to use git for version control?</p><ul><li><strong>Select Yes</strong></li></ul></li><li><p>Do you want to deploy your application?</p><ul><li><strong>Select Yes (if this is your first time, it will automatically open a browser for login)</strong></li></ul></li></ul><p>Once complete, a folder will appear in the corresponding directory. Open it with a code editor such as Visual Studio Code.</p><h2 id="heading-3">3. Set Environment Variables</h2><ol><li>Edit the <code>wrangler.toml</code> file and add the following at the end:</li></ol><pre><code class="highlight ini"><span class="section">[vars]</span><span class="attr">BENTO_USERNAME</span> = <span class="string">&quot;len&quot;</span> <span class="comment"># Replace with your Bento page ID — mine is bento.me/len</span><span class="attr">BASE_URL</span> = <span class="string">&quot;https://bento.imzl.com&quot;</span> <span class="comment"># Replace with your custom domain</span></code></pre><ol start="2"><li>Create a <code>.dev.vars</code> file in the project root directory and paste the following:</li></ol><pre><code class="highlight ini"><span class="attr">BENTO_USERNAME</span>=<span class="string">&quot;len&quot;</span> <span class="comment"># Replace with your Bento page ID</span><span class="attr">BASE_URL</span>=<span class="string">&quot;http://127.0.0.1:8787&quot;</span></code></pre><h2 id="heading-4">4. Create the Worker</h2><ol><li>Edit the <code>/src/index.js</code> file and replace its contents with the following:</li></ol><pre><code class="highlight js"><span class="comment">/*</span><span class="comment"> * Setting up a custom domain for Bento.me</span><span class="comment"> * Author: len</span><span class="comment"> * Details: https://imzl.com/bento-add-domain</span><span class="comment"> * Original source: https://jayfranco.hashnode.dev/</span><span class="comment"> */</span><span class="comment">// Event listener</span><span class="title function_">addEventListener</span>(<span class="string">&#x27;fetch&#x27;</span>, <span class="function"><span class="params">event</span> =&gt;</span> &#123;  <span class="comment">// When a fetch event occurs, respond with the result of handleRequest</span>  event.<span class="title function_">respondWith</span>(<span class="title function_">handleRequest</span>(event.<span class="property">request</span>));&#125;);<span class="comment">// Parse response based on content type</span><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">parseResponseByContentType</span>(<span class="params">response, contentType</span>) &#123;  <span class="comment">// If there&#x27;s no content type, return the response as text</span>  <span class="keyword">if</span> (!contentType) <span class="keyword">return</span> <span class="keyword">await</span> response.<span class="title function_">text</span>();  <span class="comment">// Handle differently based on content type</span>  <span class="keyword">switch</span> (<span class="literal">true</span>) &#123;    <span class="keyword">case</span> contentType.<span class="title function_">includes</span>(<span class="string">&#x27;application/json&#x27;</span>):      <span class="comment">// If JSON, return as a JSON string</span>      <span class="keyword">return</span> <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(<span class="keyword">await</span> response.<span class="title function_">json</span>());    <span class="keyword">case</span> contentType.<span class="title function_">includes</span>(<span class="string">&#x27;text/html&#x27;</span>):      <span class="comment">// If HTML, use HTMLRewriter to transform the response</span>      <span class="keyword">const</span> transformedResponse = <span class="keyword">new</span> <span class="title class_">HTMLRewriter</span>()        .<span class="title function_">on</span>(<span class="string">&#x27;body&#x27;</span>, &#123;          <span class="title function_">element</span>(<span class="params">element</span>) &#123;            <span class="comment">// Custom CSS and JS can be added to the HTML page here</span>            element.<span class="title function_">append</span>(              <span class="string">`</span><span class="string">                &lt;style&gt;</span><span class="string">                  // Add your custom CSS here</span><span class="string">                &lt;/style&gt;</span><span class="string">                `</span>,              &#123; <span class="attr">html</span>: <span class="literal">true</span> &#125;,            );            element.<span class="title function_">append</span>(              <span class="string">`</span><span class="string">                &lt;script&gt;</span><span class="string">                  // Add your custom JS here</span><span class="string">                &lt;/script&gt;</span><span class="string">                `</span>,              &#123; <span class="attr">html</span>: <span class="literal">true</span> &#125;,            );          &#125;,        &#125;)        .<span class="title function_">transform</span>(response);      <span class="comment">// Return the transformed response as text</span>      <span class="keyword">return</span> <span class="keyword">await</span> transformedResponse.<span class="title function_">text</span>();    <span class="keyword">case</span> contentType.<span class="title function_">includes</span>(<span class="string">&#x27;font&#x27;</span>):      <span class="comment">// If the content type is a font, return as ArrayBuffer</span>      <span class="keyword">return</span> <span class="keyword">await</span> response.<span class="title function_">arrayBuffer</span>();    <span class="keyword">case</span> contentType.<span class="title function_">includes</span>(<span class="string">&#x27;image&#x27;</span>):      <span class="comment">// If the content type is an image, return as ArrayBuffer</span>      <span class="keyword">return</span> <span class="keyword">await</span> response.<span class="title function_">arrayBuffer</span>()    <span class="attr">default</span>:      <span class="comment">// For all other content types, return as text</span>      <span class="keyword">return</span> <span class="keyword">await</span> response.<span class="title function_">text</span>();  &#125;&#125;<span class="comment">// Function to handle all requests</span><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">handleRequest</span>(<span class="params">request</span>) &#123;  <span class="comment">// Extract the path from the request URL</span>  <span class="keyword">const</span> path = <span class="keyword">new</span> <span class="title function_">URL</span>(request.<span class="property">url</span>).<span class="property">pathname</span>;  <span class="comment">// By default, the URL is set to &quot;https://bento.me&quot; + path</span>  <span class="keyword">let</span> url = <span class="string">&#x27;https://bento.me&#x27;</span> + path;  <span class="comment">// If the path contains &#x27;v1&#x27;, change the URL to &#x27;https://api.bento.me&#x27; + path</span>  <span class="keyword">if</span> (path.<span class="title function_">includes</span>(<span class="string">&#x27;v1&#x27;</span>)) &#123;    url = <span class="string">&#x27;https://api.bento.me&#x27;</span> + path;  &#125;  <span class="comment">// If the URL is &quot;https://bento.me/&quot;, append the BENTO User ID</span>  <span class="keyword">if</span> (url === <span class="string">&#x27;https://bento.me/&#x27;</span>) &#123;    url = <span class="string">&#x27;https://bento.me/&#x27;</span> + <span class="variable constant_">BENTO_USERNAME</span>;  &#125;  <span class="comment">// Define basic headers for the fetch request</span>  <span class="keyword">let</span> headers = &#123;    <span class="string">&#x27;Access-Control-Allow-Origin&#x27;</span>: <span class="string">&#x27;*&#x27;</span>,    <span class="string">&#x27;Access-Control-Allow-Methods&#x27;</span>: <span class="string">&#x27;GET,HEAD,POST,OPTIONS&#x27;</span>,  &#125;;  <span class="comment">// Fetch the URL with the defined headers</span>  <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(url, &#123; headers &#125;);  <span class="comment">// Extract the content type from the response headers</span>  <span class="keyword">const</span> contentType = response.<span class="property">headers</span>.<span class="title function_">get</span>(<span class="string">&#x27;content-type&#x27;</span>);  <span class="comment">// Parse the response based on content type</span>  <span class="keyword">let</span> results = <span class="keyword">await</span> <span class="title function_">parseResponseByContentType</span>(response, contentType);  <span class="comment">// If the result is not an ArrayBuffer,</span>  <span class="comment">// replace all calls to the bento API with our BASE_URL</span>  <span class="comment">// This is a workaround for CORS errors</span>  <span class="keyword">if</span> (!(results <span class="keyword">instanceof</span> <span class="title class_">ArrayBuffer</span>)) &#123;    results = results.<span class="title function_">replaceAll</span>(<span class="string">&#x27;https://api.bento.me&#x27;</span>, <span class="variable constant_">BASE_URL</span>);  &#125;  <span class="comment">// Add the content type to the headers</span>  headers[<span class="string">&#x27;content-type&#x27;</span>] = contentType;  <span class="comment">// Return a new response with the results and headers</span>  <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Response</span>(results, &#123; headers &#125;);&#125;</code></pre><ol start="2"><li>Navigate to the project folder in your terminal and run the code to preview:</li></ol><pre><code class="highlight yaml"><span class="string">npm</span> <span class="string">run</span> <span class="string">dev</span></code></pre><ol start="3"><li>Once everything looks good, deploy to production:</li></ol><pre><code class="highlight yaml"><span class="string">npm</span> <span class="string">run</span> <span class="string">deploy</span></code></pre><h2 id="heading-5">5. Configure the Custom Domain in Cloudflare</h2><ol><li>First, make sure the domain you want to bind has its DNS managed by Cloudflare.</li><li>Go to “Workers and Pages” and find the Worker project you just pushed.</li><li>Under “Settings - Triggers,” add your custom domain and wait for it to take effect.</li><li>Now you can visit <a href="https://bento.imzl.com">bento.imzl.com</a> to see your Bento page.</li></ol>]]>
      </content:encoded>
    </item>
    <item>
      <title>Crypto Reading List</title>
      <link>https://zhoulianglen.com/en/crypto-reading</link>
      <description>A curated reading list of crypto-related articles covering cyclical thinking across the entire crypto space. Recommended to be read in chronological order.</description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/crypto/">Crypto</category>
      <category domain="https://zhoulianglen.com/en/tag/crypto/">Crypto</category>
      <pubDate>Tue, 06 Feb 2024 23:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>Below is a curated reading list of crypto-related articles, originally copied from <a href="https://danromero.org/crypto-reading/">Dan Romero</a>’s blog. The titles were mostly in English — I’ve translated them into Chinese in the original post. Recommended to be read in chronological order:</p><h2 id="heading-1">2008</h2><ul><li><a href="https://bitcoin.org/bitcoin.pdf">Bitcoin: A Peer-to-Peer Electronic Cash System</a> — Where it all began. The Bitcoin whitepaper, written by someone under the pseudonym “Satoshi Nakamoto.”</li></ul><h2 id="heading-2">2011</h2><ul><li><a href="https://avc.com/2011/11/bitcoin/">Bitcoin</a> — by Fred Wilson</li></ul><h2 id="heading-3">2013</h2><ul><li><a href="https://cdixon.org/2013/12/12/coinbase">Coinbase</a> — by Chris Dixon</li><li><a href="https://cointelegraph.com/news/investor_chris_dixon_why_i_am_interested_in_bitcoin">Why I’m Interested in Bitcoin</a> — by Chris Dixon</li></ul><h2 id="heading-4">2014</h2><ul><li><a href="https://a16z.com/2014/01/21/why-bitcoin-matters-nyt/">Why Bitcoin Matters</a> — by Marc Andreessen</li></ul><h2 id="heading-5">2016</h2><ul><li><a href="https://medium.com/the-coinbase-blog/ethereum-is-the-forefront-of-digital-currency-5300298f6c75">Ethereum Is the Forefront of Digital Currency</a> — by Fred Ehrsam</li><li><a href="https://www.usv.com/writing/2016/08/fat-protocols/">Fat Protocols</a> — by Joel Monegro</li></ul><h2 id="heading-6">2017</h2><ul><li><a href="https://medium.com/@FEhrsam/value-of-the-token-model-6c65f09bcba8">Value of the Token Model</a> — by Fred Ehrsam</li><li><a href="https://blog.coinbase.com/a-beginners-guide-to-ethereum-46dd486ceecf">A Beginner’s Guide to Ethereum</a> — by Linda Xie</li><li><a href="https://medium.com/@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274">The Meaning of Decentralization</a> — by Vitalik Buterin</li><li><a href="https://news.earn.com/thoughts-on-tokens-436109aabcbe">Thoughts on Tokens</a> — by Balaji Srinivasan</li><li><a href="https://cdixon.org/2017/05/27/crypto-tokens-a-breakthrough-in-open-network-design">Crypto Tokens: A Breakthrough in Open Network Design</a> — by Chris Dixon</li><li><a href="https://vitalik.eth.limo/general/2017/06/09/sales.html">Analyzing Token Sale Models</a> — by Vitalik Buterin</li><li><a href="http://blog.eladgil.com/2017/07/cryptocurrencys-netscape-moment.html">Cryptocurrency’s Netscape Moment</a> — by Elad Gil</li><li><a href="https://medium.com/@alokvasudev/permissionless-c66610ab2c38">Permissionless</a> — by Alok Vasudev</li><li><a href="https://thecontrol.co/the-slow-death-of-the-firm-1bd6cc81286b">The Slow Death of the Firm</a> — by Nick Tomaino</li><li><a href="http://blog.eladgil.com/2017/08/big-banks-and-blockchain.html">Big Banks and Blockchain</a> — by Elad Gil</li></ul><h2 id="heading-7">2018</h2><ul><li><a href="https://cdixon.org/2018/02/18/why-decentralization-matters">Why Decentralization Matters</a> — by Chris Dixon</li><li><a href="https://balajis.com/and-what-has-the-blockchain-ever-done-for-us/">And What Has the Blockchain Ever Done for Us?</a> — by Balaji Srinivasan</li><li><a href="https://medium.com/hackernoon/stablecoins-designing-a-price-stable-cryptocurrency-6bf24e2689e5">Stablecoins: Designing a Price-Stable Cryptocurrency</a> — by Haseeb Qureshi</li></ul><h2 id="heading-8">2019</h2><ul><li><a href="https://balajis.com/yes-you-may-need-a-blockchain/">Yes, You May Need a Blockchain</a> — by Balaji Srinivasan</li><li><a href="https://lindajxie.com/2019/08/07/the-future-of-decentralized-finance/">The Future of Decentralized Finance</a> — by Linda Xie</li><li><a href="https://www.youtube.com/watch?v=Dur918GqDIw">The Pseudonymous Economy</a> — by Balaji Srinivasan</li></ul><h2 id="heading-9">2020</h2><ul><li><a href="https://nakamoto.com/credible-neutrality/">Credible Neutrality as a Guiding Principle</a> — by Vitalik Buterin</li><li><a href="https://blog.coinbase.com/a-beginners-guide-to-decentralized-finance-defi-574c68ff43c4">A Beginner’s Guide to Decentralized Finance (DeFi)</a> — by Sid Coelho-Prabhu</li><li><a href="https://variant.fund/writing/the-ownership-economy-crypto-and-consumer-software">The Ownership Economy</a> — by Jesse Walden</li><li><a href="https://www.matthuang.com/bitcoin_for_the_open_minded_skeptic">Bitcoin for the Open Minded Skeptic</a> — by Matt Huang</li><li><a href="https://www.paradigm.xyz/2020/06/creators-communities-and-crypto">Creators, Communities, and Crypto</a> — by Fred Ehrsam</li><li><a href="https://medium.com/dragonfly-research/what-explains-the-rise-of-amms-7d008af1c399">What Explains the Rise of AMMs?</a> — by Haseeb Qureshi</li><li><a href="https://www.paradigm.xyz/2020/08/ethereum-is-a-dark-forest">Ethereum Is a Dark Forest</a> — by Dan Robinson and Georgios Konstantopoulos</li></ul><h2 id="heading-10">2021</h2><ul><li><a href="https://www.paradigm.xyz/2021/03/surviving-crypto-cycles">Surviving Crypto Cycles</a> — by Fred Ehrsam</li><li><a href="https://www.notboring.co/p/the-value-chain-of-the-open-metaverse">The Value Chain of the Open Metaverse</a> — by Packy McCormick</li><li><a href="https://research.paradigm.xyz/MEV">MEV and Me</a> — by Charlie Noyes</li><li><a href="https://variant.mirror.xyz/T8kdtZRIgy_srXB5B06L8vBqFHYlEBcv6ae2zR6Y_eo">NFTs Make the Internet Ownable</a> — by Jesse Walden</li><li><a href="https://cdixon.org/2021/02/27/NFTs-and-a-thousand-true-fans">NFTs and a Thousand True Fans</a> — by Chris Dixon</li><li><a href="https://linda.mirror.xyz/Vh8K4leCGEO06_qSGx-vS5lvgUqhqkCz9ut81WwCP2o">A Beginner’s Guide to DAOs</a> — by Linda Xie</li><li><a href="https://vitalik.eth.limo/general/2021/03/23/legitimacy.html">The Most Important Scarce Resource Is Legitimacy</a> — by Vitalik Buterin</li><li><a href="https://www.notboring.co/p/the-great-online-game">The Great Online Game</a> — by Packy McCormick</li><li><a href="https://balajis.com/p/add-crypto-to-indiastack">India and Crypto</a> — by Balaji Srinivasan</li><li><a href="https://www.notboring.co/p/own-the-internet">Own the Internet</a> — by Packy McCormick</li><li><a href="https://twitter.com/cdixon/status/1442201621266534402">Why Web3 Matters</a> — by Chris Dixon</li><li><a href="https://future.a16z.com/how-composability-unlocks-crypto-and-everything-else/">Composability Is Innovation</a> — by Linda Xie</li><li><a href="https://gubsheep.substack.com/p/the-strongest-crypto-gaming-thesis">The Strongest Crypto Gaming Thesis</a> — by gubsheep</li><li><a href="https://vitalik.eth.limo/general/2021/12/06/endgame.html">Endgame</a> — by Vitalik Buterin</li><li><a href="https://cobie.substack.com/p/trading-the-metagame">Trading the Metagame</a> — by Cobie</li><li><a href="https://balajis.com/mirrortable/">The Mirrortable</a> — by Balaji Srinivasan</li><li><a href="https://imzl.com/bitcoin-principle">Bitcoin Explained in Plain Language: How It Works</a> — by Zhang Yang</li></ul><h2 id="heading-11">2022</h2><ul><li><a href="https://www.1confirmation.com/2021-nft-annual-review">2021 NFT Annual Review</a> — by 1confirmation</li><li><a href="https://vitalik.eth.limo/general/2022/01/26/soulbound.html">Soulbound</a> — by Vitalik Buterin</li><li><a href="https://jacob.energy/hyperstructures.html">Hyperstructures</a> — by Jacob Horne</li><li><a href="https://www.varunsrinivasan.com/2022/01/11/sufficient-decentralization-for-social-networks">Sufficient Decentralization for Social Networks</a> — by Varun Srinivasan</li></ul><h2 id="heading-12">2023</h2><ul><li><a href="https://quail.ink/yishi/p/shi-bi-cheng-hou">Ten Coins to Rule Them All</a> — by Wang Yishi</li></ul>]]>
      </content:encoded>
    </item>
    <item>
      <title>Atomicals Mining Deployment and Wallet Management</title>
      <link>https://zhoulianglen.com/en/atomicals-mining</link>
      <description>A beginner-friendly tutorial on deploying the Atomicals mining program and managing wallets, helping you acquire Atomicals BTC inscription assets from scratch.</description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/crypto/">Crypto</category>
      <category domain="https://zhoulianglen.com/en/tag/atomicals/">Atomicals</category>
      <category domain="https://zhoulianglen.com/en/tag/mining/">Mining</category>
      <pubDate>Tue, 26 Dec 2023 17:13:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h2 id="heading-1">Deployment</h2><ol><li>Install <a href="https://nodejs.org/en">Node.js</a></li><li><code>git clone https://github.com/atomicals/atomicals-js.git</code></li><li><code>cd atomicals-JavaScript</code></li><li><code>npm install -g typescript</code></li><li><code>npm run build</code></li><li><code>npm install -g yarn</code></li><li><code>yarn install</code></li><li><code>yarn cli wallet-init</code> // This is the command to create a wallet</li></ol><p>The last step creates a wallet. After running the command, a <code>wallet.json</code> file will be generated in the folder, containing your mnemonic phrase and private key. Make sure to back up this file securely.</p><p>Once the wallet is created, two addresses are automatically generated: Primary Address and Funding Address.</p><p><strong>Primary</strong>: Used to receive Atomicals ecosystem assets.<br><strong>Funding</strong>: A transit wallet used during the minting (mining) process. Typically, you deposit the required amount of BTC into the Funding address for minting the corresponding assets.</p><h2 id="heading-2">Common Commands</h2><h3 id="heading-3">Minting FT Command:</h3><p><code>yarn cli mint-dft dmint --satsbyte 30</code></p><p><code>yarn cli mint-dft quark --satsbyte=100</code></p><p><code>dmint</code> and <code>quark</code> are token names — replace them with the corresponding FT asset name.<br><code>satsbyte</code> sets the miner fee. Setting it to 100 means minting at a rate of 100 sats/KB.</p><h3 id="heading-4">Minting Image NFT Command:</h3><p><code>yarn cli mint-nft &quot;\punk0000.png&quot; --satsbyte 30 --satsoutput 1000 --bitworkc 233</code></p><h3 id="heading-5">Checking Balance:</h3><p><code>npm run cli balances</code></p>]]>
      </content:encoded>
    </item>
    <item>
      <title>Starknet Early Community Member Program Application Guide</title>
      <link>https://zhoulianglen.com/en/starknet-ecmp</link>
      <description>A guide to the Starknet Early Community Member Program (ECMP), helping every member of the Starknet community quickly understand the program and how to apply.</description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/crypto/">Crypto</category>
      <category domain="https://zhoulianglen.com/en/tag/starknet/">Starknet</category>
      <category domain="https://zhoulianglen.com/en/tag/communal/">Community</category>
      <pubDate>Wed, 01 Nov 2023 13:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>Starknet, a rapidly rising name in the ETH L2 space, is now offering unprecedented opportunities to its community members through its newly launched Early Community Member Program (ECMP). This program is not just about technical contributions — it’s about recognizing every individual who has helped advance the Starknet ecosystem.</p><p>As a staunch Starknet supporter, I believe this is a unique opportunity for community members — whether developers, content creators, event organizers, or active participants in technical discussions — to be recognized and rewarded.</p><h2 id="heading-1">Application Process and Timeline</h2><p>Applications open on October 30, 2023 and close on November 23. The review committee will make its decisions by December 29. Interested individuals and projects should submit their applications within this period.</p><h2 id="heading-2">Who Can Apply?</h2><p>The ECMP is open to individuals who have actively contributed to the Starknet ecosystem. Whether through technical discussions, organizing events, publishing branded content, or any other means of adding vitality and resources to the ecosystem — all such individuals should consider applying.</p><h2 id="heading-3">Evaluation Criteria</h2><p>The evaluation criteria include impact, significance, effort, and originality. This means it’s not just about lines of code — it also encompasses your impact on the community, the importance of your work to the project, the effort you’ve put in, and the originality of your contributions.</p><h2 id="heading-4">Application Process</h2><p>Both projects and individuals need to submit applications through the provided link, including their Telegram ID, email address, and Starknet wallet address. Each project and individual will be evaluated by the committee.</p><p>Application link: <a href="https://ecmp.starknet.io/form-individual">https://ecmp.starknet.io/form-individual</a></p><p>Starknet official announcement: <a href="https://community.starknet.io/t/announcing-the-early-community-member-program/102092">https://community.starknet.io/t/announcing-the-early-community-member-program/102092</a></p><h2 id="heading-5">Important Notes</h2><p>It is important to note that sanctioned individuals, residents of sanctioned countries, and US-affiliated persons are not eligible to participate.</p><p>This program marks a significant step in the growth and development of the Starknet community. It not only rewards the unsung heroes but also encourages more people to join and contribute to the ecosystem. If you are a dedicated Starknet supporter, don’t miss this opportunity.</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>How to Bypass the Annoying hCaptcha Verification</title>
      <link>https://zhoulianglen.com/en/disabling-hcaptcha</link>
      <description>Learn how to bypass hCaptcha — simplify the human verification process and avoid frequent, pointless image challenges. Read on to easily bypass hCaptcha verification.</description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/experimentation/">Experimentation</category>
      <category domain="https://zhoulianglen.com/en/tag/skill/">Tips</category>
      <category domain="https://zhoulianglen.com/en/tag/hcaptcha/">hcaptcha</category>
      <category domain="https://zhoulianglen.com/en/tag/captcha/">CAPTCHA</category>
      <pubDate>Tue, 16 May 2023 20:15:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h2 id="heading-1">What Is hCaptcha?</h2><p>hCaptcha is a human verification service similar to Google reCAPTCHA. It is designed to identify and distinguish human users from bots, and to help prevent common web automation attacks such as DoS, malicious bot attacks, and excessive web scraping.</p><p>From my own experience, I’m not sure how effective hCaptcha is at blocking bots, but it certainly causes a great deal of inconvenience for actual humans. So let’s figure out a way to bypass hCaptcha and its frequent, pointless image verification challenges:</p><h2 id="heading-2">Bypass hCaptcha via the Accessibility Service</h2><ol><li><p>Sign up for the accessibility service through <a href="https://dashboard.hcaptcha.com/signup?type=accessibility">this link</a>. Please use a valid, active email address.</p></li><li><p>Check your inbox and click the “Get Accessibility Cookie” button in the email. The link should look something like this:<br><code>https://accounts.hcaptcha.com/verify_email/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</code></p></li><li><p>Obtain the hCaptcha Cookie via the link</p></li></ol><ul><li>Clicking the button will redirect you to the hCaptcha settings page.</li><li>Click the “Set Cookie” button, and wait until the text “Cookie set.” appears below the button — then you’re done.</li></ul><p>The next time you encounter an hCaptcha challenge, you only need to click the verification checkbox — no more annoying image puzzles.</p><p>[Note] hCaptcha has actually documented their accessibility service as well. <a href="https://www.hcaptcha.com/accessibility">See the details here</a>.</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>Bitcoin Explained in Plain Language</title>
      <link>https://zhoulianglen.com/en/bitcoin-principle</link>
      <description>
        <![CDATA[<p>While organizing my Crypto materials recently, I came across this article by Zhang Yang. It’s possibly the best plain-language explanatio]]>
      </description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/crypto/">Crypto</category>
      <category domain="https://zhoulianglen.com/en/tag/bitcoin/">Bitcoin</category>
      <category domain="https://zhoulianglen.com/en/tag/finance/">Finance</category>
      <category domain="https://zhoulianglen.com/en/tag/currency/">Currency</category>
      <category domain="https://zhoulianglen.com/en/tag/reprint/">Reprint</category>
      <pubDate>Thu, 25 Nov 2021 00:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>While organizing my Crypto materials recently, I came across this article by Zhang Yang. It’s possibly the best plain-language explanation of Bitcoin’s principles and mechanisms ever written, so I’m reposting it here to share.</p><p>This article is intended as a popular science piece. It uses analogies to explain Bitcoin’s fundamental principles without delving into the granular details of algorithms and protocols.</p><p>The article presents a fictional village called “Bitcoin Village” and tells a story, step by step, explaining Bitcoin’s motivation, the problems it solves, and the objectives and design of its key components.</p><h2 id="heading-1">Bitcoin Village and the Barter System</h2><p>Once upon a time, there was a small village called Bitcoin Village, home to a few hundred households. The village was virtually isolated from the outside world, living a self-sufficient existence. Without large-scale trade, the villagers had always relied on barter — Old Zhang would trade a sack of flour for one of Old Li’s sheep, and Mrs. Wang would swap a basket of wild fruit for two feet of Mrs. Liu’s cloth. The villagers had been living this simple life all along.</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783546-bitcoin-mechanism-01.png" alt="" decoding="async"></p><h2 id="heading-2">Commodity Money</h2><p>One day, the villagers decided that barter was just too inconvenient, so the entire village gathered for a meeting to discuss how to solve this problem. Someone proposed using something easily divisible and rare — gold, for example — as a medium of exchange. They would create a conversion table mapping goods to gold: one gram of gold equals one sheep, one gram of gold equals one sack of flour, and so on. Now Old Zhang no longer had to lug a heavy sack of flour all the way to Old Li’s house to trade for a sheep. He could simply pull out a gram of gold, head to Old Li’s, and lead a sheep home. Old Li could then use that gram of gold to buy a sack of flour from anyone willing to sell, or trade it for anything else of equivalent value.</p><p>Thus Bitcoin Village entered the era of commodity money.</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783620-bitcoin-mechanism-02.png" alt="" loading="lazy" decoding="async"></p><h2 id="heading-3">Symbolic Money</h2><p>But it didn’t last. Before long, the drawbacks of commodity money became apparent. Gold mines near Bitcoin Village were scarce, and mining and smelting gold was extremely time-consuming and labor-intensive. Meanwhile, gold was constantly being lost to wear, misplacement, or deliberate hoarding. The villagers gathered once again to brainstorm a solution. Someone said, “We don’t actually need to use real gold. Just take any piece of paper, write ‘one gram of gold’ on it, and as long as everyone in the village agrees that this piece of paper equals one gram of gold, problem solved.” Everyone nodded in agreement, but a new issue immediately arose: real gold requires mining and smelting, mines are limited, and the process costs time and resources — no one can conjure vast quantities of gold out of thin air. But writing on paper? As long as you have enough paper and ink, you can write as much as you want. It would devolve into a contest of who has more paper at home — before you know it, ten thousand sheets might buy you just one sheep (this is, in fact, what economics calls inflation).</p><p>Good point, everyone thought. But then someone proposed a solution: these notes would only be valid if written by the village elder — a man of great respect whose handwriting everyone recognized. The elder would write out a number of notes and distribute them to each household based on their gold reserves. For example, if Old Zhang had two hundred grams of gold, the elder would issue him two hundred notes, each reading “one gram of gold,” and take Old Zhang’s gold as collateral. In this way, the elder collected all the village’s gold and issued equivalent paper notes. The villagers could now use these notes as currency, and since everyone recognized the elder’s handwriting, no one else could forge them. If anyone’s notes became too worn, they could exchange them for fresh ones at the elder’s house. Furthermore, the elder promised that anyone wishing to convert back to real gold need only return the notes and receive the equivalent amount. Since the gold amount recorded on the notes matched the actual gold stored at the elder’s house, as long as the strict principle of “destroy old notes, issue new ones” was followed, every valid note could always be redeemed for its corresponding amount of real gold.</p><p>Thus Bitcoin Village entered the era of symbolic money (paper currency). The village elder assumed the roles of both government and bank.</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783682-bitcoin-mechanism-03.png" alt="" loading="lazy" decoding="async"></p><h2 id="heading-4">Centralized Virtual Currency</h2><p>A few more years passed. The village elder, exhausted from the daily grind of verifying old notes, writing new ones, and meticulously maintaining all the records, eventually worked himself to death.</p><p>Bitcoin Village convened another general assembly to discuss what to do. The elder’s son, Ergouzi (literally “Second Doggy”), volunteered to take up his father’s pen and shoulder the responsibility of currency issuance. This young village leader was clever. After a few days of work, he realized he didn’t actually need to write all those paper notes. He could simply do this: have the villagers turn in all their paper notes, destroy them, and instead record each household’s balance in a ledger. From then on, if someone wanted to make a payment — say Old Zhang wanted to pay Old Li one gram of gold for a sheep — the two would simply call Ergouzi, explain the transaction, and Ergouzi would open his ledger, verify that Old Zhang had at least one gram of gold on record, subtract one gram from Old Zhang’s account, and add one gram to Old Li’s. Transaction complete. Upon hearing Ergouzi’s confirmation over the phone, Old Li could confidently let Old Zhang take the sheep.</p><p>Thus Bitcoin Village entered the era of centralized virtual currency. No villager needed to make physical payments anymore; the payment process became nothing more than number changes in the ledger maintained by Ergouzi.</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783714-bitcoin-mechanism-04.png" alt="" loading="lazy" decoding="async"></p><h2 id="heading-5">Distributed Virtual Currency</h2><p>Ergouzi was clever, but sometimes too clever for his own good. One day, staring at the ledger, he thought: “The entire village’s wealth is whatever I say it is — couldn’t I just…” On impulse, he secretly transferred ten grams of gold from Old Zhang’s account to his own.</p><p>He thought it was the perfect crime, but Old Zhang happened to keep his own records. One day, when Old Zhang tried to make a payment, Ergouzi told him his account was empty. Old Zhang checked his own books — he clearly still had ten grams — and went to confront Ergouzi. The discrepancy revealed the unauthorized transfer.</p><p>The scandal broke wide open. Ergouzi’s impeachment was inevitable, but the incident also exposed a fundamental flaw in having the ledger concentrated in one person’s hands:</p><ul><li>The entire system depends on the personal integrity of the ledger keeper. If this person breaks the rules and arbitrarily alters the ledger, the entire monetary system collapses.</li><li>If this person’s house catches fire or the ledger is stolen, it would be equally devastating to the entire system.</li></ul><p>Just as everyone was at a loss, a reclusive scientist in the village named Satoshi Nakamoto took the stage. He told everyone he had designed a virtual currency system called Bitcoin that didn’t rely on any central authority, and it could solve all the problems above. Then he calmly laid out his plan.</p><p>Let’s see how Satoshi designed this system.</p><h2 id="heading-6">Infrastructure Setup</h2><p>Satoshi first announced that the existing ledger system would need the following modifications:</p><ol><li>The ledger would no longer record each villager’s balance. Instead, it would only record individual transactions — specifically, the payer, payee, and amount of each transaction. As long as the ledger’s initial state is established and every transaction record is reliable and time-ordered, each person’s current balance can be calculated.</li><li>The ledger would change from private to public. Any villager who wanted it could obtain the complete current ledger, containing every transaction record from the ledger’s creation to the present.</li></ol><p>The moment he said this, the crowd erupted. The first point was fine, but the second was nearly unacceptable — the ledger records every villager’s transactions, wouldn’t this expose everyone’s privacy?</p><p>Satoshi remained calm and produced a pair of peculiar objects.</p><h2 id="heading-7">Identity and Signature Mechanism (Public Key Cryptography)</h2><p>Satoshi told everyone not to panic. Under his system, no one would transact using their real identity. Instead, each person would use a unique pseudonym.</p><p>He showed the two items in his hands, calling them the “secret stamp” and the “stamp scanner.” He would give every household one of each. Their functions:</p><ul><li>The secret stamp can imprint a mark on paper. Each stamp’s imprint contains a string of characters unique to the entire village, but invisible to the naked eye. Nor can the stamp be reverse-engineered by examining its imprint.</li><li>The stamp scanner can scan a stamped mark, read the hidden information, and display a string of characters on its LCD screen.</li></ul><p>With these two ingenious devices, villagers could transact without revealing their true identities, and the hidden character string would serve as each household’s pseudonym. The precise mechanism for using stamps and scanners in transactions is detailed below.</p><h3 id="heading-8">Establishing a Virtual Mining Organization (Mining Groups)</h3><p>Next, Satoshi recruited virtual miners from across the village. The requirements:</p><ul><li>Miners work in groups; a group can be a single household or several households combined.</li><li>Being a miner doesn’t affect normal currency usage.</li><li>Miners must dedicate some time each day to Bitcoin “mining” activities, but unlike gold mining, virtual miners don’t need to go into the field with tools — they can work from home.</li><li>Miners have a certain probability of earning a reward; the more effort put into mining, the higher the probability.</li><li>Miners can quit at any time, and new miners can join at any time.</li></ul><p>Before long, about one-fifth of the villagers joined the mining organization, forming seven groups.</p><h2 id="heading-9">Creating the Initial Ledger (Genesis Block)</h2><p>Next, Satoshi announced that based on Ergouzi’s ledger, all collateralized gold would be returned to each villager according to the recorded balances. Ergouzi’s ledger would then be permanently destroyed.</p><p>Satoshi then produced a new ledger. On the first page, he recorded several transactions. Notably, the “payer” column for all these entries read “System,” while the payees were the hidden character strings corresponding to each household’s stamp — representing the system’s initial allocation of a small number of bitcoins to each household. The amounts were very small, just a few coins each, and some unlucky households didn’t receive any at all.</p><p>Satoshi then said: since there are very few bitcoins in circulation right now, everyone can go back to using gold as currency for the time being. Since I’m not the village leader, I have no authority to force anyone to accept Bitcoin — everyone can decide for themselves. But as bitcoins flow through transactions and mining activity continues, the supply will gradually increase.</p><h2 id="heading-10">Payment and Transactions</h2><p>After all this groundwork, we finally arrive at the main event: how payments work in this system. Let’s use Old Zhang paying Old Li 10 bitcoins as an example.</p><h3 id="heading-11">The Payer Signs the Transaction Slip</h3><p>To pay 10 bitcoins, Old Zhang first asks Old Li for his identifier string — say “ABCDEFG.” Old Zhang’s own identifier is, say, “HIJKLMN.” Old Zhang writes a slip reading “HIJKLMN pays 10 bitcoins to ABCDEFG,” stamps it with his secret stamp, and hands the slip to Old Li. Additionally, to facilitate tracing the origin of these funds, the slip must note where this money came from and which ledger page recorded the source transaction. In this case, Old Zhang’s 10 bitcoins came from the system’s initial allocation, recorded on the ledger’s first page.</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783753-bitcoin-mechanism-05.png" alt="" loading="lazy" decoding="async"></p><h3 id="heading-12">The Payee Verifies the Signer</h3><p>Upon receiving the slip, Old Li needs to confirm it was indeed signed by “HIJKLMN” (i.e., Old Zhang). This isn’t difficult. The slip must bear a secret stamp. Old Li takes out his stamp scanner, scans the stamp, and if the characters displayed on the LCD match the payer’s identifier (in this case, “HIJKLMN”), the signature is confirmed. Thanks to the secret stamp mechanism, no one else can forge a stamp, and anyone can verify whether the signer matches the stated payer simply by scanning.</p><h3 id="heading-13">The Payee Confirms the Payer’s Balance</h3><p>So far, the system still has a problem. Through the secret stamp, the payee can confirm the payer indeed signed the slip, but cannot independently verify whether the payer has sufficient funds. In the previous centralized system, Ergouzi was responsible for checking balances and notifying payees whether transactions were valid. Now that Ergouzi’s been fired, who handles accounting and transaction validation?</p><p>As mentioned earlier, Satoshi designed this as a distributed currency system that doesn’t rely on any central figure. The entity that ultimately bears this responsibility is the mining organization mentioned previously. Old Zhang, Old Li, and every other villager using Bitcoin for transactions all depend on the miners’ work to complete their transactions.</p><h2 id="heading-14">The Miners’ Work</h2><p>The miners’ work is the core of the entire system and also its most complex part. Let’s walk through their tasks and objectives step by step.</p><h3 id="heading-15">Mining Tools</h3><p>As the saying goes, “A craftsman must first sharpen his tools.” While Bitcoin miners don’t need pickaxes, shovels, or headlamps, they do need some essential equipment.</p><p><strong>Initial ledger.</strong> Each group first makes their own copy of the initial ledger, which has only one page recording the system’s first allocation.</p><p><strong>Blank ledger pages.</strong> Each group has a supply of blank ledger pages. Each page contains only the ledger structure with no content filled in — the rules for writing content are described below. Here’s what a blank ledger page looks like; the meaning of each field will be explained later.</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783804-bitcoin-mechanism-06.png" alt="" loading="lazy" decoding="async"></p><p><strong>Code generator (hash function).</strong> Satoshi also distributed several code generators to each mining group. This device is remarkable: insert a completed ledger page and the machine automatically prints a 256-character string of &quot;0&quot;s and &quot;1&quot;s in the “This Page’s ID” field. The truly magical properties of the code generator are:</p><ul><li>The generated ID depends solely on the content written on the ledger page — it’s independent of who wrote it, the handwriting style, the time of writing, and other factors.</li><li>Ledger pages with identical content always produce the same ID, but changing even a single character produces a completely different ID.</li><li>When printing an ID, the code generator also requires all transaction slips referenced on the page to be inserted. The machine scans for consistency between the transaction slips and the written entries, especially the secret stamps. If any stamp doesn’t match its stated payer, the machine refuses to print.</li><li>When a pre-printed ledger page is inserted, the machine verifies whether the ID was genuinely machine-printed and whether the ID matches the content. The ID cannot be forged.</li><li><strong>Transaction slip mailbox.</strong> Each mining group must hang a collection box at their door for receiving transaction slips.</li><li><strong>Bulletin board.</strong> Each mining group also needs a bulletin board for posting public notices.</li></ul><p>With these tools in hand, the mining organization can get to work.</p><h3 id="heading-16">Collecting Transaction Slips</h3><p>Satoshi established that anyone initiating a transaction must not only give the transaction slip to the payee but also make several copies and deliver them to every mining group’s mailbox.</p><p>Mining groups periodically collect all accumulated transaction slips from their mailboxes.</p><h3 id="heading-17">Filling Out the Ledger</h3><p>The group then takes a blank ledger page, writes these transactions into the “Transaction List” section, finds the last page of their current ledger, and copies that page’s ID into the “Previous Page ID” field. Note there’s also a “Lucky Number” field — they can fill in any number they like, such as 12345. Then they insert the page into the code generator, which prints an ID. One ledger page is now complete.</p><p>If you thought the miners’ job was that simple, you’d be sorely mistaken. Satoshi imposed a fiendish rule: <strong>a ledger page is only valid if the first 10 digits of its ID are all zeros.</strong></p><p>Based on what we know about the code generator, the only way to change the ID is to change the page’s content. The “Transaction List” and “Previous Page ID” can’t be arbitrarily modified, so the only option is to change the Lucky Number. Thus, to produce a valid ledger page, miners must repeatedly copy out ledger pages with different Lucky Numbers, inserting each one into the code generator. If the resulting ID doesn’t meet the requirement, that page is wasted. They repeat this process until a valid ID is generated.</p><p>We know that if each digit of the ID is random, miners must try, on average, over 1,000 different Lucky Numbers to get one valid ID.</p><p>So why would miners relentlessly grind away at this seemingly meaningless task? Remember the rewards mentioned earlier — that’s their motivation. Satoshi decreed: <strong>the first transaction on every ledger page is “The system pays this group 50 bitcoins.”</strong> In other words, if you generate a valid ledger page and it’s accepted by all mining groups, this transaction is also accepted, and your mining group earns 50 bitcoins.</p><p>This is why miners are called miners, and why, as mentioned earlier, the supply of bitcoins gradually increases through transactions and mining activity. Below is an example of the mining process, where the group’s public Bitcoin address is “UVWXYZ.”</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783852-bitcoin-mechanism-07.png" alt="" loading="lazy" decoding="async"></p><p>When the Lucky Number reached “533,” the system generated a valid ledger page.</p><h3 id="heading-18">Confirming the Ledger</h3><p>When a mining group is lucky enough to produce a valid ledger page, they must immediately notify the other groups to get their work confirmed and earn their reward. As mentioned, there are currently seven mining groups in the village, so the lucky group must transcribe six copies and rush them to the other six groups for confirmation.</p><p>Satoshi decreed that when any group receives a ledger page from another group, they must immediately pause their own mining work and perform verification.</p><p>Three things need to be confirmed:</p><ol><li>The page’s ID is valid.</li><li>The previous page referenced is valid.</li><li>The transaction list is valid.</li></ol><p>For the first check — this is straightforward. Simply insert the received page into the code generator for verification. If it passes, the ID is valid.</p><p>For the second check — compare the “Previous Page ID” on the received page against the last page ID in this group’s own ledger. If they match, it’s confirmed. If not, trace backward through the existing ledger to find the matching page. If no matching “Previous Page ID” can be found at all, the group discards the received page and refuses confirmation.</p><p>Note that this mechanism ensures that if all groups hold the same set of ledger pages, they can all assemble them in the same order. Since each page’s ID depends on the previous page’s ID, the code generator’s mechanism guarantees that the relative ordering of all valid ledger pages is consistent across every group (there may be branches, but no loops — more on this later).</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783887-bitcoin-mechanism-08.png" alt="" loading="lazy" decoding="async"></p><p>Finally, confirming the transaction list’s validity means verifying that each payer in every transaction has sufficient balance. Since each transaction includes information about where the funds came from, along with the ID of the ledger page recording the source transaction — for example, HIJKLMN wants to pay ABCDEFG 10 bitcoins and notes that these 10 bitcoins came from a previous payment from OPQRST to HIJKLMN — the verification process first confirms whether this earlier transaction exists, and then checks whether HIJKLMN hasn’t already spent those 10 bitcoins elsewhere. Once all this is confirmed, the transaction’s validity is established.</p><p>The first transaction is the 50-bitcoin system reward to the group that produced the page — everyone accepts this by default. For the remaining transactions, the tracing method above can confirm whether HIJKLMN truly has 10 bitcoins to pay ABCDEFG.</p><p>If all the above verifications pass, the group accepts the ledger page as valid, appends it to their main ledger, abandons their current work-in-progress, and continues future mining based on this updated main ledger.</p><h3 id="heading-19">Ledger Confirmation Feedback</h3><p>For the mining group that sent out the page: if they subsequently receive a page from another group whose “Previous Page ID” is the ID of the page they sent out, that means their work has been accepted — because another group is already building on top of it. At this point, they can roughly consider their 50 bitcoins earned.</p><p>Additionally, whenever a group generates a new valid page or confirms another group’s page, they post the latest accepted transactions on their bulletin board. Payees who see their transaction acknowledged by the various groups can be fairly confident the money has arrived in their account, and they can reference this transaction as the source of funds in future payments.</p><p>This is the complete Bitcoin payment system. Let’s now analyze why this system can sustain itself and what risks it may face.</p><h2 id="heading-20">Analysis of the Operating Mechanism</h2><p>Although the basic rules of Bitcoin have been explained, the villagers still had many questions. So Satoshi held a special Q&amp;A session to address common concerns. Below is a summary of the most frequently raised issues.</p><h2 id="heading-21">Core Q&amp;A</h2><h3 id="heading-22">What if two valid ledger pages are received simultaneously?</h3><p>Note that in the mechanism described above, mining groups work in parallel. It’s entirely possible that a group receives two different ledger pages, both based on the current last page of the group’s main ledger, and both perfectly valid. What then?</p><p>Satoshi explained that groups should not organize the ledger linearly but rather as a tree structure. At any given time, the longest branch serves as the main ledger, while other branches are preserved. For example, if a group simultaneously receives valid pages A and B, they should organize them as a fork, like this:</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783962-bitcoin-mechanism-09.png" alt="" loading="lazy" decoding="async"></p><p>The black line represents the current main chain. At this point, either page can be chosen as the main branch — let’s say A:</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783996-bitcoin-mechanism-10.png" alt="" loading="lazy" decoding="async"></p><p>If a new page is produced based on A, the main chain extends:</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637784030-bitcoin-mechanism-11.png" alt="" loading="lazy" decoding="async"></p><p>If this trend continues, it means everyone is essentially working off A as the main chain, and B will be forgotten. But it’s also possible that B suddenly becomes the longer branch:</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637784087-bitcoin-mechanism-12.png" alt="" loading="lazy" decoding="async"></p><p>In that case, we need to switch to B as the main chain and continue working from there.</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637784118-bitcoin-mechanism-13.png" alt="" loading="lazy" decoding="async"></p><p>Looking at the big picture, although different groups’ main chains may temporarily diverge at any given moment, the overall direction remains consistent. Those minor branches that occasionally sprout due to timing differences are quickly buried in history.</p><h3 id="heading-23">What if miners forge the ledger?</h3><p>Satoshi explained that as long as the majority of the mining organization is honest, the system remains reliable. He addressed this from several angles.</p><p>First, thanks to the secret stamp mechanism, no one can forge someone else’s identity for payments, because the code generator checks all transaction slips’ stamps during ID generation and refuses to print if any stamp doesn’t match its stated payer.</p><p>Furthermore, honest miners will never approve illegitimate transactions (such as one where the payer has insufficient balance).</p><p>Therefore, the only possible attack vector is this: after the payee has confirmed receipt, the attacker creates an alternative transaction on a different branch, cancels the previous payment, and spends the same funds again to someone else (the so-called “double-spending” problem). Let’s illustrate with an example.</p><p>Suppose an attacker has 10 bitcoins and plans to pay this same amount to two victims, A and B, getting both transactions accepted.</p><p>Step one: The attacker plans to buy 10 bitcoins’ worth of gold from Victim A. He signs a transaction slip transferring 10 bitcoins to Victim A.</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637784169-bitcoin-mechanism-14.png" alt="" loading="lazy" decoding="async"></p><p>Step two: This transaction gets confirmed in the latest ledger page and is posted by the mining groups. Victim A sees the announcement, confirms the bitcoins have arrived, and gives the attacker gold worth 10 bitcoins.</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637784229-bitcoin-mechanism-15.png" alt="" loading="lazy" decoding="async"></p><p>Step three: The attacker goes back to the ledger page just before the one containing the transaction with Victim A and creates a new branch, generating enough pages to overtake the original branch. Since the attacker’s branch is now the main chain, the branch containing Victim A’s payment becomes a side branch. The mining organization no longer recognizes the earlier transfer, and Victim A’s 10 bitcoins are reversed.</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637784270-bitcoin-mechanism-16.png" alt="" loading="lazy" decoding="async"></p><p>Step four: The attacker can now sign another transaction slip, paying the same 10 bitcoins to Victim B. Once Victim B confirms receipt, they hand over gold of equivalent value.<br><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637784303-bitcoin-mechanism-17.png" alt="" loading="lazy" decoding="async"></p><p>At this point, the attacker has spent the same 10 bitcoins twice, purchasing equivalent gold from two victims. The attacker could repeat this trick — cancel the transaction with Victim B, and pay the same funds to yet another person…</p><p>To counter this attack, Satoshi’s recommended solution is that payees should not immediately confirm a transaction when it first appears on the bulletin board. Instead, they should wait and watch for the mining groups to post six more confirmation pages after the one containing their transaction, and only confirm receipt if the original page hasn’t been rolled back.</p><p>Satoshi explained that the fiendish ID rules were specifically designed to defend against this. As described earlier, generating a valid ledger page is no trivial matter — it requires massive effort trying different Lucky Numbers, and the process is entirely a matter of luck. If a ledger page containing your incoming payment has six more pages built on top of it, it becomes extremely difficult for an attacker to overtake the current main chain from a branch that’s six pages behind — unless the attacker commands more manpower than all the honest miners combined.</p><p>Moreover, if an attacker had that much manpower, it would be far more profitable to simply mine honestly than to waste such enormous resources on this kind of attack. This eliminates the motivation for attacks at a fundamental level.</p><h3 id="heading-24">Won’t bitcoins keep increasing indefinitely, causing severe inflation?</h3><p>Satoshi said, “I’ve thought of this too. I forgot to mention earlier — the operating manual I gave to the mining organization specifies that initially, generating one ledger page earns a group 50 bitcoins. But every 210,000 pages, the reward halves. For example, after 210,000 pages, each new page earns 25 bitcoins; after 420,000 pages, 12.5 bitcoins; and so on. By the time the ledger reaches 6,930,000 pages, there will be no more rewards for generating new pages. At that point, the total supply of bitcoins will be approximately 21,000,000 — this is Bitcoin’s total supply cap, so it won’t increase indefinitely.”</p><h3 id="heading-25">With no rewards, no one will mine, and there’ll be no one to confirm transactions</h3><p>By then, miners’ income will shift from mining rewards to transaction fees. For instance, when making a transfer, you can designate 1% as a transaction fee paid to the group that generates the ledger page. Groups will prioritize confirming transactions with higher fees.</p><h3 id="heading-26">If the number of miners keeps growing, will bitcoins be generated faster?</h3><p>No. Satoshi explained that while anyone can freely join or leave the mining organization, causing the number of miners to fluctuate — and each miner does receive a code generator — he has already built a difficulty adjustment mechanism into the code generators. The more generators currently in operation, the lower each machine’s efficiency, ensuring the rate of new ledger page generation remains constant.</p><h3 id="heading-27">Although everyone uses pseudonyms, if someone’s pseudonym is leaked and the ledger is public, couldn’t all their transactions be traced?</h3><p>Indeed. For example, to transact with someone, you necessarily need their pseudonym to fill in the transaction slip’s payee field. However, Satoshi said he can provide an unlimited number of secret stamps, and he recommends using a different stamp for each transaction. This way, tracing the ledger won’t reveal all transactions belonging to a single person.</p><p>Q&amp;A complete.</p><h2 id="heading-28">Notes</h2><p>This article uses accessible analogies to explain Bitcoin’s operating mechanism. A few things to note:</p><p>For the sake of clarity, I’ve made many simplifications, so some mechanistic details may not perfectly match the actual Bitcoin protocol. However, the overall philosophy and key principles are consistent.<br>Since many concepts from the computer world (such as public key cryptography and network transmission) don’t have perfect real-world equivalents, some parts of the story may feel a bit forced or unrealistic.<br>This article describes the technical principles and operating mechanism of the Bitcoin network itself. When trading Bitcoin on exchanges like Mt. Gox, the exchange acts as an intermediary and does not follow the mechanism described above.</p><h2 id="heading-29">References</h2><ol><li><a href="https://bitcoin.org/bitcoin.pdf">Bitcoin Whitepaper (English)</a></li><li><a href="https://bitcoin.org/files/bitcoin-paper/bitcoin_zh_cn.pdf">Bitcoin Whitepaper (Chinese)</a></li><li><a href="https://bitcoin.it/">Bitcoin Wiki (English)</a></li><li><a href="https://blog.codingnow.com/2011/05/bitcoin.html">Cloud Wu’s Blog: “Basic Principles of Bitcoin”</a></li></ol><p>via. <a href="https://blog.codinglabs.org/articles/bitcoin-mechanism-make-easy.html">Original article</a></p>]]>
      </content:encoded>
    </item>
    <item>
      <title>What Is a Product Person?</title>
      <link>https://zhoulianglen.com/en/producter</link>
      <description>A reflection on what it means to be a product person: how product managers must balance business value and user value. Learn to look beyond surface-level design interactions and find the true competitive edge of a product.</description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/miscellanies/">Miscellanies</category>
      <category domain="https://zhoulianglen.com/en/categories/internet/">Internet</category>
      <category domain="https://zhoulianglen.com/en/categories/thinking/">Thinking</category>
      <category domain="https://zhoulianglen.com/en/tag/product-manager/">Product Manager</category>
      <pubDate>Mon, 06 Sep 2021 13:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>I’ve shared this on Twitter before, but I’m archiving it here on the blog as a reminder. This is something I’ve been practicing consistently.</p><p>A product person must first understand the balance between business value and user value — that is, what do we gain through the product, and what does the user gain? This is the innermost core of user experience. From there, you peel back the layers one by one. Unfortunately, most products on the market are fixated on the surface layer — the flashy, eye-catching design and interaction. I’ve always felt this is the lingering poison of the book “Everyone Is a Product Manager.”</p><p>A good product, beyond having a thorough grasp of the five layers of experience, must also have foresight. A big, comprehensive product is easy to copy, but at the cost of time — and your strategy, tactics, and resource allocation may not even be aligned. What’s truly impressive is your product sequencing: each move serves as the setup for the next. Simplicity doesn’t mean you haven’t thought things through — quite the opposite. See far, step close, think more, do less. Validate, then iterate fast.</p><p>And a truly outstanding product? It finds the critical mission within a red ocean and strikes with dimensional advantage.</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/09/1630932266-dedao-chanping.jpeg" alt="Product Person" decoding="async"></p>]]>
      </content:encoded>
    </item>
    <item>
      <title>The Three Great Pleasures of Independent Blogging: Themes, Domains, and CMS Platforms</title>
      <link>https://zhoulianglen.com/en/theme-domain-blogcms</link>
      <description>Since 2010, I've been blogging for over a decade, having changed domains five times, themes over a dozen times, and CMS platforms twice. Perhaps because of my design background, I was overly fixated on the presentation layer — chasing aesthetics and perfection. With plenty of free time as a student, I poured enormous effort into themes, plugins, and server maintenance. Others might see this as a waste of time, but for me back then: the thrill of tinkering to satisfy my own needs and ideas could only be described as 'euphoria.'</description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/miscellanies/">Miscellanies</category>
      <category domain="https://zhoulianglen.com/en/tag/blog/">Blog</category>
      <category domain="https://zhoulianglen.com/en/tag/miscellanies/">Miscellanies</category>
      <category domain="https://zhoulianglen.com/en/tag/domain/">Domain</category>
      <pubDate>Wed, 25 Aug 2021 12:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>I recently acquired <a href="https://imzl.com">imzl.com</a>, fulfilling my “dream” of owning a decent-looking .com domain. It now serves as my blog’s primary domain, marking the third domain change for Zhou Liang’s Blog since 2020.</p><p>Since 2010, I’ve been blogging for over a decade<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>, having changed domains five times, themes over a dozen times, and CMS platforms twice<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>. Perhaps because of my design background<sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup>, I was overly fixated on the presentation layer — chasing aesthetics and perfection. With plenty of free time as a student, I poured enormous effort into themes, plugins, and server maintenance. Others might see this as a waste of time, but for me back then: <strong>the thrill of tinkering to satisfy my own needs and ideas could only be described as “euphoria.”</strong></p><p>This is why I say: independent blogging has three great pleasures — themes, domains, and CMS platforms. <strong>But pleasure is for yourself; value is for your readers.</strong></p><p>The value of a blog lies in its content — good, useful content.</p><p><strong>Blog Theme</strong>: Clean is enough. It should present content clearly and be easy to read — a bit rough around the edges is perfectly fine. A search box so readers can find what they’re looking for, and a comment box so you can converse with them — that’s all you need.</p><p><strong>Domain</strong>: Ideally short and memorable at a glance, but it’s no big deal if it isn’t. Domains carry less and less weight these days. The principle should be: use what you have, as long as it works. Don’t be like me, constantly switching. I only do it because of a personal hang-up, but it’s really not necessary. If the content is good enough, I’ll bookmark even the most ungainly domain.</p><p><strong>CMS Platform</strong>: As long as it works — the simpler, the better, even. Don’t let the tool limit you, and don’t make the startup cost of writing too high. These days I just finish writing in my notes app and paste-publish with one click, completely ignoring all those bells and whistles in the backend. The unformatted, plain-text approach to writing is simply wonderful.</p><p>This might sound a bit “utilitarian,” but as long as you’re comfortable, anything goes.</p><p>What I’m really doing here is a reflection — one I should have written four years ago. I used to be overly obsessed with surface-level flash (and this goes beyond blogging). Being a designer, there was nothing wrong with that per se. It wasn’t until I transitioned to product management that I realized beneath the dazzling surface lies something invisible. User experience isn’t just about the framework and presentation layers — dig deeper and you’ll find structure, scope, and strategy. It’s not enough to just make features look good and feel smooth. The balance between business value and user value — that’s the true core of experience.</p><p>When it comes to writing and blogging, the quality of your domain or the beauty of your theme are by no means prerequisites for a good blog. Strive for quality, but don’t obsess over perfection. Put your energy into the content — that’s what truly matters.</p><hr class="footnotes-sep"><section class="footnotes"><ol class="footnotes-list"><li id="fn1" class="footnote-item"><p>Started in middle school around 2010; updated frequently during school years, sporadically over the past 4 years. <a href="#fnref1" class="footnote-backref">↩︎</a></p></li><li id="fn2" class="footnote-item"><p>Switched from a self-hosted WordPress site to Bitcron, then back to WordPress. <a href="#fnref2" class="footnote-backref">↩︎</a></p></li><li id="fn3" class="footnote-item"><p>Previously worked as a UI designer. <a href="#fnref3" class="footnote-backref">↩︎</a></p></li></ol></section>]]>
      </content:encoded>
    </item>
    <item>
      <title>Mahjong</title>
      <link>https://zhoulianglen.com/en/majiang</link>
      <description>
        <![CDATA[<p>Playing mahjong is a bit like building products: under imperfect information, make the “right” choices to improve your winning odds. Keep]]>
      </description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/thinking/">Thinking</category>
      <category domain="https://zhoulianglen.com/en/tag/thinking/">Thinking</category>
      <category domain="https://zhoulianglen.com/en/tag/product/">Product</category>
      <pubDate>Mon, 01 Mar 2021 04:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>Playing mahjong is a bit like building products: under imperfect information, make the “right” choices to improve your winning odds. Keep making the right choices, and eventually you win the hand. Of course, mahjong is a finite game; product-building is an infinite one.</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>Oct 15, 2020 Notes: The Definition of Wealthy, iOS Workday Smart Alarm, iPhone 12</title>
      <link>https://zhoulianglen.com/en/857</link>
      <description>Distinguishing between 'truly wealthy' and 'pretending to be wealthy' is important. At minimum, one should meet these two criteria to be considered 'wealthy,' as Andrew Hallam also argues: 1. Being able to choose not to work without worrying about making ends meet; 2. Holding investments that guarantee lifetime earnings at twice the national median household income. (In 2020, Shanghai's median household annual income was 240,000-600,000 RMB.)</description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/miscellanies/">Miscellanies</category>
      <category domain="https://zhoulianglen.com/en/tag/riches/">Wealth</category>
      <category domain="https://zhoulianglen.com/en/tag/iphone/">iPhone</category>
      <pubDate>Thu, 15 Oct 2020 14:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h2 id="heading-1">What Does It Mean to Be Wealthy?</h2><p>Distinguishing between “truly wealthy” and “pretending to be wealthy” is important. At minimum, one should meet the following two criteria to be considered “wealthy” — Andrew Hallam shares this view:</p><ol><li>Being able to choose not to work without worrying about making ends meet.</li><li>Holding investments that guarantee lifetime earnings at twice the national median household income. (In 2020, Shanghai’s median household annual income was 240,000-600,000 RMB.)</li></ol><h2 id="heading-2">iOS Workday Smart Alarm</h2><p>iOS alarms have never supported automatic on/off based on China’s official public holidays. Today I came across a fully automated solution via Shortcuts on @scomper’s blog. It works by subscribing to a Chinese public holiday calendar combined with Shortcuts, or through an online API plus Shortcuts processing.</p><p>Full tutorial here: <a href="https://pepcn.com/ios/iosshang-de-gong-zuo-nao-zhong">iOS Workday Alarm Clock</a></p><h2 id="heading-3">iPhone 12</h2><p>The iPhone 12 is finally here — pre-orders open at 8 PM tomorrow. I’ve been using my iPhone 7 for four years, so it’s finally time for an upgrade. This time I won’t be buying through the official Apple Store. I’ll look into supplier channels or Pinduoduo instead — the price difference should be enough to cover installment fees.</p><h2 id="heading-4">Resume</h2><p>I’ve been helping Teacher Wu revise his resume recently, which has also sparked the idea of updating my own. My past few job switches didn’t require a resume, so the current version still reflects my time as a designer. I can set aside some time this weekend to put together a product-focused resume and take stock of my years in product management along the way.</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>The Five Elements of a Company and Six-Element Organizational Metrics</title>
      <link>https://zhoulianglen.com/en/869</link>
      <description>
        <![CDATA[<p>One New Year’s Eve a few years back, a friend hosted a small cocktail party where one of his angel investors happened to be present. At s]]>
      </description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/thinking/">Thinking</category>
      <category domain="https://zhoulianglen.com/en/tag/ch6/">CH6</category>
      <category domain="https://zhoulianglen.com/en/tag/five-elements/">Five Elements</category>
      <pubDate>Mon, 28 Sep 2020 05:10:42 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>One New Year’s Eve a few years back, a friend hosted a small cocktail party where one of his angel investors happened to be present. At some point the conversation turned to a previous venture of his and how he’d staffed his teams. He laid out a “Five Elements” theory: a company is composed of metal, wood, water, fire, and earth, and you should match team types to cities based on their elemental affinity. Hangzhou belongs to wood, so it’s a good fit for the operations team; Shenzhen belongs to fire, so it’s better for the marketing team… and so on. Apparently the venture worked out in the end.</p><p>Personally, I think it has less to do with elemental mysticism and more to do with the talent profile of each city. Hangzhou genuinely has great operations talent — after all, it’s the heart of China’s e-commerce industry. Cities like Shenzhen and Dongguan have a strong service-industry culture; the principle that “money is proportional to effort” is deeply ingrained there, so salespeople naturally hustle.</p><p>Whether my guess is right or not, I can’t say — I haven’t lived in those cities. Putting the superstition aside, though, I do find the Five Elements framework useful as a lens for evaluating companies. I happened to read a similar article yesterday morning, so I figured I’d jot this down as a note.</p><h2 id="heading-1">The Five Elements of a Company</h2><p>As I remember it, that night’s framework broke down into the following — covering both internal and external factors. I’ve often used these five angles when looking at companies since:</p><ul><li><strong>Earth</strong>: the soil — the industry</li><li><strong>Wood</strong>: methodology, the boss</li><li><strong>Water</strong>: water flows — the company’s resources</li><li><strong>Fire</strong>: the team — a great team has to burn with passion</li><li><strong>Metal</strong>: finance — the financial situation</li></ul><h2 id="heading-2">Six-Element Organizational Metrics for Personification</h2><p>Yesterday I came across this article: <a href="https://mp.weixin.qq.com/s/rNn1wl3bZmv4p5wLD32m0A">Without KPIs or OKRs, How Do Early-Stage Startups Set Metrics? Try ×6</a>.</p><p>It introduces a “Six-Element” framework for the company itself, breaking down the organization’s internal ecosystem. I thought it was an interesting model — putting it here as a note for myself.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1601298517-ch6.png" alt="" decoding="async"></p>]]>
      </content:encoded>
    </item>
    <item>
      <title>The World of Cultivation</title>
      <link>https://zhoulianglen.com/en/868</link>
      <description>Exploring the striking parallels between the 'cultivation world' of Chinese fantasy fiction and real-world professional life. From spiritual energy to alchemy, how principles from Xianxia cultivation can be mapped onto your professional skills and talents.</description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/miscellanies/">Miscellanies</category>
      <category domain="https://zhoulianglen.com/en/categories/thinking/">Thinking</category>
      <category domain="https://zhoulianglen.com/en/tag/imagination/">Imagination</category>
      <category domain="https://zhoulianglen.com/en/tag/function/">Function</category>
      <category domain="https://zhoulianglen.com/en/tag/cultivation-fantasy/">Cultivation Fantasy</category>
      <pubDate>Thu, 24 Sep 2020 14:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>I once pondered a question: isn’t chemistry essentially “alchemy,” and isn’t physics essentially “the laws of the Dao”? If our textbooks had been renamed accordingly, perhaps I would have been far more motivated to study back in the day.</p><p>Last night while taking a shower, it struck me again. In the world of Xianxia (cultivation fantasy) novels, there are all kinds of cultivation methods. Cultivating spiritual energy internally, tempering the body externally, refining pills with one hand and forging artifacts with the other. Isn’t this exactly analogous to the various professional roles in my work — product management, operations, business development, and so on?</p><p>And the geniuses of the cultivation world? Perhaps they are the ones who can both venture outward and cultivate their inner strength.</p><p>Some people possess formidable spiritual power. Others combine that spiritual power with being a rare pill-refining master. The more disciplines one masters, the higher one’s “cultivation talent and realm.” And in this system, cultivation talent and realm refer more to diligence, serendipity, the passage of time, and the insights gained from life-or-death battles.</p><p>Indeed, all paths lead to the same destination.</p><p>Seen in this light, this infinite game grows ever more fascinating — ever more “gamified.”</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>Gameplay Analysis: Lottery-Style Campaigns That Keep Users Hooked</title>
      <link>https://zhoulianglen.com/en/lottery-analysis</link>
      <description>
        <![CDATA[<p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599124737-photo-1537154835319-14f43d91ea98.jpeg?x-oss-process=image/resize,m_f]]>
      </description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/product-design/">Product Design</category>
      <category domain="https://zhoulianglen.com/en/tag/operations/">Operations</category>
      <category domain="https://zhoulianglen.com/en/tag/lottery/">Lottery</category>
      <category domain="https://zhoulianglen.com/en/tag/psychology/">Psychology</category>
      <pubDate>Thu, 03 Sep 2020 09:30:01 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599124737-photo-1537154835319-14f43d91ea98.jpeg?x-oss-process=image/resize,m_fill,w_780,h_225" alt="Gameplay Analysis: Lottery-Style Campaigns That Keep Users Hooked" decoding="async"></p><blockquote><p>I’ve been working on some lottery-style campaigns recently, and a colleague shared this article with me. I’m reposting it on my blog as a personal reference. The article explains lottery-style campaigns, breaks down gameplay design and UI patterns, and there are a few of my own annotations at the end.</p></blockquote><h2 id="heading-1">1. Overview</h2><p>Campaigns with a “gambling” flavor are almost always a first choice in operations playbooks. They tend to mimic offline gambling scenarios — wheels of fortune, gachapon machines, slot machines, shell games, card flips, red-envelope rain, lottery tickets, etc. — and turn them into interactive visuals. With a simple action (usually a tap), the user randomly receives coupons, rebate vouchers, small cash rewards, and the like. Business conversion typically happens in two phases: when the user <strong>earns lottery chances</strong> and <strong>uses the prizes</strong> they win.</p><p>These campaigns have strong narrative pull. Humans are wired to be fascinated by gambling games and are willing to try them. Executed well, they succeed easily. But notice: compared to real-world gambling, the mobile environment is weak at creating atmosphere, the prizes are usually low-value items like coupons, and it’s hard for users to feel the visceral thrill of <strong>“almost winning”</strong> and <strong>“random rewards”</strong> that real gambling delivers. If users get repeatedly disappointed, they’ll start to feel cheated and bored, and churn out before any business conversion happens.</p><p>By draw cycle, gambling-style games can be split into instant draws and periodic draws. The longer the cycle, the higher the churn.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599122832-choujiang-1.png" alt="Lottery gameplay" loading="lazy" decoding="async"></p><h2 id="heading-2">2. Gameplay Design</h2><p>The primary driver behind participation in “gambling-style” campaigns is <strong>curiosity about the unknown</strong>. We’re collectively obsessed with unpredictable experiences and crave exploration. To satisfy our curiosity, we’re willing to act immediately. This is a fundamental survival and evolutionary mechanism — and the gambling industry has exploited this “human weakness” to stay perpetually relevant.</p><p>Of course, there’s more at play psychologically: loss aversion, sunk-cost avoidance, and so on. But this is enough to explain why these campaigns work.</p><p>In the user’s journey, <strong>curiosity, the lure of big prizes, or social pressure</strong> initially pulls them in. They take the designed action to win prizes. Because of the <strong>random reward + instant feedback</strong> mechanic, dopamine fires and the user feels pleasure — they get hooked, and the campaign succeeds.</p><p>The catch: prize design in these campaigns is usually extremely homogeneous — coupons, discount vouchers, more coupons. After a few draws, users get bored and stop feeling excitement. On top of that, these campaigns often require users to complete tasks to earn draw chances. Users invest effort but don’t feel the rewards are “equivalent,” so they feel cheated and leave.</p><p>So when designing, first build the “gambling” atmosphere — use <strong>big-prize displays, live activity feeds</strong>, and a lively <strong>audio-visual presentation</strong>. Second, <strong>combine other behavioral motivators</strong>, extend the gameplay, and adapt to the user’s shifting motivations — to maximize the incentive effect and drive behavior.</p><h3 id="heading-3">2.1 Give Users Free Trial Chances</h3><p>Provide some free trial chances at the start to ease users into the campaign, while doing onboarding and behavioral conditioning. Two or three free draws is about right — too few or too many both work poorly. Free chances usually refresh daily (or not at all); once used up, users earn more by completing conversion-related tasks.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599122899-choujiang-2.png" alt="Free trial draws for users" loading="lazy" decoding="async"></p><h3 id="heading-4">2.2 Strategize the User’s Winning Path</h3><p>Each prize feels random to the user — “fair, transparent, no inside game.” But to optimize the metrics that matter (participation / conversion / virality), the winning path has to be deliberately designed. Once you balance operational cost, business goals, and user experience strategically, the result far outperforms naive randomness.</p><p><strong>2.2.1 Prize and User Tiering</strong></p><p>Designers tier the target user base and the available prize pool. The point is to <strong>achieve optimal prize-user matching and lift conversion.</strong></p><p>User tiers are usually based on user attributes — new vs. returning, power users, etc. — or behavioral preferences (“daily-essentials shoppers,” “personal-care shoppers,” and so on).</p><p>Prize tiering happens along two dimensions: how often each tier of user wins each prize, and how attractive (i.e., valuable) each prize is to users in that tier. When matching users to prizes during a draw, you mix in some randomness to create a “random-feeling” but high-hit-rate winning path.</p><p><strong>2.2.2 Strategize Prize Distribution</strong></p><p>In the free phase, the typical prizes are coupons and discount vouchers — low value. This easily creates the perception that the campaign isn’t worth much and that there’s nothing to lose by skipping it, which hurts retention into the conversion phase.</p><p>A better move: when the user’s free chances run out for the first time, hand out a more attractive prize — say, a small cash red envelope — tailored to the user’s tier from the previous step. This sets the expectation that the campaign is valuable and that subsequent task-completed prizes will also be substantial, smoothly bridging the user into the conversion phase.</p><p>During the conversion phase, users invest time, money, and emotion to earn more draws. They expect more. Repeatedly receiving low-value prizes will churn them. This is where prize tiering pays off — <strong>dispense progressively more attractive prizes based on the user’s tier, with some randomness</strong> — maximizing the conversion depth (the number and difficulty of tasks completed).</p><p>You can also set up prize reset strategies — e.g., reset the wheel prizes daily, or after a big-prize round. The reset mechanic introduces scarcity through time pressure, raising user motivation. With a rich enough prize pool, you can even let users pick from a group of potential prizes.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599122979-choujiang-3.png" alt="Users choose gachapon prizes" loading="lazy" decoding="async"></p><p><strong>2.2.3 How Draw Chances Increase</strong></p><p>The standard pattern: the system gives free draw chances; once exhausted, they recover one or more times after a countdown (a <strong>scarcity</strong> mechanic). In parallel, the system offers an alternative path — <strong>complete a task to earn more draws.</strong> Task push should account for both business goals and user attributes, ideally tiered like users and prizes are, controlling completion rates by personalizing the task list. This lifts both completion rate and conversion.</p><p>Whether to offer a recovery mechanic at all depends on whether the campaign cares about repeat visits and whether the prize budget can sustain it. Most campaigns want users to visit as often as possible to maximize impact, so recovery is usually worthwhile. There are exceptions — for instance, Alipay ran a one-time campaign to push unrated users to take its risk-assessment, where completing the assessment earned a single wheel spin, and that was that.</p><p>PS: Don’t undermine the campaign’s basic structure with special tasks (e.g., “complete task X to guaranteed-win prize Y”). That kind of design feels too aggressive and will turn users away.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123052-choujiang-4.png" alt="Ways to earn more draws" loading="lazy" decoding="async"></p><h3 id="heading-5">2.3 Higher-Order Motivation — Sense of Mission</h3><p>In Maslow’s hierarchy, sense of mission sits between Esteem (level 4) and Self-Actualization (level 5) — a high-order need. If a campaign can be tied to a sense of mission, it gives users much stronger behavioral motivation.</p><p>Think about what lottery players say when they don’t win: “I’m contributing to charity!” That larger-meaning narrative consoles them about their losses and gives them an “excuse” to buy more tickets. In China, charity is even the legal basis for the lottery industry to exist.</p><p>The catch is credibility and urgency — mission-based messaging is hard to make believable and lacks time pressure, so designers need to add other levers to compensate.</p><p>For credibility: partner with charities, and reinforce through <strong>storytelling (animation, etc.), exclusive badges (charity-specific badges), elite collectives (charity groups), leaderboards, and achievements (heroism)</strong>. For urgency: introduce <strong>scarcity (limited badge quantities, limited participation windows)</strong>.</p><p>Alipay has mastered this technique — Ant Forest, Ant Manor, Year of Abundance (protecting the Chinese sturgeon together) all carry traces of mission-driven design.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123148-choujiang-5.png" alt="Higher-order motivation: sense of mission" loading="lazy" decoding="async"></p><h3 id="heading-6">2.4 Show the Prizes</h3><p>Random rewards don’t mean the prizes have to stay hidden. Display the most attractive prizes prominently, and hint at more. If possible, offer choice or personalization — this is especially valuable for long-running lottery campaigns.</p><p>The benefits: it triggers the user’s <strong>sense of ownership and acquisition</strong>, the <strong>dopamine anticipation effect</strong>, and <strong>wishful thinking</strong> — pushing them to act immediately.</p><p><strong>“Dopamine anticipation effect”</strong> — even just expecting to obtain something or achieve something causes the brain to release dopamine, producing pleasure and strengthening the motivation to pursue it.</p><p><strong>“Wishful thinking”</strong> — people always believe they’re the lucky one. Even with a slim chance, people are willing to take a small risk for a big reward instead of settling for a safe, middling one.</p><blockquote><p>“In our evolutionary history there was no prepared event, no knowledge structure to help us seize the opportunity.” — Robert Williams</p></blockquote><p>In practice, try the <strong>big-prize-on-display</strong> technique: showcase the top prize on the campaign page, dopamine kicks in, wishful thinking kicks in — <strong>“These could all be mine!”</strong> — and the user takes action. You can also run a <strong>scrolling live-win feed</strong> to reinforce wishful thinking and trigger the bandwagon effect. Avatars and names add credibility — especially avatars.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123210-choujiang-6.png" alt="Showing prizes during draws" loading="lazy" decoding="async"></p><h3 id="heading-7">2.5 Give Users a Goal</h3><p>As we noted, prizes that users win in a lottery campaign are the result of a strategized “randomness.” Random rewards, with their uncertainty, create more delight, pleasure, and achievement than fixed rewards — but uncertainty also means a lack of control. After several misses, users feel cheated and bored, and leave.</p><p>So setting a goal for the user is essential. It smoothly accommodates the shift in user motivation and triggers the <strong>goal-completion effect</strong>, driving behavior over the goal cycle. For example:</p><ul><li><strong>Every 5th draw, guaranteed win from the yellow tier (higher-value prizes);</strong></li><li>Or <strong>5 draws unlocks a yellow treasure chest, 9 draws unlocks a red one, 12 draws unlocks a purple one…</strong></li><li>Or <strong>release a fixed-quantity grand prize daily;</strong></li><li>Or <strong>collect fragments to win a grand prize (combining with a lottery-style mechanic)…</strong></li></ul><p>By adding progression rewards, you motivate continued participation. Combine these with on-screen copy, progress bars, and tooltip bubbles for effective visual communication.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123284-choujiang-7.png" alt="Give users a goal" loading="lazy" decoding="async"></p><h3 id="heading-8">2.6 Social Influence</h3><p>In <a href="http://www.woshipm.com/pd/3279762.html"><em>Design Summary of Collection-Style Campaigns</em></a>, we covered how social influence matters for operational campaigns in detail — it has powerful effects on virality, gameplay expansion, and business conversion. I won’t rehash all of it; just a few design techniques worth highlighting.</p><p><strong>2.6.1 Earn draws by inviting friends</strong></p><p>Self-explanatory: include “invite friends” as one of the ways to earn draw chances. If it makes sense, tier it — inviting more friends earns more draws. You can even add a dedicated module in the campaign UI to guide invites and track progress.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123339-choujiang-8.png" alt="Earning draws via friend invites" loading="lazy" decoding="async"></p><p><strong>2.6.2 Guide users to share</strong></p><p>The precondition for users to share something is that they feel the content is worth sharing — that sharing it satisfies <strong>vanity, showing off, or self-interest</strong>. If you prompt sharing when users don’t feel that way, they’ll feel insulted and mocked — and I mean that — think about how strong your resistance and disgust are when a system makes you share something you don’t want to share.</p><p>So at the right scene, the right moment, with the right asset, users have the motivation to act, and the share actually produces real business value.</p><p>Example: when a user wins a big prize, give them a beautifully designed, distinctive winning card. They’re already immersed in the excitement of winning and want to share it. Now the system’s “kindness” lands perfectly — sharing happens naturally, and that kind of share actually attracts new users.</p><p><strong>2.6.3 Send chances and items to friends</strong></p><p>Many games have this mechanic: users have a fixed daily quota for sending energy or coins to friends, and the user gets the same amount back. Energy gets used to participate; coins buy items.</p><p>The same mechanic can apply here — send draw chances or items to friends, and get the same amount back. Under the cover of altruism, this creates a win-win.</p><p><strong>2.6.4 Leaderboards / scrolling winner lists / live-win feeds</strong></p><p>These are all social-influence components. Compared to live feeds (which scroll), winner lists and leaderboards usually live in a fixed area of the campaign page or have their own dedicated page — they’re persistent and traceable.</p><p>Looking at this content triggers the user’s <strong>envy, comparison, and wishful thinking</strong> — driving action. Leaderboards also show users <em>how</em> to win, onboarding them into the actions they should take. When a user sees someone overtake them on the leaderboard, they get a stronger motivation boost — often overlooked.</p><p>Watch out: leaderboards easily develop head-aggregation effects — the top of the list may not change for long stretches. The user’s own rank may also be hard to surface, which can drive them away. Possible fixes: <strong>periodically reset the leaderboard; “micro-leaderboards” that only compare the user against their friends or against similar users</strong>, etc.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123395-choujiang-9.png" alt="Add leaderboards, scrolling winner lists, etc." loading="lazy" decoding="async"></p><h3 id="heading-9">2.7 Loss Aversion and Escape</h3><p>I covered the underlying mechanics of loss aversion and escape psychology in the post on the interactive countdown component for operational campaigns. The short version: when people think something they have (or could have had) is about to slip away, they feel an instinctive urge to prevent it.</p><p><strong>2.7.1 Give users items first</strong></p><p>Design items whose logic is: <strong>after winning a certain prize, the item amplifies the reward. Crucially, the user has to get the item first, and only then win the reward — that ordering matters.</strong></p><p>Items naturally have an in-built countdown — the campaign duration — and expire when the campaign ends. The user then loses the bonus the item would have provided. Designers can even set a shorter countdown on the item itself and surface it visually. Under the pull of <strong>loss aversion</strong>, the user develops a strong craving for the amplifiable reward, and acts. At this point, give them logic that increases their probability of winning that reward — otherwise, lacking a sense of control, the user feels helpless and leaves. If the user got the item during the free-trial phase, this also helps move them into the conversion phase smoothly.</p><p><strong>How you distribute the item</strong> matters too — <strong>effectively communicate the item’s value to the user</strong>. Give it as an “honored gift” (the user feels singled out, raising the perceived value); or give it as an extra surprise after a regular draw; or include it as one of many prizes and strategically ensure the user gets it during the free phase.</p><p>Example: in the free-trial phase, the user wins a doubling card that doubles cash red-envelope rewards. The user now hustles for a red envelope, and even hustles harder to make the doubling card “count” for more.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123475-choujiang-10.png" alt="Effectively communicate the item's value to the user" loading="lazy" decoding="async"></p><p><strong>2.7.2 Guaranteed high-value prize on consecutive draws</strong></p><p>Consecutive-draw guarantees on a high-value prize encourage users to save up draw chances and trigger them in a single batch. As a gameplay technique, it lifts conversion depth significantly. Note: the consecutive-draw payoff has to match the user’s expectations, and <strong>the high-value prize has to be visually emphasized to stand out</strong>. Sometimes consecutive draws are also used purely to burn through draw chances quickly and improve operational efficiency.</p><p>Example: 5 consecutive draws guarantees a prize from the yellow tier.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123533-choujiang-11.png" alt="Bilibili: guaranteed prize on consecutive draws" loading="lazy" decoding="async"></p><p><strong>2.7.3 Flexible use of countdowns</strong></p><p>The countdown component creates scarcity through time pressure, raises user motivation, and triggers immediate action. In operational campaigns, countdowns come in two flavors — <strong>campaign countdowns</strong> and <strong>key-prize countdowns</strong> — increasing scarcity for the campaign overall and for specific high-value prizes respectively.</p><p>Be careful: when applying a countdown to a key prize, also provide a way for the user to lift their probability of winning it. If users can only keep drawing in hopes of winning, they’ll feel helpless and the countdown can backfire — to escape that feeling, users will most likely just ignore it.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123606-choujiang-12.png" alt="Countdowns in lottery campaigns" loading="lazy" decoding="async"></p><h3 id="heading-10">2.8 User Action Cues and Re-engagement</h3><p><strong>2.8.1 The biggest possible draw button</strong></p><p>When designing, make the action button as big and flashy as possible — that’s how you grab attention and guide behavior.</p><p>Human instinct says: <strong>unless absolutely necessary, we rarely think actively; wherever there’s a cue, there’s “compliance” behavior.</strong> Effective button design gets users to “comply” with a tap, smoothly entering the campaign and participating. It also lifts user efficiency and prevents bounce on first entry due to cognitive overhead.</p><p><strong>The “4-second rule”: if a user enters a system and can’t find what they’re looking for within 4 seconds, and the system doesn’t hint at the next step, they’ll most likely leave.</strong></p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123666-choujiang-13.png" alt="Make the draw button big" loading="lazy" decoding="async"></p><p><strong>2.8.2 Popovers</strong></p><p>The <strong>popover</strong> is an action-guidance component — typically appearing next to buttons that should be tapped or visual elements that need explaining. It’s often used together with gesture pointers to draw attention and guide behavior. Popovers can be persistent or transient. Design them strategically — define when they appear, when they hide, what they display, etc.</p><p>Example: appear when the user has been idle on the page for 3 seconds, then disappear after another 5 seconds.</p><p>I’ll cover the popover component in more depth in a future post.</p><p><strong>2.8.3 User retention and re-engagement</strong></p><p>User <strong>retention and re-engagement</strong> are critical but often-overlooked interaction strategies.</p><p>Users may enter a campaign through different channels and leave at different depths of participation. So the content used to keep them or pull them back must also be differentiated.</p><p>When designing, segment the scenarios as finely as possible, draft different modal copy for each, and use the right channels to reach the right users with precision — maximizing retention and re-engagement.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123759-choujiang-14.png" alt="User retention and re-engagement" loading="lazy" decoding="async"></p><h2 id="heading-11">3. UI Patterns</h2><p>Functional modules that may appear in a “gambling-style” campaign include: <strong>header, draw functional area, business-conversion drawer, friend-invite progress, rules section, my winnings, leaderboard, winner list, live-win feed</strong>, etc.</p><h3 id="heading-12">3.1 Scene Story and Atmosphere</h3><p>“Gambling-style” campaigns have a rich library of offline scenes to draw from — <strong>red envelopes, lottery tickets, gachapon, claw machines, slot machines, wheels of fortune, card flips, fortune cats, pinball, shell games</strong> — and you can flex these as prototypes by combining with seasonal or trending themes.</p><p>The page design should work hard to set the atmosphere — convey activity intensity and prize value effectively. Reinforce this with <strong>localized animations and background music</strong>.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123889-choujiang-15.png" alt="Lottery gameplay variations" loading="lazy" decoding="async"></p><h3 id="heading-13">3.2 Modal Design</h3><p>In “gambling-style” campaigns, prize distribution, user onboarding, and re-engagement are typically delivered via modals — so modal feel matters a lot. <strong>Overlay opacity, copywriting, primary vs. secondary buttons, auto-dismiss behavior, brand onboarding elements, modal animations</strong> — all of these need careful thought. I’ll dive into this in a dedicated modal-component post later.</p><p>The bottom line: <strong>the modal’s feel must match the emotional swing you want users to experience</strong> — “stay calm for small wins; go wild for big ones!”</p><h2 id="heading-14">4. Summary</h2><p>As above, “gambling-style” campaigns have a broad user base and, when operated well, are relatively easy to succeed with. When designing the interactions, focus on strategizing the rules — especially the prize-distribution logic, which should be <strong>simple, intuitive, and effective</strong>. Also, <strong>use different motivational design techniques to accommodate the shifting motivations of users during participation</strong>, maximizing the operational impact of the campaign.</p><p>Original author: <a href="http://www.woshipm.com/pd/3327970.html">@CuiYuxiong</a>, originally published on Renrendoushichanpinjingli (<a href="http://woshipm.com">woshipm.com</a>).</p><h2 id="heading-15">Personal Annotations</h2><ol><li>Cash red envelopes are also a form of lottery. Look at PDD’s gameplay for inspiration (mix of whole and fractional amounts, “luck-driven outcomes”).</li><li>How do you sustain curiosity? Are there new gameplay ideas to break draw fatigue?</li><li><s>Cash back after purchase? Large amounts? Will that hurt conversion? Add on WeChat to claim red envelope?</s></li><li>Let users choose group prizes.</li><li>Charity-based sense of mission? Ant Forest is a great example.</li><li>Dopamine triggers: prizes displayed up front.</li><li>When users win a big prize, give them a meaningful and well-designed winning card. They’re already in the winning mood and want to share it. But also consider the scenario — not every lottery format works for viral sharing.</li><li>Maybe a new mechanic: roll dice, get a discount based on the points. Mixes luck and skill.</li><li>Loss aversion: get a doubling card valid for one hour first, then get a consumption voucher. (Hand it over directly, or have them win it?)</li><li>Win with both skill + luck (e.g., answer a question), and after showing off, the voucher doubles or they get another draw.</li><li>List-page city-exclusive, date-exclusive perks, etc.</li><li>Learn to manufacture holidays (whole-site events with a justification for users — why is everything so cheap? e.g., Double-11, Double-12; single-product events — “Brand X loyalty event,” “Year N anniversary,” etc.).</li></ol>]]>
      </content:encoded>
    </item>
    <item>
      <title>How to Search Multiple Keywords Simultaneously on a Chrome Page</title>
      <link>https://zhoulianglen.com/en/chrome-search-for-multiple-keywords</link>
      <description>
        <![CDATA[<p>I’m a die-hard Chrome user — for over a decade Chrome has been the only browser I use. The feature I use most often is in-page search.</p]]>
      </description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/tool/">Tools</category>
      <category domain="https://zhoulianglen.com/en/tag/chrome/">Chrome</category>
      <category domain="https://zhoulianglen.com/en/tag/chrome-extension/">Chrome Extension</category>
      <pubDate>Mon, 24 Aug 2020 13:46:30 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>I’m a die-hard Chrome user — for over a decade Chrome has been the only browser I use. The feature I use most often is in-page search.</p><p>A simple <code>⌘ + F</code> opens the in-page search bar, and you can find your keyword on the current page instantly. But it only supports one keyword at a time. If you want to search for multiple keywords on the same page, you have to repeat the search several times — which is a pain.</p><h2 id="heading-1">Chrome Extension: Multi-highlight</h2><p>I happened to come across this Chrome extension on Sspai today, and it solves the problem perfectly.</p><p>It lets you highlight multiple keywords on a page simultaneously. Just separate your keywords with a space or a newline while typing, and the extension will search for all of them in the current page.</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/08/1598276448-Multi-highlight.png" alt="" decoding="async"></p><p>As shown above, I searched for four keywords — “周良” (my name), “问题” (issue), “杭州” (Hangzhou), “文件” (file) — all at once. Multi-highlight highlights each keyword in a different color, making it much easier to spot and distinguish them.</p><p>Chinese support is basically flawless. For digging through information on specific pages, it’s a joy to use.</p><h2 id="heading-2">Quick Shortcut Tip</h2><p>You can bind a custom keyboard shortcut to the extension in Chrome, which makes it much faster to use. Steps:</p><ol><li>Open a new tab.</li><li>Type <code>chrome://extensions/shortcuts</code> in the address bar and press Enter.</li><li>Find Multi-highlight in the list and assign a shortcut.</li></ol><h2 id="heading-3">Installing Multi-highlight</h2><p>You can grab Multi-highlight for free from the <a href="https://chrome.google.com/webstore/detail/multi-highlight/pfgfgjlejbbpfmcfjhdmikihihddeeji">Chrome Web Store</a>.</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>Fixing WordPress Error Pages Not Properly Recognized as 404</title>
      <link>https://zhoulianglen.com/en/wordpress-not-recognized-404</link>
      <description>
        <![CDATA[<p>In my last post I mentioned that I’d <a href="https://imzl.com/zlbk-net">moved Zhou Liang’s blog to the imzl.com domain</a>, with the ser]]>
      </description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/wordpress/">WordPress</category>
      <category domain="https://zhoulianglen.com/en/tag/wordpress-tutorial/">WordPress Tutorial</category>
      <category domain="https://zhoulianglen.com/en/tag/wordpress-skill/">WordPress Tips</category>
      <category domain="https://zhoulianglen.com/en/tag/lnmp/">LNMP</category>
      <category domain="https://zhoulianglen.com/en/tag/nginx/">Nginx</category>
      <category domain="https://zhoulianglen.com/en/tag/website-maintenance/">Website Maintenance</category>
      <category domain="https://zhoulianglen.com/en/tag/pathinfo/">PathInfo</category>
      <pubDate>Thu, 06 Aug 2020 13:29:45 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>In my last post I mentioned that I’d <a href="https://imzl.com/zlbk-net">moved Zhou Liang’s blog to the imzl.com domain</a>, with the server migrated to Aliyun ECS in Hangzhou. Migrating the files, setting up the new server environment, deploying the HTTPS certificate, <a href="https://imzl.com/wordpress-301">301-redirecting the old domain</a>, pushing static files to Aliyun OSS — all of it was familiar territory by now. The whole process went smoothly, <em>except</em> for one strange issue that surfaced after the site went live.</p><p>WordPress was no longer correctly redirecting error pages to the 404 page.</p><h2 id="heading-1">What Was Happening</h2><p>The symptoms looked like this:</p><ul><li>Visiting <code>https://imzl.com/404/</code> — a non-existent URL — should normally hit the Nginx settings or the WordPress theme’s built-in 404 page. Instead, it was just rendering the blog’s homepage content.</li><li>Visiting <code>https://imzl.com/404</code> — also a non-existent URL — correctly returned the 404 page.</li></ul><p>Confusing, right? In other words, any URL on the blog that didn’t end in <code>.html</code> would render the homepage instead of a 404 page. Terrible UX.</p><h2 id="heading-2">Investigation Path</h2><p>Let me walk through the diagnosis. You may not run into this exact issue, but the step-by-step logic of controlling variables and testing hypotheses might be useful.</p><h3 id="heading-3">Check the WordPress Theme</h3><p>First guess: maybe the theme was buggy. Swap to a known-good theme and test. I happen to maintain two blogs, so I swapped both to the same theme and tested. Both behaved correctly — so the theme wasn’t the cause.</p><h3 id="heading-4">Check the Nginx Configuration</h3><p>Since this is a redirect issue, my next guess was a misconfigured Nginx rule. I cross-referenced my config against the WordPress Nginx documentation and confirmed the rules were correct. So the rules weren’t to blame.</p><p>But I couldn’t rule out Nginx entirely. I applied the same ruleset to another site, and it worked fine. Comparing the two setups variable by variable, I noticed Aliyun was hosting two sites while my test VPS only had one. On a hunch, I added a second site to the test VPS — and the bug reproduced. That basically confirmed the issue lay in the Nginx config.</p><h2 id="heading-5">The Fix</h2><p>I don’t tinker with Nginx often — I usually stick to a handful of go-to rules. So I went straight to asking an expert. Since the server is set up with LNMP, I reached out to <a href="https://bbs.vpser.net/">@JunGe</a>, the author of the LNMP one-click installer. I described the symptoms, the steps I’d taken, and the results.</p><p>His guess: Nginx had <code>pathinfo</code> enabled, and that was the cause.</p><h3 id="heading-6">How to Disable PathInfo on an LNMP WordPress Site</h3><ol><li>Find your Nginx config file — usually under <strong>/usr/local/nginx/conf</strong>.</li><li>Locate the line <strong>include enable-php-pathinfo.conf;</strong></li><li>Change it to <strong>include enable-php.conf;</strong></li><li>SSH into the server and run <strong>service nginx restart</strong> to restart Nginx.</li><li>Done — issue resolved.</li></ol>]]>
      </content:encoded>
    </item>
    <item>
      <title>Automatically Insert Custom Classes into a, p, and Other Tags in WordPress Post Content</title>
      <link>https://zhoulianglen.com/en/wordpress-content-insert-class</link>
      <description>How to automatically insert specified CSS classes into a, p, and other HTML tags within WordPress post content.</description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/wordpress/">WordPress</category>
      <category domain="https://zhoulianglen.com/en/tag/wordpress-tutorial/">WordPress Tutorial</category>
      <category domain="https://zhoulianglen.com/en/tag/wordpress-skill/">WordPress Tips</category>
      <pubDate>Fri, 31 Jul 2020 15:10:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>Last week I was building a theme that incorporated an open-source CSS framework. Adding classes to various front-end elements was straightforward enough. But when it came to post content, things got tricky — the content is output by WordPress itself, so I had no control over the classes being used.</p><p>I asked @desin (the author of the “I Love Boiled Fish” blog) if there was a way to add classes without writing JavaScript. He suggested I look into the content filter documentation. After some research, the problem was solved.</p><p>Here’s the code — feel free to use it as reference. Copy the following and paste it right below the <code>&lt;?php</code> line in your theme’s <code>functions.php</code> file:</p><pre><code class="highlight php"><span class="comment"># Automatically add img-res class to img tags in post content</span><span class="function"><span class="keyword">function</span> <span class="title">img_paragraph</span>(<span class="params"><span class="variable">$content</span></span>)</span>&#123;    <span class="keyword">return</span> <span class="title function_ invoke__">preg_replace</span>(<span class="string">&#x27;/&lt;img([^&gt;]+)?&gt;/&#x27;</span>, <span class="string">&#x27;&lt;img$1 class=&quot;img-res&quot;&gt;&#x27;</span>, <span class="variable">$content</span>);&#125;<span class="title function_ invoke__">add_filter</span>(<span class="string">&#x27;the_content&#x27;</span>, <span class="string">&#x27;img_paragraph&#x27;</span>);</code></pre><p>Similarly, if you want to target p tags, the code would be:</p><pre><code class="highlight php"><span class="comment"># Automatically add mt1em, mb1em, and lh-180 classes to p tags in post content</span><span class="function"><span class="keyword">function</span> <span class="title">p_paragraph</span>(<span class="params"><span class="variable">$content</span></span>)</span>&#123;    <span class="keyword">return</span> <span class="title function_ invoke__">preg_replace</span>(<span class="string">&#x27;/&lt;p([^&gt;]+)?&gt;/&#x27;</span>, <span class="string">&#x27;&lt;p$1 class=&quot;mt1em mb1em lh-180&quot;&gt;&#x27;</span>, <span class="variable">$content</span>);&#125;<span class="title function_ invoke__">add_filter</span>(<span class="string">&#x27;the_content&#x27;</span>, <span class="string">&#x27;p_paragraph&#x27;</span>);</code></pre>]]>
      </content:encoded>
    </item>
    <item>
      <title>Fixing WordPress Stuck on &quot;Briefly Unavailable for Scheduled Maintenance&quot;</title>
      <link>https://zhoulianglen.com/en/wordpress-scheduled-maintenance</link>
      <description>It turns out that when WordPress upgrades its core, themes, or plugins, it switches to maintenance mode. During this time, visiting the front end displays &quot;Briefly unavailable for scheduled maintenance. Check back in a minute.&quot; If the upgrade goes smoothly, it returns to normal within seconds. However, poor network conditions or other issues can cause the upgrade to stall, leaving WordPress permanently stuck in maintenance mode — both front end and back end showing &quot;Briefly unavailable for scheduled maintenance. Check back in a minute.&quot;</description>
      <author>Len Chou</author>
      <category domain="https://zhoulianglen.com/en/categories/wordpress/">WordPress</category>
      <category domain="https://zhoulianglen.com/en/tag/wordpress-tutorial/">WordPress Tutorial</category>
      <category domain="https://zhoulianglen.com/en/tag/wordpress-skill/">WordPress Tips</category>
      <pubDate>Fri, 31 Jul 2020 14:54:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>Today while upgrading a plugin on my personal blog, I ran into an issue: both the front end and back end were stuck on a blank page displaying “Briefly unavailable for scheduled maintenance. Check back in a minute.” I was completely baffled.</p><p>It turns out that when WordPress upgrades its core, themes, or plugins, it switches to maintenance mode. During this time, visiting the front end displays “Briefly unavailable for scheduled maintenance. Check back in a minute.” If the upgrade goes smoothly, it returns to normal within seconds. However, poor network conditions or other issues can cause the upgrade to stall, leaving WordPress permanently stuck in maintenance mode — both front end and back end showing “Briefly unavailable for scheduled maintenance. Check back in a minute.”</p><h2 id="heading-1">How to Fix This</h2><p>Delete the <code>.maintenance</code> file in your website’s root directory.</p><p><code>.maintenance</code> is a hidden file that typically won’t show up when browsing via FTP. I recommend using SSH instead. Follow these steps:</p><ol><li><code>cd /home/xxx/xxx</code> — navigate to the root directory of the affected WordPress site.</li><li><code>ls -a</code> — list all files in the current directory, including hidden ones. Check if <code>.maintenance</code> exists; if so, proceed to delete it.</li><li><code>rm -rf .maintenance</code> — press Enter to delete. Problem solved.</li></ol>]]>
      </content:encoded>
    </item>
  </channel>
</rss>
