<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Hi, DIYgod</title><description>写代码是热爱，写到世界充满爱！</description><link>https://diygod.cc</link><item><title>2025 重新定义的生活</title><link>https://diygod.cc/2025</link><guid>2025</guid><description>AI 生产力革命与迷茫、迎来新生命、努力搞钱、不合时宜的开源思维、赛博生活</description><pubDate>Thu, 25 Dec 2025 04:00:00 GMT</pubDate><content:encoded>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;h2 id=&quot;ai-生产力革命与迷茫&quot;&gt;AI 生产力革命与迷茫&lt;/h2&gt;
&lt;p&gt;四年前我准备读研，那时对图像视频处理很感兴趣，所以最开始想学计算机视觉。后来发现传统 CV 已经是夕阳产业，被深度学习全面吊打，于是干脆选了 Artificial Intelligence。&lt;/p&gt;
&lt;p&gt;当时只是走马观花学一些概念，没想到不到两年，AI 就彻底爆发。2023 年 3 月 GPT-4 发布，震惊了全世界。到今年，AI 更进一步，开始实打实地改变很多行业的工作方式，也改变了很多人的生活方式。&lt;/p&gt;
&lt;p&gt;我作为程序员和插画爱好者，几乎在两个方向同时感受到了冲击。一方面是效率暴涨带来的兴奋，另一方面是越来越强的迷茫，甚至演化成一种存在危机。不是那种轻飘飘的焦虑，而是你突然意识到自己赖以立足的东西正在被改写，而且改写得非常快。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;插画：从多年练习到输入一句话&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;原创画师可能是最早被冲击的一批。Stable Diffusion 刚出现时，画师群体曾激烈抵制。可怕的是，再后来就听不见他们的声音了。并不是他们妥协了，而是 AI 作品真的太好、太快，快到很多争论甚至来不及发生就已经失效。&lt;/p&gt;
&lt;p&gt;随后有一部分原创画师开始接受 AI，把它当成辅助工具，也有大量使用 AI 的新人涌入，用更低门槛、更高产出的方式加入创作。&lt;/p&gt;
&lt;p&gt;创作门槛一路下探，从需要数年的学习与练习，到买一块好显卡折腾几天，再到现在打开网页、输入想法、等几秒钟。更进一步，插画到动画、到视频也在被快速打通。某种意义上，人人都是画师不再是夸张，而更像是正在发生的现实。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;编程：从片段补全到接管项目&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1945335801266721237&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1945335801266721237.BDfbR04k_m7bsz.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;1072&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;程序员这边的变化也许会走向同一个结果，只是没有那么立刻和直观。2022 年大家还在用 GitHub Copilot 做自动补全，今年专用 AI Coding 模型与 vibe coding 工具层出不穷，很多时候已经变成你用自然语言描述需求，AI 写代码、改代码、修 bug、补测试，甚至能产出一个完整项目。&lt;/p&gt;
&lt;p&gt;对程序员来说，vibe coding 能把生产力拉高数倍，对非程序员来说，coding 也不再是程序员的专属技能。越来越多人不写一行代码，也能做出精美应用，解决自己的真实需求。编程正在从一种职业技能，变成一种人人都能动手的表达方式。&lt;/p&gt;
&lt;p&gt;于是，程序员的工作方式正在被改写。传统意义上那种手写代码的「代码匠人」会越来越少，很多方向会像传统 CV 一样被 AI 替代。我也越来越少亲手写代码了，越来越习惯和编辑器右侧触手可及的 AI 沟通。它完成得又快又好，而且越来越好，从工具到助手，再到一种近乎替代本体的存在。&lt;/p&gt;
&lt;p&gt;这种替代感最刺痛的地方在于它并不只替代体力活。它在替代判断、套路、经验和熟练度，也在替代我曾经引以为傲的学习速度。我学到的知识在贬值，我积累的经验在贬值，我拥有的技能在贬值，甚至连智力和创造力也在贬值，而且贬值速度似乎远高于我的成长速度。等程序员岗位真的消亡之后，我的价值在哪里。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1945354030839898431&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1945354030839898431.N1LnmvXF_27vjTW.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1100&quot; height=&quot;660&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;但当下程序员显然还是无法被完全替代，也许 AI 也会像摩尔定律一样发展到一定程度会碰壁。现在能做的是好好驾驭这股力量，积极参与这次生产力革命，希望能在其中找到自己的位置和无法被替代的独特价值。&lt;/p&gt;
&lt;h2 id=&quot;迎来新生命&quot;&gt;迎来新生命&lt;/h2&gt;
&lt;p&gt;不管 AI 怎么发展，碳基生命孕育新生命的过程，在可预见的将来还无法被硅基生命取代。&lt;/p&gt;
&lt;p&gt;知道发小（老婆）怀孕的那一刻，我更多是手足无措。但从那时起，很多心理和生活习惯就悄悄围绕这个即将到来的新生命发生变化。&lt;/p&gt;
&lt;p&gt;发小的怀孕过程漫长又辛苦。前期孕吐昏天黑地，嗅觉变得异常敏感，平时正常的气味也会难以忍受，喜欢的食物吃不下去，激素让情绪波动更明显。中期好一些，后期肚子越来越大，腰酸背痛、睡眠下降、行动不便，走路都成问题。但发小还是表现出了惊人的坚韧和乐观，承受住了这些考验，还把产检、备产、育儿安排得井井有条。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/2-4.BE5zxupI_Z1Pq6IP.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;5472&quot; height=&quot;3648&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;与此同时，我也亲眼见证了生命如何一点点成形：从一个 2mm、模糊不清的小点开始——&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/2-1.CTs37CZi_drje1.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1280&quot; height=&quot;806&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;慢慢初具人形——&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/2-2.BrfMNF50_1qrbfj.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1280&quot; height=&quot;810&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;再到四肢、五官清晰可见，能在肚子里动来动去、打嗝、做体操。几个月来，我几乎无时无刻不在感叹和敬畏生命的神奇，碳基生命扳回一局！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/2-3.TEndI9aX_Z19rFO2.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1136&quot; height=&quot;787&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;终于熬到 7 月 27 日晚上，哈哈（女儿）出生。还没来得及舒一口气，就被告知她血氧持续下降，被紧急转入 NICU 重症监护室观察治疗。&lt;/p&gt;
&lt;p&gt;当时一边是发小大手术后意识不清，一边是刚出生的哈哈生死未卜。那一夜大概是我人生最黑暗的时刻。发现自己平时拥有的那些判断力、解决问题的能力、甚至乐观，都在这种时刻毫无用处。唯一能做的就是等，等一个并不确定会到来的好消息。&lt;/p&gt;
&lt;p&gt;幸好经过几天治疗，哈哈脱离生命危险，有惊无险，出院回家。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1949827364008947806&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1949827364008947806.CmWxYMX8_Zp0yg2.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;1168&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1951235222676316241&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1951235222676316241.CH6pDtvv_14UKlc.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;3648&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1952376061318377652&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1952376061318377652.B2o-dZ1y_Z2sHWz9.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2032&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;经历过 NICU 之后，生活变得顺利起来，家里有发小和女佣照顾哈哈，哈哈每天都在成长，学会抓东西、翻身，开始有情绪、会认人。她也真的很可爱，每次出门遛娃，路人都会凑过来夸几句。&lt;/p&gt;
&lt;p&gt;作为新手爸爸当然会疲惫，但更多的是一种很踏实的幸福感，它不需要被证明，也不需要被解释，它只是会在你抱起她的那一刻变得非常确定。&lt;/p&gt;
&lt;h2 id=&quot;努力搞钱&quot;&gt;努力搞钱&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1874129585069318349&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1874129585069318349.UpTMNRRT_Z1omslW.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;784&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;众所周知，孩子是一只四脚吞金兽。一出生还没出院就吞掉了 S$100000，这件事非常直观地刷新了我对现实的理解。&lt;/p&gt;
&lt;p&gt;前面说发小怀孕后，我的心理发生了很多变化，其中最关键的就是金钱观的变化。&lt;/p&gt;
&lt;p&gt;以前我当然也想赚钱，但总体是够用就行。钱更像是实现爱好、维持生活的手段，而不是最终目的，所以在赚钱这件事上相对懒惰。比如之前选择工作时，我会毫不犹豫放弃双倍薪资的币安而去更符合爱好的哔哩哔哩，又比如四年前 Web3 牛市满地捡钱，我却无动于衷。这也导致我过去在个人财务上一直挺失败。&lt;/p&gt;
&lt;p&gt;现在的这种变化有点像从无所谓直接滑到了过度补偿。我开始更在意安全感，也更容易把安全感和金钱绑定，钱对我的优先级被极大提升，我也更清楚地意识到，很多选择的底气最终还是来自现金流和风险承受能力。&lt;/p&gt;
&lt;p&gt;今年我开始更主动地投资加密货币。四年前入行 Web3，去年才开始主动买币，这件事本身也挺神奇。过程非常曲折，中间有一段时间亏了很多钱，也买到了很多教训。好在最终结果还不错，而那些教训甚至比阶段性的收益更宝贵。&lt;/p&gt;
&lt;p&gt;今年的收益率曲线（实现方法见 &lt;a href=&quot;/beancount&quot;&gt;上古神器 Beancount：Crypto 与 AI 时代的复式记账终极方案&lt;/a&gt;）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/3-1.BeiWvHUb_2t4KJz.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1978&quot; height=&quot;1002&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;从凭感觉到有体系&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我的投资经历可以粗略分成两段，以三月为分水岭。&lt;/p&gt;
&lt;p&gt;三月之前，我对策略和 K 线这些知识几乎一无所知，也没用任何分析工具，基本凭感觉和情绪买卖，像一种定投，跌了卖点，涨了卖点。因为市场整体向上、波动不算剧烈，所以哪怕闭眼瞎买，收益也还不错，甚至让我有点沾沾自喜。&lt;/p&gt;
&lt;p&gt;但赌博最怕的就是一开始给你一点甜头。&lt;/p&gt;
&lt;p&gt;后来遇到二月关税战带来的市场恐慌大跌，我损失惨重。我当时的心路大概是这样的：第一段下跌时我觉得是绝佳抄底机会，几乎掏出全部家当抄底；市场继续下跌时我开始心态崩，但还想扛一扛，拒绝止损；第三段更猛时我彻底崩溃，把所有持仓割肉卖掉。结果买在高点，卖在最低点，市场又很快反弹。&lt;/p&gt;
&lt;p&gt;现在回看，我做得稍微对的一点是胆子小，没有上杠杆，否则更惨。更多的是犯了一堆典型错误，没有策略，被情绪控制，大仓位抄底，没有仓位管理，追涨杀跌…&lt;/p&gt;
&lt;p&gt;三月之后，我开始系统学习分析方法和工具，开始设置止损止盈、控制仓位、控制情绪，不再盲目抄底和追涨杀跌，慢慢搭起一套更可持续的交易体系，亏的赚回来了，还额外赚了一些，到了今年的 1011 闪崩，或者年底的牛尾行情，这些下跌幅度比二月份更猛，我也没有再明显亏钱。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;工具与策略&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;交易平台我主要用 &lt;a href=&quot;https://www.bjwebptyiou.com/join/1876626&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;OKX&lt;/a&gt;，手续费低，闲钱用简单赚币和偶尔闪赚做点低风险收益也不错。行情分析主要用 &lt;a href=&quot;https://cn.tradingview.com/pricing/?share_your_love=DIYgod&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;TradingView&lt;/a&gt;，功能强大、指标丰富。冷钱包用 &lt;a href=&quot;https://onekey.so/r/N9AHU3&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;OneKey&lt;/a&gt;，热门冷钱包安全性都过关，但 OneKey 的操作体验对我来说是断崖领先。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1901239258331169099&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1901239258331169099.77NzdT-p_Z1drLSf.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;976&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;至于策略，我现在更像是在不断给自己加护栏，而不是追求某种神奇圣杯。我会提醒自己，无论当下多么有把握，市场都可能上涨，也可能下跌，但是不排除横盘的可能。我会合理安排并经常回顾现金、屯币、风险投资的比例。我宁愿少赚钱也不碰自己不理解、或未经充分博弈的东西，有耐心，理解慢即是快，活下来最重要，所以现在基本只交易 BTC、ETH。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/2000744194747588621&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-2000744194747588621.BsD8yvgJ_Z2eQnzf.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;784&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我也会严格控制杠杆，绝大多数是 1 倍，最多不超过 3 倍。止损要清晰，愿意认错，不扛单。DeFi 尽量少碰，因为当你不知道理财的利润从哪里来时，说明你就是那个利润。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1990353824192843862&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1990353824192843862.Bxl9rheC_Z15eiev.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2144&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;手动交易只看 4 小时以上的中长线，短线交给自动化策略，尽量减少短期情绪的影响。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1948375038517727446&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1948375038517727446.CQSpYYGy_2cg23C.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;784&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一些片段留念：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1972109779322745148&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1972109779322745148.BlhGWAg0_F64Nd.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;880&quot; alt=&quot;&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://x.com/DIYgod/status/1959155822518206531&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1959155822518206531.DOgBbF47_1gJHsz.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;1608&quot; alt=&quot;&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://x.com/DIYgod/status/1993890218555134464&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1993890218555134464.A_S8il_b_212VfM.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2868&quot; alt=&quot;&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://x.com/DIYgod/status/1962515701245337648&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1962515701245337648.CFLim87f_ZGy5WX.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;1852&quot; alt=&quot;&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://x.com/DIYgod/status/1937436310995894571&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1937436310995894571.B_7Tb3fr_Z1izNKn.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2200&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;不合时宜的开源思维&quot;&gt;不合时宜的开源思维&lt;/h2&gt;
&lt;p&gt;相比金钱观的快速转变，我在技术和产品上的观念转得没那么顺利。今年最主要的工作是 Folo。Folo 本身做了很多，新移动端、本地优先架构、AI 等等。但商业化的实施和验证推进太慢，再加上一些现实因素，后来不得不做出一些仓促转型。很多技术上的投入看起来像自娱自乐。更糟的是，团队里也出现过让人头疼的协作问题，甚至有员工离职后的背刺，搞得鸡飞狗跳，还更狗血地牵扯出其他幕后黑手和一串让人哭笑不得的阴谋故事，这里就不展开了。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1995843301757604043&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1995843301757604043.C0LiyX00_QiGuL.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;1168&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;回头看，商业化延迟与转型仓促并非偶然，而是从始至终根深蒂固在我和团队的开源思维和技术思维里。&lt;/p&gt;
&lt;p&gt;开源本身当然没有问题。开源是一个很好的方式，用来实现爱好、做 side project、学习新知识。问题在于把过多开源思维混进一个需要严谨商业闭环的产品里，下场往往不会好。因为开源默认的是负收益的热情驱动、社区驱动、长期慢速打磨，而商业默认的是资本驱动、资源有限下的快速取舍。&lt;/p&gt;
&lt;p&gt;如果把这种错配具体化，它会体现在很多地方。比如产品会缺少严谨的准备，方向更容易摇摆；用户混入大量低付费意愿人群，后续转型阻力较大；过于看重小众反馈，产品容易被拉向小众方向；团队招募与管理过于宽松，执行力不足、内耗严重；浪费大量时间追求没人在意的技术与设计细节的完美，付出巨大的时间机会成本等等。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/2003389654951952683&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-2003389654951952683.lueJgu6J_Z1TBBPE.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2048&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;对我来说，今年像是一堂延迟很久的商业常识课。它并不反对理想，也不反对开源，但它逼着我承认，理想需要边界，热爱需要成本表，选择需要对结果负责。把这些讲清楚很俗，可它就是现实。&lt;/p&gt;
&lt;p&gt;而即使脱离现实，在开源象牙塔之内，对于以个人兴趣为主的开源项目来说，作者的爱好也往往会在长期孤独的维护中，在白嫖者和伸手党的理直气壮中，被一点点消磨殆尽。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1932703374283284812&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1932703374283284812.D3Rolmrp_1t7pxK.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2324&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;经历这些事情之后，我开始重新审视开源对我而言究竟意味着什么。我对开源的态度，也从过去的绝对推崇，变成了一种带着警惕甚至轻微 PTSD 的复杂情绪。今后对开源的投入我应该也会更加兼顾现实、克制和有选择性。&lt;/p&gt;
&lt;h2 id=&quot;赛博生活&quot;&gt;赛博生活&lt;/h2&gt;
&lt;p&gt;来点轻松的，按惯例，总结一下今年的书影音游戏和应用。&lt;/p&gt;
&lt;h3 id=&quot;应用&quot;&gt;应用&lt;/h3&gt;
&lt;p&gt;年度应用当然是 Folo。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/5-1.CIpIsGRi_Z1R9LPS.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3840&quot; height=&quot;2400&quot; alt=&quot;&quot;&gt;
&lt;img src=&quot;https://diygod.cc/_astro/5-2.DEeG6jwf_ZWEV2x.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2633&quot; height=&quot;1438&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;它花掉了我今年大部分时间和精力，也留下了一些痛苦回忆。但如果你有稳定的阅读习惯，也有管理信息源的能力，Folo 依然是我心里目前最好的信息聚合应用。&lt;/p&gt;
&lt;p&gt;桌面应用（顺便一提：AI 应用比例挺高，6/13）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Notion Calendar：日历客户端，体验比 Apple Calendar 好不少，UI 也更简洁。&lt;/li&gt;
&lt;li&gt;Spark：邮件客户端。Spark V2 用了很久，V3 刚出时太难用，换到 Mimestream；但 Mimestream 太贵（一年 50 刀），用了一年又换回 Spark，发现现在已经成熟很多，虽然默认设置依然很反人类，但基本都能在选项里改掉。&lt;/li&gt;
&lt;li&gt;TickTick：待办事项。&lt;/li&gt;
&lt;li&gt;&lt;del&gt;ChatGPT Atlas：浏览器。只能算暂时最优解；问题依然很多，尤其 DevTools 太差。我感觉还是应该返璞归真：如果 Chrome 正式支持竖标签页，我就会换回 Chrome。&lt;/del&gt;&lt;/li&gt;
&lt;li&gt;Chrome：浏览器。Arc → Dia → ChatGPT Atlas → Chrome，刚写完这篇年终总结 Atlas 自己爆炸了，正好返璞归真了。
&lt;a href=&quot;https://x.com/DIYgod/status/2001635623812370563&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-2001635623812370563.Dwl3MAXr_BChbD.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2428&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Warp：终端。&lt;/li&gt;
&lt;li&gt;Folo：自己做的阅读器。&lt;/li&gt;
&lt;li&gt;VSCode：代码编辑器。VSCode → Cursor → Codex 出来后又换回 VSCode。&lt;/li&gt;
&lt;li&gt;Notion：写日记。早些年就是 Notion，后来看到 Obsidian 插件生态好，换到 Obsidian（见 &lt;a href=&quot;/obsidian&quot;&gt;基于 Obsidian 的生活记录系统&lt;/a&gt;），但后来发现这些都不重要——写作体验才决定你愿不愿意写、能写多少。Obsidian 受限于 Markdown 能力，始终追不上 Notion，加上 Notion 在 AI 上越投入越多，于是又换回来了。&lt;/li&gt;
&lt;li&gt;Plex：媒体服务器，看 NAS 上的电影、电视剧和番剧。&lt;/li&gt;
&lt;li&gt;网易云音乐：按理说在国外应该用 Spotify，但 Spotify 的推荐实在不对我胃口。网易云音乐又因为版权不提供海外服务，只能在 NAS 跑 UnblockNeteaseMusic 做代理，很麻烦。&lt;/li&gt;
&lt;li&gt;Telegram / Discord / Slack / WhatsApp / 微信：即时通讯，越来越分散了。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://onekey.so/r/N9AHU3&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;OneKey&lt;/a&gt;：冷钱包，体验断崖领先（上一节也提过）。&lt;/li&gt;
&lt;li&gt;Eagle：图片管理。&lt;/li&gt;
&lt;li&gt;Googly Eyes：一双眼睛。
&lt;a href=&quot;https://x.com/DIYgod/status/1899649650841571686&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1899649650841571686.DWSUPBJ7_1SI0ID.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1100&quot; height=&quot;1216&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;NAS 在跑的服务：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AdGuard Home：广告屏蔽 + 家庭网络更快的 DNS。&lt;/li&gt;
&lt;li&gt;Fava：记账，见 &lt;a href=&quot;/beancount&quot;&gt;上古神器 Beancount：Crypto 与 AI 时代的复式记账终极方案&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;Gitea：托管一些不适合公开的代码。&lt;/li&gt;
&lt;li&gt;Home Assistant：智能家居控制。经常搬家没怎么搞智能家居了，主要用来做备用机充电管理、设备定时开关机。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gethomepage.dev&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;homepage&lt;/a&gt;：服务太多，用一个入口集中管理。&lt;/li&gt;
&lt;li&gt;Nginx Proxy Manager：给各服务分配域名，访问更方便。&lt;/li&gt;
&lt;li&gt;OpenList：自动下载阿里云盘、PikPak 等保存的内容到 NAS。&lt;/li&gt;
&lt;li&gt;UnblockNeteaseMusic：让网易云音乐在国外也能用。&lt;/li&gt;
&lt;li&gt;Uptime Kuma：监控服务可用性。&lt;/li&gt;
&lt;li&gt;ANI-RSS：追番自动下载订阅番剧。&lt;/li&gt;
&lt;li&gt;bili-sync：下载哔哩哔哩收藏夹视频到 NAS。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;电子产品&quot;&gt;电子产品&lt;/h3&gt;
&lt;p&gt;年度电子产品是 OneKey Pro。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/5-4.BG6lJ3tU_2wrnbS.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1600&quot; height=&quot;1076&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;雷鸟 V3 让我有点失望。我一直对 Meta 的 AI 眼镜很感兴趣，以为过了这么久，国产竞品会更成熟，结果挺拉的。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1895461087652581702&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1895461087652581702.Dppa4VPt_gTq3d.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2808&quot; alt=&quot;&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://x.com/DIYgod/status/1938871051859173499&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1938871051859173499.BUbD0Ikz_2paMSl.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;3140&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;iPhone 13 mini 已经用了四年多，感觉还能再战几年。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1965676625888235925&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1965676625888235925.DRK062Se_ZGpysK.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2048&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;OPPO Watch X2 倒是很满意。小米手环用腻了，换了一个屏幕更大的智能手表，用起来很顺手。它有全智能和轻智能两种模式，全智能是完整 Android，轻智能像大号手环，续航超强，健康功能也不错，还能提醒我高血压风险。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1908104944160555401&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1908104944160555401.BQPaCJAF_1RkB6P.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2036&quot; alt=&quot;&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://x.com/DIYgod/status/1921387552634869763&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1921387552634869763.DzxWKmD-_2thXno.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2048&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;以及 OneKey Pro 和 OneKey Classic 1S Pure。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1926533360794394849&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1926533360794394849.rwCrMK10_PQR5g.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2048&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;影视&quot;&gt;影视&lt;/h3&gt;
&lt;p&gt;年度影视是《链锯人 总集篇》。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/5-3.D-g6d8Zj_3F2jw.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;686&quot; height=&quot;386&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;节奏比 TV 版好很多，不少拖沓部分被剪掉，整体观感提升明显。真希望鬼灭也能出个总集篇。&lt;/p&gt;
&lt;p&gt;今年时间基本都花在 Folo 上了，所以影视数量很惨淡。&lt;/p&gt;
&lt;p&gt;番剧：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;链锯人 剧场版：蕾塞篇（第二喜欢，蕾塞好女人）
&lt;a href=&quot;https://x.com/DIYgod/status/1966451474348507570&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1966451474348507570.CxOywCFh_Z29F0pv.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2156&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;链锯人 总集篇&lt;/li&gt;
&lt;li&gt;鬼灭之刃：无限城篇 第一章 猗窝座再袭（专门去电影院看了。可能期望太高，有点失望；对猗窝座无感）
&lt;a href=&quot;https://x.com/DIYgod/status/1956229077934989788&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1956229077934989788.DGZsg1ob_Z26oWMn.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2284&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;章鱼噼的原罪（新番里最喜欢）
&lt;a href=&quot;https://x.com/DIYgod/status/1957666854098596130&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1957666854098596130.CLolmQXk_ZrO9RJ.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;1304&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;永久的黄昏&lt;/li&gt;
&lt;li&gt;间谍过家家 第三季&lt;/li&gt;
&lt;li&gt;光逝去的夏天
&lt;a href=&quot;https://x.com/DIYgod/status/1941803538507759698&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1941803538507759698.rihybmdc_1iluG1.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2188&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;琉璃的宝石&lt;/li&gt;
&lt;li&gt;启示录酒店&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;电视剧：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;行尸走肉 1-11 季&lt;/li&gt;
&lt;li&gt;怪奇物语 1-4 季（在新加坡环球影城万圣节活动看到怪奇物语主题鬼屋，以为没看过，就补了，结果发现三年前已经看过……）&lt;/li&gt;
&lt;li&gt;黑镜 第七季&lt;/li&gt;
&lt;li&gt;爱，死亡和机器人 第四季&lt;/li&gt;
&lt;li&gt;无耻之徒 1-3 季&lt;/li&gt;
&lt;li&gt;长安的荔枝&lt;/li&gt;
&lt;li&gt;最后生还者 第二季&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;电影：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;浪浪山小妖怪&lt;/li&gt;
&lt;li&gt;哪吒之魔童闹海&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;图书与游戏&quot;&gt;图书与游戏&lt;/h3&gt;
&lt;p&gt;今年一本书都没看完，略过。&lt;/p&gt;
&lt;p&gt;游戏和发小打了几个小时《双影奇境》，还没通关，还打了几天《王者荣耀》，没有其他的了。&lt;/p&gt;
&lt;h2 id=&quot;其他值得一提的&quot;&gt;其他值得一提的&lt;/h2&gt;
&lt;h3 id=&quot;健康&quot;&gt;健康&lt;/h3&gt;
&lt;p&gt;去年体检发现肝指标非常差，再这样下去可能要出大问题。之后被发小强制要求 10 点上床，作息规律很多，现在大概是 12 点睡、8 点起。但今年没体检，还不知道指标有没有改善。&lt;/p&gt;
&lt;p&gt;哈哈出生后家里有女佣做饭，饮食更健康了。我还戒了碳水，把豆浆当主食，体重轻了 10 斤，但离标准体重还差 10 斤。运动依然几乎没有，不过每天出门遛娃，步数还是多了一点。&lt;/p&gt;
&lt;p&gt;另一方面身体机能的衰退也越来越明显。主要体现在精力的下降和已知薄弱部位上。筋膜炎、颈椎病、膝盖疼痛、牙周炎等老毛病都有所加重，精力也大不如从前，今年开始习惯通过外力（咖啡因、牛磺酸）来维持工作效率，但也导致了依赖，尝试停止牛磺酸摄入时就会出现剧烈头痛，只能通过止痛药来缓解。&lt;/p&gt;
&lt;h3 id=&quot;居住&quot;&gt;居住&lt;/h3&gt;
&lt;p&gt;家里多了哈哈之后变得异常拥挤，于是换了更大的房子，从新加坡女皇镇搬到偏远的裕廊西。因为位置更偏，空间更大，房租反而更便宜，自然环境也更好。旁边还有个 Jurong Lake Gardens 的超大国家公园，很适合遛娃。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/6-1.Bk1Ba0GA_Z1bCCup.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1548&quot; height=&quot;2070&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;旅游&quot;&gt;旅游&lt;/h3&gt;
&lt;p&gt;发小怀孕中期在家憋得快抑郁了，而中期也是相对适合出门的阶段，于是抓紧安排了两个轻松的地方。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;大理&lt;/strong&gt;的主题是吃。吃了好多菌子，菌汤超级鲜美，也确实可能有危险。喝之前饭店还会取样，如果中毒要带着样本一起去医院。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/justjustjustcc/status/1907051362036465763&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1907051362036465763.C7XwuCrO_Z6jRT6.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;1868&quot; alt=&quot;&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://x.com/DIYgod/status/1907053924626072055&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1907053924626072055.CA_6eWzp_Z1xSjt1.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2424&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在新加坡可没那么多好吃的。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/justjustjustcc/status/1909977000980385808&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1909977000980385808.Br2f2m8p_ZbcLof.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2096&quot; alt=&quot;&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://x.com/justjustjustcc/status/1911989885998895249&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1911989885998895249.CZLV4L0d_Z1i86fc.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2424&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;洱海有一股让人平静的力量。之前跟发小私定终身就是在洱海上，再回来，已经是一家三口了。洱海也见证了我们从发小，到情侣，再到夫妻，再到父母的变化，我对发小的爱也随着时间沉淀越来越深沉。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/justjustjustcc/status/1910216881304392131&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1910216881304392131.Ck3N_KOo_vV8jE.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2424&quot; alt=&quot;&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://x.com/justjustjustcc/status/1910689980516839724&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1910689980516839724.D7W-BgPf_Z13ge81.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2128&quot; alt=&quot;&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://x.com/DIYgod/status/1911599563041095989&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1911599563041095989.Btl_G0O3_2s0Jyo.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2144&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;巴厘岛&lt;/strong&gt;则是彻底放空。找了个豪华度假区，天天游泳、晒太阳，让人短暂地忘记日常的加速。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/justjustjustcc/status/1921916021662765358&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1921916021662765358.BioV8NSl_Z2hXggE.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2016&quot; alt=&quot;&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://x.com/justjustjustcc/status/1922654327950168089&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1922654327950168089.B3a-30qz_2dR0KD.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;3744&quot; alt=&quot;&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;https://x.com/DIYgod/status/1921451501660033114&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1921451501660033114.CXeZTwZh_yDCWo.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;3648&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以及&lt;strong&gt;新加坡环球影城万圣节惊魂夜&lt;/strong&gt;。今年有四个主题鬼屋，怪奇物语、新加坡最凶灵之地、道诡异仙、泰国死亡低语者，非常可怕，全程在尖叫。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/6-2.C0f7YmiQ_Z1UP7Qa.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2531&quot; height=&quot;2160&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;有趣的小事&quot;&gt;有趣的小事&lt;/h3&gt;
&lt;p&gt;NAS 坏了一块硬盘，自动强制只读了，但数据没丢。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1981460911304167588&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1981460911304167588.CGXHRgZU_Z1M3WBm.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2316&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;过生日到处去薅羊毛。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1932084384540102892&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1932084384540102892.DfmHfuL__1PmLSY.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;3744&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;看发小拼乐高。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/DIYgod/status/1935675896821899268&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/x-1935675896821899268.1pvxVP_t_25FKPg.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2268&quot; height=&quot;2424&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;2026-愿望&quot;&gt;2026 愿望&lt;/h2&gt;
&lt;p&gt;我对 2026 的愿望很朴素。希望身体别再用坏消息提醒我，希望能继续赚到钱，希望能早点拿到新加坡身份，让未来少一些不确定性。&lt;/p&gt;
&lt;style&gt;
  .prose :where(img):not(:where([class~=&quot;not-prose&quot;],[class~=&quot;not-prose&quot;] *)) {
    border: 1px solid #eee;
  }
&lt;/style&gt;&lt;/body&gt;&lt;/html&gt;</content:encoded><category>日记本</category><category>年终总结</category></item><item><title>欧洲旅游VLOG | 巴塞罗那 罗马 梵蒂冈 威尼斯 米兰 苏黎世 因特拉肯 巴黎</title><link>https://diygod.cc/europe-travel</link><guid>europe-travel</guid><pubDate>Sat, 20 Dec 2025 14:30:00 GMT</pubDate><content:encoded>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;2022年12月&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</content:encoded><category>创作集</category><category>vlog</category></item><item><title>上古神器 Beancount：Crypto 与 AI 时代的复式记账终极方案</title><link>https://diygod.cc/beancount</link><guid>beancount</guid><description>很多时候我们觉得记账麻烦，并不是 UI 不够漂亮、交互不够顺滑，而是记账方法不够科学。当方法足够科学时，你甚至不需要 UI，一个 CLI + 几个纯文本文件 + 一套清晰语法，就能把财务世界描述得非常准确</description><pubDate>Fri, 12 Dec 2025 08:58:00 GMT</pubDate><content:encoded>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;h2 id=&quot;记账&quot;&gt;记账&lt;/h2&gt;
&lt;p&gt;记账这件事，本质上是在回答三个问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;钱从哪来？&lt;/li&gt;
&lt;li&gt;钱现在在哪？&lt;/li&gt;
&lt;li&gt;钱最后去哪了？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;听起来很简单，但只要你的金融活动稍微复杂一点，这三问立刻变成一道「多变量方程」：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多个账户：银行卡、支付宝、信用卡、交易所、链上钱包……&lt;/li&gt;
&lt;li&gt;多种资产类型：储蓄、贷款、投资……&lt;/li&gt;
&lt;li&gt;多种货币：CNY、USD、BTC、各种山寨币……&lt;/li&gt;
&lt;li&gt;多个时间维度：分期、预支、借贷……&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也正因为如此，我前后换过好几套方案。&lt;/p&gt;
&lt;p&gt;2016–2021：网易有钱 - 当时需求很朴素：记人民币收入、储蓄、日常开销。它能自动同步银行流水、支付宝微信账单，对国内场景非常方便。&lt;/p&gt;
&lt;p&gt;2021–2024：MoneyWiz - 出国后我需要多币种，并且主要使用英国的银行账户。MoneyWiz 在多币种、海外账户同步上很顺手。&lt;/p&gt;
&lt;p&gt;2024：我开始记录加密资产，这时候情况开始非常复杂了，我不只想知道「总额涨了多少」，而是想要：每一笔买入/卖出的明细、不同资产的占比、每日的浮盈浮亏、更严谨的收益率计算。&lt;/p&gt;
&lt;p&gt;MoneyWiz 对投资/加密资产支持很有限；我又试了有知有行，它能记录投资前后总额并算收益率，但无法记录到每笔明细，很多价格需要手动维护，浮盈浮亏也无法自动计算。&lt;/p&gt;
&lt;p&gt;最后我接触到复式记账和 Beancount，彻底解决了我的问题。&lt;/p&gt;
&lt;p&gt;我才意识到，很多时候我们觉得记账麻烦，并不是 UI 不够漂亮、交互不够顺滑，而是记账方法不够科学。当方法足够科学时，你甚至不需要 UI，一个 CLI + 几个纯文本文件 + 一套清晰语法，就能把财务世界描述得非常准确。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;复式记账法&quot;&gt;复式记账法&lt;/h2&gt;
&lt;p&gt;复式记账乍看很反直觉，但一旦掌握，会发现它非常强大和灵活，而且会迫使你用更清晰的方式理解金融活动。&lt;/p&gt;
&lt;h3 id=&quot;五个桶账户类型&quot;&gt;五个桶（账户类型）&lt;/h3&gt;
&lt;p&gt;复式记账会把所有账户归到五类（可以理解成五个装豆子的桶）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;资产 Assets&lt;/strong&gt;：现金、银行存款、有价证券、链上资产……&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;负债 Liabilities&lt;/strong&gt;：信用卡欠款、房贷、车贷……&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;收入 Income&lt;/strong&gt;：工资、奖金、利息……&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;花费 Expenses&lt;/strong&gt;：吃饭、购物、旅行、订阅……&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权益 Equity&lt;/strong&gt;：调节/归档用的「底座」，例如期初余额、误差修正等&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;所有金融活动都是桶之间的转移&quot;&gt;所有金融活动都是「桶之间的转移」&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;收入 → 资产&lt;/strong&gt;：发工资（收入桶减少，资产桶增加）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资产 → 花费&lt;/strong&gt;：买东西（资产桶减少，花费桶增加）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;负债 → 资产&lt;/strong&gt;：借钱（负债桶增加，资产桶增加）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资产 → 负债&lt;/strong&gt;：还款（资产桶减少，负债桶减少）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;花费 → 资产&lt;/strong&gt;：退货（花费桶减少，资产桶增加）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资产 → 收入&lt;/strong&gt;：投资亏损（资产桶减少，收入桶减少）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你会发现：按这种符号约定，收入账户的余额经常是负数。这不是 bug，而是记账视角不同。&lt;/p&gt;
&lt;p&gt;可以这样想象：把「收入」想成一个装着你一生（过去和未来）劳动成果的桶。每次你拿到工资，其实是在从这个桶里取出一部分，放进你的资产里。你能取的越多，收入桶里的数值就越往负的方向走。&lt;/p&gt;
&lt;p&gt;所以收入为负数并不表示「你欠了收入」，只是因为你在从这个桶取出资产。这也涉及到复式记账法的一个核心规则：一笔交易里，所有数字相加必须等于 0。这也是它检验正确性的关键：你少写一笔、写错一位数，系统就会当场报警。&lt;/p&gt;
&lt;p&gt;在 Beancount 常见的符号约定下，你会看到类似这样的「会计恒等式」写法：&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;(收入 + 负债) + (资产 + 花费) = 0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你也可以把它理解为更传统的表达：你赚到的、借来的，最终要么变成你拥有的资产，要么被花掉。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;beancount&quot;&gt;Beancount&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/beancount/beancount&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Beancount&lt;/a&gt; 是目前我用过最舒服、也最适合复杂财务世界的纯文本复式记账工具。&lt;/p&gt;
&lt;p&gt;它不是复式记账软件的开创者，更早的代表是 &lt;a href=&quot;https://github.com/ledger/ledger&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Ledger&lt;/a&gt;。但 Beancount 在 Ledger 的概念上做了不少改良，也经历了时间的考验（2007 年开始）。&lt;/p&gt;
&lt;p&gt;学习 Beancount 最直接的方法是看官方文档：&lt;a href=&quot;https://docs.google.com/document/d/1P5At-z1sP8rgwYLHso5sEy3u4rMnIUDDgob9Y_BYuWE&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Getting Started with Beancount&lt;/a&gt;、&lt;a href=&quot;https://docs.google.com/document/d/1wAMVrKIA2qtRGmoVDSUBJGmYZSygUaR0uOMW1GV3YE0&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Beancount Language Syntax&lt;/a&gt;，或者看这篇文章也很不错：&lt;a href=&quot;https://wzyboy.im/post/1063.html&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Beancount —— 命令行复式簿记 | wzyboy’s blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这篇博客我不会展开讲语法和使用细节，而是用几个例子让你快速感受 Beancount 的强大之处和为什么说它更适合 Crypto 和 AI 时代。&lt;/p&gt;
&lt;h3 id=&quot;处理复杂交易&quot;&gt;处理复杂交易&lt;/h3&gt;
&lt;p&gt;使用 Beancount 可以优雅处理复杂交易，以下例子涉及多对多，多账户 + 多人复杂交易，但是可以描述很清楚&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2016&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;02&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;05&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;饭店&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;和室友吃饭&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Cash:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Wallet&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                         -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;300.00&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; CNY&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; ; &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;我用现金支付&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Receivables:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Bob&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                     -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;200.00&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; CNY&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; ; &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;室友帮我付的现金&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Expenses:Food:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;DiningOut&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                    +&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;250.00&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; CNY&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; ; &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;AA&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; 我的一半&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Receivables:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Bob&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                     +&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;250.00&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; CNY&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; ; &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;AA&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; 室友的一半&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里同时发生了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;你付了部分现金&lt;/li&gt;
&lt;li&gt;室友也付了部分现金&lt;/li&gt;
&lt;li&gt;AA 分摊&lt;/li&gt;
&lt;li&gt;你对室友产生/抵消应收&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后只需要看 &lt;code&gt;Assets:Receivables:Bob&lt;/code&gt; 余额就可以知道你欠室友多少钱，看 &lt;code&gt;Expenses:Food:DiningOut&lt;/code&gt; 余额就可以知道每个月吃饭开销花了多少钱。&lt;/p&gt;
&lt;p&gt;如果用「单式记账 + 备注」硬堆，后面基本一定算不清，而复式记账把结构直接写出来，之后统计就变得非常自然。&lt;/p&gt;
&lt;h3 id=&quot;处理多币种交易&quot;&gt;处理多币种交易&lt;/h3&gt;
&lt;p&gt;跨币种交易通常涉及汇率问题，Beancount 也能优雅处理&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2016&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;02&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;商店&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;买东西&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; Assets:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Cash&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                                 -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;200.00&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; Liabilities:CMB:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;CreditCards&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                 -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;650.00&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; CNY&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; @@ &lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;100.00&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; Expenses:Clothing:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Pants&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                     +&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;150.00&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; Expenses:Clothing:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Shoes&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                     +&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;150.00&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这类「刷卡以人民币记账、但实际消费以美元计价」的场景，在跨境生活里非常常见。Beancount 的表达方式很直接：用一条记录把两边币种的关系和当时汇率绑定住，之后查询/报表都能基于它继续推导。&lt;/p&gt;
&lt;h3 id=&quot;更适合-crypto-交易&quot;&gt;更适合 Crypto 交易&lt;/h3&gt;
&lt;p&gt;Beancount 不限制货币单位：USD、CNY、BTC、USDT、甚至任何你自定义的 token 都可以。再配合类似 SQL 的查询工具 &lt;code&gt;bean-query&lt;/code&gt;，拿来做加密资产投资分析非常顺手。&lt;/p&gt;
&lt;p&gt;举一个看起来很复杂，但记录很简洁的例子：&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;07&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;23&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; price&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;07&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;24&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;OKX&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;买BTC&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;USD&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;            -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;150&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;BTC&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;            149&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  {&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Expenses:TradingFee:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Crypto&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;      1&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;07&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;24&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;OKX&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;买BTC&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;USD&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;             -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;60&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;BTC&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;             19&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  {&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Expenses:TradingFee:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Crypto&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;      3&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;07&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;24&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;OKX&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;卖BTC&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;BTC&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;           -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;198&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  {} @ &lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;USD&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;             298&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Income:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Investment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;07&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;25&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; price&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt; 4&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个例子里包含了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多次买入，成本不同&lt;/li&gt;
&lt;li&gt;手续费&lt;/li&gt;
&lt;li&gt;卖出时自动匹配成本（&lt;code&gt;{}&lt;/code&gt; 让 Beancount 自己去找）&lt;/li&gt;
&lt;li&gt;市价（&lt;code&gt;price&lt;/code&gt;）随时间变化&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;仅基于这些记录，Beancount 可以自动算出：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;总收益/已实现收益/未实现收益&lt;/li&gt;
&lt;li&gt;各类收益率（例如资金加权收益率 Modified Dietz、时间加权收益率 TWRR、甚至你自定义的任意收益计算）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;换句话说：你只负责把事实写清楚，任何复杂计算都可以交给 Beancount。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;我的-beancount-实践&quot;&gt;我的 Beancount 实践&lt;/h2&gt;
&lt;p&gt;把账本当代码管理。&lt;/p&gt;
&lt;h3 id=&quot;编辑器&quot;&gt;编辑器&lt;/h3&gt;
&lt;p&gt;我用 VSCode，配合 &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Lencerf.beancount&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Beancount&lt;/a&gt;、&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=dongfg.vscode-beancount-formatter&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Beancount Formatter&lt;/a&gt; 和以下配置实现语法高亮、自动补全、错误检查、格式化等。&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;json&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  &quot;beancount.mainBeanFile&quot;&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&quot;main.bean&quot;&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  &quot;beancount.runFavaOnActivate&quot;&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  &quot;beancount.completePayeeNarration&quot;&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  &quot;beancount.fixedCJKWidth&quot;&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  &quot;beancount.inputMethods&quot;&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&quot;pinyin&quot;&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  &quot;beancount.instantAlignment&quot;&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  &quot;editor.formatOnSave&quot;&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/1.BV4P0ASo_T0cy9.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1740&quot; height=&quot;388&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;项目结构&quot;&gt;项目结构&lt;/h3&gt;
&lt;p&gt;Beancount 天然支持模块化：不同类型交易拆到不同文件，再 &lt;code&gt;include&lt;/code&gt; 进主入口，维护成本非常低。&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;├── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;books&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;│   ├── &lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;│   │   ├── 2025.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;bean&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;│   │   ├── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;cn&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;bean&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;│   │   ├── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;crypto&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;bean&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;│   │   ├── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;daily&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;bean&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;│   │   ├── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;periodic&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;bean&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;│   │   ├── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;prices&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;bean&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;│   └── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;books&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;bean&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;├── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;scripts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;│   ├── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;importer&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;dbs&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;credit&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;│   ├── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;importer&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;dbs&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;debit&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;│   ├── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;importer&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;okx&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;├── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;accounts&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;bean&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;├── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;commodity&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;bean&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;├── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;config&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;pbtxt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;├── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;dashboards&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;yaml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;├── &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;bean&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;main.bean&lt;/code&gt; 是入口文件，集中放配置、插件和 include：&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;option&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;title&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;DIYgod&apos;s Book&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;option&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;operating_currency&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;USD&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;option&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;booking_method&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;LIFO&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;option&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;account_rounding&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;Equity:Rounding-Error&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;plugin&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;beancount_periodic.recur&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;plugin&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;beancount_periodic.split&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2024&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; custom&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;fava-option&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;auto-reload&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;true&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2024&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; custom&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;fava-option&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;default_page&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;income_statement/?conversion=units&amp;amp;interval=day&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2024&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; custom&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;fava-extension&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;fava_portfolio_returns&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96E072&quot;&gt;  &apos;beangrow_config&apos;&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&apos;config.pbtxt&apos;&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96E072&quot;&gt;2024-01-01 custom &quot;&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;fava&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;extension&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;fava_dashboards&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96E072&quot;&gt;  &apos;config&apos;&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&apos;dashboards.yaml&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96E072&quot;&gt;include &quot;&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;accounts&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;bean&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96E072&quot;&gt;include &quot;&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;books&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;books&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;bean&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#96E072&quot;&gt;include &quot;&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;commodity&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;bean&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;accounts.bean&lt;/code&gt; 定义所有账户（略去部分）：&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Expenses&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; 费用&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; —— &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;外出就餐&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;、&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;购物&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;、&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;旅行等&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;1995&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;06&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;09&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; open&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; Expenses:Food:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Restaurant&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; 省略若干行&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Income&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; 收入&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; —— &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;工资&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;、&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;奖金等&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2020&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;04&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; open&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; Income:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Salary&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; 省略若干行&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Assets&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; 资产&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; —— &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;现金&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;、&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;银行存款&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;、&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;有价证券等&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2024&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; open&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; Assets:Bank:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;DBS&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; SGD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2024&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; open&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; Assets:Crypto:OKX:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;BTC&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; 省略若干行&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Liabilities&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; 负债&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; —— &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;信用卡&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;、&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;房贷&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;、&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;车贷等&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2024&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; open&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; Liabilities:Bank:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;DBS&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; SGD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; 省略若干行&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Equity&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; 权益&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; —— &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;用于&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;「&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;存放&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;」&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;某个时间段开始前已有的豆子&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2024&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; open&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; Equity:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Opening&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Balances&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2024&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; open&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; Equity:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Rounding&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Error&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;commodity.bean&lt;/code&gt; 定义货币/资产，并用 &lt;code&gt;price&lt;/code&gt; 指定价格来源（后面会讲自动更新）：&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; commodity&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  name: &lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&quot;Tether&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; commodity&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  name: &lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&quot;Bitcoin&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  price: &lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&quot;USD:coinbase/BTC-USD&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; commodity&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  name: &lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&quot;United States Dollar&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; commodity&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; QQQ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  name: &lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&quot;NASDAQ-100 Index&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  price: &lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt;&quot;USD:alphavantage/price:QQQ:USD&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;books/2025/prices.bean&lt;/code&gt; 用于记录每日价格（自动生成），让持仓浮盈浮亏可被计算：&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; price&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt; 93346.48&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;02&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; price&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt; 94384.76&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; 省略若干行&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;几种常见的-crypto-交易&quot;&gt;几种常见的 Crypto 交易&lt;/h3&gt;
&lt;p&gt;下面这些例子来自我的实际习惯：交易不是手填的，而是通过 &lt;code&gt;scripts/importer-okx.js&lt;/code&gt; 从 OKX 交易记录自动生成。&lt;/p&gt;
&lt;h4 id=&quot;稳定币现货交易&quot;&gt;稳定币现货交易&lt;/h4&gt;
&lt;p&gt;1）买入：用 USDT 买 BTC + 手续费&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;OKX&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;Buy BTC with USDT&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:OKX:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;USDT&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                       -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;3022.493&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:OKX:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;BTC&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;                     0.0302113288&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;100000&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDT&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Expenses:TradingFee:Crypto:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;OKX&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里我把手续费留空，让 Beancount 自动补齐（利用「每笔交易加起来为 0」的规则）。&lt;/p&gt;
&lt;p&gt;但如果你的 BTC 可能来自 USDT、USDC 等不同稳定币，之后统计收益会涉及汇率与币种转换。为了让分析更统一，我常用一个过渡账户把成本统一成 USD：&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;OKX&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;Buy BTC with USDT&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:OKX:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;USDT&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                       -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;3022.493&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Equity:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Exchange&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;                               3022.493&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Equity:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Exchange&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                              -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;3022.493&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDT&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; @ &lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:OKX:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;BTC&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;                     0.0302113288&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;100000&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Expenses:TradingFee:Crypto:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;OKX&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Equity:Exchange&lt;/code&gt; 的作用很像「统一换算层」：把不同稳定币交易都折算成 USD 口径，后续报表会非常舒服。&lt;/p&gt;
&lt;p&gt;2）卖出：卖 BTC 得 USDC + 自动算收益&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;09&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;18&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;OKX&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;Sell BTC for USDC&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:OKX:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;BTC&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                        -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;0.100011&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; {} @ &lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;117600&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Equity:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Exchange&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;                         11756.00101788&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Equity:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Exchange&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                        -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;11756.00101788&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; @ &lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:OKX:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;USDC&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;                  11756.00101788&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Expenses:TradingFee:Crypto:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;OKX&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;             -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;5.29258212&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Income:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Investment&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{} @ 117600 USD&lt;/code&gt;：成本价由 Beancount 自动从历史记录里匹配，卖出价是 117600 USD&lt;/li&gt;
&lt;li&gt;多出来的部分进 &lt;code&gt;Income:Investment&lt;/code&gt;：收益就这样自然出来了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你不需要统一换算，也可以简化成：&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;09&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;18&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;OKX&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;Sell BTC for USDC&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:OKX:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;BTC&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                        -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;0.100011&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; {} @ &lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;117600&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:OKX:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;USDC&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;                  11756.00101788&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Expenses:TradingFee:Crypto:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;OKX&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;             -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;5.29258212&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Income:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Investment&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;币币现货交易&quot;&gt;币币现货交易&lt;/h4&gt;
&lt;p&gt;用 BTC 买 ETH&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;08&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;22&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;OKX&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;Buy ETH with BTC&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:OKX:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;BTC&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;            -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;0.025828016279999998&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; {} @ &lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;112480.295&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Equity:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Exchange&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;                       2&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;905.1428904392&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Equity:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Exchange&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                      -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;905.1428904392&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:OKX:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;ETH&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;                     0.6820274505&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; ETH&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;4224.16&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Income:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Investment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Expenses:TradingFee:Crypto:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;OKX&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;            0.0001705495&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; ETH&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;4224.16&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;币币交易的成本/收益更容易乱，但把过程统一到 USD 口径后，就会变得非常清晰：用 BTC 换到的 ETH，有明确的 USD 成本；手续费和之后的收益也能被正确计入。&lt;/p&gt;
&lt;h4 id=&quot;u-本位合约&quot;&gt;U 本位合约&lt;/h4&gt;
&lt;p&gt;U 本位合约在交易所内部不是真的卖出 BTC，但为了把盈亏落到资产变化上，我用一个「借币卖出/买回」近似模型来表达：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开仓做空：等价于「借 BTC 卖出，换成 USDT」&lt;/li&gt;
&lt;li&gt;平仓：等价于「用 USDT 买回 BTC 归还」&lt;/li&gt;
&lt;li&gt;盈亏会自然体现在最后多出来（或少了）的部分上&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;01&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;OKX&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;合约 BTC-USDT 做空开仓&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:OKX:Futures:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;BTC&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                      -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; @ &lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;100000&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Equity:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Exchange&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;                                1000000&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Equity:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Exchange&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                               -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;1000000&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; @ &lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:OKX:Futures:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;USDT&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;                 1000000&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;12&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;OKX&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;合约 BTC-USDT 做空平仓&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:OKX:Futures:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;USDT&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;                 1000000&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Equity:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Exchange&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;                                1000000&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Equity:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Exchange&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                               -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;1000000&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USDT&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; @ &lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:OKX:Futures:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;BTC&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;                      -&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;80000&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Income:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Investment&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;真实合约还会涉及保证金、资金费、强平、结算币种差异等。更严谨的做法可以继续拆分账户模型，但这套写法已经能在大多数场景里把结果记清楚、算出来。&lt;/p&gt;
&lt;h4 id=&quot;币本位合约&quot;&gt;币本位合约&lt;/h4&gt;
&lt;p&gt;币本位合约更复杂：仓位通常是「USD 计价的 BTC 价格敞口」，而不是固定数量 BTC。想按每日价格计算浮盈浮亏会很复杂，需要「双账模型」（事实账 + 估值账）。&lt;/p&gt;
&lt;p&gt;我目前选择先把它简化成：平仓时手动算出以 BTC 为单位的收益，只记录最终 BTC 变化，只是这样会牺牲当前持仓未实现盈利的数据：&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;2025&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;21&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; *&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;OKX&quot;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;合约 BTC-USD 1.0&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Income:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Investment&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  Assets:Crypto:OKX:&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;BTC&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;                0.007433571994392&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; BTC&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color:#F39C12&quot;&gt;85400&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; USD&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;自动化脚本--ai-记账&quot;&gt;自动化脚本 + AI 记账&lt;/h3&gt;
&lt;p&gt;通过自动化脚本和 AI，可以极大简化记账工作量，让「记账」变成「对账」。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自动生成交易记录&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Beancount 是纯文本，这意味着它天生适合自动化生成记录和更新资产价格。&lt;/p&gt;
&lt;p&gt;社区里有很多导入工具，比如：&lt;a href=&quot;https://github.com/beancount/beangulp&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;beangulp&lt;/a&gt;、&lt;a href=&quot;https://github.com/beancount/smart_importer&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;smart_importer&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;但我自己用得最多的还是自写脚本（例如 OKX 的 &lt;code&gt;scripts/importer-okx.js&lt;/code&gt;、DBS 的 &lt;code&gt;scripts/importer-dbs.js&lt;/code&gt;）。原理都类似：从接口或者网页获取交易数据 → 转成 Beancount 文本。&lt;/p&gt;
&lt;p&gt;对于一些没有接口、甚至没有账单导出的账户（比如我现在用的 Trust），直接截图丢给 AI 识别也很省心：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/2.-3efwuZZ_ZMxTBM.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2418&quot; height=&quot;1842&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自动更新价格&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Beancount 本身是离线系统，不会自动从互联网拉价格，所以我每天会把最新的币价/股价写进 &lt;code&gt;books/2025/prices.bean&lt;/code&gt;，让报表能计算当日估值与未实现盈利。&lt;/p&gt;
&lt;p&gt;官方提供了开箱即用的 &lt;a href=&quot;https://github.com/beancount/beanprice&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;beanprice&lt;/a&gt;，支持 Coinbase、Coinmarketcap、Alphavantage 等来源，一个命令就能更新：&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;sh&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFE66D&quot;&gt;bean-price&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; -i&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; --update-rate&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; daily&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; --no-cache&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; main.bean&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; books/2025/prices.bean&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;ai-分析与可视化&quot;&gt;AI 分析与可视化&lt;/h3&gt;
&lt;p&gt;很多人把记账停在「记下来」就结束了，但真正有价值又容易被遗忘的是记录之后如何分析。&lt;/p&gt;
&lt;p&gt;Beancount 在分析和可视化能力上非常夸张：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可以装插件的 Web 界面：&lt;a href=&quot;https://github.com/beancount/fava&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Fava&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;类 SQL 查询语言：BQL（Beancount Query Language）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先看一些我常用的效果：&lt;/p&gt;
&lt;p&gt;投资品的价格走势图（Fava 自带）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/fava-1.C8Cigb3S_1D95z3.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2956&quot; height=&quot;2006&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;不同投资品的收益曲线，以及各种加权收益率（插件 &lt;a href=&quot;https://github.com/andreasgerstmayr/fava-portfolio-returns&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Fava Portfolio Returns&lt;/a&gt;）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/fava-2.B-Mn62Al_Z2bVnzI.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2956&quot; height=&quot;2006&quot; alt=&quot;&quot;&gt;
&lt;img src=&quot;https://diygod.cc/_astro/fava-5.C7boDPm9_5AE08.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2956&quot; height=&quot;2006&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;特定资产的变化曲线、分布占比、列表（插件 &lt;a href=&quot;https://github.com/andreasgerstmayr/fava-dashboards&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Fava Dashboards&lt;/a&gt; + 自定义 BQL）：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/fava-3.C9cmBQgI_Z1WLbCu.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2956&quot; height=&quot;1667&quot; alt=&quot;&quot;&gt;
&lt;img src=&quot;https://diygod.cc/_astro/fava-4.Wt8zB8Wi_ZNtaMq.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2956&quot; height=&quot;2006&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;更爽的是：现在有了 vibe coding，时代变了。
现在甚至不需要先学会 BQL 怎么写——可以直接让 AI 写。&lt;/p&gt;
&lt;p&gt;比如我会这样提需求：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;利用 Fava Dashboards 插件，在 dashboards.yaml 编写 BQL 实现一个展示我所有加密货币持仓随时间变化的曲线图。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;曾经要折腾好久的个性化财务分析，现在可能就是一句话。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&quot;结语&quot;&gt;结语&lt;/h2&gt;
&lt;p&gt;我用了 Beancount 一年，几乎全部需求都很好得到了满足，非常满意，也在公司内部做过分享。这篇博客就是把分享内容整理成文字，希望能把它推荐给更多人。&lt;/p&gt;
&lt;p&gt;我也承认，Beancount 的门槛对大多数人来说不低——它更像「写账本的编程语言」，而不是一个点点点的 App。
但我同样相信：随着 AI 发展，这些门槛会越来越低。未来每个人都可以用更低成本驾驭这种强大的工具，实现对自己财务的全面掌控。&lt;/p&gt;
&lt;p&gt;如果你也正在经历：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多币种生活&lt;/li&gt;
&lt;li&gt;投资品越来越多&lt;/li&gt;
&lt;li&gt;账越记越乱&lt;/li&gt;
&lt;li&gt;分析越来越复杂&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那我建议你至少花半天时间试试 Beancount。
它可能会让你第一次觉得：原来我终于能把钱讲清楚了。&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</content:encoded><category>分享境</category></item><item><title>一个六岁开源项目的崩溃与新生</title><link>https://diygod.cc/6-year-of-rsshub</link><guid>10-2532</guid><description>我有一个维护了六年的开源项目—— RSSHub，它正在面临崩溃

表面上，它有接近 30k Stars、900 多 Contributors、每月 3 亿多次请求和数不清的用户、每月几十刀的赞助、有源源不断的 issue 和 pr、代码几乎每天更新，非常健康和充满活力</description><pubDate>Sun, 10 Mar 2024 19:29:05 GMT</pubDate><content:encoded>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;p&gt;我有一个维护了六年的开源项目—— RSSHub，它正在面临崩溃&lt;/p&gt;
&lt;h2 id=&quot;背景&quot;&gt;背景&lt;/h2&gt;
&lt;p&gt;表面上，它有接近 30k Stars、900 多 Contributors、每月 3 亿多次请求和数不清的用户、每月几十刀的赞助、有源源不断的 issue 和 pr、代码几乎每天更新，非常健康和充满活力，但在不可见的地方，持续数年高昂的维护时间成本、每月一千多刀的服务器费用、每天重复繁琐且逐渐积累的维护工作，都让它在崩溃的边缘反复横跳&lt;/p&gt;
&lt;p&gt;项目是六年前开发的，不少当时以 Next Generation 为口号的时髦 Node.js 技术栈和依赖库已经成为时代眼泪，现在看非常陈旧，很多现在流行的新技术没法应用，比如 JSX、TypeScript、Serverless 等；它的架构也非常不合理，每个路由的信息散落在多个地方，开发或者变更一个路由需要多处修改，一个地方去注册路由，一个地方去编写路由脚本，一个地方去编写 Radar 规则，一个地方去编写文档…这增加了很多工作量，也很容易出错，之前路由少的时候并不是个问题，但现在已经变得难以忍受&lt;/p&gt;
&lt;p&gt;在如此糟糕的基础架构下能保持现状已经是竭尽全力，开发新功能更是无本之木，只会增加以后更新的难度，所以我有时候脑子蹦出的新奇想法也很难实现&lt;/p&gt;
&lt;p&gt;要解决这些问题，唯一的办法是使用现代化的框架和新设计的架构来重写内核，但随着路由越来越多，改造成本也越来越高，每个基础改动可能都需要多达数月的工作量，所以虽然问题越来越严重，但秉承着又不是不能用的原则一拖再拖&lt;/p&gt;
&lt;p&gt;但这又是不得不做的事情，所以我抽空花了几个月的时间重新设计和重写了它&lt;/p&gt;
&lt;h2 id=&quot;技术栈更新&quot;&gt;技术栈更新&lt;/h2&gt;
&lt;h3 id=&quot;koa---hono&quot;&gt;koa -&amp;gt; Hono&lt;/h3&gt;
&lt;p&gt;第一步也是最基础和难度最大的是换掉之前使用的 Web 框架 &lt;a href=&quot;https://github.com/koajs/koa&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;koa&lt;/a&gt;，作为六年前流行的下一代 Web 框架，作者早就弃坑了，调研之后决定换用对 JSX、TypeScript、Serverless 支持最好的 &lt;a href=&quot;https://github.com/honojs/hono&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Hono&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;它们的 API 差异很大，需要重写所有中间件和替换所有路由中使用的 koa API&lt;/p&gt;
&lt;p&gt;主要改动：
&lt;a href=&quot;https://github.com/DIYgod/RSSHub/pull/14295&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub/pull/14295&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmUBrZkbHVDyfjoMK661QkLiYLnSbBke6quM5SCs2pnFsG.DYJQthnc_Z2CEN9.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;682&quot; height=&quot;90&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;Hono 作者也很喜欢这个改造&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/yusukebe/status/1762801106340782222&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://twitter.com/yusukebe/status/1762801106340782222&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;javascript---typescript&quot;&gt;JavaScript -&amp;gt; TypeScript&lt;/h3&gt;
&lt;p&gt;改用 TypeScript 可以避免很多类型问题和低级错误，最重要的是可以保证数百名贡献者保持一致难以出错和后续贡献的路由代码质量不至于太糟糕&lt;/p&gt;
&lt;p&gt;主要改动：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/DIYgod/RSSHub/pull/14295&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub/pull/14295&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/DIYgod/RSSHub/pull/14632&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub/pull/14632&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmePQXUgzwrKKy8bwRNRARMoXYfPe2ShvqYffYRXhWkbtf.D3X4HfvU_Un8Et.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;728&quot; height=&quot;84&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/DIYgod/status/1764360942035312879&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://twitter.com/DIYgod/status/1764360942035312879&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;commonjs---esm&quot;&gt;CommonJS -&amp;gt; ESM&lt;/h3&gt;
&lt;p&gt;ESM 是几年前一些 Node.js 核心开发者强推的规范，它有一些优点，但最多的是与之前 CommonJS 不兼容带来的生态割裂和功能简化带来的诟病&lt;/p&gt;
&lt;p&gt;经过这几年的发展，现在可以说大部分场景勉强可用了，&lt;a href=&quot;https://github.com/privatenumber/tsx&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;tsx&lt;/a&gt; 也为 CommonJS 和 ESM 混用的场景提供了支持&lt;/p&gt;
&lt;p&gt;虽然已经尽了最大努力，但还是有一些 CommonJS 代码暂时难以迁移，导致现在只能使用 tsx 运行，与一些 Serverless 比如 Vercel 没法兼容，但也有机会后续慢慢解决&lt;/p&gt;
&lt;p&gt;主要改动：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/DIYgod/RSSHub/pull/14619&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub/pull/14619&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/DIYgod/RSSHub/pull/14691&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub/pull/14691&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/DIYgod/RSSHub/pull/14632&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub/pull/14632&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmReUSKAH6qZpavbpotTxsdQ3DwH8A6ughVaBnEpk4k3Xy.DGp1QP_A_ZUVO4p.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;662&quot; height=&quot;80&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmTd5sWm6kzZunsv7sQH3djekip5XY44B4LEx3z9XAuvz1.CjR1ixcA_Z1dz6eo.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;680&quot; height=&quot;82&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;art-template---jsx&quot;&gt;art-template -&amp;gt; JSX&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/aui/art-template&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;art-template&lt;/a&gt; 是一个支持 koa 的模板引擎，记得六年前还有一个更流行的模板引擎，但是不记得名字了，选用 art-template 是因为那个更流行的我当时没看懂，这个很简单&lt;/p&gt;
&lt;p&gt;Hono 自带了 JSX 支持，JSX 就不用多介绍了，根正苗红的 JavaScript 的语法扩展，等同于用 React&lt;/p&gt;
&lt;p&gt;主要改动：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/DIYgod/RSSHub/commit/3bfdf9427cb8cf063cf7d231ec621278495f5a44&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub/commit/3bfdf9427cb8cf063cf7d231ec621278495f5a44&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/DIYgod/RSSHub/commit/94cf0742afa8bf18510ad9ded9b76dcd2ad52c90&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub/commit/94cf0742afa8bf18510ad9ded9b76dcd2ad52c90&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;jest---vitest&quot;&gt;Jest -&amp;gt; Vitest&lt;/h3&gt;
&lt;p&gt;Jest 是曾经流行的测试框架，但是在 ESM 时代到来之后就越来越不行了，对 ESM 的支持一直是实现性「experimental support」，现在更流行的是 Vitest 了&lt;/p&gt;
&lt;p&gt;主要改动：
&lt;a href=&quot;https://github.com/DIYgod/RSSHub/commit/38e42156a0622a2cd09f328d2d60623813b8df28&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub/commit/38e42156a0622a2cd09f328d2d60623813b8df28&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;got--&quot;&gt;Got -&amp;gt; ?&lt;/h3&gt;
&lt;p&gt;目前使用的 &lt;a href=&quot;https://github.com/sindresorhus/got&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Got&lt;/a&gt; 也已经是不积极维护的状态了，也没有找到好的替代品，后续也许会换成原生 Fetch 或者自封装的 Fetch，还没有动手&lt;/p&gt;
&lt;h2 id=&quot;新路由标准&quot;&gt;新路由标准&lt;/h2&gt;
&lt;p&gt;我自己能力还是不够的，在与社区开发者们讨论的过程中学习和改进了很多，过程很有意思：&lt;a href=&quot;https://github.com/DIYgod/RSSHub/issues/14685&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub/issues/14685&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;主要改动：
&lt;a href=&quot;https://github.com/DIYgod/RSSHub/pull/14718&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub/pull/14718&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmPSFiYa8fKZZuFNcptWSpfGwRFTt1S2nfy9CGHFFUKsqe.Bkb6SX5W_Z1Da2mO.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;698&quot; height=&quot;80&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;历史&quot;&gt;历史&lt;/h3&gt;
&lt;p&gt;新标准主要为了解决路由信息过于分散的问题，这次应该算第三版&lt;/p&gt;
&lt;p&gt;第一版来自 RSSHub 开发阶段，当时没有预见到路由数量会有这么多，所以几乎没什么规划，所有路由在同一个文件中注册，然后再去增加路由脚本和文档，后来这个文件越来越大，很容易冲突，另外所有路由脚本都会在启动阶段被加载，程序性能越来越差&lt;/p&gt;
&lt;p&gt;第二版来自 &lt;a href=&quot;https://github.com/NeverBehave&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;NeverBehave&lt;/a&gt; 维护的时期，引入了命名空间，切割了 router.js、radar.js，同命名空间的路由集中在了一个同文件夹中和一个或多个 Markdown 文档中，还实现了懒加载，极大提升了可维护性和性能，但还是会分散在多个文件中，不同文件的信息也容易出现不一致导致错误&lt;/p&gt;
&lt;h3 id=&quot;现在&quot;&gt;现在&lt;/h3&gt;
&lt;p&gt;本次把路由文件分为了两类，namespace.ts 和任意名字的路由文件&lt;/p&gt;
&lt;p&gt;namespace.ts 会通过导出名为 namespace 的对象来定义命名空间的信息&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C74DED&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#C74DED&quot;&gt; type&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Namespace&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C74DED&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;@/types&quot;&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C74DED&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#C74DED&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; namespace&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#FFE66D&quot;&gt; Namespace&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A0A1A7CC&quot;&gt;  // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;namespace 包含的字段通过 TypeScript 限制为&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C74DED&quot;&gt;interface&lt;/span&gt;&lt;span style=&quot;color:#FFE66D&quot;&gt; Namespace&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; string;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  url&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; string;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  categories&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; string[];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  description&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; string;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这些信息会经过编译后被文档和 RSSHub Radar 利用&lt;/p&gt;
&lt;p&gt;路由文件会通过导出名为 route 的对象来定义路由的信息&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C74DED&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;Route&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;color:#C74DED&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color:#96E072&quot;&gt; &quot;@/types&quot;&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C74DED&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;color:#C74DED&quot;&gt; const&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt; route&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#FFE66D&quot;&gt; Route&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#A0A1A7CC&quot;&gt;  // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;route 包含的字段通过 TypeScript 限制为&lt;/p&gt;
&lt;pre class=&quot;astro-code andromeeda&quot; style=&quot;background-color:#23262E;color:#D5CED9; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;ts&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#C74DED&quot;&gt;interface&lt;/span&gt;&lt;span style=&quot;color:#FFE66D&quot;&gt; Route&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  path&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; string &lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; string[];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  name&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; string;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  url&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; string;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  maintainers&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; string[];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#FFE66D&quot;&gt;  handler&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;ctx&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#FFE66D&quot;&gt; Context&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#C74DED&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#FFE66D&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color:#FFE66D&quot;&gt;Data&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#FFE66D&quot;&gt; Data&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  example&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; string;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  parameters&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#FFE66D&quot;&gt; Record&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;&amp;lt;string, string&amp;gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  description&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; string;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  categories&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; string[];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  features&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;    requireConfig&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; string[] &lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; false;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;    requirePuppeteer&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; boolean;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;    antiCrawler&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; boolean;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;    supportRadar&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; boolean;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;    supportBT&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; boolean;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;    supportPodcast&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; boolean;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;    supportScihub&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; boolean;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;  radar&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;    source&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; string[];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#00E8C6&quot;&gt;    target&lt;/span&gt;&lt;span style=&quot;color:#EE5D43&quot;&gt;?:&lt;/span&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt; string;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;  };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#D5CED9&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之前 route.js mantainer.js radar.js 和文档的信息都被集中在这一个文件中，减少了多处定义也减少了出错的可能&lt;/p&gt;
&lt;h3 id=&quot;实现&quot;&gt;实现&lt;/h3&gt;
&lt;p&gt;实现逻辑就是开发环境通过遍历整个 route 文件夹，找到所有 namespace.ts 和路由文件，读取信息，加载路由，在生成环境使用提前编译好的路径列表来避免遍历和不必要的加载过程，代码在：&lt;a href=&quot;https://github.com/DIYgod/RSSHub/blob/master/lib/registry.ts&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub/blob/master/lib/registry.ts&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;文档也是通过遍历 route 文件夹，找到所有需要的信息然后合成一系列的 Markdown 文件，不再需要手动维护，代码在：&lt;a href=&quot;https://github.com/DIYgod/RSSHub/blob/master/scripts/workflow/build-routes.ts&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/DIYgod/RSSHub/blob/master/scripts/workflow/build-routes.ts&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;当然使用之前路由标准开发的路由都需要迁移到新标准而不是直接放弃掉，已经通过脚本批量抓取整理信息后做了替换，但特别是文档比较混乱也有很多错误，所以抓取的信息也有很多错误，只能在后续逐渐人工修改了&lt;/p&gt;
&lt;h2 id=&quot;未来&quot;&gt;未来&lt;/h2&gt;
&lt;p&gt;通过这一系列改进，RSSHub 终于能够扔掉历史包袱，安心开发新功能了，这里列出我积累的一些想法抛砖引玉：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;既然 RSSHub 是一个数据集合，用途不一定只有 RSS，JSON 输出功能可以做一些增强，作为通用的 RESTful API 来使用，比如可以提供获取下一页接口或者输出类似 Twitter 关注数的非 feed 数据&lt;/li&gt;
&lt;li&gt;用户系统和用户自定义配置，生成自己的私有订阅地址 &lt;a href=&quot;https://github.com/DIYgod/RSSHub/issues/14706&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#14706&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;路由错误通知和健康度检测 &lt;a href=&quot;https://github.com/DIYgod/RSSHub/issues/14712&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;#14712&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;与 RSS3 节点的联动和加密货币收益共享 &lt;a href=&quot;https://twitter.com/rss3_/status/1731822029199094012&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://twitter.com/rss3_/status/1731822029199094012&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;AI 翻译和摘要&lt;/li&gt;
&lt;li&gt;更详细的实例数据分析及反向推导自动推荐的 Radar 规则&lt;/li&gt;
&lt;li&gt;与本地浏览器或客户端绑定的 RSSHub 实例，有希望真正解决反爬难题&lt;/li&gt;
&lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后，开源是一件很昂贵的事情，RSSHub 能活到现在离不开这些开发者的帮助&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/DIYgod/RSSHub/graphs/contributors&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/attachments/contributors.svg?width=890&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;以及这些赞助的好心人&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/DIYgod/sponsors&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://diygod.cc/_astro/sponsors.wide.BXuDch7i_Zjvw2n.svg&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1000&quot; height=&quot;723&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果 RSSHub 正在帮助你，也希望你可以积极参与进来，为信息自由的未来贡献一份自己的微小力量&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</content:encoded><category>创作集</category></item><item><title>和帕鲁生活在一起的两周</title><link>https://diygod.cc/palworld</link><guid>10-2510</guid><description>哪个小男孩没幻想过生活在这样一个充满宝可梦伙伴的世界，它们能听懂且愿意倾听我们说话，有着不同的特点和强大的技能，而且都很可爱，我们可以跟它们睡觉吃饭、并肩作战探索世界，永远不再孤独，不管是谁都可以找到最适合自己的宝可梦</description><pubDate>Sun, 18 Feb 2024 19:20:33 GMT</pubDate><content:encoded>&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;h2 id=&quot;宝可梦幻想&quot;&gt;宝可梦幻想&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmTbb2WpmvvM9LYr2w4ibhqB5icWMSa4n9hFjXbgbaKBRb.CjVop-QY_Z1J8h8r.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;2322&quot; height=&quot;1200&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;哪个小男孩没幻想过生活在这样一个充满宝可梦伙伴的世界，它们能听懂且愿意倾听我们说话，有着不同的特点和强大的技能，而且都很可爱，我们可以跟它们睡觉吃饭、并肩作战探索世界，永远不再孤独，不管是谁都可以找到最适合自己的宝可梦&lt;/p&gt;
&lt;p&gt;这一切早就可以发生，但这一切终究没有发生，宝可梦复杂的版权问题和躺平在功劳簿上的版权公司 Game Freak 让我们的幻想一直也仅仅是幻想&lt;/p&gt;
&lt;p&gt;当然也有人说最近的几个新作阿尔宙斯、朱紫比之前好多了，“虽然好多了，但只是臭味稀薄一点的狗屎罢了”，剑盾、阿尔宙斯、朱紫、Pokemon Sleep 游戏时长并不短的宝可梦玩家 DIYgod 义愤填膺地说道&lt;/p&gt;
&lt;h2 id=&quot;帕鲁实现&quot;&gt;帕鲁实现&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/Qmd7qeiygj9veZhTMThe79xzfqyVpu6TEGHk48g8AAEcW3.C-N2q4xD_2j73fy.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1200&quot; height=&quot;675&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;但只要幻想一直存在，变成现实也只是时间问题，横空出世的幻兽帕鲁给所有宝可梦粉丝带来了一个一本满足的平行幻想世界，终于苦于没有 Windows 的我也专门买了一台 ROG Ally 来沉迷其中&lt;/p&gt;
&lt;p&gt;游戏中与帕鲁的互动是前无仅有的，衣食住行战斗探索的过程都与帕鲁深度融入，真的是和帕鲁生活在一起&lt;/p&gt;
&lt;p&gt;从刚落地进入初始台地互动就开始了，我们的第一个落脚点不是自己造的，而是跟捣蛋猫一起造的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmTAMciZ4eBo9jbaZVyhPpkZxX3FiYXdMVmkokyk29eT6E.CWSzFTBm_ZgS32w.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;600&quot; height=&quot;337&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmW4UyojbTFyXjiEmWBNWoGDK5mjZYxbccyMTbbLGfuQuD.JoYihl1-_Z1QQbyX.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;230&quot; height=&quot;271&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;再到后来帕鲁包办我们的一切后勤，我们的每一顿大餐，都需要经历播种、浇水、收割、搬运、存储、烹饪，分别由有着不同特长和分工的帕鲁来完成，会制冷的企丸丸去运行冰箱，会喷火的燎火鹿去烹饪&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/Qmc4Y1VHfxckFHXoNE3oD5jgSbSye9SQvMAu1SjexiPSfu.DWBXburE_Z1nJ4Yd.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;600&quot; height=&quot;337&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmSpSKCts7aQTesNtpgs1gumyYCSq467LYma1FUPZaGpBg.BaKs9VPA_1HuPG.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;196&quot; height=&quot;202&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;在我们外出探索时，过河骑滑水蛇，赶路骑云海鹿，翻山越岭骑烽歌龙&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmdeiQSKuCmFzbocchFz9v6cJk5wqUaN8fWrRhZbojcAn3.BddGOTQ9_yDvEC.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;600&quot; height=&quot;337&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmaBSZyudw5Bmd3vT3eHbwj1rSyqo6BzWAD8nYeBUr4eKy.D9KINz08_1Xicbs.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;235&quot; height=&quot;154&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;在我们战斗时，举着火绒狐充当、喷火器，骑着暴电熊扫射机关枪，甚至虽然不太人道，可以把电棘鼠当作手榴弹扔出去，同时据点里的焰煌在帮我们炼钢造枪，阿努比斯在帮我们手搓子弹&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmapqqBNQK5cupXDFJ45CP7yMM4Ye53ncQdrn3qNjZz6os.n1zc7Pah_Z1D6UYK.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;600&quot; height=&quot;337&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmcF39d24AddScaCMtxDhHhW4Q4N98zMggLmvoSEeRwzLd.iXqtwsJV_Z109URC.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;188&quot; height=&quot;257&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;从徒手撸树到机关枪横着走，从无人问津到人满为患，在不知不觉的建造中我已经在帕鲁世界中倾注了太多的感情&lt;/p&gt;
&lt;p&gt;从饿着肚子的第一天&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmQySkxYV7yPBLLJqJprXq1XJUTfvzjEdQPAsVifHznuL1.DrpcmSe3_cFiUp.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1920&quot; height=&quot;1080&quot; alt=&quot;Pal   6_2_2024 下午 9_54_32&quot;&gt;&lt;/p&gt;
&lt;p&gt;到现在&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmSSQnJ3wRPuyGGP7VzBkGq91vN6Ybs3KSQxKM6NKSWpEF.B3YmnQAi_Zr3xSd.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1920&quot; height=&quot;1080&quot; alt=&quot;Pal   19_2_2024 上午 2_45_40&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/Qmb6ELDeZYmNNuSh98SqdhZCkyTJdeEmkeyHR9kCxgF78X.CXDI9H2m_Z1pxi4n.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1920&quot; height=&quot;1080&quot; alt=&quot;Pal   18_2_2024 上午 12_42_29&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;一些额外的探索&quot;&gt;一些额外的探索&lt;/h2&gt;
&lt;h3 id=&quot;数据展示&quot;&gt;数据展示&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmVigw528nJrF6z9QanPoqqYnmn2MW6HqEECj5X47jnaAN.GT2wuEnp_1t5zUG.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;3500&quot; height=&quot;2146&quot; alt=&quot;image&quot;&gt;&lt;/p&gt;
&lt;p&gt;毕竟是单机游戏，数据都在本地，可以很方便地做处理&lt;/p&gt;
&lt;p&gt;有一个开源项目可以把存档文件解析成 JSON 方便第三方开发和展示 &lt;a href=&quot;https://github.com/cheahjs/palworld-save-tools&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/cheahjs/palworld-save-tools&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;还有一个开源项目可以把 JSON 再生成一个前端页面 &lt;a href=&quot;https://github.com/zaigie/palworld-server-tool&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://github.com/zaigie/palworld-server-tool&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;于是我把存档同步到 NAS 上，再在 NAS 上部署一个展示页面，就可以很方便地查看我的帕鲁们了 &lt;a href=&quot;https://pal.diygod.me&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;https://pal.diygod.me&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;模组&quot;&gt;模组&lt;/h3&gt;
&lt;p&gt;帕鲁有很丰富的社区模组，比如把皮皮鸡变成坤或者把帕鲁变成宝可梦什么的，还有一些可以在不影响游戏平衡的前提下极大提升游戏体验&lt;/p&gt;
&lt;p&gt;我用的主要来自一个模组社区 &lt;a href=&quot;https://www.nexusmods.com/palworld&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Nexus Mods&lt;/a&gt;，他们有一个很方便的模组安装和管理工具 &lt;a href=&quot;https://www.nexusmods.com/about/vortex/&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Vortex Mod Manager&lt;/a&gt;，以下是我正在使用的模组&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.nexusmods.com/palworld/mods/146&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Basic MiniMap&lt;/a&gt;：增加一个不知道为什么官方没做的感觉很基础的小地图功能，但是记得到设置里把旋转关掉&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.nexusmods.com/palworld/mods/550&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Better Night Light&lt;/a&gt;：晚上太眼瞎了，啥都看不见，像得了夜盲症一样，用这个模组可以变亮一些，还改了一个绝美的星空&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmTTuiLhZRSgbZASC6EqAyB7C2nG2bEoNdXPSRKkb2MsD8.BtYfXjkR_Z1YOdOb.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1920&quot; height=&quot;1080&quot; alt=&quot;Pal   18_2_2024 下午 8_05_05&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.nexusmods.com/palworld/mods/507&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Golden Statue of Power&lt;/a&gt;：把力量石像变得金灿灿的更有质感&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmStFjcG2188cZ6RUaaQMXpE8A95AGPnB6CMA77QR6dEXs.CEAueP1r_Z1SY3TY.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1920&quot; height=&quot;1080&quot; alt=&quot;Pal   18_2_2024 下午 9_06_28&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.nexusmods.com/palworld/mods/53&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Play as Zoe&lt;/a&gt; 和 &lt;a href=&quot;https://www.nexusmods.com/palworld/mods/353&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Hide All Human Hair All female Head All HeadEquip&lt;/a&gt;：隐藏掉原有的装扮，自己变成老婆佐伊&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.nexusmods.com/palworld/mods/312&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Paimon Replace DaeDream&lt;/a&gt;：把寐魔变成派蒙&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/Qmf1WLvt6b6xKjQi2mJeANzPZFE2Ksu4CjpwryHYK6wdLz.yOEJexYq_Z1jgTa6.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1920&quot; height=&quot;1080&quot; alt=&quot;Pal   19_2_2024 上午 2_09_33&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.nexusmods.com/palworld/mods/336&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Pal Analyzer&lt;/a&gt;：捕捉前就可以看到帕鲁的属性和特质，掌机需要到设置里改下显示为 always on&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://diygod.cc/_astro/QmVe7gAntvcisk3xVbXcwwBiMYcVrTi2m4QqD1ZySM6x9y.DV-t4pz1_ZnhiAv.webp&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; fetchpriority=&quot;auto&quot; width=&quot;1920&quot; height=&quot;1080&quot; alt=&quot;Pal   18_2_2024 下午 7_45_54&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://www.nexusmods.com/palworld/mods/585&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;Stuck Pal Rescuer&lt;/a&gt;：救命模组，据点里的帕鲁经常被 bug 卡住然后饿死，这个模组可以自动检测帕鲁是否卡住并重置&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href=&quot;https://afdian.net/album/47414d3eb9a111eeb82252540025c377&quot; rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot;&gt;FSR3 支持&lt;/a&gt;：官方不支持 A 卡的帧生成，用上这个 Roy Ally 可以在中等画质从 40 多帧提升到 70 多帧&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/body&gt;&lt;/html&gt;</content:encoded><category>闲言语</category></item></channel></rss>