<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Kazoottt</title><link>https://blog.kazoottt.top</link><description>记录、创造，以及生活本身。</description><language>zh-CN</language><item><title>练舞日记[持续更新中]</title><link>https://blog.kazoottt.top/posts/historical-b00c08f1-07b/</link><guid isPermaLink="false">urn:blog:b00c08f1-07b6-5517-a9bb-0a2e27c13285</guid><pubDate>Sun, 01 Nov 2026 15:50:50 GMT</pubDate><description>&lt;h2 id=&quot;2026-11-01&quot;&gt;2026-11-01&lt;/h2&gt;
&lt;p&gt;中午的课：第一次上瑶瑶老师的课&lt;br&gt;
热身后先带基础脚步，然后再基础脚步上加iso&lt;/p&gt;
&lt;ol&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;li&gt;胸前后&lt;br&gt;
这个感觉自己私底下也可以练&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;自己的问题是up的律动做的很别扭（习惯了down的）&lt;br&gt;
然后wave很僵硬&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;晚上的课&lt;br&gt;
今天主要是练习up的律动以及肩iso&lt;br&gt;
我一旦遇到协调就开始记不住动作&lt;br&gt;
还是得多练&lt;/p&gt;
&lt;h2 id=&quot;2026-10-31&quot;&gt;2026-10-31&lt;/h2&gt;
&lt;p&gt;今天两节课&lt;br&gt;
第一节课偏编舞，小 a 老师就是教的很快…心率容易爆炸&lt;br&gt;
看了下视频还是太软了做的，而且律动不明显&lt;/p&gt;
&lt;p&gt;第二节课纯基本功，喜欢这个老师的上课逻辑，元素➡️元素变体➡️routine，今天学的是 jamesbrown 和 bart simpson&lt;/p&gt;
&lt;h2 id=&quot;2026-06-27&quot;&gt;2026-06-27&lt;/h2&gt;
&lt;p&gt;我跳舞咋恁菜啊
感觉像没有学过一样[捂嘴哭]
要不还是抽空练下基本功吧&lt;/p&gt;
&lt;h2 id=&quot;2026-06-22&quot;&gt;2026-06-22&lt;/h2&gt;
&lt;p&gt;跳舞打卡&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/093010b8-a508-4a25-b945-216baa43793f&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;2025-07-05&quot;&gt;2025-07-05&lt;/h2&gt;
&lt;p&gt;跳舞day17
还是跳得跟屎一样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/29cf6a9a-8eff-4690-bc15-22c7c6edee5f&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;2025-06-21&quot;&gt;2025-06-21&lt;/h2&gt;
&lt;p&gt;跳舞day13&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/bbe29d89-9112-40eb-9f1b-76dec28929b6&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;2025-05-29&quot;&gt;2025-05-29&lt;/h2&gt;
&lt;p&gt;跳舞day8
今天脑子和身体完全跟不上&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/9113e58d-5d3e-436f-85f9-ee7248910ac8&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;今天跳舞有个同学和我一样有点跟不上然后我们就休息的时候聊起来了
拍完视频她问我：为什么你一直在笑
我：可能我天生爱笑吧
（其实只是想用笑缓解尴尬，因为我今天真的脑子转得很慢，记不住动作&lt;/p&gt;
&lt;h2 id=&quot;2025-05-28&quot;&gt;2025-05-28&lt;/h2&gt;
&lt;p&gt;跳舞day7
今天这个舞蹈又累又难&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/58815e82-76c6-427f-8ee8-9afe51086a18&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;2025-05-24&quot;&gt;2025-05-24&lt;/h2&gt;
&lt;p&gt;跳舞day6&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/85f9cb67-94d0-469c-8675-68af20bb27f1&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;2025-05-18&quot;&gt;2025-05-18&lt;/h2&gt;
&lt;p&gt;今天是刷课的第五节&lt;br&gt;
第一周上了3节&lt;br&gt;
第二周也就是这周上了2节&lt;br&gt;
最开始几节课记不住动作，节奏也踩不上&lt;br&gt;
今天突然觉得就算前面不站人，我也对着镜子也能自己跳出来，有点小惊喜&lt;/p&gt;
&lt;h2 id=&quot;2025-05-11&quot;&gt;2025-05-11&lt;/h2&gt;
&lt;p&gt;跳舞day3
以及之前day1 day2
今天上的是爵士入门课，感觉这个老师教学有点无聊，像在健身私教（来了好多组下蹲🌚再来波比跳更像了），不过还是挺负责的，会抠动作，对基础有提升
之前我以为我对爵士不太感兴趣，不过好像也不排斥扭胯之类的，之前两天上的黑怕课，很喜欢那个老师的风格，以后打算爵士黑怕两类都上一下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/e3c014e4-b9b0-4bbf-b820-d8a3c0cd8a93&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/5f149746-83ef-4b3d-949b-2449ef44ae57&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/user-attachments/assets/6f742ec4-fe10-4ed2-b659-8610dd6e37d8&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</description></item><item><title>Quick PR Tool v1.0.17 - 新增 Back to Source Branch 功能</title><link>https://blog.kazoottt.top/posts/historical-ab70614e-d46/</link><guid isPermaLink="false">urn:blog:ab70614e-d468-5a93-aa17-974de13dbdaf</guid><pubDate>Tue, 22 Sep 2026 02:15:07 GMT</pubDate><description>&lt;h2 id=&quot;新功能back-to-source-branch&quot;&gt;新功能:Back to Source Branch&lt;/h2&gt;
&lt;p&gt;从 merge 分支快速切换回源分支,解决冲突后一键返回。&lt;/p&gt;
&lt;p&gt;🔗 &lt;strong&gt;GitHub 仓库&lt;/strong&gt;: &lt;a href=&quot;https://github.com/KazooTTT/quick-pr&quot;&gt;https://github.com/KazooTTT/quick-pr&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;安装与更新&quot;&gt;安装与更新&lt;/h3&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; install&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; -g&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; @kazoottt/quick-pr&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# 或更新到最新版本&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;npm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; -g&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; @kazoottt/quick-pr&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h3 id=&quot;使用方式&quot;&gt;使用方式&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;命令行直接使用:&lt;/strong&gt;&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;qkpr&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; back&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;主菜单选项:&lt;/strong&gt;&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;qkpr&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# 选择 &quot;5. 🔙 Back to Source Branch&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h3 id=&quot;场景演示&quot;&gt;场景演示&lt;/h3&gt;
&lt;h4 id=&quot;场景-1单一匹配最常见&quot;&gt;场景 1:单一匹配(最常见)&lt;/h4&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; git&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; branch&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; merge/feat-M-12345-auth-to-main&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  main&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  feat/M-12345-auth&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; qkpr&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; back&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;🔙&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;  Back&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; Source&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; Branch&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  Merge&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; branch:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; merge/feat-M-12345-auth-to-main&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  Detected&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; source:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; feat/M-12345-auth&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  Detected&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; target:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; main&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;🔄&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;  Switching&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; source&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; branch:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; feat/M-12345-auth&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;✅&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;  Switched&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; back&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; to:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; feat/M-12345-auth&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h4 id=&quot;场景-2多个分支匹配&quot;&gt;场景 2:多个分支匹配&lt;/h4&gt;
&lt;p&gt;自动检测并提供选择菜单:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; qkpr&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; back&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;⚠️&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;  Found&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; possible&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; branch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; combinations:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; Which source branch &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;do&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; you&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; want&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; switch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; to?&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;❯&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; feat/my-feature&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; →&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; main&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  feat-my-feature&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; →&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h4 id=&quot;场景-3解析失败时&quot;&gt;场景 3:解析失败时&lt;/h4&gt;
&lt;p&gt;提供手动选择界面:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; qkpr&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; back&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;❌&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;  Could&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; not&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; parse&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; merge&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; branch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; name:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; merge/invalid-name&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; Select source branch (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; search&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;❯&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; feat/login-page&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  fix/bug-456&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  chore/update-deps&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h4 id=&quot;场景-4本地没有源分支&quot;&gt;场景 4:本地没有源分支&lt;/h4&gt;
&lt;p&gt;支持从远程检出:&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;$&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; qkpr&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; back&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;⚠️&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;  Source&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; branch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &apos;feat/new-api&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; is&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; not&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; available&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; locally.&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; What would you like to do&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;?&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;❯&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; Checkout&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; remote&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (origin/feat/new-api)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  Select&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; different&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; branch&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  Cancel&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h3 id=&quot;版本信息&quot;&gt;版本信息&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;当前版本&lt;/strong&gt;: 1.0.17&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新日期&lt;/strong&gt;: 2026-09-21&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;项目地址&quot;&gt;项目地址&lt;/h3&gt;
&lt;p&gt;🌟 &lt;strong&gt;欢迎 Star&lt;/strong&gt;: &lt;a href=&quot;https://github.com/KazooTTT/quick-pr&quot;&gt;https://github.com/KazooTTT/quick-pr&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🐛 &lt;strong&gt;问题反馈&lt;/strong&gt;: &lt;a href=&quot;https://github.com/KazooTTT/quick-pr/issues&quot;&gt;https://github.com/KazooTTT/quick-pr/issues&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Quick PR Tool - Your All-in-One Git Workflow Assistant&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Tana 全局快捷键自定义失效：schema 键名与实际读取键名不一致</title><link>https://blog.kazoottt.top/posts/historical-6aa88a01-864/</link><guid isPermaLink="false">urn:blog:6aa88a01-864e-5aa8-8a06-31a91f0e0470</guid><pubDate>Fri, 04 Sep 2026 07:14:10 GMT</pubDate><description>&lt;h2 id=&quot;背景&quot;&gt;背景&lt;/h2&gt;
&lt;p&gt;Tana 桌面端（Electron 应用）有一个全局语音捕获功能，默认快捷键 &lt;code&gt;Cmd+Shift+E&lt;/code&gt;，通过 Electron 的 &lt;code&gt;globalShortcut&lt;/code&gt; 注册——&lt;strong&gt;全局生效，Tana 在后台也会被触发&lt;/strong&gt;。这个组合键容易和滴答清单的主窗口唤起（&lt;code&gt;Cmd+Control+E&lt;/code&gt;）误触，所以想把它禁用掉。&lt;/p&gt;
&lt;p&gt;思路是：把快捷键改成一个物理上不存在的键（如 &lt;code&gt;F24&lt;/code&gt;），等效于禁用，又比塞非法字符串干净（注册能成功，不产生错误日志）。&lt;/p&gt;
&lt;h2 id=&quot;踩过的坑&quot;&gt;踩过的坑&lt;/h2&gt;
&lt;p&gt;直接改配置文件 &lt;code&gt;~/Library/Application Support/Tana Outliner/keyBindings.json&lt;/code&gt;：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;	&quot;toggleVoiceCapture&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;CommandOrControl+Shift+F24&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;改完重启，&lt;code&gt;Cmd+Shift+E&lt;/code&gt; &lt;strong&gt;依然生效&lt;/strong&gt;。看起来像是「设置了 custom 不会禁用 default，两者并存」——但这是错觉。&lt;/p&gt;
&lt;h2 id=&quot;真正的原因键名不一致&quot;&gt;真正的原因：键名不一致&lt;/h2&gt;
&lt;p&gt;读 Tana 的 &lt;code&gt;main.js&lt;/code&gt;（版本 1.523.0）取证，发现两处键名对不上：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;位置&lt;/th&gt;
&lt;th&gt;键名&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;store schema 声明（&lt;code&gt;KRe&lt;/code&gt;）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;toggleVoiceCapture&lt;/code&gt;（遗留名，全代码只出现一次，&lt;strong&gt;没有任何地方读它&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;命令列表（&lt;code&gt;dre&lt;/code&gt;）里的 command&lt;/td&gt;
&lt;td&gt;&lt;code&gt;voiceCapture&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;实际读取：&lt;code&gt;store.get(e.command)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;voiceCapture&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;快捷键管理器的注册逻辑本身是&lt;strong&gt;替换&lt;/strong&gt;，不是并存：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;bindAll&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  this&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.globalShortcut.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;unregisterAll&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();            &lt;/span&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;// 先全部注销&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; r &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;of&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getKeyBindings&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;()) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    let&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; n &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; r.customShortcut &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; typeof&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; r.customShortcut &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;string&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;            ?&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; r.customShortcut &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; r.defaultShortcut;  &lt;/span&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;// 有 custom 就用 custom&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    this&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.globalShortcut.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;register&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(n, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);          &lt;/span&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;// 只注册一个&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;但 &lt;code&gt;getKeyBindings()&lt;/code&gt; 读的是 &lt;code&gt;store.get(&quot;voiceCapture&quot;)&lt;/code&gt;，而我们写的是 &lt;code&gt;toggleVoiceCapture&lt;/code&gt; → 读到 &lt;code&gt;undefined&lt;/code&gt; → falsy → &lt;strong&gt;静默回退到默认值 &lt;code&gt;Cmd+Shift+E&lt;/code&gt;&lt;/strong&gt;。自定义配置被无声地忽略了。&lt;/p&gt;
&lt;p&gt;本质上是 Tana 自己的一个 bug：schema 里的遗留键名和实际读取的 command 名不一致。&lt;/p&gt;
&lt;h2 id=&quot;正确的写法&quot;&gt;正确的写法&lt;/h2&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;	&quot;voiceCapture&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;CommandOrControl+Shift+F24&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;	&quot;quickCapture&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;CommandOrControl+Shift+Space&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Tana 的 GUI 入口（&lt;strong&gt;Options → Customize Keybindings&lt;/strong&gt;）内部也是用 command 名写入的，所以这和 GUI 设置完全等效。&lt;/p&gt;
&lt;h2 id=&quot;另外两个操作要点&quot;&gt;另外两个操作要点&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;改配置前必须先退出 Tana&lt;/strong&gt;。Tana 用 electron-store 管理配置，App 退出时会把内存中的值写回文件；在它运行时改 JSON 会被静默覆盖。流程：备份 → 优雅退出 → 改配置 → 重启 → 读回验证。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不要试图用空字符串「禁用」&lt;/strong&gt;。取值逻辑是 &lt;code&gt;customShortcut || defaultShortcut&lt;/code&gt;，空串是 falsy，会静默回退默认值，你以为禁了其实没禁。要用合法但按不到的键（F24 在任何 Mac 键盘上都不存在，Electron accelerator 支持 F1–F24）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;替代方案不一定要禁用全局捕获&quot;&gt;替代方案：不一定要禁用全局捕获&lt;/h2&gt;
&lt;p&gt;Tana 还有个&lt;strong&gt;非全局&lt;/strong&gt;的语音入口：&lt;code&gt;Cmd+Shift+L&lt;/code&gt;（Quick chat with dictation），只在 Tana 前台生效。如果需要的只是「在 Tana 里语音输入」，禁用全局捕获后改用它就够了。代价是失去 Tana 语音捕获最值钱的能力——在别的 App 里（比如浏览器看资料时）不用切窗口直接说话记进 Tana。&lt;/p&gt;
&lt;h2 id=&quot;一键禁用脚本&quot;&gt;一键禁用脚本&lt;/h2&gt;
&lt;p&gt;以下脚本可直接分享使用：自动退出 Tana → 备份 → 写入正确的键名（保留其他配置、清理无效的遗留键名）。已在 macOS 上验证。&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# 禁用 Tana 全局语音捕获快捷键（Cmd+Shift+E → 永不触发的 F24）&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# 原理：Tana 读取 keyBindings.json 里的 &quot;voiceCapture&quot; 键作为自定义快捷键，&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;#       自定义存在时完全替换默认值。F24 在 Mac 键盘上不存在，等效禁用。&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# 注意：schema 里的 &quot;toggleVoiceCapture&quot; 是无人读取的遗留键名，写了无效。&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; -euo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; pipefail&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;KB&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;$HOME&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;/Library/Application Support/Tana Outliner/keyBindings.json&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# 1. 退出 Tana（electron-store 会在退出时把内存值写回文件，运行中修改会被覆盖）&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; pgrep&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; -f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;Tana Outliner&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; /dev/null&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  echo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;正在退出 Tana...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  osascript&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; -e&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &apos;quit app &quot;Tana Outliner&quot;&apos;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  for&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; _ &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; $(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;seq&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 10&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;); &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    pgrep&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; -f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;Tana Outliner&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; /dev/null&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; ||&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; break&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    sleep&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  done&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; pgrep&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; -f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;Tana Outliner&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; /dev/null&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    echo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;错误：Tana 未能退出，请手动退出后重试&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; &gt;&amp;#x26;2&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    exit&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  fi&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# 2. 备份现有配置&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; [ &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;-f&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;$KB&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; ]; &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  cp&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;$KB&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;$KB&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;.bak.$(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;date&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; +%Y%m%d-%H%M%S)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  echo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;已备份原配置&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;# 3. 合并写入（保留其他键，清理无效的遗留键名）&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;python3&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;$KB&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; &amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &apos;EOF&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;import json, os, sys&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;path = sys.argv[1]&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;data = {}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;if os.path.exists(path):&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    with open(path) as f:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;        data = json.load(f)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;removed = data.pop(&quot;toggleVoiceCapture&quot;, None)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;data[&quot;voiceCapture&quot;] = &quot;CommandOrControl+Shift+F24&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;os.makedirs(os.path.dirname(path), exist_ok=True)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;with open(path, &quot;w&quot;) as f:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    json.dump(data, f, indent=&quot;\t&quot;, ensure_ascii=False)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    f.write(&quot;\n&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;if removed:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    print(f&quot;已清理无效键 toggleVoiceCapture（原值: {removed}）&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;print(&quot;已设置 voiceCapture = CommandOrControl+Shift+F24&quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;EOF&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;完成。启动 Tana 后，Cmd+Shift+E 将不再触发全局语音捕获。&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;echo&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;回滚：Tana 菜单 → Options → Customize Keybindings → Voice capture 行点 × 清除自定义。&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;如果只想粘贴一行（需先手动退出 Tana）：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;python3&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; -c&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;import json,os; p=os.path.expanduser(&apos;~/Library/Application Support/Tana Outliner/keyBindings.json&apos;); d=json.load(open(p)) if os.path.exists(p) else {}; d.pop(&apos;toggleVoiceCapture&apos;,None); d[&apos;voiceCapture&apos;]=&apos;CommandOrControl+Shift+F24&apos;; os.makedirs(os.path.dirname(p),exist_ok=True); json.dump(d,open(p,&apos;w&apos;),indent=&apos;\t&apos;,ensure_ascii=False); print(&apos;已禁用，重启 Tana 生效&apos;)&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;经验总结&quot;&gt;经验总结&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;逆向修改 Electron 应用的配置文件前，先确认代码实际 &lt;code&gt;get()&lt;/code&gt; 的键名，而不是看 schema 声明。&lt;/strong&gt; schema 可能留有历史遗留键名，写错了不会报错，只会静默失效——排查时容易误判成「配置机制和预期不同」（这次就误判成了 custom/default 并存）。&lt;/p&gt;</description></item><item><title>Rocket Loader：让 JavaScript 晚点运行，页面就一定更快吗？</title><link>https://blog.kazoottt.top/posts/historical-79d469a7-8fd/</link><guid isPermaLink="false">urn:blog:79d469a7-8fda-56fc-a8fe-1e6d58a7c09d</guid><pubDate>Fri, 31 Jul 2026 06:33:09 GMT</pubDate><description>&lt;p&gt;最近博客里出现了一个很奇怪的问题：Mermaid 流程图没有渲染，页面直接显示了图表源码。&lt;/p&gt;
&lt;p&gt;一开始我怀疑过 Mermaid 语法、前端构建产物和浏览器缓存。但检查线上 DOM 后发现，页面里能够找到 &lt;code&gt;.mermaid-diagram&lt;/code&gt; 容器，却没有生成任何 SVG，也没有进入渲染失败的回退状态。这意味着问题甚至还没有走到 Mermaid 的解析阶段——负责初始化 Mermaid 的 JavaScript 根本没有正常执行。&lt;/p&gt;
&lt;p&gt;继续检查浏览器实际收到的 HTML，才发现 Cloudflare Rocket Loader 改写了 Astro 生成的模块脚本。关闭 Rocket Loader 后，两张流程图立即恢复，DOM 中重新出现了两个 SVG。&lt;/p&gt;
&lt;p&gt;这次故障让我重新认识了 Rocket Loader：它不是一个单纯的“JavaScript 加速开关”，而是一套会改变脚本加载时序的优化机制。&lt;/p&gt;
&lt;h2 id=&quot;rocket-loader-是做什么的&quot;&gt;Rocket Loader 是做什么的？&lt;/h2&gt;
&lt;p&gt;Rocket Loader 是 Cloudflare 提供的一项前端性能优化功能。&lt;/p&gt;
&lt;p&gt;它要解决的问题是：浏览器解析 HTML 时，普通 JavaScript 脚本可能会阻塞后续内容的解析和渲染。如果页面引用了很多脚本，或者某个第三方脚本响应很慢，用户可能需要盯着空白页面等待。&lt;/p&gt;
&lt;p&gt;Rocket Loader 的策略是让内容先出现，再执行 JavaScript。&lt;/p&gt;
&lt;p&gt;按照 Cloudflare 的说明，它会延迟页面中的 JavaScript，让文字、图片和字体等内容优先渲染，同时异步处理内联脚本与外部脚本，并尽量维持原来的执行顺序。&lt;/p&gt;
&lt;p&gt;因此，它优化的主要是“用户什么时候能看到内容”，而不是 JavaScript 本身的运行速度。&lt;/p&gt;
&lt;p&gt;可以把这种取舍简单理解为：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;原来的页面加载&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;解析 HTML&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  → 遇到 JavaScript&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  → 下载并执行&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  → 继续解析 HTML&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  → 显示页面&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;启用 Rocket Loader 后&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;解析 HTML&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  → 暂时推迟 JavaScript&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  → 优先显示页面内容&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  → 恢复并执行 JavaScript&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;用户可能更早看到正文，但依赖 JavaScript 的按钮、图表和其他交互要稍后才能使用。&lt;/p&gt;
&lt;h2 id=&quot;它是如何实现的&quot;&gt;它是如何实现的？&lt;/h2&gt;
&lt;p&gt;Rocket Loader 同时依赖 Cloudflare 边缘节点和浏览器端运行时代码。&lt;/p&gt;
&lt;p&gt;请求经过 Cloudflare 时，Cloudflare 会在边缘修改返回给浏览器的 HTML。它暂时把原有脚本处理成浏览器不会立即执行的形式，让浏览器先继续解析页面。随后，Cloudflare 注入的 Rocket Loader 运行时再恢复这些脚本，并模拟普通脚本、&lt;code&gt;async&lt;/code&gt; 和 &lt;code&gt;defer&lt;/code&gt; 等不同执行方式。&lt;/p&gt;
&lt;p&gt;整个过程可以概括为：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;源站返回 HTML&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  ↓&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;Cloudflare 在边缘改写 script&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  ↓&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;浏览器优先解析和绘制内容&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  ↓&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;Rocket Loader 恢复脚本&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  ↓&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;JavaScript 开始执行&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;这里最重要的一点是：Rocket Loader 会接管原本由浏览器负责的脚本加载时序。&lt;/p&gt;
&lt;p&gt;这也是它既能改善首屏速度，又可能造成兼容问题的原因。&lt;/p&gt;
&lt;h2 id=&quot;它和-asyncdefer-有什么区别&quot;&gt;它和 &lt;code&gt;async&lt;/code&gt;、&lt;code&gt;defer&lt;/code&gt; 有什么区别？&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;async&lt;/code&gt; 和 &lt;code&gt;defer&lt;/code&gt; 是浏览器原生支持的脚本属性。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;async&lt;/code&gt; 会并行下载脚本，下载完成后尽快执行，多个脚本之间不保证执行顺序。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;defer&lt;/code&gt; 会并行下载脚本，等 HTML 解析完成后按照文档顺序执行。&lt;/li&gt;
&lt;li&gt;Rocket Loader 会在 Cloudflare 边缘改写页面，然后通过自己的运行时延迟并调度多个脚本。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果能够修改应用代码，通常应该先使用浏览器原生机制、ES modules、代码拆分和按需加载。它们的行为更明确，也更容易由构建工具和测试覆盖。&lt;/p&gt;
&lt;p&gt;Rocket Loader 更像是站点之外的一层统一优化：不改源代码，也能尝试推迟大量脚本。但多了一层调度，就多了一层需要验证的行为。&lt;/p&gt;
&lt;h2 id=&quot;哪些场景适合使用&quot;&gt;哪些场景适合使用？&lt;/h2&gt;
&lt;p&gt;Rocket Loader 比较适合内容优先、交互较轻的传统网站，例如：&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;li&gt;允许正文先显示、交互稍后可用；&lt;/li&gt;
&lt;li&gt;有性能监控和功能回归测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例如，一个资讯站的正文被广告、统计和推荐脚本挡住时，Rocket Loader 可能让读者更快看到文章。&lt;/p&gt;
&lt;p&gt;不过，“可能更快”必须通过数据证明。开启前后至少应该比较 FCP、LCP、TBT 或 INP，同时确认按钮、表单、埋点和第三方组件仍然正常。&lt;/p&gt;
&lt;h2 id=&quot;哪些场景不适合&quot;&gt;哪些场景不适合？&lt;/h2&gt;
&lt;p&gt;如果 JavaScript 本身就是产品的核心，而不只是页面增强，使用 Rocket Loader 就需要格外谨慎。&lt;/p&gt;
&lt;p&gt;风险较高的场景包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;React、Vue、Astro 等由构建工具管理模块加载和 hydration 的应用；&lt;/li&gt;
&lt;li&gt;后台管理系统、编辑器和实时协作应用；&lt;/li&gt;
&lt;li&gt;登录、支付、下单等关键流程；&lt;/li&gt;
&lt;li&gt;依赖严格执行顺序或生命周期事件的脚本；&lt;/li&gt;
&lt;li&gt;使用严格 CSP、SRI 或复杂第三方依赖的页面；&lt;/li&gt;
&lt;li&gt;已经使用 ES modules、&lt;code&gt;defer&lt;/code&gt;、代码拆分和按需加载的站点；&lt;/li&gt;
&lt;li&gt;缺少端到端测试，无法及时发现静默失效。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这类页面即使 HTML 和 CSS 正常显示，也可能只有局部功能失效。相比直接白屏，这种“看起来没问题”的故障反而更难发现。&lt;/p&gt;
&lt;h2 id=&quot;为什么它影响了-astro-和-mermaid&quot;&gt;为什么它影响了 Astro 和 Mermaid？&lt;/h2&gt;
&lt;p&gt;Astro 会把组件脚本构建成 &lt;code&gt;type=&quot;module&quot;&lt;/code&gt;，并负责 npm 依赖打包、TypeScript 转换、去重和代码拆分。&lt;/p&gt;
&lt;p&gt;Mermaid 的初始化链路大致是：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;浏览器执行 Astro 生成的模块入口&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  → 入口动态加载 Mermaid&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  → Mermaid 读取页面中的图表源码&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  → 生成 SVG&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;这次故障中，HTML 和 CSS 都正常返回，Mermaid 的源码容器也存在，但模块入口没有成功完成初始化。于是后面的动态加载和 SVG 生成都没有发生。&lt;/p&gt;
&lt;p&gt;最终表现就是：读者看到的不是流程图，而是一整段 &lt;code&gt;graph LR&lt;/code&gt; 源码。&lt;/p&gt;
&lt;p&gt;关闭 Rocket Loader 后，Astro 模块恢复由浏览器原生机制加载，两张 Mermaid 图都成功生成了 SVG。&lt;/p&gt;
&lt;h2 id=&quot;出现问题时如何排查&quot;&gt;出现问题时如何排查？&lt;/h2&gt;
&lt;p&gt;第一步不是立即改代码，而是做开关对照。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;找到一个能够稳定复现问题的 URL。&lt;/li&gt;
&lt;li&gt;记录当前页面的 DOM、Console 和 Network 状态。&lt;/li&gt;
&lt;li&gt;临时关闭 Rocket Loader。&lt;/li&gt;
&lt;li&gt;使用无痕窗口或清理缓存后重新访问。&lt;/li&gt;
&lt;li&gt;比较入口脚本、依赖请求和最终 DOM。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;还可以直接检查线上 HTML：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;bash&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;curl&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; -fsS&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; https://example.com/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  |&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; grep&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; -E&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &apos;rocket-loader|data-cf-settings|&amp;#x3C;script&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;浏览器里则应检查：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;JavaScript 入口有没有发出请求；&lt;/li&gt;
&lt;li&gt;入口的动态依赖有没有继续加载；&lt;/li&gt;
&lt;li&gt;Console 是否出现 CSP、MIME 或模块加载错误；&lt;/li&gt;
&lt;li&gt;目标组件有没有完成初始化；&lt;/li&gt;
&lt;li&gt;最终结果是否真的存在，而不是只看 HTTP 200。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于 Mermaid，最直接的验收条件就是：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;document.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;querySelectorAll&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;.mermaid-diagram svg&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; &gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;构建成功只能证明产物生成了，不能证明经过 CDN 改写后仍能在真实浏览器中运行。&lt;/p&gt;
&lt;h2 id=&quot;如果只想排除部分脚本怎么办&quot;&gt;如果只想排除部分脚本怎么办？&lt;/h2&gt;
&lt;p&gt;Cloudflare 支持使用 &lt;code&gt;data-cfasync=&quot;false&quot;&lt;/code&gt; 排除单个脚本：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;html&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;html&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; data-cfasync&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;false&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; src&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;/javascript.js&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;&gt;&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;但它有几个限制：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;属性必须直接存在于初始 HTML 中；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;data-cfasync&lt;/code&gt; 必须写在 &lt;code&gt;src&lt;/code&gt; 前面；&lt;/li&gt;
&lt;li&gt;如果脚本依赖其他脚本，依赖链也需要一并排除；&lt;/li&gt;
&lt;li&gt;其他脚本仍然会被 Rocket Loader 接管。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对于 Astro 还多一层问题：Astro 默认只处理没有额外属性的组件脚本。直接添加 &lt;code&gt;data-cfasync&lt;/code&gt; 可能让脚本退出 Astro 的打包和 TypeScript 处理管线。&lt;/p&gt;
&lt;p&gt;因此，现代框架项目出现全局兼容问题时，直接关闭 Rocket Loader，或者使用 Cloudflare Configuration Rule 按主机名和路径关闭，通常比逐个排除构建产物更可靠。&lt;/p&gt;
&lt;h2 id=&quot;是否应该开启-rocket-loader&quot;&gt;是否应该开启 Rocket Loader？&lt;/h2&gt;
&lt;p&gt;可以用下面这组问题判断：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;首屏是否真的被传统同步脚本阻塞？&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  ├─ 否 → 通常不需要 Rocket Loader&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  └─ 是&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;      ↓&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;页面是否以内容阅读为主？&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  ├─ 否 → 优先在应用中优化脚本&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  └─ 是&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;      ↓&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;是否允许交互稍后可用？&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  ├─ 否 → 不适合&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  └─ 是&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;      ↓&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;是否有性能指标和功能回归测试？&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  ├─ 否 → 先建立验证基线&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  └─ 是 → 小范围开启并比较结果&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Rocket Loader 不是一个“开启就会更快”的按钮。它实际上是在用脚本执行时序的变化，交换更早的内容绘制。&lt;/p&gt;
&lt;p&gt;如果站点主要依赖 HTML 和 CSS，JavaScript 只是锦上添花，这笔交换可能值得。如果页面由模块脚本驱动，或者 JavaScript 承担核心功能，那么框架、浏览器原生加载机制和应用自身的性能优化通常更可控。&lt;/p&gt;
&lt;h2 id=&quot;最后&quot;&gt;最后&lt;/h2&gt;
&lt;p&gt;这次 Mermaid 故障提醒了我：线上页面并不只由仓库里的代码决定。&lt;/p&gt;
&lt;p&gt;代码经过构建、部署、CDN 缓存和边缘优化后，浏览器真正收到的内容可能已经发生变化。排查前端问题时，不能只看源代码和构建结果，还要观察最终 HTML、网络请求和真实 DOM。&lt;/p&gt;
&lt;p&gt;性能优化也不应该以“某个开关是否开启”为目标。真正的目标应该是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;用户更早看到有用内容，同时页面仍然完整可用。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果速度提升的代价是流程图、按钮或关键交互静默失效，那么它就不是优化。&lt;/p&gt;
&lt;h2 id=&quot;参考资料&quot;&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/speed/optimization/content/rocket-loader/&quot;&gt;Cloudflare：Rocket Loader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/speed/optimization/content/rocket-loader/enable/&quot;&gt;Cloudflare：启用或关闭 Rocket Loader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/speed/optimization/content/rocket-loader/ignore-javascripts/&quot;&gt;Cloudflare：让 Rocket Loader 忽略指定脚本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/rules/configuration-rules/settings/#rocket-loader&quot;&gt;Cloudflare：Configuration Rules 中的 Rocket Loader 设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.cloudflare.com/too-old-to-rocket-load-too-young-to-die/&quot;&gt;Cloudflare：Rocket Loader 重构实现说明&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.astro.build/zh-cn/guides/client-side-scripts/&quot;&gt;Astro：客户端脚本处理&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><category>javascript</category><category>笔记</category><category>前端</category><category>博客开发</category><category>cloudflare</category><category>astro</category><category>AI 写作为主</category></item><item><title>异步请求的顺序，应该由数据依赖决定</title><link>https://blog.kazoottt.top/posts/historical-fa5dbd7b-423/</link><guid isPermaLink="false">urn:blog:fa5dbd7b-4237-5dfa-b03b-b397f96ac8ee</guid><pubDate>Mon, 27 Jul 2026 10:33:37 GMT</pubDate><description>&lt;p&gt;假设一个页面布局编辑器需要加载两类数据：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;服务端保存的页面详情，例如当前使用双栏布局。&lt;/li&gt;
&lt;li&gt;不同布局对应的预设配置，例如各区域的默认宽度和间距。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;新建页面没有历史数据，可以选择一种基础布局完成初始化。为了方便讨论，假设默认使用单栏布局。&lt;/p&gt;
&lt;p&gt;编辑页面刚挂载时，服务端详情还没有返回。此时表单为空，于是页面按照新建逻辑，请求了单栏布局的默认配置。&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;p&gt;理解这个问题，需要区分三种顺序：&lt;/p&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;/ul&gt;
&lt;pre class=&quot;mermaid&quot;&gt;sequenceDiagram
autonumber
participant Page as 编辑页面
participant Form as 表单状态
participant Detail as 详情接口
participant Config as 布局配置接口

Page-&gt;&gt;Detail: 请求服务端详情
Page-&gt;&gt;Form: 读取当前布局
Form--&gt;&gt;Page: 当前为空
Page-&gt;&gt;Config: 请求单栏默认配置

Detail--&gt;&gt;Page: 返回已保存的双栏布局
Page-&gt;&gt;Form: 写入双栏配置
Note over Form: 当前状态正确

Config--&gt;&gt;Page: 返回单栏默认配置
Page-&gt;&gt;Form: 写入单栏配置
Note over Form: 双栏配置被覆盖&lt;/pre&gt;
&lt;p&gt;这张图中，详情接口先写入双栏配置，布局配置接口随后又写入单栏配置。表单不会判断哪份数据更适合当前页面，只会保留最后一次写入的值。&lt;/p&gt;
&lt;p&gt;因此，如果代码在每次响应返回后都直接更新表单，最终结果就取决于哪个响应更晚写入。&lt;/p&gt;
&lt;h2 id=&quot;一次异步交错是怎样发生的&quot;&gt;一次异步交错是怎样发生的&lt;/h2&gt;
&lt;p&gt;这里的两个请求访问的是不同接口。详情接口读取已保存的页面，布局配置接口读取单栏布局的默认参数。&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;/ul&gt;
&lt;p&gt;问题就发生在这里。布局配置请求发出时，表单虽然为空，但这并不代表页面没有已保存的布局。&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;p&gt;布局配置接口返回的单栏参数并没有错。问题在于，页面已经不再需要这份参数。&lt;/p&gt;
&lt;p&gt;页面请求单栏配置时，代码依据的是这个判断：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;表单中的布局字段为空，所以请用单栏配置初始化。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个判断混淆了两种状态：布局确实为空，以及布局尚未加载完成。等到详情接口返回双栏布局，这个区别才显现出来。&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;p&gt;页面详情和布局配置并不是两个互不相关的初始化任务。&lt;/p&gt;
&lt;p&gt;布局配置请求需要一个确定的布局，而这个布局来自页面详情。只有详情返回后，程序才能知道应该加载双栏配置，还是在确认没有已保存布局时使用单栏默认配置。&lt;/p&gt;
&lt;p&gt;它们的依赖关系是：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;页面详情&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  → 确定当前布局&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;    → 加载该布局的配置&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;      → 写入表单&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;既然下一步依赖上一步的结果，代码也应该按照这个顺序执行：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;ts&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; initializePage&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; detail&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; fetchPageDetail&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; layout&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; detail?.layout &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;??&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; DEFAULT_LAYOUT&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; layoutConfig&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; fetchLayoutConfig&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(layout);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  form.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;setFieldsValue&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    ...&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;layoutConfig.defaults,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    ...&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;detail,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    layout,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;这段流程先等待页面详情，再从详情中确定布局，最后请求对应的布局配置。写入时默认配置在前、服务端详情在后，已有数据不会被默认值覆盖。&lt;/p&gt;
&lt;p&gt;表单只在这些数据准备完成后统一写入，不需要靠两个请求的返回顺序决定最终结果。&lt;/p&gt;
&lt;p&gt;问题代码通常把这条链拆散了：一个 &lt;code&gt;effect&lt;/code&gt; 请求页面详情，另一个 &lt;code&gt;effect&lt;/code&gt; 发现布局字段为空，便请求默认配置。两个 &lt;code&gt;effect&lt;/code&gt; 各自更新表单，却没有表达“布局配置依赖页面详情”这层关系。&lt;/p&gt;
&lt;p&gt;多个 &lt;code&gt;effect&lt;/code&gt; 本身不是问题。互不依赖的数据可以并行加载；但如果后一个请求的参数或执行条件来自前一个请求，就应该显式串联，而不是让它们从共享状态中猜测对方是否已经完成。&lt;/p&gt;
&lt;p&gt;这里也不能简单地把“表单为空”当作使用默认值的条件。编辑页面加载过程中，空值可能只表示详情尚未返回。默认值应该在详情加载完成，并确认没有已保存布局之后才参与初始化。&lt;/p&gt;
&lt;h2 id=&quot;总结&quot;&gt;总结&lt;/h2&gt;
&lt;p&gt;这个问题表面上是默认值覆盖了服务端数据，实际原因却是代码没有表达数据之间的依赖关系。&lt;/p&gt;
&lt;p&gt;页面详情决定布局，布局决定加载哪份配置。只要这条关系被拆到多个独立的异步流程中，最终状态就可能取决于响应返回顺序。&lt;/p&gt;
&lt;p&gt;解决问题的重点不是让某个请求更快，也不是调整 &lt;code&gt;effect&lt;/code&gt; 的先后，而是让代码中的执行顺序与数据依赖顺序一致：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;先拿到依赖的数据&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;→ 再确定下一步请求&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;→ 最后统一写入状态&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;请求发起顺序不等于结果生效顺序。只有把依赖关系写进异步流程，页面状态才不需要依靠最后一次 &lt;code&gt;set&lt;/code&gt; 碰运气。&lt;/p&gt;</description><category>前端</category><category>异步竞态</category><category>状态管理</category><category>AI 写作为主</category></item><item><title>从上传到访问：OSS 文件的响应头如何影响浏览器行为</title><link>https://blog.kazoottt.top/posts/oss-response-headers-browser-behavior/</link><guid isPermaLink="false">urn:blog:2f894f86-963d-5719-9c40-3cf5385ab885</guid><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><description>&lt;p&gt;业务系统生成 PDF 后，需要将它上传到 OSS，再向前端提供访问 URL。前端拿到 URL，并不意味着浏览器一定会直接预览 PDF。&lt;/p&gt;
&lt;p&gt;用户最终看到在线预览、文件下载还是跨域错误，取决于上传时保存的 Metadata、URL 使用的访问域名、OSS 返回的响应头，以及前端怎样使用这个 URL。&lt;/p&gt;
&lt;p&gt;本文按照实际链路，梳理从上传 PDF 到浏览器预览的流程，以及其中遇到的几个问题。&lt;/p&gt;
&lt;h2 id=&quot;1-上传-pdf&quot;&gt;1. 上传 PDF&lt;/h2&gt;
&lt;p&gt;上传文件前，服务端需要确定 Bucket、Object Key、访问凭证和文件内容。&lt;/p&gt;
&lt;p&gt;下面使用 OSS Node.js SDK 上传一份 PDF，并在上传请求中设置与浏览器预览有关的请求头：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://help.aliyun.com/zh/oss/developer-reference/nodejs-sdk/&quot;&gt;OSS Node.js SDK 官方文档&lt;/a&gt;&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; OSS&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;ali-oss&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; uploadPdf&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; client&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; OSS&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    region: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;oss-&amp;#x3C;region-id&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    accessKeyId: process.env.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;OSS_ACCESS_KEY_ID&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    accessKeySecret: process.env.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;OSS_ACCESS_KEY_SECRET&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    authorizationV4: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    bucket: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;example-bucket&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; headers&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    &quot;Content-Type&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;application/pdf&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    &quot;Content-Disposition&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;inline; filename=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;document.pdf&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;\&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    &quot;x-oss-object-acl&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;private&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    &quot;x-oss-forbid-overwrite&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;true&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  };&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; objectKey&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;files/document.pdf&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; localFilePath&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; path.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;normalize&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;document.pdf&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; result&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; client.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;put&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(objectKey, localFilePath, { headers });&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  console.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;文件上传完成&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, result);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;uploadPdf&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(console.error);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;code&gt;Content-Type: application/pdf&lt;/code&gt; 告诉客户端文件内容是 PDF。&lt;code&gt;Content-Disposition: inline&lt;/code&gt; 表示这份内容适合在浏览器中展示，&lt;code&gt;filename&lt;/code&gt; 则提供建议文件名。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://help.aliyun.com/zh/oss/developer-reference/putobject&quot;&gt;PutObject 官方文档&lt;/a&gt;列出了上传时可以指定的请求头：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/07/20260720-1832efa45f9aeac5a29e03428edc2b1e.png&quot; alt=&quot;Pasted image 20260720102245&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;在 PutObject 请求中设置的 &lt;code&gt;Content-Type&lt;/code&gt;、&lt;code&gt;Content-Disposition&lt;/code&gt; 等字段，会被 OSS 保存为 Object Metadata。以后读取 Object 时，相应值会成为 HTTP 响应头。不过Object Metadata 不是浏览器最终响应的唯一来源。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/07/20260720-27a0e8b8eb3380aa113a7ea159873cc9.svg&quot; alt=&quot;OSS Metadata 到 HTTP 响应头&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;2-获取访问-url&quot;&gt;2. 获取访问 URL&lt;/h2&gt;
&lt;p&gt;公共读 Bucket 中的 Object 可以通过公开 URL 访问。私有 Bucket 则要求请求携带有效签名，通常由服务端生成有时效的预签名 URL。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://help.aliyun.com/zh/oss/developer-reference/download-objects-using-a-presigned-url-generated-with-oss-sdk-for-node-js&quot;&gt;使用预签名 URL 下载（Node.js SDK）&lt;/a&gt;&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; OSS&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;ali-oss&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; generateSignatureUrl&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;fileName&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; client&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; OSS&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;({&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    endpoint: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;https://files.example.com&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;// 可以指定自定义域名&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    accessKeyId: process.env.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;OSS_ACCESS_KEY_ID&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    accessKeySecret: process.env.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;OSS_ACCESS_KEY_SECRET&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    bucket: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;example-bucket&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    region: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;oss-&amp;#x3C;region-id&gt;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    authorizationV4: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    cname: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  });&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; client.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;signatureUrlV4&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    &quot;GET&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    3600&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    { headers: {} },&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    fileName,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  );&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;generateSignatureUrl&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;files/document.pdf&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  .&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;then&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; console.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Generated URL:&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, url))&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  .&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(console.error);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;预签名 URL 解决的是私有 Object 的临时访问权限，不决定文件应该预览还是下载。浏览器最终怎样处理 PDF，仍取决于访问域名和最终响应头。&lt;/p&gt;
&lt;h2 id=&quot;3-访问域名如何改变最终响应&quot;&gt;3. 访问域名如何改变最终响应&lt;/h2&gt;
&lt;p&gt;同一份 Object 可以通过 OSS 默认域名或已经绑定到 Bucket 的自定义域名访问。两类域名可能得到不同的最终响应。&lt;/p&gt;
&lt;h3 id=&quot;31-oss-默认域名可能增加强制下载头&quot;&gt;3.1. OSS 默认域名可能增加强制下载头&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://help.aliyun.com/zh/oss/how-to-ensure-an-object-is-previewed-when-you-access-the-object&quot;&gt;阿里云文件预览排查文档&lt;/a&gt;说明了 OSS 默认域名的强制下载规则。&lt;/p&gt;
&lt;p&gt;为降低特定文件通过默认域名直接执行的安全风险，命中规则的请求会收到：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;http&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;http&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;x-oss-force-download&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;Content-Disposition&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; attachment&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;是否命中强制下载规则，取决于 Bucket、账号、地域和文件类型等条件。OSS 默认域名并不是在所有情况下都会强制下载全部文件，具体范围应以阿里云文档中的规则为准。&lt;/p&gt;
&lt;p&gt;如果 Object Metadata 原本保存的是：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;http&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;http&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;Content-Disposition&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; inline&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;请求命中默认域名的强制下载策略后，浏览器最终可能收到：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;http&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;http&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;x-oss-force-download&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;Content-Disposition&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; attachment&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;这意味着问题不一定出在上传代码。即使上传时保存了 &lt;code&gt;inline&lt;/code&gt;，OSS 仍可能在形成最终响应时加入 &lt;code&gt;attachment&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&quot;32-自定义域名不会增加默认域名下载头&quot;&gt;3.2. 自定义域名不会增加默认域名下载头&lt;/h3&gt;
&lt;p&gt;自定义域名需要先绑定到 Bucket，再通过 CNAME 指向 OSS。它不是简单地把预签名 URL 中的域名替换掉。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://help.aliyun.com/zh/oss/user-guide/access-buckets-via-custom-domain-names&quot;&gt;阿里云自定义域名文档&lt;/a&gt;说明，通过自定义域名访问时，OSS 不会增加默认域名使用的强制下载响应头。&lt;/p&gt;
&lt;p&gt;但自定义域名不会主动添加 &lt;code&gt;Content-Disposition: inline&lt;/code&gt;。它只是不会触发默认域名的强制下载规则，最终响应仍取决于 Object Metadata、&lt;code&gt;Content-Type&lt;/code&gt; 和浏览器支持情况。&lt;/p&gt;
&lt;h2 id=&quot;4-浏览器如何处理-pdf-响应&quot;&gt;4. 浏览器如何处理 PDF 响应&lt;/h2&gt;
&lt;p&gt;浏览器收到响应后，主要通过 &lt;code&gt;Content-Type&lt;/code&gt; 和 &lt;code&gt;Content-Disposition&lt;/code&gt; 判断内容是什么，以及应该怎样处理。&lt;/p&gt;
&lt;h3 id=&quot;41-content-type-描述内容是什么&quot;&gt;4.1. &lt;code&gt;Content-Type&lt;/code&gt; 描述内容是什么&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/Content-Type&quot;&gt;&lt;code&gt;Content-Type&lt;/code&gt;&lt;/a&gt; 描述响应内容的媒体类型：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;http&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;http&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;Content-Type&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; application/pdf&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;浏览器据此知道响应内容是 PDF。如果该字段缺失或被设置为 &lt;code&gt;application/octet-stream&lt;/code&gt;，浏览器只能将它识别为通用二进制内容，可能无法选择正确的展示方式。&lt;/p&gt;
&lt;h3 id=&quot;42-content-disposition-描述怎样处理内容&quot;&gt;4.2. &lt;code&gt;Content-Disposition&lt;/code&gt; 描述怎样处理内容&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Reference/Headers/Content-Disposition&quot;&gt;&lt;code&gt;Content-Disposition&lt;/code&gt;&lt;/a&gt; 用于说明响应内容应该内联展示，还是作为附件下载。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;取值或参数&lt;/th&gt;
&lt;th&gt;示例&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;inline&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Content-Disposition: inline&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;内容可以在页面中展示&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;attachment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Content-Disposition: attachment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;内容应该作为附件下载&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;filename&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;attachment; filename=&quot;document.pdf&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;建议使用的 ASCII 文件名&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;filename*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;attachment; filename*=UTF-8&apos;&apos;...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;使用编码表示非 ASCII 文件名&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;filename&lt;/code&gt; 和 &lt;code&gt;filename*&lt;/code&gt; 是附加参数，不是与 &lt;code&gt;inline&lt;/code&gt;、&lt;code&gt;attachment&lt;/code&gt; 并列的处理方式。&lt;/p&gt;
&lt;p&gt;下面两组响应的 &lt;code&gt;Content-Type&lt;/code&gt; 相同，但处理语义不同：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;http&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;http&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;Content-Type&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; application/pdf&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;Content-Disposition&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; inline&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;浏览器支持 PDF 时，通常会直接展示内容。&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;http&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;http&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;Content-Type&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; application/pdf&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;Content-Disposition&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; attachment&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;浏览器知道内容是 PDF，但仍会按照附件语义处理。&lt;/p&gt;
&lt;h3 id=&quot;43-cors&quot;&gt;4.3. CORS&lt;/h3&gt;
&lt;p&gt;如果前端通过 &lt;code&gt;fetch&lt;/code&gt; 读取不同源的 &lt;code&gt;pdfUrl&lt;/code&gt;，浏览器会 CORS 校验：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;项目发起跨域 fetch&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;→ 浏览器发送 Origin&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;→ OSS 根据 Bucket 的 CORS 规则返回响应头&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;→ 浏览器检查当前 Origin 是否被允许&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;→ 通过后 JavaScript 才能读取响应&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;OSS 的 CORS 规则通常需要关注：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;配置&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Allowed Origin&lt;/td&gt;
&lt;td&gt;允许哪些页面来源读取 Object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Allowed Methods&lt;/td&gt;
&lt;td&gt;允许 &lt;code&gt;GET&lt;/code&gt;、&lt;code&gt;HEAD&lt;/code&gt; 等哪些方法&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Allowed Headers&lt;/td&gt;
&lt;td&gt;允许请求携带哪些请求头&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Expose Headers&lt;/td&gt;
&lt;td&gt;允许 JavaScript 读取哪些响应头&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;配置入口是：进入阿里云 OSS 控制台的 &lt;strong&gt;Bucket 列表&lt;/strong&gt;，选择目标 Bucket，再打开 &lt;strong&gt;数据安全 → 跨域设置&lt;/strong&gt;，单击 &lt;strong&gt;创建规则&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;具体参数见&lt;a href=&quot;https://help.aliyun.com/zh/oss/user-guide/configure-cross-origin-resource-sharing&quot;&gt;阿里云 OSS 跨域设置文档&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id=&quot;5-选择-pdf-预览方式&quot;&gt;5. 选择 PDF 预览方式&lt;/h2&gt;
&lt;p&gt;前端拿到 PDF URL 后，可以让 JavaScript 读取文件并生成 Blob URL，也可以直接让浏览器加载远程 URL。两种方式经过的链路不同。&lt;/p&gt;
&lt;h3 id=&quot;51-方式一javascript-读取-pdf再生成-blob-url&quot;&gt;5.1. 方式一：JavaScript 读取 PDF，再生成 Blob URL&lt;/h3&gt;
&lt;p&gt;如果远程 URL 返回 &lt;code&gt;attachment&lt;/code&gt;，仍可以先读取文件，再用本地 Blob URL 打开 PDF：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;ts&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; response&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; fetch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(pdfUrl);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;response.ok) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  throw&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; Error&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;`PDF 请求失败：${&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;response&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; pdfBlob&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; response.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;blob&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; blobUrl&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; URL&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;createObjectURL&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(pdfBlob);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; previewWindow&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; window.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(blobUrl, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;_blank&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;previewWindow) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  URL&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;revokeObjectURL&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(blobUrl);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  throw&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; Error&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;浏览器阻止了预览窗口&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;// 预览页面不再使用该 URL 后，再调用 URL.revokeObjectURL(blobUrl)。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;这个方案重新构造了一个本地资源，能够避开远程 &lt;code&gt;attachment&lt;/code&gt; 对顶层导航的影响，但没有改变远程响应本身。&lt;/p&gt;
&lt;p&gt;它还要求 &lt;code&gt;fetch&lt;/code&gt; 通过 CORS 校验，并需要等待整份 PDF 被读取。对于大文件，这会增加内存占用，也失去了浏览器直接加载远程 PDF 时可能使用的分段请求能力。&lt;/p&gt;
&lt;h4 id=&quot;511-踩坑保存文件名退化为-uuid&quot;&gt;5.1.1. 踩坑：保存文件名退化为 UUID&lt;/h4&gt;
&lt;p&gt;Blob URL 形如 &lt;code&gt;blob:https://example.com/&amp;#x3C;uuid&gt;&lt;/code&gt;，不会自动继承远程响应中的 &lt;code&gt;Content-Disposition&lt;/code&gt; 和文件名。&lt;/p&gt;
&lt;p&gt;在本项目使用的浏览器中，打开 Blob URL 后，地址栏、页签和 PDF 查看器使用 UUID。保存文件时，默认文件名同样退化为 UUID，而不是远程响应建议的文件名。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/07/20260720-820361db52c818931aab6256d3718381.svg&quot; alt=&quot;Blob URL 文件名退化为 UUID 示意图&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;左：Blob URL、页签与 PDF 查看器使用 UUID；右：“另存为”没有获得远程 PDF 的建议文件名。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;如果项目需要提供指定文件名的下载操作，可以另外创建带 &lt;code&gt;download&lt;/code&gt; 属性的链接：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;ts&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; downloadLink&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; document.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;createElement&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;a&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;downloadLink.href &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; blobUrl;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;downloadLink.download &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;document.pdf&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;downloadLink.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;click&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;具体默认文件名和扩展名仍可能因浏览器而异。这里记录的是项目实测结果，不将它扩大为所有浏览器的统一行为。&lt;/p&gt;
&lt;h3 id=&quot;52-方式二浏览器直接加载远程-pdf&quot;&gt;5.2. 方式二：浏览器直接加载远程 PDF&lt;/h3&gt;
&lt;p&gt;如果远程 URL 返回正确的 &lt;code&gt;Content-Type&lt;/code&gt; 和 &lt;code&gt;Content-Disposition&lt;/code&gt;，更合适的方式是让浏览器直接处理 PDF：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;ts&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;window.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(pdfUrl, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;_blank&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;这条路径由浏览器直接请求远程 PDF，业务 JavaScript 不读取响应体，因此不依靠 CORS 完成预览。&lt;/p&gt;
&lt;p&gt;配置 CORS 也不会把 &lt;code&gt;Content-Disposition: attachment&lt;/code&gt; 改成 &lt;code&gt;inline&lt;/code&gt;。如果直接打开 URL 仍然下载，需要检查 Object Metadata、实际访问域名和最终响应头。&lt;/p&gt;
&lt;h2 id=&quot;6-总结&quot;&gt;6. 总结&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/07/20260720-4f77cc7d866c832a2b51271691ec0acf.svg&quot; alt=&quot;OSS PDF 从上传到浏览器处理流程&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;排查 PDF 无法预览时，可以按同一顺序检查：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;上传时是否保存了正确的 &lt;code&gt;Content-Type&lt;/code&gt; 和 &lt;code&gt;Content-Disposition&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;访问的是 OSS 默认域名还是已经绑定的自定义域名。&lt;/li&gt;
&lt;li&gt;浏览器实际收到的响应头是 &lt;code&gt;inline&lt;/code&gt; 还是 &lt;code&gt;attachment&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;前端是在直接打开 URL，还是通过 &lt;code&gt;fetch&lt;/code&gt; 读取文件。&lt;/li&gt;
&lt;li&gt;如果使用 &lt;code&gt;fetch&lt;/code&gt;，Bucket 的 CORS 规则是否允许当前页面来源。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;不要用 Blob URL 或 CORS 掩盖响应头配置问题。对于单纯的 PDF 在线预览，优先让远程 URL 返回正确语义，再交给浏览器直接处理，链路更短，也更容易排查。&lt;/p&gt;</description></item><item><title>Cherry Studio 提示词模板（2026-07-14）</title><link>https://blog.kazoottt.top/posts/cherrystudio-prompts-bak/</link><guid isPermaLink="false">urn:blog:006293c2-44a5-5351-b6aa-1c2dba5b0d01</guid><pubDate>Tue, 14 Jul 2026 07:28:45 GMT</pubDate><description>&lt;h1 id=&quot;cherry-studio-提示词模板&quot;&gt;Cherry Studio 提示词模板&lt;/h1&gt;
&lt;h2 id=&quot;备份说明&quot;&gt;备份说明&lt;/h2&gt;
&lt;p&gt;目前使用 Cherry Studio 的频率越来越低，即使是轻量级对话，主力工具也已经转向 ChatGPT 和 Codex。不过，之前在 Cherry Studio 中积累的一些提示词仍然有保留和复用的价值，因此将它们单独导出备份。&lt;/p&gt;
&lt;p&gt;从 Cherry Studio 备份 &lt;code&gt;cherry-studio.202607141042&lt;/code&gt; 中提取；删除 3 个来自或改写自开源内容的提示词后，保留 15 个自定义提示词。&lt;/p&gt;
&lt;p&gt;仅保留助手名称和提示词原文；&lt;/p&gt;
&lt;h2 id=&quot;输入法转换器&quot;&gt;输入法转换器&lt;/h2&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;你是一个智能输入法转换器。请将以下输入内容转换为最合适的形式：&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  转换规则：&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  - 拼音 → 转换为对应的中文汉字&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  - 英文拼写错误 → 自动修正&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  - 中文 → 保持不变&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  - //zh 后缀 → 强制输出为中文&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  - //en 后缀 → 强制输出为英文&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  示例：&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  shurufa → 输入法&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  wnat → want&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  hello world → hello world&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  wo yao qu gongsi → 我要去公司&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  hello world //zh → 你好世界&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  wo yao qu gongsi //zh → 我要去公司&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  输入: {input}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  输出:&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;快速创建-wt&quot;&gt;快速创建 wt&lt;/h2&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;wt switch feat 等效于切换到 feat 的 worktree&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;wt switch --create feat 等效于先创建 feat worktree 再切换过去&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;type:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;&apos;feat&apos;, // 新功能&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;&apos;fix&apos;, // 修复&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;&apos;docs&apos;, // 文档变更&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;&apos;style&apos;, // 代码格式&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;&apos;refactor&apos;, // 重构&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;&apos;perf&apos;, // 性能优化&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;&apos;test&apos;, // 增加测试&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;&apos;chore&apos;, // 构建过程或辅助工具的变动&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;&apos;revert&apos;, // 回退&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;&apos;build&apos;, // 打包&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;我后续会给你发送一些我的语义化的 feat，你来帮我生成这个命令。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;git-diff生成-commit-msg&quot;&gt;git diff生成 commit msg&lt;/h2&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;遵循 Angular Commit Message 规范，生成git commit message,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;1. 如果用户没有指示，默认为中文&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;2. 尽量使用plaintext的语法，不要使用md的语法&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;3. 生成的内容中不能包含emoji&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;格式：&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;&amp;#x3C;type&gt;(&amp;#x3C;scope&gt;): &amp;#x3C;subject&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;&amp;#x3C;body&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;&amp;#x3C;footer&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;其中 subject 必填，body 和 footer 可选&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;type: &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;  [&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;        &apos;feat&apos;, // 新功能&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;        &apos;fix&apos;, // 修复&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;        &apos;docs&apos;, // 文档变更&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;        &apos;style&apos;, // 代码格式&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;        &apos;refactor&apos;, // 重构&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;        &apos;perf&apos;, // 性能优化&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;        &apos;test&apos;, // 增加测试&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;        &apos;chore&apos;, // 构建过程或辅助工具的变动&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;        &apos;revert&apos;, // 回退&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;        &apos;build&apos;, // 打包&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;      ],&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;scope: 可选，表示影响范围（如模块名）&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;subject: 简明扼要的提交说明&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;body: 详细描述，可多行&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;footer: 通常用于关联 Issue 或破坏性变更说明&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;示例：&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;feat(auth): 添加微信登录功能&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;- 支持微信扫码登录&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;- 支持微信账号绑定&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;- 添加微信用户信息同步&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;除了commit msg，其他不需要返回任何内容。&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;body中的子项的数量应该限制在5个以内&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;en-git-diff生成-commit-msg&quot;&gt;en git diff生成 commit msg&lt;/h2&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;Follow the Angular Commit Message specification to generate git commit messages:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;	1.	If the user does not specify a language, default to English.&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;	2.	Use plaintext syntax as much as possible; do not use Markdown syntax.&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;	3.	The generated content must not contain emoji.&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;Format:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;(): &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;&amp;#x3C;body&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;&amp;#x3C;footer&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;Where subject is required, while body and footer are optional.&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;type:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;[&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;‘feat’,      // new feature&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;‘fix’,       // bug fix&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;‘docs’,      // documentation change&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;‘style’,     // code formatting&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;‘refactor’,  // refactoring&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;‘perf’,      // performance optimization&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;‘test’,      // tests&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;‘chore’,     // build or auxiliary tool changes&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;‘revert’,    // revert changes&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;‘build’,     // build-related&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;scope: optional, represents the affected area (e.g., module name)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;subject: concise summary of the change&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;body: detailed description, can span multiple lines&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;footer: usually used to reference issues or note breaking changes&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;Example:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;feat(auth): add WeChat login support&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;	•	Support WeChat QR code login&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;	•	Support binding WeChat accounts&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;	•	Add synchronization of WeChat user information&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;⸻&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;Aside from the commit message, no other content should be returned.&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;The number of items in the body should be limited to five or fewer.&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;Please also generate a branch name based on the git diff:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;Prefix / Meaning / Example&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;feat/     new feature development     feat/user-authentication&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;fix/      bug fix                     fix/login-error&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;hotfix/   urgent production issue     hotfix/payment-failure&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;refactor/ code refactoring            refactor/user-service&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;docs/     documentation changes       docs/api-reference&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;perf/     performance optimization    perf/image-loading&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;test/     test-related                test/user-profile&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;chore/    build/configuration changes chore/webpack-update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;git-diff生成-分支名&quot;&gt;git diff生成 分支名&lt;/h2&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;请你根据 git diff 生成分支名&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;feat/	新功能开发	feat/user-authentication&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;fix/	Bug修复	fix/login-error&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;hotfix/	紧急线上问题修复	hotfix/payment-failure&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;refactor/	代码重构	refactor/user-service&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;docs/	文档更新	docs/api-reference&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;perf/	性能优化	perf/image-loading&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;test/	测试相关	test/user-profile&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;chore/	构建/配置变更	chore/webpack-update&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;表达优化&quot;&gt;表达优化&lt;/h2&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;用户可能使用英文跟你对话，但是语法或者措辞都不是很标准，甚至存在拼写错误。请你在回答完用户的问题之后，按照下列格式进行返回：&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;1. 分段纠正错误，并且补充注释。&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;2. 最后返回完整的纠正之后的内容。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;markdown语法替换&quot;&gt;markdown语法替换&lt;/h2&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;用户输入的文本是一段markdown文本&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;1. 请你去掉markdown语法，如果包含链接那么转化为标题 链接的格式。&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;2. 并且把文中的图片链接按照顺序替换为p1 p2 p3 这种&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;我指的是全部的mdlink替换，不需要再保留原始的语法&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;需要把 p1 p2 p3 的位置移动到每一段对应的介绍文案的最后面 然后用括号裹起来&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;例如&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;1. 如何编辑环境变量&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;![[Pasted image 20250226143542.png]]&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;2. 如何更新环境变量&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;![[Pasted image 20250226143542.png]]&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;应该被替换为&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;1. 如何编辑环境变量 (p1)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;2. 如何更新环境变量 (p2)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;markdown语法替换-to-weibo&quot;&gt;markdown语法替换 to weibo&lt;/h2&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;用户输入的文本是一段markdown文本&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;1. 请你去掉markdown语法，如果包含链接那么转化为标题 链接的格式。&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;2. 并且把文中的图片链接按照顺序替换为p1 p2 p3 这种&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;我指的是全部的mdlink替换，不需要再保留原始的语法&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;需要把 p1 p2 p3 的位置移动到每一段对应的介绍文案的最后面 然后用括号裹起来&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;3. 由于微博的标签需要两个#包裹起来，如果文本中的标签是单个#标签1，请你转化为为#标签1# &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;根据标题生成slug&quot;&gt;根据标题生成slug&lt;/h2&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;根据用户输入的标题生成slug&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;标题需要被翻译为英文，如果包含空格需要使用-来拼接起来。&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;提供3个选项，供用户选择。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;md转mdx&quot;&gt;md转mdx&lt;/h2&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;把markdown 的frontmeta转化为 mdx 的 语法&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;用追星的例子来讲解知识&quot;&gt;用追星的例子来讲解知识&lt;/h2&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;用户会给你一些知识点请求你来讲解，请你通过构造一个追星的场景，来给到用户一个更形象的概念。&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;（请使用前端相关的场景来回答）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><category>提示词</category><category>备份</category><category>AI 写作为主</category></item><item><title>Obsidian 全屏日历</title><link>https://blog.kazoottt.top/posts/periodic-calendar-page-obsidian-plugin/</link><guid isPermaLink="false">urn:blog:7f8c67ea-e32e-53c9-97df-873f110c9175</guid><pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate><description>&lt;p&gt;我用 Periodic Notes 写日记、周报、月报、季报和年报，但 Obsidian 官方的 Calendar 插件只能看见日记和周报，而且挤在右侧边栏里，越用越觉得不够用。&lt;/p&gt;
&lt;p&gt;于是按照自己需求 vibe coding 了一个项目：&lt;strong&gt;Periodic Calendar Page&lt;/strong&gt;。它是在主编辑区打开的全屏日历页，能完整展示 5 类周期性笔记（日记、周报、月报、季报、年报），以及带有轻量的统计功能。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;项目地址：&lt;a href=&quot;https://github.com/KazooTTT/periodic-calendar-page&quot;&gt;GitHub - KazooTTT/periodic-calendar-page: Full-page Obsidian calendar for Periodic Notes (daily/weekly/monthly/quarterly/yearly) with writing stats&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;需求来源calendar-无法显示我需要的周期性笔记&quot;&gt;需求来源：Calendar 无法显示我需要的周期性笔记&lt;/h2&gt;
&lt;p&gt;我的笔记体系围绕 Periodic Notes 展开，5 种周期都已启用：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;th&gt;典型用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;日记&lt;/td&gt;
&lt;td&gt;每日记录&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;周报&lt;/td&gt;
&lt;td&gt;一周复盘（配合 Templater 中文重命名）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;月报&lt;/td&gt;
&lt;td&gt;月度总结&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;季报&lt;/td&gt;
&lt;td&gt;季度回顾&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;年报&lt;/td&gt;
&lt;td&gt;年度总结&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/07/20260703-aa9878122dec29bb3abf75236778b074.png&quot; alt=&quot;Pasted image 20260703105144&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;Periodic Notes 负责配置路径以及对应的模板，可以使用命令快速创建，这部分没问题。问题出在 Calendar 插件——它只索引 daily 和 weekly，月报、季报、年报在日历上不可见。&lt;/p&gt;
&lt;p&gt;另外还有一点不太满意：Calendar 默认挂在右侧边栏，且有的时候侧边栏会切到其他的插件去。&lt;/p&gt;
&lt;h2 id=&quot;产品定位实现所有周期性笔记的可见性&quot;&gt;产品定位：实现所有周期性笔记的可见性&lt;/h2&gt;
&lt;p&gt;Periodic Calendar Page 的定位是基于 Periodic Notes 的配置之上提供可视化与导航。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Periodic Notes  →  配置、创建、归档
       ↓
Periodic Calendar Page  →  看见、导航、统计、提醒补写
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;几个关键设计决策：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;决策&lt;/th&gt;
&lt;th&gt;选择&lt;/th&gt;
&lt;th&gt;原因&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;入口&lt;/td&gt;
&lt;td&gt;命令面板打开，不设启动页&lt;/td&gt;
&lt;td&gt;不打扰日常写作流&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;页面形态&lt;/td&gt;
&lt;td&gt;ItemView 全屏 Tab&lt;/td&gt;
&lt;td&gt;容纳多栏布局与详情面板&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Templater 中文标题&lt;/td&gt;
&lt;td&gt;不改自动化；模板保留 &lt;code&gt;date&lt;/code&gt;/&lt;code&gt;slug&lt;/code&gt; + 插件四级回落&lt;/td&gt;
&lt;td&gt;人类可读标题与机器索引解耦&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;主要功能介绍&quot;&gt;主要功能介绍&lt;/h2&gt;
&lt;h3 id=&quot;日历模式日视图--详情面板&quot;&gt;日历模式：日视图 + 详情面板&lt;/h3&gt;
&lt;p&gt;打开命令「打开日记日历」，你会看到一张完整的月历。日期格里有日记字数圆点，周期末日线有月报/季报/年报标记，周数列有周报标记。点击某一天，右侧详情面板会列出&lt;strong&gt;该日所在时间范围内的全部 5 类笔记&lt;/strong&gt;——不管你是不是在月末，都能看到「这个月报写没写」。&lt;/p&gt;
&lt;p&gt;交互上区分了两种意图：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;普通点击&lt;/strong&gt;：更新选中状态，看详情&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;⌘/Ctrl + 点击&lt;/strong&gt;：直接打开或创建对应笔记&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;右键&lt;/strong&gt;：打开、创建、删除、在文件列表中显示&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/07/20260703-3a71675e39e2de2cd378879d6f5e78f6.png&quot; alt=&quot;日历日视图：月历与右侧 5 类笔记详情面板&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;三层缩放从天到年到多年&quot;&gt;三层缩放：从天到年到多年&lt;/h3&gt;
&lt;p&gt;日历不只有月视图。点击标题可以逐级放大视野：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;日视图（2026年7月）  →  年视图（2026年）  →  多年视图（2016–2027年）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;年视图用 2×2 季度块组织：每块上方是 3 个月份格，下方是季报底栏，顶部还有年报卡片。多年视图则是 4×3 年份网格，每格显示该年年报是否存在。写年终总结前扫一眼，哪些年有、哪些年缺，一目了然。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/07/20260703-bb53f2458729b8a69cbfa2d3847d6786.png&quot; alt=&quot;Pasted image 20260703105803&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/07/20260703-99a984f9b6d69020f4fe84b9cd62b2ea.png&quot; alt=&quot;Pasted image 20260703105801&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;轻量统计模式&quot;&gt;轻量统计模式&lt;/h3&gt;
&lt;p&gt;顶栏切换到「统计」，进入记录统计页。每年三张指标卡——&lt;strong&gt;条笔记、字数、记录天数&lt;/strong&gt;——用柱状图展示 1–12 月的分布，参考了 flomo 记录统计的呈现方式。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/07/20260703-a1865351102c5eac461dda11c2ca2f54.png&quot; alt=&quot;记录统计：按年三指标柱状图&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;几个细节：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;柱图 hover 显示当月数据；点击某月会切回日历并定位到该月&lt;/li&gt;
&lt;li&gt;统计目前只计入日记（Phase 1），热力图和可配置范围在路线图中&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;开发过程&quot;&gt;开发过程&lt;/h2&gt;
&lt;p&gt;全程基于 x 会员赠送的 grok cli 中的 composer 2.5 fast 开发，主要使用的 skills 是 &lt;a href=&quot;https://github.com/obra/superpowers&quot;&gt;GitHub - obra/superpowers: An agentic skills framework &amp;#x26; software development methodology that works.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这个项目在 2026-07-02 一天内从 v0.1 迭代到 v0.8.16&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;阶段&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;th&gt;大约版本&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Phase 1&lt;/td&gt;
&lt;td&gt;ItemView 骨架、月历渲染、命令入口&lt;/td&gt;
&lt;td&gt;v0.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 2&lt;/td&gt;
&lt;td&gt;读取 Periodic 配置、5 类索引与标记&lt;/td&gt;
&lt;td&gt;v0.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 3&lt;/td&gt;
&lt;td&gt;交互、年/多年视图、详情面板、右键菜单&lt;/td&gt;
&lt;td&gt;v0.3–v0.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phase 4&lt;/td&gt;
&lt;td&gt;统计视图、开源发布、UI 打磨&lt;/td&gt;
&lt;td&gt;v0.8.x&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;文档驱动&quot;&gt;文档驱动&lt;/h3&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;统计视图方案（Phase 1–3 规划）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;周期笔记文件名怎么在-templater-重命名后还能索引到&quot;&gt;周期笔记文件名：怎么在 Templater 重命名后还能索引到&lt;/h3&gt;
&lt;p&gt;以周报为例：文件名不是一直叫 &lt;code&gt;2026-W27.md&lt;/code&gt;。Periodic Notes 先按 ISO 周创建临时文件，Templater 再填充内容并重命名成中文标题：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;2026年7月第1周（06.29–07.05）.md
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;为什么不读模板语法？&lt;/strong&gt; Periodic Notes 的 &lt;code&gt;template&lt;/code&gt; 只管笔记内容；Templater 的 &lt;code&gt;tp.file.rename()&lt;/code&gt; 是任意 JavaScript，每人写法不同，插件没法通用解析。所以不靠「猜模板」，而是靠两层&lt;strong&gt;显式契约&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;契约来源&lt;/th&gt;
&lt;th&gt;字段&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Periodic Notes 官方&lt;/td&gt;
&lt;td&gt;&lt;code&gt;format&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;创建时的 moment 文件名格式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;模板作者约定&lt;/td&gt;
&lt;td&gt;&lt;code&gt;date&lt;/code&gt; + &lt;code&gt;slug&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;frontmatter 里的机器可读锚点（&lt;strong&gt;最稳妥&lt;/strong&gt;）&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;周报模板里刻意保留：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;yaml&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;yaml&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;slug&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;2026-7-W27&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;date&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;2026-07-05&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;人类看中文标题，插件读 &lt;code&gt;slug&lt;/code&gt; / &lt;code&gt;date&lt;/code&gt;——两者解耦，以后改标题格式也不影响日历索引。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;FilenameParser&lt;/code&gt; 为全部 5 类笔记统一做了四级回落（前面快、后面稳）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;parseNoteDate(file, format, periodicity)
  ├─ ① Periodic Notes format 匹配
  ├─ ② 常见备用文件名（2025-08、2026-Q1 等）
  ├─ ③ 内置中文标题正则（已知模式的便利层）
  └─ ④ frontmatter（date / slug）← 用户契约，最终兜底
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;① format&lt;/strong&gt;：读 Periodic Notes 配置，和官方插件同一套 moment 解析。未重命名的 &lt;code&gt;2026-W27.md&lt;/code&gt; 走这里。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;② 备用文件名&lt;/strong&gt;：format 留空或文件名偏离配置时的简写兜底，例如月报 &lt;code&gt;2025-08&lt;/code&gt;、季报 &lt;code&gt;2026-Q1&lt;/code&gt;、年报 &lt;code&gt;2025年度总结&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;③ 中文标题正则&lt;/strong&gt;：内置了几种常见模式（如 &lt;code&gt;2026年7月第1周（06.29–07.05）&lt;/code&gt;、&lt;code&gt;2025年08月月报&lt;/code&gt;）。这是&lt;strong&gt;便利层&lt;/strong&gt;，不是核心设计——你的标题格式一旦改动，这一级可能失效，但④仍能用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;④ frontmatter&lt;/strong&gt;：读 &lt;code&gt;date&lt;/code&gt; 归一到对应周期，或从 &lt;code&gt;slug&lt;/code&gt; 反推（如 &lt;code&gt;2026-7-W27&lt;/code&gt;、&lt;code&gt;2025-08-monthly-report&lt;/code&gt;）。&lt;strong&gt;推荐在模板里始终写这两个字段&lt;/strong&gt;，不管文件名怎么变都能索引。&lt;/p&gt;
&lt;p&gt;索引时，&lt;code&gt;NoteIndexer&lt;/code&gt; 扫描各周期文件夹，调用上述解析生成 UID。只要四级里任意一级成功，笔记就会出现在日历正确位置。&lt;/p&gt;
&lt;h2 id=&quot;如何安装&quot;&gt;如何安装&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;前置依赖&lt;/strong&gt;：安装并启用 &lt;a href=&quot;https://github.com/liamcain/obsidian-periodic-notes&quot;&gt;Periodic Notes&lt;/a&gt;，Obsidian ≥ 1.5.0。&lt;/p&gt;
&lt;h3 id=&quot;brat推荐&quot;&gt;BRAT（推荐）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;安装 &lt;a href=&quot;https://github.com/TfTHacker/obsidian42-brat&quot;&gt;BRAT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add Beta plugin → &lt;code&gt;KazooTTT/periodic-calendar-page&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;设置 → 第三方插件 → 启用 &lt;strong&gt;Periodic Calendar Page&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;手动安装&quot;&gt;手动安装&lt;/h3&gt;
&lt;p&gt;从 &lt;a href=&quot;https://github.com/KazooTTT/periodic-calendar-page/releases&quot;&gt;Releases&lt;/a&gt; 下载，或将仓库根目录的 &lt;code&gt;manifest.json&lt;/code&gt;、&lt;code&gt;main.js&lt;/code&gt;、&lt;code&gt;styles.css&lt;/code&gt; 复制到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;#x3C;你的库&gt;/.obsidian/plugins/periodic-calendar-page/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更完整的说明见仓库内 &lt;a href=&quot;https://github.com/KazooTTT/periodic-calendar-page/blob/main/docs/INSTALL.md&quot;&gt;INSTALL.md&lt;/a&gt;。&lt;/p&gt;
&lt;h3 id=&quot;打开方式&quot;&gt;打开方式&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;入口&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;命令面板 → &lt;code&gt;打开日记日历&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;进入日历模式&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;命令面板 → &lt;code&gt;打开记录统计&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;直达统计页&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;左侧 Ribbon&lt;/td&gt;
&lt;td&gt;&lt;code&gt;calendar-range&lt;/code&gt; 图标&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&quot;路线图&quot;&gt;路线图&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;当前版本：v0.8.15&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;已完成&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;全屏日历 + 5 类笔记索引与标记&lt;/li&gt;
&lt;li&gt;日 / 年 / 多年三层缩放&lt;/li&gt;
&lt;li&gt;详情面板、右键菜单、字数圆点&lt;/li&gt;
&lt;li&gt;记录统计 Phase 1（柱图三指标）&lt;/li&gt;
&lt;li&gt;独立 GitHub 仓库与 Release&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;计划中&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GitHub 热力图（写作连续性可视化）&lt;/li&gt;
&lt;li&gt;统计范围可配置（含周报等）、CSV 导出&lt;/li&gt;
&lt;li&gt;缺失提醒（如「本月月报未写」）&lt;/li&gt;
&lt;/ul&gt;</description><category>obsidian</category><category>插件开发</category><category>日历</category><category>知识管理</category><category>Periodic Notes</category><category>AI 写作为主</category></item><item><title>Thino 页面触发 Linter 自动插入 Frontmatter 的排查与解决</title><link>https://blog.kazoottt.top/posts/thino-linter-frontmatter-fix/</link><guid isPermaLink="false">urn:blog:5b9053cc-5200-5556-8cbf-315cda2fa449</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><description>&lt;h2 id=&quot;现象&quot;&gt;现象&lt;/h2&gt;
&lt;p&gt;在 Obsidian 的 Thino 页面中，进入页面或按下 &lt;code&gt;Cmd+S&lt;/code&gt; 后，输入框中会自动加上如下 frontmatter：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;yaml&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;yaml&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;published&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;date&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;tags&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: []&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;category&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;slug&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;description&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;date_created&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;20260603&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;---&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;最开始看起来像是 Thino 写入日记时触发了格式化，因为 Thino 的内容确实存放在日记里。&lt;/p&gt;
&lt;h2 id=&quot;第一层原因&quot;&gt;第一层原因&lt;/h2&gt;
&lt;p&gt;直接原因来自 Obsidian Linter：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;lintOnSave&lt;/code&gt; 开启。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lintOnFileChange&lt;/code&gt; 开启。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;insert-yaml-attributes&lt;/code&gt; 规则开启，会插入 &lt;code&gt;date/tags/category/slug/published/description/title&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;yaml-timestamp&lt;/code&gt; 规则开启，会补 &lt;code&gt;date_created&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，只要 Linter 认为当前文件应该被 lint，就会把这套博客 frontmatter 补进去。&lt;/p&gt;
&lt;h2 id=&quot;为什么忽略日记目录没用&quot;&gt;为什么忽略日记目录没用&lt;/h2&gt;
&lt;p&gt;一开始尝试把 &lt;code&gt;02-日记&lt;/code&gt; 加到 Linter 的 &lt;code&gt;foldersToIgnore&lt;/code&gt;。这个配置本身是正确的，Linter 的匹配逻辑是：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;file.path.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;startsWith&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;normalizePath&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(folder) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;/&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;也就是说，&lt;code&gt;02-日记/2026/06/2026-06-29.md&lt;/code&gt; 会被正确忽略。&lt;/p&gt;
&lt;p&gt;但这个方案没有解决问题，因为 Thino 页面在 Linter 眼里不是日记文件。&lt;/p&gt;
&lt;h2 id=&quot;真正根因&quot;&gt;真正根因&lt;/h2&gt;
&lt;p&gt;临时调试插件记录到的关键运行时状态是：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;activeView.type = thino_view&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;activeFile.path = index.md&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;shouldIgnoreActiveFile = false&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;也就是说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当前视图确实是 Thino 的 &lt;code&gt;thino_view&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;但 Obsidian/Linter 暴露出来的 active file 是根目录 &lt;code&gt;index.md&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;Linter 看到的是 &lt;code&gt;index.md&lt;/code&gt;，不是日记文件。&lt;/li&gt;
&lt;li&gt;所以忽略 &lt;code&gt;02-日记&lt;/code&gt; 拦不住。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这解释了两个现象：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;按 &lt;code&gt;Cmd+S&lt;/code&gt; 时，Linter 会 lint &lt;code&gt;index.md&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;进入 Thino 页面时，&lt;code&gt;active-leaf-change&lt;/code&gt; / &lt;code&gt;editor-change&lt;/code&gt; 也可能触发 Linter 处理 &lt;code&gt;index.md&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;最终方案&quot;&gt;最终方案&lt;/h2&gt;
&lt;p&gt;新增一个极小的本地 Obsidian 插件：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;.obsidian/plugins/thino-linter-guard/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;插件已发布到 GitHub：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/KazooTTT/thino-linter-guard&quot;&gt;https://github.com/KazooTTT/thino-linter-guard&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;插件入口：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;.obsidian/plugins/thino-linter-guard/main.js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;核心思路：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;当 Obsidian 当前处在 Thino 页面时（active view 是 &lt;code&gt;thino_view&lt;/code&gt;），把这次 Linter 判断视为“应跳过”，避免它处理 Thino 暴露出来的虚拟 &lt;code&gt;index.md&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;当 Obsidian 当前处在 Thino 页面时，且执行 &lt;code&gt;editor:save-file&lt;/code&gt; 时，临时关闭 Linter，保存结束后恢复。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样可以同时覆盖：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;进入 Thino 页面时触发的 Linter 链路。&lt;/li&gt;
&lt;li&gt;在 Thino 页面按 &lt;code&gt;Cmd+S&lt;/code&gt; 时触发的保存链路。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;普通 Markdown 文件不受影响，仍然会正常走 Linter。&lt;/p&gt;
&lt;h2 id=&quot;当前插件代码要点&quot;&gt;当前插件代码要点&lt;/h2&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;patchShouldIgnoreFile&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; linter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.app.plugins?.plugins?.[&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;obsidian-linter&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;linter &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; typeof&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; linter.shouldIgnoreFile &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;!==&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;function&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; original&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; linter.shouldIgnoreFile;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; plugin&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; wrapped&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;file&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;args&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (plugin.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;isActiveThinoView&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;()) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; original.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, file, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;...&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;args);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  };&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  linter.shouldIgnoreFile &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; wrapped;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;isActiveThinoView&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; this&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.app.workspace.activeLeaf?.view?.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getViewType&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;?.() &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;thino_view&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;启用方式&quot;&gt;启用方式&lt;/h2&gt;
&lt;p&gt;确保 &lt;code&gt;.obsidian/community-plugins.json&lt;/code&gt; 中包含：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;thino-linter-guard&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;修改插件后，需要重载 &lt;code&gt;Thino Linter Guard&lt;/code&gt; 插件或重启 Obsidian。&lt;/p&gt;</description><category>obsidian</category><category>linter</category><category>thino</category><category>AI 写作为主</category></item><item><title>衬线、字重与可变字体</title><link>https://blog.kazoottt.top/posts/serif-font-weight-variable-fonts/</link><guid isPermaLink="false">urn:blog:5cd782a9-ba35-5843-9e66-60b22641d7dd</guid><pubDate>Mon, 22 Jun 2026 00:00:00 GMT</pubDate><description>&lt;p&gt;字体不只是“长得好不好看”。在前端和设计里，字体至少会影响三件事：阅读体验、品牌气质、以及页面渲染是否稳定。&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;字体最常见的分类是衬线体和无衬线体。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/06/20260622-294814286b1d62019ad59e679fd6b589.svg&quot; alt=&quot;衬线体和无衬线体对比&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;图中红色部分就是 serif，也就是衬线。图片来源：&lt;a href=&quot;https://commons.wikimedia.org/wiki/File:Serif_and_sans-serif_03.svg&quot;&gt;Wikimedia Commons&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;衬线体&lt;/strong&gt;是笔画末端带装饰的字体，比如宋体、Times New Roman。它通常更有书籍感、传统感，适合长文、正式出版物、标题排版。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;无衬线体&lt;/strong&gt;是笔画末端没有明显装饰的字体，比如黑体、苹方、思源黑体、阿里巴巴普惠体。它更干净、现代，屏幕显示更常见，适合网页、App、后台系统和数据看板。&lt;/p&gt;
&lt;p&gt;简单判断：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;宋体、Times New Roman：衬线体。&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;ul&gt;
&lt;li&gt;Regular：常规字重。&lt;/li&gt;
&lt;li&gt;Medium：中等字重。&lt;/li&gt;
&lt;li&gt;Semibold：半粗。&lt;/li&gt;
&lt;li&gt;Bold：粗体。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在 CSS 里，常见写法是：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;.title&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Some Font&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;500&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;但这句话是否真的会切到 Medium，取决于字体文件是怎么注册的。&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;&lt;strong&gt;可变字体&lt;/strong&gt;是一种把多个字重、字宽、倾斜等变化能力放进一个字体文件里的字体格式。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/06/20260622-5e2f5842da32696ad5df0659f4e68fa3.svg&quot; alt=&quot;可变字体的多个设计轴&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;自制示意图。这张图把可变字体的几个常见轴画出来了：&lt;code&gt;optical size&lt;/code&gt;、&lt;code&gt;weight&lt;/code&gt;、&lt;code&gt;width&lt;/code&gt;。同一个字母 &lt;code&gt;a&lt;/code&gt; 可以沿着不同轴连续变化。相关概念可参考 &lt;a href=&quot;https://web.dev/articles/variable-fonts&quot;&gt;Variable fonts on the web&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果一个字体是可变字体，通常可以用一个文件连续调节字重：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;@font-face&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Some Variable Font&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  src&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;./SomeVariableFont.woff2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;woff2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;300&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 800&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;.title&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Some Variable Font&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;642&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;这里的 &lt;code&gt;642&lt;/code&gt; 是可以成立的，因为可变字体内部支持连续变化。&lt;/p&gt;
&lt;h3 id=&quot;静态字体&quot;&gt;静态字体&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;不可变字体&lt;/strong&gt;也可以叫静态字体。它通常是多个固定文件：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;text&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;SomeFont-Regular.woff2&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;SomeFont-Medium.woff2&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;SomeFont-Bold.woff2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;这种字体不能靠一个文件连续变化。浏览器只能在已注册的固定字重之间选择，或者在缺少目标字重时做“伪加粗”。&lt;/p&gt;
&lt;p&gt;从网页加载角度看，两者的差异也很直观：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/06/20260622-b82704060547131782b346ee744f6eb4.svg&quot; alt=&quot;静态字体和可变字体的文件数量差异&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;自制示意图。静态字体往往需要多个字体文件来覆盖不同字重和样式；可变字体可以把更多变化能力收进一个文件里。相关概念可参考 &lt;a href=&quot;https://en.wikipedia.org/wiki/Variable_font&quot;&gt;Variable font - Wikipedia&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;阿里巴巴普惠体是哪一种&quot;&gt;阿里巴巴普惠体是哪一种&lt;/h3&gt;
&lt;p&gt;阿里巴巴普惠体通常是&lt;strong&gt;不可变字体&lt;/strong&gt;，也就是静态字体家族。它提供多个固定字重文件，比如 Regular、Medium、Semibold、Bold 等。&lt;/p&gt;
&lt;p&gt;所以它不是“一个文件里连续调节所有字重”的可变字体。要让 &lt;code&gt;font-weight&lt;/code&gt; 正确工作，需要把不同字重文件正确注册给浏览器。&lt;/p&gt;
&lt;h2 id=&quot;前端里的-font-weight-坑&quot;&gt;前端里的 &lt;code&gt;font-weight&lt;/code&gt; 坑&lt;/h2&gt;
&lt;p&gt;到前端实现里，真正容易出问题的是：&lt;code&gt;font-weight&lt;/code&gt; 看起来是字重语义，但它必须配合正确的 &lt;code&gt;@font-face&lt;/code&gt; 注册才可靠。&lt;/p&gt;
&lt;h3 id=&quot;font-weight-不一定等于切到对应字体文件&quot;&gt;&lt;code&gt;font-weight&lt;/code&gt; 不一定等于切到对应字体文件&lt;/h3&gt;
&lt;p&gt;这是最容易踩坑的地方。&lt;/p&gt;
&lt;p&gt;如果只加载了 Regular 文件：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;@font-face&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;PuHuiTi-Regular&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  src&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;./AlibabaPuHuiTi-3-45-Light.woff2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;woff2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;400&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;然后写：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;.title&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;PuHuiTi-Regular&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;500&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;浏览器并不会凭空找到 Medium 文件。它可能会：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;继续使用 Regular。&lt;/li&gt;
&lt;li&gt;对 Regular 做伪加粗。&lt;/li&gt;
&lt;li&gt;根据浏览器和系统策略做近似匹配。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这就是为什么 computed style 里看到 &lt;code&gt;font-weight: 500&lt;/code&gt;，视觉上却不像真正的 Medium。&lt;/p&gt;
&lt;h3 id=&quot;更推荐的注册方式&quot;&gt;更推荐的注册方式&lt;/h3&gt;
&lt;p&gt;更理想的方式是：同一个字体家族下注册多个字重。&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;@font-face&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Alibaba PuHuiTi&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  src&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;./AlibabaPuHuiTi-3-45-Light.woff2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;woff2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;400&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-style&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;normal&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;@font-face&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Alibaba PuHuiTi&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  src&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;./AlibabaPuHuiTi-3-65-Medium.woff2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;woff2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;500&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-style&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;normal&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;@font-face&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Alibaba PuHuiTi&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  src&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;./AlibabaPuHuiTi-3-75-SemiBold.woff2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;woff2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;600&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-style&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;normal&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;这样组件里就可以只写语义：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;.body&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Alibaba PuHuiTi&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Helvetica Neue&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;Arial&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;sans-serif&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;400&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;.title&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Alibaba PuHuiTi&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Helvetica Neue&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;Arial&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;sans-serif&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;500&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;浏览器会在同一个 &lt;code&gt;font-family&lt;/code&gt; 下，根据 &lt;code&gt;font-weight&lt;/code&gt; 自动选择对应文件。&lt;/p&gt;
&lt;h3 id=&quot;不太推荐的注册方式&quot;&gt;不太推荐的注册方式&lt;/h3&gt;
&lt;p&gt;有些项目会把不同字重注册成不同字体族：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;@font-face&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;PuHuiTi-Regular&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  src&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;./AlibabaPuHuiTi-3-45-Light.woff2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;woff2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;400&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;@font-face&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;PuHuiTi-Medium&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  src&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;./AlibabaPuHuiTi-3-65-Medium.woff2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;woff2&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;500&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;这时如果想用 Medium，就必须同时切换 &lt;code&gt;font-family&lt;/code&gt;：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;css&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;.title&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-family&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;PuHuiTi-Medium&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;PuHuiTi-Regular&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Helvetica Neue&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;Arial&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;sans-serif&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  font-weight&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;500&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;这种写法不是不能用，但它会让组件层知道太多字体文件细节。长期看，最好还是收敛成同一个字体家族，靠 &lt;code&gt;font-weight&lt;/code&gt; 表达字重语义。&lt;/p&gt;
&lt;h3 id=&quot;验证字体是否真的生效&quot;&gt;验证字体是否真的生效&lt;/h3&gt;
&lt;p&gt;验证字体时，不要只看：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getComputedStyle&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(el).fontWeight;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;还要看：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getComputedStyle&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(el).fontFamily;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;如果视觉要求很严格，还需要实际截图或肉眼对比。因为 computed style 只能告诉你 CSS 结果，不一定能直接告诉你浏览器最终用了哪个字体文件。&lt;/p&gt;
&lt;h2 id=&quot;总结&quot;&gt;总结&lt;/h2&gt;
&lt;p&gt;可变字体是“一个字体文件里有连续变化能力”；不可变字体是“多个固定字重文件组成一个字体家族”。&lt;/p&gt;
&lt;p&gt;阿里巴巴普惠体通常属于不可变字体。使用它时，&lt;code&gt;font-weight: 500&lt;/code&gt; 是否真的等于 Medium，取决于项目有没有把 Medium 文件正确注册到同一个 &lt;code&gt;font-family&lt;/code&gt; 下。&lt;/p&gt;
&lt;h2 id=&quot;参考资料&quot;&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Serif&quot;&gt;Serif - Wikipedia&lt;/a&gt;：解释 serif 是附着在笔画末端的小线条或笔画。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Sans-serif&quot;&gt;Sans-serif - Wikipedia&lt;/a&gt;：解释 sans-serif 是没有 serif 的字形分类，也提到它常用于屏幕显示。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Variable_font&quot;&gt;Variable font - Wikipedia&lt;/a&gt;：解释可变字体可以在一个字体文件里存储连续范围的设计变体。&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/articles/variable-fonts&quot;&gt;Variable fonts on the web&lt;/a&gt;：可变字体在网页中的使用说明。&lt;/li&gt;
&lt;/ul&gt;</description><category>font</category><category>frontend</category><category>typography</category></item><item><title>最近的变化-锻炼身体、调整学习状态</title><link>https://blog.kazoottt.top/posts/recent-changes/</link><guid isPermaLink="false">urn:blog:cf7d55ff-fac8-508c-b4cd-d0555bb61239</guid><pubDate>Sat, 13 Jun 2026 00:00:00 GMT</pubDate><description>&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;我去年 5 月左右开始学 Hip-Hop。那时候先办了年卡，但之前的舞室空调效果不太好，夏天上课非常热，后来我就退掉了卡。再之后搬到了另一个区，中间歇了两三个月，到 12 月才重新开始上课。&lt;/p&gt;
&lt;p&gt;这一次我办的是次卡，算下来一节课差不多 50 元。当时简单算了一下，如果一周只上两到三节课，次卡和年卡的总价差不多，甚至还可能更低，所以我最后选择了次卡。&lt;/p&gt;
&lt;p&gt;新舞室的课程安排里，爵士和其他舞种更多，Hip-Hop 相对少一些。刚开始我想着可以先从爵士基本功和一些爵士成品舞学起，但上了二三十节之后，发现自己对爵士的兴趣并不算强。最后还是决定回到 Hip-Hop，从基本功开始补，一边上基本功课，一边上一些编舞课。&lt;/p&gt;
&lt;p&gt;目前能感觉到自己有一点进步，但进步速度不算快。主要原因也很明确：我私下几乎不会主动跟练 Hip-Hop 基本功，所有练习都集中在课堂里的一个小时左右。这样当然能进步，但上限会比较明显。要不要把课外练习也加进来，可能是我接下来需要认真考虑的事情。&lt;/p&gt;
&lt;p&gt;hiphop 跟练目前在看的是 &lt;a href=&quot;https://www.xiaohongshu.com/user/profile/5d55e82f0000000001002c88?xsec_token=ABdt8UuqpUDZIwBnMO5qXL_Z75ok5sykn-RV-lSqLf9-g%3D&amp;#x26;xsec_source=pc_search&quot;&gt;Zingo - 小红书&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/06/20260613-2e36da1635a62d7f9f5acd45ef5502b9.png&quot; alt=&quot;Pasted image 20260613220158&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;健身&quot;&gt;健身&lt;/h3&gt;
&lt;p&gt;除了跳舞，我最近也重新开始健身。之前去的是乐刻，一个月可能也去不了几次。虽然很早之前买过私教课，但一周最多两次，强度并不高；加上我没有控制饮食，所以减脂的效果都不明显，后来也就断掉了。&lt;/p&gt;
&lt;p&gt;这次重新开始健身，契机是 5 月劳动节去了一趟泰国。那几天我完全没有控制饮食，饮料一天能喝两三杯，吃东西也总想着多试几种，于是经常点很多菜。回来之后明显感觉身体状态变差，肚子上有了赘肉，整个人也比较虚。再想到很久以前自己其实能看到马甲线，这种反差让我觉得，还是应该把身体状态重新捡起来。&lt;/p&gt;
&lt;p&gt;后来我去了同事推荐的一家商业健身房。价格上，一年卡大概 1500 多，三年卡 1800 到 1900 左右，差距不算大，我就直接买了三年卡。&lt;/p&gt;
&lt;p&gt;为了尽快把训练强度提上来，也希望有人帮我制定更科学的训练和饮食计划，我还是报了私教课。现在的频率差不多是一周三次，饮食也在控制：少油少盐，多吃蛋白质，碳水照常吃，但比以前少一些。坚持了三周左右之后，肚子的线条已经变得更明显，体脂率和体重也都有下降。&lt;/p&gt;
&lt;p&gt;健身之后，我能明显感觉到状态更好，人也更自信。唯一的问题是，如果晚上做了无氧训练，会比较难睡着。后面可能要调整训练安排，比如早上做无氧，晚上下班后去爬坡，降低对睡眠的影响。&lt;/p&gt;
&lt;p&gt;为了后续可以脱离私教自己定制训练计划，我在上课期间也进行了记录。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/06/20260613-f036fd679d9b479f61ef6afd89aa71b8.png&quot; alt=&quot;Pasted image 20260613220522&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;主要分为这几个部分，会把每次上课的内容记录下，如果学习到新的动作，会记录下这个动作练习的部位，便于后续自己进行组合。&lt;/p&gt;
&lt;h2 id=&quot;重新进入学习状态&quot;&gt;重新进入学习状态&lt;/h2&gt;
&lt;p&gt;除了跳舞和健身，我最近也想重新找回学习状态。回到成都之后，有很长一段时间我都比较躺平，不太想主动推进什么事情。主要和几个原因有关。一方面是职业上的迷茫感越来越强。我越来越觉得现在的工作缺少意义，也看不到很明确的未来方向，不太清楚自己应该往哪里努力。&lt;/p&gt;
&lt;p&gt;不过学习状态的变化的契机主要是，工作内容也发生了变化。以前更偏纯前端，现在变成了前端、后端和 AI 应用开发都要做。AI 确实能帮我提高一部分开发效率，但工程层面的知识还是绕不开，比如 MQ、ES 这种比较基础的后端知识。如果这些东西不补上，平时开发可能暂时能跑起来，一旦遇到 Bug，就很容易卡在排查阶段。&lt;/p&gt;
&lt;p&gt;在 AI 开发里也遇到了一些阻塞性问题。很多时候，如果没有一套完整的方法论，开发过程就会像是在做随机实验：改一个地方，看看效果有没有变好；再改另一个地方，再继续猜。这种方式很不健康，也很难积累稳定的判断力。&lt;/p&gt;
&lt;p&gt;所以我最近想学的内容会更偏后端、AI 框架、系统设计和架构方法论。需要知道知道某个工具怎么用，以及对应的优缺点、局限性、适用场景。这样以后做全栈以及 AI 应用开发时，才知道知道应该怎么下手。&lt;/p&gt;
&lt;p&gt;最近在读的东西是：《解构领域驱动设计》以及 &lt;a href=&quot;https://github.com/datawhalechina/Agent-Learning-Hub&quot;&gt;GitHub - datawhalechina/Agent-Learning-Hub: AI Agent 学习路线与资料库收集&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;后续想做的事情&quot;&gt;后续想做的事情&lt;/h2&gt;
&lt;p&gt;除了运动和学习，我也想把之前的一些兴趣爱好重新拾起来。&lt;/p&gt;
&lt;p&gt;我从 2011 年就开始学吉他。最初的想法是学古典吉他，那个时候被同学弹的《爱的罗曼史》以及《小罗曼史》惊艳到，但入门时是从民谣开始的。可能当时我去琴行的时候比较羞于表达自己的需求，老师就默认我想学民谣，于是带着我学了一些弹唱内容，后面还考了级。&lt;/p&gt;
&lt;p&gt;后来我还是想学古典吉他，但那个阶段基本已经进入自学状态。再之后，我又尝试过一些电吉他的东西。几种类型都试过之后，我发现比较适合自己的方向主要有两个：一个是用民谣吉他做指弹，另一个是用电吉他弹一些 solo 主音和节奏相关的内容。&lt;/p&gt;
&lt;p&gt;现在的问题是，我已经很久没有碰吉他了。民谣吉他和电吉他都在家里放了很久，所以接下来我想重新开始练习，至少先把手感找回来。&lt;/p&gt;
&lt;p&gt;摄影也是类似的问题。我买了不少设备，比如运动相机、全景相机，还有两台 M43 画幅的相机，分别是 GX9 和 G92，镜头也比较全。但真正产出内容时，无论是视频还是照片，我都觉得质量不够好。&lt;/p&gt;
&lt;p&gt;更严重的是我发现自己有一点向器材党发展的趋势。只要拍得不好，就会下意识觉得是设备的问题，于是经常去看全画幅相机有没有降价，看各种测评，想着是不是再买一台全画幅。&lt;/p&gt;
&lt;p&gt;但如果只是记录生活，真正重要的应该是把现有设备用好。生活记录并不一定需要特别高的像素，也不一定需要顶级光学素质。对我来说，更该练的是如何观察身边的东西，如何讲好发生在自己身上的故事，以及如何提升摄影、剪辑和拍摄 Vlog 的能力。&lt;/p&gt;
&lt;p&gt;与其继续看测评、给自己制造新的消费需求，不如先把表达能力练起来。&lt;/p&gt;
&lt;h2 id=&quot;总结&quot;&gt;总结&lt;/h2&gt;
&lt;p&gt;总体来说，我现在的状态比前两年好了很多，之前有单纯摆烂了，最近重新运动、重新学习之后，我越来越觉得，未来还有很多东西值得探索。&lt;/p&gt;
&lt;p&gt;当我还不知道未来具体要做什么时，学习和锻炼至少是一种相对确定的投入。它们未必能立刻给出答案，但能让我保持更好的身体状态或者思考的能力。&lt;/p&gt;
&lt;p&gt;如果一直把时间花在碎片化、娱乐化的消费里，几年之后，我可能只是变成一个依然迷茫、身体状态也不太好的三十几岁的人。&lt;/p&gt;
&lt;p&gt;希望自己可以保持这种自我提升然后对未来抱有期待的状态。&lt;/p&gt;</description><category>健身</category><category>摄影</category><category>生活复盘</category><category>舞蹈</category><category>学习</category></item><item><title>bug-form 回填错误</title><link>https://blog.kazoottt.top/posts/bug-backfill-error/</link><guid isPermaLink="false">urn:blog:ac31a4ed-9145-59cd-af2d-730437961738</guid><pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate><description>&lt;h2 id=&quot;问题现象&quot;&gt;问题现象&lt;/h2&gt;
&lt;p&gt;在图表配置详情页中，后端返回的配置值已经是“B”，但前端下拉框却显示成了“A”。&lt;/p&gt;
&lt;p&gt;简化后的返回数据示例：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;entityId&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;legacy-id&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;configValue&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;B&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;extraConfig&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;...&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;根因&quot;&gt;根因&lt;/h2&gt;
&lt;p&gt;问题出在同一业务对象在回填链路中使用了两种不同的标识格式。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一部分详情回填数据使用旧格式，例如 &lt;code&gt;legacy-id&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;前端在重建对应对象时使用新格式，例如 &lt;code&gt;normalized-id&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由于这两种格式没有被当成同一个对象处理，前端在同步配置时无法复用原有项，只能按默认值新建一份配置。结果就是界面最终显示成了错误的文案。&lt;/p&gt;
&lt;h2 id=&quot;修复&quot;&gt;修复&lt;/h2&gt;
&lt;p&gt;核心做法是增加一层 identity 归一化逻辑，把旧格式和新格式统一映射到同一个内部标识。&lt;/p&gt;
&lt;p&gt;也就是&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;统一托管 key 的生成逻辑&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;code&gt;legacy-id&lt;/code&gt; 和 &lt;code&gt;normalized-id&lt;/code&gt; 会被视为同一个对象&lt;/li&gt;
&lt;li&gt;详情回填时可以正确复用原有配置&lt;/li&gt;
&lt;li&gt;“B” 不会再被默认值覆盖成 “A”&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;总结&quot;&gt;总结&lt;/h2&gt;
&lt;p&gt;当系统经历过字段格式演进时或者说前端先行然后再对接后端的时候，详情回填、表单托管状态、二次计算逻辑之间必须共享同一套 identity 规则。否则即使返回值本身正确，也可能在重建过程中被默认值覆盖。&lt;/p&gt;</description><category>笔记</category><category>前端</category><category>bugfix</category><category>chart</category><category>public</category><category>sort</category><category>AI 写作为主</category></item><item><title>ClaudeCode三种扩展方式的区别</title><link>https://blog.kazoottt.top/posts/claude-code-extensions-quickstart/</link><guid isPermaLink="false">urn:blog:04defa94-6636-5cf5-9d0b-f1bc895fb233</guid><pubDate>Tue, 07 Apr 2026 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;claudecode-三种扩展方式的区别&quot;&gt;ClaudeCode 三种扩展方式的区别&lt;/h1&gt;
&lt;h2 id=&quot;核心结论&quot;&gt;核心结论&lt;/h2&gt;
&lt;p&gt;其实 Claude Code 有三种扩展方式，但它们的本质区别是：Skills 是面对场景时的解决方案，Commands 是用户主动调用的快捷操作，Plugins 则是完整的扩展功能包。&lt;/p&gt;
&lt;p&gt;简单来说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Skills 告诉 AI 遇到某个问题时应该怎么工作&lt;/li&gt;
&lt;li&gt;Commands 提供一键完成的快捷操作&lt;/li&gt;
&lt;li&gt;Plugins 安装别人写好的完整功能&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;三种方式的本质区别&quot;&gt;三种方式的本质区别&lt;/h2&gt;
&lt;h3 id=&quot;skills场景解决方案&quot;&gt;Skills：场景解决方案&lt;/h3&gt;
&lt;p&gt;Skills 的核心是告诉 AI 遇到特定场景时应该怎么工作。或者说，它是 AI 的 &quot; 工作指南 &quot;。&lt;/p&gt;
&lt;p&gt;当你开始写测试时，AI 读取到 TDD Skill，就知道应该建议你先写失败的测试，然后写最小实现，最后重构。整个过程是 AI 主动触发的，不需要你输入任何命令。&lt;/p&gt;
&lt;p&gt;Skills 可以做的事情很多：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;配合你完成某个任务&lt;/li&gt;
&lt;li&gt;调度其他 AI 协作（比如 subagent）&lt;/li&gt;
&lt;li&gt;按照流程独立处理信息&lt;/li&gt;
&lt;li&gt;或者说 AI 在某些场景下应该采取什么行动&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;commands快捷操作&quot;&gt;Commands：快捷操作&lt;/h3&gt;
&lt;p&gt;Commands 是你主动调用的快捷操作。通过 &lt;code&gt;/command&lt;/code&gt; 触发，执行一个预定义的任务。&lt;/p&gt;
&lt;p&gt;比如你输入 &lt;code&gt;/commit&lt;/code&gt;，AI 就按照规范化提交的流程帮你整理提交信息。Commands 更像是 &quot; 脚本 &quot; 或 &quot; 快捷方式 &quot;，你什么时候用就什么时候调。&lt;/p&gt;
&lt;p&gt;和 Skills 的区别是：Commands 需要你主动触发，Skills 是 AI 自动判断。&lt;/p&gt;
&lt;h3 id=&quot;plugins完整的扩展功能包&quot;&gt;Plugins：完整的扩展功能包&lt;/h3&gt;
&lt;p&gt;Plugins 是别人写好的完整功能，通过 marketplace 安装后直接可用。它是 &quot; 功能集成 &quot; 或 &quot; 扩展包 &quot;。&lt;/p&gt;
&lt;p&gt;比如 superpowers plugin 就是一整套开发工作流框架，包含 brainstorming、TDD、debugging 等多个技能。你不需要自己写，安装后就能用。&lt;/p&gt;
&lt;p&gt;和 Skills/Commands 的区别是：Plugins 是完整的、多功能的解决方案，而 Skills 和 Commands 通常只解决一个具体问题。&lt;/p&gt;
&lt;p&gt;其实 Plugins 就是 Skills 和 Commands 的组合包。Plugin 是一个 &quot; 容器 &quot;，里面可以包含多个 Skills 和 Commands。&lt;/p&gt;
&lt;p&gt;比如 superpowers 这个 Plugin，内部就包含了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;brainstorming skill&lt;/li&gt;
&lt;li&gt;TDD skill&lt;/li&gt;
&lt;li&gt;debugging skill&lt;/li&gt;
&lt;li&gt;writing-plans skill&lt;/li&gt;
&lt;li&gt;等等...&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;你可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;单独写一个 Skill 文件，放在 &lt;code&gt;.claude/skills/&lt;/code&gt; 下&lt;/li&gt;
&lt;li&gt;单独写一个 Command 文件，放在 &lt;code&gt;.claude/commands/&lt;/code&gt; 下&lt;/li&gt;
&lt;li&gt;或者把它们打包成 Plugin，发布到 marketplace 让别人安装&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;三者的关系：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Plugins (功能包)
  ├── Skills (行为规范)
  ├── Commands (快捷命令)
  └── 其他配置
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;怎么打包-plugins&quot;&gt;怎么打包 Plugins&lt;/h2&gt;
&lt;p&gt;其实打包 Plugins 就是用固定的目录结构和配置文件。&lt;/p&gt;
&lt;h3 id=&quot;目录结构&quot;&gt;目录结构&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;my-plugin/
├── .claude-plugin/
│   └── plugin.json          # 插件元数据
├── skills/                   # Skills 放这里
│   ├── tdd/
│   │   └── SKILL.md
│   └── debugging/
│       └── SKILL.md
├── commands/                 # Commands 放这里
│   ├── commit.md
│   └── release.md
└── marketplace.json          # 发布到 marketplace 的配置
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;pluginjson-示例&quot;&gt;plugin.json 示例&lt;/h3&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;my-workflow-tools&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;version&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;1.0.0&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;description&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;我的开发工作流工具集&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;author&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Your Name&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;skills&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;./skills/&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;commands&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;./commands/&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h3 id=&quot;发布到-marketplace&quot;&gt;发布到 marketplace&lt;/h3&gt;
&lt;p&gt;创建 &lt;code&gt;marketplace.json&lt;/code&gt;：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;my-marketplace&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;owner&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Your Name&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    &quot;email&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;you@example.com&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  },&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;plugins&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: [&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;      &quot;name&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;my-workflow-tools&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;      &quot;source&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;./&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;      &quot;description&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;我的开发工作流工具集&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;      &quot;version&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;1.0.0&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;然后把这个仓库托管到 GitHub，用户就可以通过 &lt;code&gt;/plugin install my-workflow-tools@your-username&lt;/code&gt; 安装了。&lt;/p&gt;
&lt;h2 id=&quot;什么时候用哪个&quot;&gt;什么时候用哪个&lt;/h2&gt;
&lt;h3 id=&quot;用-skills-的场景&quot;&gt;用 Skills 的场景&lt;/h3&gt;
&lt;p&gt;需要 AI 按照某种方式工作的时候：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;写代码时遵循 TDD 流程&lt;/li&gt;
&lt;li&gt;遇到 bug 时按调试规范排查&lt;/li&gt;
&lt;li&gt;代码审查时按标准检查&lt;/li&gt;
&lt;li&gt;或者说需要 AI 协调多个 subagent 协作&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;决策流程&quot;&gt;决策流程&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;需要自动化执行？
  ├─ 是 → Skills
  └─ 否 → 需要完整功能？
      ├─ 是 → Plugins
      └─ 否 → Commands
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你可以这样想：需要建议用 Skills，快捷操作用 Commands，完整功能用 Plugins。&lt;/p&gt;
&lt;h3 id=&quot;用-commands-的场景&quot;&gt;用 Commands 的场景&lt;/h3&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;你需要 &quot; 一键完成 &quot; 某个重复性操作。&lt;/p&gt;
&lt;h3 id=&quot;用-plugins-的场景&quot;&gt;用 Plugins 的场景&lt;/h3&gt;
&lt;p&gt;需要复杂功能或不想自己写的时候：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;完整的开发工作流框架（如 superpowers）&lt;/li&gt;
&lt;li&gt;第三方服务集成（如 GitHub、Jira）&lt;/li&gt;
&lt;li&gt;社区维护的通用功能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&quot; 别人已经做好了，直接用就行 &quot;。&lt;/p&gt;
&lt;h2 id=&quot;快速上手&quot;&gt;快速上手&lt;/h2&gt;
&lt;h3 id=&quot;command-示例&quot;&gt;Command 示例&lt;/h3&gt;
&lt;p&gt;告诉 AI 创建一个 Command，然后它会生成这样的文件：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;markdown&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;markdown&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;my-commit&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;description&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;我的规范化提交命令&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold&quot;&gt;# 规范化提交&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;按照以下格式提交：&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; 类型：feat/fix/docs/refactor&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; 范围：简短描述&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; 正文：详细说明（如有）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h3 id=&quot;skill-示例&quot;&gt;Skill 示例&lt;/h3&gt;
&lt;p&gt;告诉 AI 创建一个 Skill，然后它会生成这样的文件：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;markdown&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;markdown&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;my-tdd&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;description&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;我的 TDD 工作流程&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;trigger&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;写测试&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  - &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;TDD&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold&quot;&gt;# TDD 工作流程&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;当用户说「写测试」或「TDD」时：&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;1.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; 先写失败的测试&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;2.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; 写最小实现&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;3.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; 重构优化&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h3 id=&quot;安装-plugin&quot;&gt;安装 Plugin&lt;/h3&gt;
&lt;p&gt;直接告诉 AI 你想安装什么插件，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot; 安装 superpowers plugin&quot;&lt;/li&gt;
&lt;li&gt;或者 &quot;/plugin install superpowers@claude-plugins-official&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;参考资料&quot;&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://claude.ai/code&quot;&gt;Claude Code 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/obra/superpowers&quot;&gt;superpowers GitHub 仓库&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;结论：三种扩展方式各有优势。根据你的实际需求选择或组合使用，能最大化 Claude Code 的效率。&lt;/p&gt;</description><category>笔记</category><category>大模型</category><category>技术调研</category><category>skills</category><category>AI 写作为主</category></item><item><title>在碎片与系统输出之间 关于笔记软件与 AI 协同的尝试</title><link>https://blog.kazoottt.top/posts/transition-between-fragments-and-system-output/</link><guid isPermaLink="false">urn:blog:986c4b09-c453-5cd6-8d78-8038aacaebe5</guid><pubDate>Thu, 05 Mar 2026 00:00:00 GMT</pubDate><description>&lt;p&gt;在之前使用 Notion、Obsidian 和 Logseq 等笔记软件的过程中，我一直在处理一个很矛盾的问题。&lt;/p&gt;
&lt;p&gt;一方面，我很习惯像用微博或者 flomo 那样，想到什么就记什么，完全没有记录负担；但另一方面，当我真正需要整理长文或者做严肃输出时，这种乱糟糟的碎片又没法直接支撑我的需求。但是在使用比较重的笔记软件时，我又因为如何组织笔记而烦恼。&lt;/p&gt;
&lt;h2 id=&quot;一-现状分析与痛点识别&quot;&gt;一、 现状分析与痛点识别&lt;/h2&gt;
&lt;p&gt;过去，我的笔记习惯严重依赖于文件夹层级和复杂的属性维护，或者想着说我都这样设计了不去进行打标很可惜。但这种模式在实际运行中暴露了几个核心问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;管理文件夹和维护属性带来的负担。每产生一条零散的想法，我都要在大脑里快速决策。它该放哪个文件夹？该打什么标签？这种细微的决策成本累加起来，成了阻碍我记录的最大障碍，导致记笔记变得很有压力。&lt;/li&gt;
&lt;li&gt;索引难以维护且容易被废弃。以前费劲建立的文件夹分类或标签体系，一旦逻辑变了，或者一段时间没有维护，索引就废了。&lt;/li&gt;
&lt;li&gt;零散记录与长文输出之间的断层。像 flomo 这种碎片化工具虽然记着爽，但因为缺乏空间感，和我的系统性文档也没什么关联，想把它们拼成一篇长文的搬运成本太高了。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;二-认清自己的大脑从分类转向召回&quot;&gt;二、 认清自己的大脑，从“分类”转向“召回”&lt;/h2&gt;
&lt;p&gt;受 Milanote 的启发，我意识到我在构思或者输出时更倾向于非线性的空间布局，而不是线性的层级目录。但是 milanote 自身的功能以及它不是本地优先（local-first），所以让我没有那么强烈的付费意愿。&lt;/p&gt;
&lt;p&gt;但其实当前大模型的能力，已经可以实现自由输入了，只是如果我真的需要把输出以网状结构可视化还需要进一步编写技能来实现。&lt;/p&gt;
&lt;p&gt;于是有了以下重构思路。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;彻底扁平化存储
放弃文件夹的层级嵌套，将文件夹的功能从”分类工具”降级为”生命周期容器”。&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;日记。作为唯一的无压力录入入口，承载所有碎片化的记录。&lt;/li&gt;
&lt;li&gt;根目录平铺。新笔记不再寻求特定的文件夹归属，仅通过包含关键词的文件名进行区分，或者让大模型自动打标（根据效果决定是否需要人工二次确认）。&lt;/li&gt;
&lt;li&gt;核心逻辑。文件夹是给人看的，而索引应该交给 AI 动态生成。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;
&lt;p&gt;召回
利用本地 Markdown 的开放性，依靠 AI 进行跨文件的检索。不再追求”找到文件所在的物理路径”，而是通过语义匹配和标签关联，在需要输出时将相关素材召回。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;空间化可视化
使用 Obsidian Canvas 替代高成本的云端画布工具。将 AI 召回的离散素材在画布上进行布局和连线，利用空间结构理顺逻辑。这填补了碎片化输入与系统性输出之间的空白。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/03/20260305-789a4fcf00ce37ea3dffc4e807c14f4e.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;三-确立后的工作流&quot;&gt;三、 确立后的工作流&lt;/h2&gt;
&lt;p&gt;重构后的工作流分为四个阶段：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;捕捉。移动端使用 Telegram + OpenClaw 录入碎片，桌面端可以使用浏览器插件进行剪藏，不需要进行分类或者决定路径，自动同步至本地 Inbox。&lt;/li&gt;
&lt;li&gt;召回。在准备输出长文或进行专题研究时，通过 AI 穿透历史日记和领域文档，进行多素材聚拢。&lt;/li&gt;
&lt;li&gt;网状可视化。在 Canvas 画布上完成文件和文件之间的关联显示，或者直接用双链来进行知识图谱的显示。&lt;/li&gt;
&lt;li&gt;输出。基于召回的资料与当前的想法，在 Studio 目录下完成正式文档撰写，通过 sanity API 发布（本身也可以使用大模型技能发布）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;四-总结&quot;&gt;四、 总结&lt;/h2&gt;
&lt;p&gt;笔记系统的价值在于支撑思考与产出，而不是为了记录而记录。将枯燥的打标与搜索交给 AI 去做，让自己回归到纯粹的记录与逻辑建构中，这样才能降低管理成本，提升表达欲。&lt;/p&gt;</description></item><item><title>高估行动成本导致状态低迷</title><link>https://blog.kazoottt.top/posts/overestimate-action-costs-slack-off/</link><guid isPermaLink="false">urn:blog:078eb2b8-072d-5985-9266-4c99fea9c192</guid><pubDate>Thu, 19 Feb 2026 00:00:00 GMT</pubDate><description>&lt;p&gt;（本文稿整理自 2026.1.31 手写笔记）&lt;/p&gt;
&lt;p&gt;🗓 2026.1.31 星期六&lt;/p&gt;
&lt;p&gt;感觉自己的状态很低迷，除了完成日常必需的工作内容和维持生理体征的行为之外，其它时间都在躺着玩手机，且把越来越多的时间花在了碎片化内容的浏览中。特别是在回到成都后，自己的人生有种停滞的感觉。&lt;/p&gt;
&lt;p&gt;个人认为原因有：&lt;/p&gt;
&lt;p&gt;① 日子过得太安逸，回到了离家近的地方，且这个地方的节奏确实比较慢，导致自己开始享受安逸。当然，丰富好自己的生活没有问题，但是我只是在把休闲时间提起来了，并没有去增加太多人生阅历的丰富性。&lt;/p&gt;
&lt;p&gt;② 精力或者说身体状态不足以支撑我在完成日常必做事项后，进行个人提升等，导致恶性循环。&lt;/p&gt;
&lt;p&gt;③ 对于未来没有规划没有目标，在上海的时候，自己的目标是回到川渝。但回来后就不知道下一个目标。且在 LLM 的冲击下，加速了我对于前端岗的不看好，感觉继续做下去没有什么意义，或者说不具备太多的上升空间了。&lt;/p&gt;
&lt;p&gt;而对于其他的爱好，怎么做呢？自己买了很多拍摄的设备，电脑的配置也很齐全，也有了充足的时间，但我能记录什么？输出什么呢。&lt;/p&gt;
&lt;p&gt;感觉可以回想一下最近给自己带来比较大的情绪波动的事情，以及自己还在热爱什么事情。我做事的动力从来不来自自己要对未来的自己负责，而是为了想给喜欢的事物添砖加瓦。为了实现这些目的的时候我才是最具执行力的。&lt;/p&gt;
&lt;p&gt;目前能给我带来情绪波动的：&lt;/p&gt;
&lt;p&gt;① 追星的新物料，确实是仅限于新的，我是一个在乎当下和未来的人。&lt;/p&gt;
&lt;p&gt;② 好玩的游戏或者影视作品，也就是我还是会为了好的内容买单。&lt;/p&gt;
&lt;p&gt;③ 人际关系，如果有好朋友或者家里人与我有良好的互动，我也会很高兴。&lt;/p&gt;
&lt;p&gt;④ 获得他人的赞赏，或者说极端一点就是虚荣，我需要从外界获取关注和认可然后从中获得前进的动力。&lt;/p&gt;
&lt;p&gt;除了这些事情之外我是一个很淡的人，可以说过得很平稳，不会去额外提升自己，无法发现生活之美和享受生活。我总是熬夜，也不会去做运动，整个人的皮肤状态也很差。感觉能维持现状，没有持续变差已经是很好的结局了。&lt;/p&gt;
&lt;p&gt;我也是一个三分钟热度的人，学东西或者对某些事情感兴趣的热情持续时间非常的短暂。那么有什么办法可以利用这种好又不太好特质给自己的人生带来更好的好处？&lt;/p&gt;
&lt;p&gt;从福格行为模型来说：B = MAP&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;M（动机）&lt;/li&gt;
&lt;li&gt;A（能力）&lt;/li&gt;
&lt;li&gt;P（提示）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;那么我欠缺的是什么？我并不认为我丧失了学习的能力，或者说当下的实力有落后他人太多到无法追上的地步。动机也是有的，我有能让自己爽到的事情，或者说虚荣就是我的动机。那么真正缺乏的是什么，是提示或者说 trigger，当启动一个事情的成本对我来说过大的时候，我就会陷入抗拒心理，不想去开始。例如：&lt;/p&gt;
&lt;p&gt;对于学习摄影来说，我需要打开电脑，坐到桌前，看视频，才能开始学习，这是我之前的认知，但是事实真的如此吗？这其实更偏向于一个完整的、高仪式感的学习模式。&lt;/p&gt;
&lt;p&gt;也有很多低成本的方式，例如针对单个的知识点进行针对性地看视频，这在手机上也可以完成。或者复盘自己的照片的问题，同样如此。所以对我来说目前应该做的是：主动地转变对于学习也好做事方式也好的想象，不要下意识认为这是一件必要怎么样才能做的事情。&lt;/p&gt;
&lt;p&gt;不想剪视频是因为不想用电脑且用手机剪不好，非也，也有很多人完全是用手机剪辑的。不想去跳舞健身，因为健身房或者舞室的人会对我评头论足，也不是，人生并没有那么多的观众，即是有这才是优势，把他人的有些看不起的目光先转为敬佩这比直接是仰视更加像爽文。&lt;/p&gt;
&lt;p&gt;写到这里真不知不觉也开始慢慢理清楚自己的思路了。利用热爱带来的动力去促使自己提升或者输出，然后降低启动事项的成本，先动起来是最重要的，这样才能达成福格行为模型的公式 B = MAP。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/02/20260219-287cd3999573eec592561a4485fdc0cd.jpg&quot; alt=&quot;IMG_20260219_172449&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/02/20260219-a92fbc7dba4ad36e52467e3764782faf.jpg&quot; alt=&quot;IMG_20260219_172454&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/02/20260219-42b7a29ded555f434e4755800dafac1b.jpg&quot; alt=&quot;IMG_20260219_172457&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2026/02/20260219-0e08109dd2f7f0db80aadc5bd107e871.jpg&quot; alt=&quot;IMG_20260219_172504&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</description><category>随笔</category><category>自我管理</category><category>行动力</category><category>行为改变</category><category>拖延</category><category>情绪</category><category>生活记录</category></item><item><title>我终于也是有猫的人了！</title><link>https://blog.kazoottt.top/posts/finally-have-cats/</link><guid isPermaLink="false">urn:blog:02c82089-4ef0-5786-8e4a-cd9419749993</guid><pubDate>Sat, 06 Dec 2025 00:00:00 GMT</pubDate><description>&lt;p&gt;橘猫叫会长，监督我早起协会会长 &amp;#x26; 希望他会长。&lt;/p&gt;
&lt;p&gt;狸花叫木木，刚接到的时候还没有取名字，带他去医院体检，医院一定要名字才能录入系统，于是想到了 momo，但是前台没有太听清楚，就输入了木木，不过感觉这个名字也挺好的，就保留了下来。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/12/20251206-0993aff1851a0164fd90dc664868e197.jpg&quot; alt=&quot;IMG-0993AFF1851A0164FD90DC664868E197&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/12/20251206-4858b950c2f723c83126e55ab4ee7724.jpg&quot; alt=&quot;IMG-4858B950C2F723C83126E55AB4EE7724&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/12/20251206-c9432c8a03c7e8fac63b90b44c300a34.jpg&quot; alt=&quot;IMG-C9432C8A03C7E8FAC63B90B44C300A34&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;会长三个月大，性格挺好的，虽然已经开始练习捕猎，但不会咬人和打人，小嗓门夹子音萌萌的，侧脸帅，正脸有时候像玉米猫。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/12/20251206-2d735cb11a38d0d97c954b3b899d339c.jpg&quot; alt=&quot;IMG-2D735CB11A38D0D97C954B3B899D339C&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/12/20251206-46174e41c1c5800c25f0f1d47820c01d.jpg&quot; alt=&quot;IMG-46174E41C1C5800C25F0F1D47820C01D&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/12/20251206-753747979d96dde83be8f65b75e55b21.jpg&quot; alt=&quot;IMG-753747979D96DDE83BE8F65B75E55B21&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/12/20251206-46dc2dadf486be600686cf6104cb6242.png&quot; alt=&quot;IMG-46DC2DADF486BE600686CF6104CB6242&quot; loading=&quot;lazy&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://pictures.kazoottt.top/2025/12/20251206-dc8e4cdca891c1c031857b0323e0ddda.jpg&quot; alt=&quot;IMG-DC8E4CDCA891C1C031857B0323E0DDDA&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/12/20251206-9c38295c2876110d625a1781c96a1390.jpg&quot; alt=&quot;IMG-9C38295C2876110D625A1781C96A1390&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/12/20251206-411db527b6cc0f6d892a9913f30829c4.jpg&quot; alt=&quot;IMG-411DB527B6CC0F6D892A9913F30829C4&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;养了猫之后，我已经从晚睡晚起变成早睡早起了，因为如果不抓紧时间睡觉，早上被吵醒之后就再也没办法睡了。🤡&lt;/p&gt;</description><category>随笔</category><category>宠物</category><category>猫咪</category><category>生活</category><category>日常</category></item><item><title>推荐一些前端相关的vscode插件</title><link>https://blog.kazoottt.top/posts/recommend-some-vscode-plugins/</link><guid isPermaLink="false">urn:blog:0d4e375a-199f-59a2-a826-a22d51552006</guid><pubDate>Mon, 20 Oct 2025 00:00:00 GMT</pubDate><description>&lt;p&gt;和语言相关的就不推荐了，感觉大部分人都有安装。&lt;br&gt;
vscode、cursor、trae、windsurf 等编辑器都可以使用。&lt;/p&gt;
&lt;h2 id=&quot;1-开发&quot;&gt;1. 开发&lt;/h2&gt;
&lt;h3 id=&quot;11-file-nesting-updater---visual-studio-marketplace&quot;&gt;1.1. &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=antfu.file-nesting&quot;&gt;File Nesting Updater - Visual Studio Marketplace&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;自动同步并更新他维护的文件嵌套配置，让文件资源管理器更整洁。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/1c93450eca5361646376c9ae0436bf0f463cddc5f1a471d5463db8b91370d464.png&quot; alt=&quot;Pasted image 20251020141840&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;12-turbo-console-log---visual-studio-marketplace&quot;&gt;1.2. &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ChakrounAnas.turbo-console-log&quot;&gt;Turbo Console Log - Visual Studio Marketplace&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;快速生成有意义（可以看到文件的行数、函数名称、变量名称）的日志，一键删除添加的 log。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/10/20251020-8be5636a37f380c6c86b708c0c2bd3ad.gif&quot; alt=&quot;IMG-8BE5636A37F380C6C86B708C0C2BD3AD&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;13-pretty-typescript-errors---visual-studio-marketplace&quot;&gt;1.3. &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=yoavbls.pretty-ts-errors&quot;&gt;Pretty TypeScript Errors - Visual Studio Marketplace&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;让 TypeScript 报错变得更易读，可以直接跳转去 ts 的条目便于理解报错。
&lt;img src=&quot;https://blog.kazoottt.top/media/0712cda8a991f76aad559eb704b81e16939e254a64c0574081b2185b959b0aeb.png&quot; alt=&quot;IMG-B938B0F373C7753BD8D87DDBC89341B3&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;14-json-to-ts---visual-studio-marketplace&quot;&gt;1.4. &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=MariusAlchimavicius.json-to-ts&quot;&gt;JSON to TS - Visual Studio Marketplace&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;快速把 json 转化为 ts 的类型&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d046e58a501d745f3db94fd10d2ceba71f940be7b901184315395b2382f2c2be.gif&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;15-error-lens---visual-studio-marketplace&quot;&gt;1.5. &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens&quot;&gt;Error Lens - Visual Studio Marketplace&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;直接在行内显示报错、告警信息&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/369bb2bc287757d475fd37bb1b4ea1bd79b27d8c91da8440f6252ff8940c3454.png&quot; alt=&quot;IMG-509CA7645B9A6ADCA902128F8A22C777&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;16-better-comments---visual-studio-marketplace&quot;&gt;1.6. &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments&quot;&gt;Better Comments - Visual Studio Marketplace&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;针对不同的注释类型展示不同的样式
&lt;img src=&quot;https://blog.kazoottt.top/media/9d92a32b92f8b567955268590310e63bae30f0c2fc66c826e484c5e8b3bc955b.png&quot; alt=&quot;IMG-F5711D684B9A167E973583F479F4E5CF&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;17-inline-parameters-for-vscode&quot;&gt;1.7. &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=liamhammett.inline-parameters&quot;&gt;Inline Parameters for VSCode&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;用来在函数调用处显示参数名称的内联提示。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/10/20251020-79678d80033b96fb92a3b6b9c4ee7ff1.gif&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/fa8e31e24671ae2a061ab084802c6c3cf42928e14c0d054d7c9425ba8327c90c.png&quot; alt=&quot;IMG-8F7FDFC33C5E909EBAC0A635E444B553&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;2-主题&quot;&gt;2. 主题&lt;/h2&gt;
&lt;h3 id=&quot;21-symbols-图标&quot;&gt;2.1. Symbols 图标&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=miguelsolorio.symbols&quot;&gt;https://marketplace.visualstudio.com/items?itemName=miguelsolorio.symbols&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c181257e2159276c2a04df20c56b2f8eb736ccc02095bd2419f1d6877107a20c.png&quot; alt=&quot;IMG-6A98552CAB5B5E5F85C1FA4EDEAFB900&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/7553e7a6458c0466244941023edefc7b2e2bb12563829410aa69eb648e3bcd58.png&quot; alt=&quot;IMG-B02157769E89B2ED3FC6C805D4520B47&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;22-vibrancy-continued---visual-studio-marketplace&quot;&gt;2.2. &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=illixion.vscode-vibrancy-continued&quot;&gt;Vibrancy Continued - Visual Studio Marketplace&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;影响性能还会报 xx 编辑器已损坏，慎用（只是为了尝鲜可以试试）&lt;/p&gt;
&lt;h2 id=&quot;3-其他&quot;&gt;3. 其他&lt;/h2&gt;
&lt;h3 id=&quot;31-wakatime---dashboards-for-developers&quot;&gt;3.1. &lt;a href=&quot;https://wakatime.com/&quot;&gt;WakaTime - Dashboards for developers&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;记录代码时长
&lt;img src=&quot;https://blog.kazoottt.top/media/01d87e811d79d0caeaa9017422fb19c26f1d58b56d07ecddf14ce819f36f3a0d.png&quot; alt=&quot;IMG-3C2F5219C3F196F6E60542674C31DE29&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;4-非-vscode-无法使用-vscode-市场如何下载&quot;&gt;4. 非 vscode 无法使用 vscode 市场如何下载&lt;/h2&gt;
&lt;p&gt;vscode 关闭了离线下载的功能，且不允许非 vscode 使用它的源，这些非 vscode 都是使用的镜像源来下载插件的，所以可能存在一些插件无法下载的情况。
可以使用 &lt;a href=&quot;https://www.coze.cn/store/agent/7491642343327252489?bot_id=true&quot;&gt;扣子&lt;/a&gt; 的这个 agent，输入标识符 Unique Identifier 来下载离线文件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4dd741dce5507ec5593a82b9b33703104e698118356bf13a7a2107d660d32e74.png&quot; alt=&quot;Pasted image 20251020162148&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</description><category>笔记</category></item><item><title>一些问题和反思</title><link>https://blog.kazoottt.top/posts/reflections-about-work/</link><guid isPermaLink="false">urn:blog:55e70f00-b08b-5eba-9803-ad979429c0c2</guid><pubDate>Thu, 31 Jul 2025 23:43:00 GMT</pubDate><description>&lt;p&gt;以下内容其实是工作三个月的问题总结和反思，感觉也可以公开发出来。&lt;/p&gt;
&lt;h2 id=&quot;问题-1技术债&quot;&gt;【问题 1】技术债&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/715dc4badeffc7c3372fd044a7c7319df325d2c6521ac200abeae64a42078747.png&quot; alt=&quot;IMG-5242CD5D6AD5BA4D45712890AB140726&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;发现了有的模块存在的问题，但是因为时间紧张或者别的原因没有在当下进行优化。最后躲过的【技术债】总是会在未来的某个时间又出现在面前，造成返工。&lt;/p&gt;
&lt;p&gt;原因：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;时间紧张。有的时候是模块的历史设计存在问题，但是在当下急着上线。想着快迭出能满足需求的版本，于是只能在现有的基础上改造。过了发现问题的时机，又有了其他的需求排期，导致这个优化项被延后。直到积累到一个必须要改造的程度。&lt;/li&gt;
&lt;li&gt;在意流程正确，比如与他人有依赖项，总想着要说出来进需求池里，然后排期。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;解决：&lt;br&gt;
提升对关键问题的敏感度。如果发现某问题会导致系统结构恶化或未来开发复杂度显著增加，尝试在当前阶段即使没有全部解决，也优先处理核心风险点或留下可扩展的接口。&lt;/p&gt;
&lt;p&gt;【老的模块】
设置技术债记录机制，对于每次开发中意识到但未能立即解决的问题，建立一个“技术债清单”，明确记录问题描述、影响范围、预计成本与优先级。定期回顾，并在每轮迭代中预留时间专门用于偿还技术债。&lt;br&gt;
回顾哪些模块返工率高、哪些历史设计拖慢了进度，记录并反思当初没处理的点是如何演变成问题的。&lt;/p&gt;
&lt;p&gt;【新的模块】设定一定比例的技术预研时间，主动了解依赖方或调用方的业务&lt;/p&gt;
&lt;h2 id=&quot;问题-2业务理解的问题&quot;&gt;【问题 2】业务理解的问题&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/8583a5e22b603bdac067866b188f527eaf877b76ce3a3506c4fe56a5b1e24924.png&quot; alt=&quot;IMG-3E6AE6D67F6D1F0818D382A618B61185&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;有的时候是在做一个需求的执行者，把【需求转化为代码】，但是没有去理解这个需求的上下文，解决了什么问题，可能会造成什么样的影响。&lt;/p&gt;
&lt;p&gt;现阶段或许看不出来问题，但是如果时间久了自身的竞争力会下降。&lt;/p&gt;
&lt;p&gt;无论是传统的开发还是大模型的出现之后，开发其实都在进行【需求转化为代码】的工作，虽然大模型的出现以及 long context 的不断扩展，让输入需求 --- 编写代码这种形式变得越来越简单。&lt;/p&gt;
&lt;p&gt;与此同时，大模型的也是有局限性的，它可以去写单测，但是目前无法完成集成测试
其次大模型上下文即使可以很长，但是依然无法将业务上下文全部灌输于它。&lt;/p&gt;
&lt;p&gt;所以对于产出结果的质量和正确与否的评估会越来越重要。&lt;/p&gt;
&lt;p&gt;所以依然需要开发对于需求有正确的理解，这样在未来才拥有竞争力，而不是简单的做一个“翻译者”。&lt;/p&gt;
&lt;p&gt;原因：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;缺乏上下游信息&lt;/strong&gt;：仅接触到单个的需求文档，不了解整个大项目的背景讨论。&lt;/li&gt;
&lt;li&gt;客户服务意识欠缺：习惯站在开发视角思考问题，关注点在“功能有没有开发完”，而不是“是否真正解决了对方的问题”。缺少从使用者角度去审视体验、流程和痛点&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;问题-3做事方式没有及时转变&quot;&gt;【问题 3】做事方式没有及时转变&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/1aa350c8cbdd3eae0006db1bc4baf0d895ab69d408010de072934a28b5d24921.png&quot; alt=&quot;IMG-7ADF8717E4682ECFB4337D92B9CF7B48&quot; loading=&quot;lazy&quot;&gt;&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;/ul&gt;
&lt;p&gt;比如应该在前期写好面向新人的入职文档，包括项目背景、产研流程、规范、常用技术栈，遇到问题应该找什么岗位的人等等的指引，以及需要培养善用搜索、群内咨询和大模型的意识，这样前期很常见的问题可以在入职文档中找到解决方案，并且不会说一出现问题就来寻求他人的帮助。&lt;/p&gt;
&lt;p&gt;对于新人的入职文档准备总结如下：&lt;/p&gt;
&lt;pre class=&quot;mermaid&quot;&gt;graph LR
A[新人入职] --&gt; B(入职文档准备);
B --&gt; C{文档内容包含哪些?};
C -- 产研流程 --&gt; D[详细流程图/步骤];
C -- 规范 --&gt; E[代码规范/设计规范];
C -- 技术栈 --&gt; F[常用技术栈介绍];
C -- 岗位职责 --&gt; G[各岗位职责与联系方式];
C -- 常见问题 --&gt; H[FAQ/解决方案];
C -- 项目背景 --&gt; I[项目介绍/目标];

style A fill:#f9f,stroke:#333,stroke-width:2px
style B fill:#ccf,stroke:#333,stroke-width:2px
&lt;/pre&gt;
&lt;p&gt;对于问题解决的意识如下：&lt;/p&gt;
&lt;pre class=&quot;mermaid&quot;&gt;graph LR
A[工作中遇到问题] --&gt; B{文档中是否已解决?};
B -- Yes --&gt; C[问题解决];
B -- No --&gt; D{尝试自行解决?};
D -- Yes --&gt; E{尝试搜索/群内咨询/大模型?};
E -- Yes --&gt; C;
E -- No --&gt; F[咨询资深同事/导师];
D -- No --&gt; F;
F --&gt; G{问题解决?};
G -- Yes --&gt; C;
G -- No --&gt; H[向上级汇报/寻求帮助];
H --&gt; C;

style A fill:#f9f,stroke:#333,stroke-width:2px
style C fill:#9f9,stroke:#333,stroke-width:2px
&lt;/pre&gt;</description><category>随笔</category><category>反思</category></item><item><title>目前学习知识的方法</title><link>https://blog.kazoottt.top/posts/mu-qian-xue-xi-zhi-shi-de-fang-fa/</link><guid isPermaLink="false">urn:blog:592650f1-f77d-5ebc-ab36-25076851c7f2</guid><pubDate>Tue, 29 Apr 2025 13:52:00 GMT</pubDate><description>&lt;p&gt;翻了一下我以前的四六级的成绩单，我发现我的阅读和听力并不差，差的是写作。但是现在看到一段英文或者想要输出英文的时候总是下意识借助插件来帮我进行翻译。&lt;/p&gt;
&lt;p&gt;之前也有聊到过，自己对于翻译插件的看法：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;今天面试了一个歪果仁&lt;/p&gt;
&lt;p&gt;我们中英混杂，他的中文不好，我的英文不好。他听不懂我说中文的时候，我开始说英语，然后有时候我也想不起来怎么表达，就又切成了中文&lt;/p&gt;
&lt;p&gt;感觉我好像在特定情况下并不会不好意思开口，但是确实词汇量匮乏，连用不准确的词表达意思都不会，更别说精确表达&lt;/p&gt;
&lt;p&gt;其实我觉得一些辅助翻译的插件，搭配上大模型，体验上是好用的，给了用户无痛阅读英文的感受，是拐杖但也让人一直依赖这个拐杖，导致能力提升很慢，脱离工具依然不会英语。&lt;/p&gt;
&lt;p&gt;总是看到一些营销号类的账号说 xxx 已死，xxx 要失业了，个人是很反感这些标题和说辞的。在一些特定领域，依然需要不用辅助工具的条件下与人交流，并且目前的工作流水平可以做到输出精准，但无法做到快速的上下文联通。&lt;/p&gt;
&lt;p&gt;所以我的想法是以后默认关闭插件，确实无法理解后再进行翻译，另外还要有意识地强制自己看英文视频和文档&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在 twitter 上看到一位老师 &lt;a href=&quot;https://x.com/HroyhongHong/status/1907266551419744495&quot;&gt;分享雅思口语学习的技巧&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/479ef7ebc8c27903d271da4a14d9478c42c8e184e745c88dcf528f964978e1d0.png&quot; alt=&quot;CleanShot2025-04-0312.27.22@2x.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;所以我目前的练习方式调整为了：&lt;/p&gt;
&lt;p&gt;设置大模型的提示为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;用户可能使用英文跟你对话，但是语法或者措辞都不是很标准，甚至存在拼写错误。请你在回答完用户的问题之后，对于用户本身的问句也做出纠正，并补充注释。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在与大模型日常对话的过程中，输入方式改为：使用 macos 的听写功能输入一段英文，如果无法表达完整会在听写完成后插入中文。&lt;/p&gt;
&lt;p&gt;看完大模型回答的英文内容之后，在最后看一下它纠正我的输入的内容，然后又复述几遍，直到自己独立能说出来。&lt;/p&gt;
&lt;p&gt;效果：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/04/20250406-7b800f3d12678f62efbfe5ea2899e24c.png&quot; alt=&quot;CleanShot2025-04-06at002938@2x.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;以为前端内容学习举例：&lt;/p&gt;
&lt;p&gt;前端的一些点是比较零散或者抽象的，直接去记忆并不好理解。&lt;/p&gt;
&lt;p&gt;我目前的学习的流程是：&lt;/p&gt;
&lt;ol&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;li&gt;我们应该如何使用以及怎么使用技术&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这些能够与其他知识产生关联的方式进行学习和记忆，这样可以慢慢从点到线到面，把知识连接起来，形成更为清晰的认知。&lt;/p&gt;
&lt;p&gt;而在学习过程中，我最常用的是举例、比喻 + 费曼学习法。&lt;/p&gt;
&lt;p&gt;首先针对不太清楚的概念看一些入门级别的技术博客或者教学视频，或者让 chatgpt 进行举例，如果举的例子太抽象，则先让它用比喻的手法讲解知识便于理解，再回归到只是本身。&lt;/p&gt;
&lt;p&gt;然后在大致了解了内容，重新复述一遍学习到的内容，让 chatgpt 进行 check 和 补充。&lt;/p&gt;
&lt;p&gt;值得补充的一点是，chatgpt 的实时对话功能非常实用，可以让你躺在床上闭上眼睛也进行知识的学习，可以有效缓解日常生活中本来对于敲键盘导致的手部疲劳和看屏幕导致的疲劳&lt;/p&gt;
&lt;p&gt;如果还想学习英文，或者阅读英文的时候更加专注，则可以用英文进行提问和回答。提示词如下：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;plaintext&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;plaintext&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;用户可能使用英文跟你对话，但是语法或者措辞都不是很标准，甚至存在拼写错误。请你在回答完用户的问题之后，按照下列格式进行返回：&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;1. 分段纠正错误，并且补充注释。&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;2. 最后返回完整的纠正之后的内容。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;然后再改善措辞重新复述给 chatgpt 进一步巩固，如果该层次的概念已经了解清楚，则可以把浅层、简化的表述展开，进一步深挖学习。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f86a74480fa36e8b13a8db0eff607b0c5a153ea6393badb3f7402ab6def94a95.png&quot; alt=&quot;alt text&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;通过上述方法可以由浅入深地掌握前端的很多概念，不过对于算法依然需要&lt;/p&gt;
&lt;ol&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;/ol&gt;
&lt;p&gt;这样的积累不是几天几周就可以见效的，应该融入到日常生活中，才能保证意外情况下需要开始另外找工作或者自己想要主动找新的工作的时候，能够完成算法题的考验。&lt;/p&gt;</description><category>随笔</category></item><item><title>回归追星的初心</title><link>https://blog.kazoottt.top/posts/return-to-star-chasing-initial-intention/</link><guid isPermaLink="false">urn:blog:2ddd4409-dcf0-50d7-8ef0-6d1209f27d0a</guid><pubDate>Fri, 18 Apr 2025 00:00:00 GMT</pubDate><description>&lt;p&gt;其实我觉得我对于不好的舆论或者情绪化的发言还蛮强心脏的。&lt;/p&gt;
&lt;p&gt;1819 年左右那时候常看青青草原，踩组，鹅组还有每出一个选秀就要建对应秀组，有时候还去兔区，再到 21 年后在贴吧也是各种喂自己赤石&lt;/p&gt;
&lt;p&gt;总之在那几年啥类型的言论和恶意都看过了，现在再看不会太对自己的情绪有影响了&lt;/p&gt;
&lt;p&gt;慢慢知道在论坛尽量减小曝光度，有谣言尽力澄清，前几页控的上去就控，控不了开新楼顶贴是更好的选择。（看到别人在高楼里聊天我还是两眼一黑。&lt;/p&gt;
&lt;p&gt;豆瓣之前属于是氛围还挺好，但后续各家受众逐渐固定，出现竞争意识氛围逐渐恶化，回归到豆瓣本来该有的社区氛围了。&lt;/p&gt;
&lt;p&gt;所以之前因为有趣或者和谐氛围被吸引过去的萌萌人可能第一次经历这种感受，实在影响心情还是退出不看吧。&lt;/p&gt;
&lt;p&gt;也不必逼自己去干这样的脏活，让老油条战斗粉来做就好，不然容易被踢或者当成玩具继续羞辱。&lt;/p&gt;
&lt;p&gt;不过也不必太在意这种本来就很不恶劣的舆论场的事情，也没那么多人看，像内娱之类的还可能把论坛的帖子搬到 xh，带上账号矩阵二次传播。目前这边的几个小体量圈子还不会发生这种事情，总之不影响到大盘就够了。&lt;/p&gt;
&lt;p&gt;另外，&quot;有意思&quot;的是当时豆瓣真的会投放水军的，会有按照点赞数量或者指定文案回复结算费用，鹅组难进，因此号的回复是最贵的，大概 2+ 元。&lt;/p&gt;
&lt;p&gt;但换个角度说，辱骂得太狠或者文不对题，被传播后怎么又不算虐粉固粉。&lt;/p&gt;
&lt;p&gt;另外还想说的是，其实追星最快乐的方式就是做散粉，不要太因为他人看法束缚自己，也不要过于在意别人的言论，无论是圈内的粉丝或者黑粉。这些言论如果能让你快乐，看点无妨，影响到心情的话最好就不要看了。&lt;/p&gt;
&lt;p&gt;我前几年就是过于深入粉圈，出于责任感或者喜欢，参与了一些社群运营的工作，组织投票、冲销量、做数据，或者看到很多不好的言论，导致我想要去做&quot;反黑&quot;。&lt;/p&gt;
&lt;p&gt;后来&quot;反黑&quot;还把自己伤到了，每次新出什么物料都下意识要去刷论坛的有没有带有关键词的新帖子，没有办法做到像最初的时候享受追星带来的快乐了。所以淡了一段时间，慢慢回归散粉。&lt;/p&gt;
&lt;p&gt;不过也不后悔那段时间做这些事情，至少心态有被锻炼到，也学到了一些小技巧。&lt;/p&gt;
&lt;p&gt;继续回归追星的初心，自己的开心最重要！&lt;/p&gt;</description><category>随笔</category><category>思考</category><category>追星</category><category>人工写作为主</category></item><item><title>避免空口鉴抄、鉴AI</title><link>https://blog.kazoottt.top/posts/no-unproven-claims-against-creators/</link><guid isPermaLink="false">urn:blog:73776166-db3f-5e82-8040-26dd4dc8f77b</guid><pubDate>Tue, 01 Apr 2025 22:56:00 GMT</pubDate><description>&lt;p&gt;前几天朋友在小红书上发了自己的作品，被底下的人评论鉴 AI。她们的对话如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;路人：AI 画的？&lt;/li&gt;
&lt;li&gt;朋友：为什么觉得是 AI&lt;/li&gt;
&lt;li&gt;路人：感觉像 AI&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当时看得我有点无奈，把之前写的一篇杜绝空口鉴抄袭的评论改了一下，发给了当时鉴 AI 的路人，不久后 ta 删除了评论并向我的朋友私信表示了歉意。&lt;/p&gt;
&lt;p&gt;之前对于杜绝空口鉴抄袭的评论是这样的：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我觉得每个人都应该强调不要空口鉴抄，更不要用这种理由作为攻击他人作品的武器。&lt;/p&gt;
&lt;p&gt;这种鉴抄不是在保护原创，而是在打击原创。&lt;/p&gt;
&lt;p&gt;因为鉴抄不需要任何成本，把舆论带起来后到最终出鉴别结果有很长一段时间，在这个时间差内有的伤害已经造成了。&lt;/p&gt;
&lt;p&gt;当然能做到这一点确实很难很难，虽然已经在各大平台见过很多相关科普，但转过头还是一样有很多人空口鉴抄。其中有不少故意的人，也会有被带着走的人。&lt;/p&gt;
&lt;p&gt;能怎么办呢，我只希望我不要成为那种人。&lt;/p&gt;
&lt;p&gt;也期待能有更快速直接的渠道来完成鉴别整个流程。&lt;/p&gt;
&lt;p&gt;本身怀有恶意的人是无法从说通的，但可以减少他们通过打时间差和信息差去带节奏，给别人造成伤害的概率。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;其实我无论是对于空口鉴抄袭还是鉴 AI 都是这种态度：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于鉴别者：谁主张谁举证&lt;/li&gt;
&lt;li&gt;对于围观者：不应该把压力一开始就给到创作者本人&lt;/li&gt;
&lt;/ul&gt;</description><category>随笔</category><category>鉴抄</category></item><item><title>与被我荒废的 7 年告别，从头开始</title><link>https://blog.kazoottt.top/posts/saying-goodbye-to-wasted-7-years/</link><guid isPermaLink="false">urn:blog:48ded943-816c-5c73-a704-ceb76558c2db</guid><pubDate>Tue, 01 Apr 2025 22:12:00 GMT</pubDate><description>&lt;p&gt;17 年大一，到现在已经 7 年多了，回顾一下我是如何荒废掉这 7 年时间的。想要与此告别，从头开始。&lt;/p&gt;
&lt;h2 id=&quot;1-在大学只治好了病&quot;&gt;1. 在大学只“治”好了病&lt;/h2&gt;
&lt;p&gt;其实我的性格一直都非常的内向，小学的时候被老师叫起来回答问题，我虽然知道答案，但是就是不敢开口，最后只能急得控制不住自己的情绪然后在全班面前哭出来。&lt;/p&gt;
&lt;p&gt;稍微改善一点是在高中，由于外公是退休的职工，班级的老师都认识他，有时候回教室宿舍的时候会碰到他们，然后聊上一两句。在那个环境下，我是更放松的，并且确实有想要学习的动力，所以会上台请教老师问题。再加上英语和语文老师都会安排每节课会有一个 talk 环节，也就是上台用中文或者英文分享一些内容。高中时候的我也知道我不能再像小学那样靠哭来逃避，这种分享是躲不掉的，所以只能私下多加练习，然后逼自己站在台上讲话。&lt;/p&gt;
&lt;p&gt;到了大学，到了一个新的环境，不知道为什么格外地兴奋，在各种群中都比较活跃，甚至买了桌游到寝室和室友一起玩。当时会有一些社团招新的活动，去看了辩论队的表演赛后对此有些感兴趣，于是报名参加了辩论队。&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;2-这些年所犯的错&quot;&gt;2. 这些年所犯的错&lt;/h2&gt;
&lt;h3 id=&quot;21-第一个错-不再自律&quot;&gt;2.1. 第一个错 ：不再自律&lt;/h3&gt;
&lt;p&gt;大一上学期的时候，我的成绩还是中上，到了下学期开始下滑，可能是精力的不足，也可能是缺乏他人监督后变得懈怠。高中的时候，每次月考班主任都会念班级排名，也会把排名粘贴在班级的门口，再加上是封闭式的管理，不能玩手机，所以在那样的环境下，我们能做的只有学习。&lt;/p&gt;
&lt;p&gt;但是到了大学，一切都不一样了，我可以在没有课的时候回宿舍休息，也可以去图书馆泡着，这都是自己的选择，不过选择的后果也需要自己承担。我渐渐地失去了自律的状态，这是我犯的第一个错。&lt;/p&gt;
&lt;h3 id=&quot;22-第二个错-错误的选择和规划&quot;&gt;2.2. 第二个错 ：错误的选择和规划&lt;/h3&gt;
&lt;p&gt;大三是一个很重要的阶段，需要考虑就业、考研、考公等等未来的路。由于很多学长学姐都选择了的是产品经理这条路，我也有些动摇，最开始的实习投递的是产品岗，投了几份后匆忙去了一家上海的产品实习岗位，在这份实习中，我才意识到当我作为产品经理的时候我是没有产出动力的。然后我才将自己的就业意向从产品改为了前端。&lt;/p&gt;
&lt;p&gt;其实辅导员在收集就业意向且我给的意向是产品的时候，他有劝过我应该是后端&gt;前端&gt;产品，但我还是头铁，选择相信自己的选择。&lt;/p&gt;
&lt;p&gt;在就业意向转为前端的时候，我在家开始复习，效率很低，同时秋招开始了，也开始投递一些实习岗位，最开始投了腾讯（其实不应该那么早的，或者说我应该提前规划自己的实习方向和学习计划），毫无疑问一面挂，后来也面了一些，都是石沉大海。只去了百词斩的实习，在那里一边实习干活，一边学习继续准备面试。&lt;/p&gt;
&lt;p&gt;所以其实直到春招，我才有第一个正式的 offer。&lt;/p&gt;
&lt;p&gt;回头再看，这些都是因为我没有意识什么时间该做什么事情，以及我到底要做什么岗位。&lt;/p&gt;
&lt;h3 id=&quot;23-第三个错-拿到-offer-后的懈怠&quot;&gt;2.3. 第三个错 ：拿到 offer 后的懈怠&lt;/h3&gt;
&lt;p&gt;其实春招拿到的 offer 待遇并不算好，应该继续面试的去争取更好的待遇。&lt;/p&gt;
&lt;h3 id=&quot;24-第四个错-学东西都浮于表面&quot;&gt;2.4. 第四个错 ：学东西都浮于表面&lt;/h3&gt;
&lt;p&gt;写了这么久的前端了，即使自己也会写 side project，但是更多的都是浮于表面地写出来，也就是说做的很多都是玩具项目，对于技术的认知并没有提升。这一点很早之前面美团的时候，面试老师也有点出来，觉得我虽然想法很多但是技术不是很扎实。&lt;/p&gt;
&lt;h2 id=&quot;3-没有努力过有什么资格抱怨现状&quot;&gt;3. 没有努力过，有什么资格抱怨现状&lt;/h2&gt;
&lt;p&gt;所以在犯错这么多的情况下，我的现状并不好，有时候看到同龄人的现状的时候，确实很羡慕，也会抱怨为什么我活成了现在这幅样子。&lt;/p&gt;
&lt;p&gt;但是我都没有真的努力过，又有什么资格抱怨现状？ 甚至现在拥有的一些东西，都只是在吃学历的“老本”。&lt;/p&gt;
&lt;p&gt;在上海的时候，有一个刚入职的同事听到我的学校后很惊讶，说了一句“你怎么来这了”，其实那一刻心里有些触动。内心的想法在打架。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A: 是啊，我怎么来这了？&lt;/li&gt;
&lt;li&gt;B: 是啊，我这种状态能来这里已经不错了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不想再抱怨什么了，现在更多的时候会想为什么我都没努力过就放弃了？&lt;/p&gt;
&lt;p&gt;现在醒过来，再好好努力一把，如果还是争取不到再认命不行吗？&lt;/p&gt;
&lt;p&gt;我会给自己一段时间，与过去 7 年颓废的自己告别，努力找回最初的状态。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;时间是最好的法官，是非成败未来见。&lt;/p&gt;
&lt;/blockquote&gt;</description><category>随笔</category><category>反思</category></item><item><title>如何运行 ts 文件</title><link>https://blog.kazoottt.top/posts/how-to-run-ts-files/</link><guid isPermaLink="false">urn:blog:dedd581b-959e-5c87-8b9e-13f546515e86</guid><pubDate>Thu, 06 Mar 2025 00:00:00 GMT</pubDate><description>&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/24ecf9fc5c2c49cf2ab91f125c80f0bb12b78bf1b3110fc255e0394438b6a598.png&quot; alt=&quot;cover&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;在 VSCode 中安装扩展 Code Runner，我创建了一个 .ts 文件，点击运行按钮，但提示&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&apos;ts-node&apos; 不是内部或外部命令&lt;br&gt;
&apos;ts-node&apos; is not recognized as an internal or external command&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;解决方法是全局安装 ts-node，例如：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;pnpm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; -g&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; ts-node&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;但在我安装之后，错误确实消失了，却又提示另一个错误&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;log&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;log&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;TypeError: Unknown file extension &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;.ts&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; for /xxx/xxx/test.ts&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    at Object.getFileProtocolModuleFormat [as file:] (node:internal/modules/esm/get_format:176:9)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    at defaultGetFormat (node:internal/modules/esm/get_format:219:36)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    at defaultLoad (node:internal/modules/esm/load:133:22)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    at async ModuleLoader.load (node:internal/modules/esm/loader:554:7)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    at async ModuleLoader.moduleProvider (node:internal/modules/esm/loader:435:45)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    at async ModuleJob._link (node:internal/modules/esm/module_job:106:19) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  code: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&apos;ERR_UNKNOWN_FILE_EXTENSION&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;所以我认为或许不止我一个人对于如何运行 ts 文件有疑问，所以本篇文章就来介绍一下如何在 VSCode 中运行 ts 文件，以及回到最初的问题，如何在 code runner 中运行 ts 文件。&lt;/p&gt;
&lt;h2 id=&quot;如何运行-ts-文件&quot;&gt;如何运行 ts 文件&lt;/h2&gt;
&lt;p&gt;我们准备一个简单的的 ts 文件，命名为 index.ts，来作为测试的文件。&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;typescript&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;typescript&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;  &lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; c&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; number&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; a &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; b;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;console.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(c);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h3 id=&quot;bun-运行-ts-文件目前最推荐&quot;&gt;bun 运行 ts 文件（目前最推荐）&lt;/h3&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;bun&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; index.ts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c4c30efde5b45b954bedd8279886010a701664cbd130053f247ba221e4605ba6.png&quot; alt=&quot;alt text&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;使用-tsc-将-ts-编译为-js然后-node-运行&quot;&gt;使用 tsc 将 ts 编译为 js，然后 node 运行&lt;/h3&gt;
&lt;p&gt;TypeScript Compiler (tsc) 是 TypeScript 的编译器，它可以将 TypeScript 代码编译为 JavaScript 代码。我们可以使用 tsc 命令来编译 TypeScript 文件。&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;tsc&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; index.ts&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; index.js&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/fdbe167ccc7ff9b95d3a81576da14a7c628d37ad711cc6c5725ff4727b8d4f05.png&quot; alt=&quot;alt text&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;tsx-typescript-executer-运行-ts-文件&quot;&gt;tsx (TypeScript Executer) 运行 ts 文件&lt;/h3&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;npx&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; tsx&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; index.ts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/259bb5f8222ab9571c7d7106a328468dde8fd8e5a3022cc45c14e984d98d670c.png&quot; alt=&quot;alt text&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;nodejs-v2270-直接运行文件&quot;&gt;Node.js V22.7.0 直接运行文件&lt;/h3&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; --experimental-strip-types&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; index.ts&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a14d4224f583fba01f8ec45f1d84432bc797b30aa683c8541ae4822285500959.png&quot; alt=&quot;alt text&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;ts-node-运行-ts-文件不推荐&quot;&gt;ts-node 运行 ts 文件（不推荐）&lt;/h3&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;ts-node&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; index.ts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/643d93d95aa46b0ed08bfe2fb9c2cbdb01c82af9f8cb30c64e5eb2093e1eb63a.png&quot; alt=&quot;alt text&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;这个问题频繁出现于 ts-node 的 issues 中，有一个讨论甚至到了 70+ 也没有关闭&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/025bff3e89b6de5c3ddbd1a414a64bb529f10c6e9dfe12cd24d121b6a5101213.png&quot; alt=&quot;alt text&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;要解决这里的报错，需要做几件事情：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;必须要有 package.json 并且 &quot;type&quot;: &quot;module&quot;&lt;/li&gt;
&lt;li&gt;如果没有 package.json, 运行 &lt;code&gt;npm init -y&lt;/code&gt; 生成 package.json&lt;/li&gt;
&lt;li&gt;tsconfig.json 中 &quot;module&quot; 不能是 &quot;commonjs&quot; ，必须要有 &apos;module&apos;: &apos;ESNext&apos; 或者 &apos;module&apos;: &apos;ES6&apos;。&lt;/li&gt;
&lt;li&gt;如果没有 tsconfig.json, 运行 &lt;code&gt;npx tsc --init&lt;/code&gt; 生成 tsconfig.json&lt;/li&gt;
&lt;li&gt;运行的时候必须要有 --loader ts-node/esm&lt;/li&gt;
&lt;/ol&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;shell&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;shell&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; --loader&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; ts-node/esm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; index.ts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/2256141253f674471e64a41468995393715caa3090714cbd7606177effe81baa.png&quot; alt=&quot;alt text&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;如何在-coder-runner-中运行-ts-文件&quot;&gt;如何在 coder runner 中运行 ts 文件&lt;/h2&gt;
&lt;p&gt;最简单的方法：在 code-runner.executorMap 中修改 typescript 的配置：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;    &quot;typescript&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;cd $dir &amp;#x26;&amp;#x26; bun $fileName&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;也可以这样写，然后会生成一个 js 文件，然后运行 js 文件：&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;json&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;  &quot;typescript&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;cd $dir &amp;#x26;&amp;#x26; tsc $fullFileName &amp;#x26;&amp;#x26; node $fileNameWithoutExt.js&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;不过这样的速度是比较慢的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c40f2fda9895dee4bc3a80a19a734f588a51ba73d7d2868f38ff21a3ca999381.png&quot; alt=&quot;alt text&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;使用 &lt;code&gt;bun $fullFileName&lt;/code&gt;：
耗时：0.295 秒&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 tsc &lt;code&gt;tsc $fullFileName &amp;#x26;&amp;#x26; node $fileNameWithoutExt.js&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;耗时：2.523 秒&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;总结&quot;&gt;总结&lt;/h2&gt;
&lt;p&gt;无论是运行 ts 文件还是在 code runner 中运行 ts 文件，最推荐的方式是使用 bun 来运行 ts 文件。它的速度和开箱即用的特性都非常好。&lt;/p&gt;
&lt;p&gt;最不推荐的是 ts-node，需要有很严格的配置，且官方没有提供明确的文档来说明如何配置，更多的是靠开源社区的讨论来解决问题。&lt;/p&gt;</description><category>笔记</category><category>bun</category><category>code</category><category>runner</category><category>ts-node</category><category>typescript</category><category>vscode</category></item><item><title>2025-W06</title><link>https://blog.kazoottt.top/posts/2025-W06/</link><guid isPermaLink="false">urn:blog:07b49c0a-beab-5813-96ce-977072819ba5</guid><pubDate>Sun, 09 Feb 2025 00:00:00 GMT</pubDate><description>&lt;p&gt;日期范围：2025-02-03 - 2025-02-09&lt;/p&gt;
&lt;h2 id=&quot;本周产出&quot;&gt;本周产出&lt;/h2&gt;
&lt;h3 id=&quot;blog&quot;&gt;&lt;a href=&quot;https://blog.kazoottt.top/posts/&quot;&gt;Blog&lt;/a&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.kazoottt.top/posts/redirect-links-without-astro-wiki-plugin/&quot;&gt;2025-02-09 【前端】 不引入 astro wiki plugin 实现链接跳转的思路&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.kazoottt.top/posts/obsidian-web-clipper-offline-reading-fanfics/&quot;&gt;2025-02-06 【软件】 Obsidian Web Clipper 离线阅读同人作品&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.kazoottt.top/posts/cover-generator/&quot;&gt;2025-02-01 【软件】 封面生成器推荐&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;收藏夹---工具&quot;&gt;收藏夹 - 工具&lt;/h2&gt;
&lt;h3 id=&quot;polyhaven---免费的-3d-资源&quot;&gt;&lt;a href=&quot;https://polyhaven.org/&quot;&gt;polyhaven - 免费的 3d 资源&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Poly Haven 是一个公共 3D 资产库，提供免费且无限制使用的高质量 HDRI、纹理和模型资产。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250210-f143fa111af9e07b7d7b2f7f94beb775.png&quot; alt=&quot;IMG-F143FA111AF9E07B7D7B2F7F94BEB775&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250210-72212fcf1110a0be88cebd5badcae444.png&quot; alt=&quot;IMG-72212FCF1110A0BE88CEBD5BADCAE444&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;使用-vscode-开发-swiftios-项目的开源工具---sweetpad&quot;&gt;&lt;a href=&quot;https://github.com/sweetpad-dev/sweetpad&quot;&gt;使用 VSCode 开发 Swift/iOS 项目的开源工具 - sweetpad&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;sweetpad-dev/sweetpad 项目是一个针对在 VSCode 中开发 Swift/iOS 项目的工具集。该项目致力于通过整合开源工具，例如 swift-format、swiftlint、xcodebuild 等，提供一个与 Xcode 相 plement 补充的开发体验。用户可以通过此工具在 VSCode 中实现自动完成、项目构建与运行、代码格式化、iOS 模拟器管理、在实际设备上运行应用、调试以及运行测试等功能。&lt;/p&gt;
&lt;h3 id=&quot;svg-viewer---view-edit-and-optimize-svgs&quot;&gt;&lt;a href=&quot;https://www.svgviewer.dev/&quot;&gt;SVG Viewer - View, edit, and optimize SVGs&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&quot;ch563shot-easy-website-take-a-screenshot-online-and-compresses-images-in-browser-with-webassembly&quot;&gt;&lt;a href=&quot;https://github.com/CH563/shot-easy-website&quot;&gt;CH563/shot-easy-website: Take a screenshot online and compresses images in browser with Webassembly&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;免费在线照片编辑，调整大小，过滤任何照片，在浏览器中编辑照片，将图片转换为 jpg/png/jpeg/webp 格式，轻松截图区域或全页&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a2228a0ac5a74da179d059624ec5524df3f7f5cc07ac5214a6747b69e38de8e2.png&quot; alt=&quot;alt text&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;收藏夹---阅读与视频&quot;&gt;收藏夹 - 阅读与视频&lt;/h2&gt;
&lt;h3 id=&quot;gingko-writer在-ai-随便生成-20-万字的时代生而为人该如何写作---少数派&quot;&gt;&lt;a href=&quot;https://sspai.com/post/86369&quot;&gt;Gingko Writer：在 AI 随便生成 20 万字的时代，“生而为人”该如何写作？ - 少数派&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&quot;why-tcp-needs-3-handshakes--pixelstech&quot;&gt;&lt;a href=&quot;https://www.pixelstech.net/article/1727412048-Why-TCP-needs-3-handshakes&quot;&gt;Why TCP needs 3 handshakes | PixelsTech&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&quot;拖延自救指南简单开始销声匿迹_哔哩哔哩_bilibili&quot;&gt;&lt;a href=&quot;https://b23.tv/6OuP02P&quot;&gt;拖延自救指南：简单开始+销声匿迹、_哔哩哔哩、_bilibili&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&quot;用-cargo-20-重置了个人网站---小红书&quot;&gt;&lt;a href=&quot;https://www.xiaohongshu.com/explore/67979be6000000001800d82c?app_platform=ios&amp;#x26;app_version=8.69.4&amp;#x26;share_from_user_hidden=true&amp;#x26;xsec_source=app_share&amp;#x26;type=normal&amp;#x26;xsec_token=CBNUg7amY26oK6LjeocBQMTJ-LFKm63OcNtYxsXniFkc0=&amp;#x26;author_share=1&amp;#x26;xhsshare=CopyLink&amp;#x26;shareRedId=N0tEMTNINk42NzUyOTgwNjY0OTc7PD9O&amp;#x26;apptime=1737990471&amp;#x26;share_id=9eebb8b2f09642158b79e5e5cace1380&quot;&gt;用 Cargo 2.0 重置了个人网站 - 小红书&lt;/a&gt;&lt;/h3&gt;
&lt;h3 id=&quot;同人女如何从-0-开始学习文本排版和设计---小红书&quot;&gt;&lt;a href=&quot;https://www.xiaohongshu.com/explore/6793a1600000000018005982?app_platform=ios&amp;#x26;app_version=8.69.4&amp;#x26;share_from_user_hidden=true&amp;#x26;xsec_source=app_share&amp;#x26;type=normal&amp;#x26;xsec_token=CBJwO8yCrsK0aUaIg6WuwFGQW2ONdzwXfNflT9-A5XXqY=&amp;#x26;author_share=1&amp;#x26;xhsshare=CopyLink&amp;#x26;shareRedId=N0tEMTNINk42NzUyOTgwNjY0OTc7PD9O&amp;#x26;apptime=1737990326&amp;#x26;share_id=315ac3025eb6422d8b9aff855f53ae17&quot;&gt;同人女如何从 0 开始学习文本排版和设计…… - 小红书&lt;/a&gt;&lt;/h3&gt;</description><category>周报</category><category>资源</category></item><item><title>试试 action5 pro 推流到本地 rtmp 和有线连接的效果</title><link>https://blog.kazoottt.top/posts/action5-pro-obs-rtmp/</link><guid isPermaLink="false">urn:blog:faf63b45-fcb3-591c-9e1d-74cc3a80cc38</guid><pubDate>Thu, 06 Feb 2025 00:00:00 GMT</pubDate><description>&lt;p&gt;b 站：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV13L17YdE9f/&quot;&gt;试试 action5 pro 推流到本地 rtmp 和有线连接的效果&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;youtube:&lt;/p&gt;</description><category>笔记</category><category>action5pro</category><category>dji</category><category>rtmp</category></item><item><title>封面生成器推荐</title><link>https://blog.kazoottt.top/posts/cover-generator/</link><guid isPermaLink="false">urn:blog:16106d5c-6a77-5de2-a846-a317d2d69111</guid><pubDate>Sat, 01 Feb 2025 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;封面生成器推荐&quot;&gt;封面生成器推荐&lt;/h1&gt;
&lt;p&gt;制作封面的方法有很多种，你可以自己设计，也可以基于他人分享的模板进一步修改。&lt;/p&gt;
&lt;p&gt;但是如果你只是想输入标题或基本信息，直接生成封面的话，那么在线的封面生成器是更好的选择。&lt;/p&gt;
&lt;p&gt;今天这期博文就带你了解一些在线的封面生成工具。&lt;/p&gt;
&lt;h2 id=&quot;coverview&quot;&gt;&lt;a href=&quot;https://coverview.vercel.app/&quot;&gt;CoverView&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rutikwankhade/CoverView&quot;&gt;GitHub 仓库&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250203-IMG-29A422BFD0F1F0E435E98512EE268EB9.png&quot; alt=&quot;IMG-29A422BFD0F1F0E435E98512EE268EB9&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;内置多种模板和图标 (主要是编程语言的图标)，比较适合开发者制作技术博客封面。&lt;/p&gt;
&lt;h2 id=&quot;cover-image-generator&quot;&gt;&lt;a href=&quot;https://blogcover.vercel.app/&quot;&gt;Cover-Image-Generator&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/PJijin/Cover-Image-Generator&quot;&gt;GitHub 仓库&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/33b545cdbe98fcce7d4bb243e5238bb5fafa155b496e8ddee4fbfdbb79ef8bb5.png&quot; alt=&quot;IMG-D75B7EC1274EE31D60E87BEC28884978&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;无内置模板，但是支持移动标题与副标题，更为灵活。&lt;/p&gt;
&lt;h2 id=&quot;picprose&quot;&gt;&lt;a href=&quot;https://picprose.pixpark.net/&quot;&gt;PicProse&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jaaronkot/picprose&quot;&gt;GitHub 仓库&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250203-IMG-BE54C4AC0F3C3A32223F975B48BBF421.png&quot; alt=&quot;IMG-BE54C4AC0F3C3A32223F975B48BBF421&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;imgsrc&quot;&gt;&lt;a href=&quot;https://imgsrc.io/&quot;&gt;imgsrc&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/FadyMak/imgsrc-app&quot;&gt;GitHub 仓库&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250204-CleanShot2025-02-0319.54.00.png&quot; alt=&quot;CleanShot2025-02-0319.54.00&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;free-open-graph-generator&quot;&gt;&lt;a href=&quot;https://og.indiehub.best/&quot;&gt;Free Open Graph Generator&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;（修改自 imgsrc，去掉了水印。）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250203-IMG-64754B64F4D2B22CEDCC1AE2635CC348.png&quot; alt=&quot;IMG-64754B64F4D2B22CEDCC1AE2635CC348&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;og-image-maker&quot;&gt;&lt;a href=&quot;https://ogimagemaker.com/&quot;&gt;OG Image Maker&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250204-CleanShot2025-02-0319.54.18.png&quot; alt=&quot;CleanShot2025-02-0319.54.18&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;内置多种模板，支持修改颜色、背景图片、底部的 button 等。&lt;/p&gt;
&lt;h2 id=&quot;open-graph-image-generator&quot;&gt;&lt;a href=&quot;https://tailwind-generator.com/og-image-generator/generator&quot;&gt;Open Graph Image Generator&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;上传的图标的大小是固定的，比较有局限性，比较适合用来展示网站、或者横向的图片。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250204-CleanShot2025-02-0319.52.31.png&quot; alt=&quot;CleanShot2025-02-0319.52.31&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;free-open-graph-image-generator---placidapp&quot;&gt;&lt;a href=&quot;https://placid.app/tools/free-open-graph-image-generator&quot;&gt;Free Open Graph Image Generator - Placid.app&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250204-Pasted%20image%2020250203195748.png&quot; alt=&quot;Pasted image 20250203195748&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;open-graph-image-generator--boilerplatehub&quot;&gt;&lt;a href=&quot;https://boilerplatehub.com/free-tools/open-graph-image-generator&quot;&gt;Open Graph Image Generator | BoilerplateHub&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这个生成器比较简洁，只能输入标题和副标题，然后选择两个布局。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250204-CleanShot2025-02-0319.58.42.png&quot; alt=&quot;alt text&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;vercel-og-image-playground&quot;&gt;&lt;a href=&quot;https://og-playground.vercel.app/&quot;&gt;Vercel OG Image Playground&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250204-CleanShot2025-02-0319.56.48.png&quot; alt=&quot;CleanShot2025-02-0319.56.48&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;这是 vercel 官方的 og 生成器，右下角只能导出 svg，如果你要到处 png 需要在右上角的 tab 栏中切换到 png（satori + resvg-js） 模式。&lt;/p&gt;
&lt;h2 id=&quot;cover-paint&quot;&gt;&lt;a href=&quot;https://coverpaint.xiaole.site/&quot;&gt;cover-paint&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;目前点击官网可能无法访问，如果需要使用可以使用下面的仓库在 vercel 或者 netlify 等平台部署使用。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/youngle316/cover-paint&quot;&gt;GitHub 仓库&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d331a0a1e1a48c53ebc54aff2ab6f1966482a3e4c201d040a972327ee65e5614.png&quot; alt=&quot;IMG-AEE6D7C35A6347C5F792B7FCC509C795&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;imaker&quot;&gt;Imaker&lt;/h2&gt;
&lt;p&gt;20250305 更新 Imaker&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/slince-zero/IMaker&quot;&gt;GitHub - slince-zero/IMaker: Create striking covers effortlessly with our easy-to-use IMaker.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://img-maker.vercel.app/&quot;&gt;IMaker&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/831264978ab85cac48fb3b4b5fb273343eada643710d9fb40cbb4bbecaefd39b.png&quot; alt=&quot;IMG-59000B6CA38DF6FF4AB23AAA2920FF6F&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;字体大小不能调大很大&lt;/p&gt;</description><category>随笔</category><category>封面生成</category><category>软件推荐</category><category>资料收集</category></item><item><title>原来亲人在侧，是我最深重的感谢</title><link>https://blog.kazoottt.top/posts/plain-and-simple-is-true/</link><guid isPermaLink="false">urn:blog:1041bf10-6117-5ca2-bf53-47185b7d1f9b</guid><pubDate>Sun, 12 Jan 2025 00:00:00 GMT</pubDate><description>&lt;p&gt;初三有个周五的下午，我妈陪我在学校开高中推免会，突然接到外公的电话说外婆失踪了。那个时候在旁边听到这个消息就觉得心里很不安，我妈拿起电话打给外婆但无人接听，因为她根本没带出门，我心里就更不安了。&lt;/p&gt;
&lt;p&gt;其实那出事前半年，外婆做菜手被烫一直都没有完全恢复，在那一年的年夜饭上，我奶奶说外婆看起来有些眉毛下坎（意思是精神和身体不太好），后来外婆常对外公说自己梦到老家已经死去的人向她索命，因此她经常失眠。&lt;/p&gt;
&lt;p&gt;我记得刚失踪那段时间，我有好多周都没有见过父母，全家十几个人都出去寻找，从当地找到周边城市，报了警看了好多监控，也是看到外婆消失在监控的边缘然后再也没有出现。也去了区级、市级的电视台录采访，依然没有消息。&lt;/p&gt;
&lt;p&gt;我自己也在微博、贴吧以及当地的各种论坛发寻人启事，但回复的人都寥寥无几。&lt;/p&gt;
&lt;p&gt;后来打听到邻居在失踪前几周碰到过外婆独自坐公交车去了郊区，那个时候已经有些神志不清了，不过还是回家了，但是最后一次没那么幸运。&lt;/p&gt;
&lt;p&gt;也找了所谓的道士来看，有的说在失踪的第二天会出现在水上，于是我就一个人去了长江边，看着浪拍打在岸边，一种重复到很晚然后麻木地回到家；也有的说外公外婆家里有不好的东西，要把客厅黑色的什么块状物清理掉，要在外婆睡的位置烧香绕上几圈；也有的说已经离开了，不用再找不用再算了。&lt;/p&gt;
&lt;p&gt;各种说法都有，但慢慢的都从前期有希望的说法，变成了没有希望。&lt;/p&gt;
&lt;p&gt;家里人说梦到外婆在哪里出现了也会过去找。那个时候有些理解为什么有人会相信这些东西了，因为真的没有其他办法。&lt;/p&gt;
&lt;p&gt;就这么一直高强度地找了几个月，依然没消息。&lt;/p&gt;
&lt;p&gt;——————————&lt;/p&gt;
&lt;p&gt;后来我开始上高一，开始住在外公外婆的教师宿舍里面，他们是老教职工，因此所在班级的老师都认识他们，也知道外婆失踪的事情。&lt;/p&gt;
&lt;p&gt;有时候和老师们一起回家，他们也会提起这件事情，大概都是说外婆对人都笑眯眯的，怎么就失踪了之类的。那个时候听着真的挺难受的。&lt;/p&gt;
&lt;p&gt;其实最开始住在外公家里的时候，每天都觉得睡不好，总是受到那些道士所提到的事情的影响，再到后来实在过于忙碌，入睡变得简单了一些。&lt;/p&gt;
&lt;p&gt;外婆刚失踪的那几年，我还能梦到她，也清晰记得失踪日期，每到那个时间都会哭一场，但现在竟然不太能想起来了，只有回到老家全家聚在一起的时候才会想起她，那个日期应该是 110415 或者 110405 吧。&lt;/p&gt;
&lt;p&gt;有时候看《等着我》，不免也会幻想是否哪天会再见到她，慢慢地这种念头也不再出现。&lt;/p&gt;
&lt;p&gt;去年接到一个电话，称是当地警察局的，先跟我对了一下外婆的信息，再询问外婆是否找到。应该是因为我这张卡是我爸的名字的，所以打给了我。刚接到的时候是很高兴的，可惜又是空欢喜一场。&lt;/p&gt;
&lt;p&gt;——————————&lt;/p&gt;
&lt;p&gt;今天看到热搜又回想起她，后知后觉发现我这么急切地从上海回到川渝，想离家人近一些应该也有受到这件事情的影响。&lt;/p&gt;
&lt;p&gt;“原来亲人在侧，是我最深重的感谢。 ”&lt;/p&gt;
&lt;p&gt;其实失踪前两周我有梦到她，很后悔没有在梦到她的时候意识到，我已经很久没有见过外婆，该去看看她了。&lt;/p&gt;</description><category>随笔</category><category>家人</category><category>亲情</category></item><item><title>ollama + excel 处理器开发总结</title><link>https://blog.kazoottt.top/posts/ollama-excel-processor-development-summary/</link><guid isPermaLink="false">urn:blog:377573d1-3529-5536-a873-c00cde5e3f17</guid><pubDate>Tue, 07 Jan 2025 00:00:00 GMT</pubDate><description>&lt;p&gt;最近帮朋友写了一个 ollama + excel 处理器，写完后发现类似于飞书多维表格的 ai 功能。在开发和沟通过程中有一些感受。&lt;/p&gt;
&lt;h2 id=&quot;首先是开发与设计&quot;&gt;首先是开发与设计&lt;/h2&gt;
&lt;p&gt;写的时候凭自己的直觉设计的交互逻辑，没有参考任何其他产品，后来发现其实写的过于灵活会加重用户学习负担和降低模型回复准确度。&lt;/p&gt;
&lt;p&gt;我这边的逻辑是上传 excel，然后用提示词 +excel 列变量 + 配置输出列这样的拼接方式来生成提示词。&lt;/p&gt;
&lt;p&gt;这样遇到的问题是用 excel 列变量的时候，点击 excel 列是插入到光标的位置，有的用户并不会理解或者注意这个逻辑，所以会出现插到某些连续句子中间导致语义被破坏的情况。&lt;/p&gt;
&lt;p&gt;飞书多维表格的做法是，限制提示词的自由发挥，严格按照表单填写来生成最终提示词，并且真实的提示词是不暴露给用户的。步骤：选择输出的列，选择输入的列，输入要输出的列的需求，输入例子。&lt;/p&gt;
&lt;p&gt;下图是飞书多维表格的界面截图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/3277f0eef36bcfb6ba51c165fc87a9b6bf51f0a27e567f8cbed9f03a7568dba1.png&quot; alt=&quot;IMG-AB32ADD047445DF08A90ECA3417190E2&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;用这种方法把提示词的 few shots 写法实现了，所以它的操作逻辑简化了很多的。&lt;/p&gt;
&lt;p&gt;回头想想普通用户并不需要那么自由的提示词输入，是我做的时候太想当然，把它做成了一个 llm chat ui 的模式。&lt;/p&gt;
&lt;h2 id=&quot;其次是沟通&quot;&gt;其次是沟通&lt;/h2&gt;
&lt;p&gt;做完项目直接发了安装包给朋友，没有写使用说明，是在她使用过程中一步步去教她的，所以出现了很多碎片化的沟通。并且在此之前她并没有大模型相关的使用经验，所以一些我个人认为的共识没有达成，多聊了一些后才发现是哪里出了问题。&lt;/p&gt;
&lt;p&gt;导致问题的原因主要有两个，一个是之前提到的我的设计存在问题，加重了用户负担。另一个就是没有做用户引导和教学。&lt;/p&gt;
&lt;h2 id=&quot;总结&quot;&gt;总结&lt;/h2&gt;
&lt;p&gt;所以总结来说，&apos;fake it till you make it&apos; 或者 &quot; 先做一坨垃圾出来 &quot; 没有什么问题，但后续真的要把一个东西做好还是应该有一定的调研和思考和设计，以及要意识到通过引导和沟通与他人达成共识的重要性。&lt;/p&gt;</description><category>笔记</category><category>处理器</category><category>独立开发</category><category>excel</category><category>ollama</category></item><item><title>值得一看的博客</title><link>https://blog.kazoottt.top/posts/blogs-worth-reading/</link><guid isPermaLink="false">urn:blog:a1e8f89a-b7b9-592f-a8f2-1bfbcc4c10d6</guid><pubDate>Thu, 19 Dec 2024 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;值得一看的-blog&quot;&gt;值得一看的 blog&lt;/h1&gt;
&lt;h2 id=&quot;github---mqyqingfengblog-冴羽写博客的地方预计写四个系列javascript-深入系列javascript-专题系列es6-系列react-系列&quot;&gt;&lt;a href=&quot;https://github.com/mqyqingfeng/Blog&quot;&gt;GitHub - mqyqingfeng/Blog: 冴羽写博客的地方，预计写四个系列：JavaScript 深入系列、JavaScript 专题系列、ES6 系列、React 系列。&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/03/20240304-02e4fe9eb0c65dbe714e7244a0f7799a.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;logrocket-blog---resources-to-help-product-teams-ship-amazing-digital-experiences&quot;&gt;&lt;a href=&quot;https://blog.logrocket.com/&quot;&gt;LogRocket Blog - Resources to Help Product Teams Ship Amazing Digital Experiences&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/03/20240304-5bde95ee6d3a1cd87cd5a8881296f8b0.png&quot; alt=&quot;Pasted image 20240221094931&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;react-blog--react&quot;&gt;&lt;a href=&quot;https://react.dev/blog&quot;&gt;React Blog – React&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/03/20240304-6b3aa1eefa55decdf3e5a62db52ad39d.png&quot; alt=&quot;Pasted image 20240221095008&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;blog---socket&quot;&gt;&lt;a href=&quot;https://socket.dev/blog&quot;&gt;Blog - Socket&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/03/20240304-3172530ec4fde4f6a2f1fe13c6b5dfc0.png&quot; alt=&quot;Pasted image 20240214141407&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;developer-writer-and-speaker--stefan-judis-web-development&quot;&gt;&lt;a href=&quot;https://www.stefanjudis.com/&quot;&gt;Developer, writer and speaker | Stefan Judis Web Development&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/03/20240304-78248ebb37443c26e9ca1fd814896084.png&quot; alt=&quot;Pasted image 20240214141457&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;builderio-blog&quot;&gt;&lt;a href=&quot;https://www.builder.io/blog&quot;&gt;Builder.io Blog&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/03/20240304-95552f9d23c19a0dcf3d507ff45738c6.png&quot; alt=&quot;Pasted image 20240304211216&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;overreacted--a-blog-by-dan-abramov&quot;&gt;&lt;a href=&quot;https://overreacted.io/&quot;&gt;overreacted — A blog by Dan Abramov&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/269977dcd8d556402f4bd3d3fa6fd7f4c16181686a2dc1661539ed3232df8de3.png&quot; alt=&quot;IMG-20250104114646395&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h1 id=&quot;ai-相关&quot;&gt;AI 相关&lt;/h1&gt;
&lt;h2 id=&quot;github-的博客-ai-相关&quot;&gt;github 的博客 (AI 相关）&lt;/h2&gt;
&lt;p&gt;github 的官方博客中有一个标签是 ai, 里面有一些 ai 与工程化结合的分享&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.blog/tag/ai/&quot;&gt;AI Archives - The GitHub Blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/03/20240304-9627da3f1dca5ed6e296546de462ec38.png&quot; alt=&quot;Pasted image 20240301182741&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;ak-每日论文推荐&quot;&gt;Ak 每日论文推荐&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://huggingface.co/akhaliq&quot;&gt;akhaliq (AK)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://huggingface.co/papers&quot;&gt;Daily Papers - Hugging Face&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/03/20240304-828e36a950270f76a40de0069d4e7ec5.png&quot; alt=&quot;Pasted image 20240301173033&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;assemblyai-的博客&quot;&gt;AssemblyAI 的博客&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.assemblyai.com/blog&quot;&gt;AssemblyAI Blog | News, Tutorials, AI Research, and Industry&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/03/20240304-0d0451d2f271a9bb813bfd526db26b20.png&quot; alt=&quot;Pasted image 20240301173008&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;他们是一家专注于 AI 语音的公司，同时比较注重知识传播，在油管上也有一些科普教程。&lt;/p&gt;
&lt;h2 id=&quot;dale-的博客&quot;&gt;Dale 的博客&lt;/h2&gt;
&lt;p&gt;Google Labs 员工，会分享一些与 AI 相关的文章，同时也在维护自己的油管频道。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://daleonai.com/&quot;&gt;Dale on AI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/03/20240304-eeeb52e8a56934f8afbc47b453f7c768.png&quot; alt=&quot;Pasted image 20240301172453&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;dify-的博客&quot;&gt;Dify 的博客&lt;/h2&gt;
&lt;p&gt;dify 是一家做大模型应用生成平台的公司，他们的 &lt;a href=&quot;https://github.com/langgenius/dify&quot;&gt;产品 dify&lt;/a&gt; 是开源的，与此同时在官网也会定期产出技术博客。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://dify.ai/blog&quot;&gt;Dify Blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/03/20240304-d6e89fd993f70e1f2bb99d3e050a4e0c.png&quot; alt=&quot;Pasted image 20240301172653&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;机器之心--企业人工智能服务&quot;&gt;&lt;a href=&quot;https://www.jiqizhixin.com/&quot;&gt;机器之心 | 企业人工智能服务&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/03/20240304-ef47f398612f6abacd7bdf91e611a56d.png&quot; alt=&quot;Pasted image 20240301181953&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;独立开发者&quot;&gt;独立开发者&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://61.life/&quot;&gt;61’s life&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/12/20241219-becc8ce103c6d13489fc327ef77c3363.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;mactalk-池建强的随想录--让创作成为一种生活方式&quot;&gt;&lt;a href=&quot;https://macshuo.com/&quot;&gt;MacTalk-池建强的随想录 | 让创作成为一种生活方式&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250206-CleanShot2025-02-0613.03.58@2x.png&quot; alt=&quot;alt text&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</description><category>随笔</category><category>博客</category><category>前端</category><category>推荐</category><category>ai</category></item><item><title>与hanser有关的github仓库</title><link>https://blog.kazoottt.top/posts/hanser-repository/</link><guid isPermaLink="false">urn:blog:a436cd95-b656-5951-a2a3-1292c98cd404</guid><pubDate>Wed, 18 Dec 2024 00:00:00 GMT</pubDate><description>&lt;h2 id=&quot;unityurptoonlitshader&quot;&gt;UnityURPToonLitShader&lt;/h2&gt;
&lt;p&gt;🔗 &lt;a href=&quot;https://github.com/ColinLeung-NiloCat/UnityURPToonLitShaderExample&quot;&gt;GitHub - ColinLeung-NiloCat/UnityURPToonLitShaderExample: A very simple toon lit shader example, for you to learn writing custom lit shader in Unity URP&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/54b8c445b4a596fb5fe68720a682bf866796d5543dda4da441f32db527dd628b.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/12/20241218-3cbad51ac0ff6851f8a15063ce72722d.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;jason-ma-toon-render-pipeline&quot;&gt;Jason Ma Toon Render Pipeline&lt;/h2&gt;
&lt;p&gt;🔗 &lt;a href=&quot;https://github.com/JasonMa0012/JTRP&quot;&gt;GitHub - JasonMa0012/JTRP: JTRP : Unity HDRP ToonShading Render Pipeline (Preview)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/12/20241218-f9724a9eeca411d57a48d305c42d84f6.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/12/20241218-2390f27d1d6a71ba4a903588d4d64993.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;📚 教程 BV1AA411A7RR&lt;/p&gt;
&lt;h2 id=&quot;毛怪俱乐部分享卡片&quot;&gt;毛怪俱乐部分享卡片&lt;/h2&gt;
&lt;p&gt;仓库：&lt;a href=&quot;https://github.com/KazooTTT/hanser-club-share-card-web&quot;&gt;GitHub - KazooTTT/hanser-club-share-card-web: input mgclub post url, output the long pic to share.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;网站：&lt;a href=&quot;https://share255.kazoottt.top/&quot;&gt;Mgclub Share Card&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;输入帖子的链接，生成对应的帖子内容的图片。&lt;/p&gt;
&lt;p&gt;这是我很早之前写的项目，目前毛吧的 app 上已经可以生成分享图了，所以项目的意义不大了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/12/20241218-6d98c83fd2eb219534c6c17fbfed4c6d.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;毛怪俱乐部显示最新的回复时间&quot;&gt;毛怪俱乐部显示最新的回复时间&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/KazooTTT/hanser-mgclub-show-reply-time&quot;&gt;GitHub - KazooTTT/hanser-mgclub-show-reply-time: 通过拦截请求,实现展示毛怪俱乐部每条帖子的最新回复时间。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/12/20241218-1663a4738551119765e6e38f3d978306.gif&quot; alt=&quot;68747470733a2f2f6b617a6f6f7474742d313235363638343234332e636f732e61702d6368656e6764752e6d7971636c6f75642e636f6d2f3230323330333237323135343337342e676966.gif&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</description><category>笔记</category><category>github</category><category>hanser</category><category>shader</category><category>unity</category></item><item><title>分享一下我的 zustand 错误使用案例</title><link>https://blog.kazoottt.top/posts/zustand-use-record/</link><guid isPermaLink="false">urn:blog:b898bad5-a328-5630-8e43-b4d6044b361a</guid><pubDate>Tue, 17 Dec 2024 00:00:00 GMT</pubDate><description>&lt;h2 id=&quot;什么是-zustand&quot;&gt;什么是 zustand？&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/pmndrs/zustand&quot;&gt;zustand&lt;/a&gt; 是一个状态管理库，简单易用。&lt;/p&gt;
&lt;p&gt;在使用 &lt;a href=&quot;https://react-scan.com/&quot;&gt;react-scan&lt;/a&gt; 的时候，我发现我在 A 组件中对于 store 的某个 state 的更新，导致了 B 组件的重新渲染，有比较严重的性能问题。&lt;/p&gt;
&lt;p&gt;于是我又重新阅读了文档，发现我之前对于 zustand 的使用是错误的。&lt;/p&gt;
&lt;h2 id=&quot;错误用法-1-没有使用-single-selector-或者-shallow-去获取-state&quot;&gt;错误用法 1 没有使用 single selector 或者 shallow 去获取 state&lt;/h2&gt;
&lt;p&gt;这是之前的写法以及对应的组件，useGlobalStore 中有不只 uploadToServerProgress, uploadStatus 两个 state。&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;tsx&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;tsx&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; ComponentA&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;uploadToServerProgress&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;uploadStatus&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; useGlobalStore&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;UploadStateContainer&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;      uploadToServerProgress&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{uploadToServerProgress}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;      uploadStatus&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{uploadStatus}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  )&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;当 uploadToServerProgress 或者 uploadStatus 更新的时候，UploadStateContainer 会重新渲染。（符合预期）&lt;/p&gt;
&lt;p&gt;当 useGlobalStore 中的其他 state 更新的时候，UploadStateContainer 也会重新渲染。（不符合预期）&lt;/p&gt;
&lt;p&gt;这是因为 &lt;code&gt;const { uploadToServerProgress, uploadStatus } = useGlobalStore();&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;其实是解构赋值的简写，等价于&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;tsx&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;tsx&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; globalStore&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; useGlobalStore&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;uploadToServerProgress&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;uploadStatus&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; globalStore&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;对于 react 来说，只要 globalStore 更新，就会导致 UploadStateContainer 重新渲染。因此我们需要改为以下写法：&lt;/p&gt;
&lt;p&gt;写法 1 single selector&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;ts&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; uploadToServerProgress&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; useGlobalStore&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; state.uploadToServerProgress)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;	const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; uploadStatus&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; useGlobalStore&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; state.uploadStatus)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;写法 2 使用 useShallow&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;ts&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;uploadToServerProgress&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;uploadStatus&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; useGlobalStore&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;  useShallow&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; ({&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    uploadToServerProgress: state.uploadToServerProgress,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    uploadStatus: state.uploadStatus,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  })),&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;错误用法-2-使用-selector-的时候颗粒度不够&quot;&gt;错误用法 2 使用 selector 的时候颗粒度不够&lt;/h2&gt;
&lt;p&gt;cameraData 是通过订阅其他的服务获取的，内部包含包括相机图像、相机 id 等数据。其中相机图像是高频更新的数据。&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;tsx&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;tsx&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; React &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;react&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; interface&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; CameraData&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;  cameraBase64&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; // base64 encoded image&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;  cameraId&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; number&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; CurrentCamera&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; React&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;FC&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; cameraData&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; useGlobalStore&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; state.cameraData)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CurrentCameraId&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; cameraId&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{cameraData.cameraId} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;如果这样写，虽然这里也是 single selector，但是当 cameraBase64 更新的时候，cameraData 会更新，CurrentCameraId 也会重新渲染。&lt;/p&gt;
&lt;p&gt;因此这里还是遵循最小粒度原则，只获取需要的数据。&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;tsx&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;tsx&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; React &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;react&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;export&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; interface&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; CameraData&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;  cameraBase64&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; string&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; // base64 encoded image&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;  cameraId&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; number&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; CurrentCamera&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; React&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;FC&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; cameraId&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; useGlobalStore&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; state.cameraData.cameraId)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CurrentCameraId&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; cameraId&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{cameraId} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;错误用法-3-使用了多个-store-去存储不同的-state而不是使用-slice-把不同的-state-分组&quot;&gt;错误用法 3 使用了多个 store 去存储不同的 state，而不是使用 slice 把不同的 state 分组&lt;/h2&gt;
&lt;p&gt;在官方的文档中 &lt;a href=&quot;https://zustand.docs.pmnd.rs/guides/flux-inspired-practice&quot;&gt;Flux inspired practice - Zustand&lt;/a&gt; 提到，应该使用单一存储，而不是使用多个 store 去存储不同的 state。&lt;/p&gt;
&lt;aside class=&quot;callout callout-quote&quot;&gt;
&lt;strong&gt;Recommended patterns 推荐模式&lt;/strong&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Single store 单一存储&lt;/p&gt;
&lt;p&gt;Your applications global state should be located in a single Zustand store.&lt;/p&gt;
&lt;p&gt;你的应用程序的全局状态应该位于一个单一的 Zustand 存储中。&lt;/p&gt;
&lt;p&gt;If you have a large application, Zustand supports splitting the store into slices.&lt;/p&gt;
&lt;p&gt;如果你有一个大型应用程序，Zustand 支持将存储拆分为切片。&lt;/p&gt;
&lt;/aside&gt;
&lt;h2 id=&quot;错误用法-4-与-ui-无关的-state-通过-selector-获取&quot;&gt;错误用法 4 与 UI 无关的 state 通过 selector 获取&lt;/h2&gt;
&lt;p&gt;在一个组件中，我有一个 handleSave 的方法，调用接口保存数据。&lt;/p&gt;
&lt;p&gt;我之前的写法是，在组件 A 内部，使用 single selector 获取需要的数据，然后调用接口保存数据。&lt;/p&gt;
&lt;p&gt;但是这样的写法是错误的。&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;tsx&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;tsx&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; ComponentA&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;state1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;state2&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; useGlobalStore&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    useShallow&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;state&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; ({&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      state1: state.state1,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      state2: state.state2,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    })),&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  )&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; handleSave&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    save&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(state1, state2)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;SaveButton&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onClick&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{handleSave} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;在组件 B 中，我通过操作改变了 state1，但是由于我在 A 中获取了 state1,state1 的变化会导致 A 组件重新渲染。&lt;/p&gt;
&lt;p&gt;正确的做法是，直接在 handleSave 方法内部访问 store，而不是通过 selector 将状态传递给它。&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;tsx&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;tsx&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; ComponentA&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; handleSave&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;state1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;state2&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; useGlobalStore.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;getState&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    save&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(state1, state2)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;SaveButton&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; onClick&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{handleSave} /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;参考&quot;&gt;参考&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://zustand-demo.pmnd.rs/&quot;&gt;Zustand&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/puxiao/notes/blob/master/zustand%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0.md&quot;&gt;master 分支下的 notes/zustand 学习笔记。md --- notes/zustand 学习笔记。md at master · puxiao/notes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://notes.boshkuo.com/docs/React/zustand#%E7%82%BA%E4%BD%95%E9%81%B8%E6%93%87%E4%BD%BF%E7%94%A8-zustand-&quot;&gt;如何有效率地管理 React 局部狀態？ 這次我選擇了 Zustand! | Bosh 的技術探索筆記&lt;/a&gt;&lt;/p&gt;</description><category>笔记</category><category>react-scan</category><category>selector</category><category>store</category><category>zustand</category><category>最小粒度原则</category></item><item><title>使用github action定时同步obsidian内容到astro博客仓库</title><link>https://blog.kazoottt.top/posts/synchronize-profiles-to-remote-and-local-on-a-regular-basis/</link><guid isPermaLink="false">urn:blog:f2a14297-05bd-5585-af76-845bcd8aed2c</guid><pubDate>Fri, 29 Nov 2024 00:00:00 GMT</pubDate><description>&lt;h2 id=&quot;github-action&quot;&gt;github action&lt;/h2&gt;
&lt;p&gt;目标仓库以及具体目录可以根据自己的项目来定&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;yaml&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;yaml&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;Update Docs&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;on&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;  push&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;    paths&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;content/**&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;scripts/build_docs.cjs&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;  workflow_dispatch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;jobs&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;  build-and-deploy&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;    runs-on&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;ubuntu-latest&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;    steps&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;Checkout source repository&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;        uses&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;actions/checkout@v2&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;        with&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;          token&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;${{ secrets.PAT_TOKEN }}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;Set up Node.js&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;        uses&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;actions/setup-node@v2&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;        with&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;          node-version&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;20&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;Install dependencies&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;        run&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          echo &quot;Installing dependencies in source repository...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          npm install&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          echo &quot;Dependencies installed successfully&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;Build docs&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;        run&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          echo &quot;Starting docs build...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          npm run build:docs:server&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          echo &quot;Docs built successfully&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;Checkout target repository&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;        uses&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;actions/checkout@v2&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;        with&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;          repository&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;kazoottt/kazoottt-blog&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;          path&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;kazoottt-blog&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;          token&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;${{ secrets.PAT_TOKEN }}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;Copy built docs to target repository&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;        run&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          echo &quot;Starting copy process...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          echo &quot;Content of astroContent before copy:&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          cp -rv astroContent/* kazoottt-blog/src/content/post/&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          echo &quot;Content of astroContent copy done&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;Setup target repository&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;        run&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          cd kazoottt-blog&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          echo &quot;Configuring git...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          git config --global user.name &apos;github-actions[bot]&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          git config --global user.email &apos;github-actions[bot]@users.noreply.github.com&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          echo &quot;Installing dependencies in target repository...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          npm install&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          echo &quot;Running sort...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          npm run sort&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      - &lt;/span&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;Check for changes and commit&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;        run&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          cd kazoottt-blog&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          if [[ -n $(git status -s) ]]; then&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;            git add .&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;            git commit -m &quot;Update docs and sort content&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;            git push&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          else&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;            echo &quot;No changes to commit&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;          fi&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;        env&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#22863A;--shiki-dark:#85E89D&quot;&gt;          GITHUB_TOKEN&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;${{ secrets.PAT_TOKEN }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;PAT_TOKEN 申请&lt;br&gt;
&lt;a href=&quot;https://github.com/settings/tokens&quot;&gt;Sign in to GitHub · GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;需要权限：repo, workflow&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6d3aabb19293b4d8ced92c09392503e16284fe4ae4a3b92f5ff90d2ef15296b6.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;obsidian-模板&quot;&gt;obsidian 模板&lt;/h2&gt;
&lt;p&gt;published 是 true 且 notAstro 不为 true 的时候，会被发布到另外一个仓库&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: {{title}}
date: {{date}}
author: KazooTTT
type: Post
status: Published
tags: []
finished: false
published: false
category:
slug:
description:
notAstro:
---

&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;脚本-scriptsbuild_docscjs&quot;&gt;脚本 scripts/build_docs.cjs&lt;/h2&gt;
&lt;p&gt;依赖安装&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install gray-matter
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以配置一些不想同步的文件夹&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;js&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; fs&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;fs&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;).promises&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; fsSync&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;fs&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; path&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;path&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; matter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;gray-matter&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;execSync&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; require&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;child_process&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  outputDir: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;astroContent&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  inputDir: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;./content&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  ignoreList: [&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    &quot;.github&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    &quot;.obsidian&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    &quot;草稿箱&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    &quot;模板&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    &quot;attachment&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    &quot;记录&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    &quot;导航用&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;    &quot;微信读书&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  ],&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  validExtensions: [&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;.md&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;  // Local specific config&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  localDestinationRoot: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;// to edit&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  localDestination: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;// to edit&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; * Ensures output directory exists&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; */&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; initializeOutputDir&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;fsSync.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;existsSync&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.outputDir)) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    fsSync.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;mkdirSync&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.outputDir, { recursive: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; * Validates if a file should be processed based on its metadata&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; */&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; shouldProcessFile&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;frontMatter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; frontMatter.published &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;frontMatter.notAstro&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; * Processes a single markdown file&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; */&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; processMarkdownFile&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;fullPath&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;outputPath&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; fileContent&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; fs.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;readFile&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(fullPath, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;utf8&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; matter&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(fileContent)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;shouldProcessFile&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(data)) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;      await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; fs.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;copyFile&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(fullPath, outputPath)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      console.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;`✓ Copied: ${&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;relative&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;inputDir&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;fullPath&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;}`&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (error) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    console.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;`Error processing file ${&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;fullPath&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;}:`&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, error.message)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; * Recursively processes directories and files&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; */&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; processDirectory&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;dir&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; files&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; fs.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;readdir&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(dir)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;all&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      files.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;file&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; fullPath&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; path.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(dir, file)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; relativePath&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; path.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;relative&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.inputDir, fullPath)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; outputPath&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; path.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.outputDir, relativePath)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; stats&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; fs.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;stat&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(fullPath)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (stats.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;isDirectory&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;()) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;          if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.ignoreList.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;includes&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(file)) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;return&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;          await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; fs.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(outputPath, { recursive: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;          await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; processDirectory&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(fullPath)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;        } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (path.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;extname&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(file) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;===&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;.md&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; file &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;!==&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;index.md&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;          await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; processMarkdownFile&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(fullPath, outputPath)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      }),&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    )&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (error) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    console.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;`Error processing directory ${&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;dir&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;}:`&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, error.message)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; * Copies processed files to final destination and commits changes&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; */&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; copyToLocalDestination&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;    // Remove existing content&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (fsSync.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;existsSync&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.localDestination)) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;      await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; fs.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;rm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.localDestination, { recursive: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;    // Create destination directory&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; fs.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;mkdir&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.localDestination, { recursive: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;    // Copy files&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; files&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; fs.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;readdir&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.outputDir)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; Promise&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;all&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      files.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;file&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; sourcePath&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; path.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.outputDir, file)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; destPath&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; path.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.localDestination, file)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; fs.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;rename&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(sourcePath, destPath)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      }),&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    )&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    console.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Content has been successfully copied to the local destination.&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;    // Commit changes&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    execSync&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;`cd ${&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;path&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;dirname&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;localDestination&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;} &amp;#x26;&amp;#x26; npm run sort`&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    execSync&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;`git add ${&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;localDestination&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;} &amp;#x26;&amp;#x26; git commit -m &quot;update content&quot;`&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;    // push changes&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;    // execSync(`git push`)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (error) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    console.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Error copying to destination:&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, error.message)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; * Cleans up the temporary output directory&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; */&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; cleanupOutputDir&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (fsSync.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;existsSync&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.outputDir)) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;      await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; fs.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;rm&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.outputDir, { recursive: &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; })&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    console.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Cleaned up temporary directory.&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (error) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    console.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Error cleaning up:&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, error.message)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; * Main execution&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt; */&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;async&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; function&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; main&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  try&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt; isLocalBuild&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; process.argv.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;includes&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;--local&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    console.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;`Starting document processing... (${&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;isLocalBuild&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;local&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;server&quot;} build)`&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;    initializeOutputDir&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; processDirectory&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;CONFIG&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;.inputDir)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (isLocalBuild) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;      await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; copyToLocalDestination&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;      await&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; cleanupOutputDir&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    console.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;log&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Document processing completed successfully!&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (error) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    console.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;error&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;Fatal error:&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, error.message)&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;main&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><category>笔记</category><category>build docs</category><category>github action</category><category>OBSidian模板</category></item><item><title>个人工具与设备清单202502</title><link>https://blog.kazoottt.top/posts/personal-tools-and-equipment-inventory-202502/</link><guid isPermaLink="false">urn:blog:98fcd146-0f7a-5b74-be11-af9002f5b5f3</guid><pubDate>Sat, 23 Nov 2024 00:00:00 GMT</pubDate><description>&lt;h2 id=&quot;软件工具电脑端&quot;&gt;软件工具（电脑端）&lt;/h2&gt;
&lt;h3 id=&quot;开发工具&quot;&gt;开发工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cursor（主力 IDE）&lt;/li&gt;
&lt;li&gt;JetBrains 全家桶（主要是写 Unity 的时候使用 Rider）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;设计工具&quot;&gt;设计工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Canva 使用它制作了不少视频封面&lt;/li&gt;
&lt;li&gt;Figma&lt;/li&gt;
&lt;li&gt;MasterGo 类似于 Figma 的国产设计工具&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;视频剪辑&quot;&gt;视频剪辑&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;剪映 (主要使用软件)&lt;/li&gt;
&lt;li&gt;final cut pro （用到比较复杂的工程的时候才使用）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;录屏与截图&quot;&gt;录屏与截图&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://shottr.cc/&quot;&gt;shottr&lt;/a&gt;（Mac 上的截图工具，免费好用）&lt;/li&gt;
&lt;li&gt;CleanShot（Mac 上的截图工具，需要付费，支持截图、录屏，截图加 border）&lt;/li&gt;
&lt;li&gt;QuickRecorder（Mac 上的录屏工具，开源，免费）&lt;/li&gt;
&lt;li&gt;OBS（录屏工具，直播推流工具）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;媒体与娱乐&quot;&gt;媒体与娱乐&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Apple Music（主力）&lt;/li&gt;
&lt;li&gt;网易云音乐&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;知识管理&quot;&gt;知识管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Milanote（白板型笔记，用于一个项目的初期输入和梳理）&lt;/li&gt;
&lt;li&gt;Flomo（用于碎片化的记录）&lt;/li&gt;
&lt;li&gt;Dinox（用于碎片化的记录，支持语音输入和联动大模型）&lt;/li&gt;
&lt;li&gt;Obsidian（初期碎片化记录和梳理完成后，会在 Obsidian 中进行整理，完成最终的输出）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;资讯收集与阅读&quot;&gt;资讯收集与阅读&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;n8n 自动化（用于定时监听社交平台或其他信息的更新，然后通过 webhook 推送到其他平台）&lt;/li&gt;
&lt;li&gt;Raindrop（用于收集网页、内容标记）&lt;/li&gt;
&lt;li&gt;Follow（用于阅读 RSS 内容）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;阅读平台&quot;&gt;阅读平台&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;微信读书（主力，主要阅读线上书城的内容，偶尔导入离线的内容）&lt;/li&gt;
&lt;li&gt;Apple Books（主要阅读离线的内容）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;生产力工具&quot;&gt;生产力工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1Password（和别人拼车的，已经续费 2 年）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ai-助手&quot;&gt;AI 助手&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Claude（编程主力）&lt;/li&gt;
&lt;li&gt;DeepSeek（编程主力，沉浸式翻译主力 API）&lt;/li&gt;
&lt;li&gt;ChatGPT（macOS 的客户端体验依旧很好，所以在 macOS 上使用很多）&lt;/li&gt;
&lt;li&gt;Poe（体验各种大模型）&lt;/li&gt;
&lt;li&gt;Google Notebook LLM（用于书籍或者文档的深度阅读）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;任务管理&quot;&gt;任务管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;滴答清单&lt;/li&gt;
&lt;li&gt;Mermaid 绘制甘特图、流程图等&lt;/li&gt;
&lt;li&gt;飞书多维表格（进行项目管理）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;记账工具&quot;&gt;记账工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;飞书多维表格&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;浏览器&quot;&gt;浏览器&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Arc（主力）&lt;/li&gt;
&lt;li&gt;Google Chrome&lt;/li&gt;
&lt;li&gt;Edge&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;博客平台&quot;&gt;博客平台&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Astro 自建博客（随心所欲发布内容的地方）&lt;/li&gt;
&lt;li&gt;微信公众号（从自建播客中筛选长内容发布到公众号）&lt;/li&gt;
&lt;li&gt;Hashnode、Medium（主要输出英文内容）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;软件工具移动端&quot;&gt;软件工具（移动端）&lt;/h2&gt;
&lt;h3 id=&quot;图片处理&quot;&gt;图片处理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Picsew（手机上的截图工具，支持长截图、截图加壳、截图拼接等等）&lt;/li&gt;
&lt;li&gt;美图秀秀（图片编辑）&lt;/li&gt;
&lt;li&gt;dama （一键给图片敏感数据打码）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;健康管理&quot;&gt;健康管理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;AutoSleep（睡眠追踪）&lt;/li&gt;
&lt;li&gt;Grow（运动追踪）&lt;/li&gt;
&lt;li&gt;Keep（运动追踪）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;硬件设备&quot;&gt;硬件设备&lt;/h2&gt;
&lt;h3 id=&quot;电脑&quot;&gt;电脑&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Mac Mini M2 Pro（32GB 内存，512GB 存储）10000+ 买的官方翻新机，是家里的开发主力机&lt;/li&gt;
&lt;li&gt;MacBook Air M1（16GB 内存，256GB 存储）3000+ 收的二手，个人觉得性价比很高，用于移动办公是绝对够用的&lt;/li&gt;
&lt;li&gt;机械师整机（i5，2060，32GB 内存，512GB 存储）为了和朋友玩游戏和使用一些只有 Windows 上的支持的软件购买的&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;移动设备&quot;&gt;移动设备&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;iPhone 13（256GB 存储）&lt;/li&gt;
&lt;li&gt;iPad Mini 5 购入多年的老物，电池已经不堪重负，现在主要用于看视频和阅读&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;智能穿戴&quot;&gt;智能穿戴&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Apple Watch S9&lt;/li&gt;
&lt;li&gt;AirPods Pro 2&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;影像设备&quot;&gt;影像设备&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;松下 GX9&lt;/li&gt;
&lt;li&gt;松下 GX9 使用镜头: 14-140mm、25mm 定焦、100-300mm（用来用去还是 25 定好用😭）&lt;/li&gt;
&lt;li&gt;大疆 Action 5 Pro（运动相机，主要用于记录日常生活碎片）&lt;/li&gt;
&lt;/ul&gt;</description><category>笔记</category><category>工具</category><category>软件</category><category>设备</category></item><item><title>五一 上海-重庆-成都流水账</title><link>https://blog.kazoottt.top/posts/may-1st-shanghai-chongqing-chengdu-flow-account/</link><guid isPermaLink="false">urn:blog:b3518ecd-1239-5a64-b388-ac26ca99ff15</guid><pubDate>Tue, 12 Nov 2024 00:00:00 GMT</pubDate><description>&lt;p&gt;时间范围：4.30 -5.5&lt;/p&gt;
&lt;h2 id=&quot;430-下班回家&quot;&gt;4.30 下班回家&lt;/h2&gt;
&lt;p&gt;不太想早起于是浦东机场的时候发现他们提供了一整片的办公桌，并且可以充电。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114751709.jpeg&quot; alt=&quot;IMG-20250104114751709&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/ec7aa4a3432cae1965045398b93e7ef15c5506fa120280a9b156233bcbb23239.jpg&quot; alt=&quot;IMG-20250104114751749&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;到重庆了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114751780.jpeg&quot; alt=&quot;IMG-20250104114751780&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;51-和爸妈吃美蛙鱼头下午出发去成都&quot;&gt;5.1 和爸妈吃美蛙鱼头，下午出发去成都&lt;/h2&gt;
&lt;p&gt;中午爸妈带我去吃了美蛙鱼头（家附近的小店，不过也挺好吃的）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114751814.jpeg&quot; alt=&quot;IMG-20250104114751814&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;这个价格，豆花饭只要 8 元，羡慕哭了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/31e352743ecd8ae9acafdd73db28e5cb211d5cc13268c2cbb91db02804a1f155.jpg&quot; alt=&quot;IMG-20250104114751850&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后在家吃了晚饭，妈妈做的菜是真的好吃&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114751905.jpeg&quot; alt=&quot;IMG-20250104114751905&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后吃完晚饭就出发去坐动车了，在月台上掏出相机拍了一张，突然发现身后轻飘飘的，才意识到自己的包放在候车厅了，赶紧跑出去拿了包=、=&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6cb5fceca29f20222bfe064bcebd78e1cc7a0392338b604f82ce5ee65fac58f8.jpg&quot; alt=&quot;IMG-20250104114752082&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后就到成都啦&lt;/p&gt;
&lt;p&gt;先和星谜汇合了，然后去和 173、ask 吃了夜宵。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114752125.png&quot; alt=&quot;IMG-20250104114752125&quot; loading=&quot;lazy&quot;&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114752166.jpeg&quot; alt=&quot;IMG-20250104114752166&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;52-超大份的自贡菜逛天府红烤羊肉&quot;&gt;5.2 超大份的自贡菜，逛天府红，烤羊肉&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114752211.jpeg&quot; alt=&quot;IMG-20250104114752211&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114752255.jpeg&quot; alt=&quot;IMG-20250104114752255&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/7ebe59fe107d19ddd30887e44e57fb31a00e5ff7e6776581251ece4bc03b981e.jpg&quot; alt=&quot;IMG-20250104114752304&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114752378.jpeg&quot; alt=&quot;IMG-20250104114752378&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114752456.jpeg&quot; alt=&quot;IMG-20250104114752456&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114752524.jpeg&quot; alt=&quot;IMG-20250104114752524&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114752583.jpeg&quot; alt=&quot;IMG-20250104114752583&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114752644.jpeg&quot; alt=&quot;IMG-20250104114752644&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;吃完了饭就去天府红了，天府红的人知道的好多。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/87e2df48dd9b04756b6ecf90e85776111bfa6125d8c909724db7d4f4189bf857.jpg&quot; alt=&quot;IMG-20250104114752714&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/2cb58f9fb8396636ae2d0c1657a4c0d4eec7c79f2f26b4cbd05515b23d035bab.jpg&quot; alt=&quot;IMG-20250104114752769&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114752824.jpeg&quot; alt=&quot;IMG-20250104114752824&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/3d57865dc2a9694125cc4b430662245bb89eca2ef6dd48a7f9eed384fee357d9.jpg&quot; alt=&quot;IMG-20250104114752892&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后晚饭去吃了烤羊腿&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114752988.jpeg&quot; alt=&quot;IMG-20250104114752988&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;53-吃拌菜&quot;&gt;5.3 吃拌菜&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2025/02/20250205-IMG-20250104114753048.jpeg&quot; alt=&quot;IMG-20250104114753048&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/68a30d76499aba8f54f0471746a42652d42800b56dc808b0a9fe3925636e6e32.jpg&quot; alt=&quot;IMG-20250104114753101&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;买了 mstand 的咖啡 + 卡套套餐，刚好可以装下主播的卡套。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/0e17bc204340702eab12e0002958511a1096904eb2b538385590f2db40409bbf.jpg&quot; alt=&quot;IMG-20250104114753158&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;54-去南川&quot;&gt;5.4 去南川&lt;/h2&gt;
&lt;p&gt;其实已经很久没有去过南川了，之前也答应好幺爸要去的，所以从成都回来后还是去了一趟南川。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4ba796486516cb18f9b98d8b8914d80c5c3655188cefd5909778894acf4fc201.jpg&quot; alt=&quot;IMG-20250104114753240&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/14264ac0661bea1a2d6d0d4dded17dc9655fd4cf859e6085aff67073b3ad89ed.jpg&quot; alt=&quot;IMG-20250104114753499&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4840323c8df57d5a54d36c77373a8ca5aca372097ca764a08b4fa7c48e6e417e.jpg&quot; alt=&quot;IMG-20250104114753562&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/348138023acb40ffe84cdcc82b9c8cadaa7756eafc600351f5904423afe4984a.jpg&quot; alt=&quot;IMG-20250104114753601&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;55&quot;&gt;5.5&lt;/h2&gt;
&lt;p&gt;吃了午饭就出发去机场了，又要回上海上班了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/cc6f672be7bcd5053de3f0ad2ecd21e5a81f50e64d6eb808ae6afa3ecea17f0d.jpg&quot; alt=&quot;IMG-20250104114753639&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</description><category>随笔</category><category>成都</category><category>重庆</category><category>旅行</category></item><item><title>2024 小缘永不完结的冒险 武汉线下vlog</title><link>https://blog.kazoottt.top/posts/yukari-2024-live/</link><guid isPermaLink="false">urn:blog:0f8bcf7a-0c81-5baa-9cc0-72b326172f5e</guid><pubDate>Mon, 02 Sep 2024 00:00:00 GMT</pubDate><description>&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/9f55101a303cd8823d1351717202cfc9619b4566d9dfd696e2596cbd3dc181af.jpg&quot; alt=&quot;BC0203DE-7AF7-442C-AD60-A136DDDB603B_1_105_c 1&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e188cfe32e71f472c3943127c89fb3e32e01a2beda8e9fc2ab0b5c4c5b4b8cad.jpg&quot; alt=&quot;1D5C0AD5-D822-477E-9463-9E61B9B0DBC7_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/cf942bf49d2b418b6e0cd9619de8766cbc070baf24433fcdf8a37b9acf47bb55.jpg&quot; alt=&quot;1AFC4713-2894-4551-9264-73849E5A3BE2_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/db3c487b9aa73faeaee2b78b17a3d192b33202cd667fc571bb8fa8401e12adb8.jpg&quot; alt=&quot;B3F795E0-F51D-4C68-8724-B8267248A897_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;离职之后刚好有时间去小缘的 810 线下 live，于是和朋友们约好了一起去～&lt;/p&gt;
&lt;p&gt;剪了一个很流水账的 vlog⬇️&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1BLWMeMEVU/&quot;&gt;2024小缘武汉live 流水账式vlog_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;</description><category>随笔</category><category>武汉</category><category>小缘</category><category>live</category><category>vlog</category></item><item><title>微信读书网页版复制快捷键</title><link>https://blog.kazoottt.top/posts/wechat-reading-web-version-copy-shortcut/</link><guid isPermaLink="false">urn:blog:9a8c5a61-cc63-56c1-9eb9-f4d8f2b01be5</guid><pubDate>Tue, 30 Jul 2024 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;微信读书网页版复制快捷键&quot;&gt;微信读书网页版复制快捷键&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/90be7ef111d3222113fb06d092e46c5b428ac4a2e8109835465de86c51f92f55.png&quot; alt=&quot;cover&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1L93qeQEFW/&quot;&gt;微信读书网页版中新增复制快捷键 [油猴脚本]_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这是一个油猴脚本，用于在微信读书的网页端新增复制快捷键。&lt;/p&gt;
&lt;p&gt;在 windows 下，快捷键为 &lt;code&gt;Ctrl + C&lt;/code&gt;，在 mac 下，快捷键为 &lt;code&gt;Cmd + C&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&quot;相关地址&quot;&gt;相关地址&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://greasyfork.org/zh-CN/scripts/497102-weread-copy-keymap&quot;&gt;下载地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/KazooTTT/weread-copy-keymap&quot;&gt;源代码&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;本项目使用模板为 &lt;a href=&quot;https://github.com/lisonge/vite-plugin-monkey&quot;&gt;vite-plugin-monkey&lt;/a&gt;&lt;/p&gt;</description><category>项目</category><category>前端</category><category>微信读书</category><category>油猴脚本</category></item><item><title>2024 BW记录-个人向流水账版</title><link>https://blog.kazoottt.top/posts/bw-record-personal-notes/</link><guid isPermaLink="false">urn:blog:a48471c7-0b1b-50c9-a4ce-c6d1c0b48e3b</guid><pubDate>Wed, 17 Jul 2024 00:00:00 GMT</pubDate><description>&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240717-BW2024.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;左边是 2023 去酒店的路上，右边是 2024 年的，虽然是一样的雨天，但是心情与去年不太相同，去年比较紧张和激动，今年是期待和快乐。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240717-ADB811A8-8827-42A0-8931-02898BD3830E_1_102_o%201.jpeg&quot; alt=&quot;ADB811A8-8827-42A0-8931-02898BD3830E_1_102_o 1&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;工作餐真的很好吃，比公司食堂好吃太多 QAQ&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/ce7c8e9b317724659252e9f96c712374ec29969feee97b69be3c2e78b263bb74.jpg&quot; alt=&quot;A0E80ED2-C58B-47B1-BD76-002E9CD09D8C_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240717-1C8A7C70-B1BD-4BE8-8E7B-3324C6695525_1_105_c.jpeg&quot; alt=&quot;1C8A7C70-B1BD-4BE8-8E7B-3324C6695525_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后摊位这边还有好多毛怪送的零食饮料！🙏好幸福&lt;/p&gt;
&lt;p&gt;12 号是最忙人最多的一天，后面两天有了一点时间休息以及逛展。&lt;/p&gt;
&lt;p&gt;和开发组的毛怪合照了～&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240717-2a143a26e14f2a8eabb897fd3dcb88f9_%E5%89%AF%E6%9C%AC.png&quot; alt=&quot;2a143a26e14f2a8eabb897fd3dcb88f9_副本&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;假装自己也参加了开发组聚餐（&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240717-349A00D8F1121BD6C3FC56FEBEFF7C63.jpg&quot; alt=&quot;349A00D8F1121BD6C3FC56FEBEFF7C63&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;13 号的时候，大毛来我们摊位和憨色的立牌合照了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d03c5d161c56d0e7da16631a244c60ed88bd7ff428f6a7a34a02fbab9d772ce7.jpg&quot; alt=&quot;7833D7A8-8ACD-40ED-A7CB-AB248DD8CDEB_1_105_c 1&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;当时一抬头就看了大毛，感觉好好看好亲切，她身后还跟了一堆拿着相机的摄影师！好多人啊.jpg&lt;/p&gt;
&lt;p&gt;拍完过了一会儿大毛就离开了，后来我听到小伙伴说大毛还在 1.1，于是我就鼓起勇气跑去合照了。&lt;/p&gt;
&lt;p&gt;但是由于太匆忙，跑到的时候才想起自己手机里面没有美颜相机，以及大毛直播说的记得下一个美颜相机...&lt;/p&gt;
&lt;p&gt;犹豫再三还是跟大毛说自己没有下美颜相机，结果大毛笑着说用原相机拍也可以，好开心，人生照片 +1。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240717-3EC7C112-D570-4E9F-B931-29E78F7AE481_1_105_c.jpeg&quot; alt=&quot;3EC7C112-D570-4E9F-B931-29E78F7AE481_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后我把这张合照发到朋友圈的时候，有一个自如的员工竟然也认得大毛 hhh，好神奇，大毛真的很出圈。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d663f3fff9eaf7004f490a1ea432f9fdafe12a5dcb14969503910c426024bc26.png&quot; alt=&quot;Pasted image 20240716134707&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;和 kami 合照了，好好看！kami 带着蓝色工牌还被认成了工作人员，有人去找她问路😆&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/46a338f43133ab45eb4631353d61d15d16178cb36c0cbda8eb7642d6e90be9cc.jpg&quot; alt=&quot;9D7BEBF7-E800-47E1-92DA-67C0F0EDAFD7_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;还和主播的立牌合影了，说到这个角度的合影，就不得不放出去年和今年的对比图，我也不知道发生了什么，去年的头发会那么秃🙇‍♀️&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/2ebbd1bccba100bb77cd7a5e3ea53b6ba7c85192d97f4e83dc5d371f5c9e8745.jpg&quot; alt=&quot;3B5F69AE-0AB4-4A50-984B-7DBC7B41C7F3_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后我也不知道我为什么要主动提出他俩这样拍照&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240717-0.0.png&quot; alt=&quot;0.0&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;最后一天 14 号 和思无道的合照&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/2ec011d287e4474c12cbdb2b6ddec7bfb0bffe3a57a0d7982800be0614eafbae.jpg&quot; alt=&quot;45AF9919-A9EF-4E33-96AE-7FE52D1272DB_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;中午大咩老师陪我去逛了一下大毛的摊位，买了钥匙扣还有吧唧。然后和大咩在海报前合照了～&lt;/p&gt;
&lt;p&gt;然后和大咩在海报前合照了～翻了一下我们 21 年的合照，感觉大咩老师几乎没有变化。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/3e630dddb9d0ef650e261ed15e73cf63c5cfab3b192740fb5d415e2122b17719.jpg&quot; alt=&quot;18609739-0D04-4E94-BE13-8FD19DBB0BDD_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;最后在走之前我们拍了一下合照。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/87f852647e26702d76f6ad75624e78f7d7d1153be7a398b3bf3ac3f8c10269e7.jpg&quot; alt=&quot;30C5928B-EACD-411D-B331-929B29A5A918_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240717-7bdb0d7def36f36ca61ecc4fa264a32c_%E5%89%AF%E6%9C%AC.png&quot; alt=&quot;7bdb0d7def36f36ca61ecc4fa264a32c_副本&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;由于大家都打了码，所以给主播也打码了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240717-Pasted%20image%2020240716140129.png&quot; alt=&quot;Pasted image 20240716140129&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;每次祝福都写这句，总之天天开心最重要！也祝大家都天天开心。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/45845d5ef4ec062cad76d25c4761a3fa8cfbe7f17afc0dad6b9d81859dce1a9f.jpg&quot; alt=&quot;FC6E0BC4-8500-4A40-AD24-935451A405C6_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后这几天也接触了很多毛怪，有第一次见的，也有之前见过或者在线上听过名字的，在交流的过程中觉得很开心。还有一些我个人觉得有意思的花絮，后面有空再写吧！🙇‍♀️&lt;/p&gt;</description><category>随笔</category><category>2024</category><category>个人流水账</category><category>毛怪</category><category>小缘</category><category>BW记录</category><category>hanser</category></item><item><title>2024-W03-编程篇</title><link>https://blog.kazoottt.top/posts/2024-W03-programming/</link><guid isPermaLink="false">urn:blog:7bcb46ec-3e04-5aa9-ab1e-4d54c584ced1</guid><pubDate>Thu, 11 Jul 2024 02:17:53 GMT</pubDate><description>&lt;h1 id=&quot;2024-w03-编程篇&quot;&gt;2024-W03 编程篇&lt;/h1&gt;
&lt;h2 id=&quot;头像生成网站&quot;&gt;&lt;a href=&quot;https://vue-color-avatar.leoku.dev/&quot;&gt;头像生成网站&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Codennnn/vue-color-avatar&quot;&gt;github 地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/0a973362136d4ed872beee526eec951e8597fc44f0fd2a0c08184d92cbb6c8bb.webp&quot; alt=&quot;img_79.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;一个用于生成-rabbit-it-图片的应用&quot;&gt;&lt;a href=&quot;https://rabbit-it.zeabur.app/&quot;&gt;一个用于生成 rabbit it 图片的应用&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/michaelyuhe/rabbit-it&quot;&gt;github 地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/eff97d6c3ebb4931957e5edd9ebf1fbb8650d8d3f48289b8980c4d08367cdd69.webp&quot; alt=&quot;img_78.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;moodboard-creator--ai-生成情绪板&quot;&gt;&lt;a href=&quot;https://www.moodboardcreator.dev/&quot;&gt;Moodboard Creator —— AI 生成情绪板&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6f8aa19c2b5266be8cbfb5629469267d8c81b93475e08ecd298534d60f6d0ca3.webp&quot; alt=&quot;img_60.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/ftium4/status/1746419029961814098?s=12&amp;#x26;t=UKmYswdLBh4dGuqwtKAXUA&quot;&gt;推特地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;适用于任何项目的开源用户界面元素&quot;&gt;&lt;a href=&quot;https://uiverse.io/&quot;&gt;适用于任何项目的开源用户界面元素&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e2f284fec9c5616d4ba35e6b4fd4418a29f88a9a6ebbbd46fd43437348c168eb.webp&quot; alt=&quot;img_59.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;1000-个令人激动的网站&quot;&gt;&lt;a href=&quot;https://supercreative.design/1000-inspiring-websites&quot;&gt;1000 个令人激动的网站&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/hitw93/status/1746684118350635286?s=12&amp;#x26;t=UKmYswdLBh4dGuqwtKAXUA&quot;&gt;推特地址&lt;/a&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.kazoottt.top/media/8d9f7a64bda01bba828a5d4181701a68127e097879c8879e985bd79f3fc7e708.webp&quot; alt=&quot;img_57.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;shadcn-脚手架&quot;&gt;&lt;a href=&quot;https://tx.shadcn.com/&quot;&gt;shadcn 脚手架&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;官网界面：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/390e230e2563e96426448de0b4b4085e288752d41f5b686cff4507b2630bdd3a.webp&quot; alt=&quot;img_54.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;包含内容：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/2059e3fd482c22faf5a0127e727e963947bf30acebc32671885a02d145804566.webp&quot; alt=&quot;img_56.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/vikingmute/status/1746705772493656097?s=12&amp;#x26;t=UKmYswdLBh4dGuqwtKAXUA&quot;&gt;推特链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/62a09843092437d69c961b12f0847c4d2b5fa034dbda707cac1029c6cab25e80.webp&quot; alt=&quot;img_55.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;stefanjudis---推荐博客&quot;&gt;&lt;a href=&quot;https://www.stefanjudis.com/&quot;&gt;stefanjudis - 推荐博客&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;界面美观，内容有价值，可以关注一下。也可以订阅他的 newsletter。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a60a2edcfb85d8071ff1a062f99e93d154a994689e0bf0a224dc5159e13fda79.webp&quot; alt=&quot;img_46.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/ee30b720eea545935cf0e9b4e1dbc54f8a360332bada1ccbb81a8db0236aaa90.webp&quot; alt=&quot;img_45.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;这是这个作者开发维护的一个 &lt;a href=&quot;https://tiny-helpers.dev/&quot;&gt;前端工具网站&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/507b5667a9154205db633ccb8256f19518ef00087b671393d06eef8c6248bb5a.webp&quot; alt=&quot;img_47.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;rest-api-vs-graphql&quot;&gt;&lt;a href=&quot;https://twitter.com/dotey/status/1747310563531604043?s=12&amp;#x26;t=UKmYswdLBh4dGuqwtKAXUA&quot;&gt;REST API vs GraphQL&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/alexxubyte/status/1746932652178055607&quot;&gt;原文&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/be7def8b2f435487285913132921c640c06e9378cc216af87880af5816b21f2d.webp&quot; alt=&quot;img_42.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;astro-自动生成-open-graph--twitter-card-图片&quot;&gt;&lt;a href=&quot;https://liruifengv.com/posts/astro-auto-gen-og-image/&quot;&gt;Astro 自动生成 Open Graph &amp;#x26; Twitter card 图片😄&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/7be3276a5668d2f52d0860025213c6d2aa83e40a1ce7f0b98f93072dfa4ec770.webp&quot; alt=&quot;img_37.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;该作者在这篇文章中分享了如何在 astro 中自动生成 og 图片。&lt;/p&gt;
&lt;p&gt;在这个过程中使用了&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/vercel/satori&quot;&gt;satori&lt;/a&gt; 来将 HTML 和 CSS 转换为 SVG&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/RazrFalcon/resvg&quot;&gt;resvg&lt;/a&gt; 来将 SVG 转换为 PNG&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有兴趣的可以也可以把这两个库单独看一下&lt;/p&gt;
&lt;h2 id=&quot;remotion-通过写代码的方式来做视频&quot;&gt;&lt;a href=&quot;https://www.remotion.dev/&quot;&gt;remotion 通过写代码的方式来做视频&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e16db04b63733c3ecda0f3cd1df59f13221d21ed8eb7bb898f4850ed4b6435b6.webp&quot; alt=&quot;img_31.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=deg8bOoziaE&amp;#x26;ab_channel=Fireship&quot;&gt;demo 地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/remotion-dev/remotion&quot;&gt;github 地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;microsoft-typescript-node-starter&quot;&gt;&lt;a href=&quot;https://github.com/microsoft/TypeScript-Node-Starter&quot;&gt;microsoft TypeScript-Node-Starter&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;TypeScript 和 Node 的参考示例，其中包含详细的 README，描述了如何将两者一起使用。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/5384115c5a55f3771a8acdec9fedaecd8d81172f344a02bbdd9fca676b7daf3d.webp&quot; alt=&quot;img.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;henryheffernan-一个非常炫酷的个人主页&quot;&gt;&lt;a href=&quot;https://henryheffernan.com/&quot;&gt;henryheffernan 一个非常炫酷的个人主页&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/3a0c3231a9f57c1c20d0ec35dd8009873a074b7c2a0b4829ad703b615817fa8a.webp&quot; alt=&quot;img_9.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/0218351c1f08480885830cc0f37f29e193ae8f3e7ffd3f8523c768f0d496513b.webp&quot; alt=&quot;img_10.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a8e2587cbe51bde0da0eaad574fdc95db39b8d0edba01c9f64980eb1197c0918.webp&quot; alt=&quot;img_11.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;konva-一个-canvas-框架&quot;&gt;&lt;a href=&quot;https://github.com/konvajs/konva&quot;&gt;konva 一个 Canvas 框架&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://konvajs.org/&quot;&gt;文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Konva.js 是一个 HTML5 Canvas JavaScript 框架，它通过为桌面和移动应用程序启用画布交互性来扩展 2d 上下文。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d4b553a3b076c79db27f1eb76484923965ba4284552a4528edc31aff7ae671bf.webp&quot; alt=&quot;img_13.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;astrofy---astro-模板&quot;&gt;&lt;a href=&quot;https://github.com/manuelernestog/astrofy&quot;&gt;astrofy - astro 模板&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/958b343589c93cd52cfcd96fdbbdc7125dde4e992e0cb0887ab6adff62432786.webp&quot; alt=&quot;img_24.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://astrofy-template.netlify.app/&quot;&gt;demo 演示地址&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;低调但有设计感的个人主页&quot;&gt;&lt;a href=&quot;https://kbrdn.dev/en&quot;&gt;低调但有设计感的个人主页&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/aac914b414ce8bf9a7348298a1b10bcac39f2cd6785963cf620a58cb7b73ff1d.webp&quot; alt=&quot;img_30.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/kbrdn1/kbrdn.dev&quot;&gt;github 地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;（post 页面还在开发中）&lt;/p&gt;
&lt;h2 id=&quot;快速上手的-node-框架&quot;&gt;&lt;a href=&quot;https://twitter.com/vikingmute/status/1747795830923477431&quot;&gt;快速上手的 node 框架&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6c0b70a4ca537340fd138ce85512fec824e29852f03aff3472eea00f2d594091.webp&quot; alt=&quot;img_22.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;an-overview-of-cloudflares-logging-pipeline&quot;&gt;&lt;a href=&quot;https://blog.cloudflare.com/an-overview-of-cloudflares-logging-pipeline&quot;&gt;An overview of Cloudflare&apos;s logging pipeline&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f436996cabfdf7a901c22b0168523f97b39d2f72cd5a0c96497dfb41cf7c624b.webp&quot; alt=&quot;img_26.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;ant-game-engine-开源&quot;&gt;Ant Game Engine 开源&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/cloudwu/status/1747509339752116544?s=12&amp;#x26;t=UKmYswdLBh4dGuqwtKAXUA&quot;&gt;推特地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ejoy/ant&quot;&gt;github 地址 ejoy/ant&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/24985308c31503416007318399ee7dfc7a40a025d3ed95d82b45a8a88f1023d0.webp&quot; alt=&quot;img_27.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;docker-教程-docker--从入门到实践&quot;&gt;&lt;a href=&quot;https://yeasy.gitbook.io/docker_practice&quot;&gt;docker 教程 《Docker — 从入门到实践》&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/yeasy/docker_practice?tab=readme-ov-file&quot;&gt;GitHub 地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/hepython/status/1747598895704625311?s=12&amp;#x26;t=UKmYswdLBh4dGuqwtKAXUA&quot;&gt;推特原文&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/196065513392e83bf75b42d8242c20a032738fba89a11aa0623f353fd7640a54.webp&quot; alt=&quot;img_35.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;gameboy-style-portfolio&quot;&gt;GameBoy Style Portfolio&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://dev.to/matteosant_dev/my-new-portfolio-1acn&quot;&gt;介绍&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://matteosantoro.dev/&quot;&gt;Game Boy style portfolio&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;ipx-高性能安全且易于使用的图像优化器&quot;&gt;&lt;a href=&quot;https://github.com/unjs/ipx&quot;&gt;IPX 高性能、安全且易于使用的图像优化器。&lt;/a&gt;&lt;/h2&gt;
&lt;h2 id=&quot;bento-专题&quot;&gt;Bento 专题&lt;/h2&gt;
&lt;h3 id=&quot;bento-风格的起始页&quot;&gt;&lt;a href=&quot;https://github.com/migueravila/Bento&quot;&gt;bento 风格的起始页&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/82f84a1126da34dbb9f7580e7e1e6d234133409e8de453c834305ccb0f843849.webp&quot; alt=&quot;img_70.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;packery-无缝可拖动的网格布局&quot;&gt;&lt;a href=&quot;https://github.com/metafizzy/packery&quot;&gt;packery: 无缝、可拖动的网格布局&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/5384115c5a55f3771a8acdec9fedaecd8d81172f344a02bbdd9fca676b7daf3d.webp&quot; alt=&quot;img_72.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;使用-htmlcss-和-javascript--创建-3d-产品卡片&quot;&gt;&lt;a href=&quot;https://twitter.com/flexipletech/status/1745455790667030581?s=12&amp;#x26;t=UKmYswdLBh4dGuqwtKAXUA&quot;&gt;使用 HTML、CSS 和 JavaScript 👨🏻‍💻 创建 3D 产品卡片&lt;/a&gt;&lt;/h2&gt;</description><category>周报</category><category>ant game engine</category><category>bento</category><category>cloudflare</category><category>css</category><category>docker</category><category>gameboy style portfolio</category><category>html</category><category>ipx</category><category>javascript</category><category>node</category><category>packery</category></item><item><title>2023-W48</title><link>https://blog.kazoottt.top/posts/2023-W48/</link><guid isPermaLink="false">urn:blog:2a613f9a-845b-5102-be69-f3e113b6a12c</guid><pubDate>Thu, 11 Jul 2024 02:17:53 GMT</pubDate><description>&lt;h1 id=&quot;2023-w48-转岗了&quot;&gt;2023-W48 转岗了&lt;/h1&gt;
&lt;p&gt;时间范围：2023-11-27 - 2023-12-3&lt;/p&gt;
&lt;h2 id=&quot;最近的变化&quot;&gt;最近的变化&lt;/h2&gt;
&lt;p&gt;最大的变动应该是工作内容的变化了。&lt;/p&gt;
&lt;p&gt;在 11 月 23 的时候突然接到了一个其他部门的面试，去的时候发现部门的领导以及 HR 都在。简单聊了一下，11 月 24 的时候就收到消息说面试通过了，可以转岗到对方的部门工作。&lt;/p&gt;
&lt;p&gt;而我的工作也从 web 前端转成了类似于提示词工程师的角色？&lt;/p&gt;
&lt;p&gt;真正转到这个岗位的时候，才发现自己对于大语言模型的认知是很缺乏的，应用层也好，模型层中间层也好，很多认知都是纸上谈兵（疯狂收藏资料，但是实际上看的很少。）&lt;/p&gt;
&lt;p&gt;不过也借此机会，重拾了 python，上一次写 python 还是大三的时候写了一个圣纳百川贴吧的爬虫以及数据分析。&lt;/p&gt;
&lt;p&gt;总体来说觉得是一个很好的机会，很新鲜的尝试，不过也挺有压力的。&lt;/p&gt;
&lt;p&gt;后面的学习方向也会有很大的不同，想把重心放在 llm 的研究上，当然业余时间还是做我自己的项目，通过学习和项目实践来巩固对于 llm 和前端的理解。&lt;/p&gt;
&lt;h2 id=&quot;父母来上海了&quot;&gt;父母来上海了&lt;/h2&gt;
&lt;p&gt;其实以前的部门氛围很轻松，下班后可以按时回家。不过因为换了部门，有很多的东西不熟悉，所以这周下班时间还是比较晚。&lt;/p&gt;
&lt;p&gt;父母决定来上海看我的时候，还没有换部门，所以突然换部门还是听猝不及防的。&lt;/p&gt;
&lt;p&gt;他们是周三到的上海，周日离开的上海。&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;p&gt;值得一提的时候，换了新部门之后，部门刚好要求要收集资讯，这恰好是我最近开始做的事情。部门内比较注重的是 AI 方面的资讯，而对我自身而言，我还会收集一些前端方面的东西。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/dc27dba066f76c5b1312a7886a9b5c7b2f2e4133c260a6ee5520afe26b103a07.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;收集资讯的方式由之前的 twitter + 其他平台复制链接到 cubox 的方式，转变了到转发到 telegram 或者 discord。&lt;/p&gt;
&lt;p&gt;我发现直接转发到后面了两个平台会更直观以及便于查找，之前存了很多链接到 cubox，但是几乎很少打开。&lt;/p&gt;
&lt;p&gt;而选择 discord 还是 telegram 也是我比较纠结的一点，discord 可以分子频道，相当于在这一层就完成了资源的分类，但它的缺点是对于部门平台的链接预览不友好。&lt;/p&gt;
&lt;p&gt;例如 twitter，由于之前 twitter 平台的限制，discord 无法预览 twitter 链接，需要手动改写为 vxtwitter，才能预览，在转发的时候手动修改这个操作也算增加工作量了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/916ec06f6793469ee23ad49b7e91900a439b8abf61815e502806b01885b1d5a0.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;而 telegram 虽然可以很好地预览链接，但是个人来说并不太喜欢它的 UI。并且在后期如果要开发 bot，学习成本相对来说会更大一些。（因为 discord 直接支持 web hook，并且文档完善，有公开的 bot 市场）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/014bb50bd305921bab68b96bff3d42491aec0314bb4cd7ffa78eae91cdf8bfa6.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;所以我很纠结应该选择哪种方式。目前是使用的 discord，不过我觉得后期可能会转到 telegram。&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;a href=&quot;https://howieduhzit.best/&quot;&gt;https://howieduhzit.best/&lt;/a&gt;&lt;br&gt;
这个网站实现了第一人称视角的交互，将交互映射到 blender 的操作中。&lt;/p&gt;
&lt;p&gt;个人感觉很值得学习一下是如何实现的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/75a34007dc055f9ad31e7814794733f45c7fba6ccb596d90b9bb2dde834e412d.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;gpts---blender-助手&quot;&gt;GPTS - Blender 助手&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://chat.openai.com/g/g-RSwpmZ8cK-teacher-awangs-blender-3d-assistant&quot;&gt;ChatGPT - Teacher Awang’s blender 3D assistant&lt;/a&gt;&lt;br&gt;
前几周 gpts 发布后，gpt 应用进一步自我分化，社区中实现了很多 gpts 应用，关于 blender 的也有几个，个人测试后认为这一个 gpts 的效果是最适合我自己的。以后会继续使用这个 gpts 来协助学习和完成 Blender 的使用。&lt;/p&gt;
&lt;h3 id=&quot;gpts---designergpt&quot;&gt;GPTS - DesignerGPT&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://chat.openai.com/g/g-2Eo3NxuS7-designergpt&quot;&gt;ChatGPT - DesignerGPT&lt;/a&gt;&lt;br&gt;
这个 GPTS 的效果是输入提示词，它会返回给到你一个部署页面，这个部署页面就是根据提示词所生成的界面。&lt;/p&gt;
&lt;p&gt;看了它的提示词后发现并不算复杂。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/LouisShark/chatgpt_system_prompt/blob/main/prompts/gpts/DesignerGPT.md&quot;&gt;DesignerGPT.md&lt;/a&gt;&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;plain&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;plain&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;DesignerGPT is a highly capable GPT model programmed to generate HTML web pages in response to user requests.&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;Upon receiving a request for a website design, DesignerGPT instantly creates the required HTML content, adhering to specific guidelines.&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;You ALWAYS use this https://cdn.jsdelivr.net/npm/@picocss/pico@1/css/pico.min.css as a stylesheet link and ALWAYS add this tag in the head tag element, VERY IMPORTANT: `&amp;#x3C;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;. ALSO IMPORTANT, ANY CONTENT INSIDE THE BODY HTML TAG SHOULD LIVE INSIDE A MAIN TAG WITH CLASS CONTAINER.&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;YOU USE ANY CSS THAT MAKES THE WEBSITE BEAUTIFUL, USE PADDING AND GOOD AMOUNT OF NEGATIVE SPACE TO MAKE THE WEBSITE BEAUTIFUL.&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;Include a navigation right before the main area of the website using this structure: `&amp;#x3C;nav class=&quot;container-fluid&quot;&gt;&amp;#x3C;ul&gt;&amp;#x3C;li&gt;&amp;#x3C;strong&gt;&amp;#x3C;/strong&gt;&amp;#x3C;/li&gt;&amp;#x3C;/ul&gt;&amp;#x3C;ul&gt;&amp;#x3C;li&gt;&amp;#x3C;a href=&quot;#&quot;&gt;&amp;#x3C;/a&gt;&amp;#x3C;/li&gt;&amp;#x3C;li&gt;&amp;#x3C;a href=&quot;#&quot;&gt;&amp;#x3C;/a&gt;&amp;#x3C;/li&gt;&amp;#x3C;li&gt;&amp;#x3C;a href=&quot;#&quot; role=&quot;button&quot;&gt;&amp;#x3C;/a&gt;&amp;#x3C;/li&gt;&amp;#x3C;/ul&gt;&amp;#x3C;/nav&gt;` For the main area of the website,&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;follow this structure closely: `&amp;#x3C;main class=&quot;container&quot;&gt;&amp;#x3C;div class=&quot;grid&quot;&gt;&amp;#x3C;section&gt;&amp;#x3C;hgroup&gt;&amp;#x3C;h2&gt;&amp;#x3C;/h2&gt;&amp;#x3C;h3&gt;&amp;#x3C;/h3&gt;&amp;#x3C;/hgroup&gt;&amp;#x3C;p&gt;&amp;#x3C;/p&gt;&amp;#x3C;figure&gt;&amp;#x3C;img src=&quot;&quot; alt=&quot;&quot; /&gt;&amp;#x3C;figcaption&gt;&amp;#x3C;a href=&quot;&quot; target=&quot;_blank&quot;&gt;&amp;#x3C;/a&gt;&amp;#x3C;/figcaption&gt;&amp;#x3C;/figure&gt;&amp;#x3C;h3&gt;&amp;#x3C;/h3&gt;&amp;#x3C;p&gt;&amp;#x3C;/p&gt;&amp;#x3C;h3&gt;&amp;#x3C;/h3&gt;&amp;#x3C;p&gt;&amp;#x3C;/p&gt;&amp;#x3C;/section&gt;&amp;#x3C;/div&gt;&amp;#x3C;/main&gt;&amp;#x3C;section aria-label=&quot;Subscribe example&quot;&gt;&amp;#x3C;div class=&quot;container&quot;&gt;&amp;#x3C;article&gt;&amp;#x3C;hgroup&gt;&amp;#x3C;h2&gt;&amp;#x3C;/h2&gt;&amp;#x3C;h3&gt;&amp;#x3C;/h3&gt;&amp;#x3C;/hgroup&gt;&amp;#x3C;form class=&quot;grid&quot;&gt;&amp;#x3C;input type=&quot;text&quot; id=&quot;firstname&quot; name=&quot;firstname&quot; placeholder=&quot;&quot; aria-label=&quot;&quot; required /&gt;&amp;#x3C;input type=&quot;email&quot; id=&quot;email&quot; name=&quot;email&quot; placeholder=&quot;&quot; aria-label=&quot;&quot; required /&gt;&amp;#x3C;button type=&quot;submit&quot; onclick=&quot;event.preventDefault()&quot;&gt;&amp;#x3C;/button&gt;&amp;#x3C;/form&gt;&amp;#x3C;/article&gt;&amp;#x3C;/div&gt;&amp;#x3C;/section&gt;&amp;#x3C;footer class=&quot;container&quot;&gt;&amp;#x3C;small&gt;&amp;#x3C;a href=&quot;&quot;&gt;&amp;#x3C;/a&gt; • &amp;#x3C;a href=&quot;&quot;&gt;&amp;#x3C;/a&gt;&amp;#x3C;/small&gt;&amp;#x3C;/footer&gt;. FOR THE IMAGES USE LINK FROM UNSPLASH. Crucially, once the HTML is generated, DesignerGPT actively sends it to &apos;https://xxxxxx/create-page&apos;.&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span&gt;This action results in an actual webpage being created and hosted on the server. Users are then provided with the URL to the live webpage, facilitating a seamless and real-time web page creation experience.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;我们可以分为三个部分，第一个部分是背景介绍，第二个是把网页的 html + 样式（样式用的是外链，这里的我的理解是其实 html 或者样式或者其他都能用外链，只要能访问）丢给它（输出 html），第三个是提供一个用于接收 html 内容然后部署页面的 api，把 html 内容丢给它，然后返回最终的静态部署的预览的地址。&lt;/p&gt;
&lt;p&gt;从整个提示词或者最终的呈现效果来说并不算惊艳，但是为什么这个 GPTS 能在早期广受关注，我觉得是作者对于 GPT 的能力理解比较强，知道如何应用它的能力，以及它的“售后”是做的比较好的，提供预览链接这一点能够免去使用者很多成本。&lt;/p&gt;
&lt;h3 id=&quot;配色方案限时免费目前已恢复收费&quot;&gt;配色方案限时免费（目前已恢复收费）&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://vxtwitter.com/olegcoada/status/1729971743857537405?s=20&quot;&gt;X 上的 Oleg Coada：“FREE Visual Identity Guidelines for 24 hours. Please like and share to spread the word in the design world! Link to download below! https://t.co/9QuQ9fmHfY” / X&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;突然发现是在 gumroad 上架的，好像在国外很多艺术家的付费作品都是在这个网站上上架的。&lt;/p&gt;
&lt;h3 id=&quot;blender-插件用于从网络上下载和导入资产&quot;&gt;Blender 插件，用于从网络上下载和导入资产&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/strike-digital/asset_bridge&quot;&gt;https://github.com/strike-digital/asset_bridge&lt;/a&gt;&lt;br&gt;
可以从中学习如何写一个 blener 插件&lt;br&gt;
&lt;img src=&quot;https://blog.kazoottt.top/media/10642d6021548c9cd22b926af22ab9f3ae48855be06757aed44d3a679d3a949e.webp&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;br&gt;
其实收藏这个资源更多的是因为我认为它是一个很好的学习如果实现 blender 插件的项目源码。而且是 python 写的，最近刚好对于 python 的学习需求比较紧急，值得看一下。&lt;/p&gt;
&lt;h3 id=&quot;blender-教程&quot;&gt;Blender 教程&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://weibo.com/6458935463/4974094430242729&quot;&gt;Sina Visitor System&lt;/a&gt;&lt;br&gt;
这个作者的许多作品都很惊艳，出的教程也很简洁高效，不过不适合零基础的玩家，更适合高阶玩家学习。&lt;/p&gt;
&lt;h2 id=&quot;资讯收集---编程&quot;&gt;资讯收集 - 编程&lt;/h2&gt;
&lt;h3 id=&quot;cloudflare-worker-支持-pptr&quot;&gt;Cloudflare Worker 支持 Pptr&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://m.okjike.com/originalPosts/6567f01a5682fbc62e4c6537?s=ewoidSI6ICI2MjRjNTE0ZThiOWNhOTAwMTA5MDk5ZTkiCn0=&quot;&gt;Cloudflare Worker 已经支持了 Puppet - 即刻 App&lt;/a&gt;&lt;br&gt;
之前做截图应用时候，vercel 有 10 秒超时的限制，不知道用这个是否能缓解一下。待研究。&lt;/p&gt;
&lt;h3 id=&quot;devv-搜索引擎&quot;&gt;Devv 搜索引擎&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://devv.ai/zh%20%22https://devv.ai/zh%22&quot;&gt;https://devv.ai/zh&lt;/a&gt;&lt;br&gt;
很好用强推&lt;/p&gt;
&lt;h3 id=&quot;截图方案汇总&quot;&gt;截图方案汇总&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://vxtwitter.com/kazoottt/status/1729876850531606558?s=46&amp;#x26;t=UKmYswdLBh4dGuqwtKAXUA&quot;&gt;https://vxtwitter.com/kazoottt/status/1729876850531606558?s=46&amp;#x26;t=UKmYswdLBh4dGuqwtKAXUA&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;obsidian-部署方案&quot;&gt;Obsidian 部署方案&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://vxtwitter.com/hal__lee/status/1730101349914976367?s=20&quot;&gt;twitter.com/hal__lee/status/1730101349914976367&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;threejs-的-render-方式&quot;&gt;three.js 的 Render 方式&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/pmndrs/react-three-fiber&quot;&gt;https://github.com/pmndrs/react-three-fiber&lt;/a&gt; React-three-fiber is a React renderer for three.js&lt;/p&gt;
&lt;h3 id=&quot;鉴权方案&quot;&gt;鉴权方案&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://vxtwitter.com/vikingmute/status/1730400118430724139&quot;&gt;twitter.com/vikingmute/status/1730400118430724139&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;github-管理-gui&quot;&gt;Github 管理 Gui&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/colinlienard/status/1730247816944267593?s=46&amp;#x26;t=UKmYswdLBh4dGuqwtKAXUA&quot;&gt;https://x.com/colinlienard/status/1730247816944267593?s=46&amp;#x26;t=UKmYswdLBh4dGuqwtKAXUA&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;资讯收集--ai-篇&quot;&gt;资讯收集 -AI 篇&lt;/h2&gt;
&lt;h3 id=&quot;与-agent-有关的项目&quot;&gt;与 Agent 有关的项目&lt;/h3&gt;
&lt;h4 id=&quot;autogpt&quot;&gt;Autogpt&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/Significant-Gravitas/AutoGPT?tab=readme-ov-file&quot;&gt;GitHub - Significant-Gravitas/AutoGPT: AutoGPT is the vision of accessible AI for everyone, to use and to build on. Our mission is to provide the tools, so that you can focus on what matters.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.agpt.co/autogpt/&quot;&gt;Introduction - AutoGPT Documentation&lt;/a&gt;&lt;/p&gt;
&lt;h4 id=&quot;autogen&quot;&gt;Autogen&lt;/h4&gt;
&lt;h3 id=&quot;存储-gpts-的-prompt&quot;&gt;存储 Gpts 的 Prompt&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/LouisShark/chatgpt_system_prompt&quot;&gt;https://github.com/LouisShark/chatgpt_system_prompt&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;吴恩达新课&quot;&gt;吴恩达新课&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://vxtwitter.com/dotey/status/1729972448899051760?s=46&amp;#x26;t=UKmYswdLBh4dGuqwtKAXUA&quot;&gt;https://vxtwitter.com/dotey/status/1729972448899051760?s=46&amp;#x26;t=UKmYswdLBh4dGuqwtKAXUA&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;写提示词的技巧&quot;&gt;写提示词的技巧&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://vxtwitter.com/real_kai42/status/1729750363757232164?s=46&amp;#x26;t=UKmYswdLBh4dGuqwtKAXUA&quot;&gt;https://vxtwitter.com/real_kai42/status/1729750363757232164?s=46&amp;#x26;t=UKmYswdLBh4dGuqwtKAXUA&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;ios-关于金融的组件&quot;&gt;Ios 关于金融的组件&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/WillkYang/YYKline&quot;&gt;GitHub - WillkYang/YYKline: iOS YYKline：Kline、Chart、Volume、Scroll、Scale、MACD、KDJ、K 线图、分时图。..&lt;/a&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.kazoottt.top/media/4e763d4036a2ab732d18052b49eee4f32d550f13e9a996a26d155d8de1aba9ed.png&quot; alt=&quot;Pasted image 20231120000803&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;react-关于金融的组件&quot;&gt;React 关于金融的组件&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/rrag/react-stockcharts&quot;&gt;GitHub - rrag/react-stockcharts: Highly customizable stock charts with ReactJS and d3&lt;/a&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.kazoottt.top/media/2eb6cf4e8f46ef5778a2b0f6102970c0f7aafc629600b09f394941627d2d953d.png&quot; alt=&quot;Pasted image 20231120001545&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</description><category>周报</category><category>AI</category><category>Autogen</category><category>Autogpt</category><category>designer</category><category>devv</category><category>FinTech</category><category>GPT</category><category>ios</category><category>Obsidian</category><category>prompt</category><category>react</category><category>React-three-fiber</category><category>stockcharts</category><category>three.js</category></item><item><title>2024 端午去广州玩了</title><link>https://blog.kazoottt.top/posts/duanwu-guangzhou-trip/</link><guid isPermaLink="false">urn:blog:79067e8c-2279-5e6d-af4b-61b41c11a368</guid><pubDate>Mon, 08 Jul 2024 00:00:00 GMT</pubDate><description>&lt;p&gt;2024-07-08 提前致歉🙇‍♀️流水账难产了，而且记忆模糊，好多吃的名字都不记得了，所以内容写的真的很水。后面想起来了再慢慢补充吧。&lt;/p&gt;
&lt;p&gt;这次广州之行主要是和朋友们约好趁着端午去看大咩老师的毕业展，然后在广州吃吃喝喝。&lt;/p&gt;
&lt;h2 id=&quot;day01-迷路在白云机场&quot;&gt;Day01 迷路在白云机场&lt;/h2&gt;
&lt;h3 id=&quot;出发&quot;&gt;出发&lt;/h3&gt;
&lt;p&gt;已经习惯了下班后赶去机场的时间安排，这次也不例外。下飞机后，&lt;/p&gt;
&lt;p&gt;晚上没有什么店开着了，在机场买了个蛋糕吃。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/93c1f1c90c9becd27807a8810a3a2ccfcc2804eb74565d2997b98caac635dab3.jpg&quot; alt=&quot;8EB7F888-76D7-4CFE-B989-E32352B7EE8E_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;到达&quot;&gt;到达&lt;/h3&gt;
&lt;p&gt;到广州的时候已经是凌晨了，从机场出来顺着人群走到了 p5 停车场，也就是打网约车的停车场开始打车，发现这里特别的混乱，师傅直接把我的订单取消了...&lt;/p&gt;
&lt;p&gt;还是比较推荐出租车或者机场酒店的接送服务，这两者效率更高，体验更好一些。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/abbaa531919a912ad5b5bbbf294ad835ed67ced345031a95aeb200afef1f821b.jpg&quot; alt=&quot;7A7CB6F8-D8DC-4369-83A8-B0700D36BB9E_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;day02-汇合吃饭逛动漫星城&quot;&gt;Day02 汇合，吃饭，逛动漫星城&lt;/h2&gt;
&lt;h3 id=&quot;机场汇合&quot;&gt;机场汇合&lt;/h3&gt;
&lt;p&gt;这天的中午回到白云机场和几个朋友汇合，又迷路了一阵子...&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/bd56bd82908e28feaf12e0b96f7902965f8e2fc22e24ae069b270784798b1839.jpg&quot; alt=&quot;EAB05FE7-3E93-49BF-B10F-12968F990A2B_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;由于没有吃早饭和午饭，饿晕，到了民宿后在大咩老师的推荐下赶紧点了一个外卖。&lt;/p&gt;
&lt;h3 id=&quot;动漫星城&quot;&gt;动漫星城&lt;/h3&gt;
&lt;p&gt;等人到齐之后，大概下午 4 点，我们去了西华路吃东西。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/438ae1db5b6bf93c590724cd27b56073da74c11aa3345d2dc73d26cad880fd59.jpg&quot; alt=&quot;8D21A474-E224-417D-A4DF-0CBA29347739_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;在路上遇到了一个很像厦门中山路的街，没有拍到最像的部分，但总之就是和中山路很像。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/93b712f2ee3165b7a476a2a7851fb5099fe393e422b0dbf592ba3166839df849.jpg&quot; alt=&quot;634BD3F3-9780-4198-98A6-F9C2BB653817_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;在路边摊遇到一个鸡蛋汉堡，其他小伙伴买了，看着挺好吃的，不知道实际味道怎么样。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/52077fdf94bde903d32bbbe6fbcfbaa677e794bb22a36ab673dee3df0f8b15ff.jpg&quot; alt=&quot;93CDD5F0-2357-42DD-A602-18A3369C059F_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/55f2408b19fdf235c721d8161ee0e37420b6dbc85062a5a075e8c1fbffc353f9.jpg&quot; alt=&quot;CB9CA978-12F8-4E96-86E2-51999ADC45A0_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d88584fbd2e8abc4c6f8a547e814097af09c859df2ad9471e76f1f083b52cc07.jpg&quot; alt=&quot;6812C1E5-F38A-4624-A7C9-C6D8CFE65F76_1_105_c&quot; loading=&quot;lazy&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://blog.kazoottt.top/media/0b923a26418bbbb6c556b946185199059220296260bcd89810586a4008bd983f.jpg&quot; alt=&quot;B54AFF74-7D8F-4E56-9537-2D21E0CC510F_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6d0a909832d94b38bbb75919c3b26d1c45440561974c63bb5dabc39f9491d01b.jpg&quot; alt=&quot;8E35157F-E169-4F2A-8339-B075E8268547_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b666b3a3768f265fe8d93739d2d541d8483c5580cd610fba8c3cb0e4bcc04eae.jpg&quot; alt=&quot;EFD20D7F-90D8-49B8-B106-9C773C8FC313_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;吃了卡密买的鱼皮，很脆，好吃好吃。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b96d57808387b4455b81f6c3d6ad9a9f5d03cc3ad1007114a2e1921b7450a12d.jpg&quot; alt=&quot;12C5656D-3715-44D4-8185-EF45F00EB68F_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;吃完了我们就去逛了动漫星城，人真的很多很多很多啊，不过这里信号比成都天府红好一点点。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e34685e4634d9edb94e494aeaff686440a8f2aa6728699e46248f14ec4d4d8dd.jpg&quot; alt=&quot;976EBEF7-B2F3-4C6C-96FF-AD7E28434BAC_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;逛完了动漫星城，我们就去吃晚饭啦。&lt;/p&gt;
&lt;h3 id=&quot;晚饭&quot;&gt;晚饭&lt;/h3&gt;
&lt;p&gt;抱歉我已经不记得这些菜具体是啥了&lt;/p&gt;
&lt;p&gt;白切鸡和烧鹅的拼盘&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d3cb2a23dd80f3f734dd81683d264234b77f82ffc701437d976f752cf3d08494.jpg&quot; alt=&quot;F5EEAAE7-10A7-4E5C-AC47-E327B24B27C8_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;这个是蘑菇牛肉粒好像&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b229e1cf780da7004586375ae486ad5e5695a3222fc7dd0aadcc23de2267bea5.jpg&quot; alt=&quot;DAE0A8C1-E1D5-4AEC-9C2A-1B9FDDAAF8D2_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;葱油饼&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/fb76679398665b6e14a0d67005a2ab1f1ce9e61b82e99fc256dabd5d57ff5d97.jpg&quot; alt=&quot;02F7948F-8EBE-4E8A-B9D2-E987D0BABE52_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a1529501e19af05b3c23327d9a894e53b6ce2a241c6738503108d33011bd3050.jpg&quot; alt=&quot;310DF3ED-F3C0-4C26-B9B2-96B038E55F13_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;银丝饼&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/5938f7940237a49722e44d3f5640ba799e53adf4b67ef1a34e005480e920e788.jpg&quot; alt=&quot;590943D1-9B16-4012-9684-E718436FB3A6_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;叉烧！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6371061c6c136c83e2d82b48305050ee15e70e9748fd061e66a98b2a00fc33e8.jpg&quot; alt=&quot;78E5456A-BB8C-42AB-A607-9A127C1FD51C_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;鸭肠，这个很好吃，很对我胃口。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/470c8e3cd1b8eaf15b8b9574e6b419e014d1341cba0ea59a98f8bcae4269a29f.jpg&quot; alt=&quot;2B8B3236-D94C-465F-BBA3-8560953F17E8_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;牛舌好像是？&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b87b31b1be845bb4419f22c7d9e22969a74aa3ad0778992eb910c64820773a08.jpg&quot; alt=&quot;506B2D64-0E68-41A3-ABAE-4690DC4770E3_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4874df74e4eb9c2f68334509765764dcc8d43f7902c6da21bd4643f4defe1b1f.jpg&quot; alt=&quot;5225E903-467D-4146-BE94-9C436ACCF7D8_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;鳝鱼～&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/bd91c32a7d89f5f78a5d0d5be5147241160980d0466f1a830dd7a95f08d4ad2f.jpg&quot; alt=&quot;295A4166-0EA9-4E64-8919-6179495C8CA2_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;凤爪～&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/210f1a120da40d873006cb75deb461de395a09eddb339dce5aaea5bf8c449f20.jpg&quot; alt=&quot;18770298-23DA-43DB-ADC0-BF84CDCAC9D1_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;放一个拼图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/5f0193ca9df0c31b65ab20198af2c1bce6a53c94f6d0ed0552ac5e88ca0253cd.jpg&quot; alt=&quot;D32E25B4-AEC7-49C1-A583-912C353EDE59_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;ktv&quot;&gt;KTV&lt;/h3&gt;
&lt;p&gt;吃完晚饭，我们去了 KTV 唱歌，抱着尝试的心态买了凉茶，不过我喝的是冰的薏仁茶，那种黑色的不敢尝试。后来他们告诉我，虽然是凉茶，但一般是热的。😮&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d6f5a0768784415c5b1687e6cab1ce449105997c4e1ed27f12c5294e8c213470.jpg&quot; alt=&quot;3DB8084B-0D5B-4AA2-8706-7C83C9D3B690_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;唱完歌，我们去肯德基吃了夜宵。试了下这个带葱的蛋挞，感觉还好。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a083e41a8dd3cd138ef79b7dd479cf3976438575b4519c334681037d3d88b41e.jpg&quot; alt=&quot;667A39B7-344C-4CB9-8025-811D7E6043C6_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;day03-吃到爽的早茶看展&quot;&gt;Day03 吃到爽的早茶，看展&lt;/h2&gt;
&lt;p&gt;😭 虽然这天醒的比较早，但睡回笼觉又睡过去了。一起床看到大家都在猜我几点能醒🙏&lt;/p&gt;
&lt;h3 id=&quot;早茶&quot;&gt;早茶&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/1f3060543fd2e8261af67c42bad26e6b2823f8df03f5f46445b67bfe9bdb19a7.jpg&quot; alt=&quot;575686BE-9BC5-40B6-B487-D6060A2B1B60_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/ce13535ef1627e6e648f2cfb0d5d52e364f6f1965329f877d69a524c7ffeabed.jpg&quot; alt=&quot;1C993AB9-1DAA-41E5-9D8F-1609C479B21E_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/dcc10c3fddc627b7851630b99702aec258c5fe1a1dbcf60d47c841915a840af5.jpg&quot; alt=&quot;5E242F39-9DD5-4B64-AA3E-B071B818E92E_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6e42f67c9a9cf7e444685e0edf168ab36dcf8e6ad1d8f7c1ca4208e1791c3614.jpg&quot; alt=&quot;ECF1D1CA-F561-4F9E-A668-E65CBF2AEC06_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/faed30ef94f022f3649ca357a5a3ee4e46594f1d75c4b1b2b70532d2c8a8c66a.jpg&quot; alt=&quot;715E241A-7140-4EC3-8282-62CA8A915E88_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;分量超多的红米肠😭哭了，我来广州就是吃这个的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/05bbc7868680dd5ada707183abf7764dc200dfab2155c4721c7533a9f73bc013.jpg&quot; alt=&quot;5FE08DF8-81C3-46E6-A5F8-AD0103C6121F_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;薯条&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/1d3bb32d20375a0b4db1d0e5e90b2ce8b0f4870bb5da3b014a46bd855fb7ca6d.jpg&quot; alt=&quot;304ED47A-ABD4-49C0-9CC2-FC165260F4E4_1_105_c 1&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6e1f303555bec99c7c8b887bf354fdc1b2c0e671b4d2213d2ed28b413e48bf51.jpg&quot; alt=&quot;35326CF4-9325-46C3-8A01-497EE8B3AD1C_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/18b435f11c51e2d7a7dbed7bca46543b8f8b62ab034ce7c48927ee55641cc5ff.jpg&quot; alt=&quot;1F0C400C-D0F1-4338-852A-F23D2E4BD0B7_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;蒸凤爪&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/bbe3d6de85f20d97b4e0227b7e3db0a434d919104e4cf50dad6565c415dfd1f0.jpg&quot; alt=&quot;2BDF8E84-CA99-405B-A162-2FDB4156D315_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;虾饺，我的第二最爱！呜呜呜&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/038c9c1a967af32af07443ede14077226dc273f871c76fe94ae95d35b64e6ccb.jpg&quot; alt=&quot;DF0B3D9F-633E-4C05-9398-1DF727B481B3_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/63f3d61679505bcab339ca1e37b9b92b96d494964bf73296e0022b2668cc9eb0.jpg&quot; alt=&quot;90F28620-4423-4B66-BE63-8EB8254BD09F_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/42d6ca9e275b465c723041c64e25b7d53dfdebdfb45a1d98269b1d4d8c47545b.jpg&quot; alt=&quot;841AE5D0-5C07-48E3-8237-64F06218DFF6_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;云吞这好像是&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4b060a2bdcbb3ae678b229b969d94eff3f3c0ea63b08dee051cd9a7b85ce5171.jpg&quot; alt=&quot;BACD83FA-C56E-49A5-9374-B097D5366F4F_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;肠粉～&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/fb4379e51c90ef6cc5eeca717d5c5f81e3574e54d18f57ae0b2e48a7232e915d.jpg&quot; alt=&quot;BB731AF1-8920-406B-B7D6-E2D603509454_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b8ddbf81a6c69f43a1766d50402cd180708c1a6fae45e7ef2fb251d34a1322fa.jpg&quot; alt=&quot;8056451B-5ED0-4457-B59B-AE1A6277DCCF_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;蒸排骨&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/ef650259b26bdf92d5da59145772d3b2e5f8baf73efb075eb5d8aff16581c3ed.jpg&quot; alt=&quot;85BE502D-A880-41AA-8BDB-AA9518F7BE59_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/ba18431eacfe817fec59bf94b8617dcf77b1644971bd8a54f828594ee4a60029.jpg&quot; alt=&quot;BCF89AE4-7581-4D4F-8A10-61A0536A4231_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;金钱肚，这个也好好吃啊&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d23a7268f91667504808d84a024c2b733f9334806bdc339ca4024958b0d3ad1f.jpg&quot; alt=&quot;F2DAFF31-B04B-4103-91C7-27AA463F6209_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;牛肉丸&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f3bff7fe1ae47230fcfa373ce228e33be5bd054e28d598fe2e7981e48f7e174b.jpg&quot; alt=&quot;0FC4F804-91E2-40F5-8276-02EA58241B09_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;发个拼图版～&lt;/p&gt;
&lt;p&gt;广州早茶怎么那么好吃啊！品类多，价格也合适，如果人多就可以点很多样，爽吃。&lt;/p&gt;
&lt;p&gt;不敢想象，我要是生活在广州会有多幸福🤩&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/ef240e98c24fc90a2207dfba2e7f39e2d5c0cbea9e5abc8b08807d149862e370.jpg&quot; alt=&quot;925CF47B-CEDF-4022-ADAC-65760679690E_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/3a0a31b7374151321ed9aa92e622639d468b102c945bdc91482d1146b250fbaf.jpg&quot; alt=&quot;4086D04C-4769-4A38-B163-D18E1B264AA4_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;看大咩老师的毕业展&quot;&gt;看大咩老师的毕业展&lt;/h3&gt;
&lt;p&gt;吃完早茶之后，我们去了广美看大咩老师的毕业展&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/19b1b91cb9dc72368b9c7d4c306289345aa20167bfbdd9ae81ca3c9f23d0b0c3.jpg&quot; alt=&quot;24B0EEA5-21C6-4830-AC88-40974318B5DF_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;校园入口好多人哇，进展的时候排了一小会儿队～&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/03b3f53193ae08bc3d8314f252033b90eb974bff515dcde80792c7c3d898c6a4.jpg&quot; alt=&quot;7D18177A-B9BD-43E5-AED8-57BB49A26EE4_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e1d7c510b040741017644fe928e0be04e7ef5f390cbd74e3ec4c0fddc480b4a3.jpg&quot; alt=&quot;2FD463D6-DAF0-4891-806C-8AB26C63131A_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;这是她们的小红书账号～&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/7e1f18a85d7114862b62fe75e9ebc307e7f4c6d9a60c336f4c280c65f706485c.jpg&quot; alt=&quot;28E71C24-9389-459B-8862-1570E0BC8CB0_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f69a228b34b1357b0aaf136c52b9e16d3b467f2065de589218d58724ede6fb42.jpg&quot; alt=&quot;3ECC07B0-8969-4FA2-9BD2-2CD8F5F17AB3_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;玩游戏！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/fdb58dc66bcff6744007585606dd2008ff52a8b089dfacea4b092b3cdb28dccd.jpg&quot; alt=&quot;98C64DD1-0208-418A-BF8D-02DC821F47BD_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;闭馆的时候，很多人来给玩偶拍照～&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240708-%E6%9C%AA%E5%91%BD%E5%90%8D%E7%9A%84%E8%AE%BE%E8%AE%A1%20(3).png&quot; alt=&quot;未命名的设计 (3)&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240708-%F0%9F%A4%93%20(1)%201.png&quot; alt=&quot;🤓 (1) 1&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;合照～&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240708-%E6%9C%AA%E5%91%BD%E5%90%8D%E7%9A%84%E8%AE%BE%E8%AE%A1%20(4).png&quot; alt=&quot;未命名的设计 (4)&quot; loading=&quot;lazy&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://pictures.kazoottt.top/2024/07/20240708-%F0%9F%A4%93.png&quot; alt=&quot;🤓&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240708-3.png&quot; alt=&quot;3&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;吃牛肉火锅&quot;&gt;吃牛肉火锅&lt;/h3&gt;
&lt;p&gt;呼呼！&lt;/p&gt;
&lt;p&gt;这张鸳鸯锅发朋友圈，被广州的朋友吐槽牛肉火锅怎么可以鸳鸯锅 hhh&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/db355172658aab6745907693bcde0ed5c20136797f364ecd1090e19c03cdcdc5.jpg&quot; alt=&quot;7FC448B8-CC0D-44A5-8F49-45E34C9368E8_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/1708ba9739effe378e5cc5871fdfb0c4de50afca2507c96fc0ada30e45a7378c.jpg&quot; alt=&quot;D315D1E7-6CF4-4352-9409-37F4B97B5BFD_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;很好吃，吃了很多肉，全是朋友们帮忙下的锅！朋友们真的把我养的很好（李湘真的把王诗龄养的很好，这句是这么用的吗）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/1bb5cafd26aeda70b6d4e0101301ccc49f4835b2157240834fe3e64ac243e723.jpg&quot; alt=&quot;5BA8F7D6-EAAF-4FCF-BE86-A61EC99E870B_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;继续-ktv&quot;&gt;继续 KTV&lt;/h3&gt;
&lt;p&gt;吃完饭，我们又去了 KTV&lt;/p&gt;
&lt;p&gt;大咩老师点了好大一个蛋糕&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/8cb55c53a4287094af0ba942f1ef0da492aad288ad2edfd2f25b1f311c71e310.jpg&quot; alt=&quot;92520344-CB64-4B93-A5D6-22C44080838E_1_105_c 1&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f8e99192c31ccbfb99c0b809b783b7a41b223c468ef4e49d03333503fbc63ae2.jpg&quot; alt=&quot;2DDCB67B-AD15-4E37-8FA1-82DBD157E5C4_1_105_c 1&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/2d354a63e83220ffb123ca291d39719767be3c87a4362cd0ce2ac3162411d855.jpg&quot; alt=&quot;1D9F63D9-F73F-4E53-9326-7BAEC0BBCCC0_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;不是很能喝酒，一喝酒就脸红头晕。不过还是和朋友们喝了一点点。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/2b01ac631752f291fc0f5c885f23f6e9fe98e876de7309c7c2780f664023ce4e.jpg&quot; alt=&quot;C2DFF0B7-8D93-4014-98DF-A7D549AA193B_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f4cd7a5ee6363a8b4e74d5420a40a6e20cf498842ee7057d0c7bfcf0b46ac141.jpg&quot; alt=&quot;E0FAC401-FC62-4CCC-A385-C214177CBD09_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;夜宵&quot;&gt;夜宵&lt;/h3&gt;
&lt;p&gt;吃了小龙虾，麻辣和蒜蓉味的，还有生腌虾（之前在厦门尝试过几只，吃了没有什么问题，挺好吃的，但是这次还是只尝试了一只😱）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240708-Pasted%20image%2020240707202718.png&quot; alt=&quot;Pasted image 20240707202718&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;day04-回家&quot;&gt;Day04 回家&lt;/h2&gt;
&lt;h3 id=&quot;午饭&quot;&gt;午饭&lt;/h3&gt;
&lt;p&gt;一觉醒来又快中午了，找了附近的一家餐厅吃饭。&lt;/p&gt;
&lt;p&gt;忘了这是什么&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f7fc15d45f0ca7ec4dea44376aae51ca005c6ebc461e96e6590f9c2d88edad9d.jpg&quot; alt=&quot;5398D186-7E2D-4F68-B29C-BD994807AA3E_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;这个是墨鱼饼&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/dd8759c17342dff7e71a936fa399effce44c2296c49cb35682776802d20e43eb.jpg&quot; alt=&quot;788CB1B7-F791-4F39-976A-2E4B7C419CFE_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;炸鲜奶&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/3ef2d76bda44ec9ab1a2ce7844ed440d1aaa50e024c347fb2a4fa58b9d7f113b.jpg&quot; alt=&quot;219A5BC5-763E-4EAA-89BC-B71A4472BFD2_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/0b76aacd12a5aba88f1636c77293eb1f8b633e795595e1e2feca38a96e1c0480.jpg&quot; alt=&quot;44FE9F78-79A8-4535-98CE-6D282682A258_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6917140c6d471b22c5a87307cbf0918c94fbde1355eebf9310b31b6a41a546f3.jpg&quot; alt=&quot;06519272-5D2B-4A46-8DD3-436A8F6DC405_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;好像是小米糕？&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6149ffcdabb1f9ad346a3d090bbfb5f730f1e9cfafd7c34c86e6be7abb3bd522.jpg&quot; alt=&quot;E5F15518-5E2D-49ED-974F-1C25519217DA_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b32521d80e49418a9e2fb56aa757e1e16ed62b41dff0469ae18482a01eacb183.jpg&quot; alt=&quot;A830F23D-C913-4795-B74F-B0C1BB9662CB_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/89e17d4bd7ada2c331b7ef36e16d888ad82f4b37f3b65daf36f4bd1facdf10a8.jpg&quot; alt=&quot;C761DD4D-B55B-4B6C-8905-00BDB398AE43_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/03cdd9d4daddb60388791aeb20b1e960de60bf3c23d24304ceb0def605f48418.jpg&quot; alt=&quot;1C1A78B7-483F-4528-B9EC-59B4C80EB684_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e9f250803480fa95ee31d79dcca6b734220039bbbc4bbf2cd9e0f578eb1234fe.jpg&quot; alt=&quot;F4BB3A0A-3353-47B4-823C-38A25F4B4F96_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;拼图版：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4d340c855be16677543cfcba814b8741d24e03cb1b4786f8f103531fbf4b03f7.jpg&quot; alt=&quot;6B8814B4-2EC0-460B-92D8-4566CFD29A1E_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;回家&quot;&gt;回家&lt;/h3&gt;
&lt;p&gt;吃完中午饭，就和朋友们打车去机场了。&lt;/p&gt;
&lt;p&gt;点了一杯咖啡，然后坐上了按摩椅。这个椅子还挺舒服的，有点理解为什么有的人会称之为追星快乐椅了（指的是接送完机在这个椅子上可以快速回血）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/023d68b240ae84d9c48cb77babebdb769e7126c473fae76be0162d49a7eaa3de.jpg&quot; alt=&quot;7CAEEC43-63E9-4455-AC1B-3F633507A210_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;广州白云机场的蓝天白云～&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f8433f4e6c030c7bb06da5c9db0184cea78f3d4274f7e0fd980e3369b080a8d2.jpg&quot; alt=&quot;75403FF0-D4C6-4B45-AF34-76E85E35ACD4_1_105_c 1&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;最后&quot;&gt;最后&lt;/h2&gt;
&lt;p&gt;到这里流水账就结束了 0.0&lt;/p&gt;
&lt;p&gt;感受很深的是，广州的好吃的也太多了吧，好羡慕好羡慕 QAQ&lt;/p&gt;
&lt;p&gt;这一次的广州之旅很愉快，和初中来的时候是完全不同的感受。&lt;/p&gt;
&lt;p&gt;和很久不见的朋友们线下见面很开心，有盼头的感觉真好&lt;/p&gt;</description><category>随笔</category><category>端午节</category><category>广州</category><category>旅行</category><category>美食</category></item><item><title>写一个油猴脚本，自动地选择最新微博</title><link>https://blog.kazoottt.top/posts/write-an-oil-monkey-script-that-automatically-selects-the-latest-tweets/</link><guid isPermaLink="false">urn:blog:91ee5748-e234-5af7-81f7-050db06328ac</guid><pubDate>Wed, 26 Jun 2024 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;写一个油猴脚本自动地选择最新微博&quot;&gt;写一个油猴脚本，自动地选择最新微博&lt;/h1&gt;
&lt;p&gt;效果演示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/06/20240626-7c865e7ad92efd6f2b352c7e25066eb9.gif&quot; alt=&quot;CleanShot 2024-06-24 at 12.02.21&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1ji37eaEF8/?vd_source=2fb17edde94db73875894dd00309c394&quot;&gt;自动地将微博的浏览顺序切换为按时间排序 [油猴脚本]_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;安装地址：short.kazoottt.top/wbtimeline&lt;/p&gt;</description><category>项目</category></item><item><title>2024-W17</title><link>https://blog.kazoottt.top/posts/2024-W17/</link><guid isPermaLink="false">urn:blog:5d50d7ff-0032-589f-b1ce-39260636c67f</guid><pubDate>Fri, 26 Apr 2024 00:00:00 GMT</pubDate><description>&lt;p&gt;日期范围：2024/04/22 - 2024/04/28&lt;/p&gt;
&lt;h1 id=&quot;1-模型动态&quot;&gt;1. 模型动态&lt;/h1&gt;
&lt;h2 id=&quot;myshell-发布-openvoice2-开源语音模型&quot;&gt;Myshell 发布 OpenVoice2 开源语音模型&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/myshell-ai/OpenVoice&quot;&gt;GitHub - myshell-ai/OpenVoice: Instant voice cloning by MyShell.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://research.myshell.ai/open-voice&quot;&gt;Open Voice&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;它只需参考说话人的一小段音频片段，就能复制其声音并生成多种语言的语音&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;snowflake-arctic---llm-for-enterprise-ai-面向企业的-llm&quot;&gt;&lt;a href=&quot;https://www.snowflake.com/blog/arctic-open-efficient-foundation-language-models-snowflake/?continueFlag=5e163579825fe6026ed04354f826d987&quot;&gt;Snowflake Arctic - LLM for Enterprise AI&lt;/a&gt; 面向企业的 LLM&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a7c77a36b538a2c3d1d05ed0de3dde281e8ee24d759a99d574d990b440f4fb71.png&quot; alt=&quot;IMG-20241021113030266&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;2024-04-24&lt;/p&gt;
&lt;p&gt;本文介绍了 Snowflake Arctic，一个高效智能且真正开放的顶级企业级 LLM。&lt;/p&gt;
&lt;p&gt;它具有出色的企业任务性能，如 SQL 生成、编码和指令遵循基准，同时使用的训练计算预算不到 200 万美元（不到 3K GPU 周）。&lt;/p&gt;
&lt;p&gt;它还使用了三阶段数据课程，专注于通用技能和企业技能，以实现高效的训练和推理。目前 Arctic 可在 Hugging Face、NVIDIA API 和 Replicate 上获取，预计在未来几周上线到其他的模型平台。&lt;/p&gt;
&lt;h2 id=&quot;firefly-image-3-model---adobe-最新版文生图模型&quot;&gt;Firefly Image 3 Model - Adobe 最新版文生图模型&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/27994a66d625320db7cfb1f5d6a22d65fde7783bdab480f862ea3d365eff7803.png&quot; alt=&quot;IMG-20241021113030298&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;体验地址：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://firefly.adobe.com/&quot;&gt;Adobe Firefly&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/11/20241125-b4504ff2bc70c4873e1b53fafef3c6c0.png&quot; alt=&quot;IMG-20241021113030351&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;introducing-more-enterprise-grade-features-for-api-customers-为-api-引入更多企业级功能&quot;&gt;&lt;a href=&quot;https://openai.com/blog/more-enterprise-grade-features-for-api-customers?continueFlag=5e163579825fe6026ed04354f826d987&quot;&gt;Introducing more enterprise-grade features for API customers&lt;/a&gt; 为 API 引入更多企业级功能&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/eb3949822a9b221a5aafd693764d1a391a2e78c7ec601f76377cd85776f68959.png&quot; alt=&quot;IMG-20241021113030402&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;OpenAI 发布了一篇博客来介绍对于 API 的与企业相关的功能升级内容。&lt;/p&gt;
&lt;p&gt;亮点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;增强的企业级安全：引入 Private Link 和 native MFA，新增到现有企业安全特性中。&lt;/li&gt;
&lt;li&gt;更好的行政控制：通过新的 Projects 功能，组织对单个项目有更精细的控制和监督。&lt;/li&gt;
&lt;li&gt;助理 API 的改进：包括更准确的检索、实时对话响应支持等。&lt;/li&gt;
&lt;li&gt;更多成本管理选择：如针对持续 TPM 使用的优惠和异步工作负载成本的降低。&lt;/li&gt;
&lt;li&gt;持续的功能添加计划：专注于企业级安全、行政控制和成本管理。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;github---uukuguyspeechless&quot;&gt;&lt;a href=&quot;https://github.com/uukuguy/speechless&quot;&gt;GitHub - uukuguy/speechless&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4a2cf70a78b7d4d26e142c4c3ed093ece1902066d8dea3a8d52bdf36061a5330.png&quot; alt=&quot;IMG-20241021113030448&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;Speechless AI，它是一个基于大型语言模型的人工智能助手，专注于将强大的语言处理和深度推理能力集成到实际业务应用中。&lt;/p&gt;
&lt;p&gt;它通过增强模型的语言理解、知识积累和文本创作能力，引入长期记忆、外部工具集成和本地部署，旨在建立一个能够独立交互、持续进化并与各种业务场景紧密结合的智能协作伙伴。&lt;/p&gt;
&lt;p&gt;此外，文本还提供了关于模型、工具、训练等方面的详细信息。&lt;/p&gt;
&lt;h2 id=&quot;mattshumerllama-3-8b-16k--hugging-face-上下文翻倍的-llama-3-8b-16k&quot;&gt;&lt;a href=&quot;https://huggingface.co/mattshumer/Llama-3-8B-16K?continueFlag=5e163579825fe6026ed04354f826d987&quot;&gt;mattshumer/Llama-3-8B-16K · Hugging Face&lt;/a&gt; 上下文翻倍的 Llama-3-8B-16K&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/mattshumer_/status/1782576964118675565&quot;&gt;X 上的 Matt Shumer：“I&apos;ve doubled LLaMA 3&apos;s context window to 16K tokens. Fully open-source. Link in thread: https://t.co/uPgmrVojHX” / X&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4b2cfdb27b3396604e33bd952df085660bab14567962b9e3d28c834d7ba7ca9c.png&quot; alt=&quot;IMG-20241021113030500&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a22e552df616d7d129478aa676d53e2e0a28034281594ae766114fdd4154d94a.png&quot; alt=&quot;IMG-20241021113030589&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h1 id=&quot;2-优秀应用&quot;&gt;2. 优秀应用&lt;/h1&gt;
&lt;h2 id=&quot;comfyui-workflows---developer-community&quot;&gt;&lt;a href=&quot;https://openart.ai/workflows/home&quot;&gt;ComfyUI Workflows - Developer Community&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;工作流模板网站，主要是&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/3ffe585214af00c46e4e287cfe1a0be6dc8624230f394816be3b516e2407568d.png&quot; alt=&quot;IMG-20241021113030616&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;cloudflare-推出-ai-playground&quot;&gt;Cloudflare 推出 AI Playground&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://playground.ai.cloudflare.com&quot;&gt;Workers AI LLM Playground&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;支持免费使用多种开源模型，并且支持在 playground 调试好之后生成对应的调用代码。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/fa023105a31e677774c9b689bb252c7c8eca955b0935b9b8bad15f09f6b40b44.png&quot; alt=&quot;IMG-20241021113030661&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/7221529583d6b9dc3adfb266aad7ed8de32b18d8f38b42594c60ccb163fa798d.png&quot; alt=&quot;IMG-20241021113030688&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;与此同时 cf 还提供了其他的各种好用的工具，无论对于个人开发者还是企业都推荐使用。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers-ai/&quot;&gt;Workers AI · Cloudflare Workers AI docs&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;perplexity-推出了企业会员和企业定制服务&quot;&gt;Perplexity 推出了企业会员和企业定制服务&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/11/20241125-f281f619a96b59b2a67dbef48b7fc17a.png&quot; alt=&quot;IMG-20241021113030737&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;亮点：&lt;/p&gt;
&lt;p&gt;Enterprise Pro 的强大功能：能为团队提供快速、最新且可靠的复杂问题答案，无需频繁点击链接、比较答案或在网上无休止搜索。&lt;/p&gt;
&lt;p&gt;数据安全与隐私：确保只有合适的人能看到数据，不会有不必要的信息被分享，且数据不会被用于训练，同时保障数据隐私和安全。&lt;/p&gt;
&lt;p&gt;安全管理与控制：通过实时通知可疑行为或危险活动来管理威胁和防止数据丢失，安全政策和控制符合最高行业标准。&lt;/p&gt;
&lt;p&gt;用户管理：轻松添加、移除和管理团队成员。&lt;/p&gt;
&lt;p&gt;单点登录：与身份提供商安全集成，用户可通过单点登录轻松登录。&lt;/p&gt;
&lt;p&gt;Enterprise Pro 的效益：帮助企业加速研发，如 Databricks 估计每月能为团队节省 5000 个工作小时。&lt;/p&gt;
&lt;p&gt;定价模式：针对不同规模的企业有不同的定价方式，小公司可通过自助流程获取，大公司则可根据购买的座位数量进行灵活定价。&lt;/p&gt;
&lt;p&gt;常见问题：Enterprise Pro 是为提高生产力、发挥 Perplexity 全部功能并满足严格安全要求而设计的解决方案，能帮助人们快速获得可靠答案，还能用于询问内部数据问题。&lt;/p&gt;
&lt;h2 id=&quot;can-you-run-it-llm-version---a-hugging-face-space-by-vokturz-查看机器配置能否运行模型&quot;&gt;&lt;a href=&quot;https://huggingface.co/spaces/Vokturz/can-it-run-llm&quot;&gt;Can You Run It? LLM version - a Hugging Face Space by Vokturz&lt;/a&gt; 查看机器配置能否运行模型&lt;/h2&gt;
&lt;p&gt;选择模型和机器配置，可以查看这个配置能否运行对应的模型&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/119b8cb24dcd0cd24b1af80999efe810faad325d5b5f976aa9ef1394abe40257.png&quot; alt=&quot;IMG-20241021113030790&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;github---feiandxsduckrush-搜索关键词并返回-llm-便于处理的数据格式&quot;&gt;&lt;a href=&quot;https://github.com/feiandxs/duckrush&quot;&gt;GitHub - feiandxs/duckrush&lt;/a&gt; 搜索关键词并返回 LLM 便于处理的数据格式&lt;/h2&gt;
&lt;p&gt;一个简单快速的后端 API，基于 Hono，可以使用关键字在互联网上搜索相关内容，并将其转换为适合 LLM 处理的格式。支持在 Cloudflare 上部署。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/3efb9c75d8d0b68b9558e90384374ca4ac1a265921870259fcfc15a1cdd92120.png&quot; alt=&quot;IMG-20241021113030827&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h1 id=&quot;3-推荐资料&quot;&gt;3. 推荐资料&lt;/h1&gt;
&lt;h2 id=&quot;llama-3-fine-tune-with-custom-data---mervin-praison&quot;&gt;&lt;a href=&quot;https://mer.vin/2024/04/llama-3-fine-tune-with-custom-data/&quot;&gt;Llama 3 Fine Tune with Custom Data - Mervin Praison&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;LLama3 微调教程&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=WxQbWTRNTxY&amp;#x26;ab_channel=MervinPraison&quot;&gt;How to Fine Tune Llama 3 for Better Instruction Following? - YouTube&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/9bee44507bbcffb56512606565a3b5731737f0ac0395548e6ef58b5189c64d36.png&quot; alt=&quot;IMG-20241021113030852&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;github---datawhalechinaso-large-lm-大模型基础一文了解大模型基础知识&quot;&gt;&lt;a href=&quot;https://github.com/datawhalechina/so-large-lm&quot;&gt;GitHub - datawhalechina/so-large-lm: 大模型基础：一文了解大模型基础知识&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://datawhalechina.github.io/so-large-lm/#/&quot;&gt;大模型理论基础&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/92a4324b8d6eb02459d36bdd6ebe0cd78e9d12d6ac018561302c54675be9a691.png&quot; alt=&quot;IMG-20241021113030885&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;本项目是一个关于大规模预训练语言模型的教程，涵盖模型的各个方面，包括数据准备、模型构建、训练策略等，以及安全、隐私、环境和法律道德等方面的知识。项目以斯坦福大学课程为基础，结合开源贡献者的补充和更新，由项目团队成员分工撰写，预计三个月完成初始版本，后续根据社区贡献和反馈进行更新。旨在为相关领域的研究者和从业者提供知识和技术，拓宽受众的知识面，降低参与开源项目的门槛，并为大型语言模型研究领域贡献资源。&lt;/p&gt;
&lt;h2 id=&quot;getting-started-with-mistral---deeplearningai-mistral-入门教程&quot;&gt;&lt;a href=&quot;https://www.deeplearning.ai/short-courses/getting-started-with-mistral/?continueFlag=5e163579825fe6026ed04354f826d987&quot;&gt;Getting Started With Mistral - DeepLearning.AI&lt;/a&gt; Mistral 入门教程&lt;/h2&gt;
&lt;p&gt;课程主要的内容：&lt;/p&gt;
&lt;p&gt;“You’ll learn about selecting the right model for your use case, and get hands-on with features like effective prompting techniques, function calling, JSON mode, and Retrieval Augmented Generation (RAG).”&lt;/p&gt;
&lt;p&gt;“您将了解如何为您的用例选择正确的模型，并亲身体验有效提示技术、函数调用、JSON 模式和检索增强生成（RAG）等功能”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d53ae5388d6128d3e141cea552a317f6c3066095eb1061b9c507c04b65fb5167.png&quot; alt=&quot;IMG-20241021113030926&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;financial-market-applications-of-llms-llm-在金融市场的应用&quot;&gt;&lt;a href=&quot;https://thegradient.pub/financial-market-applications-of-llms/?continueFlag=5e163579825fe6026ed04354f826d987&quot;&gt;Financial Market Applications of LLMs&lt;/a&gt; LLM 在金融市场的应用&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/9e3ddd6040b54e995fab79198b18204334d0b47c633ca67125bd4c94913be8df.png&quot; alt=&quot;IMG-20241021113030976&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;重点：&lt;/p&gt;
&lt;p&gt;📈 生成式人工智能与量化交易的相似性：生成式人工智能在自然语言处理中的应用，与量化交易策略在金融市场中的应用，有许多相似之处。&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;ai-agents-with-lowno-code-hallucinations-create-security-holes-and-more&quot;&gt;&lt;a href=&quot;https://www.deeplearning.ai/the-batch/issue-245/&quot;&gt;AI Agents With Low/No Code, Hallucinations Create Security Holes, and more&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这篇文本主要讨论了多代理协作、语言模型的安全漏洞、GPT Store 的管理问题以及利用 RAG 改进语言模型性能等方面的内容。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/9c297deea6c9a415abbab86a75d0201ce9a5331d72bd56eba1e80ea2953676b4.png&quot; alt=&quot;IMG-20241021113031022&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;notion--the-all-in-one-workspace-for-your-notes-tasks-wikis-and-databases&quot;&gt;&lt;a href=&quot;https://airy-lunch-c6f.notion.site/Becoming-SMART-is-easy-using-science-85119819e23f423887265b3fc436d586?pvs=4&quot;&gt;Notion – The all-in-one workspace for your notes, tasks, wikis, and databases.&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本文介绍了基于科学的强大学习技巧。文中还对比了一些常见但低效的学习策略，如高亮和重读，并强调了自我测试、检索练习、间隔练习、交错学习和精细询问等有效方法的重要性。&lt;/p&gt;</description><category>周报</category></item><item><title>2024-W15</title><link>https://blog.kazoottt.top/posts/2024-W15/</link><guid isPermaLink="false">urn:blog:2e4b6f86-b7d3-512c-b9ce-ec1141d8ebba</guid><pubDate>Fri, 12 Apr 2024 00:00:00 GMT</pubDate><description>&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/5003a42a1480b13622750eaad8b5c005f04339da16aaf9e14768ba1e3a49caa8.webp&quot; alt=&quot;2024-04-12-15-10-01&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;日期范围：2024 年 04 月 08 日 -2024 年 04 月 14 日&lt;/p&gt;
&lt;h1 id=&quot;关于我自己&quot;&gt;关于我自己&lt;/h1&gt;
&lt;p&gt;为了提升表达能力开始录视频做一些科普向的东西&lt;/p&gt;
&lt;p&gt;时隔 4 年又开始写 vue 了，做 side project，从晚上 8 点写到 12 点，很爽～&lt;/p&gt;
&lt;p&gt;买了迪卡侬的乒乓球鞋，感觉挺好穿的（不过鞋底不算特别软，如果长时间走路还是会不舒服的）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/baee209edf51c5fd122a3e915e33fd0ffa6379c45309b287468251153a320a1d.jpg&quot; alt=&quot;387E9D3B-D1D5-4806-A49A-4EEE7CC832B3_1_102_o&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h1 id=&quot;项目推荐与动向&quot;&gt;项目推荐与动向&lt;/h1&gt;
&lt;h2 id=&quot;arc-推出了-github-自动文件夹功能&quot;&gt;Arc 推出了 Github 自动文件夹功能&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/joshm/status/1778503666074304986&quot;&gt;twitter.com/joshm/status/1778503666074304986&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/7db6bcba3b3fe72dff182056763ac3e222dd724be133f9cf539f75160b3cb950.png&quot; alt=&quot;Pasted image 20240412131342&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;remotion-制作动画&quot;&gt;Remotion 制作动画&lt;/h2&gt;
&lt;h1 id=&quot;css-动画&quot;&gt;css #动画&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/hal__lee/status/1777317840556822666&quot;&gt;twitter.com/hal__lee/status/1777317840556822666&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/36fb5658181dd3c36e68bcfa37cee73bf6b2abd3719f1b9685d4cd5ef02a0f0c.png&quot; alt=&quot;Pasted image 20240412114158&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;github---zhuimaawesome-cloudflare-️-精选的-cloudflare-工具开源项目指南博客和其他资源列表&quot;&gt;&lt;a href=&quot;https://github.com/zhuima/awesome-cloudflare&quot;&gt;GitHub - zhuima/awesome-cloudflare: ⛅️ 精选的 Cloudflare 工具、开源项目、指南、博客和其他资源列表。&lt;/a&gt;&lt;/h2&gt;
&lt;h1 id=&quot;cloudflare&quot;&gt;cloudflare&lt;/h1&gt;
&lt;p&gt;cloudflare 应用推荐&lt;/p&gt;
&lt;h2 id=&quot;github---weisocialify--socialify-your-project--share-with-the-world&quot;&gt;&lt;a href=&quot;https://github.com/wei/socialify&quot;&gt;GitHub - wei/socialify: 💞 Socialify your project. 🌐 Share with the world!&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.producthunt.com/products/socialify&quot;&gt;Socialify - Product Information, Latest Updates, and Reviews 2024 | Product Hunt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;轻松为 GItHub 项目创建社交图像&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a5f9a8fe1b2cd09a6a0b7d3815f1307eb72fee3aa91db835555580c6721f7d35.png&quot; alt=&quot;Pasted image 20240408150249&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/486c9e015d3642f76b729e8c379c517cc331272562fc3f1ab19e74b9f17e728e.png&quot; alt=&quot;Pasted image 20240408150424&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;harness--the-modern-software-delivery-platform---ci-cd-feature-flags-cloud-costs--more&quot;&gt;&lt;a href=&quot;https://harness-next.vercel.app/&quot;&gt;Harness | The Modern Software Delivery Platform - CI, CD, Feature Flags, Cloud Costs &amp;#x26; more&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;一个炫酷的网站&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4c35c41dab33511d4f93169a8223156ac80908767c9aa7b58248d6438a7bfe78.png&quot; alt=&quot;Pasted image 20240408150753&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;vue-flow&quot;&gt;&lt;a href=&quot;https://vueflow.dev/&quot;&gt;Vue Flow&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/04/20240412-4ac3055181c0e15470c8f160bb935d1a.gif&quot; alt=&quot;屏幕录制 2024-04-01 17.58.05&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;基于-webgl-的-su7-互动网页&quot;&gt;&lt;a href=&quot;https://gamemcu.com/su7/&quot;&gt;基于 webgl 的 su7 互动网页&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/dedd0ba9057c179fc0eac657e5ce9296efa7048f89ce316d482eec80277061d9.png&quot; alt=&quot;Pasted image 20240401180708&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;dama-最新版支持倾斜的文字打码啦&quot;&gt;DAMA 最新版支持倾斜的文字打码啦～&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b61db4c62084f13e4bd8275338611996ce22577236c867fe2c3aae4976ced897.png&quot; alt=&quot;Pasted image 20240412094339&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;screenity---the-free-and-privacy-friendly-screen-recorder&quot;&gt;&lt;a href=&quot;https://screenity.io/en/&quot;&gt;Screenity - The free and privacy-friendly screen recorder&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;免费、私密、友好的屏幕录制器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f3fa7f6aed378a36ca08cf4473c000179d2257f073969a0ea1e02b671ac71c80.png&quot; alt=&quot;Pasted image 20240412112251&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;github---lissy93dashy--a-self-hostable-personal-dashboard-built-for-you-includes-status-checking-widgets-themes-icon-packs-a-ui-editor-and-tons-more&quot;&gt;&lt;a href=&quot;https://github.com/Lissy93/dashy&quot;&gt;GitHub - Lissy93/dashy: 🚀 A self-hostable personal dashboard built for you. Includes status-checking, widgets, themes, icon packs, a UI editor and tons more!&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;专为您打造的自托管个人仪表板。包括状态检查、小部件、主题、图标包、UI 编辑器等等！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/eaefd986b5a030299c13e1edde96a85dfb233be85b8814b12946d927d845bb2e.png&quot; alt=&quot;Pasted image 20240412112342&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;twitter-的视频gif-下载网站&quot;&gt;twitter 的视频、gif 下载网站&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://redketchup.io/twitter-downloader&quot;&gt;Twitter Downloader - Save Videos, GIFs, Images | RedKetchup&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/7ccf3ecd954b01c8f1180241db4a41860d5c2a11a0ac460828e4b2cba03799d2.png&quot; alt=&quot;Pasted image 20240412111943&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;一个收集-js-框架web-组件库和管理后台模板的开源仓库&quot;&gt;一个收集 JS 框架、Web 组件库和管理后台模板的开源仓库&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/jaywcjlove/status/1776325401440296970&quot;&gt;twitter.com/jaywcjlove/status/1776325401440296970&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://wangchujiang.com/awesome-uikit/&quot;&gt;Awesome UIKit Awesome UIKit&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e2b162871e8555702a97f74fde1aabda3ad62a1bd1835cc24cf0e6aa21d08c3c.png&quot; alt=&quot;Pasted image 20240412112731&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;meegle---project-management-tool-of-the-next-gen&quot;&gt;&lt;a href=&quot;https://meegle.com/&quot;&gt;Meegle - Project Management Tool of the Next Gen&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;可视化工作流&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/ff93c7be911e40c41bfc3013a0e8f765818ff26bd958d3de6b745f4da1789914.png&quot; alt=&quot;Pasted image 20240412113600&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h1 id=&quot;阅读推荐&quot;&gt;阅读推荐&lt;/h1&gt;
&lt;h2 id=&quot;raft微调你的-llm-使其在垂直领域的-rag-中表现更好&quot;&gt;RAFT：微调你的 LLM 使其在垂直领域的 RAG 中表现更好&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/688757352&quot;&gt;RAFT：微调你的 LLM 使其在垂直领域的 RAG 中表现更好 - 知乎&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/84556b16bfa13a10ee0a8b6abe1ed56089d73dd27fa5e5e176ad70e777788b6a.png&quot; alt=&quot;Pasted image 20240412131745&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;x-上的-randy-lu再次推荐这本书控糖革命科普了一些关于控制血糖波动水平的实用知识-httpstcoqtpdwrigsx--x&quot;&gt;&lt;a href=&quot;https://twitter.com/randyloop/status/1778056221028991033&quot;&gt;X 上的 Randy Lu：“再次推荐这本书《控糖革命》，科普了一些关于控制血糖波动水平的实用知识。 https://t.co/QTpdWRIGSX” / X&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a0c348a154dcfaebb59aa2c85a4e6c8ae373b0e8227e5cb3a77dbc348281a02f.png&quot; alt=&quot;Pasted image 20240412094104&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;使用动画的方式来讲解计算机知识&quot;&gt;使用动画的方式来讲解计算机知识&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/samwhoo/status/1749140022689685783&quot;&gt;twitter.com/samwhoo/status/1749140022689685783&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/2bc35cbb190f900f1067275aa435220d70975ac53233dfac818a735493662dd7.png&quot; alt=&quot;Pasted image 20240412094237&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/8af793a19b4566bac796853fc1b19444b7d812a8df655a5ee8ada7b72f4f21ef.png&quot; alt=&quot;Pasted image 20240412094145&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;why-graphql&quot;&gt;Why GraphQL&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/mark_larah/status/1777456733666840615&quot;&gt;X&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/5b2f13a6ab297780b77547fc7a2676eab8d79139dea0f09cb7394d18dfa48f50.png&quot; alt=&quot;Pasted image 20240412111519&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;chrome-开发者工具-for-designer外部分享版---飞书云文档&quot;&gt;&lt;a href=&quot;https://fyze31atzb.feishu.cn/docx/Lfjwdp3JEoZm0dxK5hqcfR4lnOe&quot;&gt;Chrome 开发者工具 for Designer（外部分享版） - 飞书云文档&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;前两年给部门内部设计师写的「Chrome 开发者工具 for Designers」指南，几乎涵盖了在设计走查过程中会遇到的调试场景。特别有几个小 tricks 很有用，分享给各位也可以转给你的设计师朋友们 &lt;a href=&quot;https://twitter.com/yancymin/status/1776863459688243394&quot;&gt;twitter.com/yancymin/status/1776863459688243394&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c1a04e9376af6ab193c80e8c9d3ca7cba6b997dc42395fd4cb10082b0ea87f63.png&quot; alt=&quot;Pasted image 20240412112550&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;小报童精选周刊&quot;&gt;&lt;a href=&quot;https://jingle.bio/xiaobao/&quot;&gt;小报童精选周刊&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/8fd7d736ae7c41431c78927ed7d194dda67cf538b46161caa8b247ad95d955ae.png&quot; alt=&quot;Pasted image 20240412112805&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h1 id=&quot;设计相关&quot;&gt;设计相关&lt;/h1&gt;
&lt;h2 id=&quot;noise--texture--figma&quot;&gt;&lt;a href=&quot;https://www.figma.com/community/plugin/1138854718618193875/noise-texture&quot;&gt;Noise &amp;#x26; Texture | Figma&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;figma 插件&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/5c63cc6d26cbd884f829ce0db7fe3c88334799b9e1060a774eb2fb44cd785911.jpg&quot; alt=&quot;rogie - 1777369008016367917&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;create-text-wallpapers-for-iphone-and-android--text-to-wallpaper-generator&quot;&gt;&lt;a href=&quot;https://texttowallpaper.com/index.html&quot;&gt;Create Text Wallpapers for iPhone and Android | Text to Wallpaper Generator&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;输入文字生成海报&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/hiyuekun/status/1778414801162731884&quot;&gt;twitter.com/hiyuekun/status/1778414801162731884&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f2862856d050fd421e63e836b5a7fdef7c8c6b8e018ee4a402675d9c65a64cfb.png&quot; alt=&quot;Pasted image 20240412113305&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;github---gezhaoyoupicprose-picprose-is-better-cover-image-generator-tool-for-medium-youtube-bilibili-blog-and-many-others&quot;&gt;&lt;a href=&quot;https://github.com/gezhaoyou/picprose&quot;&gt;GitHub - gezhaoyou/picprose: PicProse is better cover image generator tool for Medium, YouTube, BiliBili, Blog and many others&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;PicProse 是更好的封面图片生成工具，适用于 Medium、YouTube、BiliBili、博客和许多其他应用。&lt;/p&gt;
&lt;p&gt;（有点 coverview 的改良版的感觉）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6542cf67fcd4bbb452e82f915b9f0332f254181e0f6d2a617ecb41d9fd555b5f.png&quot; alt=&quot;Pasted image 20240412113348&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h1 id=&quot;ai&quot;&gt;AI&lt;/h1&gt;
&lt;h2 id=&quot;aragog---rag-的评估与调研&quot;&gt;ARAGOG - RAG 的评估与调研&lt;/h2&gt;
&lt;h1 id=&quot;ai-ai-模型-ai-阅读&quot;&gt;ai #ai 模型 #ai 阅读&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://arxiv.org/pdf/2404.01037.pdf&quot;&gt;2404.01037.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/17cd87c48c79ab611443621a0f2f0de579cf20ad436f9105b29eab33eca618a9.png&quot; alt=&quot;Pasted image 20240412133600&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;什么是-gpt通过图形化的方式来理解-transformer-中的注意力机制&quot;&gt;什么是 GPT？通过图形化的方式来理解 Transformer 中的注意力机制&lt;/h2&gt;
&lt;h1 id=&quot;ai-ai-阅读&quot;&gt;ai #ai 阅读&lt;/h1&gt;
&lt;p&gt;原视频：&lt;a href=&quot;https://www.youtube.com/watch?v=eMlx5fFNoYc&amp;#x26;ab_channel=3Blue1Brown&quot;&gt;https://www.youtube.com/watch?v=eMlx5fFNoYc&amp;#x26;ab_channel=3Blue1Brown&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;翻译视频：&lt;a href=&quot;https://weibo.com/1727858283/O8UQME7Y0#comment&quot;&gt;Sina Visitor System&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;autocoderover---自动修复-bug-的-agent&quot;&gt;AutoCodeRover - 自动修复 Bug 的 Agent&lt;/h2&gt;
&lt;h1 id=&quot;ai-ai-模型&quot;&gt;ai #ai 模型&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nus-apr/auto-code-rover&quot;&gt;GitHub - nus-apr/auto-code-rover: A project structure aware autonomous software engineer aiming for autonomous program improvement&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/56a360af9df3676652044d4e56ba64652c5bbf8259db8a828b441b68cacfe0c9.png&quot; alt=&quot;Pasted image 20240412132800&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;gemini-15-pro-现已在-180-多个国家地区上市&quot;&gt;Gemini 1.5 Pro 现已在 180 多个国家/地区上市&lt;/h2&gt;
&lt;h1 id=&quot;ai-ai-模型-1&quot;&gt;ai #ai 模型&lt;/h1&gt;
&lt;p&gt;提供本地音频理解、系统说明、JSON 模式等功能&lt;/p&gt;
&lt;p&gt;2024 年 04 月 09 日&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developers.googleblog.com/2024/04/gemini-15-pro-in-public-preview-with-new-features.html&quot;&gt;Gemini 1.5 Pro Now Available in 180+ Countries; With Native Audio Understanding, System Instructions, JSON Mode and More - Google for Developers&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/google-gemini/cookbook/blob/main/quickstarts/Audio.ipynb&quot;&gt;cookbook/quickstarts/Audio.ipynb at main · google-gemini/cookbook · GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;gpt-4-turbo-升级默认自带-vision-功能&quot;&gt;GPT-4 Turbo 升级，默认自带 Vision 功能&lt;/h2&gt;
&lt;p&gt;2024 年 04 月 10 日 chatgpt 模型更新，gpt-4 turbo 默认自带视觉功能&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://platform.openai.com/docs/models/continuous-model-upgrades&quot;&gt;Models - OpenAI API&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f3c90f7e705d65870e660bdf3232476812eb01dade5b05df9f70ffb6fce0ef98.png&quot; alt=&quot;Pasted image 20240412132426&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;mistral-8x22b-开源&quot;&gt;Mistral 8X22B 开源&lt;/h2&gt;
&lt;h1 id=&quot;ai-ai-模型-2&quot;&gt;ai #ai 模型&lt;/h1&gt;
&lt;p&gt;2024 年 04 月 10 日&lt;/p&gt;
&lt;p&gt;大小为 281.24 GB&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;magnet:?xt=urn:btih:9238b09245d0d8cd915be09927769d5f7584c1c9&amp;#x26;dn=mixtral-8x22b&amp;#x26;tr=udp%3A%2F%[http://2Fopen.demonii.com](&amp;#x3C;https://t.co/2UepcMGLGd&gt;)%3A1337%2Fannounce&amp;#x26;tr=http%3A%2F%[http://2Ftracker.opentrackr.org](&amp;#x3C;https://t.co/OdtBUsbeV5&gt;)%3A1337%2Fannounce
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c9459efd40c5469ae403d27b722c49bc7c64d21d0188ab7e652e8d779bdf0614.png&quot; alt=&quot;Pasted image 20240412132030&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;meta-platforms-下周将推出-llama-3-的小型版本&quot;&gt;Meta Platforms 下周将推出 Llama 3 的小型版本&lt;/h2&gt;
&lt;h1 id=&quot;ai-ai-模型-3&quot;&gt;ai #ai 模型&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s/vU7dB-NT6bfVjcxALLSW0g&quot;&gt;mp.weixin.qq.com/s/vU7dB-NT6bfVjcxALLSW0g&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2024 年 04 月 09 日&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c77c8f8f395641c54b04a246f708e652952c21b13c09131ae7d735c80c690b94.png&quot; alt=&quot;Pasted image 20240412133443&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;去水印&quot;&gt;去水印&lt;/h2&gt;
&lt;h1 id=&quot;ai-ai-应用&quot;&gt;ai #ai 应用&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://t.co/P6Touuxbap&quot;&gt;https://inpaintweb.lxfater.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/1e9d2b0506e30f0167b063fc2ce031297159a389369831e1cc9f6d7cdfd6e4be.png&quot; alt=&quot;Pasted image 20240412131646&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;dify-支持-workflow&quot;&gt;Dify 支持 workflow&lt;/h2&gt;
&lt;h1 id=&quot;ai-ai-应用-1&quot;&gt;ai #ai 应用&lt;/h1&gt;
&lt;p&gt;2024 年 04 月 8 日&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/53998631278b4f2c83cd4c703e4ab76f1862d7950f467a1d684aa029201ffd43.png&quot; alt=&quot;Pasted image 20240412112050&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;introducing-command-r-a-scalable-llm-built-for-business&quot;&gt;&lt;a href=&quot;https://txt.cohere.com/command-r-plus-microsoft-azure/&quot;&gt;Introducing Command R+: A Scalable LLM Built for Business&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2024 年 04 月 04 日&lt;/p&gt;
&lt;h1 id=&quot;ai-ai-模型-4&quot;&gt;ai #ai 模型&lt;/h1&gt;
&lt;p&gt;Command R+ 简介：专为企业打造的可扩展 LLM&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6690e7ec2a27fe218244b5ed93475c3ab01fb88b665dcf45b29aa21af80c03b4.png&quot; alt=&quot;Pasted image 20240412131555&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/04/20240412-0a3ee5e407f30e3b834086bb59b11501.png&quot; alt=&quot;Pasted image 20240412113939&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;github---nilsherzigllocalsearch&quot;&gt;&lt;a href=&quot;https://github.com/nilsherzig/LLocalSearch&quot;&gt;GitHub - nilsherzig/LLocalSearch:&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;LLocalSearch 是一个使用 LLM 代理的完全本地运行的搜索聚合器。用户可以提出一个问题，系统将使用一系列 LLM 找到答案。用户可以看到代理的进度和最终答案。无需 OpenAI 或 Google API 密钥。&lt;/p&gt;
&lt;h1 id=&quot;ai-ai-应用-2&quot;&gt;ai #ai 应用&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e8bdcbb08703144a5b47a9d6f3c7688548131d57d97c9ede4d9874ca7f9f57a3.png&quot; alt=&quot;Pasted image 20240412113127&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;explodinginsightscom&quot;&gt;&lt;a href=&quot;https://www.explodinginsights.com/&quot;&gt;explodinginsights.com&lt;/a&gt;&lt;/h2&gt;
&lt;h1 id=&quot;ai-ai-应用-3&quot;&gt;ai #ai 应用&lt;/h1&gt;
&lt;p&gt;爬取 Fiverr 的数据，总结出痛点&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/5e85dd74e67a626564a0ab1ed5e042a12c19670a80f02d4d00526f35d9e00efa.png&quot; alt=&quot;Pasted image 20240412112947&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;爬取 Fiverr 上的需求列表&lt;/p&gt;
&lt;h2 id=&quot;技术的涟漪效应rag-与-long-context-的认知冲突--橘子汽水铺&quot;&gt;&lt;a href=&quot;https://quail.ink/orange/p/technological-ripple-effect-rag-and-long-context-cognitive-conflict&quot;&gt;技术的涟漪效应：RAG 与 Long Context 的认知冲突 | 橘子汽水铺&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;2024 年 04 月 07 日&lt;/p&gt;
&lt;h1 id=&quot;ai-ai-阅读-1&quot;&gt;ai #ai 阅读&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b63d8fd89d44c8144e1b7f8ddb2a1ca1193895f42117e6884cb7b54596244c23.png&quot; alt=&quot;Pasted image 20240412112409&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</description><category>周报</category><category>动画</category><category>ai</category><category>ai 模型</category><category>ai 应用</category><category>ai 阅读</category><category>cloudflare</category><category>css</category><category>weekly</category></item><item><title>前端入门的项目</title><link>https://blog.kazoottt.top/posts/projects-to-get-started-on-the-front-end/</link><guid isPermaLink="false">urn:blog:57d0a62c-c9c9-5f35-92df-820ed01cfb1e</guid><pubDate>Thu, 11 Apr 2024 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;前端入门的项目&quot;&gt;前端入门的项目&lt;/h1&gt;
&lt;p&gt;之前一个朋友问了我一下前端入门的项目，感觉是比较通用的，所以也同步到博客上吧。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我当时的学习路线是：先去 freecodecamp 学了一下前端的基础（css + js + html），做了它的练习之后对前端有一个大概的了解。&lt;/p&gt;
&lt;p&gt;然后就是开始学框架做项目了。首先要挑一个框架作为主要的学习目标。这里有两种方式，一种是看文档学知识，另一种是从项目中去学习。&lt;/p&gt;
&lt;p&gt;如果是文档的话，可以先看官方的文档，不需要记住所有的内容，对这个框架会有一个大概的了解，后面遇到问题检索一下关键词去搜索就可以了。&lt;/p&gt;
&lt;p&gt;然后挑一个项目或者自己做项目来加深实践。&lt;/p&gt;
&lt;p&gt;如果是看别的人项目，或者在别人的项目上休怪。目前前端比较适合入手的项目主要还是博客、gpt 的套壳 ui。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;博客的话，你可以想一下自己的博客里想加什么功能，或者看一下博客的某个功能是怎么实现的。比如说目录大概这个功能，它是怎么从一个 markdown 的内容中解析#标题，然后生成大纲的。怎么把自己 github 的热力图给嵌入到博客中，有哪些库可以使用，&lt;a href=&quot;https://github.com/grubersjoe/react-activity-calendar&quot;&gt;GitHub - grubersjoe/react-activity-calendar: A flexible React component to display activity data in a calendar (heatmap).&lt;/a&gt; 以及它的库实现思路。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这些博客都是做的很好的：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cali.so/&quot;&gt;Cali Castle | 开发者、设计师、细节控、创始人&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://innei.in/&quot;&gt;静かな森 - 致虚极，守静笃。&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;gpt 的套壳的话目前比较火。现在 google gemini api、groq api 都是可以免费使用的。可以看一下别人是怎么接入它的，以及流式和非流式是怎么解析和展示的。比较经典的例子是：
&lt;a href=&quot;https://github.com/babaohuang/GeminiProChat&quot;&gt;https://github.com/babaohuang/GeminiProChat&lt;/a&gt;（比较简洁）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/lobehub/lobe-chat&quot;&gt;GitHub - lobehub/lobe-chat: 🤯 Lobe Chat - an open-source, modern-design LLMs/AI chat framework. Supports Multi AI Providers( OpenAI / Claude 3 / Gemini / Perplexity / Bedrock / Azure / Mistral / Ollama ), Multi-Modals (Vision/TTS) and plugin system. One-click FREE deployment of your private ChatGPT chat application.&lt;/a&gt;（大杂烩比较复杂）&lt;/p&gt;
&lt;p&gt;然后如果是自己做项目的话，可以想一下平时有没有遇到过什么不便利的地方，“要是 xxx 就好了”，我一般都会把这种想法存下来，然后有空的时候就去实现它。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/1eb377845a53dfeab65f5ae4ddb1750407cff826a2778cbe1bb2dedb7c4f7e63.png&quot; alt=&quot;Pasted image 20240405180056&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;然后现在大模型也很用，无论是解释代码还是帮忙写代码。&lt;/p&gt;
&lt;p&gt;可能开头的回答并不能拿来用，但是在完善提示词的过程中，也是对需求的进一步分析，写着写着自己也知道要怎么去做这个需求了。&lt;/p&gt;</description><category>笔记</category><category>博客开发</category><category>前端框架</category><category>前端入门</category><category>项目学习</category><category>API</category><category>Gemini</category><category>GitHub项目</category><category>GROQ</category></item><item><title>如何实现在markdown中渲染iframe</title><link>https://blog.kazoottt.top/posts/how-to-render-iframes-in-markdown/</link><guid isPermaLink="false">urn:blog:255a4ee3-1de4-5844-9256-d057bdd2c256</guid><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;1-如何实现在-markdown-中渲染-iframe&quot;&gt;1 如何实现在 markdown 中渲染 iframe&lt;/h1&gt;
&lt;p&gt;demo 展示地址：&lt;a href=&quot;https://markdown-preview-eosin.vercel.app/demo&quot;&gt;Create Next App&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;项目源代码：&lt;a href=&quot;https://github.com/KazooTTT/markdown-iframe-preview/&quot;&gt;https://github.com/KazooTTT/markdown-iframe-preview/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/KazooTTT/markdown-iframe-preview/&quot;&gt;https://github.com/KazooTTT/markdown-iframe-preview/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;使用的 markdown 渲染器是：&lt;a href=&quot;https://github.com/remarkjs/react-markdown&quot;&gt;GitHub - remarkjs/react-markdown: Markdown component for React&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/bd6096a56743a3ba28f590b3349ac7c755ffa28315cbb753a87b06737f260489.png&quot; alt=&quot;https://pictures.kazoottt.top/2024/04/20240401-99bfb1d8434e94e5b66182ed42bc09b7.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;有两种方案，第一种是 iframe 以 html 的语法嵌入（1），第二种是重写 a 标签把它转化为 iframe（3）。&lt;/p&gt;
&lt;h2 id=&quot;11-iframe-直接嵌入-markdown&quot;&gt;1.1 Iframe 直接嵌入 markdown&lt;/h2&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;markdown&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;markdown&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-light-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold&quot;&gt;### 1.1.1 Iframe&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;&amp;#x3C;iframe src=&quot;./&quot; width=&quot;100%&quot; height=&quot;500&quot;&gt;&amp;#x3C;/iframe&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;参考：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/remarkjs/react-markdown/issues/661&quot;&gt;iFrame Not Rendering · Issue #661 · remarkjs/react-markdown · GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/remarkjs/react-markdown?tab=readme-ov-file#appendix-a-html-in-markdown&quot;&gt;GitHub - remarkjs/react-markdown: Markdown component for React&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;也就是引入 rehypeRaw 这个 rehypePlugin，实现在 markdown 中嵌入 html。&lt;/p&gt;
&lt;p&gt;（谨慎使用，需要保证 html 内容安全的情况下嵌入）&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;tsx&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;tsx&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; Markdown &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;react-markdown&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; rehypeRaw &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;rehype-raw&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; DempPage&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;Markdown&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; rehypePlugins&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{[rehypeRaw]}&gt;{markdownContent}&amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;Markdown&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2 id=&quot;12-a-标签转化为-iframe&quot;&gt;1.2 a 标签转化为 iframe&lt;/h2&gt;
&lt;p&gt;在某些情况下我们需要把 a 标签的对应的网页直接展示出来，这个时候就要把 a 标签转化为 iframe 了。实现的方法是重写 a 这个组件。&lt;/p&gt;
&lt;p&gt;下面是我的写法，我需要把链接中有 &lt;code&gt;/agent/special&lt;/code&gt; 的所有的链接都以 iframe 的形式展示出来。于是做了一个特殊判断来实现这个逻辑。对于其他的不满足要求的 a 标签，则直接渲染为 a 标签即可。&lt;/p&gt;
&lt;p&gt;这里还可以做一些拓展的写法，比如检查到网易云的音乐链接，就在前面加一个网易云的 logo，如果检测到外链那么点击的时候打开新的窗口等等。&lt;/p&gt;
&lt;figure data-rehype-pretty-code-figure=&quot;&quot;&gt;&lt;pre tabindex=&quot;0&quot; data-language=&quot;ts&quot; data-theme=&quot;github-light github-dark&quot;&gt;&lt;code data-language=&quot;ts&quot; data-theme=&quot;github-light github-dark&quot; style=&quot;display: grid;&quot;&gt;&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;import&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; Markdown &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt; &quot;react-markdown&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt; &lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt; DemoPage&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; () &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;Markdown&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    components&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{{&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;      a&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(props) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        const&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;href&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;children&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; } &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; props;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (href &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; href.&lt;/span&gt;&lt;span style=&quot;--shiki-light:#6F42C1;--shiki-dark:#B392F0&quot;&gt;indexOf&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;/agent/special&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;--shiki-light:#005CC5;--shiki-dark:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;          return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;            &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;iframe src&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{href} width&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;100%&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; height&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;500&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; allowFullScreen &lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;/&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;          );&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#6A737D;--shiki-dark:#6A737D&quot;&gt;        // 否则,渲染为普通的 &amp;#x3C;a&gt; 链接&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;          &amp;#x3C;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;a href&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;{href} target&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;_blank&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt; rel&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;--shiki-light:#032F62;--shiki-dark:#9ECBFF&quot;&gt;&quot;noopener noreferrer&quot;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;            {&lt;/span&gt;&lt;span style=&quot;--shiki-light:#E36209;--shiki-dark:#FFAB70&quot;&gt;children&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;          &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;        );&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;      },&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    }}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  &gt;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;    {markdownContent}&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;  &amp;#x3C;/&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;Markdown&lt;/span&gt;&lt;span style=&quot;--shiki-light:#D73A49;--shiki-dark:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span data-line=&quot;&quot;&gt;&lt;span style=&quot;--shiki-light:#24292E;--shiki-dark:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;</description><category>笔记</category></item><item><title>2024 一次很突然的香港之行</title><link>https://blog.kazoottt.top/posts/a-very-abrupt-trip-to-hong-kong/</link><guid isPermaLink="false">urn:blog:b16b1c37-ff69-51ca-9584-d15399b85cfe</guid><pubDate>Sat, 23 Mar 2024 00:00:00 GMT</pubDate><description>&lt;p&gt;趁着生日假去了一趟香港，虽然因为某些业务需求一直都想去一趟，也在去年就办好了通行证。但是真正做决定到买机票订酒店只提前了一周，算是非常冲动的决定。&lt;/p&gt;
&lt;p&gt;出发的时间是周三晚上，下班后坐地铁去了机场，吃了一顿不太划算的意面。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6a488a2d4fa4a807c19a42e5b1fc8ce0df5175ba1ec484ee11b6a987e6afe013.jpg&quot; alt=&quot;IMG-20240902220241065&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后我就犯了第一个错，去自助值机的时候提示购票人的信息和证件（通行证）的信息不符合，这个时间我才发现我打错拼音了，我服了我自己这种低级错误也会犯。&lt;/p&gt;
&lt;p&gt;然后去柜台咨询，他们说没有权限改名字，要我自己去给航空公司客服打电话，那一刻真的有点慌，脑内不断幻想自己遗憾离场的场景，很可惜刚好错过了投稿环节 hhh。&lt;/p&gt;
&lt;p&gt;于是我尝试给航空公司打电话，这个时候离登机还有不到两小时，小姐姐听到情况并核实身份后帮我办了加急，不到十分钟就提示信息改好了，终于值机成功了😂然后开始登机。&lt;/p&gt;
&lt;p&gt;落地的时候大概是 2024 年 03 月 21 日 0 点，由于时间比较晚，窗口只有几个，所以也花了不少时间。然后就坐上了双层巴士，我第一次见到速度这么快的巴士...，而且下车是需要自己按铃的，速度太快导致我不知道该什么时候下车，i 人真的很怕别人的眼光...&lt;/p&gt;
&lt;p&gt;拍拍路灯&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/132dc02976999d90647d45ef7bd7cea692209dccbaaf0a0fba15c3e524ca13df.jpg&quot; alt=&quot;IMG-20240902220241207&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;街边的广告，有点让我联想到椰树椰汁&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f942485a483e69c86819ca285b80762014bcd83bd0a7a440ebb02d05efbb2035.jpg&quot; alt=&quot;IMG-20240902220241294&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;大概坐了一个小时到了铜锣湾，之前订酒店的时候发现铜锣湾有家一兰拉面，抱着一个想试试主播之前吃过的同款的想法，我下车后没有去酒店，而是先去了一兰拉面，这家店营业到凌晨 4 点。&lt;/p&gt;
&lt;p&gt;白天大概是要排队的，我到的时候已经快两点，人很少直接进。接待的店员讲的是英文，和他们交流的时候我发现我根本不好意思开口讲英文 T T，不过还是鼓起勇气蹦了几个单词，成功点好了单。（上菜的店员讲的是日文）&lt;/p&gt;
&lt;p&gt;我就点了一个 98 的面后来又加了一份面，算上服务费，大概是 120 人民币。&lt;/p&gt;
&lt;p&gt;个人感觉还是挺好吃的，不过确实有点贵 hhh&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4c7df3f93a04642011905765c21aa1f12c1c2c0214177afd8210fff1569e33cf.jpg&quot; alt=&quot;IMG-20240902220241377&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d0a0f43058eca90e4147a8f1e8b69e19e6a356606fbf6381cf95c605bb3613d4.jpg&quot; alt=&quot;IMG-20240902220241447&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;吃完拉面就回酒店休息了。犯了第二个错是插头转化器买成了内地插头转香港插头的...从包里拿出来我才发现。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4e64533185be26096f94cdf6805ddca56174d1d7341d70731a53da2524f2b80c.jpg&quot; alt=&quot;IMG-20240902220241525&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;白天起了个大早去干活~ 这天中午和高中同学约了午饭，不过她 12 点下班，于是我继续开始闲逛。&lt;/p&gt;
&lt;p&gt;在公交车站看到了崩铁广告 2333&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/962afd793b48cf29deaf2332df7da2e58829a890cb67908c3bffb8701991cfa6.jpg&quot; alt=&quot;IMG-20240902220241652&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;凉果零食专卖店&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/0a7c13c21182da38bdaf488d9f9bcbafb30f7698ae4268f66474ffbfa98f8a09.jpg&quot; alt=&quot;IMG-20240902220241770&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后还去了时代广场和维港，初中的时候来过，但已经没有什么印象了，只记得林青霞的手印😂&lt;/p&gt;
&lt;p&gt;然后就到了午饭时间，和 6 年没见的高中同学见面了！555&lt;/p&gt;
&lt;p&gt;跟她一边吃饭一边聊天真的好放松，聊了最近的生活、工作，还有之前的同学，现在的兴趣爱好放松方式等等。还意外得知她就在我经常使用的一个软件所在的公司工作，好巧好巧。&lt;/p&gt;
&lt;p&gt;本来是想 AA 的，但是她执意要请客，🥹，这是在香港最贵的一顿饭 555。下次见面我要请回来 2333&lt;/p&gt;
&lt;p&gt;烤酸奶&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a2d0729983c8932bbf89cd060417474e5be2f741b4af6b4121716a8656e5f0fe.jpg&quot; alt=&quot;IMG-20240902220241848&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;肠粉（第一次吃这种肠粉，里面还有油条，感觉口感很神奇&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/498cd932c4183d144a536e9ebbb57d37e4e35bc880d6b28ff0c9c3fd89f84b33.jpg&quot; alt=&quot;IMG-20240902220241930&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;虾饺&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/9de04231ff2f53ae8cfc9401ff1b36997bac4623b3a5154d8ea21889c28a5a00.jpg&quot; alt=&quot;IMG-20240902220241992&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;炒牛河&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/21097f833a5b7db2408888c72074d11609ac951306c89bba9a4331fecfb51953.jpg&quot; alt=&quot;IMG-20240902220242075&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;蒸排骨&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/89d5a68bf6d83052cf374743bf8fb3c2a92ead36453553531b67a3d1397c6b8e.jpg&quot; alt=&quot;IMG-20240902220242147&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后还请我喝了冰抹茶，我点的时候没注意菜单，没有加奶😂感觉一股草的味道，看来我还是不太能接受纯抹茶。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a11dfc4b9d2f4d2c4a1b9657ed1ac87e8f7b00575ab2ceab0082dea49ad91428.jpg&quot; alt=&quot;IMG-20240902220242239&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/8d756a2e7a73b6e2c6e45e0095745c76fa93f0840180d4c5e8d34565d0413d29.jpg&quot; alt=&quot;IMG-20240902220242343&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;吃完午饭散了散步，她又要回去工作了，于是走到她公司楼下跟她抱了抱就告别了 T T&lt;/p&gt;
&lt;p&gt;感觉高中毕业后要再见到这些同学真的很难了，不过也是因为很困难，再见到的时候会额外开心。&lt;/p&gt;
&lt;p&gt;告别后我就继续闲逛和吃吃喝喝，看着时间差不多了便去了机场，回到上海第二天继续工作。&lt;/p&gt;
&lt;p&gt;虽然换了点港币但是除了交酒店押金外一点没用上，绝大部分情况支付宝和微信都够用了，于是在机场又存回去了😂。&lt;/p&gt;
&lt;p&gt;也就是其实待在香港的时间就一天，属于是非常特种兵的行程了。真羡慕那些假期多的人。&lt;/p&gt;
&lt;p&gt;流水账到此结束，希望新的一岁迷茫能少一些，稳中有升。&lt;/p&gt;</description><category>随笔</category></item><item><title>2024-W08</title><link>https://blog.kazoottt.top/posts/2024-W08/</link><guid isPermaLink="false">urn:blog:8ba72e9b-f1fc-5635-8559-882d2fb50455</guid><pubDate>Fri, 23 Feb 2024 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;2024-w08-推荐一些软件&quot;&gt;2024-W08 推荐一些软件&lt;/h1&gt;
&lt;h2 id=&quot;alttab&quot;&gt;AltTab&lt;/h2&gt;
&lt;p&gt;可以替代 mac 的 tab，个人感觉是比原始的 tab 更方便和舒适的。&lt;/p&gt;
&lt;p&gt;官网地址：&lt;a href=&quot;https://alt-tab-macos.netlify.app/&quot;&gt;AltTab - Windows alt-tab on macOS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/03/20240325-7864a099b4db48ca82ab17edf250943b.png&quot; alt=&quot;Pasted image 20240223211618&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;tickeys&quot;&gt;Tickeys&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.yingdev.com/projects/tickeys&quot;&gt;Tickeys | 找对打字的感觉 | YingDev&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a501198ce5076dca8d83ed8a178447d8281e03a07116506545e84bc81312fb9c.png&quot; alt=&quot;Pasted image 20240225140312&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;让打字带上炫酷的音效&lt;/p&gt;</description><category>周报</category><category>软件推荐</category><category>项目推荐</category></item><item><title>2023 厦门探店合集</title><link>https://blog.kazoottt.top/posts/national-day-xiamen-and-hangzhou-travel-store-collection/</link><guid isPermaLink="false">urn:blog:c64e2b73-77df-5ac6-a44c-1dfb8b2cab44</guid><pubDate>Thu, 22 Feb 2024 00:00:00 GMT</pubDate><description>&lt;h2 id=&quot;奶茶与咖啡&quot;&gt;奶茶与咖啡&lt;/h2&gt;
&lt;h3 id=&quot;薄荷森林&quot;&gt;薄荷森林&lt;/h3&gt;
&lt;p&gt;喝到了主播推荐的薄荷森林的薄荷生打椰，确实有一点薄荷牙膏的味道，但是很好喝，很清爽不腻~&lt;/p&gt;
&lt;p&gt;什么时候开到上海啊，还想再喝一次。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e0fe6e4d0cdefbd06b8c081b983c827c5a11ce020a11b0101e289dc3e97bfacb.jpg&quot; alt=&quot;k27h5&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;野台风&quot;&gt;野台风&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/52669b18dc9c973098c70c2a3b1859dbf417bf7648f29bd36a0e4e61a1ff67e0.jpg&quot; alt=&quot;93jpx&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;我点的是圆规和 dirty，圆规没有什么咖啡的味道，对于不习惯喝咖啡的人来说，接受度应该也比较高。搭配柿子和西柚，整体是甜的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/64ed7417de5276666029184e2b80925cbebeb1682c1e1de637f95596759793e7.jpg&quot; alt=&quot;b8e86&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a26ab36829f4e80c0b4238501dec570f8d2020cdcb4772eb03e527578d61444a.jpg&quot; alt=&quot;szoz1&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;这是我点的 dirty，这个杯子还挺好看的种草，味道口感没有特别的。因此建议去的话，直接点特调就好了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/11fc7936b8f20043c1174e57074e78de0528b3745c1c01fed278f456fef6073d.jpg&quot; alt=&quot;t7og1&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;小姐姐还送了我们每人一小杯凤梨酥。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/df2906b712cf6374e54a2f127ed2b3f93f4c18ec5341a5df8dc460320d9614e4.jpg&quot; alt=&quot;yfsfo&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;别的朋友点的，&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/ca2dfe2f71b4388025ed697cb3bee390201cd2a044137972a63c61739cd1b7e0.jpg&quot; alt=&quot;t62f8&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/02bd977eb99ff5f0b3d0a3b28e92cab51a8655bddf5b4c891e22816fb4964456.jpg&quot; alt=&quot;jui3a&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/541de4c11bcbf618e7b0c6c5224422b8a25a481cacc1b001206c42ad4197776c.jpg&quot; alt=&quot;kownc&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/9acab73e0779886c3c8f2d6af8d6fbe058067e2f53d11e91cc21a1619ab44b9d.jpg&quot; alt=&quot;jcqqm&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/290a38a4bbd972ad6fb32d1d6338767dd9f5b94074b3e32ac053f2e2f6451bd5.jpg&quot; alt=&quot;p3njg&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/aea973ab5e6b5e89a7b6469ff3e5871996dedf774b94d6c47dcb1e26765c110a.jpg&quot; alt=&quot;u246p&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;店里的音箱是 marshall，还有卖的器具。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/1e4f5efaeefac46a903e58614edeaef20759da6aff8fa1fd861d42ddb04f53e4.jpg&quot; alt=&quot;hu77j&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;seven-bus&quot;&gt;Seven Bus&lt;/h3&gt;
&lt;p&gt;去了 seven bus，点的是杏仁牛油果冰淇士。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/9efd8bf5524725682f1d16fbdaecf751cbd2baf4faa298ee896cd1200aa694f3.jpg&quot; alt=&quot;ew53g&quot; loading=&quot;lazy&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://blog.kazoottt.top/media/ec0c2cd650fc549227628587b4778e578721077bb1af66e41b8332463601c4c7.jpg&quot; alt=&quot;yle1e&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240720-c26f079a2bcf2e46c3909bb001cd73f8.jpg&quot; alt=&quot;f7b3m&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/754e13b26663a70a8aab5c7beee6750febd33085b378db9630c4b1f6a95c0d89.jpg&quot; alt=&quot;fafh4&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/317d0069dcdc2b9702d09b33f3c6d8482f47e59522e143838b0ccb8172e98f08.jpg&quot; alt=&quot;7d2du&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;野草莓确实是好吃不贵，性价比超级高。&lt;/p&gt;
&lt;h3 id=&quot;宴遇-12&quot;&gt;宴遇 1/2&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240720-da8c97730099fd8a6f2440c4f65d8046.jpg&quot; alt=&quot;k6qd7&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;酸菜鱼，没有什么刺，对于我这种不会吃鱼的人来说很友好。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/07/20240720-627d24ec84a2e5f9296eab6fc4a4cd0d.jpg&quot; alt=&quot;96zi3&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;火焰黑椒安格斯小牛肉，上菜时会喷一下火，挺炫酷的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/19559698d758cd2d48144c9e41cca0d05abe92173e3fbeb68793dd372e8c7b9d.jpg&quot; alt=&quot;exp2d&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;东山小管&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/911a8527acdf0f7b044c796f7e43965d8a2f746d965a88cf13cb830555c24039.jpg&quot; alt=&quot;7z7la&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;大红袍鲜奶布丁，口感很巧妙，好吃！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f8fe36a30131b859150ec345c3481b6bdfd06c5d17740e81354df1028be82582.jpg&quot; alt=&quot;nr6ck&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;忘了这是什么&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/dce11d137b38d30534c6e35e341a43ff81e3383cd3dd1b0605a13fec0d36eaee.jpg&quot; alt=&quot;kymci&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;土笋冻，之前看别人对于土笋冻的反馈有些两极分化？但实际上吃的时候感觉接受度还挺高的。一口吃下去，觉得口感像果冻？味道也不错。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a5a518564689a182506719d04705dfd12dc05539db57e52b050f74d7828d1a88.jpg&quot; alt=&quot;hlzr7&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;姜母鸭，好吃好吃，很香，吃到后面把姜也挑出来吃掉了。还想再吃一次。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a1cf9a0ca953b31c8e21b87bea812ad45777fc4f370f61eb8f7437954e3cfa63.jpg&quot; alt=&quot;bgtpm&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;好像是什么芋头。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e47220e3a298ce9014c3a08ef356cc3a05585d8529bbbe5c26620275e0542e57.jpg&quot; alt=&quot;b1y3r&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;来个全景&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/656f9424c6aa107cc3be3d4b821815fdd50697c1a2520cbe5cd19f04b06f4180.jpg&quot; alt=&quot;to2ts&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;感觉都挺好吃的，特别喜欢的是鲜奶布丁和姜母鸭。第一次体验博饼，最后中的里面都是鲜奶布丁 hhh。&lt;/p&gt;
&lt;h3 id=&quot;叽叽扎扎烤肉&quot;&gt;叽叽扎扎烤肉&lt;/h3&gt;
&lt;p&gt;然后去了叽叽扎扎烤肉，由于路程太堵，打车速度极慢，我们选择了骑车前往（感觉我们的技术都还不错 hhh）小插曲是 73 的手机没电了，然后在快要到店里的时候走了另一条路，我们以为她跟丢了然后分头去找，没想到她在没有导航的情况下直接到了店里，强！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/63adbe8c77951e8d81d8597bc0c93b5fd12eef4d12440944fb3dcd3c688015e4.jpg&quot; alt=&quot;nuwxv&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/5476c954078841f73c69a4ed0390c3b1ab66662cd429df81215eddec4f2d19dc.jpg&quot; alt=&quot;kwvzd&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/7f4783e0f84d593474a9dda332a64fa3b50799aa14e344c0ab30fa8a8ea0fe66.jpg&quot; alt=&quot;e2blg&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;烟熏咖啡和牛&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/3df85b6f3e2c7cd31900a71aa013086ecc06529dc61bcad8be8500cfdfbc0255.jpg&quot; alt=&quot;q6u8q&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;水果小牛排&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a08472f43bfde202ba84f7e9c3c17e22943891684c8d8fc543a297636648140c.jpg&quot; alt=&quot;g77yu&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;味道都很不错，值得一提的是它每道菜的调味都不太一样，不像有的烤肉店虽然菜品不同但调味类似，很有各自的特色，很棒。&lt;/p&gt;
&lt;h3 id=&quot;七星西鹭鸭胫店&quot;&gt;七星西鹭鸭胫店&lt;/h3&gt;
&lt;p&gt;味道非常合我胃口，超级下饭，吃了好几碗。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/53496d3d5f8ee593ea5ed0587c65ce429bfbaa096b147f1e286042e8e14a02aa.jpg&quot; alt=&quot;bcwdt&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;拌猪肝&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c316c094c9dbea3c83ac4a6380265935315a8caef2280650beb1c54db17dc582.jpg&quot; alt=&quot;d037i&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;拌鸭肠&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f9d7028ce4db30e16df4aea9ae144082775d53b57448a4277f5bdf2461dbadfe.jpg&quot; alt=&quot;bvh3v&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;炸丝丁鱼，第一次吃，和炸小黄鱼是完全不同的味道，感觉这个有点奶味？&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/1273a4416884064220390d7c2c0dd2300e354a38bdcc77ba01e821f413445a25.jpg&quot; alt=&quot;dg6xv&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;拌鸭胫&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c7d0565430264629cddd42bf998f426d458deec3e2999f2dc9981f20fd6206b4.jpg&quot; alt=&quot;qn4wy&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;水煮牛肉&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/33935cbe88431560fe4bba52d44c9fc173a5b788ffe9c0404b8347653d70eb5d.jpg&quot; alt=&quot;2bdcc&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;全局照&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e1718c8f2797fd12942c3259350ca8a8e66e6e7ba33c697aca13e55725ebcc81.jpg&quot; alt=&quot;hagwr&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;醋肉和炒时蔬忘记拍了。总之就是，好吃好吃好吃。&lt;/p&gt;
&lt;h3 id=&quot;傲客夜食&quot;&gt;傲客夜食&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/aab664f00d6af9841d9a7c30167e470704d0a7d5d76cf3aca200a28235970231.jpg&quot; alt=&quot;nhtb9&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;麻辣烤鱼&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b1392c6542d12d05cde888c40bf42d4c182bebe24c77dcbc3997f001e9170cba.jpg&quot; alt=&quot;kiz18&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;猪肝&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/5e3957f50ab41bad3f8ad8531492ad3ff60e1f2fd4c87e2b54cf166f2fc715fb.jpg&quot; alt=&quot;gk0lw&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;冰粉，好久没吃过了 555&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/17b0cce7ae14bd9b2121b3fcd1a4ac90719f9f89319d8400b2c08d8af6456ad2.jpg&quot; alt=&quot;9jhwf&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;最后&quot;&gt;最后&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b17cd128942304d967ffcb4e30bb1bb9997da7c5d96375654d2ca678b734c64c.jpg&quot; alt=&quot;zupwe&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</description><category>随笔</category><category>国庆</category><category>旅游</category><category>厦门</category><category>hanser</category></item><item><title>一次受骗经历</title><link>https://blog.kazoottt.top/posts/an-experience-of-deception/</link><guid isPermaLink="false">urn:blog:625c8813-fcb3-5f2e-9767-ec57cd9d5aeb</guid><pubDate>Tue, 23 Jan 2024 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;一次受骗经历&quot;&gt;一次受骗经历&lt;/h1&gt;
&lt;p&gt;主播以及直播间的毛怪们，晚上好。今天想跟大家分享一下我的受骗经历。&lt;/p&gt;
&lt;p&gt;一、受骗&lt;/p&gt;
&lt;p&gt;2017 年的我还是一个清澈愚蠢的大学生。某天路过成都春熙路的某地下商场入口时，一个发传单的人 A 把我拉住，一直问我要不要领免费的护肤品，我推托不下就跟着他去了他们店铺所在的地下商场。&lt;/p&gt;
&lt;p&gt;进店后有两个店员 B、C。B 让我躺下去，然后说：&quot; 我们免费给你做面部检测，情况好的话就不用清理，情况不好的话需要清理有 68 和 98 的，看你的情况而定。&quot;&lt;/p&gt;
&lt;p&gt;然后检测完之后，B 就说：&quot; 哎呀你这个情况很糟糕呀，需要 98 的&lt;strong&gt;局部清理&lt;/strong&gt;，我们后面还有 598 的&lt;strong&gt;全面清理&lt;/strong&gt;balabla。&quot;  然后 B 把 C 叫过来扫码收款，付了 98。&lt;/p&gt;
&lt;p&gt;这里有两个细节：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在我付完款之后，他们要求看银行付款短信，我没多想就给他们看了，短信里显示了我的卡里面还有 5400+，这很可能是他们卡着价格骗我 4600+ 的原因。&lt;/li&gt;
&lt;li&gt;B 和 C 都问过我在成都有没有什么亲戚朋友，可能是看我讲的普通话，以为我是人生地不熟的外地人吧。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;B 清理了一下说：&quot; 那我把你这边也清理了吧。&quot;&lt;/p&gt;
&lt;p&gt;她这里的意思就是要做 598 的&lt;strong&gt;全面清理&lt;/strong&gt;了，我没多想就同意了，后面 B 就给 C 喊过来扫一下码，其实这里我已经察觉到不对劲了，但是没能直接果断拒绝。&lt;/p&gt;
&lt;p&gt;问了一下她们：&quot; 可以补差价吗 &quot;。她们说：&quot; 不可以，但是我们可以帮您做仪器。&quot;&lt;/p&gt;
&lt;p&gt;（下一个套路开始了）&lt;/p&gt;
&lt;p&gt;之前在我旁边 B 回了前台，这次换成了 C。&lt;/p&gt;
&lt;p&gt;C：妹妹你想去痘吗？&lt;/p&gt;
&lt;p&gt;我：想吧&lt;/p&gt;
&lt;p&gt;C：我们这个就是为了祛痘的弄的，不想弄我们根本不会帮你们做的。我们要把螨虫弄出来 balabala。螨虫液价格是 380 到多少多少，根据你自己经济情况和脸的情况来。&lt;/p&gt;
&lt;p&gt;我：我不想弄了可以吗&lt;/p&gt;
&lt;p&gt;C：但是刚刚是你说你想祛痘的阿&lt;/p&gt;
&lt;p&gt;我：我觉得算了不想弄了&lt;/p&gt;
&lt;p&gt;C：我刚刚已经跟你说 根据你自己的经济情况和脸的情况来&lt;/p&gt;
&lt;p&gt;⋯⋯（一直重复上面的对话）&lt;/p&gt;
&lt;p&gt;后面 C 就叫我闭着眼睛，把我眼睛蒙上在我脸上戳，还给我脸上涂东西，然后说：&quot; 你这个很严重阿，得 3980 的才行。&quot;&lt;/p&gt;
&lt;p&gt;我：&quot; 不是说根据自己经济情况来的吗 &quot;&lt;/p&gt;
&lt;p&gt;C：&quot; 我刚刚跟你说的很清楚了，是你的经济情况和脸的情况，快点做决定不然对皮肤伤害很大 &quot;。&lt;/p&gt;
&lt;p&gt;然后 C 后面就一直说：&quot; 对你伤害很大 刚刚跟你说的很清楚了 你难道听不懂吗 你听不听得懂 &quot; 之类的话&lt;/p&gt;
&lt;p&gt;对方的意思也就是不付钱不会帮我清除刚刚脸上的东西，不会让我走，无奈我又付了 3980，所以最后被强制消费的金额为 98 + 598 + 3980= 4676 元&lt;/p&gt;
&lt;p&gt;二、维权&lt;/p&gt;
&lt;p&gt;离开店铺后，我第一时间想到的是这件事不能让父母知道，打算卖掉我的闲置物品、找朋友借钱，先把一直没扣的那部分学费交掉，然后我后面去找兼职挣钱还给朋友们。&lt;/p&gt;
&lt;p&gt;但是后来一个人坐着想了很久不想就这么算了。就把事情经过告诉了我爸在成都的同学（下面简称 T 阿姨）以及辅导员。我们三人汇合后，又去了一次店铺但去的时候已经关门了。于是拍了店铺的照片，问了周围的人，了解到这家店风评很不好，并非我一个人在这家店遇到这种强制消费的手段。然后约定在第二天再去商场找那家店一次。&lt;/p&gt;
&lt;p&gt;第二天上午，我和辅导员、T 阿姨还有他的丈夫到了店里后，我和 T 阿姨开始用四川话而不是普通话跟他们沟通。开始并不是很顺利，因为对方一直都在强调说是我自愿的什么的，然后 T 阿姨的丈夫突然猛地拍了一下前台桌子开始大声地跟他们争论，随后辅导员开始讲道理，之后就比较顺利地把 4350 拿回来了，损失了 326 元只能当作是教训。&lt;/p&gt;
&lt;p&gt;分享出来不怕大家笑话，虽然我的操作真的很弱智和怯懦才会被骗成这样，从那以后我变得小心谨慎以及懂得拒绝了很多。希望大家永远不要经历和我一样的事情。&lt;/p&gt;
&lt;p&gt;然后也很感谢当时帮助我的朋友们，得知消息不但没有责备我反而发短信来安慰我的爸妈，以及听到我的情况后马上赶过来帮我的辅导员、T 阿姨和她的丈夫。那时候的我一个人走在路上真的觉得茫然无措，但因为有他们在还是能感受到温暖。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;UID: 391236013&lt;/p&gt;
&lt;p&gt;录播补充：&lt;a href=&quot;https://song.2550505.com/livestreams?date=2024-01-24&quot;&gt;2024年1月24日 - 直播记录 - 毛怪俱乐部&lt;/a&gt;&lt;/p&gt;</description><category>随笔</category><category>受骗经历，强制消费，欺诈行为</category></item><item><title>2024-W02</title><link>https://blog.kazoottt.top/posts/2024-W02/</link><guid isPermaLink="false">urn:blog:ed161f94-ad8d-5edf-bdd3-3ceaad628186</guid><pubDate>Thu, 11 Jan 2024 00:00:00 GMT</pubDate><description>&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/153c436b2b5c72fe5a85dfb8b6c13407c43116473f58b66a9fd5385f65800745.webp&quot; alt=&quot;img_34.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;​## AI and Data Scientist Roadmap&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://roadmap.sh/ai-data-scientist&quot;&gt;https://roadmap.sh/ai-data-scientist&lt;/a&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.kazoottt.top/media/10be8fc3ae075329443793049339a26aae865e8bbe25498934a6d8d55de21c52.webp&quot; alt=&quot;img_35.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;​## 如何培养自己独立开发的能力&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/542d41d9a8550da382c0fe7c15704e0bcb036c0fbde72aab65ef8631f40a04c7.webp&quot; alt=&quot;img_36.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/HiTw93/status/1691811922318946691&quot;&gt;https://twitter.com/HiTw93/status/1691811922318946691&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;​## LLM 论文合集&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/zjunlp/LLMAgentPapers&quot;&gt;https://github.com/zjunlp/LLMAgentPapers&lt;/a&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.kazoottt.top/media/4318a0e3d63ce4c8fa3f30c06523a0841617935fc310d10657118a891169f0b3.webp&quot; alt=&quot;img_37.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</description><category>独立开发</category><category>前端</category><category>设计</category><category>周报</category><category>资讯周报</category><category>ai</category></item><item><title>2023 bw汇报</title><link>https://blog.kazoottt.top/posts/bw2023/</link><guid isPermaLink="false">urn:blog:5c214406-10ec-58a1-b250-7830cdcd8a16</guid><pubDate>Sun, 07 Jan 2024 00:00:00 GMT</pubDate><description>&lt;p&gt;这是我第二次去 bw，上一次去是 2021 年，刚来上海工作的年份。时间过得真的好快，我也发生了很多变化。&lt;/p&gt;
&lt;p&gt;21 年的时候，感觉自己对于这个圈子很懵懂，一直处于观察状态没有可以交流的人。但是到了 23 年，已经认识了许多观点契合的同好，可以一起交流真的很开心。&lt;/p&gt;
&lt;p&gt;与本次 bw 有关的回忆从 20 号中午持续到 23 号晚上，直接从时间顺序开始汇报吧。情感整体比较平淡，一些私人的情绪和想法就留在私底下吧，不想公开去聊这些东西。&lt;/p&gt;
&lt;h2 id=&quot;一20-号&quot;&gt;一、20 号&lt;/h2&gt;
&lt;p&gt;提前一天请了 20 号下午的假，中午一下班就打车前往酒店与小伙伴们汇合。其实去的路上已经开始狂风暴雨甚至路上积水了，但完全沉浸在出行的兴奋中，没有想太多，更没有想过自己明天要经历什么。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c56baa274daa81858d665fb4759ca975fc284d78642fc64ebf2c6219f57d3434.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;1 点半达到酒店后，和队友们见了面打了招呼，虽然从未在现实中见过他们，但是猜 id 和记住 id 一点也不困难。并且对于我这种社恐来说，没有感受到任何不适和紧张感，就像在网上相处一样放松。&lt;/p&gt;
&lt;p&gt;然后还吃了主播安利的黯然销魂饭，确实是挺好吃的，bw 结束之后我还自己又单独点了一次外卖。吃完饭稍微休息了一会儿，便开始工作，工作内容也就是包周边，前期包周边的过程是一个人走一圈然后拿一圈周边包一份，这样会有一些走动和下蹲起立的动作，还是挺累的，在空调房里已经出汗了。当时甚至感觉是今年最大的运动量了（后来才发现是我太乐观了）。&lt;/p&gt;
&lt;p&gt;包了一阵子周边后就和打工毛怪们一起去看了展馆场地的情况，还拉了下围栏，非常乐观地模拟了下 21 号排队的样子。当时看完场馆，最大的感想就是为什么员工入口到 8.1 馆那么远，以及为什么 vr 站台在 8.1 的最里面！好难走，好容易迷路。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/db17f17fc3f6c83fa6b215b26ef4bff717cbd10d6217ebf9fe35679d5b672b43.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;看完场地后又回到了酒店，发现队友们都到齐了~&lt;/p&gt;
&lt;p&gt;一进房间就看到了大咩和卡密，然后走上去不自觉地和大咩老师来了一点身体接触，感觉很亲切！（但是为什么会这样呢 🤔）&lt;/p&gt;
&lt;p&gt;打了招呼后，又继续开始包周边，一直工作到饭点时间，一起出门去吃了一家本帮菜。这也是我第一次吃响油鳝丝，店里的可乐竟然只有百事的，惊了怎会如此！&lt;/p&gt;
&lt;p&gt;吃完饭又继续开始包周边，装箱封箱，约了货拉拉，把要准备的东西都搞定后就回自己房间休息了。&lt;/p&gt;
&lt;p&gt;顺带一提，感觉关上灯后和 73 老师聊天就跟在 yy 聊天一样。&lt;/p&gt;
&lt;h2 id=&quot;二21-号&quot;&gt;二、21 号&lt;/h2&gt;
&lt;h3 id=&quot;上午&quot;&gt;上午&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e5dfe530cb2f8897fe79407c03c89a6e1313370dfcd39377c3c359abfbb5442d.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;这一天早早地起了床，按约好的时间（6 点）到酒店大厅集合。由于货车只能停在停车场，无法开进场馆，所以我们在停车场开始卸货。由于我们只有 5 张可以提前入场的证（2 张参展证，3 张 cos 证），所以只能由我们 5 个人把几大箱周边从员工入口全部运进场 QAQ。然后上午前前后后跑了四趟。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d76c995a99b9ad1b0c487819a289be9b3a16b55ea786d212692507a8622cab6c.webp&quot; alt=&quot;IMG_2855.jpeg&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;第一趟：&lt;/p&gt;
&lt;p&gt;虽然有提前预想到需要使用推车帮忙搬运，主播也提前帮忙买了两个推车，但是万万没想到的是我们在运第一批货进场的时候，其中一个推车的轮子就被磨损到无法正常使用了，大大降低了运输的速度。并且员工入口到 8.1 馆的距离实在太远了，过程十分艰辛。&lt;/p&gt;
&lt;p&gt;第二趟：&lt;/p&gt;
&lt;p&gt;气喘吁吁运完第一趟后，我又抱着推车跑去场馆外接第二批货，结果更是没想到刚把获取搬到仅剩的一个推车上时候，轮子直接脱落了，怎么装也装不上去，最后实在没办法，只能让 ask 和安可先人工把东西抱进去，我留在原地照看剩下的周边。&lt;/p&gt;
&lt;p&gt;我一边在路边尝试组装车轮，一边查看工作群的消息，发现由于 VIP 提前放人，摊位那边已经有人聚集，并且由于除了 173，其他基本都在路上运周边。再后来看到消息，就是场馆那边觉得摊位人聚集太多，要求我们强制发放周边了…&lt;/p&gt;
&lt;p&gt;看着群里的消息焦虑的同时，我选择放弃组装车轮，直接用三轮车 + 手压改变重心的方式运输货物，勉强可以运输动。就先和 ask 一起把东西运进去了。&lt;/p&gt;
&lt;p&gt;这个时候场馆里可以说是水泄不通，寸步难行，没走几步都要喊一句“可以让一下吗，谢谢”“麻烦让一下谢谢”&lt;/p&gt;
&lt;p&gt;第三趟：&lt;/p&gt;
&lt;p&gt;然后和第二趟类似的，把三轮车抱出来和安可一起再把东西运进去。&lt;/p&gt;
&lt;p&gt;第四趟：&lt;/p&gt;
&lt;p&gt;安可先出去接了卡套，但是放身份证的包放在摊位了，没有身份证无法进场，于是我拿着他的包又去了一次场馆外和他一起进来。卡套比较重，虽然提出和安可一起搬，但他拒绝了还是想一个人搬。于是我就在大群里开始摇人，让其他人来 8.1 门口帮我们搬。&lt;/p&gt;
&lt;p&gt;在 8.1 门口见到了星谜和迟到，发现我对声音并不是很敏感，单纯听声音不太能分清楚谁是谁，并且他们的发型和整个人给我的感觉都挺像的，听了他们的自我介绍后，终于分清楚了矮一点的是迟到，高一点是星谜。&lt;/p&gt;
&lt;p&gt;终于忙完回到摊位的时候已经差不多 11 点了，开始帮来摊位的人发憨憨报和专辑兑换卡，偶尔帮忙收一下要交给主播的信件。印象很深的一个 id 是德古马都·绝帝，应该是他来交了信件然后送了咖啡糖。（虽然我不怎么混圈，也不怎么和其他毛怪聊天，但那种线上有印象，然后线下见到真人的感觉还是挺令人开心的。）&lt;/p&gt;
&lt;p&gt;陆陆续续有人过来问周边发放的事情，跟他们解释后，他们也表示谅解然后离开了，感觉挺多人还是很友善的。&lt;/p&gt;
&lt;p&gt;快中午 11 点半的时候，摊位突然又拥堵了起来，发生了一些不太愉快的插曲。和去年同时间段的某些事情带给我的感受还挺类似的，但不想过多展开。&lt;/p&gt;
&lt;p&gt;到了中午才意识到原来自己没吃早饭也没吃午饭，但一点没有不适的感觉，或许是肾上腺素在帮助我高强度运作吧。&lt;/p&gt;
&lt;h3 id=&quot;下午&quot;&gt;下午&lt;/h3&gt;
&lt;p&gt;主播的互动节目是下午 1 点，互动地点就在我们摊位的背后，不过我们一群人还是在摊位上看的直播（这也算一个小成就吧，在现场看直播 hhh）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d1e98ceeba4e68e9fb06bb6329b3e27349b8419860d99675538a9d63d05f33e2.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;其实这一天的心情一直都挺压抑的，虽然我主要时间是花在往返员工入口和 8.1 运东西这块了，忙完摊位附近的拥堵和混乱已临近尾声，没有直面那样的场景。但即使这样心里还是很焦虑和压抑。看主播直播的时候，虽然网络很卡，好几次卡到黑屏，但还是把这些情绪压下去了，那时候觉得还挺开心的。（看主播真的能续命=、=）&lt;/p&gt;
&lt;h3 id=&quot;晚上&quot;&gt;晚上&lt;/h3&gt;
&lt;p&gt;看完直播后便一起装箱，等仓库空出来把周边搬进仓库。快闭馆的时候，突然听说场馆外开始下雨了。bw 散场很难打车这点我之前有体会过，但加上下暴雨甚至水淹场馆的体验，还是第一次。&lt;/p&gt;
&lt;p&gt;很疲惫地走到出口，开始打车，前面排了几十号人，加价很多也没司机接单。无奈前往便利店先吃点东西垫肚子然后坐着休息一下。&lt;/p&gt;
&lt;p&gt;然后主播突然发消息说帮我们找了一辆 up 主小镇的大巴，于是我们又一起赶往对应地点。&lt;/p&gt;
&lt;p&gt;去的过程中，我突然想到 bw 的门票没抢到 cos 证是主播搞的，打车打不到大巴车也是主播帮忙联系的，觉得主播好厉害，就下意识感叹了一句“主播好厉害啊，我好没用。”（类似于感叹“大手”的说法）。&lt;/p&gt;
&lt;p&gt;没想到这句话让其他人联想到了这一天的工作状况然后影响到了他们的心情，真的不好意思 555。&lt;/p&gt;
&lt;p&gt;见到对接人后，对接人对我们很友好说让我们先在休息区休息，有问题可以找他。&lt;/p&gt;
&lt;p&gt;在 up 主小镇坐下后，感觉像进入了一个光鲜靓丽的新世界吧，有好多 up 主也在那边一起玩一起大笑后来甚至还去舞台那边表演节目跳舞等。&lt;/p&gt;
&lt;p&gt;一开始我坐在位置上耍手机。刷着刷着抬头发现好像对面的好几个 up 主都在直播，有时候还会把镜头对着我们。后来去翻了录播，发现确实有出现在别人的直播里 hhh。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/20240107-8917c437db5017d7a12e04cb8ffc5b90.gif&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;后来看到 ask 和安可都去看 up 的表演了，我也跟着去了，好像大部分都是舞蹈区 up 主，我不太认识，但听到有人讲四川话和听到有人放三无唱的《花月成双》，还是觉得很亲切的。&lt;/p&gt;
&lt;p&gt;与此同时，突然看到队友的房间漏水的视频，真的很好笑。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/20240107-fb7e979716135a7bcb29fc74461622bb.gif&quot; alt=&quot;10118.1690347982186.DL1265K2ECBPCVUDHOHI.gif&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;等了一段时间后我们便登了上回程的大巴，对接人跑过来的时候问我们“你们五位是 hanser 吗？”，那一刻觉得有点尴尬又很好笑 hhh。虽然回程路上也因为暴雨而堵车，但是速度比我们自己打车快太多了啦，在 10 点钟回到了酒店。&lt;/p&gt;
&lt;p&gt;回到酒店先吃了个饭，队友们已经差不多把预约信息审核好了，大家又继续开始发送第二天预约的消息。忙到差不多 2 点才休息。&lt;/p&gt;
&lt;p&gt;这是这天的步数数据&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/31c0c055a647bb25f7a2a20f932377370d7aa0bf2b0239259b6caf9ebdcf9c98.webp&quot; alt=&quot;IMG_3203.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;三22-号&quot;&gt;三、22 号&lt;/h2&gt;
&lt;h3 id=&quot;白天&quot;&gt;白天&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/1211f7cf63dbefded6055c15d487d70c3de4d94f077394484bd31768686f59e7.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;其实一直都有惦记着合照的事情，但前一天时间不够没来得及合照，所以这一天在到摊位收拾好后拍了一张合照。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/904b09ba9436dc74b1954877a391783e19753453302c18ecdd53df1cc9fc2258.webp&quot; alt=&quot;IMG_2962.jpeg&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;基于第一天的经验，我们又购买了白板和喇叭，用于写告示和提醒他人。以及由于有预约机制，这一天的工作轻松了许多，没有出什么问题。不过还是有一些小插曲的。↓&lt;/p&gt;
&lt;p&gt;由于 173 带了主播同款的眼镜，可能身高也比较符合别人对主播的身高的想象吧（但是主播真的没那么矮），再加上是在 bw 这样的地方，每个人对于主播的熟悉程度和理解不太相同，于是有部分人把 173 认成了主播。&lt;/p&gt;
&lt;p&gt;有时候抬头能看到周围有人指指点点，或者拿手机拍照…&lt;/p&gt;
&lt;p&gt;甚至有人来拿周边，他朋友来问我“我没有预约，可以和 hanser 拍照吗？”，我回复他说：“那个不是 hanser，那是工作人员。”，那一刻感觉更尴尬的是我自己。&lt;/p&gt;
&lt;h3 id=&quot;晚上-1&quot;&gt;晚上&lt;/h3&gt;
&lt;p&gt;然后这天晚上有聚餐活动，去的是一家烧烤店。其实我是不太能喝酒的类型，喝了酒就头昏犯困。可能是提前叮嘱过酒的度数不要太高，所以那天晚上我喝了几杯酒都没有想睡觉的感觉，反而变得很亢奋。&lt;/p&gt;
&lt;p&gt;那时候大咩老师坐在我旁边，醉酒表现真的好可爱！一直要我点歌让她唱，笑死。&lt;/p&gt;
&lt;p&gt;比较巧的时，我前几周才学会剥小龙虾，感觉就是专门为这次吃饭学的！（不是）&lt;/p&gt;
&lt;p&gt;不过把狼宝和 91 认混了 555，对不起&lt;/p&gt;
&lt;p&gt;吃饭差不多吃完了，大伙儿就在场地内开始唱歌和玩击鼓传花接歌词 + 真心话大冒险。&lt;/p&gt;
&lt;h2 id=&quot;四23-号&quot;&gt;四、23 号&lt;/h2&gt;
&lt;h3 id=&quot;上午-1&quot;&gt;上午&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/203c64d9ac0c3c233c26b7d944419c59fcea81c0cfd5834b8f1cc10efebf7a14.webp&quot; alt=&quot;IMG_2966.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;最后一天可以稍微晚一点到场馆，并且因为剩下的份数不算太多，所以也可以早点下班了。&lt;/p&gt;
&lt;p&gt;帮忙把预约的便利贴发出后，后面发周边主要还是 73 和 ask 在搞，我偶尔维护一下秩序。&lt;/p&gt;
&lt;p&gt;后来闲下来后，我坐在折叠凳上开始刷各个平台的动态，有看到一些不太好的言论，那个时候已经有点挤不出笑了。（明明平时天天给自己喂垃圾，按理来说承受能力很强的，不至于影响心情的）&lt;/p&gt;
&lt;p&gt;然后后来又刷到主播的帖子，心里更压抑了，一个人捏着手机盯着空处发呆。不知道为什么越想越难受，又觉得在公共场合应该控制好自己情绪，两种心情在打架。&lt;/p&gt;
&lt;p&gt;但真的抑制不住，最开始还好只是有点红眼眶，后来就直接哭了。不过我觉得我应该掩饰得挺好的，只在想要纸巾的时候找卡密帮忙了一下，其他时间都在低着头捂着眼睛。&lt;/p&gt;
&lt;p&gt;那时候安可还过来问我“还好吗，要不要先回酒店”，感觉我给人的感觉应该只是身体不适 hhh&lt;/p&gt;
&lt;p&gt;哭完后心里舒服多了（可能哭真的很解压=、=），然后中午收拾完下班后和队友们一起合照了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/20240107-7f60de466ef2a12570fa47f0adbdffbf.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;下午和晚上&quot;&gt;下午和晚上&lt;/h3&gt;
&lt;p&gt;回到酒店后，先是吃了顿饭，然后看了主播的直播，后来看到卡密说冰淇淋蛋糕再不吃要化了！又一起去吃冰淇淋蛋糕了～&lt;/p&gt;
&lt;p&gt;没有拍照，偷个图&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f487fc1d291676f70168a86ea37ce841299e10a95698c03c9a0616deeb72f238.webp&quot; alt=&quot;IMG_3198.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;下午吃完蛋糕后，大家都陆陆续续要走了 😣  其实一直都很期待聊天八卦环节，这次由于太忙了所有人都一直处于高强度工作状态，没有时间聊天，还是挺可惜的。&lt;/p&gt;
&lt;p&gt;虽然定了 4 天房，但我周一要工作，所以也在周日也就是 23 号晚上选择了回家。&lt;/p&gt;
&lt;p&gt;那一刻心里落差还蛮大的吧，虽然 bw 这三天的经历也很累但挺快乐的，一想到明天只要回归日常工作，而且不知道下次线下是什么时候，也不知道自己还能不能去，就觉得挺失落的。&lt;/p&gt;
&lt;p&gt;bw 结束后开始了差不多为期一周的后遗症，症状是脑袋空白，总是回忆起那几天发生的事实，无法好好工作。😶&lt;/p&gt;
&lt;h2 id=&quot;五一些想法&quot;&gt;五、一些想法&lt;/h2&gt;
&lt;p&gt;这三天的流水账差不多就结束了，心里也有挺多感想的。&lt;/p&gt;
&lt;p&gt;很感谢主播，让我有机会体验到另一种岗位是什么样的，这种体验给了我未来职业选择的一些指导性。或许以后不做程序员，做点其他的也挺好的？&lt;/p&gt;
&lt;p&gt;也从和他人共事的过程中学到了一些东西，例如确认内容有没有传达清楚的时候，使用先讲内容然后营造一个具体场景询问解决方案的方式，这样既可以确认是否讲清楚也可以加深别人的认知。这样的方法在平时也能用到。&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;p&gt;一些相关的记录&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;73 老师的汇报&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://2550505.com/postDetails/113481&quot;&gt;姗姗来迟的 BW 流水账～&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;bw 邮件环节录播（bw 回忆录）&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1n44y1A7j8/&quot;&gt;hanser】有盼头才有动力生活/2023.8.9&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1j44y1c7nh/&quot;&gt;hanser】加播 邮件念完～/2023.8.10&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;大咩老师的 vlog&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1TV4y1q7Nr/&quot;&gt;BW 毛怪 vlog 大咩视角喵=^_^=&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;91 的 vlog&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1RV411g7xq/&quot;&gt;2023bw 之旅&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;你也可以在 craft 上访问这篇博文。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.craft.me/s/8xGTFTpuCQi3uD&quot;&gt;2023bw 汇报&lt;/a&gt;&lt;/p&gt;</description><category>随笔</category><category>2023年</category><category>漫展</category><category>bilibili</category><category>bw</category><category>hanser</category></item><item><title>2023 跨年</title><link>https://blog.kazoottt.top/posts/2023-crossing/</link><guid isPermaLink="false">urn:blog:ba1874c3-3e9e-502f-94cc-dfb0a421d652</guid><pubDate>Sun, 07 Jan 2024 00:00:00 GMT</pubDate><description>&lt;p&gt;**#**2023 成都跨年****&lt;/p&gt;
&lt;p&gt;一时兴起和群友约好了去成都跨年。&lt;/p&gt;
&lt;p&gt;由于年假已经用完，所以选择了 29 号和 1 号晚上的飞机，这样可以尽量让玩的时间多一些。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;## 29 号与 30 号&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;第一次坐这种有屏幕的飞机,在座位上找耳机和耳机孔找了好久,后来才知道原来是起飞后才发耳机。=、=&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/20240107-9a46922a4a939d4d7a1b6ff534ecdea7.webp&quot; alt=&quot;https://pictures.kazoottt.top/2024/20240107-9a46922a4a939d4d7a1b6ff534ecdea7.webp&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;在飞机上看完了 &lt;a href=&quot;https://movie.douban.com/subject/26348103/&quot;&gt;小妇人 (豆瓣)&lt;/a&gt;, 已经很久没有看完一部完整的电影了,感觉飞机上是一个补电影、补小说的好地方。&lt;/p&gt;
&lt;p&gt;下了飞机后就直奔 KTV 了, 虽然那几天本身就很累了, 但是和朋友们聚一块还是很开心的。&lt;/p&gt;
&lt;p&gt;在出租车上听到了熟悉的四川话,但自己有点不清楚应该讲普通话还是四川话了...甚至觉得说四川话有点不好意思，可能是太久没有回成都了吧。&lt;/p&gt;
&lt;p&gt;30 号的中午,一起去吃了跷脚牛肉,感觉这家的干辣椒其实有一点湿 hhh,然后他们的炒菜都挺好吃的，虽然看着比较口味重，但还是挺清淡的。豆腐烧脑花很好吃！推荐~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/1ab2d427cffe0fc9b7709ce4e668fe32d7605ed5a7f4419b9ae45ac8216fb1f6.webp&quot; alt=&quot;https://pictures.kazoottt.top/2024/20240107-ce0ec00bb0d62660fa9bf696d3922f4a.webp&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;一起去桌游店玩了桌游&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/82cb3b36b8303fd1e83887f1ea0825915e6b80f7376894b9a9178d8fb2a26a4e.webp&quot; alt=&quot;https://pictures.kazoottt.top/2024/20240107-521812b8304f7ae0b15e041a6268d5e0.webp&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c408f25570870207dcc761b12e7cc464d45a4d52683e0f3537d0da82d8880944.webp&quot; alt=&quot;https://pictures.kazoottt.top/2024/20240107-1d560a798460ec3e12b1f85163fc91b7.webp&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;晚上吃了陶德砂锅！肥肠真好吃 555.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/81233133824bf454ee210236c9b23be68d526ef53bfa1c2704a06888d2938e55.webp&quot; alt=&quot;https://pictures.kazoottt.top/2024/20240107-7f8ccd69ac2e7f4160821b9cb1de46d9.webp&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;## 31 号&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;早饭/午饭一起去吃了谭豆花，冰醉豆花很好吃！推荐。&lt;/p&gt;
&lt;p&gt;（原来成都有这么多好吃的...之前在这边读了 4 年书，好像都没这么出去玩过=、=）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e04afacf50265bc1fe05881ae35acfb18cb830f549344ac0f64079ee42dfd011.webp&quot; alt=&quot;https://pictures.kazoottt.top/2024/20240107-8c31289261f464106d3b9c48c0cd9cc0.webp&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;晚上去吃了火锅！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/72b87851f4774c9b29a553531206de3cf2bbdfe6a151d475730c73296c5c4dae.webp&quot; alt=&quot;https://pictures.kazoottt.top/2024/20240107-a7955974be5051accc894a9a710d2e0d.webp&quot; loading=&quot;lazy&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://blog.kazoottt.top/media/8676d53d9aa7b54d19c0fb8ff30fbda40b9af51d9ab37aeb30197878891cab23.webp&quot; alt=&quot;https://pictures.kazoottt.top/2024/20240107-fed1bfd8c9774ea41f33b6ed28073fdd.webp&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;## 1 号&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在川大望江附近吃了冒烤鸭&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/ed3685d908ce27994d710dd7b8ab7de3d1b3e6f9ac6cd86f7a7575aec35cb58b.webp&quot; alt=&quot;https://pictures.kazoottt.top/2024/20240107-4650006886db1222dd2feb0a33306c3b.webp&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;甚至之前的校园卡流量还能用....&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/86027117f2a5396697db5625d5abf3ab133a4cf4dc354d632e9de2ddfddaa84e.webp&quot; alt=&quot;https://pictures.kazoottt.top/2024/20240107-4ef293b956adc6b2bb28a2d3e4f20874.webp&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;一个人点了两个菜（分量怎么这么多！），吃完就去机场了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/0489c12b6be3dc6ef233a8bff2828fbf41544f1b2963fc257a4560e4eee8a0e6.webp&quot; alt=&quot;https://pictures.kazoottt.top/2024/20240107-fee594430e0649e0778f57be0a63221e.webp&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;最后的感想就是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;原来成都有这么多好吃的，之前除了要去跑线下（吃也是在机场附近或者环球中心和朋友随便找家店吃的）几乎没有出去玩过=、=。&lt;/li&gt;
&lt;li&gt;今年一定要回成都工作，已经是三年的最后一年了。&lt;/li&gt;
&lt;/ol&gt;</description><category>随笔</category><category>2023跨年</category><category>2023年</category><category>跨年</category><category>朋友</category></item><item><title>2023-W45</title><link>https://blog.kazoottt.top/posts/2023-W45/</link><guid isPermaLink="false">urn:blog:79ff5c6d-ab8a-524a-a7b8-4efa53324c5f</guid><pubDate>Sun, 19 Nov 2023 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;2023-w45-平淡的一周&quot;&gt;2023-W45 平淡的一周&lt;/h1&gt;
&lt;p&gt;2023/11/06 - 2023/11/12&lt;/p&gt;
&lt;h2 id=&quot;一记录自己&quot;&gt;一、记录自己&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;2023-11-11 和 cali 老师在小红书上互关啦，惊喜！&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c249679758ebfc3590f4a6c833abc202eb4a4548a1aff909a234516ab0c52c6c.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;二记录周围&quot;&gt;二、记录周围&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;2023-11-12 阿里云服务宕机，导致很多阿里系绝大部分服务不可使用。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;三本周资源收集&quot;&gt;三、本周资源收集&lt;/h2&gt;
&lt;h3 id=&quot;1-一个有意思的-3d-博客&quot;&gt;1. 一个有意思的 3D 博客&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://bruno-simon.com/&quot;&gt;Bruno Simon&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/8eb96f087fda05fabdf8ca1dafa21be6265469da1c039affd22f824bc8cb7eeb.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;2-tree-lodash&quot;&gt;2. &lt;strong&gt;&lt;a href=&quot;https://github.com/zhangshichun/tree-lodash#tree-lodash&quot;&gt;tree-lodash&lt;/a&gt;&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/zhangshichun/tree-lodash&quot;&gt;https://github.com/zhangshichun/tree-lodash&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Easily control the tree structure as you would with lodash.js 像使用  lodash.js  一样方便地操控树结构&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/0d8e42a372d2117ff74fcd84dfdbf49113b52c70edcaf814890c21ca7167145c.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;3-项目变现&quot;&gt;3. 项目变现&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.reddit.com/r/Entrepreneur/comments/17reorg/i_have_0_income/&quot;&gt;I have 0 income&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/2cb13b36ed6f2ddab03b7ecff933fdfdbbed44693a84088dfa35f6f3cadc6773.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;4-社交媒体-gpt&quot;&gt;4. 社交媒体 GPT&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/hzlzh/status/1722871599375028665&quot;&gt;https://twitter.com/hzlzh/status/1722871599375028665&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/2dc4b11a7aa2ee7a3a1716cd84e680152a10c93790a40e779a133f1eaa79cf27.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;会用到工具如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;创建个人 GPTs：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://t.co/OQMlApJPjv&quot;&gt;https://chat.openai.com/gpts/editor&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;导出全部 Tweet：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/settings/download_your_data&quot;&gt;https://twitter.com/settings/download_your_data…&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;导出全部微博：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://t.co/NAJnJ5jXSD&quot;&gt;https://chrome.google.com/webstore/detail/igilfpckopigflpafgoajlljpdhmoall?utm_source=ext_sidebar&amp;#x26;hl=zh-CN&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;5-web3-课程&quot;&gt;5. Web3 课程&lt;/h3&gt;
&lt;p&gt;报名链接&lt;/p&gt;
&lt;p&gt;Nov 14, 2023 12:11 - Dec 17, 2023 12:11&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://openbuild.xyz/learn/challenges/91?from=Challenges&quot;&gt;OpenBuild&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;介绍链接&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s/UFDAr5282nvBvGN7YKHbRg&quot;&gt;Solidity Bootcamp 来袭 | 一起学习 Web3 最流行的编程语言 Solidity&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/092c117defba548f23fadeebdb84f3257a8d2c0b2923e63bf2ec58e5ca9f3d23.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;6-comlink&quot;&gt;6. Comlink&lt;/h3&gt;
&lt;p&gt;Comlink makes WebWorkers enjoyable.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6f3b7d8df172d80e1d78132595e023404f738aebc135951a6f79ab3f487a004f.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;7-httpsgithubcomlmsqueezynextjs-billing-saas-模板&quot;&gt;7. &lt;a href=&quot;https://github.com/lmsqueezy/nextjs-billing&quot;&gt;https://github.com/lmsqueezy/nextjs-billing&lt;/a&gt; SaaS 模板&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/506ff4635a836f8f45c2534354acf168aa7935299582b497f37099be08630456.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;8-windows-字体优化&quot;&gt;8. Windows 字体优化&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://bbs.pcbeta.com/viewthread-1960120-1-1.html&quot;&gt;原版雅黑、修正版雅黑、鸿蒙替换雅黑（2023.5.23 更新）-远景论坛-微软极客社区&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/MiniCssExtract/status/1722298440494014868&quot;&gt;https://twitter.com/MiniCssExtract/status/1722298440494014868&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;9-node-开箱即用模板&quot;&gt;9. Node 开箱即用模板&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jsynowiec/node-typescript-boilerplate&quot;&gt;https://github.com/jsynowiec/node-typescript-boilerplate&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;讨论的原链接&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/gizmo_ds/status/1722188393709465901&quot;&gt;https://twitter.com/gizmo_ds/status/1722188393709465901&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;10-播客推荐-asynctalk&quot;&gt;10. 播客推荐 *&lt;strong&gt;*AsyncTalk**&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://podcasts.apple.com/cn/podcast/asynctalk/id1590369272&quot;&gt;‎《AsyncTalk》- Apple  播客&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://podcasts.apple.com/cn/podcast/ep30-server-action-%E6%98%AF%E6%9C%89%E7%82%B9%E5%84%BF%E6%90%9E%E7%AC%91-%E4%BD%86%E5%89%8D%E7%AB%AF%E5%BE%97%E5%AD%A6/id1590369272?i=1000634503468&quot;&gt;‎《AsyncTalk》-《EP30 Server Action 是有点儿搞笑，但前端得学》- Apple  播客&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;11-gpts-汇总&quot;&gt;11. GPTS 汇总&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/dotey/status/1722831122285932592&quot;&gt;https://twitter.com/dotey/status/1722831122285932592&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;12-运维-homepage&quot;&gt;12. 运维 Homepage&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e59b3fefcac129f66d33f0f9edbb8bc8f32da43a3d5fd64724f7244831e0da70.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/gethomepage/homepage&quot;&gt;https://github.com/gethomepage/homepage&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;13-swift-教程推荐&quot;&gt;13. Swift 教程推荐&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/st7evechou/status/1722623308762599500&quot;&gt;https://twitter.com/st7evechou/status/1722623308762599500&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PLXM8k1EWy5khONZ9M9ytK8mMrcEOXvGsE&amp;#x26;si=CS7XujQUYmVdRwXh&quot;&gt;SwiftUI 新手入門課程&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;14-css-技巧实现发光的背景&quot;&gt;14. CSS 技巧，实现发光的背景&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/jh3yy/status/1722397114532048959&quot;&gt;https://twitter.com/jh3yy/status/1722397114532048959&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://codepen.io/jh3y/pen/ExrWOJe&quot;&gt;https://codepen.io/jh3y/pen/ExrWOJe&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;15-css-技巧-实现高亮&quot;&gt;15. CSS 技巧 实现高亮&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/jh3yy/status/1721929736052502568&quot;&gt;https://twitter.com/jh3yy/status/1721929736052502568&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;16-油管编程博主推荐&quot;&gt;16. 油管编程博主推荐&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/Leexiaopa/status/1721918038101119213&quot;&gt;https://twitter.com/Leexiaopa/status/1721918038101119213&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;17-动态生成头图&quot;&gt;17. 动态生成头图&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://twitter.com/ji3206/status/1718294096966779265&quot;&gt;https://twitter.com/ji3206/status/1718294096966779265&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;18-小林-x-图解计算机xiaolincodingcom&quot;&gt;18. 小林 X 图解计算机：&lt;a href=&quot;http://xiaolincoding.com/&quot;&gt;xiaolincoding.com&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/455370ce6e0def5cd5b264b2294628506dc8b7a95e1712e064ba9b6b933acbe1.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;19-前端代码重复度检测&quot;&gt;19. 前端代码重复度检测&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://segmentfault.com/a/1190000044298317&quot;&gt;前端代码重复度检测&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;20-时间管理&quot;&gt;20. 时间管理&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://weekly.ursb.me/posts/weekly-23/&quot;&gt;WJ.23: 多任务中的时间管理&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;21-css-库推荐&quot;&gt;21. CSS 库推荐&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://segmentfault.com/a/1190000044277320&quot;&gt;写 css 没灵感，那是你没用到这几个开源库&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;22-httpsgithubcomleadreamfigmaactivitycalendar-figma-热力图&quot;&gt;22. &lt;a href=&quot;https://github.com/leadream/FigmaActivityCalendar&quot;&gt;https://github.com/leadream/FigmaActivityCalendar&lt;/a&gt; Figma 热力图&lt;/h3&gt;
&lt;p&gt;同时也可以用来学习参考如何实现 MacOS 应用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/3783e065eee928cd65cc98594f80aca0c5da85c2a440d130f45751ca7ce595eb.webp&quot; alt=&quot;Untitled&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;23-为什么我更推荐命令式-modal&quot;&gt;23. 为什么我更推荐命令式 Modal&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://innei.in/posts/programming/why-i-prefer-imperative-modal&quot;&gt;为什么我更推荐命令式 Modal&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;作者的博客也很好看&lt;/p&gt;
&lt;h3 id=&quot;24-一些好看的-css-生成器&quot;&gt;24. 一些好看的 CSS 生成器&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://democoding.in/awesome-free-css-generator&quot;&gt;Awesome list of free CSS Generator - Demo Coding&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;25-blender-gpt&quot;&gt;25. Blender Gpt&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://beta.character.ai/chat?char=rRD2vJxZzkebnTqzqTsgA3yarO-3Ez80_qg2uNF3yIY&quot;&gt;Chat now with Blender God · created by @simonxxoo&lt;/a&gt;&lt;/p&gt;</description><category>周报</category><category>资讯</category></item><item><title>2023-W11</title><link>https://blog.kazoottt.top/posts/2023-W11/</link><guid isPermaLink="false">urn:blog:595403ca-dfd7-5318-a960-455efd8e7aa3</guid><pubDate>Tue, 14 Nov 2023 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;2023-w11&quot;&gt;2023-W11&lt;/h1&gt;
&lt;p&gt;时间范围：2023-03-12-2023-03-19&lt;br&gt;
来源：github、twitter、微博、b 站&lt;/p&gt;
&lt;h2 id=&quot;一浏览器插件油猴脚本&quot;&gt;一、浏览器插件&amp;#x26;油猴脚本&lt;/h2&gt;
&lt;h3 id=&quot;沉浸式双语网页翻译扩展&quot;&gt;沉浸式双语网页翻译扩展&lt;/h3&gt;
&lt;p&gt;关键词：翻译，浏览器插件&lt;/p&gt;
&lt;p&gt;好用好用，强烈安利&lt;br&gt;
&lt;a href=&quot;https://github.com/immersive-translate/immersive-translate/&quot;&gt;https://github.com/immersive-translate/immersive-translate/&lt;/a&gt;&lt;br&gt;
官方文档 &lt;a href=&quot;https://immersive-translate.owenyoung.com/&quot;&gt;介绍 - 沉浸式翻译 (owenyoung.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/7b6551c06f34907bf143573cd38ce58b55bfa33c63a7be522b5e65a5f0e5a6ac.webp&quot; alt=&quot;Pasted image 20230319151544&quot; loading=&quot;lazy&quot;&gt;&lt;br&gt;
使用效果图，可自定义多种翻译样式。&lt;/p&gt;
&lt;h3 id=&quot;隐藏你的-twitter-信息&quot;&gt;隐藏你的 Twitter 信息&lt;/h3&gt;
&lt;p&gt;关键词：witter，油猴脚本&lt;/p&gt;
&lt;p&gt;（自己写的）&lt;/p&gt;
&lt;p&gt;在公共场合不太想别人知道自己的 twitter 账号，于是写了一个油猴脚本，屏蔽 twitter 中自己的 id、昵称、头像。（只写了针对首页的）&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://greasyfork.org/scripts/461892-hide-your-twitter-info&quot;&gt;greasyfork 安装&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/KazooTTT/hide-your-twitter-info&quot;&gt;源代码&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;二chatgpt-相关&quot;&gt;二、ChatGPT 相关&lt;/h2&gt;
&lt;h3 id=&quot;cursor&quot;&gt;Cursor&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cursor.so/&quot;&gt;Cursor | Build Fast&lt;/a&gt;&lt;br&gt;
基于 GPT-4 帮你写代码，试了一下效果很好。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6a7a625277460cf3077b76e5ca2d0a06b9bc234c45571250af8c3336d0530973.webp&quot; alt=&quot;Pasted image 20230319151925&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;chatgpt-资料汇总学习&quot;&gt;ChatGPT 资料汇总学习&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/dalinvip/Awesome-ChatGPT&quot;&gt;dalinvip/Awesome-ChatGPT: ChatGPT 资料汇总学习，持续更新。..... (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;关键词：chatgpt&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/14e8e7adf95fa915699e77f4a0e7b1fe043809699fc548297aa0c39bb8d98a05.png&quot; alt=&quot;image.png&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;基于-chatgpt-的-telegram-机器人-&quot;&gt;基于 ChatGPT 的 Telegram 机器人 🤖&lt;/h3&gt;
&lt;p&gt;介绍推特：&lt;a href=&quot;https://twitter.com/BTW0205/status/1636734688659398656&quot;&gt;𝐁𝐢𝐭𝐰𝐮.𝐞𝐭𝐡 在 Twitter&lt;/a&gt;&lt;br&gt;
telegram &lt;a href=&quot;https://t.me/samantha_x64_bot&quot;&gt;Telegram: Contact @samantha_x64_bot&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;关键词：chatgpt, telegram&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f2cd54ce9bf39318edd3757c799e4ad3135ee6737223c966c9151a2d24a3577e.webp&quot; alt=&quot;twitter.com_kzt2022cd (1)&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;bibigpt-音视频内容一键总结&quot;&gt;BibiGPT 音视频内容一键总结&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/JimmyLv/BibiGPT&quot;&gt;JimmyLv/BibiGPT: BibiGPT · One-click summary for video &amp;#x26; audio content: Bilibili | YouTube | Websites 丨 Podcasts | Meetings | Local files, etc. 音视频内容一键总结：哔哩哔哩丨 YouTube 丨网页丨播客丨会议丨本地文件等 （原 BiliGPT 省流神器 &amp;#x26; 课代表） (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;关键词：chatgpt, 音视频总结&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/3370a849074acab50a9018c524af09667503e9831c2e585a205eecee476cd730.gif&quot; alt=&quot;BibiGPT&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;vercel-edge-function-支持-chatgpt-api-加速&quot;&gt;Vercel Edge Function 支持 Chatgpt Api 加速&lt;/h3&gt;
&lt;p&gt;介绍 twitter &lt;a href=&quot;https://twitter.com/Barret_China/status/1636763051839082497&quot;&gt;Barret 李靖 在 Twitter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;关键词：vercel, chatgpt&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/982f2bf48b1a3113cffc604c8bea9a4e30b71c1b1607025247d67913d814d037.webp&quot; alt=&quot;Pasted image 20230319150609&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;三设计相关&quot;&gt;三、设计相关&lt;/h2&gt;
&lt;h3 id=&quot;figma-结合-gpt-进行设计&quot;&gt;Figma 结合 GPT 进行设计&lt;/h3&gt;
&lt;p&gt;介绍 twitter &lt;a href=&quot;https://twitter.com/nishuang/status/1636150416609099778&quot;&gt;倪爽 在 Twitter&lt;/a&gt;&lt;br&gt;
官网链接 &lt;a href=&quot;https://magician.design/&quot;&gt;Magician for Figma&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;关键词：figma, chatgpt&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/dc79d4e1a67aee9bd71b867bf66a19850f6e372e8e0fc7f7fcaaa6fa0b34e9ea.webp&quot; alt=&quot;Pasted image 20230319150116&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;柔和主题库catppuccin&quot;&gt;柔和主题库「Catppuccin」&lt;/h3&gt;
&lt;p&gt;介绍 twitter: &lt;a href=&quot;https://twitter.com/HiTw93/status/1635793934864531456&quot;&gt;Tw93 在 Twitter: &quot;#工程师工具 看到一个柔和主题库 「 Catppuccin 」&lt;/a&gt;&lt;br&gt;
github: &lt;a href=&quot;https://github.com/catppuccin/catppuccin&quot;&gt;catppuccin/catppuccin: 😸 Soothing pastel theme for the high-spirited! (github.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;关键词：主题库，设计，Catppuccin&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b02486c84c05fa7f88c188b1c2f473614c325b384c91c148dd53075064b6240d.webp&quot; alt=&quot;Pasted image 20230319150700&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;一个炫酷的网站&quot;&gt;一个炫酷的网站&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://zihan.pages.dev/&quot;&gt;Zihan Chen - The web designer and builder 🚀 Zihan&lt;/a&gt;&lt;br&gt;
开发者才十几岁，555。&lt;/p&gt;
&lt;p&gt;关键词：网站&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e1f262e8abefc1684d2530d729d0a66d4cd438528f468eab2163aedf003570e7.webp&quot; alt=&quot;Pasted image 20230319151838&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;博物馆素材-unsplash&quot;&gt;博物馆素材 Unsplash&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://weibo.com/1757693565/4707096794761640&quot;&gt;既然最近都在推荐博物。.. - @Simon_阿文的微博 - 微博 (weibo.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;关键词：upsplash，素材&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/bb38d903c67b6bba3e067060c575f90540a7bfeeb07dda5a84b729e66238dcb4.webp&quot; alt=&quot;weibo.com_1757693565_4707096794761640&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;零基础学-figma酸梅干超人出品&quot;&gt;零基础学 Figma【酸梅干超人出品】&lt;/h3&gt;
&lt;p&gt;关键词：figma，教程&lt;/p&gt;
&lt;p&gt;figma 入门教程，目前跟着学了 3 个案例，对新手很友好&lt;br&gt;
&lt;a href=&quot;https://www.bilibili.com/video/BV1fg411G7cs/&quot;&gt;零基础学 Figma【酸梅干超人出品】_哔哩哔哩、_bilibili&lt;/a&gt;&lt;/p&gt;</description><category>设计</category><category>周报</category><category>资料收集</category><category>chatgpt</category><category>figma</category><category>vercel</category></item><item><title>2023 国庆厦门和杭州之行</title><link>https://blog.kazoottt.top/posts/national-day-trip-to-xiamen-and-hangzhoupicture-bed-version/</link><guid isPermaLink="false">urn:blog:d436b1c2-a44d-51ed-b455-cfc5778fcc0e</guid><pubDate>Sun, 08 Oct 2023 00:00:00 GMT</pubDate><description>&lt;h2 id=&quot;2023-09-30&quot;&gt;2023-09-30&lt;/h2&gt;
&lt;p&gt;我们买的高铁时间是 6 点多，由于虹桥火车站并不允许过夜，于是我选择了睡到 4 点半，然后打车前往虹桥火车站。国庆出行的人确实很多，在 5 点多的时候，已经开始堵车了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/72c7a7ec988bd57675ac835ca544d242df529204701c3c590ec12b8abd15e091.jpg&quot; alt=&quot;r8nj3&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;到了的时候发现还能吃个早饭，于是去汉堡王点了这个，感觉还挺好吃的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f1ba1cffe99d577aa001e275b7a51995c4b1bcfd805370001d9f7255b97dfd21.jpg&quot; alt=&quot;5bob2&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;这是凌晨 6 点的虹桥火车站，好多人啊.jpg&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d53ed1cf0d5c79ed93188ef9799d0cee998635da2cb13e31537957cd544ed43f.jpg&quot; alt=&quot;b4ys4&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;在高铁上实在是太困了，大部分时间都在补觉，遮光性比较好的眼罩真的是出行必备。另外发现现在高铁上都能直接充电了，对于 iPhone 用户真是太友好了。&lt;/p&gt;
&lt;p&gt;记录一下车速：155km/h&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/cdf673e8a37b6b45f9b4b741911d722585aa7f8987442cd332fe75d08ed02870.jpg&quot; alt=&quot;0ewoi&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;到厦门了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/525f3d580f45b4bcfdb50d2ab24249d7e50ed99e88e14af963b18875f0c99627.jpg&quot; alt=&quot;9rmpd&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;天气很好&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/ca6aaa4191c0075da712267a605dc5247e0a9efc7351d01052c42bb85463048e.jpg&quot; alt=&quot;y6fdg&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;一到厦门就收到了短信提示 hhh，突然有种仪式感。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/1eb5b101741414fb541db26732d49f3562ca517695a2c6b4041f19a1a803f4fc.jpg&quot; alt=&quot;y5hjv&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;当天的气温虽然是 30+ 摄氏度，但是在没有太阳的地方，就不会觉得很热。如果有风吹过，还会觉得很凉爽。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/71ac8e45f514b187a4ed0894b2b37568e5e1b59251c78ed35a095aa1baa33276.jpg&quot; alt=&quot;6boo6&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;喝到了主播推荐的薄荷森林的薄荷生打椰，确实有一点薄荷牙膏的味道，但是很好喝，很清爽不腻~ 什么时候开到上海啊，还想再喝一次。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/3b5f17d207276d02f336eebfa2faf72b327129e8ca452ad7cde57e7a7cf7f785.jpg&quot; alt=&quot;k27h5&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;休息了一阵子后，便去吃了午饭，本来想去助屋的，发现它变成蝴蝶飞走了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/246a4c0bd859457a9f61f3649fdd3f77080632212efa92e53de2818727bb333e.jpg&quot; alt=&quot;hdytx&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/90be26f3588c345b6fe743e4813c0ded2368d8cc92f0cb9a16a5800b0223dbf8.jpg&quot; alt=&quot;u1xik&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;顺带一提，出行工具很多时候都是共享电动车。这是我离开学校后，第一次接触电动车，一边骑车一边吹风，感觉好舒适。&lt;/p&gt;
&lt;p&gt;吃晚饭的时候，偶遇的一辆 miku 痛车，可惜太匆忙，没拍清楚。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/84eeab922670f73059859a4f3ef605febfbc9d13e66ecc2e0286e3c57ef8caf7.png&quot; alt=&quot;uhbwk&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;晚饭去的是七星西鹭鸭胫店，味道非常合我胃口，超级下饭，吃了好几碗。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/86534be1fa776f61d2777b6078a10f22a331e7de4b878c3ceb2dd3f625ad32c3.jpg&quot; alt=&quot;bcwdt&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;拌猪肝&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/8cc57124f4ef94ee15916041722288d7516135ddc3835b4c5dfcc768e379b724.jpg&quot; alt=&quot;d037i&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;拌鸭肠&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c154dbff2eb164167e7246b7e291a6fa6ff52a73eda73662a5cbdbd9b31c1a1a.jpg&quot; alt=&quot;bvh3v&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;炸丝丁鱼，第一次吃，和炸小黄鱼是完全不同的味道，感觉这个有点奶味？&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/132478d44db9bacbf51899607172bbfc5c00d704b553e1ca33acacacd1a060b3.jpg&quot; alt=&quot;dg6xv&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;拌鸭胫&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/a8dffaae076452fbeabeab837b4343dee4debc67639633dde79c36ef4df845f5.jpg&quot; alt=&quot;qn4wy&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;水煮牛肉&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/8d5f20f5b9c5bd3f2937dee73d724cd8bc4d62fb45813f4a910476457fb808fe.jpg&quot; alt=&quot;2bdcc&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;全局照&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/754bf5115feb95257990da4dcc564c9a5408fd27b83e03468f35f7205067f66c.jpg&quot; alt=&quot;hagwr&quot; loading=&quot;lazy&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://blog.kazoottt.top/media/084ecf3c480a3c63da78986a56673680d455619a8e70fa5cc6dfa1d38443b7bd.png&quot; alt=&quot;ymnh8&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;吃完后就去 ktv 唱歌了。有些 mv 挺诡异的。感觉自己比之前稍微好点了，以前是一点不敢唱。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/073f7a09ba34713801c87576d38b56b78dcf3f15e5bcb3ac89a2bbd3f2e7bff0.jpg&quot; alt=&quot;jitht&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;出来后看到的摩天轮，觉得这个角度挺好的，拍一张。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/f1b621f920a46ff55bea661035ab82c8b4582b1a446b2434dee384c93d3601eb.jpg&quot; alt=&quot;58ufw&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;2023-10-01&quot;&gt;2023-10-01&lt;/h2&gt;
&lt;p&gt;第二天去了宴遇 1/2&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4013578b7b5da52871b6d074612e59cafc70cfeb2471689ca37a1c8ad101e861.jpg&quot; alt=&quot;k6qd7&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;酸菜鱼，没有什么刺，对于我这种不会吃鱼的人来说很友好。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/95bc957a75540af1aa1f69d4a13d49d5b2a8ca4374e20bf77a01a8a68a7bd9b4.jpg&quot; alt=&quot;96zi3&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;火焰黑椒安格斯小牛肉，上菜时会喷一下火，挺炫酷的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/36c92e43c0d698d9cbda33a4b8d600e45877207d2d34438ac096e9ac48f45214.jpg&quot; alt=&quot;exp2d&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;东山小管&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/9956543ec3e022963ded9b6602daf4412cd4571e0c3b7845b786975628de05f6.jpg&quot; alt=&quot;7z7la&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;大红袍鲜奶布丁，口感很巧妙，好吃！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/baf5ca6e34dc82a618a01ce2101cd287cef649c55ff7cc5b15dd47ec362823bb.jpg&quot; alt=&quot;nr6ck&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;忘了这是什么&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/730d3afc42b2416c2dcfa53d6aff8ff1c6c66bc883a2c22543c31130cd56f0ae.jpg&quot; alt=&quot;kymci&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;土笋冻，之前看别人对于土笋冻的反馈有些两极分化？但实际上吃的时候感觉接受度还挺高的。一口吃下去，觉得口感像果冻？味道也不错。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/719c6fa8388b3efa61614a57dcfe370407c9a22d6cbcb09361bc33408950bfbc.jpg&quot; alt=&quot;hlzr7&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;姜母鸭，好吃好吃，很香，吃到后面把姜也挑出来吃掉了。还想再吃一次。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/45d4237a6f3433a19d915bf11bdb0067a79794988881af2383665ce7850ff40c.jpg&quot; alt=&quot;bgtpm&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;好像是什么芋头。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/9937b63da82c1a962cc05cf06e7d8696ac61be2c68541cd33b7e10c33c462db8.jpg&quot; alt=&quot;b1y3r&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;来个全景&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/656f9424c6aa107cc3be3d4b821815fdd50697c1a2520cbe5cd19f04b06f4180.jpg&quot; alt=&quot;to2ts&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;感觉都挺好吃的，特别喜欢的是鲜奶布丁和姜母鸭。第一次体验博饼，最后中的里面都是鲜奶布丁 hhh。&lt;/p&gt;
&lt;p&gt;然后就去野台风了，很少喝特调，之前一般都是喝的拿铁和 dirty。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/2ba2510691c0a1ffcc1d74cf35bc015bc0c8534b436fc348fd63fc097b650558.jpg&quot; alt=&quot;93jpx&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;我点的是圆规和 dirty，圆规没有什么咖啡的味道，对于不习惯喝咖啡的人来说，接受度应该也比较高。搭配柿子和西柚，整体是甜的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/321f69d08df9b9cf1511a1a8e28d3b29bfd2bf4f6637d6179fb199ba98d4daf3.jpg&quot; alt=&quot;b8e86&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/ebcff79a26602be53a2d1126eadefe60e3bfbb36665ba2fe0b39bfd0c9511d73.jpg&quot; alt=&quot;szoz1&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;这是我点的 dirty，这个杯子还挺好看的种草，味道口感没有特别的。因此建议去的话，直接点特调就好了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d28ac53776b21f2e6d77b4a05b25f4a6b7e0ccf84ed313341869626486608cdc.jpg&quot; alt=&quot;t7og1&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;小姐姐还送了我们每人一小杯凤梨酥。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/906e6b2d5acd02296e9091bc3b9352006890e50565a71a585c83164463ac6b85.jpg&quot; alt=&quot;yfsfo&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;别的朋友点的，&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4ae2275b1200ae09ac28d0516a883a5d918fd9eb65629bcdcdd6e6e7fb09cea5.jpg&quot; alt=&quot;t62f8&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/3088b650d7942af303e36ed0b4042b000d916a3885854daf353a34836fe5b949.jpg&quot; alt=&quot;jui3a&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d54a70008322072196b13332832519c34a5d63abb64745d5f9fba5d825124838.jpg&quot; alt=&quot;kownc&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6caa024802391135c5266ce66c3985af48c56fa5872d3bf2a1e09ba9ebe6271b.jpg&quot; alt=&quot;jcqqm&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/13e0e483de92991f7c3650fddf2ba6bf5140e3138c5f772b40be606ce366cbf8.jpg&quot; alt=&quot;p3njg&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/711af44cc8d76e6160a5de50ba66910c0732c35b2a3de1979bfd63ff53c4ee37.jpg&quot; alt=&quot;u246p&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;店里的音箱是 marshall，还有卖的器具。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c27d7cb1f41193a6cc694d4009243dc5045619a9dbeb5bfcebe4683ce9977a08.jpg&quot; alt=&quot;hu77j&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;在车上拍下的日落&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/184971d01b596f527d14ed45c8313e477f3bb37b206bfcb7413b334bbe85bb6e.jpg&quot; alt=&quot;y946h&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;由于午饭时间太晚，于是晚饭没怎么吃。&lt;/p&gt;
&lt;h2 id=&quot;2023-10-02&quot;&gt;2023-10-02&lt;/h2&gt;
&lt;p&gt;去了 seven bus，点的是杏仁牛油果冰淇士。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/336b1244388503d372b7a20d90f29570fabc06980239893bfe2bc4bc25993493.jpg&quot; alt=&quot;ew53g&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;说起来 seven bus，它让我和一个五年未见的网友在机场面基了。感谢主播，感谢 seven bus！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d55a6621d3067033dae3e8a415812ceba463f3bc884ce15cf77388ec660e3af9.jpg&quot; alt=&quot;xv4qq&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;去了遇见西木吃午饭，分量过多，根本吃不完。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/58eaff8756b5e0d7ff7ac8f0d32c037fc8f102b1c3a558fd6d3769bdba8f9c48.jpg&quot; alt=&quot;v9bkq&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/5a2523b9546203d60b70a63b018ad6a61c7697044f71aa18db0bd52a354acf8a.jpg&quot; alt=&quot;rcuz5&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6057f55b71b6a04c9b2623b56ea9d9d7982246573dbf9d02cdef607d109a1506.jpg&quot; alt=&quot;lbcso&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/8ee1ba2ecbf4a378690d1e73011d36fff96d86e36bc2ab4d5def60e16bf7a127.jpg&quot; alt=&quot;b1x3l&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/2292fa1d04f1cb1903be04a66413ae7912f3f1bd9258c48bf5f19be207be7954.jpg&quot; alt=&quot;a8fxk&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后就去鼓浪屿啦。等轮渡的时候，看到好大一条船。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/73c2341754b14a7a6ea9617a642b07df111950ede3d7be6d30a6a2b4a39914d8.jpg&quot; alt=&quot;gbu3l&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;登船了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/6a869c97ac826383f96df2c57faf97d3afec55a30375492bf4a06925cb549442.jpg&quot; alt=&quot;16vtx&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/08053e15ed39b373121c4597f381e9bb1dc9270ca5da876064df678f754b0da1.jpg&quot; alt=&quot;9hoa6&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/8bae45f4fe1f1f7f686984d2dd8805d32bd28324a8e3ac9f044b0b363a404c40.jpg&quot; alt=&quot;mkk3a&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/0af59d5f41c80e4e111e36a1b4d97020e4ab9e1b9ba082c8e7fef4801e3fbbbb.jpg&quot; alt=&quot;609pm&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;买了个椰子，25r，在景区不知道算不算贵。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/438f0bbd913d4becce0d350c160781350135979f124dbf21406959e551fd78f4.jpg&quot; alt=&quot;xbh47&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;感觉鼓浪屿没有像古镇古街那样明显商业化，还是保留了自身的挺多特色。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b5b8e37595870cae33973726d5c2fe4430a36fe65f6c221a5911fe3020bc4682.jpg&quot; alt=&quot;7jrrm&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/9f3f3e8c22be43c9de271dc8e376d624573a96831ae161c02b3c883f9aba0686.jpg&quot; alt=&quot;pmmqm&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/747b2d9efbe96910fa9714d347a3f2a338de20bda18162e2804b2f79586631f5.jpg&quot; alt=&quot;2i8pj&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4d0a88a4345c2ed79195dd7b06cca0bdd1c99130334cb5adbb53cd3a1978b37d.jpg&quot; alt=&quot;4waug&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/3a0cdb0c431099d21b73bfc6c9e6061b436e5cc053c52a40f1a0cb1e14481dc3.jpg&quot; alt=&quot;9km4f&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/5edd075ac0fcb53d8c510f8ce604883a5d0f0717efb444db500bd2d049e692da.jpg&quot; alt=&quot;9r185&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;日光岩还有飞鸟&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/89ea8ede22a8012d906dfb8d7e665abd0d7272017d8f6fbc000a51c8b4d67c92.jpg&quot; alt=&quot;txwx2&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;第一次见这样的路牌&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/5092e1603bd710abadcb36db0d11cf988f92c8cb21de795f91c3008c2936328c.jpg&quot; alt=&quot;ajkos&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;偶遇一群猫猫&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/819e0c66d1c1e71867fa9ac18a0530ccf2353e7527c468af4b82595cbae6a1c2.jpg&quot; alt=&quot;c1quq&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;一对情侣&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/babc7c8b1c43795e2e9b7b3873a09e340f1fb10d65b2fd5104942bda7bbdf918.jpg&quot; alt=&quot;oqv1u&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;天色逐渐暗下来&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/069086c120487c2b1cf827858db1538d802ec2cc9f423150aa69e3c7d859042f.jpg&quot; alt=&quot;iyfrm&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;在海边拍了项链的合影&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/43e3e278b82d03176148a7c79a03a1b81d0cf3bf21a8b96ee744a036783c1650.jpg&quot; alt=&quot;5cpc4&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b6446e833be75959bcb13065cdeaed160cff55e2ded7bd2c228bed8dd339af62.jpg&quot; alt=&quot;zupwe&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;这张有点喜感&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/8ca5b1307ac4f00fe035ab98da1707a2117106d94764fa09630cd88ffaaf005f.jpg&quot; alt=&quot;i05iv&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/243df3b60b47b3759f2ed4c61b2f87a8f4c5240828a44dbf81996562a9bbd6eb.jpg&quot; alt=&quot;i1cxt&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后去了叽叽扎扎烤肉，由于路程太堵，打车速度极慢，我们选择了骑车前往（感觉我们的技术都还不错 hhh）小插曲是 73 的手机没电了，然后在快要到店里的时候走了另一条路，我们以为她跟丢了然后分头去找，没想到她在没有导航的情况下直接到了店里，强！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/22567168b22afcbe8ac394e5b7993ae0095eac665459cc868ef0b279d4212c92.jpg&quot; alt=&quot;nuwxv&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e15fefe3ad718ae67cc8116abb731b9d0046c56d4c5f368e9392cb4958f3551f.jpg&quot; alt=&quot;kwvzd&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/59df6231c91dd42d129552c5fa444ecfddc6f9f42ed6e8ed53cdac2602ccc6fd.jpg&quot; alt=&quot;e2blg&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;烟熏咖啡和牛&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/d3e5809d57355029991014f03a17343b7e83d47e9e5c0c346d15e75b2b574c66.jpg&quot; alt=&quot;q6u8q&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;水果小牛排&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/0ba670766ab70c74fd4ae51519927791711aed3d65a1a9a428727a8d29e0e601.jpg&quot; alt=&quot;g77yu&quot; loading=&quot;lazy&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://blog.kazoottt.top/media/4dbb4b5ce7e0a93b1577aef4cccac082ad60d4f298234634879d458b9d518007.jpg&quot; alt=&quot;53csg&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;晚上的沙滩&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/37487a71c43c80de2c7ca98bb87f01a216a318a336dc26e90e1282b9f959967a.jpg&quot; alt=&quot;l8j1g&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;2023-10-03&quot;&gt;2023-10-03&lt;/h2&gt;
&lt;p&gt;去了曾厝垵喝酒，那条街道晚上 11 点多还有很多店开着，原来夜生活是集中在这里。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/dd76ba100028f12fd8f36ed446b0318142f791acf831099d9c250c103fb80386.jpg&quot; alt=&quot;gm41g&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;喝完酒之后，便开始一起压马路。我是喝了酒就会犯困的人，所以全程都是省电状态，没有太参与话题，只是听着别人聊。就这样一边走，一边聊，到了天亮。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/91fa5b1f1ee8cb1c8614faa92541a115ba254c434f58ff69da9ef56b3c76c545.jpg&quot; alt=&quot;ncj7q&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/be789b51ab066a66943da49495b58491f770f7a90a5b270a5f57ab50dd54fb5c.jpg&quot; alt=&quot;6olk2&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/87c8479495306e8f496333ab62b7a8b9d3a0b7286687ac5e39df50514ce9c348.jpg&quot; alt=&quot;udk57&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4fe13f86ddde76e6d62ce8cff0df2b14630ba7503d460d56c0e0291d966860e5.jpg&quot; alt=&quot;9qzfj&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e35ef9576e5cb1595bcb417b9b58752256d146bffdd91b89f759c15f32ace5b9.jpg&quot; alt=&quot;pbryh&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;7 点的时候，已经走了一万多步了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/5980d1d063d555212212d74c1a97967b4299e345e7d7351ac9b3140ef968fbe8.jpg&quot; alt=&quot;i6um9&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;清晨无人的街道&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/551961ac110e79940fe34cb4017a85dc6d73e40b8b87584c1e925caa0c14a317.jpg&quot; alt=&quot;i0q1b&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;早鸟&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2023/20231020-gdr5w-e64b6b3700384b35025bf076060e8782.jpg&quot; alt=&quot;gdr5w&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;睡醒后一起去了野草莓。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/9e74a8410f97cc4b2a25a828deee4e0f76fc5eaf0ebfa52583e65fbe4ca8d122.jpg&quot; alt=&quot;yle1e&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b44f4960c209e6646238a08d1d0fea994b6f221623bdc093803378824a5f7a65.jpg&quot; alt=&quot;f7b3m&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4af7f98a77ccfbade27ed76aab8e754033b048448b92a2dbfcc0392b67badfeb.jpg&quot; alt=&quot;fafh4&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/38b281988ba084985140e4dd91ee537c5fc99e712db49f093faae408741f7aa8.jpg&quot; alt=&quot;7d2du&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;野草莓确实是好吃不贵，性价比超级高。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;路过一家买特产的店，看到的标语。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c4e901af64033c152df3d0a8f8edef91cc0eaf4df27bb935c1d0a7f358999a5c.jpg&quot; alt=&quot;e2dzd&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;没想到在厦门还能看到老家关店的那家咖啡店…&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/fd02e3303ed15c38658014ff3620a83141e4911b9ea7cb929cf53074b5083cae.jpg&quot; alt=&quot;ubdph&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/570e560b878955c6fcc91dab828fd48d99e64dfd846138da5cc3ebb422b65dfb.png&quot; alt=&quot;are09&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;在地铁站看到了崩三活动的广告牌，拍一拍。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e5d13ff079ce3dc62c6e503d655cc8a220380e29078410c09c5657844d8a0bbf.jpg&quot; alt=&quot;1mkzv&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;晚饭去了傲客夜食。第一次吃生腌虾，这个料的味道像蕨根粉，口感很 q 弹，但对自己的胃不放心，所以只吃了几只。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/8945ff9f7d6dfbbc9d7f9752d6528aefa5c79b0094d202dae2f4f514bac7550e.jpg&quot; alt=&quot;nhtb9&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;麻辣烤鱼&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2023/20231020-kiz18-e96b627273c9b36493fa7fed9a0057c9.jpg&quot; alt=&quot;kiz18&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;猪肝&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b7a23208fc671f935956548e8695faab2f60140fc38c3062902a79908c5f3afb.jpg&quot; alt=&quot;gk0lw&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;冰粉，好久没吃过了 555&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/79b44a88b28384d028b0c1fce6109a15acbc4251d85bcb1221a42f2f44892dde.jpg&quot; alt=&quot;9jhwf&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;2023-10-04&quot;&gt;2023-10-04&lt;/h2&gt;
&lt;p&gt;离开厦门时路上拍的，天气依旧很好。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/35ac1da2887d16808d3132d9f75c8e2bda3f94d7c163020c0de4a0b0351d75e5.jpg&quot; alt=&quot;3lsf2&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;公交卡里还剩 1 块钱。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/ce25bfa5be8d4441d1a74f357199daa0d0c0db957abaeefcd4b48c603e63c5e1.jpg&quot; alt=&quot;749pb&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;2023-10-05&quot;&gt;2023-10-05&lt;/h2&gt;
&lt;p&gt;一起去了杭州的联动店铺打个卡，虽然还未营业。店里一直在放主播的歌。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/7899e16379b86df7329d621cfe472e61ac78229824bee77aae8cf6a767a842b5.jpg&quot; alt=&quot;u6orx&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e954ff698aabb916c662ccd825a7a264f8daa8062aaa388e576083e673acc8b4.jpg&quot; alt=&quot;da8ck&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c950a45a977bc741225995ed11d99a663d1ff1906a15201b1cc4547ab4a56f35.jpg&quot; alt=&quot;x8715&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后还去吃了排队要很久的方老大，浇头很足很香，不过面的味道对我来说有些淡，如果有机会的话，想试试茄汁。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/4510040df5c461e6c1f64d3faccbd96034eca422440b00e65e84b5efd236b635.jpg&quot; alt=&quot;hwbqc&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;全程都很愉快，但是感觉自己脑子不在线，反应很迟钝。&lt;/p&gt;
&lt;p&gt;谢谢兄弟们的照顾 T T。&lt;/p&gt;
&lt;h2 id=&quot;其他&quot;&gt;其他&lt;/h2&gt;
&lt;p&gt;在厦门观察到的一些点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;好多车都是白色&lt;/li&gt;
&lt;li&gt;路上货拉拉很常见&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;公交卡是会打折的，最少充值 10 元，到最后还剩了 1 元。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/ce25bfa5be8d4441d1a74f357199daa0d0c0db957abaeefcd4b48c603e63c5e1.jpg&quot; alt=&quot;24364C95-E41F-45F2-B641-E2271023A7A0_1_105_c&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</description><category>随笔</category><category>国庆</category><category>杭州</category><category>旅游</category><category>厦门</category><category>hanser</category></item><item><title>messAuto + iMessage 实现iPhone和mac信息同步和自动复制验证码</title><link>https://blog.kazoottt.top/posts/messauto-imessage/</link><guid isPermaLink="false">urn:blog:2e93cd0f-2075-5cb1-8e35-251207acadb7</guid><pubDate>Sun, 24 Sep 2023 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;messauto--imessage-实现-iphone-和-mac-信息同步和自动复制验证码&quot;&gt;messAuto + iMessage 实现 iPhone 和 mac 信息同步和自动复制验证码&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/c11cfc2f5da2cae71afe966f09581dda003437e29acb755e747bb05c2a9eb3c3.webp&quot; alt=&quot;miulm&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;很多时候我们需要手机接收验证码，然后在电脑上使用验证码来登录，如果纯手动操作还是有些繁琐。&lt;/p&gt;
&lt;p&gt;如果你是 iPhone + mac 用户，则可以使用 messauto + imessage 的方式来同步和自动复制验证码的操作。&lt;/p&gt;
&lt;p&gt;一、iphone 和 mac 信息同步&lt;br&gt;
在 iphone 的设置 - 信息 - 短信转发中，勾选你要转发信息的 mac 设备。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/9b6df81b430836a65bd58a01df4af6cc42c152c8ee940f391d37d88b4349b558.webp&quot; alt=&quot;budk7&quot; loading=&quot;lazy&quot;&gt;&lt;br&gt;
然后在对应的 mac 的信息中设置 -iCloud 信息设置中启用 iCloud 云端“信息”，需要注意的是你登录 iphone 和 mac 的 icloud 账号是需要相同的。设置完成，就已经实现了信息的同步，在 mac 的信息里可以看到 iphone 的短信。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/18cfaed3386a3f87fb43f1c5424e2e43781a351dc619252b33305ae927d64d81.webp&quot; alt=&quot;0p16x&quot; loading=&quot;lazy&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.kazoottt.top/media/ffd1091dcc35be32508ba21a88e774b915e15d11bda84cd67a7ddda07e96b0ec.webp&quot; alt=&quot;pj0l1&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;二、安装 messauto，并设置。&lt;/p&gt;
&lt;p&gt;然后我们需要安装 &lt;a href=&quot;https://github.com/LeeeSe/MessAuto&quot;&gt;messauto&lt;/a&gt;,地址是 &lt;a href=&quot;https://github.com/LeeeSe/MessAuto/releases&quot;&gt;https://github.com/LeeeSe/MessAuto&lt;/a&gt;&lt;br&gt;
&lt;img src=&quot;https://blog.kazoottt.top/media/d39616d81d434ac50f33883f84c34961ef058a5bb9e2349b45452e443960213b.webp&quot; alt=&quot;djoq7&quot; loading=&quot;lazy&quot;&gt;&lt;br&gt;
版本：&lt;/p&gt;
&lt;p&gt;MessAuto_aarch64 - 苹果芯片&lt;br&gt;
MessAuto_x86_64 - Intel 芯片&lt;/p&gt;
&lt;p&gt;下载解压后拖到应用程序里，点击运行顶部的状态栏就会出现 messauto 的图标。我个人比较推荐的设置是勾选【自动粘贴】和【登录时启动】，如果勾选【自动粘贴】会提醒需要辅助功能的授权，根据指引跳转过去开启即可。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/3080287120a470f1262e80fb44fe78cfe2302148632f5e53ea71402ffac2408a.webp&quot; alt=&quot;1ucpz&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/dde52d50ed4f66f03b7ceece5083614c265482dd4c33db05d7bca1a72617e402.webp&quot; alt=&quot;5lv1n&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/8ad8ff854b86c6892295ae0840056f646434ba61bf6a3c3c049b508b5c27eb6a.webp&quot; alt=&quot;i7u9s&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后就实现了同步和自动复制验证码了。&lt;/p&gt;</description><category>笔记</category><category>短信同步</category><category>苹果</category><category>效率</category><category>验证码</category><category>apple</category><category>imessage</category><category>iphone</category><category>mac</category><category>messauto</category></item><item><title>隐藏你的twitter信息</title><link>https://blog.kazoottt.top/posts/hide-your-twitter-messages/</link><guid isPermaLink="false">urn:blog:57025126-db36-57cc-8335-0b42c3b92457</guid><pubDate>Thu, 16 Mar 2023 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;hide-your-twitter-info&quot;&gt;Hide-your-twitter-info&lt;/h1&gt;
&lt;p&gt;Hide your Twitter information. Prevent others from seeing your ID, nickname, and profile picture in public places.&lt;/p&gt;
&lt;p&gt;在公共场合不太想别人知道自己的 twitter 账号，于是写了一个油猴脚本，屏蔽 twitter 中自己的 id、昵称、头像。（只写了针对首页的）&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://greasyfork.org/scripts/461892-hide-your-twitter-info&quot;&gt;greasyfork 安装&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/KazooTTT/hide-your-twitter-info&quot;&gt;源代码&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;before:&lt;br&gt;
&lt;img src=&quot;https://blog.kazoottt.top/media/bf77c979848d603ca84c1afd8a458d99d6825b0109a4d175be52f378ce5cd69f.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;after:&lt;br&gt;
&lt;img src=&quot;https://pictures.kazoottt.top/2024/04/20240407-85f6a65cb4696569bcac1a4377b05d6f.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;</description><category>开源</category><category>项目</category><category>油猴脚本</category><category>javascript</category><category>twitter</category></item><item><title>2023-W10</title><link>https://blog.kazoottt.top/posts/2023-W10/</link><guid isPermaLink="false">urn:blog:320eef04-10ee-5761-b45e-5a8881bc6da5</guid><pubDate>Mon, 06 Mar 2023 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;2023-w10&quot;&gt;2023-W10&lt;/h1&gt;
&lt;p&gt;时间范围：3.6-3.12&lt;/p&gt;
&lt;p&gt;信息来源：twitter、微博&lt;/p&gt;
&lt;p&gt;摘要：本周的资讯涵盖了从新兴编辑器工具到设计系统和 AI 应用的多个领域，反映出技术界的最新动态和创新。&lt;/p&gt;
&lt;h2 id=&quot;zed速度比较快的编辑器&quot;&gt;zed，速度比较快的编辑器&lt;/h2&gt;
&lt;p&gt;公司官方：&lt;a href=&quot;https://zed.dev/&quot;&gt;Zed - Code at the speed of thought&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;邀请链接：&lt;a href=&quot;https://zed.dev/invites/PPPbigE69FfzVxIm&quot;&gt;https://zed.dev/invites/PPPbigE69FfzVxIm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/23c6052c5c4a8148e79428ffb1acf9dee1ef543fcc14c9039c4621204f3f46ef.webp&quot; alt=&quot;2ilrw&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;craft-systems&quot;&gt;Craft Systems&lt;/h2&gt;
&lt;p&gt;twitter &lt;a href=&quot;https://twitter.com/ftium4/status/1634476061714165761&quot;&gt;龙爪槐守望者&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;官网 &lt;a href=&quot;https://www.craftsystems.xyz/&quot;&gt;Craft Systems - Figma kits to kickstart your project! (craftsystems.xyz)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e2e7d5f75ccbd43b95880381f5eadc33231c8e8f253155de30bdc5256892a100.webp&quot; alt=&quot;fceah&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;bannerbear&quot;&gt;BannerBear&lt;/h2&gt;
&lt;p&gt;Bannerbear 可以通过我们的 API 和集成帮助您自动生成社交媒体视觉效果、电子商务横幅等。&lt;/p&gt;
&lt;p&gt;twitter &lt;a href=&quot;https://twitter.com/vikingmute/status/1633661260159123456&quot;&gt;Viking 在 Twitter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;官网 &lt;a href=&quot;https://www.bannerbear.com/open/&quot;&gt;Open Startup Metrics - Bannerbear&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/b731e7bd32982babb1362f73b034a4c6c5632ab7d8ff04c1e9a7944058a4a403.webp&quot; alt=&quot;fqc4p&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;openai-的语音识别模型&quot;&gt;OpenAI 的语音识别模型&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://weibo.com/1727858283/MwSTL8iMw#comment&quot;&gt;另一个 whisper... - @宝玉 xp 的微博 - 微博 (weibo.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/8f9b88ab39f13cea078364fe03e5ac1657283b44a1795ea5239735d0866c673b.webp&quot; alt=&quot;rprpu&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;一个开源清单帮助您规划构建和发展设计系统&quot;&gt;一个开源清单，帮助您规划、构建和发展设计系统&lt;/h2&gt;
&lt;p&gt;微博：&lt;a href=&quot;https://weibo.com/1227298402/MwM18a23h#comment&quot;&gt;Design Sys... - @龙爪槐守望者的微博 - 微博 (weibo.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;官网：&lt;a href=&quot;https://www.designsystemchecklist.com/&quot;&gt;https://www.designsystemchecklist.com/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;禁止-aiai-规则明确的平台&quot;&gt;禁止 AI、AI 规则明确的平台&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://weibo.com/6591016982/Mw9ACkbtD#comment&quot;&gt;【tougao】你的。.. - @春日矮男的微博 - 微博 (weibo.com)&lt;/a&gt;&lt;/p&gt;</description><category>周报</category><category>资料收集</category></item><item><title>2021年度总结</title><link>https://blog.kazoottt.top/posts/2021-annual-summary/</link><guid isPermaLink="false">urn:blog:197c1f75-6c0c-5770-80a6-8841fccbaea3</guid><pubDate>Thu, 30 Dec 2021 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;2021-年度总结&quot;&gt;2021 年度总结&lt;/h1&gt;
&lt;p&gt;2021 年是我从学生到打工人过度的一年，其实过得挺糊涂的，做了一些让自己后悔的事情，与此同时生活和学习状态也比较差。&lt;/p&gt;
&lt;h2 id=&quot;1-关于求职&quot;&gt;1. 关于求职&lt;/h2&gt;
&lt;p&gt;总结一下自己犯的错吧，主要有以下三点。&lt;/p&gt;
&lt;p&gt;第一，没有认清自己的长处、兴趣点，盲目跟风。大学在辩论队待了两年，虽然我的专业是软件工程，但是辩论队的学长学姐很多都去了大厂当产品经理。受他们影响，我的求职方向最开始也是产品经理，并且花了一段时间做产品经理的实习，随后才发现自己并不适合也不喜欢做产品，最后才将求职方向转到了前端，在这个过程中真的浪费了很多时间。&lt;/p&gt;
&lt;p&gt;第二，时间、计划安排错误。去年年末找同学内推了百词斩的实习，当时我的想法是可以通过实习来提升自己的前端能力，但是现在回想起来好像是个错误操作。因为这个实习并没有转正的机会，并且我已经错过了秋招的时间，应该做的是好好准备春招。这个实习固然对能力也有一定的提升作用，但是相对于求职来说并没有那么有针对性，并且在工作时间我是不太好意思请假继续面试的。（这就可以顺到第三条），所以在这个过程中又浪费了一些时间。&lt;/p&gt;
&lt;p&gt;第三，脸皮太薄，得过且过，没有魄力。在结束了实习之后，我开始继续投简历，这个时候只有少部分公司开始春招提前批。我从投简历到拿 offer，决定签三方只花了 10 天时间，并且在签三方后就没有继续保持求职状态准备春招了，当时给自己的理由是：不想毁三方，懒得折腾了。现在想起来真的很后悔，当时明明可以把这个作为保底，在春招时再努力一波的，我这种得过且过懒得折腾的坏毛病真的会常常让自己陷入后悔的情绪之中。&lt;/p&gt;
&lt;p&gt;有了这样的后悔之后，我就一直想着要改变现状，想要回到成都或者换一家让自己更满意的公司。目前所在的部门是一个比较新的部门，所以技术栈还比较新，但是我觉得我在技术上的进步真的很小很小，进步速度肯定是远低于同龄人的，状态还是太懈怠了，这样的状态肯定无法让我成功跳槽的，在 2022 年一定要改变自己的状态。&lt;/p&gt;
&lt;h2 id=&quot;2-关于生活&quot;&gt;2. 关于生活&lt;/h2&gt;
&lt;p&gt;6 月，和几个同学一起去青甘环线毕业旅行了，是一次体验非常好的旅行（感谢队友的贴心），景色也很漂亮，在莫高窟观看的洞窟以及相关纪录片让我对相关的历史产生了兴趣。&lt;/p&gt;
&lt;p&gt;7 月，来到了上海，第一次去 bw，第一次拼房，然后开始工作。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pictures.kazoottt.top/2024/04/20240407-cc4524255b79ed8db6699df43af40efb.png&quot; alt=&quot;bw现场照&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;10 月，一个人去了憨的演唱会，算是一次很奇妙的体验。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kazoottt.top/media/e838ae3775921ce8b47983cde735406f031d27f2186c36082d0595f1406cb2dc.jpg&quot; alt=&quot;演唱会照片&quot; loading=&quot;lazy&quot;&gt;&lt;/p&gt;
&lt;p&gt;听歌的口味也变杂了一些，整个人没有以前那样刻薄了，对许多事情越发佛系，只有及其关注的东西才能让我情感产生波动。&lt;/p&gt;
&lt;p&gt;工作后拿到工资，一部分给父母，一部分用在吃住上，一部分拿去瞎理财，一部分留给自己满足物欲，买的比较大件的东西有：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Windows 台式机 （有些后悔了，其实还是笔记本满足我需求，而且买的时候刚好溢价严重）&lt;/li&gt;
&lt;li&gt;显示器&lt;/li&gt;
&lt;li&gt;Oculus Quest2 （为了玩节奏光剑和乒乓球买的，很满意）&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;3-2022-心愿与计划&quot;&gt;3. 2022 心愿与计划&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;重新拾起阅读习惯&lt;/li&gt;
&lt;li&gt;写一个满意项目&lt;/li&gt;
&lt;li&gt;拿一个满意的 offer&lt;/li&gt;
&lt;li&gt;多产出（切片 +mmd）&lt;/li&gt;
&lt;/ol&gt;</description><category>年报</category><category>2021年</category><category>年度总结</category><category>总结</category></item><item><title>2020年度总结</title><link>https://blog.kazoottt.top/posts/y1-2020-annual-summary/</link><guid isPermaLink="false">urn:blog:6c3ebf3e-64c6-5f15-9c30-7545ef16bffe</guid><pubDate>Thu, 31 Dec 2020 00:00:00 GMT</pubDate><description>&lt;h1 id=&quot;y1-2020-年度总结&quot;&gt;Y1-2020 年度总结&lt;/h1&gt;
&lt;h2 id=&quot;1-时间轴&quot;&gt;1. 时间轴&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;6 月&lt;/strong&gt; 省级大创&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;7 月&lt;/strong&gt; 中国高校微信小程序应用开发赛西南赛区 三等奖&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;7.15-8.28&lt;/strong&gt; 上海某金融科技公司 产品经理 实习&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;8 月&lt;/strong&gt; 中国大学生计算机设计大赛 国家级二等奖&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;8.29-9.1&lt;/strong&gt; 中国好声音录制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;9.2&lt;/strong&gt; 送机 + 回成都&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;10.15- 至今&lt;/strong&gt; 成都某教育公司 web 前端开发工程师 实习&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-一些想法&quot;&gt;2. 一些想法&lt;/h2&gt;
&lt;p&gt;李姐的消极怠工和我的消极怠工也就差了上百个银河天梯吧。&lt;/p&gt;
&lt;p&gt;年初的时候决定工作而不是考研，然后就开始慢悠悠地学习前端，结果面试的时候就真的菜吧...&lt;/p&gt;
&lt;p&gt;噢我想说一下为啥要投前端，之前选修修过一个计算机图形学（用的 three.js），然后自己又对数媒比较感兴趣，也就是 processing unity maya 之类，再加上追星想做一点东西出来，也就是说对编程、设计都有需求，所以做前端再合适不过。&lt;/p&gt;
&lt;p&gt;6 月的时候还是没有实习 offer，被打击到了&lt;/p&gt;
&lt;p&gt;后面投岗位就直接投产品了，然后还被辅导员劝了，应该考虑后端&gt;前端&gt;产品，但没办法就是头铁，依然投产品。&lt;/p&gt;
&lt;p&gt;那段时间，上午学车，下午和同学一起在图书馆学习，我就在图书馆走廊面试&lt;/p&gt;
&lt;p&gt;她是要考研的，漫漫地我又有一点动摇，就买了一点考研的资料开始刷数学（我真的有点疯&lt;/p&gt;
&lt;p&gt;后来 7 月面着面着就面上了一家上海的金融科技公司的产品实习&lt;/p&gt;
&lt;p&gt;这家也是个实习生打工为主的公司，变相 996，但是待遇算上补贴、加班费啥的都还好&lt;/p&gt;
&lt;p&gt;最终让我决定离职的是感觉自己真的不适合做产品，特别是非互联网的产品，还是决定做前端（淦，回到起点）&lt;/p&gt;
&lt;p&gt;9 月初，又恰好碰上李宇春录好声音，就一把子离职 + 追星 + 回学校了。回学校之后就在学校学习前端。&lt;/p&gt;
&lt;p&gt;10 月拿了一个国企 offer，岗位是主数据维护，地点泸州，月薪 1w+，但觉得去了之后做的东西和我的专业基本没啥关系了，以后要走的路很窄，然后地点也不喜欢，就没去。后来拿了一个教育科技公司的实习 offer，岗位 web 前端，虽然是实习，但是觉得可以在实习中多提升自己，就还是去了，感觉导师、同事、氛围都很好，用的框架是 vue&lt;/p&gt;
&lt;p&gt;感觉现在前端是真的入门了吧，要继续提升的就是计网和算法了，1.15 离职，回家后好好刷题。之前和导师聊过，说不续约了，他说在这里也可以刷题可以问他问题还可以拿钱，但我还是想回家刷，可能就是想换个环境吧。&lt;/p&gt;
&lt;p&gt;感觉自己每次做决定都挺随意的，朋友也吐槽过我说想法经常变，但是没办法 😂&lt;/p&gt;
&lt;h2 id=&quot;3-一些数据&quot;&gt;3. 一些数据&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;wakatime:&lt;/p&gt;
&lt;p&gt;2020 594h 205%↑&lt;/p&gt;
&lt;p&gt;2019 195h&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;微信读书&lt;/p&gt;
&lt;p&gt;124h&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;4-2021-心愿与计划&quot;&gt;4. 2021 心愿与计划&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;最大的愿望就是拿一个满意的 offer 啦&lt;/li&gt;
&lt;li&gt;把宿舍的纸质书都看完（看不完就送人了 0.0&lt;/li&gt;
&lt;li&gt;学习电吉他&lt;/li&gt;
&lt;li&gt;学习画画&lt;/li&gt;
&lt;li&gt;学习 mmd&lt;/li&gt;
&lt;/ol&gt;</description><category>年报</category><category>2020年</category><category>年度总结</category><category>总结</category></item></channel></rss>