<?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</title>
    <link>https://imzl.com/</link>
    <description>AI 产品经理，用 Vibe Coding 把想法做成产品</description>
    <language>zh-CN</language>
    <copyright>All rights reserved 2026, 周良 Len</copyright>
    <lastBuildDate>Mon, 08 Jun 2026 10:31:48 GMT</lastBuildDate>
    <generator>Hexo</generator>
    <atom:link href="https://imzl.com/rss.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>给朋友们的 AI 使用建议</title>
      <link>https://imzl.com/ai-usage-tips</link>
      <description>
        <![CDATA[<p>从 2022 年底 ChatGPT 开放给公众那天起，我就一头扎了进去。三年多过去，主流模型轮番上阵，从最早那个「会写诗的玩具」，到如今能陪我把一个 Idea 跑成产品、再跑出第一笔商业化收入。如今 AI 已经成了我使用最高频、投入最多、ROI 最高的工具。</p>
<p>]]>
      </description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/ai/">AI</category>
      <category domain="https://imzl.com/tag/ai/">AI</category>
      <pubDate>Sun, 07 Jun 2026 02:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>从 2022 年底 ChatGPT 开放给公众那天起，我就一头扎了进去。三年多过去，主流模型轮番上阵，从最早那个「会写诗的玩具」，到如今能陪我把一个 Idea 跑成产品、再跑出第一笔商业化收入。如今 AI 已经成了我使用最高频、投入最多、ROI 最高的工具。</p><p>也因为这层关系，身边越来越多的朋友总会问我同一个问题：<strong>AI 到底该怎么用？</strong></p><p>市面上 AI 教程已经过剩，多数在贩卖一种幻觉：仿佛复制一个神奇的提示词，就能点石成金。但现实是，多数人试过两次觉得不靠谱，从此再也没碰过。</p><p>这篇文章不教提示词。我把这三年踩过的坑、和验证过的几条习惯整理出来，希望能给同样在摸索的朋友一点参考。</p><p><strong>重要的从来不是技巧，是手感。</strong></p><p><img src="/img/ai-usage-tips/cover.png" alt=""></p><hr><h2 id="heading-1">一、AI 看遍了所有书，但没在你公司工作过一天</h2><p>我对 AI 预期是这样的：<strong>一个看遍了所有书、考遍了所有试，但从没在你公司工作过一天的天才。</strong></p><p>它知识满分，反应也快。但对你的业务一无所知：没开过你的会，没见过你的客户，不知道你的资源边界，更不知道你老板上周拍了什么板。</p><p>更要命的是，它不知道的时候，不会说「我不知道」，而是会一本正经地编一个看起来很对的答案给你看。</p><p>所以两件事很关键：</p><ul><li><strong>超出常识的内容，得喂给它。</strong> 行业报告、竞品资料、自己的判断，先丢进去。让 AI 凭空生成判断，注定是水货。</li><li><strong>把它当一个新来的天才同事，而不是当行业专家。</strong> 它能补全脚手架、把素材织成可读的文本；但方向和判断仍然得来自你。这家公司、这个客户、这件事的来龙去脉，是 AI 永远不知道的。</li></ul><p>这三年我越来越确信一句话：AI 时代真正值钱的，不是技术深度，<strong>而是业务判断力 × 工具使用能力</strong>。AI 帮你干活，但你得知道该干什么活。</p><hr><h2 id="heading-2">二、它会偷偷骗你，越自信越得防</h2><p>AI 犯错的方式很有欺骗性：<strong>它说得越自信，你越容易信</strong>，但它的自信和准确率之间，并没有必然关系。</p><p>几条底线得守住：</p><ul><li><strong>涉及事实的，一定交叉验证。</strong> 人名、日期、数据、引用、法条编号，AI 编造这些的能力堪称一绝。</li><li><strong>涉及专业判断的，AI 只能做参考。</strong> 法律条文、医疗建议、财务决策，可以做初步调研，但最终决策必须由专业人士把关。</li><li><strong>涉及隐私和敏感信息的，注意数据安全。</strong> 公司机密、个人身份、未公开的商业数据，别直接喂给公共 AI 服务。</li></ul><p>也有些事，<strong>最好别交给 AI</strong>：</p><ul><li>你自己根本不懂、又没法验证的领域，这种最容易被它的「自信废话」忽悠</li><li>涉及关键决策、需要你亲自担责的判断</li><li>高度依赖隐性知识、长期人际关系的事，比如要不要劝朋友离个婚</li></ul><p><strong>信任，但验证。</strong> 这是我和 AI 协作的基本态度，三年没变过。</p><hr><h2 id="heading-3">三、AI 让「超级个体」成为可能</h2><p>过去，要一个人高效完成跨职能的事，并不容易。产品经理想自己写代码，得脱产学几个月；设计师想独立做产品做运营，得补很多功底；内容创作者想做数据分析，得啃一遍统计基础。</p><p>每多跨一个领域，就要补一大堆基础，所以最经济的做法是分工。公司也因此越做越大、团队越做越臃肿。</p><p><strong>AI 在改变这个等式。</strong></p><p>未来的竞争力，已经不在于你是什么「岗位」，而在于你<strong>懂多少业务 × 会用多少工具 × 能用的多好</strong>。</p><p>下面这几件事，不是设想而是身边正在发生的：</p><ul><li><strong>我自己</strong>：原本要 7-8 人配合两个月的产品验证，现在一个人 4-10 天就能跑完一轮：写代码、做原型、出 PRD、写测试用例、跑数据全包。干活时桌面常常同时开着十几个 AI 对话窗口（当然我现在主要用终端），像随身带着一支微型团队</li><li><strong>一个全职妈妈</strong>，一个人撑起几十万粉的公众号 + 短视频账号矩阵，写稿、配图、剪辑、回评论、谈商务全自助；过去这种规模，是要养一支编辑部加一个 MCN 的</li><li><strong>一个 16 岁的高中生</strong>，独立做出上架应用商店的 App，下载量破万；过去这是科班毕业的程序员才敢挑的活</li><li><strong>一对 60 岁的老夫妻</strong>，零基础开起一家网店，选品、拍照、写文案、做直播全自己上手；过去这是一家小公司全员的活，他们靠一台手机一台电脑就转起来了</li><li><strong>一个普通公司的白领</strong>，下班后用 AI 接品牌咨询的活，副业月入逼平主业；过去这种活，得挂着一家咨询公司的牌子才接得下来</li></ul><p>AI 不会取代团队，但它确实大幅压低了「独立完成一件复杂事情」的门槛，<strong>它在延长每个人的能力半径</strong>。你不需要成为每个领域的专家，只需要把任务描述清楚、交给 AI、再把关质量。</p><p><img src="/img/ai-usage-tips/fig1.png" alt=""></p><hr><h2 id="heading-4">四、别许愿，下指令</h2><p>很多人用 AI，其实是在「许愿」：</p><blockquote><p>「帮我写一篇好文章」<br>「给我出个方案」<br>「解释写个视频脚本」</p></blockquote><p>这就像你对一个刚入职的实习生说「把这事儿办好」，他不知道你要什么标准、给谁看、什么风格、哪些不能碰。</p><p>AI 不是阿拉丁神灯。它是一个极其勤快、但<strong>不了解你脑子里潜台词</strong>的同事。你给的指令越像一份「作业要求」，它交回来的东西，就越像样。</p><p>用了这么多年，我自己稳定下来的还是最朴素的一套：</p><pre><code class="highlight plaintext">[角色] 你是 ___（[背景] 现在的情况是 ___[任务] 请帮我 ___[要求] 输出需要 ___（长度 / 语气 / 禁区 / 格式）</code></pre><p>举个例子。不要说「帮我写个会议通知」，而是：</p><ul><li><strong>角色</strong>：你是一个资深行政助理</li><li><strong>背景</strong>：公司下周三要开季度复盘会，地点xxxx，人员xxxx…</li><li><strong>任务</strong>：撰写正式的会议通知，格式要求：xxxx…</li><li><strong>要求</strong>：包含时间地点议程，语气正式，500 字以内</li></ul><p>就这四句话的差别，输出质量能从 40 分直接跳到 75 分。</p><p>（朴素，但有效。AI 不需要花活，需要的是清楚。）</p><p><img src="/img/ai-usage-tips/fig2.png" alt=""></p><hr><h2 id="heading-5">五、修改你的指令，而不是结果</h2><p>这一条特别送给有专业能力的朋友。</p><p>AI 出了一个 60 分的稿子，你手痒改两下变成 80 分，改着改着变成全部重写，最后说「还是我自己来吧」，从此再也不用 AI。</p><p>我见过太多人这么弃坑。</p><p>正确的做法是：当输出不满意时，<strong>不要去改它的结果，去改你的指令</strong>。</p><ul><li>加更明确的角色定义</li><li>给参考范例（「模仿这个风格」）</li><li>设定禁区（「不要用这些词」）</li><li>拆分步骤（「先列大纲我确认，再展开写」）</li></ul><p>你的目标不是让 AI 一次输出 100 分，而是让这套工作流能稳定输出 75-80 分；剩下的 20 分，由你来做最终判断和润色。</p><p><strong>迭代流程，而不是迭代结果。</strong></p><hr><h2 id="heading-6">六、同一个问题，前期至少问三个 AI</h2><p>我对刚开始上手 AI 的朋友的第一条建议是：<strong>前期同一个问题，至少抛给三个 AI</strong>。</p><p>每个模型都有自己的「性格」：</p><ul><li><strong>Claude</strong> 写东西有品味，推理扎实，但有时候太礼貌、太谨慎</li><li><strong>ChatGPT</strong> 万金油，创意发散好，但容易「编得很像真的」</li><li><strong>Gemini</strong> 搜索整合强，适合做信息密集型的初步调研</li><li><strong>DeepSeek、Kimi</strong> 这些国产模型，在中文语境下有各自的优势</li></ul><p>你不需要选出「最强模型」，你要的是<strong>长出手感</strong>：知道什么任务适合交给谁、谁出「第一稿」、谁做「审稿人」。这事和管理一个小团队没什么两样，得了解每个人的长板和短板。</p><p>（顺带一提：这条和上一条不冲突。前期多模型横评是为了「选人」，进入稳定工作流后该锁定主力就锁定主力；横评不是用来代替「改流程」的。）</p><p>过程可能要一两周。但一旦手感出来，效率提升是质变的。</p><p><img src="/img/ai-usage-tips/fig3.png" alt=""></p><hr><h2 id="heading-7">七、把大任务拆成小步骤</h2><p>AI 最大的优势不是「一步到位给你正确答案」，而是它能<strong>在你设计的流程里，稳定地完成很多小步骤</strong>。</p><p>你越是要它一口气搞定一个复杂任务，它就越容易「看似完整、实则偷工减料」。</p><p>比如要 AI 帮你写一份产品需求文档，不要说「帮我写个 PRD」。而是拆：</p><ol><li>先描述用户场景与待解决的问题</li><li>输出产品目标和核心衡量指标</li><li>拆出主要功能模块的优先级</li><li>单个模块再展开用户故事 / 流程 / 边界</li><li>最后让它检查一遍逻辑漏洞</li></ol><p>每一步都是一个明确的小任务，AI 在小任务上的完成度，远高于「一步登天」。</p><p>这套思路的本质，<strong>不是教 AI 一句万能咒语，而是教你自己一套工作流</strong>。</p><hr><h2 id="heading-8">八、让它多产几个版本，再挑</h2><p>只让 AI 给你一个答案，你拿到的通常是最中庸、最保险、最「AI 味」的那一个，就是那种四平八稳、没有人味、什么都对又什么都不痛不痒的腔调。</p><p>我自己的习惯是：</p><ul><li>写文案标题？一次要 10 个</li><li>写小红书笔记？一次出 5 个版本</li><li>做创意选题？一次要 30-50 个，再分组筛选</li><li>起产品名称？一次要 20 个，按不同风格分类</li></ul><p><strong>用数量对抗平庸。</strong> 当你把平均分和产量都提上来，分布里自然会冒出几个让你眼前一亮的好东西。</p><p>这套思路，其实和互联网做增长是同一套底层：A/B Test 的本质，就是用数量和概率去取代「拍脑袋」。</p><p><img src="/img/ai-usage-tips/fig4.png" alt=""></p><hr><h2 id="heading-9">九、把材料喂干净，再让它干活</h2><p>很多人用 AI 时有个反直觉的误区：用 100 字的提示词，要求它写出 3000 字的文章。这就像让一个手头什么资料都没有的人凭空写论文，出来的东西注定是泛泛而谈的水货。</p><p>正确的做法反过来：</p><blockquote><p><strong>给它海量材料，让它帮你压缩、提炼、组织。</strong></p></blockquote><p>把会议录音转录稿、行业报告、竞品分析、客户反馈都喂进去，让它从中提取关键信息、整理结构、输出摘要。压缩比扩张容易：把 10 万字压到 1 万字，AI 做得很好；把 100 字扩到 1 万字，十有八九是灌水。</p><p>但喂材料也有讲究：AI 会走最省力的路径。给它一个 PDF，它可能只扫了个目录就开始编；给它一个网页链接，它可能根本没真正读完。</p><p>所以你要替它做一点「体力活」：</p><ul><li>PDF、网页内容，先转成纯文本或 Markdown；导航、广告、格式噪音，先去掉</li><li>长文章，先人工分段，明确告诉它「以下是第一部分，请先处理这部分」</li><li>图片内容，用文字描述补充，AI 对图片的理解远不如文字</li></ul><p>你愿意做一点点准备，AI 的智力输出就会锋利很多。<strong>就像你给实习生准备好整理过的资料包，他干活效率自然高。</strong></p><p><img src="/img/ai-usage-tips/fig5.png" alt=""></p><hr><h2 id="heading-10">十、从你身边的小问题开始</h2><p>不要上来就想着「让 AI 帮我重构整个业务」。<strong>从身边的「小问题」入手</strong>，是更靠谱的开场。</p><p>通用场景：</p><ul><li><strong>整理会议纪要</strong>：把录音转录稿扔进去，让它提炼要点和待办</li><li><strong>润色一封邮件</strong>：把草稿给它，告诉它受众和语气</li><li><strong>快速了解一个陌生领域</strong>：让它用「教小白」的方式给你讲</li><li><strong>批量起标题 / 文案</strong>：给它范例和要求，一次出 10 个再挑</li><li><strong>写 Excel 公式</strong>：用自然语言描述你要什么，让它替你写，让它替你整理报告</li><li><strong>翻译或改写</strong>：中文改成英文商务邮件、技术文档改成产品文案</li></ul><p>针对不同朋友的「第一个任务」：</p><ul><li><strong>做销售的</strong>：把客户公司官网、朋友圈最近 10 条、最近一篇公众号扔进去，让 AI 列 3 个谈资切入角度和对方可能关心的痛点</li><li><strong>做内容的</strong>：把你过去 10 篇阅读量最高的文章丢进去，让 AI 总结你的风格画像，再用这个画像生成新选题</li><li><strong>做产品的</strong>：把竞品 App 的评论区爬下来，让 AI 分类整理「用户最骂什么、最爱什么」</li><li><strong>纯粹好奇的</strong>：找一本你想读但一直没空读的书，让 AI 当陪练，每天给你讲一章 + 出 3 个思考题</li></ul><p>每一个小任务都能帮你省 15-30 分钟。一天做三四个，加起来就是一两个小时。<strong>用得越多，手感越好，你也会越清楚什么时候该用、什么时候不该用。</strong></p><hr><h2 id="heading-11">十一、现在就开始，不要等「更好的 AI」</h2><p>这三年看过无数 AI 产品的起起落落，有一个规律非常明确：</p><blockquote><p><strong>真正从 AI 中获益的人，都是在它「还不够好」的时候就开始用的人。</strong></p></blockquote><p>不要等完美的模型出来，不要等最佳实践固化。AI 每隔几个月就有一次大升级，但你和它协作的「手感」，是要靠时间慢慢积累的：</p><ul><li>知道什么任务值得交给 AI</li><li>知道怎么描述需求才能得到好结果</li><li>知道什么时候该追问，什么时候该换个模型</li><li>知道什么时候该自己动手</li></ul><p><strong>这些经验没有捷径，只能靠用。</strong></p><p>模型会迭代，工具会更新；但你对 AI 的理解和驾驭能力，是真正属于你的资产。就像二十年前学电脑、十年前学智能手机一样，早用早受益，越用越顺手。</p><hr><h2 id="heading-12">写在最后</h2><p>AI 不是魔法，也不是骗局。它是一个正在快速变强的工具。</p><p>和所有工具一样，它放大的是使用者本身的能力。你有好的判断力、好的品味、好的业务理解，AI 就能帮你把这些十倍放大；反过来，你什么都没有，只是对着它许愿，它也只能还你一堆看似正确的废话。</p><blockquote><p><strong>材料 × 品味 × 工具使用能力</strong></p><p>——这才是 AI 时代一个人的真正产出公式。</p></blockquote><p><img src="/img/ai-usage-tips/fig6.png" alt=""></p><p>希望这篇对你有用。有问题，随时找我聊。</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>内部分享 PPT 与文档：浅析 SEO 排名优化技巧</title>
      <link>https://imzl.com/seo-ppt-document</link>
      <description>
        <![CDATA[<p>最近 SEO 又火起来了特别是在出海圈，很多朋友私底下在频繁咨询我。故放出 17 年在微脉内部做的一次 SEO 分享 PPT 和相关文档。内容比较古早，但基本涵盖 SEO 的核心，在如今用于实战依旧有效，希望能帮助到有需要的朋友。</p>
<p>(地榆是我的花名，别笑…)<]]>
      </description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/operations/">运营</category>
      <category domain="https://imzl.com/categories/share/">分享</category>
      <category domain="https://imzl.com/tag/seo/">SEO</category>
      <category domain="https://imzl.com/tag/pdf/">PDF</category>
      <pubDate>Fri, 23 Aug 2024 06:44:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>最近 SEO 又火起来了特别是在出海圈，很多朋友私底下在频繁咨询我。故放出 17 年在微脉内部做的一次 SEO 分享 PPT 和相关文档。内容比较古早，但基本涵盖 SEO 的核心，在如今用于实战依旧有效，希望能帮助到有需要的朋友。</p><p>(地榆是我的花名，别笑…)</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"></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">SEO 分享 PPT 下载</a></p><p>SEO 基础规范文档：<a href="https://shimo.im/doc/aLMG4FtoLZ8JRoKC">https://shimo.im/doc/aLMG4FtoLZ8JRoKC</a></p><p>SEO 相关的尬聊：<a href="https://shimo.im/doc/7GVFl8rwU2snuY6X%C2%B7">https://shimo.im/doc/7GVFl8rwU2snuY6X·</a></p>]]>
      </content:encoded>
    </item>
    <item>
      <title>使用 Cloudflare Workers 为 Bento.me 设置自定义域名</title>
      <link>https://imzl.com/bento-add-domain</link>
      <description>
        <![CDATA[<p><a href="http://Bento.me">Bento.me</a> 是一个零代码创建个人主页的平台，以优雅美观的界面和使用简单而闻名。</p>
<p>但它唯一的缺点是：<strong>不支持自定义域名</strong></p>
<p>但别担心，本文将用最简单、零成]]>
      </description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/experimentation/">折腾</category>
      <category domain="https://imzl.com/tag/cloudflare/">Cloudflare</category>
      <category domain="https://imzl.com/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> 是一个零代码创建个人主页的平台，以优雅美观的界面和使用简单而闻名。</p><p>但它唯一的缺点是：<strong>不支持自定义域名</strong></p><p>但别担心，本文将用最简单、零成本的方式，帮助你为 <a href="http://Bento.me">Bento.me</a> 绑定自定义域名。</p><h2 id="heading-1">1. 提前准备</h2><ol><li>你需要有一个 <a href="http://Bento.me">Bento.me</a> 个人页面</li><li>注册/准备一个 Cloudflare 账号</li><li>拥有独立域名，并将其转移至 Cloudflare 管理 DNS</li></ol><h2 id="heading-2">2. 创建 cloudflare Worker 项目</h2><p>在终端中输入以下命令，创建一个基础的 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="终端操作"></p><p>然后按照终端内说明进行操作：</p><ul><li><p>In which directory do you want to create your application? 你现在哪个目录创建应用</p><ul><li><strong>默认或者自定义都可</strong></li></ul></li><li><p>What type of application do you want to create? 你想创建什么类型的应用？</p><ul><li><strong>选择 “Hello World” Worker 即可</strong></li></ul></li><li><p>Do you want to use TypeScript? 你想使用 TypeScript 吗？</p><ul><li><strong>选择 NO（用键盘→选择）</strong></li></ul></li><li><p>Do you want to use git for version control? 你想使用 Git 进行版本控制吗？</p><ul><li><strong>选择 Yes</strong></li></ul></li><li><p>Do you want to deploy your application? 你想部署应用么？</p><ul><li><strong>选择 Yes（如果你第一次使用，会自动打开网页要求登录）</strong></li></ul></li></ul><p>完成后对应目录会出现一个文件夹，使用 Visual Studio Code 等代码编辑工具打开这个文件夹。</p><h2 id="heading-3">3. 设置环境变量</h2><ol><li>编辑 <code>wrangler.toml</code> 文件，在末尾添加下列内容：</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"># 替换为你的 Bento 页面 ID，我的是 bento.me/len</span><span class="attr">BASE_URL</span> = <span class="string">&quot;https://bento.imzl.com&quot;</span> <span class="comment"># 替换为你的自定义域名</span></code></pre><ol start="2"><li>在文件夹根目录创建 <code>.dev.vars</code> 文件，黏贴下列内容：</li></ol><pre><code class="highlight ini"><span class="attr">BENTO_USERNAME</span>=<span class="string">&quot;len&quot;</span> <span class="comment"># 替换为你的 Bento 页面 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. 创建 Worker</h2><ol><li>编辑 <code>/src/index.js</code> 文件，替换为下列内容：</li></ol><pre><code class="highlight js"><span class="comment">/*</span><span class="comment"> * 为 Bento.me 设置自定义域名</span><span class="comment"> * 作者：len</span><span class="comment"> * 详情：https://imzl.com/bento-add-domain</span><span class="comment"> * 源代码来源：https://jayfranco.hashnode.dev/</span><span class="comment"> */</span><span class="comment">// 事件监听</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">// 发生 fetch 事件时，用 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">// 根据内容类型解析响应</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">// 如果没有内容类型，响应以文本形式返回</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">// 根据内容类型不同，采取不同的操作</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">// 如果是 JSON，以 JSON 字符串形式返回</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">// 如果是 HTML，则使用 HTMLRewriter 对 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">// 自定义 CSS 和 JS 可添加到 HTML 页面中</span>            element.<span class="title function_">append</span>(              <span class="string">`</span><span class="string">                &lt;style&gt;</span><span class="string">                  // 在这里输入你需要的自定义 CSS</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">                  // 在这里输入你需要的自定义 JS</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">// 转换后的 response 以文本形式返回</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">// 如果内容类型是字体，响应将以 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">// 如果内容类型是图片，响应将以 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">// 如果内容类型是其他类型，响应将以文本形式返回</span>      <span class="keyword">return</span> <span class="keyword">await</span> response.<span class="title function_">text</span>();  &#125;&#125;<span class="comment">// 处理所有请求的函数</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">// 从请求 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">// 默认情况下，URL 设置为 &quot;https://bento.me&quot; + 路径</span>  <span class="keyword">let</span> url = <span class="string">&#x27;https://bento.me&#x27;</span> + path;  <span class="comment">// 如果路径包含&#x27;v1&#x27;，URL 将更改为 &#x27;https://api.bento.me&#x27; + 路径</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">// 如果 URL 为 &quot;https://bento.me/&quot;，URL 将更改为 https://bento.me/&#x27; 后加上 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">// 为 fetch 请求定义基本的 headers</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">// 使用定义的 headers 获取 URL</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">// 从响应 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">// 根据内容类型解析响应</span>  <span class="keyword">let</span> results = <span class="keyword">await</span> <span class="title function_">parseResponseByContentType</span>(response, contentType);  <span class="comment">// 如果结果不是 ArrayBuffer</span>  <span class="comment">// 将所有对 bento API 的调用替换为我们的 BASE_URL</span>  <span class="comment">// 这是解决 CORS 错误的临时方案</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">// 将内容类型添加到 headers</span>  headers[<span class="string">&#x27;content-type&#x27;</span>] = contentType;  <span class="comment">// 返回带有结果和 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>通过终端进入文件夹，运行代码查看页面：</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>查看无误后，部署到正式环境</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. 在 Cloudflare 配置自定义域名</h2><ol><li>先确保你需要绑定的域名 DNS 已经设置为 Cloudflare；</li><li>进入「Workers 和 Pages」找到刚才 Push 的 Worker 项目；</li><li>在「设置 - 触发器」中添加自定义域名并等待生效即可；</li><li>现在，你可以访问 <a href="https://bento.imzl.com">bento.imzl.com</a> 查看我们的 Bento 页面了。</li></ol>]]>
      </content:encoded>
    </item>
    <item>
      <title>Crypto 阅读列表</title>
      <link>https://imzl.com/crypto-reading</link>
      <description>一部分推荐阅读的 Crypto 相关文章列表，涵盖整个 Crypto 的周期性思考，建议按时间顺序阅读。</description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/crypto/">Crypto</category>
      <category domain="https://imzl.com/tag/crypto/">Crypto</category>
      <pubDate>Tue, 06 Feb 2024 23:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>以下是一部分推荐阅读的 Crypto 相关文章列表，从 <a href="https://danromero.org/crypto-reading/">Dan Romero</a> Blog 复制过来的，以英文为主我已经把标题翻译为中文，建议按时间顺序阅读：</p><h2 id="heading-1">2008</h2><ul><li><a href="https://bitcoin.org/bitcoin.pdf">Bitcoin：一个点对点的电子现金系统</a> — 万物初始，Bitcoin 白皮书，由化名为「中本聪」的家伙撰写</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">我为什么对比特币感兴趣</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/">为什么比特币重要</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 以太坊是数字货币的前沿</a> — by Fred Ehrsam</li><li><a href="https://www.usv.com/writing/2016/08/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">Token 模型的价值</a> — by Fred Ehrsam</li><li><a href="https://blog.coinbase.com/a-beginners-guide-to-ethereum-46dd486ceecf">Ethereum 以太坊初学者指南</a> — by Linda Xie</li><li><a href="https://medium.com/@VitalikButerin/the-meaning-of-decentralization-a0c92b76a274">去中心化的意义</a> — by Vitalik Buterin</li><li><a href="https://news.earn.com/thoughts-on-tokens-436109aabcbe">关于 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> — by Chris Dixon</li><li><a href="https://vitalik.eth.limo/general/2017/06/09/sales.html">分析 Token 销售模型</a> — by Vitalik Buterin</li><li><a href="http://blog.eladgil.com/2017/07/cryptocurrencys-netscape-moment.html">加密货币的 Netscape 时刻</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">企业的缓慢消亡</a> — by Nick Tomaino</li><li><a href="http://blog.eladgil.com/2017/08/big-banks-and-blockchain.html">大银行与区块链</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">为什么去中心化很重要</a> — by Chris Dixon</li><li><a href="https://balajis.com/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">稳定币：设计一个价格稳定的加密货币</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/">是的，你可能需要一个区块链</a> — by Balaji Srinivasan</li><li><a href="https://lindajxie.com/2019/08/07/the-future-of-decentralized-finance/">去中心化金融的未来</a> — by Linda Xie</li><li><a href="https://www.youtube.com/watch?v=Dur918GqDIw">匿名经济</a> — by Balaji Srinivasan</li></ul><h2 id="heading-9">2020</h2><ul><li><a href="https://nakamoto.com/credible-neutrality/">可信中立性作为指导原则</a> — by Vitalik Buterin</li><li><a href="https://blog.coinbase.com/a-beginners-guide-to-decentralized-finance-defi-574c68ff43c4">初学者指南：去中心化金融（DeFi）</a> — by Sid Coelho-Prabhu</li><li><a href="https://variant.fund/writing/the-ownership-economy-crypto-and-consumer-software">所有权经济</a> — by Jesse Walden</li><li><a href="https://www.matthuang.com/bitcoin_for_the_open_minded_skeptic">为持开放怀疑态度的人们讲解比特币</a> — by Matt Huang</li><li><a href="https://www.paradigm.xyz/2020/06/creators-communities-and-crypto">创作者、社区与 Crypto</a> — by Fred Ehrsam</li><li><a href="https://medium.com/dragonfly-research/what-explains-the-rise-of-amms-7d008af1c399">是什么导致了 AMMs 自动做市商的兴起？</a> — by Haseeb Qureshi</li><li><a href="https://www.paradigm.xyz/2020/08/ethereum-is-a-dark-forest">Ethereum 以太坊是黑暗森林</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">在 Crypto 周期中生存</a> — by Fred Ehrsam</li><li><a href="https://www.notboring.co/p/the-value-chain-of-the-open-metaverse">开放元宇宙的价值链</a> — by Packy McCormick</li><li><a href="https://research.paradigm.xyz/MEV">MEV（最大可提取价值）和我</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">NFT 和 1000 名忠实粉丝</a> — by Chris Dixon</li><li><a href="https://linda.mirror.xyz/Vh8K4leCGEO06_qSGx-vS5lvgUqhqkCz9ut81WwCP2o">初学者指南：去中心化自治组织（DAO）</a> — by Linda Xie</li><li><a href="https://vitalik.eth.limo/general/2021/03/23/legitimacy.html">最重要的稀缺资源是合法性</a> — by Vitalik Buterin</li><li><a href="https://www.notboring.co/p/the-great-online-game">伟大的在线游戏</a> — by Packy McCormick</li><li><a href="https://balajis.com/p/add-crypto-to-indiastack">印度与 Crypto</a> — by Balaji Srinivasan</li><li><a href="https://www.notboring.co/p/own-the-internet">拥有互联网</a> — by Packy McCormick</li><li><a href="https://twitter.com/cdixon/status/1442201621266534402">为什么 Web3 很重要</a> — by Chris Dixon</li><li><a href="https://future.a16z.com/how-composability-unlocks-crypto-and-everything-else/">可组合性即创新</a> — by Linda Xie</li><li><a href="https://gubsheep.substack.com/p/the-strongest-crypto-gaming-thesis">最强的 Crypto 游戏论点</a> — by gubsheep</li><li><a href="https://vitalik.eth.limo/general/2021/12/06/endgame.html">终局</a> — by Vitalik Buterin</li><li><a href="https://cobie.substack.com/p/trading-the-metagame">交易 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">白话比特币原理及运作机制</a> — by 张洋</li></ul><h2 id="heading-11">2022</h2><ul><li><a href="https://www.1confirmation.com/2021-nft-annual-review">2021 NFT 年度回顾</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">社交网络的去中心化</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">《十币称侯》</a> — by 王一石</li></ul>]]>
      </content:encoded>
    </item>
    <item>
      <title>Atomicals 挖矿程序部署与钱包管理</title>
      <link>https://imzl.com/atomicals-mining</link>
      <description>零基础 Atomicals 挖矿程序部署与钱包管理教程，帮助你从零开始获取 Atomicals BTC 铭文资产。</description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/crypto/">Crypto</category>
      <category domain="https://imzl.com/tag/atomicals/">Atomicals</category>
      <category domain="https://imzl.com/tag/mining/">挖矿</category>
      <pubDate>Tue, 26 Dec 2023 17:13:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h2 id="heading-1">部署</h2><ol><li>安装 <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> //这是创建钱包命令</li></ol><p>最后一步是创建钱包，命令运行后，会在文件夹内生成一个 wallet.json 文件，保存着助记词和私钥，请务必保存好该文件。</p><p>创建钱包后，会自动生成两个地址，Primary Address 及 Funding Address：</p><p><strong>Primary</strong>：用于接收Atomicals生态资产<br><strong>Funding</strong>：用于铸造（挖矿）过程的中转钱包，通常是往 Funding 地址中存入相应数量的 BTC，用于铸造相应资产。</p><h2 id="heading-2">常用指令</h2><h3 id="heading-3">铸造 FT 命令：</h3><p><code>yarn cli mint-dft dmint --satsbyte 30</code></p><p><code>yarn cli mint-dft quark --satsbyte=100</code></p><p>dmint 和 quark 是 token 名称，请修改成相对应 FT 资产名称。<br>satsbyte 是矿工费设置，设置 100 即为 100聪/KB 的费用 Mint 对应资产。</p><h3 id="heading-4">铸造图片NFT命令：</h3><p><code>yarn cli mint-nft &quot;\punk0000.png&quot; --satsbyte 30 --satsoutput 1000 --bitworkc 233</code></p><h3 id="heading-5">查询余额命令：</h3><p><code>npm run cli balances</code></p>]]>
      </content:encoded>
    </item>
    <item>
      <title>Starknet 早期社区成员计划申请指南</title>
      <link>https://imzl.com/starknet-ecmp</link>
      <description>Starknet 早期社区成员计划申请指南，帮助 Starknet 社区每一个成员快速了解 ECMP 内容与申请途径。</description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/crypto/">Crypto</category>
      <category domain="https://imzl.com/tag/starknet/">Starknet</category>
      <category domain="https://imzl.com/tag/communal/">社区</category>
      <pubDate>Wed, 01 Nov 2023 13:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>Starknet，这个在ETH L2 中迅速崛起的名字，如今正通过其新推出的早期社区成员计划（ECMP）为其社区成员提供前所未有的机遇。这个计划不仅仅是关于技术贡献，更是关于每一个助力 Starknet 生态系统前进的个人。</p><p>作为一个坚定的 Starknet 支持者，我认为这是一个独一无二的机会，可以让社区成员，无论是开发者、内容创作者、会议组织者还是技术讨论的积极参与者，都得到认可和奖励。</p><h2 id="heading-1">申请过程和时间线</h2><p>申请开始于 2023 年 10 月 30 日，截止到 11 月 23 日。评审委员会将在 12 月 29 日做出决定。感兴趣的个人和项目都应当在此期间提交申请。</p><h2 id="heading-2">谁可以申请？</h2><p>ECMP 面向那些积极贡献于 Starknet 生态系统的个人。无论是通过技术讨论、组织活动、发布品牌内容，还是以其他方式，所有为生态系统增添活力和资源的个人都应当考虑申请。</p><h2 id="heading-3">评估标准</h2><p>评估标准包括影响力、重要性、努力程度和原创性。这意味着不仅仅是代码行数，还包括你对社区的影响、你的工作对项目的重要性、你付出的努力，以及你的工作的独创性。</p><h2 id="heading-4">申请过程</h2><p>项目和个人都需要通过提供的链接提交申请，包括 Telegram ID、电子邮件和 Starknet 钱包地址。每个项目和个人都将由委员会进行评估。</p><p>申请地址：<a href="https://ecmp.starknet.io/form-individual">https://ecmp.starknet.io/form-individual</a></p><p>Starknet 官方公告：<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">注意事项</h2><p>重要的是，受制裁的人员或居住在受制裁国家的人员，以及与美国相关的人士，都不符合参与条件。</p><p>这个计划是 Starknet 社区成长和发展的重要一步。它不仅奖励那些默默无闻的英雄们，也鼓励更多的人加入并为这个生态系统贡献力量。如果你是 Starknet 的忠实支持者，请不要错过这个机会。</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>如何绕过烦人的 hCaptcha 验证</title>
      <link>https://imzl.com/disabling-hcaptcha</link>
      <description>了解 hCaptcha 的绕过方法：如何简化人机验证过程并避免频繁、无意义的图像验证。立即阅读，轻松绕过 hCaptcha 验证</description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/experimentation/">折腾</category>
      <category domain="https://imzl.com/tag/skill/">技巧</category>
      <category domain="https://imzl.com/tag/hcaptcha/">hcaptcha</category>
      <category domain="https://imzl.com/tag/captcha/">验证码</category>
      <pubDate>Tue, 16 May 2023 20:15:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h2 id="heading-1">什么是 hCaptcha？</h2><p>hCaptcha 是一种人类验证服务，类似于 Google reCAPTCHA。它旨在识别并区分人类用户和机器人，并帮助防止常见的 Web 自动化攻击，如 DoS、恶意机器人攻击和无节制的 Web 爬取。</p><p>从我自己的体验来说，hCaptcha 对机器人有没有拦截我不清楚，但对正常人类来了极大的不便。我们想个办法，绕过 hCaptcha 及其频繁、无意义的图像验证：</p><h2 id="heading-2">通过无障碍服务，绕过 hCaptcha 验证</h2><ol><li><p>通过 <a href="https://dashboard.hcaptcha.com/signup?type=accessibility">这个链接</a> 注册无障碍服务，请填写真实可用的邮箱地址；</p></li><li><p>使用邮箱收件，通过邮件中的「Get Accessibility Cookie」按钮打开链接，请注意链接应该是如下例子这样：<br><code>https://accounts.hcaptcha.com/verify_email/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</code></p></li><li><p>通过链接获取 hCaptcha Cookie</p></li></ol><ul><li>点击按钮将会跳转到 hCaptcha 的设置页面</li><li>点击「Set Cookie」按钮，等按钮下方出现一行字「Cookie set.」时就完成了</li></ul><p>当下一次再遇到 hCaptcha 只需要点击验证框即可，不用再进行烦人的图片验证了</p><p>【注】hCaptcha 官方其实也对无障碍服务做了说明<a href="https://www.hcaptcha.com/accessibility">具体请查阅这里</a></p>]]>
      </content:encoded>
    </item>
    <item>
      <title>白话比特币原理及运作机制</title>
      <link>https://imzl.com/bitcoin-principle</link>
      <description>
        <![CDATA[<p>最近在整理 Crypto 的资料，搜索到张洋的这篇文章，可能是写的最好的比特币原理及运作机制讲解故事，故转载至此进行分享。</p>
<p>这篇文章的定位会比较科普，尽量用类比的方法将比特币的基本原理讲出来，不会涉及算法和协议中细节的部分。</p>
<p>文中会给出一个虚拟的]]>
      </description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/crypto/">Crypto</category>
      <category domain="https://imzl.com/tag/bitcoin/">Bitcoin</category>
      <category domain="https://imzl.com/tag/finance/">金融</category>
      <category domain="https://imzl.com/tag/currency/">货币</category>
      <category domain="https://imzl.com/tag/repost/">转载</category>
      <pubDate>Thu, 25 Nov 2021 00:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>最近在整理 Crypto 的资料，搜索到张洋的这篇文章，可能是写的最好的比特币原理及运作机制讲解故事，故转载至此进行分享。</p><p>这篇文章的定位会比较科普，尽量用类比的方法将比特币的基本原理讲出来，不会涉及算法和协议中细节的部分。</p><p>文中会给出一个虚拟的村庄叫「比特村」，整体以讲故事的方式，逐步告诉大家比特币提出的动机、解决了什么问题以及一些关键组件的目标和设计方案。</p><h2 id="heading-1">以物易物的比特村</h2><p>话说在这个世界上，有一个叫比特村的小村庄，村庄共有几百户人家。这个村庄几乎与世隔绝，过着自给自足的生活。由于没有大规模贸易，比特村村民一直过着以物易物的生活，也就是说村民之间并没有使用统一的货币，互相间的贸易基本上就是老张家拿一袋面粉换老李家一只羊，王大嫂拿一筐野果换刘大婶两尺布。村民们一直就这么纯朴的生活着。</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783546-bitcoin-mechanism-01.png" alt=""></p><h2 id="heading-2">实物货币</h2><p>终于有一天，村民觉得一直这样以物易物实在太不方便了，于是村子全员开会，讨论如何解决这个问题。有人提议，以便于分割且稀有的东西，例如黄金，作为一般等价物，把其它物品和黄金的对应关系编成一张表格，例如一克黄金对应一只羊，一克黄金对应一袋面粉等等，此时老张再也不用扛着一袋面粉气喘吁吁的去老李家换羊了，他只要从家里摸出一克金子，就可以去老李家牵回一只羊，而老李拿着这一克黄金可以从任何愿意出让面粉的人那里换回一袋面粉，当然也可以换取任何和一克黄金等值的物品。</p><p>此时比特村进入了实物货币时代。</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783620-bitcoin-mechanism-02.png" alt=""></p><h2 id="heading-3">符号货币</h2><p>好景不长，过了一段时间，实物货币的弊端也出现了。因为比特村附近金矿并不多，开采和冶炼金子太费时费力了。而随着使用，金子总是不断会因为磨损、丢失或有人故意囤积而发生损耗。全村人又一次坐在了一起，开始商讨对策。此时有人说，其实大家也不必一定要真的用黄金啊，随便找张纸，写上“一克黄金”，只要全村人都认同这张纸就等于一克黄金，问题不就解决了。其他人纷纷表示认同，但同时也有了新的问题：真实的黄金是需要开采和冶炼的，金矿有限，开采和冶炼也需要成本，所以没有人可以短期凭空制造大量的黄金，可写字就不同了，只要我纸够笔够，随便像写多少写多少，那这就变成拼谁家里纸多了，搞不好到时一万张纸才能换一只羊（实际上这就发生了经济学上的通货膨胀）。</p><p>大家一想也是啊。不过此时又有人提出了解决方案：这个纸不是谁写都有效，我们只认村里德高望重的老村长写得，大家都认识老村长的字。老村长写一些纸，同时按照各家黄金存量发给大家等量的纸，例如老张家有二百克黄金，老村长就发给老张二百张写着“一克黄金”的纸，同时将老张家的黄金拿走作为抵押。就这样，老村长将村里所有黄金收归到自己的家里，并按各家上交的黄金数量发给等值的写有字的纸。此时村民就可以拿着这些纸当黄金进行贸易了，而且大家都认得老村长的字，其他人伪造不出来。另外，如果谁的纸磨损太严重，也可拿到老村长那里兑换新的等值的纸，另外老村长承诺任何人如果想要换成真黄金，只要拿纸回来，老村长就会把等值的黄金还给那人。因为老村长写得纸的黄金量和真实放在家里的黄金量是一样的，所以只要严格按照销毁多少纸新写多少纸的原则，每一张有效的纸总能换回相应的真黄金。</p><p>此时，比特村进入了符号货币（纸币）时代。而老村长就承担了政府和银行的角色。</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783682-bitcoin-mechanism-03.png" alt=""></p><h2 id="heading-4">中央系统虚拟货币</h2><p>又过了几年，老村长由于每天都要核对大量的旧纸币，写新的纸币，还要把各种账目仔细做好记录。一来二去，老村长操劳过度不幸驾鹤西去了。</p><p>比特村再次召开全体大会，讨论应该怎么办。此时老村长的儿子二狗子自告奋勇接过了父亲的笔，承担起货币发行的责任。这个年轻的村长二狗子很聪明，他做了几天，发现好像也不用真的写那么多纸。完全可以这样：村民把纸币都交上来，销毁，但是二狗子会记录下每户上交的纸币数量。以后如果要进行付钱，例如老张要拿一克金子向老李换一只羊，就一起给二狗子打个电话，说明要将老张名下的一克金子划归老李名下，二狗子拿出账本，看看老张名下是否有一克金子，如果有就在老张的名下减掉一克，在老李的名下加上一克，这样就完成了支付，此时老李在电话中听到二狗子确认转账完成，就可以放心让老张把羊牵走了。</p><p>此时比特村进入了中央系统虚拟货币时代。每个村民都不需要用实物支付，支付过程变成了二狗子那边维护的账本上数字的变更。</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783714-bitcoin-mechanism-04.png" alt=""></p><h2 id="heading-5">分布式虚拟货币</h2><p>这新上任的二狗子是聪明，不过这人有时候是聪明反被聪明误。有一天二狗子盯着这账本，心想这全村各户谁有多少钱就是我说的算，那我岂不是……。于是他头脑一热，私自从老张帐下划了十克金子到自己名下。</p><p>本以为天衣无缝，但没想到老张也有记账的习惯，有一天他正要付钱却被二狗子告知账户没钱了。老张核对了一下自己的账本，明明还有十克啊，于是拿着账本去找二狗子理论，这一核对发现了那笔未经老张同意的转账。</p><p>东窗事发！比特村炸开锅了。二狗子被弹劾是不可避免了，不过通过这件事，大家发现了账本集中在一个人手里的弊端：</p><ul><li>这个体系完全依赖于账本持有人的个人信用，如果这个人不守规矩，随意篡改账本，那么整个货币系统就会崩溃</li><li>如果这个人家里失火或者账本失窃，同样也会为整个体系带来毁灭性的打击</li></ul><p>正当人们不知所措时，村里一个叫中本聪的宅男科学家走上了台，告诉大家他已经设计了一套不依赖任何中央处理人的叫比特币的虚拟货币系统，可以解决上述问题。然后他缓缓讲述了自己的方案。</p><p>下面我们就来看看中本聪同学是如何设计这套系统的。</p><h2 id="heading-6">基础设施搭建</h2><p>中本聪首先说明，要对现有账簿进行如下改造：</p><ol><li>账簿上不再记载每户村民的余额，而只记载每一笔交易。即记载每一笔交易的付款人、收款人和付款金额。只要账簿的初始状态确定，每一笔交易记录可靠并有时序，当前每个人持有多少钱是可以推算出来的。</li><li>账簿由私有改为公开，只要任何村民需要，都可以获得当前完整的账簿，账簿上记录了从账簿创建开始到当前所有的交易记录。<br>此言一出，下面立刻炸锅了。第一条还无所谓，但是第二条简直无法接受，因为账簿可是记录了所有村民的交易，这样大家的隐私不全暴露了吗。</li></ol><p>中本聪倒是不慌不忙，拿出了一对奇怪的东西。</p><h2 id="heading-7">身份与签名机制（公钥加密系统）</h2><p>中本聪说，大家不要慌。在他的这套机制下，任何人都不使用真实身份交易，而是使用一个唯一的代号交易。</p><p>他展示了手里神奇的东西，说这两件东西分别叫保密印章和印章扫描器。后面他会给村里每一户发一个保密印章和一个印章扫描器。两者的作用如下：</p><ul><li>保密印章可以在纸上盖一个章，每个印章盖出的章都隐含了一个全村唯一的一串字符，但是凭肉眼是看不出来的。也无法通过观察来制造出相应的印章。</li><li>印章扫描器可以扫描某个已经盖好的章，读出隐含的信息，并在液晶屏上显示出一串字符。<br>有了这两个神奇的东西，大家就可以在不暴露真实身份的情况下进行交易了，而印章隐含的那一串字符就是这户人家的代号。具体如何巧妙利用保密印章和印章扫描器进行交易，会在下文详述。</li></ul><p>成立虚拟矿工组织（挖矿群体）<br>下一步，中本聪面向全村招募虚拟矿工，招募要求如下：</p><ul><li>矿工以组为单位，一组可以是单独的一户，也可以是几户联合为一组</li><li>成为矿工不影响正常使用货币</li><li>矿工每天要花费一定时间从事比特币“挖矿”活动，但是不同于挖金矿，虚拟矿工不需要拿着工具去野外作业，在家里就可以完成工作</li><li>矿工有一定可能性获得报酬，在挖矿活动中付出的努力越多，获得报酬的可能性越大</li><li>矿工可以随时退出，也可以随时有新的矿工加进来<br>很快，大约有五分之一的村民加入比特币矿工组织，共分成了7个组。</li></ul><h2 id="heading-8">建立初始账簿（创世块）</h2><p>下面，中本聪宣布，先根据二狗子手里的账簿，把抵押的所有黄金按账簿记录的余额退还给每位村民，然后彻底销毁这本账簿。</p><p>然后，中本聪拿出一本新账簿，在账簿的第一页上记录了一些交易记录，特别的是，这些记录的付款人一栏全都是「系统」，而收款人分别是每个印章对应的隐含字符，代表初始时刻，系统为每一户默认分配了一定数量比特币，但是数量非常少，都只有几枚，甚至有些不幸的村户没有获得比特币。</p><p>接着中本聪说，由于目前市面上比特币非常少，大家可以先回到用黄金做货币的时代，由于我不是村长，我也没有权利强迫大家一定要承认比特币，大家可以自行决定要不要接受比特币。不过随着比特币的流动和矿工的活动，比特币会慢慢多起来。</p><h2 id="heading-9">支付与交易</h2><p>做了这么多铺垫，终于说到重点了，下面说一下在这样一个体系下如何完成支付。以老张付给老李10个比特币为例。</p><h3 id="heading-10">付款人签署交易单</h3><p>为了支付 10 个比特币，老张首先要询问老李的标识字符串，例如是「ABCDEFG」，同时老张也有一个标识字符串例如是「HIJKLMN」，然后老张写一张单子，内容为「HILKLMN 支付 10 比特币给 ABCDEFG」，然后用自己的保密印章改一个章，将这张单子交给老李。另外为了便于追溯这笔钱的来源，还要在单子里注明这笔钱的来源记在哪一页，例如这个单子里，老张的10比特币来自建立账簿时系统的赠送，记录在账簿第一页。</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783753-bitcoin-mechanism-05.png" alt=""></p><h3 id="heading-11">收款人确认单据签署人</h3><p>老李拿到这个单子后，需要确认这个单子确实是来自「HIJKLMN」这个人（也就是老张）签署的，这个并不困难。因为单子上必须有保密章，老李拿出印章扫描器，扫一下章，如果液晶屏显示出的字符和付款人字符是一致的（这里是「HIJKLMN」），就可以确认单子确实是付款人签署的。这是因为根据保密印章的机制，没有其他人可以伪造印章，任何一个人只要扫描一下印章，都可以确认单子的付款人和盖章人是否一致。</p><h3 id="heading-12">收款人确认付款人余额</h3><p>这个系统到目前还是很有问题。通过保密印章，收款人虽然可以确认付款人确实签署了这份单子，但是无法自行确认付款人是否有足够的余额支付。之前的中央虚拟货币系统中，二狗子负责检查付款人的余额，并通知收款人交易是否有效，现在把二狗子开了，谁来负责记账和确认每笔交易的有效性呢？</p><p>之前说过，中本聪设计的这个系统是分布式货币系统，不依赖任何中央人物，所以不会有一个或少数几个人负责这件事，最终承担这份工作的是之前所提到的矿工组织。老张、老李和全村其他任何使用比特币进行交易的村民都依赖矿工组织的工作才能完成交易。</p><h2 id="heading-13">矿工的工作</h2><p>矿工的工作是整个系统的核心，也是最复杂性最高的地方。下面逐步介绍矿工的工作内容和目的。</p><h3 id="heading-14">矿工的工具</h3><p>俗话说，工欲善其事，必先利其器。比特币矿工虽然不用铁撅、铁锨和探照灯等工具，不过也要有一些必备的东西。</p><p>初始账簿。每个组首先自己复制一份初始账簿，初始账簿只有一页，记录了系统的第一次赠送</p><p>空账簿纸。每个小组有若干账簿纸，每一页纸上仅有账簿结构，没有填内容，具体内容的书写规则后面讲述。下面是一张空账簿纸的样子，各个字段的意义后面会说到</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783804-bitcoin-mechanism-06.png" alt=""></p><p>编码生成器（哈希函数）。中本聪又向矿工组织的每个组分发了若干编码生成器，这个东西很神奇，将一页账簿填好内容的账簿纸放入这个机器，机器会在账簿纸的“本账单编号”一栏自动打印一串由“0”和“1”组成的编号，共256个。最神奇的是，编号生成器有如下功能：</p><ul><li>生成的编号仅与账簿纸上填入的内容有关，与填写人、字体、填写时间等因素均无关</li><li>内容相同的账簿纸生成的编号总是相同，但是如果内容哪怕只改一个字符，编号就会面目全非</li><li>编码生成器在打印编码时还需要将所有填入账簿纸的交易单放入，机器会扫描交易单和填入交易单的一致性，尤其是保密印章，如果发现保密印章和付款人不一致，会拒绝打印编码</li><li>将一张已打印的账簿纸放入，机器会判定编号是否是有效的机器打印，并且判定编号和内容是否一致，这个编号无法伪造</li><li>交易单收件箱。每个矿工小组需要在门口挂一个箱子用于收集交易单。</li><li>公告板。每个矿工小组同样需要一个公告板公示一些信息。</li></ul><p>有了上面的工具，矿工组织就可以开工了。</p><h3 id="heading-15">收集交易单</h3><p>中本聪规定，每笔交易的发起人，不但要将交易单给到收款人，还要同时复制若干份一模一样的交易单投递到每个矿工小组的收件箱里。</p><p>矿工小组的人定期到自己的收件箱里把收集到的交易单一并取出来。</p><h3 id="heading-16">填写账簿</h3><p>此时小组的人拿出一张空的账簿纸，把这些交易填写到“交易清单”一栏，同时找到当前账簿最后一页，将最后一页的编号抄写到“上一张账单编号一栏”。 注意还有个“幸运数字”，可以随便填上一个数字，如12345。然后，将这样账簿纸放入编号生成器，打印好编号，一张账簿就算完成了。</p><p>如果你以为矿工的工作就这么简单，那就大错特错了，中本聪有个变态的规定：只有编号的前10个数均为0，这页账簿纸才算有效。</p><p>根据之前对编号生成器的描述，要修改编号，只能修改账簿纸的内容，而“交易清单”和“上一张账簿纸编号”是不能随便改的，那么只能改幸运数字了。于是为了生成有效的账簿纸，小组里的矿工就不断抄写账簿纸，但每张纸的幸运数字都不同，然后不断的重复将纸放入编码器，如果生成的编号不符合规定，这张纸就算废了，重复这个过程直到生成一串有效的编号。</p><p>我们知道，如果编号的每一个数字都是随机的，那么平均写1000多张幸运数字不同的纸才能获得一个有效的编号。</p><p>这就奇怪了，这些矿工为什么要拼命干这看似无意义的事情呢？还记得之前说过矿工有报酬吧，这就是矿工的动力了。中本聪规定：每一张账簿纸的交易清单第一条交易为“系统给这个小组支付50个比特币”。也就是说，如果你生成了一张有意义的账簿纸，并且被所有挖矿小组接受了，那么就意味着这条交易也被接受了，你的挖矿小组获得了50个比特币。</p><p>这就是矿工被叫做矿工的原因，也是为什么之前说随着交易和矿工的活动，比特币的数量会不断增多。例如下面是一个挖矿过程，这个小组的公共比特币帐号为「UVWXYZ」。</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783852-bitcoin-mechanism-07.png" alt=""></p><p>在幸运数字尝试到「533」时，系统生成了一页有效账簿</p><h3 id="heading-17">确认账簿</h3><p>当某挖矿小组幸运的生成了一张有意义的账簿，为了得到奖励，必须立刻请其它小组确认自己的工作。前面说过，当前村里有7个挖矿组，所以这个小组必须将有效账簿纸誊抄6份快马加鞭送到其他6个小组请求确认。</p><p>中本聪规定，当某个小组接到其他小组送来的账簿纸时，必须立即停下手里的挖矿工作进行账簿确认。</p><p>需要确认的信息有三个：</p><ol><li>账簿的编号有效</li><li>账簿的前一页账簿有效</li><li>交易清单有效</li></ol><p>首先看第一个，这个确认比较简单。只要将送来的账簿纸放入编码生成器进行验证，如果验证通过，则编号有效。</p><p>第二部分需要将账簿页上的「上一页账簿纸编号」和这个小组目前保存的有效账簿最后一页编号比对，如果相同则确认，如果不同，需要顺着已有账簿向前比对，直到找到这个编号的页。如果没有找到指定的“上一页账簿纸编号”对应的页，这个小组会将此页丢掉。不予确认。</p><p>注意，由上面的机制可以保证，如果各个小组手里的账簿纸是相同的，那么他们都能按同样的顺序装订成相同的账簿。因为后面一张纸的编号总是依赖前面的纸的编号，编码生成器的机制保证了所有合法账簿纸的相对先后顺序在每个小组那里都是相同的（可能会有分支，但不会出现环，后面细讲）。</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783887-bitcoin-mechanism-08.png" alt=""></p><p>最后是如何确认交易清单有效，其实也就是要确认当前每笔交易的付款人有足够的余额支付这笔钱。由于交易信息里包含这笔钱是如何来的，还包含了记录来源交易的账单编号。例如，HIJKLMN要给ABCDEFG10个比特币，并注明了这10个比特币来自之前OPQRST支付给HIJKLMN的一笔交易，确认时首先要确认之前这笔交易是否存在，同时还要检查HIJKLMN在这之前没有将这10个比特币支付给别人。这一切确认后，这笔交易有效性就被确认了。</p><p>其中第一笔是系统奖励给生成这页账簿的小组的50个，这笔交易大家都默认承认，后面的只要按照上述方法追溯，就可以确认HIJKLMN是否当前真有10个比特币支付给ABCDEFG。</p><p>如果完成了所有了上述验证并全部通过，这个小组就认可了上述账簿纸有效，然后将这张账簿纸并入小组的主账簿，舍弃目前正在进行的工作，后面的挖矿工作会基于这本更新后的主账本进行。</p><h3 id="heading-18">账簿确认反馈</h3><p>对于挖矿小组来说，当账簿纸送出去后，如果后面有收到其他小组送来的账簿纸，其「上一页账簿纸编号」为自己之前送出去的账簿纸，那么就表示他们的工作成功被其他小组认可了，因为已经有小组基于他们的账簿纸继续工作了。此时，可以粗略的说可以认为已经得到了50个比特币。</p><p>另外，任何一个小组当新生成有效账簿纸或确认了别的小组的账簿纸时，就将最新被这个小组承认的交易写到公告牌上，那么收款人只要发现相关交易被各个小组认可了，基本就可以认为这笔钱已经到了自己的账上，后面他就可以在付款时将钱的来源指向这笔交易了。</p><p>以上就是整个比特币的支付体系。下面我们来分析一下，这个体系为什么可以工作下去，以及这个体系可能面临的风险。</p><h2 id="heading-19">工作机制分析</h2><p>虽然上面阐述了比特币的基本运作规则，但是村民们还是有不少疑问。所以中本聪同学专门开了个答疑会，解答常见问题。下面总结一下村民最集中关心的问题。</p><h2 id="heading-20">核心问题答疑</h2><h3 id="heading-21">如果同时收到两份合法的账簿页怎么办？</h3><p>注意在上面的运行机制中，各个挖矿小组是并行工作的，因此完全可能出现这样的情况：某小组收到两份不一样的账簿页，它们都基于当前这个小组的主账簿的最后一页，并且内容也都完全合法，怎么办？</p><p>关于这个问题，中本聪同学说，小组不应该以线性方式组织账簿，而应该以树状组织账簿，任何时刻，都以当前最长分支作为主账簿，但是保留其它分支。举个例子，某小组同时收到A、B两份账簿页，经核算都是合法的，此时小组应该将两页以分叉的形式组织起来，如下图所示：</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783962-bitcoin-mechanism-09.png" alt=""></p><p>黑色表示当前账簿主干。此时，可以随便选择一个页作为当前主分支，例如选择A：</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637783996-bitcoin-mechanism-10.png" alt=""></p><p>此时如果有一个新的账簿页是基于A的，那么这个主干就延续下去：</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637784030-bitcoin-mechanism-11.png" alt=""></p><p>如果这个主干一直这么延续下去，表示大家基本都以 A 为主干，B 就会被遗忘。但是也有可能忽然 B 变成更长了：</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637784087-bitcoin-mechanism-12.png" alt=""></p><p>那么我们就需要将 B 分支作为当前主干，基于这个分支进行后续工作。</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637784118-bitcoin-mechanism-13.png" alt=""></p><p>从局部来看，虽然在某一时刻各个小组的账簿主干可能存在不一致，但大方向是一致的，那些偶尔由于不同步产生的小分支，会很快被淹没在历史中。</p><h3 id="heading-22">如果挖矿小组有人伪造账簿怎么办</h3><p>关于这个问题，中本聪同学说，只要挖矿组织中大多数人是诚实的，这个系统就可靠，具体分几个方面给予答复。</p><p>首先，基于保密印章机制，没有人能伪造他人身份进行付款，因为编码生成器在打印编码时会核对所有交易单的保密印章，印章和付款人不一致会拒绝打印。</p><p>而且诚实的矿工也不会承认不合法的交易（如某笔交易付款方余额不够）。</p><p>所以只有一种可能的攻击行为，即在收款人确认收款后，从另一条分支上建立另外的交易单，取消之前的付款，而将同一笔钱再次付款给另一个人（即所谓的 double-spending 问题）。下面同样用一个例子说明这个问题。</p><p>先假设有一个攻击者拥有 10 个比特币，他准备将这笔钱同时支付给两名受害者 A 和 B，并都得到承认。</p><p>第一步，攻击者准备从受害者 A 手里买 10 比特币的黄金，他签署交易单给受害者 A，转 10 个比特币给受害者 A。</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637784169-bitcoin-mechanism-14.png" alt=""></p><p>第二步，这笔交易在最新的账簿页中被确认，并被各个挖矿小组公告出来。受害人 A看到公告，确认比特币到账，给了攻击者10个比特币等值的黄金。</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637784229-bitcoin-mechanism-15.png" alt=""></p><p>第三步，攻击者找到账簿，从包含刚才交易的账簿页的前一页做出一个分支，生成更多的账单页，超过刚才的分支。由于此时刚才攻击者制造的分支变成了主干分支，而包含受害者A得到钱的分支变成了旁支，因此挖矿组织不再承认刚才的转账，受害者A得到的10比特币被取消了。</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637784270-bitcoin-mechanism-16.png" alt=""></p><p>第四步，攻击者可以再次签署交易单，将同一笔钱支付给受害者B。受害者B确认钱到账后，支付给攻击者等值黄金。<br><img src="https://img.imzl.com/wp-content/uploads/2021/11/1637784303-bitcoin-mechanism-17.png" alt=""></p><p>至此，攻击者将10个比特币花了两次，从两名受害者那里各购得等值黄金。攻击者还可以如法炮制，取消与受害者B的转账，将同一笔钱再支付给其他人……</p><p>关于这种攻击，中本聪给出的解决方案是，建议收款人不要在公告挂出时立即确认交易完成，而是应该再看一段时间，等待各个挖矿小组再挂出6张确认账簿，并且之前的账簿没有被取消，才确认钱已到账。</p><p>中本聪解释道，之前设定变态的编号规则，正是为了防御这一点。根据前面所述，生成有效账簿页不是那么简单的，要花费大量的人力反复试不同的幸运数字，而且过程完全是碰运气。如果某账簿页包含你收到钱的确认，并且在后面又延续了6个，那么攻击者想要在落后6页的情况下从另一个分支赶超当前主分支是非常困难的，除非攻击者拥有非常多的人力，超过其他所有诚实矿工的人力之和。</p><p>而且，如果攻击者有如此多人力，与其花这么大力气搞这种攻击，还不如做良民挖矿来的收益大。这就从动机上杜绝了攻击的形成。</p><h3 id="heading-23">比特币会一直增加下去，岂不是会严重通货膨胀</h3><p>中本聪说，这一点我也想到了。前面忘了说了，我给矿工组织的操作细则手册会说明，刚开始我们协议每生成一页账簿，奖励小组50个比特币，后面，每当账簿增加21,000页，奖励就减半，例如当达到210,000页后，每生成一页账簿奖励25个比特币，420,000页后，每生成一页奖励12.5个，依次类推，等账簿达到6,930,000页后，新生成账簿页就没有奖励了。此时比特币全量约为21,000,000个，这就是比特币的总量，所以不会无限增加下去。</p><h3 id="heading-24">没有奖励后，就没人做矿工了，岂不是没人帮忙确认交易了</h3><p>到时，矿工的收益会由挖矿所得变为收取手续费。例如，你在转账时可以指定其中 1% 作为手续费支付给生成账簿页的小组，各个小组会挑选手续费高的交易单优先确认。</p><h3 id="heading-25">矿工如果越来越多，比特币生成速度会变快吗</h3><p>不会。中本聪解释，虽然可以任意加入和退出矿工组织，导致矿工人数变化，每个矿工也会拿到一个编码生成器，不过我已经在编码生成器中加入了调控机制，当前工作的编码生成器越多，每个机器的效率就越低，保证新账簿页生成速率不变。</p><h3 id="heading-26">虽然每个人的代号是匿名的，但如果泄露了某个人的代号，账簿又是公开的，岂不是他的所有账目都查出来了</h3><p>确实是这样的。例如你要和某人交易，必然要要到他的代号才能填写交易单。因为收款人一栏要填入那人的代号。不过中本聪说可以提供无限制的保密印章，建议每一次交易用不同的保密印章，这样查账簿就追查不到同一个人的所有账目了。</p><p>答疑完毕。</p><h2 id="heading-27">说明</h2><p>本文用通俗比喻的方式讲解了比特币的运行机制。有几点需要说明：</p><p>为了便于理解，我做了很多简化，因此有些机制细节和实际的比特币可能不完全相同。但总体思想和关键原理是一致的。<br>由于很多计算机世界的东西（如公钥体系、网络传输）在现实世界中并没有特别好的对等物，所以故事里难免有一些生硬和不合常理的细节。<br>本文描述的是比特币网络本身的技术原理和运作机制，当在如 Mtgox 这种买卖市场中进行比特币交易时，市场做了中间代理，并不遵从上述机制</p><h2 id="heading-28">参考</h2><ol><li><a href="https://bitcoin.org/bitcoin.pdf">Bitcoin 白皮书（英）</a></li><li><a href="https://bitcoin.org/files/bitcoin-paper/bitcoin_zh_cn.pdf">Bitcoin 白皮书（中）</a></li><li><a href="https://bitcoin.it/">Bitcoin Wiki（英）</a></li><li><a href="https://blog.codingnow.com/2011/05/bitcoin.html">云风的 BLOG: 《Bitcoin 的基本原理》</a></li></ol><p>via.<a href="https://blog.codinglabs.org/articles/bitcoin-mechanism-make-easy.html">原文地址</a></p>]]>
      </content:encoded>
    </item>
    <item>
      <title>什么是产品人?</title>
      <link>https://imzl.com/producter</link>
      <description>碎片思考什么是产品人：产品经理需要平衡商业价值和用户价值的文章。了解如何超越表面的设计交互，找到真正的产品优势。</description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/miscellanies/">杂记</category>
      <category domain="https://imzl.com/categories/internet/">互联网</category>
      <category domain="https://imzl.com/categories/thinking/">碎片思考</category>
      <category domain="https://imzl.com/tag/product-manager/">产品经理</category>
      <pubDate>Mon, 06 Sep 2021 13:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>这段话我之前在推上有发过，更新到博客做一个备忘，这是我一直在践行的事情。</p><p>产品人首先要明白商业价值和用户价值的平衡，即我们要通过产品得到什么？用户通过产品得到什么？这是体验的最核心层，然后一层层往上抽丝剥茧，可惜市面上的大部分产品都盯着表面层炫酷屌炸天的设计交互体验，我一直觉得这是《人人都是产品经理》的遗毒。</p><p>而好的产品，除了对五层体验了然于胸外，更要有预见性，一个大而全的产品容易抄但付出的是时间，说不定战略战术资源管理还不匹配，牛逼的是你的产品次序，前一个动作是后一个的预动作。简约不是没想到恰是想到了，看的远、走的近、想的多、做的少，验证后快速迭代。</p><p>而卓越的产品，是在红海中能找到关键任务，降维打击。</p><p><img src="https://img.imzl.com/wp-content/uploads/2021/09/1630932266-dedao-chanping.jpeg" alt="产品人"></p>]]>
      </content:encoded>
    </item>
    <item>
      <title>独立博客三大乐趣：主题、域名、建站程序</title>
      <link>https://imzl.com/theme-domain-blogcms</link>
      <description>自 2010 年起始，写博已十年有余，换过五次域名、十多次主题、两次建站程序。许是学美出身，过于追求表现层的东西，追求好看、完美，读书期间也有大把时间能折腾研究，花了很多功夫在主题、插件、服务器运维上，这些折腾在他人眼里或许是浪费时间，但对当时的我来说：通过折腾满足自己的需求和想法，获得的快感可以称之为「高潮」。</description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/miscellanies/">杂记</category>
      <category domain="https://imzl.com/tag/miscellanies/">杂记</category>
      <category domain="https://imzl.com/tag/blog/">博客</category>
      <category domain="https://imzl.com/tag/domain/">域名</category>
      <pubDate>Wed, 25 Aug 2021 12:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>最近买下了 <a href="https://imzl.com">imzl.com</a> ，圆了「有枚顺眼 .com 域名」的「梦想」。已用作本博主域名，也是继 2020 年以来周良博客第三次换域名。</p><p>自 2010 年起始，写博已十年有余<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>，换过五次域名、十多次主题、两次建站程序<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>。许是学美出身<sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup>，过于追求表现层的东西，追求好看、完美，读书期间也有大把时间能折腾研究，花了很多功夫在主题、插件、服务器运维上，这些折腾在他人眼里或许是浪费时间，但对当时的我来说：<strong>通过折腾满足自己的需求和想法，获得的快感可以称之为「高潮」。</strong></p><p>这也是为什么我说：独立博客有三大乐趣，主题、域名、建站程序。<strong>但乐趣是对自己的，价值是对读者的。</strong></p><p>博客的价值是内容，好的、有用的内容。</p><p><strong>博客主题</strong>：干净就行，能清晰展现内容、便于阅读即可，简陋一点没关系。有一个搜索框，能让读者找到想找的内容；有一个评论框，能与读者交流，就够了。</p><p><strong>域名</strong>：不复杂、能一眼记住最好，不能也没关系。这年头域名的比重越来越低，本着有就用、能用就行即可，无需和我一样老是换。我只是有心结，但大可不必。只要内容够，再邋遢的域名我都会把你加入收藏夹。</p><p><strong>CMS 建站程序</strong>：能用就行，甚至越简洁越好。不要让工具限制自己，也不要让写作的启动成本太高，我现在都是在笔记本里码完字一键黏贴发布的，从不管后台那些七七八八花里胡哨的功能。无格式纯文本的写作方式，实在太棒了。</p><p>看起来有点「功利」，其实这事情只要自己舒服，就皆无不可。</p><p>我更多的是在做一次反思，是四年前就该写的。曾经的我过于专注表层花里胡哨的东西（这事情和写博客无关），毕竟设计师，其实无错。自从转产品后，才明白花花绿绿的世界下还有一些看不见的东西，用户体验不是只有框架层和表现层，再往下还有结构、范围和战略。也不是把功能做好看了、操作舒服了就行。商业价值和用户价值的平衡，才算是体验的最核心层。</p><p>在写作、写博客这件事上，域名的好坏、主题的好看与否，绝不是成为一个好博客的必要因素，要做好，但不要执着到最好。把精力放在内容上，才是核心。</p><hr class="footnotes-sep"><section class="footnotes"><ol class="footnotes-list"><li id="fn1" class="footnote-item"><p>2010 年初中开始，学生时代更新频繁，近 4 年偶有更新。 <a href="#fnref1" class="footnote-backref">↩︎</a></p></li><li id="fn2" class="footnote-item"><p>从 WordPress 独立站更换至 Bitcron，后又回归 WordPress。 <a href="#fnref2" class="footnote-backref">↩︎</a></p></li><li id="fn3" class="footnote-item"><p>之前本职是 UI 设计师 <a href="#fnref3" class="footnote-backref">↩︎</a></p></li></ol></section>]]>
      </content:encoded>
    </item>
    <item>
      <title>麻将</title>
      <link>https://imzl.com/majiang</link>
      <description>
        <![CDATA[<p>打麻将和做产品略有相似，在现有的信息下做出「正确」的选择，提升赢面概率。持续做出正确的选择，最终胡牌。当然，麻将是有限游戏，产品是无限游戏。</p>]]>
      </description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/thinking/">碎片思考</category>
      <category domain="https://imzl.com/tag/%E6%80%9D%E8%80%83/">思考</category>
      <category domain="https://imzl.com/tag/%E4%BA%A7%E5%93%81/">产品</category>
      <pubDate>Mon, 01 Mar 2021 04:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>打麻将和做产品略有相似，在现有的信息下做出「正确」的选择，提升赢面概率。持续做出正确的选择，最终胡牌。当然，麻将是有限游戏，产品是无限游戏。</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>2020.10.15 杂记：有钱人的定义、iOS 工作日智能闹钟、iPhone 12</title>
      <link>https://imzl.com/857</link>
      <description>区分「真有钱」和「假装有钱」很重要，至少应该满足如下两个标准，才会被视为「有钱」，安德鲁哈勒姆也是这样认为的:1. 可以选择不工作，而不必为了生计而担忧; 2. 所持有的投资，可以保证终生都有两倍于本国中等收入家庭的收益。（2020 年，上海家庭年收入为24-60万元）</description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/miscellanies/">杂记</category>
      <category domain="https://imzl.com/tag/riches/">财富</category>
      <category domain="https://imzl.com/tag/iphone/">iPhone</category>
      <pubDate>Thu, 15 Oct 2020 14:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<h2 id="heading-1">何谓有钱？</h2><p>区分「真有钱」和「假装有钱」很重要，至少应该满足如下两个标准，才会被视为「有钱」,安德鲁哈勒姆也是这样认为的:</p><ol><li>可以选择不工作，而不必为了生计而担忧;</li><li>所持有的投资，可以保证终生都有两倍于本国中等收入家庭的收益。（2020年，上海家庭年收入为24-60万元）</li></ol><h2 id="heading-2">iOS 工作日智能闹钟</h2><p>iOS 闹钟一直不支持按中国法定节假日自动开启关闭，今天在 @scomper 的博客上看到了依托捷径的全自动解决方案。通过订阅中国法定节假日日历+捷径、在线 API 接口+捷径处理。</p><p>教程详见：<a href="https://pepcn.com/ios/iosshang-de-gong-zuo-nao-zhong">《iOS 上的工作日闹钟》</a></p><h2 id="heading-3">iPhone 12</h2><p>iPhone 12 终于出了，明晚 8 点就可以抢购。手上的 iPhone 7 用了四年，终于可以换代了。这次就不走官网途径购买了，会考虑手上的供货商渠道或者拼多多，差价应该足够覆盖分期手续费了。</p><h2 id="heading-4">简历</h2><p>最近在帮吴老师改简历，也衍生出了更新一下自己简历的想法。最近几次跳槽都没有用到简历，目前的简历内容还停留在设计师的内容上。周末可以抽空，更新一份产品坑的简历，顺带梳理一下这些年做产品的经历。</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>公司五行论与组织六元拟人指标</title>
      <link>https://imzl.com/869</link>
      <description>
        <![CDATA[<p>某年跨年夜，朋友组织了一场小型酒会，其中有他的天使投资人。中途聊天提到他之前做项目如何设立团队，给出了一个五行论，公司由金木水火土组成，根据五行属性与城市的匹配，将不同的团队放置到不同城市，比如杭州属木，适合放运营团队，深圳属火适合放市场团队….反正最后项目成了。</p>]]>
      </description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/thinking/">碎片思考</category>
      <category domain="https://imzl.com/tag/ch6/">CH6</category>
      <category domain="https://imzl.com/tag/%E4%BA%94%E8%A1%8C%E8%AE%BA/">五行论</category>
      <pubDate>Mon, 28 Sep 2020 05:10:42 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>某年跨年夜，朋友组织了一场小型酒会，其中有他的天使投资人。中途聊天提到他之前做项目如何设立团队，给出了一个五行论，公司由金木水火土组成，根据五行属性与城市的匹配，将不同的团队放置到不同城市，比如杭州属木，适合放运营团队，深圳属火适合放市场团队….反正最后项目成了。</p><p>我倒更认为是因为这些城市，本身人才属性上就存在划分。杭州确实可以找到很好的运营人才，毕竟这里是电商的中心；深圳东莞等地服务业可能较为发达，金钱与付出成正比深入人心，销售自然拼命干活。</p><p>我也不知道猜的对不对，毕竟没去这些城市。不过先不谈这类迷信内容，五行轮用于看公司，我觉得还是有参考意义的。正好昨天早上看到一篇类似的文章，就做个备注。</p><h2 id="heading-1">公司五行轮</h2><p>印象里，那晚五行轮被拆分成如下内容，有外在也有内在因素。我在那之后也常根据这五个角度去看一些公司：</p><p>土：土壤，对应着行业<br>木：方法论、老板<br>水：水是流动的，对着着公司的资源<br>火：团队，好的团队要热情似火<br>金：财务，财务状况</p><h2 id="heading-2">组织六元拟人指标</h2><p>昨天看到一篇文章，地址：<a href="https://mp.weixin.qq.com/s/rNn1wl3bZmv4p5wLD32m0A">没有 KPI 和 OKR，早期创业如何定指标？×6 了解一下</a></p><p>其中提到了公司六元论，拆解的是组织本身的生态系统，我觉得也要比较有意思，放出来做备忘用。</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1601298517-ch6.png" alt=""></p>]]>
      </content:encoded>
    </item>
    <item>
      <title>修真世界</title>
      <link>https://imzl.com/868</link>
      <description>探索「修真世界」与现实职场的惊人相似性。从灵力到炼丹，如何运用修真玄幻中的原则优化你的职能和天赋。</description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/miscellanies/">杂记</category>
      <category domain="https://imzl.com/categories/thinking/">碎片思考</category>
      <category domain="https://imzl.com/tag/imagination/">臆想</category>
      <category domain="https://imzl.com/tag/function/">职能</category>
      <category domain="https://imzl.com/tag/cultivation-fantasy/">修真玄幻</category>
      <pubDate>Thu, 24 Sep 2020 14:00:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>曾想过一个问题，化学是不是「炼金术」，物理是不是 「天道法则」？课本如果改个名，或许当年能提升我对学习的动力。</p><p>昨晚洗澡的时候，又突然想到，修真小说体系中，有各类修习法门。内练灵力、外练体魄，左手炼丹、右手制器。这何尝不是对应着我工作中产品、运营、商务等等各种职能。</p><p>而修真世界中的天才，或许就是那些既能往外扑，也擅修内功的人。</p><p>有些人灵力高强，有些人灵力高强的同时又是稀缺的炼丹师，兼具的越多，「修炼天赋与境界」则越高，而修炼天赋与境界在这个体系中，更多指代的是「勤奋」、机遇、时间和生死战斗所带来的感悟。</p><p>嗯，一切的一切都殊途同归。</p><p>如此说来的话，这场无限游戏越来越好玩，越来越「游戏化」了。</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>玩法分析：让人停不下来的抽奖活动</title>
      <link>https://imzl.com/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</author>
      <category domain="https://imzl.com/categories/%E4%BA%A7%E5%93%81%E8%AE%BE%E8%AE%A1/">产品设计</category>
      <category domain="https://imzl.com/tag/%E8%BF%90%E8%90%A5/">运营</category>
      <category domain="https://imzl.com/tag/%E6%8A%BD%E5%A5%96/">抽奖</category>
      <category domain="https://imzl.com/tag/%E5%BF%83%E7%90%86%E5%AD%A6/">心理学</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="玩法分析：让人停不下来的抽奖活动"></p><blockquote><p>最近在折腾一些抽奖活动，同事向我分享了这篇文章。发布到博客仅做个人备忘用途。 本文对抽奖类活动进行了说明，并总结分享了抽奖类活动的玩法设计、页面表现，文末也有我写的一些批注。</p></blockquote><h2 id="heading-1">一、说明</h2><p>带有「博彩场景」特征的活动几乎是市面上运营类活动的首选项。它常复刻「线下博彩」的游戏场景，比如大转盘、扭蛋机、老虎机、猜杯子、翻卡片、红包雨、彩票等等，将其视觉化，用户通过简单的交互方式（如点击），随机获得优惠券、抵扣红包、小额现金等奖励。业务转化通常在用户 <strong>获得抽奖机会</strong> 以及 <strong>后续对奖品的使用</strong> 过程中实现。 这一类活动有较强的代入感，人们天生对博彩游戏着迷，愿意尝试，操作得当，很容易获得成功。 但也要注意，与线下博彩相比，手机环境对氛围的模拟较弱、奖品也常是优惠券等，价值较低，用户很难得到真实博彩带来的 <strong>「差一点成功」</strong>、<strong>「随机奖励」</strong> 的刺激体验。在多次奖励没有命中用户心理的情况下，很容易让用户产生受骗、倦怠的感觉，导致用户在业务转化前流失。 根据开奖周期，博彩类游戏还可以分为即时开奖和周期开奖两种类型，越长的开奖周期会带来越多的用户流失。 <img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599122832-choujiang-1.png" alt="抽奖玩法"></p><h2 id="heading-2">二、玩法设计</h2><p>人们参与「博彩类」活动主要的驱动力是 <strong>未知好奇</strong> 。我们都普遍痴迷于变化莫测的体验，对外界饱含探索的欲望，为了满足高涨的好奇心，愿意立即采取行动，这是人类得以生存、进化的必要机制，博彩行业正是利用了这一“人性弱点”得以长盛不衰。 当然人们沉迷赌博还有损失厌恶与规避（沉默成本）等复杂心理因素的影响，但也足以说明这一类型活动的有效性。 用户在参与过程中，刚开始在 <strong>好奇心</strong>、<strong>大奖诱惑</strong> 或者 <strong>社交压力</strong> 等驱使下进入活动，采取设计的交互行动获得奖品，因为 <strong>随机奖励</strong>、<strong>即时反馈</strong> 的酬赏机制，大脑分泌多巴胺，产生快感，用户沉迷其中… 最终，活动得以成功。 但是这类活动的奖品设计往往同质化严重，来来回回都是优惠券、抵扣券，用户几次抽奖后就心里倦怠，不再因为获得奖品而惊喜、兴奋；另外活动常需要用户完成任务来获得抽奖机会，用户付出后却没有得到 <strong>“等价”</strong> 的奖励，会感到被欺骗，最终离开活动。 因此在做设计时，首先要营造“博彩”氛围，使用 <strong>大奖奖励</strong>、<strong>动态弹幕</strong> 等设计手段、以及足够“热闹”的 <strong>视听呈现方式</strong> ；其次， <strong>尝试与其它的行为动机相结合，扩展玩法，承接用户动机变化</strong> ，最大化对用户的激励效果，促进用户行为。</p><h3 id="heading-3">2.1 给用户免费尝试的机会</h3><p>在设计时，提供给用户免费尝试的机会，让用户顺利开始活动，同时进行用户投教、用户行为培养，帮助用户认知行为模式。免费尝试机会一般为2~3次，太少太多都不大合适。同时，免费机会常会按天刷新（或不刷新），用完后可以通过完成一些带业务转化的任务来增加。 <img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599122899-choujiang-2.png" alt="抽奖时给用户免费尝试机会"></p><h3 id="heading-4">2.2 策略化用户中奖路径</h3><p>每次抽奖得到的奖品在用户看来是随机的，“公平公正、没有内幕”。但为让各业务数据（参与/业务转化/病毒传播）实现最优，用户奖品路径必须经过刻意设计，综合考虑运营成本、业务目标实现、用户体验，经过策略平衡以后，其效果远远不是简单随机可以比拟的。 <strong>2.2.1 奖品分级、用户分层</strong> 设计师根据需要对运营活动目标用户以及可用奖品进行分层，这样做的目的在于 <strong>实现奖品、用户两者之间的最优匹配，提高转化。</strong> 用户分层常根据用户属性进行，可能是：新老用户、资深用户……；或者根据用户行为偏好，分成“日用品用户”、“个人护理用户”… 奖品分层从不同层次用户的命中率、同一层次用户的吸引程度（价值）两个维度进行。在用户抽奖匹配奖品时，再结合随机性，就可以形成“随机”但高命中率的用户获奖路径。 <strong>2.2.2 奖品发放策略化</strong> 在免费阶段，常见的派奖内容是优惠券、消费抵扣红包等低价值奖品，很容易让用户产生活动含金量低、不参与损失不大的感觉，不利于业务转化阶段的用户留存。 可以试着在免费机会首次用完时，根据上一步的分层结果，针对性地派发一个吸引力较强的奖品，比如低面额的现金红包。 这样用户会建立活动价值很高，后续即使做任务也会得到更大奖励的心理预期，顺利进入业务转化阶段。 在业务转化阶段，用户付出时间、金钱、情感等，完成任务获得抽奖机会，自然期望得到更多，总是低价值奖品会大概率劝退用户，这个时候奖品分层就起到了作用， <strong>根据奖品对某一层次用户的吸引程度逐渐加码，随机派发</strong> ，能最大程度的提高转化深度（完成任务的个数与难度）。 可以设置奖品重置的策略，比如按天或者在本轮大奖发出后重置大转盘奖品。重置的概念通过限制时间引入稀缺性，提升了用户动机；在奖品足够丰富的情况下，甚至可以让用户成组选择中奖可得的奖品。 <img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599122979-choujiang-3.png" alt="用户选择扭蛋机奖品"> <strong>2.2.3 抽奖机会如何增加</strong> 常用的设计逻辑是，系统提供免费抽奖机会，在免费机会用完后，一定倒计时（ <strong>稀缺性</strong> ）后可恢复1次或多次，同时提供给用户并列的可选项—— <strong>完成某一项任务可以获得抽奖机会。任务推送要兼顾运营目标和用户属性，最好像用户和奖品一样进行分层</strong> ，控制任务列表的整理完成率，实现任务推送个性化；从而有效提升完成率和业务转化，更好的实现业务目标。 抽奖机会可以恢复的机制是否需要，同活动业务目标是否考虑复访以及活动奖品支撑能力有关。大多数活动都需要用户尽可能多的到访来提高活动效果，在运营资源足够的情况下，恢复机制就有必要。 但也有其它情况，比如支付宝针对未风测用户进行了1次运营活动，旨在提高平台风测用户比例，规则为用户完成风测则获得一次转盘抽奖机会，抽完即止。 Ps：不要用特殊任务击穿活动的基本参与逻辑，比如做某一个任务必中某一奖品，这样的设计“吃相太难看”，劝退用户没商量。 <img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123052-choujiang-4.png" alt="抽奖机会增加方式"></p><h3 id="heading-5">2.3 更高层次的用户驱动-使命感</h3><p>在马斯洛需求层次中，使命感处在尊重的需要（第四层）和自我实现（第五层）的需要，属于高层级的用户需求，如果活动设计可以与使命感关联，无疑会给用户更强的行为动机。 想一想彩民在没有中奖时常说的一句话是什么，“我为慈善做贡献了！”，正是这种更宏大的意义给了彩民金钱损失的安慰以及复购彩票的“借口”，甚至慈善也是彩票行业在我国存在的法理基础。但也要注意使命感传递难以保证可信度，缺乏紧迫感的问题，设计时要采取其他手段中和。 针对可信度，可以尝试与慈善机构合作，通过 <strong>叙事（动画等方式）</strong>、<strong>专属勋章（发放特有的慈善勋章）</strong>、<strong>精英集体（形成慈善团体）、排行榜、成就（英雄主义）</strong> 等方式强化。针对紧迫感欠缺，可以通过 <strong>稀缺（限制勋章数量、参与时间）</strong> 等办法提高。 这个技巧被支付宝应用的炉火纯青，蚂蚁森林，蚂蚁庄园、年年有余（一起保护中华鲟）都出现了使命感的影子。 <img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123148-choujiang-5.png" alt="更高层次的用户驱动-使命感"></p><h3 id="heading-6">2.4 把奖品展示出来</h3><p>随机奖励不意味着奖品不可见，把活动提供的奖品中最吸引人的部分大方展示出来，并提示更多。 要是可以的话，提供选择或者个性化，这对长期运营的抽奖活动尤其有用。这样做的好处在于能够激发用户的 <strong>拥有感和获得感</strong>、<strong>多巴胺预期效应</strong> 和 <strong>侥幸心理，</strong> 从而使用户立即采取行动。 <strong>「多巴胺预期效应」</strong> 表明人们哪怕只是预期能得到某些东西，获得某种成就，大脑也会分泌出多巴胺，产生愉悦感，从而增强追求这些东西的动机，促进人们采取行动。 <strong>「侥幸心理」</strong> 表明人们总会认为自己是最幸运的那个，因此哪怕只有一点点机会，人们也愿意以小博大，而放弃稳妥的中等奖励。</p><blockquote><p>“在人类的进化史上，从来没有什么预先准备好的事情，没有相应的知识结构帮助我们尝试并把握住机会。” ——罗伯特威廉姆斯。</p></blockquote><p>具体在设计时，可以尝试 <strong>大奖悬挂</strong> 的技巧，在活动页面中展示大奖奖励，用户看到后大脑开始分泌多巴胺，侥幸心理渐渐发挥作用， <strong>“这些都有可能是我的！”</strong> ，随之开始采取行动。还可以滚动展示 <strong>获奖动态弹幕</strong> ，进一步强化用户的侥幸心理，这样还能激发从众效应。注意头像和名称能提供更多可信度，尤其是头像。 <img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123210-choujiang-6.png" alt="抽奖时外露奖品"></p><h3 id="heading-7"><strong>2.5 给用户一个目标</strong></h3><p>上面我们提到过，用户在抽奖活动中获得奖品是策略化以后的“随机”结果。 随机奖励因为有不确定性，相较于确定奖励能带给用户惊喜，产生更多愉悦和成就感；但是不确定性也意味着缺乏掌控，奖励多次没有命中用户，用户就会产生受骗感和倦怠感，继而离开活动。 所以在设计时给用户设定一个目标很有必要，这样做能顺利承接用户行为动机的变化，同时还能激发 <strong>“目标实现效应”，</strong> 在目标周期内促进用户行为。 比如：</p><ul><li><strong>每抽满5次，必中黄色区域奖品（奖品价值较高）</strong> ；</li><li>或者 <strong>抽满5次开黄色宝箱，抽满9次开红色宝箱，抽满12次开紫色宝箱……；</strong></li><li>再或者 <strong>每天发布定量大奖；</strong></li><li>再或者 <strong>抽碎片集满送大奖（与抽奖类活动集合）……</strong></li></ul><p>通过设定额外的进阶性奖励，激励用户参与下去。在使用时结合文字说明，引入进度条组件、引导气泡组件等实现有效的视觉传达。 <img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123284-choujiang-7.png" alt="给用户一个目标"></p><h3 id="heading-8">2.6 社交影响</h3><p>在 <strong><a href="http://www.woshipm.com/pd/3279762.html">《收集类活动设计总结》</a></strong> 中我们详细论述了社交影响对运营活动的重要意义，在活动病毒式传播、可玩性拓展、业务目标转化上都有特别好的效果。这里不过多论述，只列举几个设计技巧。 <strong>2.6.1 邀请用户获得抽奖机会</strong> 如标题，获得抽奖机会的方式中加入邀请用户；如果有必要，可以设置进阶，邀请用户可以获得更多的抽奖次数。甚至可以在活动页面中加入特定的模块，来引导邀请并记录进度。 <img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123339-choujiang-8.png" alt="邀请用户获得抽奖机会"> <strong>2.6.2 引导用户分享</strong> 用户分享的前提一定是感到分享的内容有价值，传播它们能满足 <strong>虚荣、炫耀，或带来利益</strong> 。 如果系统在用户并没有这种感受的时候引导分享，那用户会感觉受到了侮辱和嘲弄，这一点也不夸张，想想某些系统让你分享你并不想传播的内容时，你心理的抗拒和对系统的厌恶有多强烈。 因此在合适的场景、合适的时机、提供合适的物料，才能让用户有动力去采取行动，并且分享也才能带来应有的业务价值。 比如：在用户获得大奖时提供有专属意义且设计精美的获奖卡片，用户原本就沉浸在获奖的情绪中，有欲望想要分享出去让大家都知道，此时系统的“善意”正中下怀，完成分享顺理成章。而这样的分享内容也才能真正起到吸引新用户的效果。 <strong>2.6.3 把机会、道具送给好友</strong> 很多游戏设计都有这样的机制，用户每天有固定的次数可以把能量值、金币等送给好友，同时自己也获得等量的赠送物，能量值可以用来参与活动、金币可以购买道具。 在活动设计中，也可以使用这一机制，把抽奖机会、道具等送给好友，同时自己也得到等量的物品，这样的设计在利他主义下，带来了双赢的局面。 <strong>2.6.4 排行榜/滚动中奖名单/中奖动态弹幕</strong> 它们都属于社交影响组件，与动态弹幕相比，中奖名单、排行榜常驻在活动页面的某一个区域或者有专门的展示页面，可以追溯。用户通过查看这些内容能产生 <strong>羡慕、攀比、侥幸的</strong> 心理，在这些心理作用下采取行动。排行榜还能告诉用户怎样才能获得胜利，投教用户可以采取的行动。当用户在排行榜中看到有人超过自己时，可以产生更强的行为驱动力，这一点常常被忽视掉。 但要注意排行榜很容易产生头部聚集效应，其内容有可能长期无法更新；二来用户的位置也很难在排行榜中体现出来，对用户产生劝退作用。可能的解决办法有 <strong>定期重置排行榜</strong> ； <strong>微型排行榜—只将用户和其朋友或者相似的人进行比较等</strong> 。 <img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123395-choujiang-9.png" alt="增加排行榜、滚动中奖名单等"></p><h3 id="heading-9">2.7 亏损和逃避心</h3><p>亏损和逃避心理作用的原理在交互组件：运营类活动「倒计时」中论述过，即人们认为某样东西（已拥有或本可以拥有的）即将逝去，生理上就会有冲动去避免这样的情况发生。 <strong>2.7.1 先给用户道具</strong> 设计道具，道具使用逻辑为 <strong>在用户获得某项奖励以后有强化的效果。一定要保证用户首先获得道具，然后获得奖励，这非常重要。</strong> 道具有天然的使用倒计时—活动时间，在活动到期后道具随之失效，用户就失去了道具可以带来的“超额收益”，设计师甚至可以给道具设定少于活动时间的专门倒计时，并在视觉层面强调出来，用户在 <strong>损失规避</strong> 的驱动下，产生对可强化奖励的强烈渴望，从而采取行动，这个时候最好给用户能提高获得该奖品概率的逻辑，防止用户因为缺乏掌控而产生无能无力的感觉，离开活动。如果用户是在免费尝试阶段获得道具，还有利于用户顺利进入业务转化阶段。 <strong>发放道具的手段</strong> 也很重要，要 <strong>有效传达给用户道具的价值</strong> 。以尊享的概念送给用户道具（用户感觉受到特别对待，提高道具的心理价值）；或者在用户抽奖得到奖品后以额外惊喜的形式送给他；再或者把道具作为众多奖品中的一个，使用策略手段让用户在免费阶段获得。 比如：用户在免费尝试阶段获得一张翻倍卡，可以翻倍获得的现金奖励红包，用户会努力去获得一个现金红包，甚至于想要得到更多的现金红包就为了让翻倍卡使用的更有意义。 <img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123475-choujiang-10.png" alt="有效传达给用户道具的价值"> <strong>2.7.2 连抽必中高价值奖品</strong> 连抽必中高价值奖品，引导用户积攒一定的抽奖次数然后一次性触发抽奖，作为技巧玩法能有效提高用户业务转化深度。值得注意的是连抽效果要能承接用户心理预期，同时 <strong>高价值奖品要做特别展示，凸显区别</strong> 。不过有时候，连抽也单纯为了快速消耗抽奖机会，提高操作效率。 比如：连抽5次必中黄色区域奖品。 <img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123533-choujiang-11.png" alt="B站抽奖连抽必中"> <strong>2.7.3 灵活使用倒计时</strong> 倒计时组件通过限制时间营造稀缺，提高用户动机，促使用户立即行动。 在运营活动中，倒计时有 <strong>活动时间倒计时</strong>、<strong>重要奖品倒计时</strong> 两种情况，分别提高了活动、重要奖品的稀缺性。要注意当对重要奖品使用倒计时时，最好能提供可以提升该奖品获奖概率的操作办法，如果用户仍然只能通过不停抽奖来获得该奖品，会因为不能更进一步而无能为力，倒计时反而会带来反作用，为了逃避这种感觉，用户大概率会选择无视。 <img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123606-choujiang-12.png" alt="抽奖活动倒计时"></p><h3 id="heading-10">2.8 用户行为指示与召回</h3><p><strong>2.8.1 最大的抽奖按钮</strong> 在设计时，尽可能把行动按钮做到最大，最酷炫，这样才能有效吸引用户视线，引导用户行为。 人类的本能决定： <strong>除非必要，我们很少会主动思考，哪里有引导，哪里就会有“服从”引导的行为</strong> 。 有效的按钮设计，会让用户“顺从”的点击，从而顺利进入活动，完成参与；这样的设计还能提高用户效率，有效防止用户在首次进入时碍于理解成本，离开活动。 <strong>「4 s法则」：用户进入一个系统，在4s内找不到匹配点，系统也不提示可能的后续流程，那么他大概率会选择离开。</strong> <img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123666-choujiang-13.png" alt="抽奖按钮要大"> <strong>2.8.2 引导气泡（Popover）</strong> <strong>「引导气泡」</strong> 是行动引导组件的一种，一般出现在需要被点击的操作按钮、被解释的视觉元素旁边；常与手势指针一起使用，起到引起用户注意、引导用户行为的作用。引导气泡可以常驻或短暂出现，设计时，要讲究策略，详细描述其出现时机、隐藏机制、展示内容等。 比如：在用户进入页面3s无操作时出现、5s后消失。 <strong>「气泡引导（Popover）」</strong> 组件我会在后续文章中进行总结说明。 <strong>2.8.3 用户挽留与召回机制</strong> 用户 <strong>挽留和召回机制</strong> 是一个很重要但是常常会被忽略的交互策略内容。 用户参与活动可能来自于不同的渠道，离开活动时，也可能处在不同的参与深度，能挽留用户完成更多或吸引用户重新回到活动的内容理所当然也要差异化。 因此交互设计时，应当尽可能细分场景，设计不同的弹窗文案内容，以不同的渠道精准打中用户，最大化挽留和召回效果。 <img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123759-choujiang-14.png" alt="用户挽留与召回机制"></p><h2 id="heading-11">三、页面表现</h2><p>“博彩”类活动中可能存在的功能模块有 <strong>头部标题、抽奖功能区、业务转化抽屉、好友邀请进度、规则介绍</strong>、<strong>我的中奖、排行榜、中奖表单、动态弹幕</strong> 等。</p><h3 id="heading-12">3.1 场景故事与氛围</h3><p>“博彩”类活动可以用来复刻的线下场景极其丰富，现实生活中有众多博彩玩法都可以用作原型扩展为主场景，如 <strong>【红包】、【彩票】、【扭蛋】、【娃娃机】、【老虎机】、【大转盘】、【翻牌】、【招财猫】、【弹珠】、【猜杯子】</strong> 等，设计时结合时节、热点等灵活操作即可。 页面设计要尽最大努力烘托氛围，有效体现参与热度、奖品价值。通过页面 <strong>局部动效、背景音乐</strong> 等手段强化。 <img src="https://cdn.imzl.com/wp-content/uploads/2020/09/1599123889-choujiang-15.png" alt="抽奖的一些玩法形式"></p><h3 id="heading-13">3.2 弹窗设计</h3><p>在“博彩”类活动中，奖品发放、用户投教、召回等一般都采用弹窗来承载，所以弹窗的设计体感很重要。 <strong>蒙层的透明度选择、文案设计、主从按钮、是否自动收起、品牌投教元素、</strong> <strong>弹窗动效设计</strong> 等内容都要经过深思熟虑，后面我会在专门的弹窗组件说明中详细论述。 总之， <strong>弹窗的体感一定要能承接你希望用户产生的情绪波动</strong> ，“小奖不要浪，大奖一定炫！”</p><h2 id="heading-14">四、总结</h2><p>如上文，“博彩类”活动群众基础广泛，运营得当较容易取得成功。在交互设计时要注意规则策略化，尤其是奖品发放逻辑要深入浅出，简单又有效；同时 <strong>采用不同的动机设计手段来承接用户参与过程中的动机变化</strong> 。实现活动运营的效果最大化。 原文作者 <a href="http://www.woshipm.com/pd/3327970.html">@崔宇雄</a> 原创发布于人人都是产品经理。</p><h2 id="heading-15">个人备忘</h2><ol><li>现金红包也是一种抽奖方式，可以向 PDD 学习玩法（有零有整，运气最佳）</li><li>如何承接好奇心？抽检疲惫有什么新的玩法？</li><li><s>购买后现金返现？大额？会降低转化率么？加微信给红包？</s></li><li>让用户成组选择中奖可得的奖品。</li><li>慈善事业使命感？蚂蚁森林是个很好的例子</li><li>多巴胺刺激：奖品提前罗列</li><li>用户获得大奖时，提供有专属意义且设计精美的获奖卡片， 用户原本就沉浸在获奖的情绪中，有欲望想要分享出去让大家都知道。但也要考虑抽奖场景的特性，并不是所有的抽奖都可以进行裂变分享</li><li>或许有一种新的玩法：掷骰子，按点数打折。既有运气也有实力成分</li><li>亏损和逃避心理：先获得翻倍卡一小时内有效，再获得消费券。（直接给翻倍卡 or 抽中翻倍卡？）</li><li>凭实力+运气抽中（可以答题）炫耀后可以券翻倍或者再抽一次</li><li>列表页城市专享、日期特权等</li><li>学会造节日（全场造节，给用户一个为什么这么便宜的理由。如双十一、双十二；单品造节，如某某品牌回馈、成立多少年等）</li></ol>]]>
      </content:encoded>
    </item>
    <item>
      <title>Chrome 网页中同时查找多个关键词内容的方法</title>
      <link>https://imzl.com/chrome-search-for-multiple-keywords</link>
      <description>
        <![CDATA[<p>我自己是 Chrome 的忠实用户，十多年来就只用 Chrome 这一个浏览器。最频繁使用的功能是「关键词搜索（页内搜索）」。</p>
<p>只需要使用 <code>⌘ + F</code> 就可以快速打开「页内搜索」功能，输入关键词后即可在当前网页内查找关键词，但这功能只]]>
      </description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/tool/">工具</category>
      <category domain="https://imzl.com/tag/chrome/">Chrome</category>
      <category domain="https://imzl.com/tag/chrome-%E6%8F%92%E4%BB%B6/">Chrome 插件</category>
      <pubDate>Mon, 24 Aug 2020 13:46:30 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>我自己是 Chrome 的忠实用户，十多年来就只用 Chrome 这一个浏览器。最频繁使用的功能是「关键词搜索（页内搜索）」。</p><p>只需要使用 <code>⌘ + F</code> 就可以快速打开「页内搜索」功能，输入关键词后即可在当前网页内查找关键词，但这功能只支持单个关键词。如果想在网页内搜索多个关键词的话，就只能重复数次，非常麻烦。</p><h2 id="heading-1">CHrome 插件：Multi-highlight</h2><p>今天偶然在少数派上看到这款 Chrome 插件，试用后发现可完美解决该问题。</p><p>它支持同时高亮网页内的多个关键词，你只需要在输入时用空格或回车将关键词隔开即可在当前网页中搜索多个关键词。</p><p><img src="https://cdn.imzl.com/wp-content/uploads/2020/08/1598276448-Multi-highlight.png" alt=""></p><p>如上图，我同时搜索了「周良、问题、杭州、文件 」 4 个关键词。Multi-highlight 就会为关键词进行不同色彩的高亮显示，让我们更加精确地发现并区分它们。</p><p>并且这款插件对中文支持也基本没有问题，在特定页面中用它来进行信息挖掘相当称手，爱了。</p><h2 id="heading-2">快捷使用小技巧</h2><p>我们可以在 Chrome 中给插件设置一个特定的快捷键，用起来就方便了。快捷键设置操作如下：</p><ol><li>新建一个标签页；</li><li>地址栏输入 <code>chrome://extensions/shortcuts</code> 后访问；</li><li>找到 Multi-highlight 插件，设置一个快捷键即可。</li></ol><h2 id="heading-3">安装 Multi-highlight 插件</h2><p>你可以在  <a href="https://chrome.google.com/webstore/detail/multi-highlight/pfgfgjlejbbpfmcfjhdmikihihddeeji">Chrome 网上应用商店</a>  免费获取 Multi-highlight。</p>]]>
      </content:encoded>
    </item>
    <item>
      <title>解决 WordPress 错误页面无法正确识别为 404 页面问题</title>
      <link>https://imzl.com/wordpress-not-recognized-404</link>
      <description>
        <![CDATA[<p>上文说到最近给<a href="https://imzl.com/zlbk-net">周良博客换了 imzl.com 域名</a>，服务器迁移到了阿里云 ECS 杭州。文件数据迁移、部署新服务器环境、Https 证书部署、<a href="https://imzl.com/]]>
      </description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/wordpress/">WordPress</category>
      <category domain="https://imzl.com/tag/wordpress-tutorial/">WordPress 教程</category>
      <category domain="https://imzl.com/tag/wordpress-skill/">WordPress 技巧</category>
      <category domain="https://imzl.com/tag/lnmp/">LNMP</category>
      <category domain="https://imzl.com/tag/nginx/">nginx</category>
      <category domain="https://imzl.com/tag/%E7%BD%91%E7%AB%99%E7%BB%B4%E6%8A%A4/">网站维护</category>
      <category domain="https://imzl.com/tag/pathinfo/">pathinfo</category>
      <pubDate>Thu, 06 Aug 2020 13:29:45 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>上文说到最近给<a href="https://imzl.com/zlbk-net">周良博客换了 imzl.com 域名</a>，服务器迁移到了阿里云 ECS 杭州。文件数据迁移、部署新服务器环境、Https 证书部署、<a href="https://imzl.com/wordpress-301">老域名 301</a>、静态文件上阿里云 OSS 等流程基本轻车熟路。整个过程没出什么问题，返倒是网站上线后遇到一个奇怪的问题。</p><p>WordPress 居然不能正确识别错误网页跳转到 404 页面了。</p><h2 id="heading-1">状况概述</h2><p>这个大概的表现情况就是：</p><ul><li>访问 <a href="https://imzl.com/404/">https://imzl.com/404/</a> 这个无内容页面，正常逻辑上是跳转 ng 设置或者 WordPress 主题自带的 404 页面，但实际情况这个页面居然直接显示了博客首页的内容。</li><li>而访问 <a href="https://imzl.com/404">https://imzl.com/404</a> 这个 URL，可以正常识别无效页面，显示为 404 页面。</li></ul><p>懵逼不懵逼？也就是说，博客所有 URL 不为 .html 结尾的 404 页面，打开后全部都会显示博客首页内容，这个事情体验太差了。</p><h2 id="heading-2">问题排查路径</h2><p>记录一下我的问题排查过程，可能你没有遇到问题，但这个一步步控制变量、提出假设验证假设的排查逻辑方法说不对你有用。</p><h3 id="heading-3">排查 WordPress 主题是否出错</h3><p>最初步的猜测可能是主题有问题：换一个已知没问题主题进行测试。因为我手上有两个博客，都换成相同主题，实测 WordPress 主题没问题，排除该原因。</p><h3 id="heading-4">排查 Nginx 配置是否有误</h3><p>既然是跳转问题，猜测可能是 Nginx 配置文件规则写错了。查看 WordPress Nginx 配置文档说明，对比后后确认规则无误，可排除规则引起问题。</p><p>但不能完全排除 Nginx 无问题，我又将将相同规则的 nginx 应用于另外站点，也未发现问题。再确定两个站对比变量是否一致，发现阿里云上挂了两个站，测试 VPS 上只有一个站，抱着试一试的心态，去测试服务器上又挂了一个站。</p><p>问题复现，那基本可以确认问题出在 Nginx 配置文件上。</p><h2 id="heading-5">最终解决</h2><p>本身我对 Nginx 不会做频繁更改，一直就只会写那么几个固定的规则。所以选择了求助大牛这条路。因为服务器环境是用 LNMP 搭建的，所以找了 LNMP 一键安装包的作者<a href="https://bbs.vpser.net/">@军哥</a> 咨询。说明遇到的问题、当前的排查方法和对应结果。</p><p>最后猜测是 Nginx 配置中开启了 <strong>pathinfo</strong> 导致。</p><h3 id="heading-6">LNMP WordPress 站点关闭 pathinfo 方法</h3><ol><li>找到 Nginx 配置文件，一般在 <strong>/usr/local/nginx/conf</strong> 目录。</li><li>找到 <strong>include enable-php-pathinfo.conf;</strong></li><li>将其修改为 <strong>include enable-php.conf;</strong></li><li>终端链接服务器，输入 <strong>service nginx restart</strong> 重启 Nginx。</li><li>问题解决。</li></ol>]]>
      </content:encoded>
    </item>
    <item>
      <title>WordPress 文章内容自动为 a、p 等标签插入指定 Class 方法</title>
      <link>https://imzl.com/wordpress-content-insert-class</link>
      <description>WordPress 文章内容自动为 a、p 等标签插入指定 Class 方法。</description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/wordpress/">WordPress</category>
      <category domain="https://imzl.com/tag/wordpress-tutorial/">WordPress 教程</category>
      <category domain="https://imzl.com/tag/wordpress-skill/">WordPress 技巧</category>
      <pubDate>Fri, 31 Jul 2020 15:10:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>上周在写个主题，因为引用了开源的 CSS 框架，各类前端标签添加 Class 就行，比较简单。但写到文章内容的时候就有问题了，内容都是 WP 自己输出的，我控制不了所使用的 Class。</p><p>问了一下 @desin（我爱水煮鱼博客作者） 有没有不写 js 去添加 class 的方式，desin 提到可以看一下 content 的文档。研究了一下，问题解决。</p><p>代码丢上来，仅供大家参考，复制下面的代码丢到主题 <code>function.php</code> 文件的 <code>&lt;?php</code> 下面一行即可 ：</p><pre><code class="highlight php"><span class="comment"># 文章内 img 标签自动添加 img-res Class</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>同理，你要控制 p 标签的话，代码如下：</p><pre><code class="highlight php"><span class="comment"># 文章内 p 标签自动添加 mt1em mb1em lh-180 三个 Class</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>解决 WordPress 长时间处于「正在执行例行维护，请一分钟后回来」状态问题</title>
      <link>https://imzl.com/wordpress-scheduled-maintenance</link>
      <description>原来 WordPress 在升级程序、主题和插件时，会切换到维护模式。这个时候访问网站前台会显示「正在执行例行维护，请一分钟后回来」，如果升级顺利几秒左右就会恢复正常。但遇到网络不佳等特殊情况会导致升级中断，WordPress 就会一直停留在维护模式，不论前台还是后台，都一直显示「正在执行例行维护，请一分钟后回来」。</description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/wordpress/">WordPress</category>
      <category domain="https://imzl.com/tag/wordpress-tutorial/">WordPress 教程</category>
      <category domain="https://imzl.com/tag/wordpress-skill/">WordPress 技巧</category>
      <pubDate>Fri, 31 Jul 2020 14:54:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>今天给个人博客升级插件的时，遇到个问题：前后台一直停留在空白页面并显示「正在执行例行维护，请一分钟后回来」，一脸懵逼。</p><p>原来 WordPress 在升级程序、主题和插件时，会切换到维护模式。这个时候访问网站前台会显示「正在执行例行维护，请一分钟后回来」，如果升级顺利几秒左右就会恢复正常。但遇到网络不佳等特殊情况会导致升级中断，WordPress 就会一直停留在维护模式，不论前台还是后台，都一直显示「正在执行例行维护，请一分钟后回来」。</p><h2 id="heading-1">如何解决这个问题呢</h2><p>删除网站根目录下的 <code>.maintenance</code> 文件。</p><p><code>.maintenance</code> 是个隐藏文件，通过 FTP 登陆一般看不到，建议 SSH 登录。可按如下步骤处理：</p><ol><li><code>cd /home/xxx/xxx</code> 进入对应出问题的 WordPress 网站根目录；</li><li><code>ls -a</code> 列出当前目录含隐藏文件的所有文件，看看有没有 <code>.maintenance</code>，有的话执行删除；</li><li><code>rm -rf .maintenance</code> 回车删除，问题解决。</li></ol>]]>
      </content:encoded>
    </item>
    <item>
      <title>WordPress 更换域名后完美 301 跳转方案</title>
      <link>https://imzl.com/wordpress-301</link>
      <description>
        <![CDATA[<p>最近给<a href="https://imzl.com" title="个人博客">个人博客</a>更换了域名，更换完成后需要做新老域名的 301 跳转，比如访问 <a href="https://imzl.com">https://zlbk.net</a>（老域名）自动]]>
      </description>
      <author>周良 Len</author>
      <category domain="https://imzl.com/categories/wordpress/">WordPress</category>
      <category domain="https://imzl.com/tag/wordpress-tutorial/">WordPress 教程</category>
      <category domain="https://imzl.com/tag/wordpress-skill/">WordPress 技巧</category>
      <pubDate>Fri, 24 Jul 2020 08:26:00 GMT</pubDate>
      <content:encoded>
        <![CDATA[<p>最近给<a href="https://imzl.com" title="个人博客">个人博客</a>更换了域名，更换完成后需要做新老域名的 301 跳转，比如访问 <a href="https://imzl.com">https://zlbk.net</a>（老域名）自动跳转到 <a href="https://imzl.com">https://imzl.com</a>（新域名），无缝切换。</p><p>不仅提升访客体验，还可以转移网址权重、搜索引擎收入。本文主要记录域名 301 的方法。</p><h2 id="heading-1">使用 WordPress 程序实现对应 URL 301 跳转</h2><ol><li>需要注意，本文提供的方法需要保留原站点 WordPress 文件，如果直接在原程序代码上跑了 SQL 替换域名，老域名没有绑定另外的 WP 站点，无法使用该方法。</li><li>找到 WordPress 根目录下的 <code>wp-blog-header.php</code> 文件，并在文件第一行 &lt;?php 下方加入以下代码：</li></ol><pre><code class="highlight php"><span class="comment">// WordPress 更换域名 301 跳转</span><span class="comment">// 请将 imzl.com 替换为你的新站域名</span><span class="keyword">if</span> (<span class="title function_ invoke__">strtolower</span>(<span class="variable">$_SERVER</span>[<span class="string">&#x27;SERVER_NAME&#x27;</span>])!=<span class="string">&#x27;imzl.com&#x27;</span>)&#123;<span class="variable">$URIRedirect</span>=<span class="variable">$_SERVER</span>[<span class="string">&#x27;REQUEST_URI&#x27;</span>];<span class="keyword">if</span>(<span class="title function_ invoke__">strtolower</span>(<span class="variable">$URIRedirect</span>)==<span class="string">&quot;/index.php&quot;</span>)&#123;<span class="variable">$URIRedirect</span>=<span class="string">&quot;/&quot;</span>;&#125;<span class="title function_ invoke__">header</span>(<span class="string">&#x27;HTTP/1.1 301 Moved Permanently&#x27;</span>);<span class="title function_ invoke__">header</span>(<span class="string">&#x27;Location:https://imzl.com&#x27;</span>.<span class="variable">$URIRedirect</span>);<span class="keyword">exit</span>();&#125;</code></pre><ol start="3"><li>替换服务器上的对应文件，解决。</li></ol><h2 id="heading-2">通过 Nginx 实现站点对应 URL 301 跳转</h2><p>该方法无需保留 WordPress 程序代码。</p><ol><li>找到 Nginx 文件，在 <code>server_name</code> 下方添加如下代码：</li></ol><pre><code class="highlight plaintext">// 请将 imzl.com 替换成你的新站点域名return 301 https://imzl.com$request_uri;</code></pre><ol start="2"><li>将修改后的 Nignx 文件上传，并通过终端使用  <code>service nginx restart</code> 命令重启 Nginx。</li></ol>]]>
      </content:encoded>
    </item>
  </channel>
</rss>
