<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>LTSpace</title><description>LT 的个人网站，记录软件工程、技术实践与生活。</description><link>https://lter.space/</link><language>zh-CN</language><item><title>济南天气热了，偶然的热浪扑在脸上时，会让我突然想起长沙</title><link>https://lter.space/posts/%E6%B5%8E%E5%8D%97%E5%A4%A9%E6%B0%94%E7%83%AD%E4%BA%86%EF%BC%8C%E5%81%B6%E7%84%B6%E7%9A%84%E7%83%AD%E6%B5%AA%E6%89%91%E5%9C%A8%E8%84%B8%E4%B8%8A%E6%97%B6%EF%BC%8C%E4%BC%9A%E8%AE%A9%E6%88%91%E7%AA%81%E7%84%B6%E6%83%B3%E8%B5%B7%E9%95%BF%E6%B2%99%EF%BC%8C/</link><guid isPermaLink="true">https://lter.space/posts/%E6%B5%8E%E5%8D%97%E5%A4%A9%E6%B0%94%E7%83%AD%E4%BA%86%EF%BC%8C%E5%81%B6%E7%84%B6%E7%9A%84%E7%83%AD%E6%B5%AA%E6%89%91%E5%9C%A8%E8%84%B8%E4%B8%8A%E6%97%B6%EF%BC%8C%E4%BC%9A%E8%AE%A9%E6%88%91%E7%AA%81%E7%84%B6%E6%83%B3%E8%B5%B7%E9%95%BF%E6%B2%99%EF%BC%8C/</guid><description>济南天气热了，偶然的热浪扑在脸上时，会让我突然想起长沙， 恍如隔世。 我很怕热，最后却也习惯了长沙即使晚上仍然能到34摄氏度的高温。 或者我没习惯，我只是忘记了。 去年那些闷热的天气里，下着打不打伞都无所谓的喷雾雨。 我走下学校门前的斜…</description><pubDate>Sun, 19 Apr 2026 09:38:43 GMT</pubDate><content:encoded>&lt;p&gt;济南天气热了，偶然的热浪扑在脸上时，会让我突然想起长沙，&lt;/p&gt;
&lt;p&gt;恍如隔世。&lt;/p&gt;
&lt;p&gt;我很怕热，最后却也习惯了长沙即使晚上仍然能到34摄氏度的高温。&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;
&lt;p&gt;是配不上我欲望的能力。&lt;/p&gt;
&lt;p&gt;总是离开一个地方才开始怀念，大概是知道永远回不去了，&lt;/p&gt;
&lt;p&gt;那段人生已如河水般流走，故地重游是刻舟求剑，也再无法踏入那段心境。&lt;/p&gt;
</content:encoded><category>随笔</category></item><item><title>工程里的取舍与熵减</title><link>https://lter.space/posts/%E5%B7%A5%E7%A8%8B%E9%87%8C%E7%9A%84%E5%8F%96%E8%88%8D%E4%B8%8E%E7%86%B5%E5%87%8F/</link><guid isPermaLink="true">https://lter.space/posts/%E5%B7%A5%E7%A8%8B%E9%87%8C%E7%9A%84%E5%8F%96%E8%88%8D%E4%B8%8E%E7%86%B5%E5%87%8F/</guid><description>工程不是将功能做出来就结束了，而是在越来越复杂的约束下持续做选择。 每天无数次 tradeoff，要考虑项目鲁棒性与过度设计的平衡，在详细的可观测审计和隐私脱敏之间做选择，在统一收敛和多种产品业务差异之间做选择。需求不断改，要在新的理想…</description><pubDate>Wed, 15 Apr 2026 02:20:00 GMT</pubDate><content:encoded>&lt;p&gt;工程不是将功能做出来就结束了，而是在越来越复杂的约束下持续做选择。&lt;/p&gt;
&lt;p&gt;每天无数次 tradeoff，要考虑项目鲁棒性与过度设计的平衡，在详细的可观测审计和隐私脱敏之间做选择，在统一收敛和多种产品业务差异之间做选择。需求不断改，要在新的理想模型和历史版本之间做兼容，还要考虑兼容到什么程度。内测时候，每次都想急头白脸地直接清库发版，最后总是发善心，默默做迁移、做灰度。&lt;/p&gt;
&lt;p&gt;犯懒时总会想起去年技术债爆发的时刻，只能无奈地继续改。有些问题是真的风险，有些担忧又只是想象中的完美主义，还要在安全性、可用性、复杂度与演进成本之间反复权衡。&lt;/p&gt;
&lt;p&gt;资历尚浅，确信太阳底下无新事，此刻遇到的问题必有前人踩过，所以工程风格是循规蹈矩的学院派。偶尔遇到当年背过的八股派上用场，会感慨回旋镖终于正中眉心。开心之余又会发现，我喜欢的那些被称作最佳实践的东西，总是不能被不加折损地应用进当前的业务场景。恨此事古难全，月有阴晴圆缺。&lt;/p&gt;
&lt;p&gt;明白真正难的不是能不能做，而是做到什么程度最合适。原来所谓架构，很多时候就是在有限现实里，做出一组长期来看最稳妥的取舍。我总在诘问人活着的意义，顿感虚无，原知此事也从来没有确定的答案。&lt;/p&gt;
&lt;p&gt;如果真有银弹就好了，如果世间只有黑白两种极端就好了。即使 AI 能将人从一些机械劳动中解放出来，无序变有序也不是件容易的事情。&lt;/p&gt;
&lt;p&gt;但还好，我同样喜欢熵减的过程。&lt;/p&gt;
</content:encoded><category>随笔</category><category>工程</category><category>架构</category><category>思考</category></item><item><title>VS Code 插件 Webview 本地文件链接修复记录</title><link>https://lter.space/posts/vscode-webview-local-file-link-fix/</link><guid isPermaLink="true">https://lter.space/posts/vscode-webview-local-file-link-fix/</guid><description>1. 问题现象 在 VS Code 的某 AI 插件 Webview 中，回复里的本地文件链接点击后没有走编辑器内的 open file 能力，而是被当成普通网页链接打开浏览器，表现为跳转到类似下面的地址： text https://f…</description><pubDate>Fri, 03 Apr 2026 03:30:00 GMT</pubDate><content:encoded>&lt;h2&gt;1. 问题现象&lt;/h2&gt;
&lt;p&gt;在 VS Code 的某 AI 插件 Webview 中，回复里的本地文件链接点击后没有走编辑器内的 &lt;code&gt;open-file&lt;/code&gt; 能力，而是被当成普通网页链接打开浏览器，表现为跳转到类似下面的地址：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;https://file+.vscode-resource.vscode-cdn.net/c%3A/Users/...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这会导致以下文件引用无法正常在编辑器内跳转。以下为路径示例：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;c:/Users/&amp;lt;USER&amp;gt;/&amp;lt;WORKSPACE&amp;gt;/internal/module/example_file.go#L17
C:\Users\&amp;lt;USER&amp;gt;\&amp;lt;WORKSPACE&amp;gt;\internal\module\example_file.go:73
/C:/Users/&amp;lt;USER&amp;gt;/&amp;lt;WORKSPACE&amp;gt;/internal/http/example_test.go:1
file:///C:/Users/&amp;lt;USER&amp;gt;/&amp;lt;WORKSPACE&amp;gt;/internal/module/example_file.go#L71
c%3A/Users/&amp;lt;USER&amp;gt;/&amp;lt;WORKSPACE&amp;gt;/internal/module/example_file.go#L25
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;2. 根因分析&lt;/h2&gt;
&lt;p&gt;问题不是单点故障，而是两层处理叠加导致：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;本地文件路径格式不统一&lt;/li&gt;
&lt;li&gt;Markdown 渲染阶段过早改写了本地文件 &lt;code&gt;href&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;具体来说：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;本地文件路径格式不统一&lt;br&gt;Webview 里的文件引用可能以 &lt;code&gt;c:/&lt;/code&gt;、&lt;code&gt;C:\&lt;/code&gt;、&lt;code&gt;/C:/&lt;/code&gt;、&lt;code&gt;file:///C:/&lt;/code&gt;、&lt;code&gt;c%3A/...&lt;/code&gt; 等不同形式出现，原始解析逻辑没有先做 Windows 路径规范化。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Markdown 渲染阶段过早改写了本地文件 &lt;code&gt;href&lt;/code&gt;&lt;br&gt;在文件链接被 &lt;code&gt;renderPromptLink -&amp;gt; FileLink -&amp;gt; open-file&lt;/code&gt; 接管之前，&lt;code&gt;urlTransform&lt;/code&gt; 已经先把它按普通链接处理并改写，因此点击时直接走浏览器。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;结论：仅修复文件引用解析函数还不够，必须同时修复 &lt;code&gt;urlTransform&lt;/code&gt; 对本地文件链接的判定。&lt;/p&gt;
&lt;h2&gt;3. 修复方案&lt;/h2&gt;
&lt;p&gt;本次修复直接修改已安装扩展的 Webview bundle。以下安装路径已脱敏：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;C:\Users\&amp;lt;USER&amp;gt;\.vscode\extensions\&amp;lt;publisher&amp;gt;.&amp;lt;extension&amp;gt;-&amp;lt;version&amp;gt;\webview\assets\markdown-*.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并保留原始备份：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;C:\Users\&amp;lt;USER&amp;gt;\.vscode\extensions\&amp;lt;publisher&amp;gt;.&amp;lt;extension&amp;gt;-&amp;lt;version&amp;gt;\webview\assets\markdown-*.js.bak
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修复分为两部分。&lt;/p&gt;
&lt;h3&gt;3.1 增加 Windows 本地文件引用规范化&lt;/h3&gt;
&lt;p&gt;新增 &lt;code&gt;normalizeWindowsFileReference()&lt;/code&gt;，在 &lt;code&gt;parseFileReference&lt;/code&gt; 的入口统一处理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;decodeURIComponent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;file:///C:/...&lt;/code&gt; 去协议头&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/C:/...&lt;/code&gt; 去前导斜杠&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C:\...&lt;/code&gt; 转成 &lt;code&gt;C:/...&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样文件引用在进入后续判断前会被统一成可识别的本地路径。&lt;/p&gt;
&lt;h3&gt;3.2 修改 &lt;code&gt;kT()&lt;/code&gt;，阻止本地文件链接被改写成浏览器 URL&lt;/h3&gt;
&lt;p&gt;原逻辑只对 &lt;code&gt;app&lt;/code&gt;、&lt;code&gt;plugin&lt;/code&gt;、&lt;code&gt;agent&lt;/code&gt; 之类的特殊链接保留原始 &lt;code&gt;href&lt;/code&gt;。&lt;br&gt;修复后把 &lt;code&gt;_b(e)&lt;/code&gt; 和 &lt;code&gt;vb(e)&lt;/code&gt; 识别出的本地文件链接也纳入保留范围，避免它们被 &lt;code&gt;Xc(e)&lt;/code&gt; 转成 &lt;code&gt;vscode-resource&lt;/code&gt; 风格 URL。&lt;/p&gt;
&lt;h2&gt;4. 证据代码&lt;/h2&gt;
&lt;p&gt;以下证据来自修复后的 bundle 文件。&lt;/p&gt;
&lt;h3&gt;4.1 文件引用解析入口已经增加 Windows 路径规范化&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function normalizeWindowsFileReference(e){
  let t=e.replace(/`/g,&amp;#39;&amp;#39;).trim();
  try{t=decodeURIComponent(t)}catch{}
  let n=t.toLowerCase();
  return n.startsWith(&amp;#39;file:///&amp;#39;)&amp;amp;&amp;amp;(t=t.slice(8)),
    /^\/[A-Za-z]:[\\/]/.test(t)&amp;amp;&amp;amp;(t=t.replace(/^\/+/g,&amp;#39;&amp;#39;)),
    /^[A-Za-z]:[\\/]/.test(t)&amp;amp;&amp;amp;(t=t.replace(/\\/g,&amp;#39;/&amp;#39;)),
    t
}

function pb(e){
  let t=normalizeWindowsFileReference(e),n=t.match(...)
  ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明：&lt;code&gt;pb()&lt;/code&gt; 即文件引用解析入口，修复后不再直接对原始字符串做正则匹配，而是先做规范化。&lt;/p&gt;
&lt;h3&gt;4.2 文件链接识别逻辑本身存在，并最终走 &lt;code&gt;open-file&lt;/code&gt;&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function Qw({className:e,cwd:t,elementKey:n,href:r,label:i}){
  ...
  if(_b(r)||vb(r)){
    let i=pb(r),o=mb(i);
    return (0,V.jsx)(yb,{...})
  }
  return null
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function wb(e){
  let {...,path:o,line:s,column:l,cwd:u}=e,d=Ke(`open-file`)
  ...
  d.mutate({path:o,line:s,column:e,cwd:u})
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明：这证明插件本身已经有“识别文件链接并调用 &lt;code&gt;open-file&lt;/code&gt;”的能力，问题不在跳转能力缺失，而在前序处理把链接提前改坏了。&lt;/p&gt;
&lt;h3&gt;4.3 关键修复点：&lt;code&gt;kT()&lt;/code&gt; 现在对本地文件链接保留原始 &lt;code&gt;href&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;修复后的代码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;function kT(e,t,n){
  return t===`href`&amp;amp;&amp;amp;n.tagName===`a`&amp;amp;&amp;amp;(q_(e)||X_(e)||J_(e)||Y_(e)||_b(e)||vb(e))
    || t===`src`&amp;amp;&amp;amp;n.tagName===`img`&amp;amp;&amp;amp;(uT.test(e)||et(e))
    ? e
    : Xc(e)
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关键变化是新增：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;||_b(e)||vb(e)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明：这一步让本地文件链接不再被 &lt;code&gt;Xc(e)&lt;/code&gt; 改写，从而能够继续流入 &lt;code&gt;Qw()&lt;/code&gt;，最终由 &lt;code&gt;open-file&lt;/code&gt; 打开。&lt;/p&gt;
&lt;h2&gt;5. 验证结果&lt;/h2&gt;
&lt;p&gt;已验证以下输入都可以被解析为统一的本地文件路径，并保留行号。以下样例均已脱敏：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;c:/Users/&amp;lt;USER&amp;gt;/&amp;lt;WORKSPACE&amp;gt;/internal/module/example_file.go#L17
=&amp;gt; {&amp;quot;path&amp;quot;:&amp;quot;c:/Users/&amp;lt;USER&amp;gt;/&amp;lt;WORKSPACE&amp;gt;/internal/module/example_file.go&amp;quot;,&amp;quot;line&amp;quot;:17}

c%3A/Users/&amp;lt;USER&amp;gt;/&amp;lt;WORKSPACE&amp;gt;/internal/module/example_file.go#L17
=&amp;gt; {&amp;quot;path&amp;quot;:&amp;quot;c:/Users/&amp;lt;USER&amp;gt;/&amp;lt;WORKSPACE&amp;gt;/internal/module/example_file.go&amp;quot;,&amp;quot;line&amp;quot;:17}

C:\Users\&amp;lt;USER&amp;gt;\&amp;lt;WORKSPACE&amp;gt;\internal\module\example_file.go:25
=&amp;gt; {&amp;quot;path&amp;quot;:&amp;quot;C:/Users/&amp;lt;USER&amp;gt;/&amp;lt;WORKSPACE&amp;gt;/internal/module/example_file.go&amp;quot;,&amp;quot;line&amp;quot;:25}

/C:/Users/&amp;lt;USER&amp;gt;/&amp;lt;WORKSPACE&amp;gt;/internal/module/example_file.go:31
=&amp;gt; {&amp;quot;path&amp;quot;:&amp;quot;C:/Users/&amp;lt;USER&amp;gt;/&amp;lt;WORKSPACE&amp;gt;/internal/module/example_file.go&amp;quot;,&amp;quot;line&amp;quot;:31}

file:///C:/Users/&amp;lt;USER&amp;gt;/&amp;lt;WORKSPACE&amp;gt;/internal/module/example_file.go#L71
=&amp;gt; {&amp;quot;path&amp;quot;:&amp;quot;C:/Users/&amp;lt;USER&amp;gt;/&amp;lt;WORKSPACE&amp;gt;/internal/module/example_file.go&amp;quot;,&amp;quot;line&amp;quot;:71}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;实际操作上，在执行 &lt;code&gt;Developer: Reload Window&lt;/code&gt; 后，点击 Webview 中的本地文件链接，已经能够回到 VS Code 内部打开文件，而不再跳转浏览器。&lt;/p&gt;
&lt;h2&gt;6. 回滚方式&lt;/h2&gt;
&lt;p&gt;如果后续扩展升级或补丁需要撤回，直接用备份文件覆盖：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;源文件：
C:\Users\&amp;lt;USER&amp;gt;\.vscode\extensions\&amp;lt;publisher&amp;gt;.&amp;lt;extension&amp;gt;-&amp;lt;version&amp;gt;\webview\assets\markdown-*.js.bak

目标文件：
C:\Users\&amp;lt;USER&amp;gt;\.vscode\extensions\&amp;lt;publisher&amp;gt;.&amp;lt;extension&amp;gt;-&amp;lt;version&amp;gt;\webview\assets\markdown-*.js
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;7. 结论&lt;/h2&gt;
&lt;p&gt;这次问题的本质是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows 本地文件路径格式不统一&lt;/li&gt;
&lt;li&gt;Webview 的 URL 转换流程对本地文件链接处理顺序不正确&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最终有效修复不是单纯“增强文件路径解析”，而是同时修正：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文件路径规范化入口&lt;/li&gt;
&lt;li&gt;Markdown &lt;code&gt;href&lt;/code&gt; 的 URL 保留策略&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;只有两者一起改，文件链接才能稳定落到 &lt;code&gt;open-file&lt;/code&gt;，而不是被浏览器接管。&lt;/p&gt;
</content:encoded><category>教程</category><category>故障排查</category><category>VS Code</category><category>Webview</category><category>插件开发</category></item><item><title>Next 前端代理截断大文件请求体的排查记录</title><link>https://lter.space/posts/next-multipart-body-limit-debug/</link><guid isPermaLink="true">https://lter.space/posts/next-multipart-body-limit-debug/</guid><description>日期：2026 03 24 场景： /posts/new 发布技能帖时，上传 MCP ZIP 到 POST /api/v1/skills/market/package/inspect 1. 问题现象 线上用户在发布技能帖时，已经选择了 …</description><pubDate>Tue, 24 Mar 2026 04:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;日期：2026-03-24
场景：&lt;code&gt;/posts/new&lt;/code&gt; 发布技能帖时，上传 MCP ZIP 到 &lt;code&gt;POST /api/v1/skills/market/package/inspect&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;1. 问题现象&lt;/h2&gt;
&lt;p&gt;线上用户在发布技能帖时，已经选择了 ZIP 包，页面本地也能正常读取 &lt;code&gt;mcp.json&lt;/code&gt; 并自动回填字段，但点击提交后服务端校验阶段失败。&lt;/p&gt;
&lt;p&gt;实际出现过三类报错：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;502 backend_unreachable / fetch failed&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;422 请求参数校验失败，body -&amp;gt; file: Field required&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;500 Internal Server Error&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这三类报错看起来像三个问题，实际上是同一条链路上不同阶段暴露出来的现象。&lt;/p&gt;
&lt;h2&gt;2. 请求链路&lt;/h2&gt;
&lt;p&gt;这条上传链路不是浏览器直接打后端，而是四段：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;浏览器发起 &lt;code&gt;POST /api/v1/skills/market/package/inspect&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;请求先进入 Next App Router 的 route handler&lt;/li&gt;
&lt;li&gt;Next 再把请求代理到后端 FastAPI&lt;/li&gt;
&lt;li&gt;FastAPI 在 &lt;code&gt;skills.py&lt;/code&gt; 里读取 &lt;code&gt;UploadFile&lt;/code&gt;，解析 ZIP 和 &lt;code&gt;mcp.json&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;对应代码：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;前端页面发请求：&lt;code&gt;frontend/src/app/posts/new/page.tsx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;前端上传调用：&lt;code&gt;frontend/src/lib/upload.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;axios 实例：&lt;code&gt;frontend/src/lib/api.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Next 代理入口：&lt;code&gt;frontend/src/app/api/v1/[...path]/route.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Next 代理实现：&lt;code&gt;frontend/src/lib/server/proxy.ts&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;后端校验入口：&lt;code&gt;backend/app/routers/v1/skills.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;3. 第一阶段判断：不是 ZIP 本身不合法&lt;/h2&gt;
&lt;p&gt;最先看到的现象是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;选择 ZIP 后，页面已经自动填出了技能名、显示名、版本号、入口文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这说明至少两件事成立：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;浏览器侧确实拿到了 ZIP 文件&lt;/li&gt;
&lt;li&gt;本地预检逻辑已经成功读到了 &lt;code&gt;mcp.json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以问题不在用户没选文件，也不在ZIP 格式一定错误，而在服务端复检链路。&lt;/p&gt;
&lt;h2&gt;4. 第二阶段判断：浏览器发出的 multipart 是否正确&lt;/h2&gt;
&lt;p&gt;接着重点检查浏览器到底发了什么。&lt;/p&gt;
&lt;p&gt;在线上页面里做了两层拦截：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;拦 &lt;code&gt;XMLHttpRequest.send&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;拦 Playwright 的 network route&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最终确认：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;请求体类型是 &lt;code&gt;FormData&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;其中确实有一个字段名为 &lt;code&gt;file&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;文件名是 &lt;code&gt;china-travel-mcp.zip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;文件大小是 &lt;code&gt;11259870&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;浏览器请求头里的 &lt;code&gt;Content-Type&lt;/code&gt; 已经是标准的
&lt;code&gt;multipart/form-data; boundary=...&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这一步的结论很关键：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;浏览器没有漏传文件&lt;/li&gt;
&lt;li&gt;字段名也没有拼错&lt;/li&gt;
&lt;li&gt;boundary 也存在&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因此，&lt;code&gt;422 body -&amp;gt; file required&lt;/code&gt; 不是浏览器层的问题。&lt;/p&gt;
&lt;h2&gt;5. 第三阶段判断：为什么会先出现 422&lt;/h2&gt;
&lt;p&gt;虽然浏览器层是对的，但服务端一度返回过：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &amp;quot;code&amp;quot;: 422,
  &amp;quot;message&amp;quot;: &amp;quot;请求参数校验失败&amp;quot;,
  &amp;quot;errors&amp;quot;: [
    {
      &amp;quot;field&amp;quot;: &amp;quot;body -&amp;gt; file&amp;quot;,
      &amp;quot;message&amp;quot;: &amp;quot;Field required&amp;quot;
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个错误说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;请求已经到达后端&lt;/li&gt;
&lt;li&gt;但 FastAPI 没把它识别成一个合法的 &lt;code&gt;multipart&lt;/code&gt; 文件字段&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这时重点怀疑的是代理层二次转发把 multipart 搞坏了。&lt;/p&gt;
&lt;p&gt;于是做了两类修复：&lt;/p&gt;
&lt;h3&gt;5.1 浏览器侧不再手写 &lt;code&gt;Content-Type&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;在这些地方移除了手写的 multipart 头：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;frontend/src/lib/upload.ts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;同时在 axios 请求拦截器里加了保护：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果 &lt;code&gt;config.data instanceof FormData&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;就删除默认的 &lt;code&gt;Content-Type&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;让浏览器自己生成 boundary&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;frontend/src/lib/api.ts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;5.2 Next 代理不再透传有风险的长度/编码头&lt;/h3&gt;
&lt;p&gt;在代理层删除了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;content-length&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content-encoding&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;并补了失败日志，方便区分是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Next 连不上后端&lt;/li&gt;
&lt;li&gt;还是后端自己返回了 5xx&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;frontend/src/lib/server/proxy.ts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些修复解决了最初的 &lt;code&gt;502 fetch failed&lt;/code&gt;，也让请求更接近正确，但还没有解决最终问题。&lt;/p&gt;
&lt;h2&gt;6. 第四阶段判断：为什么后来变成 500&lt;/h2&gt;
&lt;p&gt;用户随后反馈线上变成了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;500 Internal Server Error&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这时直接去线上机器看 pod 日志，而不是继续猜。&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;44&lt;/code&gt; 机器上查看前端 pod 日志，命中了两条关键日志：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Request body exceeded 10MB for /api/v1/skills/market/package/inspect.
Only the first 10MB will be available unless configured.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以及：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;TypeError: Failed to parse body as FormData.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这两条日志直接把根因钉死了。&lt;/p&gt;
&lt;h2&gt;7. 根因&lt;/h2&gt;
&lt;p&gt;根因不是后端，也不是浏览器，而是 &lt;strong&gt;Next 前端在启用 &lt;code&gt;src/proxy.ts&lt;/code&gt; 的情况下，对请求体有默认 10MB 上限&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;而这次上传的 ZIP 实际大小是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;11259870&lt;/code&gt; 字节&lt;/li&gt;
&lt;li&gt;大约 &lt;code&gt;10.996 MB&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;也就是说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;浏览器把完整文件发到了 Next&lt;/li&gt;
&lt;li&gt;Next 在进入 route handler 前先缓冲请求体&lt;/li&gt;
&lt;li&gt;因为默认只允许 10MB，所以它把请求体截断了&lt;/li&gt;
&lt;li&gt;随后 &lt;code&gt;request.formData()&lt;/code&gt; 读取的是一个被截断的 multipart body&lt;/li&gt;
&lt;li&gt;最终就会出现：&lt;ul&gt;
&lt;li&gt;有时解析失败直接 500&lt;/li&gt;
&lt;li&gt;有时后端看到的表单不完整，表现成 422 &lt;code&gt;file required&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这也是为什么：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;普通接口都正常&lt;/li&gt;
&lt;li&gt;只有这个大文件上传接口出问题&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;因为问题不是前端完全连不上后端，而是Next 在处理大 multipart body 时先把包截断了。&lt;/p&gt;
&lt;h2&gt;8. 修复方案&lt;/h2&gt;
&lt;p&gt;修复分两部分。&lt;/p&gt;
&lt;h3&gt;8.1 提高 Next 的请求体上限&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;frontend/next.config.ts&lt;/code&gt; 中加入：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ts&quot;&gt;experimental: {
  proxyClientMaxBodySize: &amp;quot;32mb&amp;quot;,
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样技能 ZIP 在常见场景下不会再被 Next 默认的 10MB 限制截断。&lt;/p&gt;
&lt;h3&gt;8.2 代理层对 multipart 重新建包再转发&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;frontend/src/lib/server/proxy.ts&lt;/code&gt; 中，针对 &lt;code&gt;multipart/form-data&lt;/code&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先 &lt;code&gt;request.formData()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;再构造新的 &lt;code&gt;FormData&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;把字段和文件重新 append&lt;/li&gt;
&lt;li&gt;删除原始 &lt;code&gt;content-type&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;让 Node 重新生成新的 boundary&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样可以避免二次转发时 header 和 body 不一致。&lt;/p&gt;
&lt;p&gt;同时补充日志字段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;request_content_type&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;request_content_length&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;proxied_body_bytes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;multipart_fields&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样后续如果还出问题，可以直接从日志看出代理层到底收到了哪些字段、文件名和大小。&lt;/p&gt;
&lt;h2&gt;9. 前端交互上的补充&lt;/h2&gt;
&lt;p&gt;因为这次问题和包大小直接相关，前端页面也补了两点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;上传区提示最大支持 &lt;code&gt;32 MB&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;选中文件时先做前置大小校验，超限立即报错，不等提交&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;frontend/src/app/posts/new/page.tsx&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;10. 这次排查的有效经验&lt;/h2&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;code&gt;FormData&lt;/code&gt; 和 &lt;code&gt;Content-Type&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;再看中间代理层有没有重写 header 或截断 body&lt;/li&gt;
&lt;li&gt;最后再看后端是否真的没收到字段&lt;/li&gt;
&lt;/ol&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;对于有前端代理的 Web 项目，&lt;strong&gt;中间层本身就是问题源&lt;/strong&gt;，尤其是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;大文件上传&lt;/li&gt;
&lt;li&gt;multipart 二次转发&lt;/li&gt;
&lt;li&gt;body limit&lt;/li&gt;
&lt;li&gt;默认代理缓冲策略&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;11. 最终结论&lt;/h2&gt;
&lt;p&gt;本次问题的最终根因是：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Next 前端代理对请求体的默认 10MB 上限，导致 10.996MB 的 ZIP 在进入 route handler 前被截断，后续 multipart 解析失败。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;正确修复不是只改后端，也不是只改浏览器发包，而是同时做到：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;浏览器端不手写 multipart &lt;code&gt;Content-Type&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Next 代理层安全转发 multipart&lt;/li&gt;
&lt;li&gt;Next 配置提升请求体上限&lt;/li&gt;
&lt;li&gt;页面上明确提示最大包大小&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;只有这几层一起符合，整条上传链路才稳定。&lt;/p&gt;
</content:encoded><category>服务器</category><category>Next.js</category><category>故障排查</category><category>文件上传</category><category>FastAPI</category></item><item><title>Docker 私有仓库连接 EOF 错误排查指南</title><link>https://lter.space/posts/docker-private-registry-eof-troubleshooting/</link><guid isPermaLink="true">https://lter.space/posts/docker-private-registry-eof-troubleshooting/</guid><description>问题现象 执行 docker build 构建镜像时，无法从私有 Harbor 仓库拉取基础镜像： plaintext ERROR: failed to solve: 192.168.x.x:80/infra/alpine:3.23.2…</description><pubDate>Wed, 18 Mar 2026 10:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;问题现象&lt;/h2&gt;
&lt;p&gt;执行 &lt;code&gt;docker build&lt;/code&gt; 构建镜像时，无法从私有 Harbor 仓库拉取基础镜像：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;ERROR: failed to solve: 192.168.x.x:80/infra/alpine:3.23.2: 
failed to resolve source metadata: failed to do request: 
Head &amp;quot;https://192.168.x.x:80/v2/infra/alpine/manifests/3.23.2&amp;quot;: EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;尝试 &lt;code&gt;docker login&lt;/code&gt; 同样失败：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Error response from daemon: Get &amp;quot;http://192.168.x.x:80/v2/&amp;quot;: EOF
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;环境信息&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Docker Desktop for Windows (WSL2 backend)&lt;/li&gt;
&lt;li&gt;私有 Harbor 仓库，HTTP 协议（非 HTTPS）&lt;/li&gt;
&lt;li&gt;已配置 Insecure Registries&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;排查过程&lt;/h2&gt;
&lt;h3&gt;Step 1: 验证网络连通性&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ping 192.168.x.x
# 结果: 正常响应，网络可达
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 2: 验证 Registry 服务状态&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl -v http://192.168.x.x:80/v2/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回结果：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;HTTP/1.1 401 Unauthorized
Docker-Distribution-Api-Version: registry/2.0
Www-Authenticate: Bearer realm=&amp;quot;http://192.168.x.x/service/token&amp;quot;
{&amp;quot;errors&amp;quot;:[{&amp;quot;code&amp;quot;:&amp;quot;UNAUTHORIZED&amp;quot;,&amp;quot;message&amp;quot;:&amp;quot;unauthorized&amp;quot;}]}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;关键发现&lt;/strong&gt;: Registry 服务正常运行，返回 401 表示需要认证，这是预期行为。&lt;/p&gt;
&lt;h3&gt;Step 3: 检查 Docker 配置&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker info
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确认 Insecure Registries 配置：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Insecure Registries:
  192.168.x.x:80
  127.0.0.0/8
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置正确，排除 HTTP/HTTPS 协议问题。&lt;/p&gt;
&lt;h3&gt;Step 4: 定位根因&lt;/h3&gt;
&lt;p&gt;继续检查 &lt;code&gt;docker info&lt;/code&gt; 输出，发现代理配置：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;HTTP Proxy: http.docker.internal:3128
HTTPS Proxy: http.docker.internal:3128
No Proxy: hubproxy.docker.internal
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;根因确认&lt;/strong&gt;: Docker Desktop 配置了代理，但私有仓库地址未加入 No Proxy 列表，导致请求被代理拦截后返回 EOF。&lt;/p&gt;
&lt;h2&gt;解决方案&lt;/h2&gt;
&lt;h3&gt;方法一：添加 No Proxy 例外（推荐）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;打开 Docker Desktop → Settings&lt;/li&gt;
&lt;li&gt;进入 Resources → Proxies&lt;/li&gt;
&lt;li&gt;在 &lt;strong&gt;Bypass proxy settings for these hosts &amp;amp; domains&lt;/strong&gt; 添加私有仓库地址&lt;/li&gt;
&lt;li&gt;Apply &amp;amp; Restart&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;方法二：临时禁用代理&lt;/h3&gt;
&lt;p&gt;如果不需要代理，可直接关闭 Manual proxy configuration。&lt;/p&gt;
&lt;h2&gt;验证修复&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 登录测试
docker login 192.168.x.x:80

# 构建测试
docker build -f deployments/Dockerfile -t your-image:tag .
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;总结&lt;/h2&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;EOF 错误&lt;/td&gt;
&lt;td&gt;代理拦截&lt;/td&gt;
&lt;td&gt;检查 &lt;code&gt;docker info&lt;/code&gt; 中的 Proxy 配置&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EOF 错误&lt;/td&gt;
&lt;td&gt;网络不通&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ping&lt;/code&gt; / &lt;code&gt;curl&lt;/code&gt; 测试连通性&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;401 Unauthorized&lt;/td&gt;
&lt;td&gt;认证问题&lt;/td&gt;
&lt;td&gt;正常现象，需要 &lt;code&gt;docker login&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTTPS 证书错误&lt;/td&gt;
&lt;td&gt;未配置 Insecure Registry&lt;/td&gt;
&lt;td&gt;检查 &lt;code&gt;docker info&lt;/code&gt; 中的 Insecure Registries&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;核心经验&lt;/strong&gt;: 当 &lt;code&gt;curl&lt;/code&gt; 能正常访问但 Docker 客户端返回 EOF 时，优先排查代理配置。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;附录：构建阶段网络问题&lt;/h2&gt;
&lt;h3&gt;问题现象&lt;/h3&gt;
&lt;p&gt;Registry 连接问题解决后，构建过程中 &lt;code&gt;apk add&lt;/code&gt; 失败：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;WARNING: fetching https://dl-cdn.alpinelinux.org/alpine/v3.23/main/x86_64/APKINDEX.tar.gz: Connection refused
ERROR: unable to select packages:
  ca-certificates (no such package)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;原因分析&lt;/h3&gt;
&lt;p&gt;Docker Desktop 的代理配置影响容器内部网络。即使宿主机能访问外网，容器内的请求仍被代理拦截。&lt;/p&gt;
&lt;h3&gt;解决方案&lt;/h3&gt;
&lt;h4&gt;方案一：关闭代理&lt;/h4&gt;
&lt;p&gt;Docker Desktop → Settings → Resources → Proxies → 关闭 Manual proxy configuration&lt;/p&gt;
&lt;h4&gt;方案二：优化 Dockerfile（推荐）&lt;/h4&gt;
&lt;p&gt;避免在构建时访问外网，利用基础镜像已有的资源：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;# 原始写法（需要网络）
RUN apk --no-cache add ca-certificates tzdata

# 优化写法（无需网络）
# 基础镜像已包含 ca-certificates，时区通过环境变量设置
ENV TZ=Asia/Shanghai
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果代码使用 &lt;code&gt;time.LoadLocation()&lt;/code&gt;，需要内嵌时区数据：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;import _ &amp;quot;time/tzdata&amp;quot;  // Go 1.15+ 内嵌时区数据
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;最终 Dockerfile&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-dockerfile&quot;&gt;FROM registry/golang:1.25-alpine AS builder
WORKDIR /app
ENV GOPROXY=https://goproxy.cn,direct
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -trimpath -ldflags=&amp;#39;-s -w&amp;#39; -o /api ./cmd/api

FROM registry/alpine:3.23.2
ENV TZ=Asia/Shanghai
WORKDIR /app
COPY --from=builder /api /app/api
COPY configs/config.prod.yaml /app/configs/config.yaml
EXPOSE 8080
ENTRYPOINT [&amp;quot;/app/api&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&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;apk 无法访问外网&lt;/td&gt;
&lt;td&gt;关闭代理 或 避免构建时下载&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;需要 ca-certificates&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;code&gt;ENV TZ=xxx&lt;/code&gt; 或 Go 内嵌 &lt;code&gt;time/tzdata&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
</content:encoded><category>服务器</category><category>故障排查</category><category>Docker</category><category>Harbor</category></item><item><title>Grafana-Feishu 镜像拉取故障排障记录</title><link>https://lter.space/posts/grafana-feishu-%E9%95%9C%E5%83%8F%E6%8B%89%E5%8F%96%E6%95%85%E9%9A%9C%E6%8E%92%E9%9A%9C%E8%AE%B0%E5%BD%95/</link><guid isPermaLink="true">https://lter.space/posts/grafana-feishu-%E9%95%9C%E5%83%8F%E6%8B%89%E5%8F%96%E6%95%85%E9%9A%9C%E6%8E%92%E9%9A%9C%E8%AE%B0%E5%BD%95/</guid><description>在 logging 命名空间部署 grafana feishu 时，Pod 一直无法正常启动。 最初使用的镜像为： yaml image: allanchain/grafana feishu:latest Pod 状态表现为： ErrI…</description><pubDate>Wed, 18 Mar 2026 04:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在 &lt;code&gt;logging&lt;/code&gt; 命名空间部署 &lt;code&gt;grafana-feishu&lt;/code&gt; 时，Pod 一直无法正常启动。&lt;/p&gt;
&lt;p&gt;最初使用的镜像为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;image: allanchain/grafana-feishu:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pod 状态表现为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ErrImagePull&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ImagePullBackOff&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通过 &lt;code&gt;kubectl describe pod&lt;/code&gt; 查看事件后，发现核心报错为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;节点从 Docker Hub 拉取 &lt;code&gt;allanchain/grafana-feishu:latest&lt;/code&gt; 超时&lt;/li&gt;
&lt;li&gt;报错类似：&lt;ul&gt;
&lt;li&gt;&lt;code&gt;failed to resolve reference&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Head &amp;quot;https://registry-1.docker.io/v2/...&amp;quot;: dial tcp ...:443: i/o timeout&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这说明问题不在 Deployment 语法，而在于 &lt;strong&gt;集群节点无法访问 Docker Hub&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;第一阶段：尝试本地打包镜像并传到节点&lt;/h2&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;p&gt;因为本地电脑可以成功 &lt;code&gt;docker pull allanchain/grafana-feishu:latest&lt;/code&gt;，所以最开始的思路是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在本地把镜像拉下来&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker save&lt;/code&gt; 成 tar 包&lt;/li&gt;
&lt;li&gt;把 tar 包传到 Kubernetes 节点&lt;/li&gt;
&lt;li&gt;在节点上执行 &lt;code&gt;docker load&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;遇到的问题&lt;/h3&gt;
&lt;p&gt;在服务器上执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker load -i /root/grafana-feishu.tar
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果提示：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Command &amp;#39;docker&amp;#39; not found
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明当前登录的机器 &lt;code&gt;prod-server-ci&lt;/code&gt; 并不是容器运行时节点，或者至少这台机器上没有 Docker CLI。&lt;/p&gt;
&lt;p&gt;进一步分析后确认：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pod 实际被调度到的节点是：&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cn-shanghai.10.71.45.249&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cn-shanghai.10.71.45.250&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;镜像拉取动作发生在这些节点上的 kubelet/container runtime&lt;/li&gt;
&lt;li&gt;因此，应该把镜像导入到 &lt;strong&gt;实际运行 Pod 的节点&lt;/strong&gt;，而不是随便一台运维机&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;再次遇到的问题&lt;/h3&gt;
&lt;p&gt;尝试用 &lt;code&gt;scp&lt;/code&gt; 把 tar 包传到节点，但传不过去。说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;节点可能不开放 SSH&lt;/li&gt;
&lt;li&gt;或者当前机器到节点网络不通&lt;/li&gt;
&lt;li&gt;或者该集群环境不适合走&amp;quot;手工 SSH 上节点导入镜像&amp;quot;这条路&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;于是放弃了手工上传节点镜像的方案。&lt;/p&gt;
&lt;h2&gt;第二阶段：改走阿里云 ACR 镜像仓库&lt;/h2&gt;
&lt;p&gt;既然集群节点无法访问 Docker Hub，那更合理的办法是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在本地把镜像推送到阿里云 ACR&lt;/li&gt;
&lt;li&gt;再让集群从 ACR 拉取镜像&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;初始误区&lt;/h3&gt;
&lt;p&gt;一开始把 ACR 仓库地址当成 SSH 主机来用，尝试：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;scp grafana-feishu.tar xxx@xxx-registry.cn-shanghai.cr.aliyuncs.com:/root/
ssh xxx@xxx-registry.cn-shanghai.cr.aliyuncs.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果报错：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;ssh: connect to host ... port 22: Network is unreachable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;后来明确了：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ACR 是镜像仓库，不是给 &lt;code&gt;ssh/scp&lt;/code&gt; 登录的机器。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;正确用法应该是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker login&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker tag&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker push&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第三阶段：推送镜像到 ACR&lt;/h2&gt;
&lt;h3&gt;登录仓库&lt;/h3&gt;
&lt;p&gt;本地执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker login --username=xxx http://xxx-registry.cn-shanghai.cr.aliyuncs.com/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;虽然中间有一条 Docker Desktop 凭据提示异常，但最终结果是：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Login Succeeded
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明登录态已经成功建立。&lt;/p&gt;
&lt;h3&gt;第一次推送失败&lt;/h3&gt;
&lt;p&gt;先尝试打 tag 并推送到：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;xxx-registry.cn-shanghai.cr.aliyuncs.com/logging/grafana-feishu:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker tag allanchain/grafana-feishu:latest xxx-registry.cn-shanghai.cr.aliyuncs.com/logging/grafana-feishu:latest
docker push xxx-registry.cn-shanghai.cr.aliyuncs.com/logging/grafana-feishu:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结果失败，报错：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;repository does not exist or may require authorization&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;insufficient_scope: authorization failed&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;说明这个仓库路径不对，或者当前账号对该 repo 没有权限。&lt;/p&gt;
&lt;h3&gt;第二次推送成功&lt;/h3&gt;
&lt;p&gt;改成：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker tag allanchain/grafana-feishu:latest xxx-registry.cn-shanghai.cr.aliyuncs.com/xxx/grafana-feishu:latest
docker push xxx-registry.cn-shanghai.cr.aliyuncs.com/xxx/grafana-feishu:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这次成功：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;latest: digest: sha256:...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至此确认，正确可用的仓库地址为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;xxx-registry.cn-shanghai.cr.aliyuncs.com/xxx/grafana-feishu:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第四阶段：Kubernetes 改用 ACR 地址，但仍然失败&lt;/h2&gt;
&lt;h3&gt;修改镜像地址&lt;/h3&gt;
&lt;p&gt;将 Deployment 中的镜像改为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;image: xxx-registry.cn-shanghai.cr.aliyuncs.com/xxx/grafana-feishu:latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后执行 rollout。&lt;/p&gt;
&lt;h3&gt;新问题：仍然拉不到镜像&lt;/h3&gt;
&lt;p&gt;Pod 事件显示：&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;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Head &amp;quot;https://xxx-registry.cn-shanghai.cr.aliyuncs.com/v2/.../manifests/latest&amp;quot;:
dial tcp 139.224.244.151:443: i/o timeout
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这说明：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;集群节点到 ACR 公网地址的 443 也不通。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;也就是说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker Hub 不通&lt;/li&gt;
&lt;li&gt;ACR 公网地址也不通&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但用户进一步确认后发现：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;集群节点能访问的是 ACR 内网 / VPC 地址，而不是公网地址&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;第五阶段：切换到 ACR VPC 内网地址&lt;/h2&gt;
&lt;p&gt;确认正确的内网仓库地址为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;xxx-registry-vpc.cn-shanghai.cr.aliyuncs.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因此，Deployment 中镜像地址应改成：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;image: xxx-registry-vpc.cn-shanghai.cr.aliyuncs.com/xxx/grafana-feishu:latest
imagePullPolicy: IfNotPresent
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第六阶段：切到 VPC 地址后，网络问题解决，但出现认证问题&lt;/h2&gt;
&lt;p&gt;这一步 Pod 事件发生了变化。不再是 &lt;code&gt;i/o timeout&lt;/code&gt;，而是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;FailedToRetrieveImagePullSecret&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pull access denied&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;insufficient_scope: authorization failed&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;典型报错为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Unable to retrieve some image pull secrets (acr-secret)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以及：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;pull access denied, repository does not exist or may require authorization:
server message: insufficient_scope: authorization failed
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这说明：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;网络已经通了&lt;/li&gt;
&lt;li&gt;现在真正的问题变成了：&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pod 想使用 &lt;code&gt;acr-secret&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;但 &lt;code&gt;logging&lt;/code&gt; 命名空间下根本没有这个 Secret&lt;/li&gt;
&lt;li&gt;所以 kubelet 拿不到认证信息去拉私有仓库&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;第七阶段：确认根因 —— &lt;code&gt;acr-secret&lt;/code&gt; 不存在&lt;/h2&gt;
&lt;p&gt;执行检查：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl -n logging get secret acr-secret
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Error from server (NotFound): secrets &amp;quot;acr-secret&amp;quot; not found
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至此彻底破案：&lt;/p&gt;
&lt;h3&gt;根因&lt;/h3&gt;
&lt;p&gt;Deployment 模板里已经引用了：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;imagePullSecrets:
- name: acr-secret
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但实际上 &lt;code&gt;logging&lt;/code&gt; 命名空间里并没有这个 Secret，导致：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;kubelet 无法获取镜像仓库认证信息&lt;/li&gt;
&lt;li&gt;拉取私有仓库镜像失败&lt;/li&gt;
&lt;li&gt;ACR 返回 &lt;code&gt;insufficient_scope&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第八阶段：创建正确的 imagePullSecret&lt;/h2&gt;
&lt;p&gt;正确做法是用 &lt;strong&gt;VPC 地址&lt;/strong&gt; 创建 docker-registry Secret：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl -n logging create secret docker-registry acr-secret \
  --docker-server=xxx-registry-vpc.cn-shanghai.cr.aliyuncs.com \
  --docker-username=xxx \
  --docker-password=&amp;#39;ACR密码&amp;#39; \
  --docker-email=&amp;#39;none@example.com&amp;#39;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关键点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--docker-server&lt;/code&gt; 必须与 Deployment 中实际使用的镜像域名一致&lt;/li&gt;
&lt;li&gt;也就是必须写成：&lt;code&gt;xxx-registry-vpc.cn-shanghai.cr.aliyuncs.com&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;不能再写公网地址&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;第九阶段：最终修复成功&lt;/h2&gt;
&lt;p&gt;在 Secret 创建完成后，执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kubectl -n logging rollout restart deployment/grafana-feishu
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这次成功。&lt;/p&gt;
&lt;p&gt;说明此时整条链路已经打通：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;镜像已成功推送到阿里云 ACR&lt;/li&gt;
&lt;li&gt;Deployment 已改为使用 ACR VPC 内网镜像地址&lt;/li&gt;
&lt;li&gt;集群节点可以访问该 VPC 地址&lt;/li&gt;
&lt;li&gt;&lt;code&gt;acr-secret&lt;/code&gt; 已存在，且可供 kubelet 获取&lt;/li&gt;
&lt;li&gt;私有仓库拉取认证成功&lt;/li&gt;
&lt;li&gt;&lt;code&gt;grafana-feishu&lt;/code&gt; Deployment 成功完成滚动重启&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;总结&lt;/h2&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;1&lt;/td&gt;
&lt;td&gt;Docker Hub 超时&lt;/td&gt;
&lt;td&gt;改用国内镜像仓库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2-3&lt;/td&gt;
&lt;td&gt;不了解 ACR 用法&lt;/td&gt;
&lt;td&gt;使用 docker login/tag/push&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;ACR 公网不通&lt;/td&gt;
&lt;td&gt;切换到 VPC 内网地址&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5-8&lt;/td&gt;
&lt;td&gt;imagePullSecret 缺失&lt;/td&gt;
&lt;td&gt;创建正确的 docker-registry Secret&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;核心教训：&lt;strong&gt;排查镜像拉取问题时，要分清是网络问题还是认证问题，逐层排查。&lt;/strong&gt;&lt;/p&gt;
</content:encoded><category>服务器</category><category>故障排查</category><category>Docker</category><category>Kubernetes</category><category>阿里云</category></item><item><title>FASTAPI新项目指北</title><link>https://lter.space/posts/FASTAPI%E6%96%B0%E9%A1%B9%E7%9B%AE%E6%8C%87%E5%8C%97/</link><guid isPermaLink="true">https://lter.space/posts/FASTAPI%E6%96%B0%E9%A1%B9%E7%9B%AE%E6%8C%87%E5%8C%97/</guid><description>1. 每个临时方案都是未来重构的债务，要做就一开始就做到完美 2. precommit，配置black isort 3. 撰写单测和集成测试，每次commit自动进行，单测真的很有用 4. 善用linter 5. database索引添…</description><pubDate>Mon, 09 Mar 2026 09:55:16 GMT</pubDate><content:encoded>&lt;ol&gt;
&lt;li&gt;每个临时方案都是未来重构的债务，要做就一开始就做到完美&lt;/li&gt;
&lt;li&gt;precommit，配置black isort&lt;/li&gt;
&lt;li&gt;撰写单测和集成测试，每次commit自动进行，单测真的很有用&lt;/li&gt;
&lt;li&gt;善用linter&lt;/li&gt;
&lt;li&gt;database索引添加监控，使用alembic控制历史版本&lt;/li&gt;
&lt;li&gt;ID以后都用BIGINT，在basemodel里就修改成bigint&lt;/li&gt;
&lt;li&gt;新建完毕项目之后一定要把model补全，model是一切的基础&lt;/li&gt;
&lt;li&gt;本地开发和测试的数据库的名字一定要一样&lt;/li&gt;
&lt;li&gt;蛇形命名&lt;/li&gt;
&lt;li&gt;created_at带时间的全局用同一种格式，最好写全局时间中间件&lt;/li&gt;
&lt;li&gt;不要用已弃用的utcnow和onevent&lt;/li&gt;
&lt;li&gt;page_num和page_size要一开始就有全局组件&lt;/li&gt;
&lt;li&gt;有什么看不顺眼的立马就改了&lt;/li&gt;
&lt;li&gt;给前端的错误提示要是中文&lt;/li&gt;
&lt;li&gt;api路径里不允许出现-和复数和_，都用单数&lt;/li&gt;
&lt;li&gt;接口的响应要走统一的控制器&lt;/li&gt;
&lt;li&gt;code message data包装响应&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>FASTAPI工程自检</title><link>https://lter.space/posts/FASTAPI%E5%B7%A5%E7%A8%8B%E8%87%AA%E6%A3%80/</link><guid isPermaLink="true">https://lter.space/posts/FASTAPI%E5%B7%A5%E7%A8%8B%E8%87%AA%E6%A3%80/</guid><description>1. 关键路径是否明确 ：请求链路里最慢的 1–3 个步骤分别是什么（DB/网络/模型/磁盘）？有指标或日志能证明吗？ 2. 超时与重试是否完整 ：所有外部依赖（DB/HTTP/OSS/消息队列）是否设置了超时、重试策略与退避（并有上限…</description><pubDate>Tue, 23 Dec 2025 16:49:57 GMT</pubDate><content:encoded>&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;关键路径是否明确&lt;/strong&gt;：请求链路里最慢的 1–3 个步骤分别是什么（DB/网络/模型/磁盘）？有指标或日志能证明吗？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;超时与重试是否完整&lt;/strong&gt;：所有外部依赖（DB/HTTP/OSS/消息队列）是否设置了超时、重试策略与退避（并有上限）？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资源池是否正确配置&lt;/strong&gt;：数据库连接池 / HTTP 连接池 / 线程池是否启用？池大小、队列长度、回收策略是否与并发量匹配？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据库连接方式是否一致&lt;/strong&gt;：是否统一通过配置（DSN/环境变量）管理连接参数？是否区分读写、是否有连接健康检查与断线重连策略？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;负载类型是否判断正确&lt;/strong&gt;：当前服务主要是 IO 密集还是 CPU 密集？对应采用 async / 线程池 / 多进程 / 任务队列的组合是否合理？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;并发模型是否清晰&lt;/strong&gt;：进程数、线程数、协程数、worker 数分别是多少？谁负责 CPU、谁负责 IO？是否存在“重复并发”（多层叠加导致过载）？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;队列/Worker Pool 是否可控&lt;/strong&gt;：是否有最大并发、最大排队、任务超时、任务取消/幂等、失败重试与死信/告警机制？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据库查询是否可规模化&lt;/strong&gt;：是否存在 N+1、无索引全表扫、分页深翻、排序无索引等问题？关键 SQL 是否可 explain 并持续监控？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;写入一致性与幂等&lt;/strong&gt;：创建/更新接口是否有幂等键或唯一约束？重复请求是否会写出脏数据/重复数据？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文件/对象存储写入是否安全&lt;/strong&gt;：OSS 路径是否全局唯一（避免同名覆盖）？是否采用“临时对象 + 原子重命名/版本化”或“内容哈希命名”？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据校验与安全边界&lt;/strong&gt;：入参是否做了 schema 校验、大小限制、类型限制？上传是否限制格式/体积/数量并防止 zip bomb 等风险？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密码与密钥是否合规&lt;/strong&gt;：密码是否使用强哈希（bcrypt/argon2），并有合适 cost；密钥是否只从安全配置读取且不落日志？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时间处理是否一致&lt;/strong&gt;：时间统一用 UTC 还是 epoch；是否避免使用已弃用/易混淆的 API（如某些 &lt;code&gt;utcnow&lt;/code&gt; 用法）并确保时区语义明确？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;API 生命周期是否健康&lt;/strong&gt;：是否避免使用已弃用的框架钩子/接口（例如 FastAPI 的老式事件钩子），并跟随框架推荐方式实现启动/关闭？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误处理是否可运营&lt;/strong&gt;：异常是否分级（4xx/5xx）、是否有可追踪的错误码、是否避免吞错；关键失败是否告警？&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日志/追踪/指标是否闭环&lt;/strong&gt;：是否有 request_id/trace_id；是否有 QPS、延迟分位数、错误率、DB/队列/worker 指标；能否快速定位瓶颈？&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;/ol&gt;
</content:encoded></item><item><title>HACore-WSL安装流程</title><link>https://lter.space/posts/HACore-WSL%E5%AE%89%E8%A3%85%E6%B5%81%E7%A8%8B/</link><guid isPermaLink="true">https://lter.space/posts/HACore-WSL%E5%AE%89%E8%A3%85%E6%B5%81%E7%A8%8B/</guid><description>bash 安装python3.13 sudo add apt repository ppa:deadsnakes/ppa sudo apt get update sudo apt get install python3.13 pytho…</description><pubDate>Mon, 22 Dec 2025 11:03:46 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 安装python3.13

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.13 python3.13-venv python3.13-dev build-essential

# 验证版本
python3.13 -m ensurepip --version
python -V
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;官方文档流程：&lt;a href=&quot;https://ha-doc.hasscn.top/installation/windows/#%E5%AE%89%E8%A3%85-home-assistant-core&quot;&gt;Windows - Home Assistant 中文站 - 老王杂谈说&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 系统级依赖
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y python3 python3-dev python3-venv python3-pip bluez libffi-dev libssl-dev libjpeg-dev zlib1g-dev autoconf build-essential libopenjp2-7 libtiff6 libturbojpeg0-dev tzdata ffmpeg liblapack3 liblapack-dev libatlas-base-dev unzip
# 新建一个系统用户(-r),并给它新建家目录(-m),用这个用户执行
# 这个用户没有密码
sudo useradd -rm homeassistant
# 创建安装路径
sudo mkdir /srv/homeassistant
# 把所有者改为homeassistant用户
sudo chown homeassistant:homeassistant /srv/homeassistant
# 切换到homeassistant用户
sudo -u homeassistant -H -s
cd /srv/homeassistant
python3 -m venv .
source bin/activate

python3 -m pip install wheel PySocks

pip3 install homeassistant==2025.3.4
#

# 启动之前注意配置好代理，启动时自动去外网https://pypi.org/simple/home-assistant-frontend/拉取前端
hass
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;
cd /srv/homeassistant
nano s.sh
chmod +x s.sh
./s.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/usr/bin/env bash
set -euo pipefail

# ============ 可改参数 ============
HA_USER=&amp;quot;homeassistant&amp;quot;
VENV_DIR=&amp;quot;/srv/homeassistant&amp;quot;
CONFIG_DIR=&amp;quot;/home/${HA_USER}/.homeassistant&amp;quot;

HA_USERNAME=&amp;quot;${HA_USERNAME:-lingyu}&amp;quot;
HA_PASSWORD=&amp;quot;${HA_PASSWORD:-@Lingyu@}&amp;quot;

TZ=&amp;quot;${TZ:-Asia/Shanghai}&amp;quot;
COUNTRY=&amp;quot;${COUNTRY:-CN}&amp;quot;
LANGUAGE=&amp;quot;${LANGUAGE:-zh-Hans}&amp;quot;
NAME=&amp;quot;${NAME:-Home}&amp;quot;
UNIT_SYSTEM=&amp;quot;${UNIT_SYSTEM:-metric}&amp;quot;
CURRENCY=&amp;quot;${CURRENCY:-CNY}&amp;quot;

# 是否安装 Xiaomi Miot Auto 插件：1=安装，0=跳过
INSTALL_XIAOMI_MIOT_AUTO=&amp;quot;${INSTALL_XIAOMI_MIOT_AUTO:-1}&amp;quot;
# =================================

PY=&amp;quot;${VENV_DIR}/bin/python&amp;quot;

echo &amp;quot;=== HA Core (WSL) Bootstrap ===&amp;quot;
echo &amp;quot;HA_USER     = ${HA_USER}&amp;quot;
echo &amp;quot;VENV_DIR    = ${VENV_DIR}&amp;quot;
echo &amp;quot;CONFIG_DIR  = ${CONFIG_DIR}&amp;quot;
echo &amp;quot;LOGIN USER  = ${HA_USERNAME}&amp;quot;

# 0) 基础检查
[ -x &amp;quot;${PY}&amp;quot; ] || { echo &amp;quot;ERROR: 找不到 venv python: ${PY}&amp;quot;; exit 1; }

# 0.1) 确保 wget / curl 可用（插件安装需要）
if [ &amp;quot;${INSTALL_XIAOMI_MIOT_AUTO}&amp;quot; = &amp;quot;1&amp;quot; ]; then
  if ! command -v wget &amp;gt;/dev/null 2&amp;gt;&amp;amp;1 &amp;amp;&amp;amp; ! command -v curl &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
    echo &amp;quot;=== Install wget (required for plugin install) ===&amp;quot;
    sudo apt-get update
    sudo apt-get install -y wget
  fi
fi

# 1) 停止 hass（避免写入被覆盖；并且方便“重启生效”）
echo &amp;quot;=== [1/6] Stop running Home Assistant (best effort) ===&amp;quot;
set +e
pkill -f &amp;quot;homeassistant.*--config&amp;quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1
pkill -f &amp;quot;hass&amp;quot; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1
sleep 1
set -e

# 2) 创建配置目录结构
echo &amp;quot;=== [2/6] Ensure config dirs ===&amp;quot;
sudo -u &amp;quot;${HA_USER}&amp;quot; mkdir -p &amp;quot;${CONFIG_DIR}/.storage&amp;quot;

# 3) 写 configuration.yaml
echo &amp;quot;=== [3/6] Write configuration.yaml ===&amp;quot;
sudo -u &amp;quot;${HA_USER}&amp;quot; bash -c &amp;quot;cat &amp;gt; &amp;#39;${CONFIG_DIR}/configuration.yaml&amp;#39; &amp;lt;&amp;lt;EOF
homeassistant:
  name: ${NAME}
  time_zone: ${TZ}
  country: ${COUNTRY}
  language: ${LANGUAGE}
  unit_system: ${UNIT_SYSTEM}
  currency: ${CURRENCY}
EOF&amp;quot;

# 4) 写 onboarding（无扩展名）
echo &amp;quot;=== [4/6] Mark onboarding done ===&amp;quot;
sudo -u &amp;quot;${HA_USER}&amp;quot; bash -c &amp;quot;cat &amp;gt; &amp;#39;${CONFIG_DIR}/.storage/onboarding&amp;#39; &amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
{
  \&amp;quot;version\&amp;quot;: 4,
  \&amp;quot;minor_version\&amp;quot;: 1,
  \&amp;quot;key\&amp;quot;: \&amp;quot;onboarding\&amp;quot;,
  \&amp;quot;data\&amp;quot;: {
    \&amp;quot;done\&amp;quot;: [
      \&amp;quot;user\&amp;quot;,
      \&amp;quot;core_config\&amp;quot;,
      \&amp;quot;integration\&amp;quot;,
      \&amp;quot;analytics\&amp;quot;
    ]
  }
}
EOF&amp;quot;

# 5) 启动前创建账号（最关键）
echo &amp;quot;=== [5/6] Create admin user pre-start ===&amp;quot;
set +e
sudo -u &amp;quot;${HA_USER}&amp;quot; -H &amp;quot;${PY}&amp;quot; -m homeassistant --script auth --config &amp;quot;${CONFIG_DIR}&amp;quot; add &amp;quot;${HA_USERNAME}&amp;quot; &amp;quot;${HA_PASSWORD}&amp;quot;
RC=$?
set -e
if [ &amp;quot;${RC}&amp;quot; -ne 0 ]; then
  echo &amp;quot;WARN: auth add 返回非 0（常见：用户已存在 / 已有 owner）。继续。&amp;quot;
else
  echo &amp;quot;OK: 用户创建成功。&amp;quot;
fi

# 6) 安装 Xiaomi Miot Auto 插件（等价于 docker exec 那条命令）
if [ &amp;quot;${INSTALL_XIAOMI_MIOT_AUTO}&amp;quot; = &amp;quot;1&amp;quot; ]; then
  echo &amp;quot;=== [6/6] Install Xiaomi Miot Auto custom_component ===&amp;quot;
  # 推荐：在 config 目录执行，并明确 DOMAIN
  # get.hacs.vip 脚本通常会把组件安装到 ./custom_components 下
  sudo -u &amp;quot;${HA_USER}&amp;quot; -H bash -lc &amp;quot;
    set -e
    cd &amp;#39;${CONFIG_DIR}&amp;#39;
    mkdir -p custom_components
    if command -v wget &amp;gt;/dev/null 2&amp;gt;&amp;amp;1; then
      wget -O - https://get.hacs.vip | DOMAIN=xiaomi_miot bash -
    else
      curl -fsSL https://get.hacs.vip | DOMAIN=xiaomi_miot bash -
    fi
  &amp;quot; || {
    echo &amp;quot;WARN: 小米插件安装失败。你可以稍后手动重试（通常是网络/SSL/代理问题）。&amp;quot;
  }
fi

echo &amp;quot;&amp;quot;
echo &amp;quot;=== DONE ===&amp;quot;
echo &amp;quot;现在请启动/重启 Home Assistant Core，使 onboarding 与插件生效：&amp;quot;
echo &amp;quot;  sudo -u ${HA_USER} -H bash -lc &amp;#39;cd ${VENV_DIR} &amp;amp;&amp;amp; source bin/activate &amp;amp;&amp;amp; hass --config ${CONFIG_DIR}&amp;#39;&amp;quot;
echo &amp;quot;访问： http://localhost:8123&amp;quot;
echo &amp;quot;账号：${HA_USERNAME}&amp;quot;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>《沧浪之水》实体书阅读笔记</title><link>https://lter.space/posts/canglangzhishui2/</link><guid isPermaLink="true">https://lter.space/posts/canglangzhishui2/</guid><description>注，书上铅笔画线似乎是十年前的某位学长所为。 我的评价是不道德，但标画的地方确实还行。 ps，在图书馆看纸质版，条件不适合看纸质的时候用微信读书看，所有的电子笔记来自微信读书摘录或想法，所有的图片来自图书馆纸质书。</description><pubDate>Tue, 19 Mar 2024 14:57:12 GMT</pubDate><content:encoded>&lt;p&gt;注，书上铅笔画线似乎是十年前的某位学长所为。&lt;/p&gt;
&lt;p&gt;我的评价是不道德，但标画的地方确实还行。&lt;/p&gt;
&lt;p&gt;ps，在图书馆看纸质版，条件不适合看纸质的时候用微信读书看，所有的电子笔记来自微信读书摘录或想法，所有的图片来自图书馆纸质书。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_202350.jpg&quot; alt=&quot;IMG_20240315_202350&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_205738.jpg&quot; alt=&quot;IMG_20240315_205738&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240317_105809.jpg&quot; alt=&quot;IMG_20240317_105809&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_210903.jpg&quot; alt=&quot;IMG_20240315_210903&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_211446.jpg&quot; alt=&quot;IMG_20240315_211446&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_212830.jpg&quot; alt=&quot;IMG_20240315_212830&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_212948.jpg&quot; alt=&quot;IMG_20240315_212948&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_213015.jpg&quot; alt=&quot;IMG_20240315_213015&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_213041.jpg&quot; alt=&quot;IMG_20240315_213041&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_215415.jpg&quot; alt=&quot;IMG_20240315_215415&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_215639.jpg&quot; alt=&quot;IMG_20240315_215639&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_215845.jpg&quot; alt=&quot;IMG_20240315_215845&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_220224.jpg&quot; alt=&quot;IMG_20240315_220224&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_230036.jpg&quot; alt=&quot;IMG_20240315_230036&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_230040.jpg&quot; alt=&quot;IMG_20240315_230040&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_230336.jpg&quot; alt=&quot;IMG_20240315_230336&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_230723.jpg&quot; alt=&quot;IMG_20240315_230723&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_231132.jpg&quot; alt=&quot;IMG_20240315_231132&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_231416.jpg&quot; alt=&quot;IMG_20240315_231416&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_231513.jpg&quot; alt=&quot;IMG_20240315_231513&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_231754.jpg&quot; alt=&quot;IMG_20240315_231754&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_231910.jpg&quot; alt=&quot;IMG_20240315_231910&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_231930.jpg&quot; alt=&quot;IMG_20240315_231930&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_232042.jpg&quot; alt=&quot;IMG_20240315_232042&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_232221.jpg&quot; alt=&quot;IMG_20240315_232221&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_232351.jpg&quot; alt=&quot;IMG_20240315_232351&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_233419.jpg&quot; alt=&quot;IMG_20240315_233419&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_233530.jpg&quot; alt=&quot;IMG_20240315_233530&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_233622.jpg&quot; alt=&quot;IMG_20240315_233622&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_234325.jpg&quot; alt=&quot;IMG_20240315_234325&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_234524.jpg&quot; alt=&quot;IMG_20240315_234524&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_234529.jpg&quot; alt=&quot;IMG_20240315_234529&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_234812.jpg&quot; alt=&quot;IMG_20240315_234812&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_235150.jpg&quot; alt=&quot;IMG_20240315_235150&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_235658.jpg&quot; alt=&quot;IMG_20240315_235658&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240315_235714.jpg&quot; alt=&quot;IMG_20240315_235714&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_172027.jpg&quot; alt=&quot;IMG_20240316_172027&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_172123.jpg&quot; alt=&quot;IMG_20240316_172123&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_172458.jpg&quot; alt=&quot;IMG_20240316_172458&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_174712.jpg&quot; alt=&quot;IMG_20240316_174712&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_175103.jpg&quot; alt=&quot;IMG_20240316_175103&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_180226.jpg&quot; alt=&quot;IMG_20240316_180226&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_181823.jpg&quot; alt=&quot;IMG_20240316_181823&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_185546.jpg&quot; alt=&quot;IMG_20240316_185546&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_200830.jpg&quot; alt=&quot;IMG_20240316_200830&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_202121.jpg&quot; alt=&quot;IMG_20240316_202121&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_202224.jpg&quot; alt=&quot;IMG_20240316_202224&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_202505.jpg&quot; alt=&quot;IMG_20240316_202505&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_204919.jpg&quot; alt=&quot;IMG_20240316_204919&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_205238.jpg&quot; alt=&quot;IMG_20240316_205238&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_205806.jpg&quot; alt=&quot;IMG_20240316_205806&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_210352.jpg&quot; alt=&quot;IMG_20240316_210352&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240316_221000.jpg&quot; alt=&quot;IMG_20240316_221000&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240317_093413.jpg&quot; alt=&quot;IMG_20240317_093413&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/mmexport1710581109224.jpg&quot; alt=&quot;mmexport1710581109224&quot;&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240317_105643.jpg&quot; alt=&quot;IMG_20240317_105643&quot;&gt;&lt;/p&gt;
</content:encoded><category>阅读</category></item><item><title>《沧浪之水》微信读书阅读笔记</title><link>https://lter.space/posts/canglangzhishui/</link><guid isPermaLink="true">https://lter.space/posts/canglangzhishui/</guid><description>《沧浪之水》 微信读书阅读笔记 ps，在图书馆看纸质版，条件不适合看纸质的时候用微信读书看，所有的电子笔记来自微信读书摘录或想法，所有的图片来自图书馆纸质书。 第二十三章 第21章 2024/03/16 发表想法 先敬罗衣后敬人。在没有…</description><pubDate>Tue, 19 Mar 2024 14:48:47 GMT</pubDate><content:encoded>&lt;h3&gt;**《沧浪之水》**微信读书阅读笔记&lt;/h3&gt;
&lt;p&gt;ps，在图书馆看纸质版，条件不适合看纸质的时候用微信读书看，所有的电子笔记来自微信读书摘录或想法，所有的图片来自图书馆纸质书。&lt;/p&gt;
&lt;h3&gt;&lt;strong&gt;第二十三章 第21章&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;2024/03/16 发表想法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;先敬罗衣后敬人。在没有深入了解一个人之前，通过一个人的衣着打扮，外在装饰来初步了解一个人是相对更有效率的。即使有些人会利用这条规律刻意营造一种外部形象，像电视广告里面卖牙膏的穿白大褂一样，给人营造一种更强的影响力，虽然给人一种欺骗的意味，但是规律就是规律，不以人的意志为转移。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;原文：”她说：“你们坐办公室的人，其实装束是很重要的，穿得太随便了不好，人家看你的分量第一眼就看着装的档次，现在是什么社会？”董卉走了，我看了那套衣服的标签，竟要两百多块。我说：“我还以为三十多块呢，任志强那小子真的发邪财了，总有一天要给逮进去的，你要董卉多个心眼。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;我从窗口往下看，只见岳母坐在台阶上，黑黑的一个身影。我到快天亮才合了一会儿眼，起来了简直不敢望岳母一眼。岳母倒是若无其事，吩咐我去冲牛奶，洗尿布。我体会到了她的意思，她想给我一个安心，没想到一个农村妇女还这么心细。往深里一想我越发感到羞愧。她是明白人，明白人什么都明白。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;她一天到晚把生活质量四个字挂在嘴边，不知道她从哪里学会这一套，忽然变成了一个享乐主义者。说了她几次还辩她不赢，再一想人不活生活质量又活什么？那么大家一起讲质量吧，可我们的钱到手就光，好像有鬼在后面追着你。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;“改变世界？那是青年哥哥不知自己几斤几两，以为世界是可以改变特别是由他自己来改变的，用虚伪的悲壮自欺欺人，真不知自己何许人也。以为世界可以按自己的设计而改变的人都是可怕的人物，狂妄分子！”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第二十四章 第22章&lt;/strong&gt;&lt;/h3&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;h3&gt;&lt;strong&gt;第二十五章 第23章&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;幸亏还有象棋，有晏之鹤，这也成为了我生活中的一个重要内容。渐渐地我就有了一种恐慌，时间过去了，生命在流逝，可我仍呆在原地，没有什么东西可以证明我随着时间一起前行。我每天吃了，喝了，睡了，总之，活下来了，可这活下来也就是活下来而已，没有获得超出活下来的意义。我一旦问自己一辈子就这样下去吗？就心里发疼，不敢再往深里想。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第二十六章 第24章&lt;/strong&gt;&lt;/h3&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;h3&gt;&lt;strong&gt;第二十八章 第26章&lt;/strong&gt;&lt;/h3&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;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第三十章 第28章&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;这世界真是个偏见的世界，大家都这么喜欢自己的儿子，这个世界恐怕没有多少希望了。”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;2024/03/16 发表想法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;越跟领导走的近，领导越不给面子，但是最后升迁加薪都有你的份。马厅长骂过丁小槐，但是对大为肯定是客客气气的。 把他当自己人，才会对他露出真实想法和真实情绪。如果和和气气彬彬有礼是很绅士，但也是在保持距离。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;原文：不久前我还看见他帮丁小槐搬家，隔几天又看见丁小槐有板有眼地教训他什么，他低了头听着。当时我还想，丁小槐怎么了，人家帮你搬过家，怎么也算个朋友吧，你还对人家来这一套！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;人是活的，没有活人做不到的事，原则只罩住我们这些人。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第三十一章 第29章&lt;/strong&gt;&lt;/h3&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;li&gt;一个人吧，只要他不把自尊看得那么重，放得下脸来，机会还是很多的。我一个小人物，把人格自尊吊那么高，那合适吗？太奢侈了，实在是太奢侈了。&lt;/li&gt;
&lt;li&gt;我也不是个吃素的人，只是战胜不了自己。报纸上天天在说战胜自我，战胜自我，今天才明白了一点奥妙。一个人最大的敌人是他自己，&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第三十二章 第30章&lt;/strong&gt;&lt;/h3&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;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第三十三章 第31章&lt;/strong&gt;&lt;/h3&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;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;h3&gt;&lt;strong&gt;第三十四章 第32章&lt;/strong&gt;&lt;/h3&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;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;h3&gt;&lt;strong&gt;第三十五章 第33章&lt;/strong&gt;&lt;/h3&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;li&gt;我觉得那些关于道德和良知的原则的确是可以怀疑的，市场也好，官场也好，那里奉行的是另外一套法则，操作主义的法则，每一次操作都是为了让别人出局而自己入局。这个世界真是令人沮丧又无奈。&lt;/li&gt;
&lt;li&gt;老是想不通吧，人生这出戏也许还唱得下去，只是下面的戏就没有什么精彩情节了，也没有高潮了。”&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第三十六章 第34章&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;强盗也不失为一种做人的方式，老棍老刀是强盗，匡开平是不是？还有任志强呢？丁小槐呢？连胡一兵，那个曾经一起去搞农村调查的人，也要去做强盗了。他们都活出了滋味，我却这么窝囊。&lt;/li&gt;
&lt;li&gt;而且，市场只承认眼前，而绝不承认时间后面有什么神秘的东西。市场是正确的，可这种正确瓦解了太多的人生想象。当一切都在消费欲望的平面上展开，人们就再也不能去想象什么天下千秋。何况，那些牺牲的理由，那些神圣的光环，都随着时间的推移显露出凡俗的甚至颓败的真相。我心有不甘，不甘，但别无选择&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第三十七章 第35章&lt;/strong&gt;&lt;/h3&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;h3&gt;&lt;strong&gt;第三十八章 第36章&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;不论这个人是什么样子，他入了围以后都只能是被预设的样子。他只能在既定的舞台上按既定的程式表演&lt;/li&gt;
&lt;li&gt;他不能对抗，因为他对抗的并不是哪一个人。不论是谁，都必须按照预设的程序进入既定的轨道，神秘的力量从来就不怕谁聪明谁倔犟，孙悟空还不聪明不倔犟吗？他跳出如来佛的手心没有？于是每个人都依据着适生的原则，服从了这样一种预设，谁也别吹自己是什么特殊人物，除非他真的活够了。&lt;/li&gt;
&lt;li&gt;苏主任说：“这样的人不少，省里要考虑实际情况，多拨点钱才好。”我说：“多拨多少也没有多少落到他们身上。”他说：“那倒也是，总有这样那样非用钱不可的事。你回去跟厅里反映一下，你都看到了。”我说：“有人喝茅台我也看到了。”苏主任叹口气，把头垂下去摇一摇。&lt;/li&gt;
&lt;li&gt;我所能做的，就是这么一点点。这是我对世界的所有意义，也是我的角色被预设好了之后，上帝留给我的全部的选择空间。这就是我。我认识到了自己的渺小和无能为力，我感到了恐惧。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第三十九章 第37章&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;发病率比上一次统计还是有所提高，原因是连续几年涨大水。下一步的目标是在三年内把发病率降到百分之三点二以下，我知道三年以后的调查数据这也就出来了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;2024/03/16 发表想法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;刀在手，想切菜就切菜，想杀人就杀人&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;原文：这使我更深地体会到了人性的盲点，那些好听的话能够如此有效地瓦解一个人的判断力。以后有什么好听的话尽管放胆说出来，首先自己要有心理承受能力，千万不要怕肉麻，也不必担心被奉承者会承受不了。要办成什么事，就要最大限度地利用人性的弱点。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;这使我更深地体会到了人性的盲点，那些好听的话能够如此有效地瓦解一个人的判断力。以后有什么好听的话尽管放胆说出来，首先自己要有心理承受能力，千万不要怕肉麻，也不必担心被奉承者会承受不了。要办成什么事，就要最大限度地利用人性的弱点。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;报告报上去了，我心里想着那些无助的病人，很久都安定不下来。当年父亲和我挣扎在那个偏远的山村，也处于这样一种无助的状态。公正会在时间的路口等待那些无助的人吗？我不能骗自己。我沉默着，我只能沉默，可沉默就是参与，我参与了。好多次我在突然之间有一股热血涌上头顶，吼一声吧，吼一声吧，我有吼一声的责任。这么吼一声的机会，人生能有几次？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;大家又感叹生活中有两种逻辑，良知的逻辑和生存的逻辑，按理说这两种逻辑应该一致，尽良知的责任就是拓展了自己的生存空间，&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;几千年都没讲清，轮到你就能讲清？讲得清屈原也不跳江，岳飞也不被杀，刘少奇也不死得不明不白，还有你自己的父亲，怎么样？你跳出来那不是鸡蛋碰石头，简直就是鸡蛋碰地球。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;这么一说，刘跃进就说到一九五九年庐山会议本来是反右的，彭德怀上了万言书，突然转向反左，结果是三年苦日子，人都饿死了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;听了这话我骇然心动，又觉得这也是放弃的一条理由。人作出牺牲，需要充分的理由，如果什么也改变不了，牺牲就没有意义了。我说：“这件事我心里实在放不下来，可也只有放下来，我的脚下没有路。”刘跃进说：“路就在你的脚下，你没有勇气走。你明知路在哪里，又装着没看见。”我说：“我敢走吗？我是有老婆孩子的人。”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第五十六章 第54章&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;让一千一万个人不高兴那不要紧，他们不高兴又如何？也只好不高兴罢了，可千万不能让领导有一点不高兴啊，他不高兴，我的一切在一瞬间都完了。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第五十七章 第55章&lt;/strong&gt;&lt;/h3&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;li&gt;别以为是好东西就可以直通通地送上去，要送还得讲技巧，让他接受得舒适。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第五十八章 第56章&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;毛主席说伤其十指不如断其一指，这是战略问题。”董柳说：“大为你就在马厅长这里拜个师，请他带一带你。”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;我说：“我去年先走一步了，马厅长为我想得远。”沈姨说：“老马把你的事当自己的事呢。”我说：“我心里都明白，人非草木怎么会无知无觉？”董柳说：“他天天在家里念马厅长的好处，到这里反而不说了，他就是这个脾气。”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;编辑部高主任说最快也要半年才能出来。我说：“半年就赶不上了。”马厅长说：“他给我们出题目呢。”就叫财务室寄了两万块钱作为加班费，那边答应两个月之内赶出来。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;董柳说：“你们用起钱来，我听一听都能摔个跟头。我们打一针一块钱两块钱，打一辈子也不够你们开三天会啊。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;我真的为那些护士打抱不平，她们是怎么赚钱的？血汗钱，针挑土！别人是怎么用钱的？浪推沙！赚钱的方式跟用钱的方式差别太大太大了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;我说：“要承认你们勤勤恳恳还是为革命做了贡献的，奉献精神还是值得肯定和提倡的，在平凡的岗位上还是做出了不平凡的成绩的，这成绩组织上还是心中有数的。”董柳冷笑说：“几顶大草帽往我们这些人头上一扣，勤恳啊，奉献啊！人家得到的可是实际的东西。”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;金子才多少钱一克？那些钱都买了金子做帽子，谁的头顶得起？你还是农民伯伯的想法，想着皇帝挖土，恐怕是用一把金锄头吧。”董柳的话也唤醒了我的平民意识，一个人掌握了资源，他总该想想手中的东西怎么来的，一针一针打出来的啊！世界是很荒谬的，也许还要一年年荒谬下去。可难道荒谬能够因为它存在就成为合理的了吗？&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;我越发看清了世界上有两种人，一种人要什么有什么，他每一根毫毛都得到无微不至的关爱，另一种人要什么没什么，他的手啊脚啊都没处搁。世界其实是设计者为自己设计的，不服气你拿着石头打天去吧。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;2024/03/16 发表想法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;奖励要迅速，惩罚要缓慢。时机很重要&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;原文：我很感激马厅长的细心，安排我去疗养对他来说虽然只是一句话，可要把这句话讲到你身上来，这容易吗？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第五十九章 第57章&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;我这时彻底明白了，自己一旦走出这一步，就有了一种新的本能，也就绝没有后退的可能，什么叫开弓没有回头箭&lt;/li&gt;
&lt;li&gt;我并不特别在乎那些好处，好处很重要，但更重要的，是自己很重要的那种感觉，那种有意义地存在的感觉。我放下了世界，进入了操作，本来只是想得到一些好处，却意外地找到了那种有意义的感觉。&lt;/li&gt;
&lt;li&gt;上帝为人设计了无聊的感觉，又设计了逃避的方式，这就是权和钱。人生最大的使命就是选定一个目标并把它视为神圣，以此来逃避空虚，逃避无聊，逃避意义的真空，而意义的真空正是人生最大的悲剧。&lt;/li&gt;
&lt;li&gt;我平时在心里骂权和钱是两个俗物，这时才感到了两个俗物的妙处，它们可以成为无限的目标，这是其他东西无法取代的。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第六十章 第58章&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;2024/03/16 发表想法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;吃饭和借书，都是极其暧昧的两件事，一借一还，一请一去，情份就这么结下了。 -﹣钱锺书《围城》&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;原文：她说：“真的明天就走？”走到桌边，把小说放在桌上，“书还给你。”似乎是不经意地把窗帘拉上了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;漂亮，美，有想象的余地。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第六十一章 第59章&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;2024/03/16 发表想法&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;领导哭你也得哭&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;原文：小蔡坐在我旁边，一副无动于衷与己无关的神态，我在心里骂着：“这个麻木不仁的家伙，可怕啊！”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;在这个时代，一切随荣随枯，人一辈子就是自己这一辈子，时间后面的寄托已经被掏空&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;厅里派他去万山红农场，也是为了这个目的。越是艰苦的环境，越能考验一个人。他经历了这种考验，是一个高尚的人，纯粹的人，有道德的人，脱离了低级趣味的人，有益于人民的人。”&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第六十五章 第63章&lt;/strong&gt;&lt;/h3&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;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第六十六章 第64章&lt;/strong&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;反过来想，要求设计者设计游戏规则时不考虑自己的需要，那合乎人性吗？权力唯一难以达到的地方就是更高的权力，我感到自己还得努一把力，还得向更高的境地前进，算起来也只有一步之遥了。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;strong&gt;第六十七章 第65章&lt;/strong&gt;&lt;/h3&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;li&gt;“我说孔子死了还有另一条理由。孔子是讲君子小人的，可市场和权力场只讲强者和弱者。&lt;/li&gt;
&lt;li&gt;人，自己是君子？没有了小人君子之辩，孔子他不死？承担和牺牲的精神，人格和道德的力量，传统文化的这两大支柱已经崩塌，也难有重建的可能。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; 来自微信读书&lt;/p&gt;
</content:encoded><category>阅读</category></item><item><title>毕设PCB实物展示</title><link>https://lter.space/posts/show/</link><guid isPermaLink="true">https://lter.space/posts/show/</guid><description>分别是我毕设的板，stm32核心板，和瞎搞的开源星空，以及无线电的牌子</description><pubDate>Mon, 18 Mar 2024 11:21:15 GMT</pubDate><content:encoded>&lt;p&gt;分别是我毕设的板，stm32核心板，和瞎搞的开源星空，以及无线电的牌子&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240318_182344.jpg&quot; alt=&quot;IMG_20240318_182344&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240318_185009.jpg&quot; alt=&quot;IMG_20240318_185009&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240318_185030.jpg&quot; alt=&quot;IMG_20240318_185030&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240318_185048.jpg&quot; alt=&quot;IMG_20240318_185048&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240318_182320.jpg&quot; alt=&quot;IMG_20240318_182320&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/IMG_20240318_183304.jpg&quot; alt=&quot;IMG_20240318_183304&quot;&gt;&lt;/p&gt;
</content:encoded><category>嵌入式</category></item><item><title>毕设PCB原理图展示</title><link>https://lter.space/posts/PCB/</link><guid isPermaLink="true">https://lter.space/posts/PCB/</guid><description>以为毕设要做出一个成品来， 于是认真地把板子大小缩了再缩，最后缩到55mm 66mm， 这么大点儿空，布线差点儿布emo， 选的都是贴片类型的元件，全贴在PCB上，甚至还打算加装一个外壳， 为了缩减成本，选料也选了一阵子，最终缩减到10…</description><pubDate>Tue, 12 Mar 2024 07:38:27 GMT</pubDate><content:encoded>&lt;p&gt;以为毕设要做出一个成品来，&lt;/p&gt;
&lt;p&gt;于是认真地把板子大小缩了再缩，最后缩到55mm*66mm，&lt;/p&gt;
&lt;p&gt;这么大点儿空，布线差点儿布emo，&lt;/p&gt;
&lt;p&gt;选的都是贴片类型的元件，全贴在PCB上，甚至还打算加装一个外壳，&lt;/p&gt;
&lt;p&gt;为了缩减成本，选料也选了一阵子，最终缩减到104，&lt;/p&gt;
&lt;p&gt;然后打算SMT的时候发现最少贴俩，材料费200多，加工费400多。
汗流浃背，问老师咋整，&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;a href=&quot;https://www.bilibili.com/video/BV1HH4y1o7EN/?spm_id_from=333.880.my_history.page.click&amp;vd_source=e404ad14246992bcc3e4ac52a33df8ed&quot;&gt;小白物联网智能家居毕设参考STM32+ESP8266/MQTT+OneNet+UniApp_哔哩哔哩_bilibili&lt;/a&gt;
好不容易整出来了，还是得展示一下。&lt;/p&gt;
&lt;h3&gt;原理图&lt;/h3&gt;
&lt;p&gt;右上角是我从嘉立创随便找的开源stm32最小系统板，&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://oshwhub.com/dian-xie-eda/stm32f103c8t6&quot;&gt;STM32F103C8T6 - 嘉立创EDA开源硬件平台 (oshwhub.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;除了stm32之外的是我自己整的，&lt;/p&gt;
&lt;p&gt;此处感谢这几个教程&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1fM411Z7cW?p=1&amp;vd_source=e404ad14246992bcc3e4ac52a33df8ed&quot;&gt;00-0-课程介绍_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV13d4y1L7Rg/?spm_id_from=333.788&amp;vd_source=e404ad14246992bcc3e4ac52a33df8ed&quot;&gt;带着你从手册开始画板 STM最小系统板教程系列(一)_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV12M4y1N7MZ/?spm_id_from=333.880.my_history.page.click&amp;vd_source=e404ad14246992bcc3e4ac52a33df8ed&quot;&gt;09 STM32F103C8T6最小系统_哔哩哔哩_bilibili&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240312155432510.png&quot; alt=&quot;image-20240312155432510&quot;&gt;&lt;/p&gt;
&lt;h3&gt;PCB布局&lt;/h3&gt;
&lt;p&gt;按模块随便布的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/Snipaste_2024-03-11_22-05-04.png&quot; alt=&quot;Snipaste_2024-03-11_22-05-04&quot;&gt;&lt;/p&gt;
&lt;h3&gt;飞线&lt;/h3&gt;
&lt;p&gt;没有什么是过孔解决不了的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/Snipaste_2024-03-12_11-30-01.png&quot; alt=&quot;Snipaste_2024-03-12_11-30-01&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/Snipaste_2024-03-12_12-08-57.png&quot; alt=&quot;Snipaste_2024-03-12_12-08-57&quot;&gt;&lt;img src=&quot;https://lter.space/images/Snipaste_2024-03-12_12-15-41.png&quot; alt=&quot;Snipaste_2024-03-12_12-15-41&quot;&gt;&lt;/p&gt;
&lt;p&gt;又去听了听教程，然后发现晶振里边走线不太好，紧急修改&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/Snipaste_2024-03-12_12-28-57.png&quot; alt=&quot;Snipaste_2024-03-12_12-28-57&quot;&gt;&lt;/p&gt;
&lt;h3&gt;覆铜&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/Snipaste_2024-03-12_12-48-11.png&quot; alt=&quot;Snipaste_2024-03-12_12-48-11&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240312160729545.png&quot; alt=&quot;image-20240312160729545&quot;&gt;&lt;/p&gt;
&lt;h3&gt;3D模型&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/Snipaste_2024-03-12_15-22-45.png&quot; alt=&quot;Snipaste_2024-03-12_15-22-45&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/Snipaste_2024-03-12_15-22-53.png&quot; alt=&quot;Snipaste_2024-03-12_15-22-53&quot;&gt;&lt;/p&gt;
&lt;h3&gt;打样&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/Snipaste_2024-03-12_15-21-46.png&quot; alt=&quot;Snipaste_2024-03-12_15-21-46&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/Snipaste_2024-03-12_15-21-19.png&quot; alt=&quot;Snipaste_2024-03-12_15-21-19&quot;&gt;&lt;/p&gt;
&lt;p&gt;最后选的白色&lt;/p&gt;
&lt;h3&gt;一些细节图&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240312161133819.png&quot; alt=&quot;image-20240312161133819&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240312161149861.png&quot; alt=&quot;image-20240312161149861&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240312161240286.png&quot; alt=&quot;image-20240312161240286&quot;&gt;&lt;/p&gt;
&lt;p&gt;结语：&lt;/p&gt;
&lt;p&gt;当个layout工程师也挺好的&lt;/p&gt;
</content:encoded><category>嵌入式</category></item><item><title>配置博客自动改图片路径和自动剪切图片的尝试</title><link>https://lter.space/posts/try/</link><guid isPermaLink="true">https://lter.space/posts/try/</guid><description>regex = r&apos;!\[. ?\]\((. ?)\)&apos; 这个正则表达式是用来匹配Markdown文档中图片链接格式的。 让我们逐步分解一下这个正则表达式： ! : 在Markdown中，图片链接是以感叹号 ! 开头的，所以正则表达式首…</description><pubDate>Sat, 09 Mar 2024 08:20:59 GMT</pubDate><content:encoded>&lt;h3&gt;regex = r&amp;#39;![.&lt;em&gt;?]((.&lt;/em&gt;?))&amp;#39;&lt;/h3&gt;
&lt;p&gt;这个正则表达式是用来匹配Markdown文档中图片链接格式的。&lt;/p&gt;
&lt;p&gt;让我们逐步分解一下这个正则表达式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;!&lt;/code&gt;: 在Markdown中，图片链接是以感叹号&lt;code&gt;!&lt;/code&gt;开头的，所以正则表达式首先会查找感叹号。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[`: 紧跟着感叹号的是一个左方括号`[`，在正则表达式中方括号是一个特殊字符，用于定义字符集（character class）。因此，我们需要使用反斜杠&lt;/code&gt;来转义它，以匹配文本中的实际方括号。&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.*?&lt;/code&gt;: 然后是点号&lt;code&gt;*&lt;/code&gt;和问号&lt;code&gt;?&lt;/code&gt;的组合。 - 点号&lt;code&gt;.&lt;/code&gt;代表任何单个字符（除了换行符）。 - 星号&lt;code&gt;*&lt;/code&gt;表示重复前面的字符零次或多次。 - 问号&lt;code&gt;?&lt;/code&gt;在这里是一个非贪婪（non-greedy）限定符，它告诉正则表达式引擎匹配尽可能少的字符，直到遇到下一个模式。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\]``: 这部分是查找与前面的左方括号相对应的右方括号&lt;/code&gt;]`，同样地，由于方括号在正则表达式中有特殊含义，我们使用反斜杠``进行转义。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\(&lt;/code&gt;和&lt;code&gt;\)&lt;/code&gt;: 这两个是用来匹配实际的左右圆括号&lt;code&gt;(&lt;/code&gt;和&lt;code&gt;)&lt;/code&gt;，这两个圆括号用来括起Markdown中图片链接的URL路径，因为在正则表达式中圆括号具有特殊的分组功能，所以需要使用反斜杠&lt;code&gt;\&lt;/code&gt;来转义它们。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;(.*?)&lt;/code&gt;: 这是一个捕获组（capturing group）：&lt;ul&gt;
&lt;li&gt;括号&lt;code&gt;()&lt;/code&gt;定义了一个捕获组，用来捕获和存储匹配的数据以便将来引用。&lt;/li&gt;
&lt;li&gt;点号&lt;code&gt;.*&lt;/code&gt;同样表示匹配任何字符零次或多次。&lt;/li&gt;
&lt;li&gt;问号&lt;code&gt;?&lt;/code&gt;使得匹配变得非贪婪，即匹配尽量少的字符。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;综上所述，正则表达式&lt;code&gt;r&amp;#39;!\[.*?\]\((.*?)\)&amp;#39;&lt;/code&gt;整体查找的是一个标记了图片图像且不包含换行符的Markdown链接，它匹配以&lt;code&gt;![]&lt;/code&gt;开始，紧跟一个括号内含任意字符（非贪婪匹配）的字符串。括号内的匹配部分（即图片的URL路径）被捕获以便之后使用。&lt;/p&gt;
&lt;h3&gt;每次上传博客md文件和图像需要g还是d&lt;/h3&gt;
&lt;p&gt;当你上传博客的Markdown文件和图像后，通常你需要先执行&lt;code&gt;hexo generate&lt;/code&gt;（或其简写&lt;code&gt;hexo g&lt;/code&gt;）来生成最新的静态文件，然后执行&lt;code&gt;hexo deploy&lt;/code&gt;（或其简写&lt;code&gt;hexo d&lt;/code&gt;）将这些静态文件部署到服务器上。&lt;/p&gt;
&lt;p&gt;具体步骤通常是这样的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;更新Markdown文件和图像到你的博客项目目录中。&lt;/li&gt;
&lt;li&gt;在命令行中运行&lt;code&gt;hexo g&lt;/code&gt;来生成网站的静态内容。这个过程会将你的Markdown和图像文件转换为网页文件，并将它们存放在&lt;code&gt;public&lt;/code&gt;目录下。&lt;/li&gt;
&lt;li&gt;完成网站的静态内容生成后，运行&lt;code&gt;hexo d&lt;/code&gt;来部署这些内容到指定的服务器上，例如GitHub Pages。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你已经配置了Hexo的一键部署功能，在运行&lt;code&gt;hexo d&lt;/code&gt;时，Hexo会自动将&lt;code&gt;public&lt;/code&gt;目录中的内容推送到远程仓库，网站即会相应更新。&lt;/p&gt;
&lt;p&gt;请记住，每次对博客内容做出更改，比如添加或编辑文章，或者更改图像等，你都需要运行这两个命令以确保你的更改被应用并展示在你的线上博客中。&lt;/p&gt;
&lt;h3&gt;error: cannot spawn .git/hooks/pre-commit: No such file or directory Everything up-to-date branch &amp;#39;master&amp;#39; set up to track &amp;#39;&lt;a href=&quot;mailto:git@github.com&quot;&gt;git@github.com&lt;/a&gt;:ltspace/ltspace.github.io.git/master&amp;#39;.&lt;/h3&gt;
&lt;p&gt;这个错误信息表明Git在尝试执行&lt;code&gt;pre-commit&lt;/code&gt;钩子时没有找到这个文件，这可能是由于以下几个原因造成的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;pre-commit&lt;/code&gt;钩子文件可能没有正确放置在&lt;code&gt;.git/hooks&lt;/code&gt;目录中。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pre-commit&lt;/code&gt;文件可能没有执行权限（在Windows环境下通常不需要设置执行权限，但有时可能受特定的环境配置影响）。&lt;/li&gt;
&lt;li&gt;如果你使用Windows，并且手动创建了&lt;code&gt;pre-commit&lt;/code&gt;文件，可能会不知不觉地给文件加上了默认的&lt;code&gt;.txt&lt;/code&gt;等扩展名。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;针对以上情况，请检查以下几点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;确认&lt;code&gt;pre-commit&lt;/code&gt;文件位于正确的目录：&lt;code&gt;.git/hooks&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;确认文件名确实是&lt;code&gt;pre-commit&lt;/code&gt;，没有隐藏的扩展名。在Windows文件资源管理器中查看文件名时，要确保设置允许显示已知文件类型的扩展名。&lt;/li&gt;
&lt;li&gt;如果是通过文本编辑器创建的钩子脚本，确保在保存时选择“所有文件”类型，以避免自动添加扩展名。&lt;/li&gt;
&lt;li&gt;尝试直接在命令行中执行&lt;code&gt;pre-commit&lt;/code&gt;钩子脚本来看是否能正确运行。如果不能，可能是脚本本身存在问题，或者你的环境中没有安装Python或者脚本的执行路径不对（在脚本的开头&lt;code&gt;#!/bin/sh&lt;/code&gt;可能需要指向正确的shell路径，这在Windows中通常不是必须的，但是依赖于你的环境配置）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果上述都没问题，你可以尝试删除&lt;code&gt;pre-commit&lt;/code&gt;钩子并重新创建它。如果错误仍然存在，那么需要对你的Git安装和配置环境做更深入的查看。在极端情况下，你可能需要重新安装Git或者调查是否有其它系统级的问题影响到了Git钩子的执行。&lt;/p&gt;
&lt;h3&gt;git仓库里.git的名字是.deploy_git&lt;/h3&gt;
&lt;p&gt;如果你的 &lt;code&gt;.git&lt;/code&gt; 文件夹的名字被改为了 &lt;code&gt;.deploy_git&lt;/code&gt;，那很有可能是使用了Hexo的部署机制，特别是当采用&lt;code&gt;hexo-deployer-git&lt;/code&gt;插件时，它会创建一个&lt;code&gt;.deploy_git&lt;/code&gt;目录用来作为Git部署仓库。这个目录用于存储生成的静态文件，并将其推送到远程仓库，比如GitHub Pages。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.deploy_git&lt;/code&gt;目录与你本地编辑文档的Git仓库（通常用&lt;code&gt;.git&lt;/code&gt;目录来管理）是分开的。Git钩子需要放在实际的Git仓库的&lt;code&gt;.git/hooks&lt;/code&gt;目录中。如果你将钩子脚本放到了&lt;code&gt;.deploy_git&lt;/code&gt;目录，那么它不会在你的常规Git操作中被触发。&lt;/p&gt;
&lt;p&gt;解决方法如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;确认你的本地仓库（包含你编辑的源文件）的&lt;code&gt;.git&lt;/code&gt;目录。它应该是你项目根目录的&lt;code&gt;.git&lt;/code&gt;文件夹，而不是Hexo生成的&lt;code&gt;.deploy_git&lt;/code&gt;文件夹。&lt;/li&gt;
&lt;li&gt;将你的&lt;code&gt;pre-commit&lt;/code&gt;钩子脚本放入你项目根目录下的&lt;code&gt;.git/hooks&lt;/code&gt;目录中。&lt;/li&gt;
&lt;li&gt;确保&lt;code&gt;pre-commit&lt;/code&gt;钩子脚本具有正确的内容，并且能够在你尝试提交到你的源代码仓库时被触发。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果你尝试修改你的源代码并提交（例如使用&lt;code&gt;git commit&lt;/code&gt;命令），那么钩子脚本应该在你项目的&lt;code&gt;.git/hooks&lt;/code&gt;目录中被触发。如果你仅仅使用&lt;code&gt;hexo deploy&lt;/code&gt;命令部署网站，它是不会触发这个钩子的，因为这通常会直接向&lt;code&gt;.deploy_git&lt;/code&gt;仓库提交。&lt;/p&gt;
&lt;h3&gt;.depoly_git里还有一个.git文件夹&lt;/h3&gt;
&lt;p&gt;在Hexo项目中，&lt;code&gt;.deploy_git&lt;/code&gt;文件夹是用于存储Hexo生成的静态文件以便部署到远程服务器的地方。当你使用&lt;code&gt;hexo-deployer-git&lt;/code&gt;插件进行部署时，Hexo会将&lt;code&gt;public&lt;/code&gt;目录中生成的静态文件复制到&lt;code&gt;.deploy_git&lt;/code&gt;目录，并在该目录初始化一个新的Git仓库用于部署。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.deploy_git&lt;/code&gt;目录中的&lt;code&gt;.git&lt;/code&gt;文件夹是这个用于部署的Git仓库的元数据存储位置，其中包含了版本控制的相关信息，如分支、提交历史、配置等。实际上，&lt;code&gt;.deploy_git&lt;/code&gt;目录本身就像是一个完整的Git仓库。&lt;/p&gt;
&lt;p&gt;当你执行&lt;code&gt;hexo deploy&lt;/code&gt;命令时，以下步骤会被触发：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Hexo调用&lt;code&gt;hexo generate&lt;/code&gt;生成静态文件。&lt;/li&gt;
&lt;li&gt;生成的静态文件被复制到&lt;code&gt;.deploy_git&lt;/code&gt;目录。&lt;/li&gt;
&lt;li&gt;在&lt;code&gt;.deploy_git&lt;/code&gt;目录执行Git命令，将变更添加(commit)到本地仓库，并将其推送(push)到远程服务器（如GitHub Pages或其他托管服务）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;.git&lt;/code&gt;文件夹在&lt;code&gt;.deploy_git&lt;/code&gt;目录中的作用是管理这一部署过程中所有的Git操作和历史记录。&lt;/p&gt;
&lt;p&gt;如果你在尝试运行Git钩子时遇到问题，请确保钩子被放置于你的源代码仓库的&lt;code&gt;.git/hooks&lt;/code&gt;目录中，而不是&lt;code&gt;.deploy_git&lt;/code&gt;目录或其内的&lt;code&gt;.git&lt;/code&gt;目录中。这样，当你操作源代码仓库时（比如执行&lt;code&gt;git commit&lt;/code&gt;），钩子才会被正确触发。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240309112717007.png&quot; alt=&quot;image-20240309112717007&quot;&gt;&lt;/p&gt;
&lt;h3&gt;额外再执行一遍git commit的命令，只执行hexo g -d&lt;/h3&gt;
&lt;p&gt;如果要在执行 &lt;code&gt;hexo g -d&lt;/code&gt; 的同时确保 &lt;code&gt;pre-commit&lt;/code&gt; 钩子被触发，你需要理解 &lt;code&gt;git commit&lt;/code&gt; 和 &lt;code&gt;hexo g -d&lt;/code&gt; 在工作流程上的不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git commit&lt;/code&gt; 是Git版本控制系统的命令，当你执行它时会触发 &lt;code&gt;.git/hooks&lt;/code&gt; 中的钩子脚本。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hexo g -d&lt;/code&gt; 是Hexo的命令，用于生成静态网站内容并将其部署到配置的服务器上，不会直接触发Git的 &lt;code&gt;pre-commit&lt;/code&gt; 钩子。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240309114430069.png&quot; alt=&quot;image-20240309114430069&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240309114453958.png&quot; alt=&quot;image-20240309114453958&quot;&gt;&lt;/p&gt;
&lt;h3&gt;把钩子放到.deploy_git的.git里，hexo g -d 直接执行钩子&lt;/h3&gt;
&lt;p&gt;理论上，你可以将钩子脚本放在 &lt;code&gt;.deploy_git/.git/hooks&lt;/code&gt; 里面。因为这个 &lt;code&gt;.git&lt;/code&gt; 目录确实是一个git仓库，所以它应该能认可钩子脚本。但这样做有一些需要考虑的地方：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Hexo 工作流程&lt;/strong&gt;：通常，&lt;code&gt;.deploy_git&lt;/code&gt; 仓库用于存放生成的静态文件，而不是源文件。如果你的钩子脚本主要是为了处理源文件（比如修改Markdown文件中的图片路径），那么它应该在源文件的 git 仓库中被触发执行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动化程度&lt;/strong&gt;：把钩子放在 &lt;code&gt;.deploy_git&lt;/code&gt; 中确实可以在执行 &lt;code&gt;hexo deploy&lt;/code&gt; 时自动处理静态文件。但如果你的钩子脚本是为了更新本地的源Markdown文件的图片路径，那么这个静态文件是由源文件生成的，所以应该在更新源文件后、生成静态文件之前就处理好。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;维护性&lt;/strong&gt;：&lt;code&gt;.deploy_git&lt;/code&gt; 目录通常不会提交到远程源码仓库，因为它的内容会在你运行 &lt;code&gt;hexo clean&lt;/code&gt; 命令或者重新生成网站时被删除或覆盖。这意味着，如果你将钩子脚本放在 &lt;code&gt;.deploy_git/.git/hooks&lt;/code&gt; 中，当 &lt;code&gt;.deploy_git&lt;/code&gt; 目录被删除或重新生成时，你可能会丢失这个钩子脚本。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;总结来说，虽然理论上可以将钩子放在 &lt;code&gt;.deploy_git/.git/hooks&lt;/code&gt; 中使其在执行 &lt;code&gt;hexo g -d&lt;/code&gt; 时自动执行，但这样做并不是实践中常见的或推荐的工作流程。通常，我们会在源码仓库中处理这些任务，以确保源码的版本控制和钩子脚本可以一起正常工作。如果你确实需要自动化此过程，可能还是需要一个在源码阶段就能够触发的自定义的脚本或命令集。&lt;/p&gt;
&lt;h3&gt;以下是将图片移动和替换绝对路径为相对路径的功能合并到一个脚本中的代码&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-c++&quot;&gt;import os
import re
import shutil

# 设置目标目录
target_directory = &amp;#39;E:\\BLOG\\source\\images&amp;#39;

# 配置你的Markdown文件的路径
markdown_directory = &amp;#39;E:\\BLOG\\source\\_posts&amp;#39;
# 配置存放图片的文件夹名称，相对于markdown_directory
images_directory = &amp;#39;images&amp;#39;


# 替换绝对路径为相对路径的函数
def replace_image_path(file_path, image_dir):
    # 建立一个正则表达式模式匹配Markdown图片链接
    regex = r&amp;#39;!\[.*?\]\((.*?)\)&amp;#39;

    # 读取Markdown文件内容
    with open(file_path, &amp;#39;r&amp;#39;, encoding=&amp;#39;utf-8&amp;#39;) as file:
        content = file.read()

    # 使用正则表达式匹配并替换路径
    new_content = content
    matches = re.findall(regex, content)
    for match in matches:
        if not match.startswith(&amp;#39;http&amp;#39;):  # 只替换本地文件路径
            new_image_path = os.path.join(&amp;#39;/&amp;#39;, image_dir, os.path.basename(match)).replace(&amp;#39;\\&amp;#39;, &amp;#39;/&amp;#39;)
            new_content = new_content.replace(match, new_image_path)

    # 写回新的内容到文件
    with open(file_path, &amp;#39;w&amp;#39;, encoding=&amp;#39;utf-8&amp;#39;) as file:
        file.write(new_content)


# 写一个函数来处理文件的移动，并替换Markdown文件中图片的引用
def process_markdown_files(md_directory, target_dir):
    for root, dirs, files in os.walk(md_directory):
        for file in files:
            if file.lower().endswith(&amp;#39;.md&amp;#39;):
                full_path = os.path.join(root, file)
                move_images(full_path, target_dir)
                replace_image_path(full_path, images_directory)


# 处理文件移动的函数
def move_images(md_file_path, target_dir):
    with open(md_file_path, &amp;#39;r&amp;#39;, encoding=&amp;#39;utf-8&amp;#39;) as file:
        content = file.read()

    # 正则表达式查找所有 Markdown 图片链接
    image_paths = re.findall(r&amp;#39;!\[.*?\]\((.*?)\)&amp;#39;, content)

    if not image_paths:
        print(f&amp;quot;No images found in {md_file_path}&amp;quot;)

    for image_path in image_paths:
        # 检查是否是绝对路径
        if os.path.isabs(image_path):
            # 获取图片名和目标路径
            image_name = os.path.basename(image_path)
            destination = os.path.join(target_dir, image_name)

            # 显示正在处理的图片
            print(f&amp;quot;Processing image: {image_name}&amp;quot;)

            # 如果目标路径下没有这个文件再进行移动
            if not os.path.exists(destination):
                # 尝试移动图片，如果原始图片路径不存在则会抛出异常
                try:
                    shutil.move(image_path, destination)
                    print(f&amp;#39;Moved image {image_name} to {target_dir}&amp;#39;)
                except FileNotFoundError:
                    print(f&amp;#39;Image not found at {image_path}, skipped moving&amp;#39;)
            else:
                print(f&amp;#39;Image {image_name} already exists in target directory; no action taken&amp;#39;)


# 开始处理Markdown文件和图片
print(f&amp;quot;Processing Markdown files and images in {markdown_directory}&amp;quot;)
process_markdown_files(markdown_directory, target_directory)

print(&amp;quot;All Markdown file image paths and images have been processed.&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>博客</category></item><item><title>24考研的具体经验反思</title><link>https://lter.space/posts/24%E8%80%83%E7%A0%94%E7%9A%84%E5%85%B7%E4%BD%93%E7%BB%8F%E9%AA%8C%E5%8F%8D%E6%80%9D/</link><guid isPermaLink="true">https://lter.space/posts/24%E8%80%83%E7%A0%94%E7%9A%84%E5%85%B7%E4%BD%93%E7%BB%8F%E9%AA%8C%E5%8F%8D%E6%80%9D/</guid><description>（未完成） 我觉得github上有个仓库极其的好，叫《考研：有手就行》 这位大哥是二战的，22年分数一般，但23年上岸上交计算机，水平真不是一般人， 第一次的初试分数是79 + 72 + 93 + 86 = 330（11408），未进复…</description><pubDate>Sat, 02 Mar 2024 15:15:41 GMT</pubDate><content:encoded>&lt;p&gt;（未完成）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我觉得github上有个仓库极其的好，叫《考研：有手就行》&lt;/p&gt;
&lt;p&gt;这位大哥是二战的，22年分数一般，但23年上岸上交计算机，水平真不是一般人，&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;第一次的初试分数是79 + 72 + 93 + 86 = 330（11408），未进复试。&lt;/li&gt;
&lt;li&gt;第二次的初试分数是80 + 75 + 137 + 122 = 414（11408），复试分数是180分（总分200）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;我今年是64 + 79 + 97 + 100 = 340（11408），&lt;/p&gt;
&lt;p&gt;鉴于我这北京和他那上海都挺旱的，只能说我俩一战水平差不多。&lt;/p&gt;
&lt;hr&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;hr&gt;
&lt;p&gt;记得这个库还是后台一粉丝介绍给我的，说我和那个大佬理念很相似，&lt;/p&gt;
&lt;p&gt;经过这一切之后再想起这个评价，真是太讽刺了。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我其实不想由果索因，因为会额外否定很多东西。&lt;/p&gt;
&lt;p&gt;但没有结果的时候，又会不自觉美化自己的行为。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;个人情况：&lt;/p&gt;
&lt;p&gt;山东高考，末流985，计算机本科，一战北京11408，笨拙的努力型选手。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;1 政治&lt;/h2&gt;
&lt;p&gt;客观39，主观25，总分64.&lt;/p&gt;
&lt;p&gt;简单来说，还是别花时间学政治了。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;1.1 选择&lt;/h3&gt;
&lt;p&gt;我后期买了那个喵刷政治的微信小程序，也买了苍盾政治的小程序，&lt;/p&gt;
&lt;p&gt;比较之后用喵刷，UI简洁舒适，能归类错题生成pdf打印纸质版，&lt;/p&gt;
&lt;p&gt;最重要的是能长按排除选项，对于选择题来说很有用。&lt;/p&gt;
&lt;p&gt;对了，我提到的都不是广，没有人会找我这种没粉丝的公众号投广告。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;然后用喵刷刷了几乎所有的模拟卷的选择；肖八肖四选择题二刷三刷、纸质版刷完小程序刷；错题归档，打印纸质版继续二刷三刷。&lt;/p&gt;
&lt;p&gt;背腿姐手册，背b站帕拉迪宇的一页纸，用政治带背下饭，&lt;/p&gt;
&lt;p&gt;最后选择39，错仨单选，四多选。&lt;/p&gt;
&lt;p&gt;挺烂，我记得今年出来之后很多人说政治选择简单。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;政治选择方面应该很少人能超过我花费的时间。&lt;/p&gt;
&lt;p&gt;你看，这可怜的投入产出比，（笑）。&lt;/p&gt;
&lt;p&gt;不过我记得肖八刚出来的时候我第一套选择19分，大家平均也在一二十分左右，&lt;/p&gt;
&lt;p&gt;该看的还是得看看，才能上40，&lt;/p&gt;
&lt;p&gt;我意思就是该刷的刷，别刷多了。&lt;/p&gt;
&lt;p&gt;十二月只刷肖八肖四吧各位，刷多了也没用。&lt;/p&gt;
&lt;p&gt;反正大家水平都差不多之后，主要还是看运气。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;平常互联网键政的各位，尤其是魔怔人，&lt;/p&gt;
&lt;p&gt;我建议你们前期也不用买核心考案听徐涛的课了，很多概念你们都懂，&lt;/p&gt;
&lt;p&gt;不懂的东西到十一二月的时候对着背诵手册细品一下也就明白了，很多都是你们平常唠的东西。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;1.2 大题&lt;/h3&gt;
&lt;p&gt;我这可怜的25分，我分析的是，&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;hr&gt;
&lt;p&gt;我现在挺后悔的，每天挂嘴边的就是京区把我害惨了，&lt;/p&gt;
&lt;p&gt;放别的水区政英高二十分，调剂得多好调，&lt;/p&gt;
&lt;p&gt;这就是当时不考虑退路的下场。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;字体巨无敌烂这一点我也没想到，我没想到威海职业学院那几天那么冷，&lt;/p&gt;
&lt;p&gt;前一天刚下完持续几周的雪，后一天就开始考试，化雪的同时考场还是没暖气的阶梯教室，&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;备考的时候要不还是找找适合你考场的温度吧，&lt;/p&gt;
&lt;p&gt;像我，所有备考的时间为了不让身体状态影响我，都选择的是冬暖夏凉的图书馆，&lt;/p&gt;
&lt;p&gt;导致我在20℃图书馆里模拟的政治字体间距排版等等一切，在零下的考场上全部失效。&lt;/p&gt;
&lt;hr&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;hr&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;hr&gt;
&lt;p&gt;还是那句话，你到十一二月再开政治完全不迟。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240302191735961.png&quot; alt=&quot;image-20240302191735961&quot;&gt;&lt;/p&gt;
&lt;h2&gt;2.英语&lt;/h2&gt;
&lt;p&gt;完型全对，阅读错仨，主观小作文6.5/10，大作文11/20，翻译7/10，只能说难评，京区就这样。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;2.1 客观&lt;/h3&gt;
&lt;p&gt;四六级裸考均分580，属于英语没那么好，但也不用额外补的水平。&lt;/p&gt;
&lt;p&gt;单词没背完，太多了，红宝书那么一厚本我是真难绷，不背单词显示有六千多个？&lt;/p&gt;
&lt;p&gt;我寻思着光单单在软件上按完就得花我一辈子。&lt;/p&gt;
&lt;hr&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;hr&gt;
&lt;p&gt;真题大概做了不到十套，&lt;/p&gt;
&lt;p&gt;十月份的时候先做的10、11年的，当时完型动辄错11、12个，气笑了，就没再管，因为知道那段年份难。&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;hr&gt;
&lt;p&gt;最后证明运气还行，考场上的文章都能看懂，花二十分钟做完了客观题。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;2.2 主观&lt;/h3&gt;
&lt;hr&gt;
&lt;p&gt;大作文用的红果研王晶婷的作文书，实在是很好用，&lt;/p&gt;
&lt;p&gt;像拼图一样，可以选用不同水平的句子拼凑出属于自己的模板，&lt;/p&gt;
&lt;p&gt;但主要还是靠当场发挥。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;小作文搁十二月份背背那几个信件类型开头结尾的句式就行，&lt;/p&gt;
&lt;p&gt;我感觉考研从我这届开始变得变化莫测了，试图考前压中题目是极其吃力不讨好的事儿，&lt;/p&gt;
&lt;p&gt;中间的部分还不如当场发挥。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;十一二月开始，大小作文分别模了两三次吧，平常就背背自己攒的模板。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;翻译没啥说的，感觉无论翻译的再好在北京都会每道题扣0.5。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;小作文写跑题了，&lt;/p&gt;
&lt;p&gt;人外国人说要做一个ancient scientist的讲座，关于古代中国科学家的讲座，&lt;/p&gt;
&lt;p&gt;按理说应该推荐中国古代的科学家，所以舍友问我写的谁的时候我汗流浃背，&lt;/p&gt;
&lt;p&gt;我看成是面向研究中国古代文明的科学家做中文讲座，&lt;/p&gt;
&lt;p&gt;写让他去bilibili学汉语，让他别担心，中国人都挺友善，你发音不准也不会嘲笑你，&lt;/p&gt;
&lt;p&gt;跑题了还有6.5，可能把批试卷的研究生逗乐了。&lt;/p&gt;
&lt;hr&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;后来就是赞颂Party好，government好，人民生活幸福感高，经济稳中向好。&lt;/p&gt;
&lt;p&gt;不然还能说什么呢。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;总之英语我几乎没花时间，对我来说是性价比爆棚的学科，&lt;/p&gt;
&lt;p&gt;这大概就是那些大佬学数学的感受。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240302202850572.png&quot; alt=&quot;image-20240302202850572&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;3 数学&lt;/h2&gt;
&lt;p&gt;这个部分，我都痛苦的不想回忆它。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240302212124335.png&quot; alt=&quot;image-20240302212124335&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;选择错仨，填空错仨，30分就已经没了。&lt;/p&gt;
&lt;p&gt;极其恐怖。&lt;/p&gt;
&lt;p&gt;我最后还能考97，全靠大题判卷放水。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;所以那个上交佬在数学篇的一开始就说，&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;数学是一门方差极大的学科，这个方差既指考生之间的方差，又指考生（发挥）的方差。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我觉得能考到145-150的人，最低也就140，这只是试卷的上限，不是他深厚积累的底线。&lt;/p&gt;
&lt;p&gt;但是在120，110，100分数段的人，完全可以考到90。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;太痛苦了，是想想就想死的程度。&lt;/p&gt;
&lt;p&gt;如果我备考有100%的时间，&lt;/p&gt;
&lt;p&gt;那么60%的时间都在学数学，&lt;/p&gt;
&lt;p&gt;30%的时间学408四门课，&lt;/p&gt;
&lt;p&gt;8%的时间学政治，&lt;/p&gt;
&lt;p&gt;2%的时间学英语。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;性价比低到了一个令人咋舌的程度，感觉我学一两个月和我学一年相比，分差也不会超过20。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;基础和强化全程跟的张宇，&lt;/p&gt;
&lt;p&gt;我觉得没必要一听别人说张宇的课门槛高就退缩，我这种大学高数60分的人都能正常听懂，门槛高又能高到哪儿去呢。&lt;/p&gt;
&lt;p&gt;线代大后期又跟了b站的帕拉迪宇，小铜数学等一系列优秀up主，&lt;/p&gt;
&lt;p&gt;反正他们互相认识也合作过视频，找到一个就可以顺藤摸瓜找到其他人。&lt;/p&gt;
&lt;p&gt;概率论和无穷级数到大后期又跟了一遍方浩。&lt;/p&gt;
&lt;p&gt;记得不要跟考研竞赛凯哥，具体原因自己去找。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;邂逅遗憾知乎的经验贴害惨了我，让我觉得我也能上，建议看他经验贴之前撒泡尿照照自己。&lt;/p&gt;
&lt;p&gt;rw现在每年炸成这样，有很大一部分原因就是他知乎的经验帖。&lt;/p&gt;
&lt;p&gt;但是他经验帖写的确实好，他推荐的方浩概率论确实不错，&lt;/p&gt;
&lt;p&gt;他自己办的课挺贵的，小班八百多大班四千多，我没听过不做评价。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;就是方浩的那个书和他的课程不配套真的很烦，我学概率论的时候一大部分时间都在抄他的课上例题，因为题确实有用，&lt;/p&gt;
&lt;p&gt;尤其是张宇的课和他的书配套的极其丝滑，再听方浩的课感觉跟吔了史一样。&lt;/p&gt;
&lt;p&gt;建议别买方浩的书，直接买风中易小生做的方浩做题本自己打印，我也是后来才发现风中易小生的做题本都给整理好了。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我虽然考得烂，但张宇老师确实好，教材做得很全，&lt;/p&gt;
&lt;p&gt;上课生动形象，体谅学生，到现在我还记得他讲的狮子王的故事，不过当时听的时候我倍速过去了。&lt;/p&gt;
&lt;p&gt;据说今年数学这样之后各大经验贴都主推张宇老师了，因为张宇老师的全程班基础性好的同时扩展度最高。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;只能说从此往后，如果卷考研的人继续增多，数学的难度和扩展性也会越来越大，越来越起到选拔人才的作用，&lt;/p&gt;
&lt;p&gt;今年就是最好的例子，狠狠给了我当头一棒，&lt;/p&gt;
&lt;p&gt;没有两把刷子的人好好掂量掂量自己。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;武老师我是真听不进去，语调太平，感觉像是大学里读ppt的老师，但是有很多跟武老师的人分数也很高，所以这两大派系的选择主要还是看自己。&lt;/p&gt;
&lt;hr&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;hr&gt;
&lt;p&gt;我现在回忆，基础阶段和强化阶段在我脑海里是空白的，&lt;/p&gt;
&lt;p&gt;我觉得这有可能就是我数学考成这个样子的原因。&lt;/p&gt;
&lt;p&gt;像是盘古还未开天辟地时的混沌。&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;4.408&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240302230426611.png&quot; alt=&quot;image-20240302230426611&quot;&gt;&lt;/p&gt;
&lt;hr&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://lter.space/images/image-20240302230509125.png&quot; alt=&quot;image-20240302230509125&quot;&gt;&lt;/p&gt;
</content:encoded><category>考研</category></item><item><title>重新搞了博客</title><link>https://lter.space/posts/%E9%87%8D%E6%96%B0%E6%90%9E%E4%BA%86%E5%8D%9A%E5%AE%A2/</link><guid isPermaLink="true">https://lter.space/posts/%E9%87%8D%E6%96%B0%E6%90%9E%E4%BA%86%E5%8D%9A%E5%AE%A2/</guid><description>重新搞了博客， 21年刚开始整博客的时候，把博客放在了我自己的云服务器里，觉得既然买了就不用白不用，顺便练练运维啥的。 后来那个服务器承担了我很多的学习任务和尝试，所以经常遇到依赖地狱， 一旦十几个小时卡在某个依赖上毫无进展，我就直接气…</description><pubDate>Thu, 29 Feb 2024 02:29:10 GMT</pubDate><content:encoded>&lt;p&gt;重新搞了博客，&lt;/p&gt;
&lt;p&gt;21年刚开始整博客的时候，把博客放在了我自己的云服务器里，觉得既然买了就不用白不用，顺便练练运维啥的。&lt;/p&gt;
&lt;p&gt;后来那个服务器承担了我很多的学习任务和尝试，所以经常遇到依赖地狱，&lt;/p&gt;
&lt;p&gt;一旦十几个小时卡在某个依赖上毫无进展，我就直接气得重装整个服务器，&lt;/p&gt;
&lt;p&gt;又懒得在外边套docker，所以连带着博客也得重装，我的评价是活该，&lt;/p&gt;
&lt;p&gt;重装了几次之后就气坏了，懒得搞了，荒废了两年。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;最终决定将博客作为一个lifelong的项目维持，为了省钱省力气挂在了github上，再重定向到我原来的域名，一举两得。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;以前是把公众号的内容都搬过来，但是现在没那精力了，&lt;/p&gt;
&lt;p&gt;因为微信公众号不支持md格式，导致我每次写完md之后还要贴到公众号上去精修一下，后来就演变成md只写草稿，再粘贴到公众号的编辑框写详细。&lt;/p&gt;
&lt;p&gt;所以要么写个脚本，发哪个平台就全自动化移植到另一个平台，要么就两个平台单独更新吧，这边写点儿那边不让写的。&lt;/p&gt;
&lt;p&gt;有空的时候我还是想完全自己写博客的前后端，现在用hexo主要是没时间，至于什么时候有时间，我觉得得等到上研究生之后，或者工作之后，或者退休之后了。&lt;/p&gt;
</content:encoded><category>博客</category></item><item><title>24考研的感受</title><link>https://lter.space/posts/24/</link><guid isPermaLink="true">https://lter.space/posts/24/</guid><description>首发于微信公众号 我对于24考研的感受 1 无数次跟朋友调笑，说，考不上就二战，有什么大不了。 现在发现自己没办法二战。 因为没了半条命。 而且我是认真的。 这个月的很多时刻，我都在反复的想一个很浅显的道理， 就是为什么令人印象深刻的故…</description><pubDate>Sun, 24 Dec 2023 10:24:22 GMT</pubDate><content:encoded>&lt;p&gt;首发于微信公众号&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mp.weixin.qq.com/s/Z36m4_W5Q_5h-bg2_d9yOA&quot;&gt;我对于24考研的感受&lt;/a&gt;&lt;/p&gt;
&lt;h2&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;而且我是认真的。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;这个月的很多时刻，我都在反复的想一个很浅显的道理，&lt;/p&gt;
&lt;p&gt;就是为什么令人印象深刻的故事总是发生在各种大事中，过程里总是含有人的各种极端的情感，&lt;/p&gt;
&lt;p&gt;而普通的生活就没太有观赏性。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;为什么想这些，&lt;/p&gt;
&lt;p&gt;因为每天都在痛苦里度过。&lt;/p&gt;
&lt;p&gt;如果让我用一个词概括一下考研感受的话，我会在“痛苦“和”想死“之间选择。&lt;/p&gt;
&lt;hr&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;hr&gt;
&lt;h2&gt;2&lt;/h2&gt;
&lt;hr&gt;
&lt;p&gt;先谈痛苦的原因，&lt;/p&gt;
&lt;p&gt;我考的是北京的数学一、英语一、统考408，&lt;/p&gt;
&lt;p&gt;在整个考研领域算得上是顶尖体量、顶尖难度，考的也是顶尖学校。&lt;/p&gt;
&lt;p&gt;我不后悔，因为如果我报了其他学校考出来分数超了这个学校的分数线，我会后悔一辈子，&lt;/p&gt;
&lt;p&gt;相比之下，考不到这个学校的分数线被刷反而不会让我后悔，只会让我承认技不如人。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;再加上我脑子很不好使。&lt;/p&gt;
&lt;p&gt;我有多笨？举个小例子，我反复做了看了不知道多少遍往年真题，做了四五十套数学模拟，然而直到倒数第十天的时候，我才突然开窍，明白了10年真题的那道二次型为什么那么做，顺带才明白了一串儿类似的模拟题。&lt;/p&gt;
&lt;p&gt;而且我明白的还是一个浅显的知识点。&lt;/p&gt;
&lt;p&gt;每次这种突然开窍之后，我也哭，&lt;/p&gt;
&lt;p&gt;不是喜悦的哭，是反应过来我突然开窍的东西到底有多简单的时候，会立马想到所有那些比我聪明的人早就花几秒的时间明白了这些知识点，而我要在桌前苦坐无数个斗转星移日日夜夜，用一次次的努力理解等待那个可能永远不会到来的质变。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;然后我在12月18号的手机里留下了这句话：&lt;/p&gt;
&lt;p&gt;“我不配留下后代。不然还让他和我一样这么蠢吗，还让他和我一样天天这么痛苦吗。”&lt;/p&gt;
&lt;hr&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;
&lt;h2&gt;3&lt;/h2&gt;
&lt;p&gt;坂本龙一有首曲子，叫fullmoon，&lt;/p&gt;
&lt;p&gt;用十一种语言叠加复述着一段话。&lt;/p&gt;
&lt;p&gt;11月20号凌晨，我睡不着，坐在床下的黑暗里一直在听。
Because we don&amp;#39;t know when we will die,&lt;/p&gt;
&lt;p&gt;因为我们不知道死亡何时到达&lt;/p&gt;
&lt;p&gt;we get to think of life as an inexhaustible well.&lt;/p&gt;
&lt;p&gt;所以会把生命当成一座永不干枯的井&lt;/p&gt;
&lt;p&gt;And yet everything happens only a certain number of times,&lt;/p&gt;
&lt;p&gt;然而，所有事物都只出现一定的次数，&lt;/p&gt;
&lt;p&gt;and a very small number really.&lt;/p&gt;
&lt;p&gt;并且很少，真的&lt;/p&gt;
&lt;p&gt;How many more times will you remember a certain afternoon of your childhood,&lt;/p&gt;
&lt;p&gt;你会想起多少次童年中某个特定的下午，&lt;/p&gt;
&lt;p&gt;some afternoon that&amp;#39;s so deeply a part of your being that you can&amp;#39;t even conceive of your life without it?&lt;/p&gt;
&lt;p&gt;某个深深成为你生命一部分的下午，如果没有它，你甚至无法想象自己的人生？&lt;/p&gt;
&lt;p&gt;Perhaps four,or five times more?Perhaps not even that.&lt;/p&gt;
&lt;p&gt;也许，四或五次吧？甚至可能没这么多。&lt;/p&gt;
&lt;p&gt;How many more times will you watch the full moon rise?&lt;/p&gt;
&lt;p&gt;你会看到满月升起几次呢?&lt;/p&gt;
&lt;p&gt;Perhaps twenty.And yet it all seems limitless...&lt;/p&gt;
&lt;p&gt;也许20次，然而这些都看似无穷﻿...
在最后的这几个月里，我每时每刻都清晰的知道，我所经历的这些事情看似无穷，实则有尽。&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;
&lt;p&gt;往日崎岖还记否，路长人困蹇驴嘶。
清夜无尘，月色如银。酒斟时、须满十分。&lt;/p&gt;
&lt;p&gt;浮名浮利，虚苦劳神。叹隙中驹，石中火，梦中身。&lt;/p&gt;
&lt;p&gt;虽抱文章，开口谁亲。且陶陶、乐尽天真。&lt;/p&gt;
&lt;p&gt;几时归去，作个闲人。对一张琴，一壶酒，一溪云。&lt;/p&gt;
</content:encoded><category>考研</category></item><item><title>白嫖Google相册无限空间实操</title><link>https://lter.space/posts/%E7%99%BD%E5%AB%96Google%E7%9B%B8%E5%86%8C%E6%97%A0%E9%99%90%E7%A9%BA%E9%97%B4%E5%AE%9E%E6%93%8D/</link><guid isPermaLink="true">https://lter.space/posts/%E7%99%BD%E5%AB%96Google%E7%9B%B8%E5%86%8C%E6%97%A0%E9%99%90%E7%A9%BA%E9%97%B4%E5%AE%9E%E6%93%8D/</guid><description>准备：已root的手机 （我用Mi13Ultra，MIUI14.0.16） 众所周知，在pixel一代手机上用谷歌相册可以原图无限量上传。 所以要想白嫖，要么去闲鱼上淘个旧版pixel，要么把自己的手机伪装成pixel一代。 旧pixe…</description><pubDate>Thu, 24 Aug 2023 15:05:36 GMT</pubDate><content:encoded>&lt;p&gt;准备：已root的手机&lt;/p&gt;
&lt;p&gt;（我用Mi13Ultra，MIUI14.0.16）
众所周知，在pixel一代手机上用谷歌相册可以原图无限量上传。
&lt;img src=&quot;https://lter.space/images/image-20240310231058617.png&quot; alt=&quot;image-20240310231058617&quot;&gt;
所以要想白嫖，要么去闲鱼上淘个旧版pixel，要么把自己的手机伪装成pixel一代。
旧pixel1闲鱼价格两三百，我寻思着都能再买个硬盘了，也不想再多出个累赘，还得来回倒腾，配置主力机的自动更新什么的，&lt;/p&gt;
&lt;p&gt;只看基带的话，Pixel和Pixel XL用的是骁龙821，Modem支持的最大上行速率是150Mbps，换算就是18MB/s，虽然看起来还行，但这么多年了，网卡估计也不太行了，肯定还是用新手机香。
&lt;a href=&quot;https://github.com/ButaiKirin/Pixel-2016-Permissions/releases&quot;&gt;https://github.com/ButaiKirin/Pixel-2016-Permissions/releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;前几年试过用这个magisk模块，失败了，当时把自己主力账号的存储空间搞得爆红，gmail邮件都进不来，&lt;/p&gt;
&lt;p&gt;今天又试了试，感觉它的功能只是伪装了本地的google相册，让它显示一句“此 Pixel可以免费备份不限量的照片和视频”，实际上是掩耳盗铃。
时隔一年又发现了个新的模块，&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/BaltiApps/Pixelify-Google-Photos&quot;&gt;https://github.com/BaltiApps/Pixelify-Google-Photos&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;界面长这样
&lt;img src=&quot;https://lter.space/images/image-20240310231211423.png&quot; alt=&quot;image-20240310231211423&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://lter.space/images/image-20240310231224750.png&quot; alt=&quot;image-20240310231224750&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310231238022.png&quot; alt=&quot;image-20240310231238022&quot;&gt;&lt;/p&gt;
&lt;p&gt;看应用签名，好像是这哥们自己搞的版本，发行组织就是他的博客域名，所以要想用的话，自己去群里或者这个博客里找。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310231301486.png&quot; alt=&quot;image-20240310231301486&quot;&gt;&lt;/p&gt;
&lt;p&gt;这软件一开始装的时候会提示要在lsposed里打开模块后重启，实测也不用重启，lsposed里打开之后设置停止运行再打开就行。
谷歌相册：&lt;a href=&quot;https://photos.google.com/&quot;&gt;https://photos.google.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;谷歌云盘：&lt;a href=&quot;https://drive.google.com/&quot;&gt;https://drive.google.com/&lt;/a&gt;
能够正常无限原画质备份的现象是：只有谷歌相册里能找到备份了的照片和视频，而谷歌云盘里不仅不占用存储空间，也看不见。
最后成功&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310231319864.png&quot; alt=&quot;image-20240310231319864&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310231335363.png&quot; alt=&quot;image-20240310231335363&quot;&gt;&lt;/p&gt;
&lt;p&gt;（成功标志：网页端有照片的情况下显示0B）&lt;/p&gt;
</content:encoded><category>教程</category></item><item><title>折腾校园卡24小时后，我后悔了</title><link>https://lter.space/posts/%E6%8A%98%E8%85%BE%E6%A0%A1%E5%9B%AD%E5%8D%A124%E5%B0%8F%E6%97%B6%E5%90%8E%EF%BC%8C%E6%88%91%E5%90%8E%E6%82%94%E4%BA%86/</link><guid isPermaLink="true">https://lter.space/posts/%E6%8A%98%E8%85%BE%E6%A0%A1%E5%9B%AD%E5%8D%A124%E5%B0%8F%E6%97%B6%E5%90%8E%EF%BC%8C%E6%88%91%E5%90%8E%E6%82%94%E4%BA%86/</guid><description>我平常固定在图书馆某层中间的一个位置自习，旁边是一面巨大的窗子，采光好，还有窗台让我放书。 某天正午，我觉得很热，打开了我那片区域图书馆的空调，一个女生接着走过去关了。 好的，既然不让我开，那我搬去一直开着空调的地方。 但是开着空调的地…</description><pubDate>Sat, 29 Jul 2023 15:14:29 GMT</pubDate><content:encoded>&lt;p&gt;我平常固定在图书馆某层中间的一个位置自习，旁边是一面巨大的窗子，采光好，还有窗台让我放书。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232415490.png&quot; alt=&quot;image-20240310232415490&quot;&gt;&lt;/p&gt;
&lt;p&gt;某天正午，我觉得很热，打开了我那片区域图书馆的空调，一个女生接着走过去关了。&lt;/p&gt;
&lt;p&gt;好的，既然不让我开，那我搬去一直开着空调的地方。&lt;/p&gt;
&lt;p&gt;但是开着空调的地方采光又不好，来回搬书又太麻烦。&lt;/p&gt;
&lt;h2&gt;于是我想，能不能预约两个座位，这样我就不用来回搬了，热的时候去开空调那里，暗的时候去采光好那里。&lt;/h2&gt;
&lt;p&gt;想用两个座位，就需要另外一个人的学生卡。
有个朋友，现在不在学校，未来一年也不会进图书馆，所以用他的学生卡就是最好的选择。&lt;/p&gt;
&lt;p&gt;征求他的同意之后，我们开始讨论如何让我在没有卡的情况下使用他的卡进行预约。&lt;/p&gt;
&lt;p&gt;他的卡留在了宿舍，但恰巧一年多前他买了个读卡器，恰巧当时他破解卡之后把dump文件（卡里边的内容）截图发给了我，截图里恰巧有我所需要的全部信息。&lt;/p&gt;
&lt;p&gt;恰巧我当时也很好奇，借用了他的读卡器，自己也暴力破解了自己的校园卡，但早就忘了当时把破解出来的dump文件存到了哪里，有没有删，&lt;/p&gt;
&lt;p&gt;于是我用everything正则搜*.dump，万幸，在回收站找到了当时校园卡和银行卡的dump文件，然后还原了回去。
&lt;img src=&quot;https://lter.space/images/image-20240310232433541.png&quot; alt=&quot;image-20240310232433541&quot;&gt;&lt;/p&gt;
&lt;p&gt;另外，某校用的学生卡应该是IC卡中的一种，NXP MIFARE Classic 1k，共分为12个扇区，
&lt;img src=&quot;https://lter.space/images/image-20240310232444160.png&quot; alt=&quot;image-20240310232444160&quot;&gt;&lt;/p&gt;
&lt;p&gt;0-5这六个扇区是密钥加密过的，nfc读取只能读出它位于0扇区0块的卡号，因为在nfc第一次读取卡的实体门卡页面中显示卡号，但模拟的时候提示说：加密卡只能模拟卡号（厂商码能不能不确定），&lt;/p&gt;
&lt;p&gt;用十六进制查看器可以看出，后边的12345里存放了学号与姓名和一些其他的东西。
&lt;img src=&quot;https://lter.space/images/image-20240310232509156.png&quot; alt=&quot;image-20240310232509156&quot;&gt;&lt;/p&gt;
&lt;p&gt;但手机和手环的nfc依然可以预约图书馆，说明图书馆的读卡机只需要读到卡号，不需要加密卡的其他部分，所以我只需要用nfc模拟出他的卡号，当然，这是我后期才明白过来的。&lt;/p&gt;
&lt;h2&gt;通过补办新卡让旧卡报废来看，卡号这玩意儿也是唯一的，估计是补办的时候会把新卡号插到数据库里覆盖旧卡号，达到每人一卡的功能。&lt;/h2&gt;
&lt;p&gt;于是现在的总体情况是，我拥有我卡的dump文件，他卡的dump文件，还有一张我在用的校园卡，还有一张之前找不到的，补办之后又找到，所以现在报废了的卡，还有一部root了的手机，&lt;/p&gt;
&lt;p&gt;其它包括读卡器写卡器空白卡什么的，统统没有。&lt;/p&gt;
&lt;p&gt;最终目的是用手机模拟出他的卡。
于是开始尝试各个软件能不能用，分别有什么功能，这是一个漫长的过程，&lt;/p&gt;
&lt;p&gt;最后选定了四个软件，通过他们功能的配合达成目的，分别是&lt;/p&gt;
&lt;p&gt;NFC Card Emulator Pro (root)&lt;/p&gt;
&lt;p&gt;NFC Reader Tool Pro&lt;/p&gt;
&lt;p&gt;Mifare Classic  Tool&lt;/p&gt;
&lt;p&gt;NFC Tools Pro
&lt;img src=&quot;https://lter.space/images/image-20240310232531502.png&quot; alt=&quot;image-20240310232531502&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232539840.png&quot; alt=&quot;image-20240310232539840&quot;&gt;&lt;/p&gt;
&lt;p&gt;MCT就是Mifare Classic Tool，它无法自己添加dump，只能用现场读入的标签信息保存后再进行写入或修改，我主要用来读卡后写卡。&lt;/p&gt;
&lt;p&gt;首先，0-5扇区是加密了的，MCT的读取标签需要密钥，写卡也是，但我只有dump文件，没有密钥，&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232553736.png&quot; alt=&quot;image-20240310232553736&quot;&gt;
但有了dump文件就相当于拥有了解密后的卡，按理来说能够从dump里反推出它的密钥。&lt;/p&gt;
&lt;p&gt;所以我找到了NFC Reader Tool Pro，它可以自己写dump，然后通过dump文件自动生成密钥文件，&lt;/p&gt;
&lt;p&gt;当然，写的过程比较痛苦，因为只能在它自己新建的dump文件上修改，改成自己需要的，所以要自己在手机上写那6个扇区的数字。&lt;/p&gt;
&lt;p&gt;最后每个dump文件都生成了一个六行的密钥，再导入到MCT中，此时发现可以成功读卡了。
此时我的手机莫名其妙开始疯狂自动重启，我排除了过热原因，还有电池原因（半个月前刚换），剩下的有可能是电源键问题，因为最近电源键不太灵敏，还有可能是换电池的时候线装的糙了，电池的断触问题，或者主板问题。&lt;/p&gt;
&lt;p&gt;反正无论是什么，都很吓人，于是我当天备份了一遍我的手机数据（后文会极其感谢自己此时备份了一下）。
有了密钥，我就可以用MCT读写我的卡，此时我尝试了两种情况，&lt;/p&gt;
&lt;p&gt;第一就是格式化，实际操作后发现除了0扇区0块，其它都能格式化到出厂状态，也就是这样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232605791.png&quot; alt=&quot;image-20240310232605791&quot;&gt;
之后我用这个卡去图书馆刷卡机上刷了一下，发现还是可以读取，说明图书馆真的只认卡号（或加上厂商码）。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232615875.png&quot; alt=&quot;image-20240310232615875&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232625800.png&quot; alt=&quot;image-20240310232625800&quot;&gt;
第二就是将他的dump文件中除了卡号的部分写入到我的卡中，也就是一个卡里有我的卡号，和解密后他的学号姓名，&lt;/p&gt;
&lt;p&gt;下午去食堂吃饭时刷了一下，发现没有反应，说明食堂消费的读卡机不仅需要卡号，还需要同时验证里边的加密信息。
&lt;img src=&quot;https://lter.space/images/image-20240310232637850.png&quot; alt=&quot;image-20240310232637850&quot;&gt;
&lt;img src=&quot;https://lter.space/images/image-20240310232645467.png&quot; alt=&quot;image-20240310232645467&quot;&gt;&lt;/p&gt;
&lt;p&gt;后来我反应过来，&lt;/p&gt;
&lt;p&gt;既然图书馆只需要卡号，我也有了他的卡号，&lt;/p&gt;
&lt;p&gt;我的手机又是root了的，理论上说我对我的手机具有绝对掌控权，&lt;/p&gt;
&lt;p&gt;所以按理说我可以通过直接修改nfc配置文件的方式，让nfc直接伪装为他的卡号。
但来回改配置文件肯定很麻烦，因为我不止要用他这一个卡，而且同时还需要修改卡的频率之类的，
&lt;img src=&quot;https://lter.space/images/image-20240310232701127.png&quot; alt=&quot;image-20240310232701127&quot;&gt;
所以我开始寻找，有没有能自动化的帮我做好这一切伪装的软件。
有是有，但看起来做的很好的NFC Tools注册就需要49.9，其它的非开源软件大同小异，都是在让我还未确定他们的软件能不能正常工作时就要收我十几块钱，我这人比较抠搜，而且找不到破解版。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232710377.png&quot; alt=&quot;image-20240310232710377&quot;&gt;
后来，我终于发现了一款NFC Card Emulator Pro (root)：NFC卡模拟，它有手动添加卡号再用nfc模拟的功能，当然，需要root权限，谷歌商店6美金，没钱，用的52pojie的版本。&lt;/p&gt;
&lt;p&gt;但无论如何，它都提示我获取不到root权限，而且它并没有给magisk发出弹窗的请求，&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232725353.png&quot; alt=&quot;image-20240310232725353&quot;&gt;
但我看到，我的那些步数修改器和爱玩机工作箱之类的需要root权限的软件都是在正常运行的，magisk也正常，甚至把请求响应改成自动允许也不行，我百思不得其解，于是放弃。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232735014.png&quot; alt=&quot;image-20240310232735014&quot;&gt;
我接着转向寻找开源软件，但它们都是最晚4年前，最早能追溯到7年前的仓库，对于现在的安卓11来说可能太过时了，于是在功能上都出现了一些严重的问题，还有的甚至没有发行版，需要我自己用AndroidStudio构建。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232744665.png&quot; alt=&quot;image-20240310232744665&quot;&gt;
（后期get root access后发现也不能用，且作者多年前看到有比他好的NFC卡模拟pro之后就不再维护了）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232752539.png&quot; alt=&quot;image-20240310232752539&quot;&gt;
这时陷入了僵局，哪个方法都走不通。我就只能去继续学最原始的直接修改libnfc.conf的方法，&lt;/p&gt;
&lt;p&gt;但是直接修改系统的文件，首先你得先找到它，这就需要一个能获取root权限的文件资源管理器，最终选定了MT管理器，真的很好用 ，但是它也无法获取root权限，我就开始怀疑是magisk的问题，&lt;/p&gt;
&lt;p&gt;对于NFC卡模拟那个软件，我也还是不甘心，&lt;/p&gt;
&lt;p&gt;此时我突然看到一个贴吧的帖子，一个人说，要主动给软件授权root的话，可以在爱玩机工具箱里找到应用管理里的唤醒root权限，&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232804770.png&quot; alt=&quot;image-20240310232804770&quot;&gt;
就这么寥寥几句，下边好像只有两个人说他的方法有用，但却解决了我的众多问题，&lt;/p&gt;
&lt;p&gt;正好我也有爱玩机工具箱，上手一试，真的成功了，那两个无法自己获取root权限的软件也在magisk的超级用户栏里出现了对应的按钮。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232814804.png&quot; alt=&quot;image-20240310232814804&quot;&gt;
我大喜过望，我以为现在万事俱备，东风已来，其实路途才刚刚过半。&lt;/p&gt;
&lt;p&gt;在赋权之后，我颤抖的打开了NFC模拟器，输入他的卡号，&lt;/p&gt;
&lt;p&gt;创建成功，yes！
但开始nfc模拟的时候，又出现了一个问题：&lt;/p&gt;
&lt;p&gt;软件提示我的vendor分区无法读写。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232825585.png&quot; alt=&quot;image-20240310232825585&quot;&gt;
也就是说，要读写的nfc配置文件放在vendor分区里，而那个分区我现在依然没有读写的权力。&lt;/p&gt;
&lt;p&gt;于是我需要去找到，让vendor分区能被修改的方法。
&lt;img src=&quot;https://lter.space/images/image-20240310232837432.png&quot; alt=&quot;image-20240310232837432&quot;&gt;&lt;/p&gt;
&lt;p&gt;（此时，刷入magisk卡模块这个方法失败）
&lt;img src=&quot;https://lter.space/images/image-20240310232847093.png&quot; alt=&quot;image-20240310232847093&quot;&gt;&lt;/p&gt;
&lt;p&gt;我没想到，修改vendor分区是一个巨大的难题，网上几乎所有的方法在Android11之后都失效了，所以我按照时间搜索近一年内的解锁vendor教程，只找到了一个看起来可行，且详细教学的帖子，&lt;/p&gt;
&lt;p&gt;出厂安卓11机型解锁system分区教程_安卓11解锁system分区&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/oAiYinSiTan12/article/details/119655706&quot;&gt;https://blog.csdn.net/oAiYinSiTan12/article/details/119655706&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如文中所说，解锁system的原理就是去除vbmeta检验(简称AVB2.0检验)
整体的流程看起来复杂，其实——做起来更复杂，&lt;/p&gt;
&lt;p&gt;总体流程是，将vendor分区提取出来，修改/vendor/etc/fstab.qcom，去除里边的vab选项，打包回去，再刷入手机，&lt;/p&gt;
&lt;p&gt;每一步里都有大大小小的坑。&lt;/p&gt;
&lt;p&gt;提取vendor这一步，我手机上有termux，在termux里安装ubuntu，ubuntu里装上DNA工具，DNA工具的gitee主页的readme文件因为“可能违规”无法显示（离谱），所以需要clone到本地才能查看，&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232907609.png&quot; alt=&quot;image-20240310232907609&quot;&gt;
接着，提取vendor分区的脚本，这里又有坑，就像这个视频教程下面第一个评论&lt;a href=&quot;http://www.bilibili.com/video/BV1xV411n7Ys/&quot;&gt;www.bilibili.com/video/BV1xV411n7Ys/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;“fastboot --disable-verity --disable-verification flash vbmeta vbmeta.img
的缘故，并没有VAB分区，所以脚本里的vender_a/vender_b需要变更成vender，同理 system亦是如此。最后fastbootd刷入vender.img也没有vender_a/vender_b，使用fastboot flash vender vender.img刷入即可。”&lt;/p&gt;
&lt;p&gt;我之前也试着执行过fastboot --disable-verity --disable-verification flash vbmeta vbmeta.img这条命令，和他的情况是一样的，&lt;/p&gt;
&lt;p&gt;但后来我发现，mi10的手机架构好像本来就没有ab分区，所以需要把脚本里的vendor_a改成vendor，后边的fastbootd刷入vendor时也是一样。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232923392.png&quot; alt=&quot;image-20240310232923392&quot;&gt;
下一步修改，要注意我们现在用的DNA分解出来的size.txt不在视频里的地方了，需要自己在那几个文件夹下找一找。&lt;/p&gt;
&lt;p&gt;开始用DNA打包的时候，还要注意，视频里的08是合成img，我们现在clone到的版本改成了06是img，而且下面的命令提示也改变了，最后打包出来的名字也不是vendor_dna.img而是直接的vendor.img，放的目录也变了，也需要自己去找找。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232931612.png&quot; alt=&quot;image-20240310232931612&quot;&gt;
打包之后就可以刷入了，没想到我在这儿出现了严重的岔子，手机变砖了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232939313.png&quot; alt=&quot;image-20240310232939313&quot;&gt;
由于刷入的时候一直提示：Not enough space to resize partition，空间不足，于是我开始删其它的分区，但无论怎么删，还是一直提示空间不足，我渐渐开始急了，&lt;/p&gt;
&lt;p&gt;最后直接fastboot -w，意味着把我所有的用户数据也抹除了，&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310232946373.png&quot; alt=&quot;image-20240310232946373&quot;&gt;
&lt;img src=&quot;https://lter.space/images/image-20240310232956621.png&quot; alt=&quot;image-20240310232956621&quot;&gt;
此时终于能把vendor刷进去了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310233004801.png&quot; alt=&quot;image-20240310233004801&quot;&gt;
但由于我在刷的过程中出了很多奇怪的问题，所以刷入之后重启时，开始自动无限重启。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310233012266.png&quot; alt=&quot;image-20240310233012266&quot;&gt;
后来我又把自己备份的原来的vendor刷了进去，但无力回天，还是在无限重启，所以我决定直接进recovery双清，然后线刷进系统。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310233020510.png&quot; alt=&quot;image-20240310233020510&quot;&gt;
后来，线刷出了问题，找了二十分钟问题之后，发现是我下错了线刷包型号，10pro下成了10...极其低级的错误，但也合理，当时接近一点，我的脑子已经不太转动了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310233031177.png&quot; alt=&quot;image-20240310233031177&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310233038422.png&quot; alt=&quot;image-20240310233038422&quot;&gt;
我又去下载了一个mi10pro对应的包，因为小米社区的链接下得很慢，当时已经一两点了，所以我去别的地方找了一个下的快的（也没快多少），结果解压之后才发现是卡刷包，意味着又下错了，又浪费了5G流量和半小时。&lt;/p&gt;
&lt;p&gt;最后，我终于长了记性，去小米社区下了10pro线刷包，凌晨网很慢，边看古相思曲边等，等了一小时。&lt;/p&gt;
&lt;p&gt;刷入的时候又出了幺蛾子，当时看古相思曲的播放窗口正好挡住了下边的这个选项，默认选项是全部删除并lock，我就直接开始刷入，当我发现的时候，已经刷入了一半了，&lt;/p&gt;
&lt;p&gt;当时一瞬间汗毛直立，头皮发麻，要是刷入之后还重启不了，我还把BL锁又锁上了，那在未解BL锁的情况下想刷机可就难如登天了。&lt;/p&gt;
&lt;p&gt;最后还好刷入之后成功开机了，但同时BL锁被锁上了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310233048251.png&quot; alt=&quot;image-20240310233048251&quot;&gt;
但我还想再刷入一遍修改过的vendor试一试，所以又得打开BL锁，于是又要解锁，还好第一次解锁之后不需要再等168小时，我又开了BL锁，之后又刷入了一遍vendor，这次刷入成功了，手机不再无限重启了。
最初的目标，解锁vendor是为了让NFC模拟器获取修改vendor的权限，&lt;/p&gt;
&lt;p&gt;经过这么一折腾，我的手机恢复到了出厂状态，用户数据也没了，但我在两天前备份了一遍手机，所以再导入。&lt;/p&gt;
&lt;p&gt;重新装完一遍系统之后再模拟，发现又在报错，之前是vendor：read only file，现在的报错变成了No space left on device，但这次，帮助手册中的刷入magisk卡模拟成功了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310233057214.png&quot; alt=&quot;image-20240310233057214&quot;&gt;
最后，在凌晨的将近五点，我终于模拟成功了。&lt;/p&gt;
&lt;h2&gt;&lt;img src=&quot;https://lter.space/images/image-20240310233107013.png&quot; alt=&quot;image-20240310233107013&quot;&gt;&lt;/h2&gt;
&lt;p&gt;你以为是个热血沸腾的good ending？不是的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310233140642.png&quot; alt=&quot;image-20240310233140642&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310233148562.png&quot; alt=&quot;image-20240310233148562&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310233157987.png&quot; alt=&quot;image-20240310233157987&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310233206027.png&quot; alt=&quot;image-20240310233206027&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310233212312.png&quot; alt=&quot;image-20240310233212312&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;hr&gt;
&lt;p&gt;我在一开始就知道，我碰到的这些所有的问题其实几乎都能通过简简单单的一个CUID白卡解决，&lt;/p&gt;
&lt;p&gt;过程中，我也无数次想到，如果有个白卡我就不用绕这么大一个圈子了，&lt;/p&gt;
&lt;p&gt;所以我当时就下单了读卡器，商家赠送ID，UID，CUID，7月31送到。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310233222395.png&quot; alt=&quot;image-20240310233222395&quot;&gt;
但我就是想看看，在送到前的这几天里，我不靠读卡器和空白卡，仅靠现有的资源能不能解决问题。&lt;/p&gt;
&lt;p&gt;虽然我失败了，但结论其实是能，只是我现在已经不想再去探究到底哪里出了问题了。&lt;/p&gt;
&lt;p&gt;但我还是后悔了，因为我耗费了整整两天的时间，如果我手边有个五块钱的白卡，dump写入—导入手机NFC—完成，所有的流程不会超过五分钟。&lt;/p&gt;
&lt;p&gt;为什么过程里我一直不想放弃，因为每一步看起来都像是最后一步——获取了root权限应该就能模拟成功了——vendor重新挂载应该就能成功了——刷入之后应该就能成功了——变砖了，但线刷之后再刷入一遍应该就能成功了......&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;
</content:encoded><category>折腾</category></item><item><title>威联通Nas配置Zerotier自建Planet踩坑记录</title><link>https://lter.space/posts/%E5%A8%81%E8%81%94%E9%80%9ANas%E9%85%8D%E7%BD%AEZerotier%E8%87%AA%E5%BB%BAPlanet%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95/</link><guid isPermaLink="true">https://lter.space/posts/%E5%A8%81%E8%81%94%E9%80%9ANas%E9%85%8D%E7%BD%AEZerotier%E8%87%AA%E5%BB%BAPlanet%E8%B8%A9%E5%9D%91%E8%AE%B0%E5%BD%95/</guid><description>0.用到的东西： 威联通 1，型号：TS 264C 腾讯云服务器 1 Mi10pro 1 Win11 1 1.自建Planet 1.1倒腾一键脚本半天，没成功 主要是看的这个教程： 构建Zerotier私有根服务器(Planet)，实现…</description><pubDate>Tue, 31 Jan 2023 10:41:42 GMT</pubDate><content:encoded>&lt;h2&gt;0.用到的东西：&lt;/h2&gt;
&lt;p&gt;威联通*1，型号：TS-264C&lt;/p&gt;
&lt;p&gt;腾讯云服务器*1&lt;/p&gt;
&lt;p&gt;Mi10pro*1&lt;/p&gt;
&lt;p&gt;Win11*1&lt;/p&gt;
&lt;h2&gt;1.自建Planet&lt;/h2&gt;
&lt;h3&gt;1.1倒腾一键脚本半天，没成功&lt;/h3&gt;
&lt;p&gt;主要是看的这个教程：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/544807922&quot;&gt;构建Zerotier私有根服务器(Planet)，实现比MOON更稳定的内网穿透 - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;系统用了ubuntu18，20，22的LTS版本，都没成功&lt;/p&gt;
&lt;p&gt;除了腾讯的服务器，我还用我另外一个Ucloud的1核2G的试了试，也不行
&lt;img src=&quot;https://lter.space/images/image-20240310224426282.png&quot; alt=&quot;image-20240310224426282&quot;&gt;
中间安装时出现了一个报错，&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;In file included from ../../osdep/OSUtils.cpp:44:
../../osdep/OSUtils.hpp:46:10: fatal error: nlohmann/json.hpp: No such file or directory
  46 | #include &amp;lt;nlohmann/json.hpp&amp;gt;
    |         ^~~~~~~~~~~~~~~~~~~
compilation terminated.
In file included from mkworld.cpp:49:
../../osdep/OSUtils.hpp:46:10: fatal error: nlohmann/json.hpp: No such file or directory
  46 | #include &amp;lt;nlohmann/json.hpp&amp;gt;
    |         ^~~~~~~~~~~~~~~~~~~
compilation terminated.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从网上找的解决办法是&lt;/p&gt;
&lt;p&gt;sudo apt-get install nlohmann-json3-dev&lt;/p&gt;
&lt;p&gt;不报错了，但还是不行&lt;/p&gt;
&lt;p&gt;主要就是卡在这一步&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310224443196.png&quot; alt=&quot;image-20240310224443196&quot;&gt;&lt;/p&gt;
&lt;p&gt;我打开我的页面会显示：服务器未发送任何数据，并且在此之前我是检查过内部防火墙和云服务器控制台防火墙都打开了的。&lt;/p&gt;
&lt;p&gt;所以这个方法在我坐在电脑前坐牢了五六个小时之后终于被pass掉&lt;/p&gt;
&lt;h3&gt;1.2用docker安装&lt;/h3&gt;
&lt;p&gt;我主要成功的方法是这个&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://post.smzdm.com/p/apxkx2m7/&quot;&gt;放弃moon节点，直接搭建Zerotier根服务器&lt;em&gt;软件应用&lt;/em&gt;什么值得买 (smzdm.com)&lt;/a&gt;
结合着这个看&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/573746661&quot;&gt;Zerotier 搭建私有根服务器及创建虚拟局域网完整教程 - 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310224459360.png&quot; alt=&quot;image-20240310224459360&quot;&gt;&lt;/p&gt;
&lt;p&gt;只看到五以前的内容，因为感觉Nas不是正常的linux系统&lt;/p&gt;
&lt;h2&gt;2.威联通Nas安装Zerotier&lt;/h2&gt;
&lt;p&gt;看的这个教程&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/332733170&quot;&gt;高速远程访问NAS——用Zerotier免费实现内网穿透，远程管理NAS中心！- 知乎 (zhihu.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;从这里往下开始看&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310224518496.png&quot; alt=&quot;image-20240310224518496&quot;&gt;&lt;/p&gt;
&lt;p&gt;看到这里结束
&lt;img src=&quot;https://lter.space/images/image-20240310225006482.png&quot; alt=&quot;image-20240310225006482&quot;&gt;&lt;/p&gt;
&lt;p&gt;再回到&lt;/p&gt;
&lt;p&gt;构建Zerotier私有根服务器(Planet)，实现比MOON更稳定的内网穿透 - 知乎 (zhihu.com)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/544807922&quot;&gt;https://zhuanlan.zhihu.com/p/544807922&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这个教程，看linux篇，替换一下planet&lt;/p&gt;
&lt;h5&gt;感觉自己是伞兵的一些操作：&lt;/h5&gt;
&lt;p&gt;几个小时之间记得自己明明能在命令行界面找到.qpkg但用winscp时找不到，最后发现自己没设置显示隐藏文件&lt;/p&gt;
&lt;p&gt;nas的系统找不到service和systemctl命令，我替换planet之后没办法用命令重启zerotier服务，所以我选择在nas的appcenter里停止再重启zerotier，但我猜这样干的话他的服务进程其实也还是没有停止的，即使加入了网络，在网络的后台也看不到设备，于是又在这儿卡了一小时，&lt;/p&gt;
&lt;p&gt;最终解决方法就是直接重启Nas，于是终于能在网络后台发现nas了&lt;/p&gt;
&lt;h2&gt;3.手机安装Zerotier&lt;/h2&gt;
&lt;p&gt;Zerotier 非官方安卓客户端发布：支持自建 Moon 节点 - 知乎 (zhihu.com)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/362884740&quot;&gt;https://zhuanlan.zhihu.com/p/362884740&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;用的这个，大佬不愧是大佬，配置起来极其方便。&lt;/p&gt;
&lt;h2&gt;4.win11安装Zerotier&lt;/h2&gt;
&lt;p&gt;明明按理说应该是最简单的，但我搞了一天多了，还没成功&lt;/p&gt;
&lt;p&gt;安装倒是没问题，但有其他的问题，首先是Node：unknown&lt;/p&gt;
&lt;p&gt;市面上所有解决nodeunknown的方案只有几个，我都试了，没用&lt;/p&gt;
&lt;p&gt;我研究了研究，zerotier会给电脑新建一个虚拟网卡，但我去我的网络适配器里看了看，没有&lt;/p&gt;
&lt;p&gt;运行zerotier的时候也会闪过一个错误&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://lter.space/images/image-20240310225018232.png&quot; alt=&quot;image-20240310225018232&quot;&gt;&lt;/p&gt;
&lt;p&gt;找不到这个文件，我看了看，确实没有，网上说是驱动有问题，我手动安装了那个inf文件，没用，还是没有&lt;/p&gt;
&lt;p&gt;网上说是版本问题，不适配，我下了很多其他版本，也没用。&lt;/p&gt;
&lt;p&gt;不知道是win11的问题还是我电脑的问题
几个小时后来更新：&lt;/p&gt;
&lt;p&gt;看这个，虽然已经装过四五个版本的了，但死马当活马医还是想试一下，于是成功了，nodeid有了&lt;/p&gt;
&lt;p&gt;win11无法正常使用zerotier - 『悬赏问答区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|&lt;a href=&quot;http://www.52pojie.cn&quot;&gt;www.52pojie.cn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.52pojie.cn/thread-1660407-1-1.html&quot;&gt;https://www.52pojie.cn/thread-1660407-1-1.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;装这个之前我卸载了深信服之类的和网卡沾那么一点边的东西，不知道是不是这个问题
&lt;img src=&quot;https://lter.space/images/image-20240310225029560.png&quot; alt=&quot;image-20240310225029560&quot;&gt;&lt;/p&gt;
&lt;p&gt;啊 这就是成功的感觉，运行的时候终于不报错了，看了看安装文件夹里也有zerotier-one.port了，就连在电脑服务里面重启zerotier服务的时候，停止和启动都比原来快超级多。
虽然过程是玄学的，但结果是好的。
ps，这个教程也不错&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://shiruixuan.gitee.io/2022/09/16/docker-zerotier-planet/&quot;&gt;搭建私有 ZeroTier Planet 根服务器（Docker 版） | shiruixuan (gitee.io)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;pss，我为什么不用ipv6？&lt;/p&gt;
&lt;p&gt;家里宽带是移动的，只有ipv4没有ipv6，都说要去光猫后台改，我也想顺便把我家光猫改成桥接模式，昨晚光猫和电脑用网线直连，依然进不去光猫后台，不是用户名密码不对的那种，是拒绝访问或者无响应的那种，并且猫上啥也没写，我觉得移动有可能是直接给用户堵死了这条路，上网一搜在某个论坛发现有人问宽带小哥为啥进不去猫，小哥说现在都改成云防火墙了，他们现在也进不去了，我就放弃了。&lt;/p&gt;
&lt;p&gt;主要是即使用了ipv6，比起zerotier的方案还是有挺多不方便的地方。&lt;/p&gt;
</content:encoded><category>Nas</category></item></channel></rss>