<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Tils on 乐的博客</title><link>https://liujiale.me/til/</link><description>Recent content in Tils on 乐的博客</description><generator>Hugo -- 0.152.2</generator><language>zh-CN</language><copyright>2015-2026 CC BY-NC-ND 4.0</copyright><lastBuildDate>Wed, 08 Apr 2026 06:36:09 +0800</lastBuildDate><atom:link href="https://liujiale.me/til/index.xml" rel="self" type="application/rss+xml"/><item><title>解决 peon-ping 没声音的问题</title><link>https://liujiale.me/til/peon-ping-no-sound-ssh-audio/</link><pubDate>Tue, 07 Apr 2026 16:31:00 +0800</pubDate><guid>https://liujiale.me/til/peon-ping-no-sound-ssh-audio/</guid><description>&lt;h2 id="现象"&gt;现象&lt;/h2&gt;
&lt;p&gt;Claude Code 装了 peon-ping，按照设置本该在 agent 跑完任务、弹权限请求，这些本该有提示音的时候，一点动静都没有。配置看着没问题， &lt;code&gt;enabled: true&lt;/code&gt; ，音量 0.5，peasant 音效包也在。&lt;/p&gt;
&lt;h2 id="排查"&gt;排查&lt;/h2&gt;
&lt;p&gt;先开 debug 日志：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;peon debug on
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 触发一次事件后查看&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;peon logs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;日志里事件确实触发了， &lt;code&gt;category&lt;/code&gt; 也分配对了（ &lt;code&gt;task.complete&lt;/code&gt; 、 &lt;code&gt;input.required&lt;/code&gt; ），声音文件也选好了。但播放那行写着：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;[play] backend=ssh file=PeasantYes1.wav volume=0.5 async=true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;backend=ssh&lt;/code&gt; 。这就是问题所在。&lt;/p&gt;
&lt;h2 id="原因"&gt;原因&lt;/h2&gt;
&lt;p&gt;peon-ping 的 &lt;a href="https://github.com/PeonPing/peon-ping/blob/main/peon.sh#L7-L30"&gt;&lt;code&gt;detect_platform()&lt;/code&gt;&lt;/a&gt; 函数在启动时检查 &lt;code&gt;SSH_CONNECTION&lt;/code&gt; 或 &lt;code&gt;SSH_CLIENT&lt;/code&gt; 环境变量，只要有一个有值就把平台标记为 &lt;code&gt;ssh&lt;/code&gt; 。后续 &lt;a href="https://github.com/PeonPing/peon-ping/blob/main/peon.sh#L272-L354"&gt;&lt;code&gt;play_sound()&lt;/code&gt;&lt;/a&gt; 走 SSH 分支，把音频请求发往 relay（默认 &lt;code&gt;localhost:19998&lt;/code&gt; ），而不是直接调本机的 &lt;code&gt;afplay&lt;/code&gt; 。&lt;/p&gt;</description></item><item><title>1080Ti 驱动在内核升级后罢工</title><link>https://liujiale.me/til/1080ti-driver-fix/</link><pubDate>Tue, 17 Mar 2026 21:41:00 +0800</pubDate><guid>https://liujiale.me/til/1080ti-driver-fix/</guid><description>&lt;p&gt;早上更新系统，晚上 nvidia-smi 就挂了&lt;/p&gt;
&lt;p&gt;homelab 执行完 pacman -Syu 后，系统日志里出现这行：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;failed to generate CDI spec: failed to create device CDI specs: failed to construct device spec generators: failed to initialize NVML: Driver Not Loaded&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;跑 &lt;code&gt;nvidia-smi&lt;/code&gt; 直接报错。一开始以为是简单的模块没加载， &lt;code&gt;modprobe nvidia&lt;/code&gt; 怎么都不行。&lt;/p&gt;
&lt;p&gt;查了一圈发现是内核升级惹的祸 —— 从 6.19.6 到了 6.19.8，而我的 nvidia-580xx-dkms 还停留在 580.119 版本。&lt;/p&gt;
&lt;p&gt;为啥用 yay 装 580 版本？因为 Arch 官方仓库的 nvidia 驱动已经放弃支持 Pascal 架构（GTX 1080 Ti 就是 Pascal）。官方驱动只管 Turing 以后的显卡，老卡只能靠 AUR 社区维护的 &lt;code&gt;nvidia-580xx-dkms&lt;/code&gt; 续命。&lt;/p&gt;
&lt;p&gt;诊断过程很简单：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 检查当前内核版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uname -r
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 6.19.6-zen1-1-zen&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 确认 GPU 存在&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lspci &lt;span class="p"&gt;|&lt;/span&gt; grep -i nvidia
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 01:00.0 VGA compatible controller: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看驱动版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pacman -Q nvidia-580xx-dkms
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# nvidia-580xx-dkms 580.119.02-2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 检查模块是否加载（无输出 = 未加载）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lsmod &lt;span class="p"&gt;|&lt;/span&gt; grep nvidia
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 查看 DKMS 状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dkms status nvidia
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# nvidia/580.119.02: added &amp;lt;- 注意是 added 而非 installed&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;编译日志里的报错很直白（=/var/lib/dkms/nvidia/580.119.02/build/make.log=）：&lt;/p&gt;</description></item><item><title>在 macOS 上编译 带 MPS 支持的 Emacs</title><link>https://liujiale.me/til/emacs-with-mps-support-on-macos/</link><pubDate>Tue, 17 Mar 2026 08:24:00 +0800</pubDate><guid>https://liujiale.me/til/emacs-with-mps-support-on-macos/</guid><description>&lt;p&gt;有两种方式来在 macOS 编译 Emacs：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/d12frosted/homebrew-emacs-plus"&gt;d12frosted/homebrew-emacs-plus&lt;/a&gt; - Homebrew formula，适合日常使用&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jimeh/build-emacs-for-macos"&gt;jimeh/build-emacs-for-macos&lt;/a&gt; - 从源码构建，更灵活&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;IGC (Incremental Garbage Collector)&lt;/strong&gt;&lt;/strong&gt; 是 Emacs 的增量垃圾回收器，基于 &lt;a href="https://www.ravenbrook.com/project/mps/"&gt;Ravenbrook MPS&lt;/a&gt; 实现。相比传统的 stop-the-world GC，IGC 可以显著减少垃圾回收时的停顿时间，提升编辑器响应性。&lt;/p&gt;
&lt;p&gt;目前 IGC 处于实验阶段，在 &lt;code&gt;feature/igc3&lt;/code&gt; 分支开发。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;构建环境：&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;版本&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;macOS&lt;/td&gt;
&lt;td&gt;15.7.3 (Build 24G419)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Xcode&lt;/td&gt;
&lt;td&gt;26.3 (Build 17C529)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ruby&lt;/td&gt;
&lt;td&gt;3.3.4 (arm64-darwin23)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;1.26.1 darwin/arm64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;build-emacs-for-macos&lt;/td&gt;
&lt;td&gt;支持 &lt;code&gt;--igc&lt;/code&gt; 选项&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;构建命令：&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 克隆仓库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/jimeh/build-emacs-for-macos.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; build-emacs-for-macos
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 构建 IGC 分支（需要先安装依赖）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./build-emacs-for-macos --igc feature/igc3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;快速方案&lt;/strong&gt;&lt;/strong&gt; ：如果遇到上述 macOS API 可用性问题，可以直接使用已修复的分支：&lt;/p&gt;</description></item><item><title>RTK：让 Claude Code 少吃点 Token</title><link>https://liujiale.me/til/rtk-token-killer/</link><pubDate>Mon, 16 Mar 2026 23:48:00 +0800</pubDate><guid>https://liujiale.me/til/rtk-token-killer/</guid><description>&lt;h2 id="用-claude-code-写代码的时候-我总觉得它在-浪费粮食"&gt;用 Claude Code 写代码的时候，我总觉得它在&amp;quot;浪费粮食&amp;quot;&lt;/h2&gt;
&lt;p&gt;一个 &lt;code&gt;git status&lt;/code&gt; 就要 2000 tokens，=cargo test= 更是能飙到 25000。这些命令的默认输出确实详细，但大部分时候我只需要知道&amp;quot;改了哪些文件&amp;quot;或&amp;quot;测试有没有通过&amp;quot;，不需要看那些花里胡哨的边框和进度条。&lt;/p&gt;
&lt;p&gt;之前想过在 CLAUDE.md 里写一堆规则，让 Claude 主动用 &lt;code&gt;--porcelain=、&lt;/code&gt;&amp;ndash;oneline= 这些精简标志。但说实话，这有点考验 LLM 的&amp;quot;记性&amp;quot;，有时候它记得，有时候忘，挺不靠谱。&lt;/p&gt;</description></item><item><title>PaperMod 主题一键升级流程</title><link>https://liujiale.me/til/papermod-theme-one-click-upgrade/</link><pubDate>Mon, 16 Mar 2026 22:51:00 +0800</pubDate><guid>https://liujiale.me/til/papermod-theme-one-click-upgrade/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;Hugo 博客使用 PaperMod 主题作为 Git submodule 管理。当主题有更新时，需要手动升级。&lt;/p&gt;
&lt;h2 id="一键升级脚本"&gt;一键升级脚本&lt;/h2&gt;
&lt;p&gt;创建脚本 &lt;code&gt;scripts/upgrade-papermod.sh&lt;/code&gt; ：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&lt;/span&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -euo pipefail
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 颜色输出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GREEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\033[0;32m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;YELLOW&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\033[1;33m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;RED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\033[0;31m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\033[0m&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;log_info&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GREEN&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;[INFO]&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NC&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;log_warn&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;YELLOW&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;[WARN]&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NC&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;log_error&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RED&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;[ERROR]&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NC&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 检查是否在项目根目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -f &lt;span class="s2"&gt;&amp;#34;config.yml&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -d &lt;span class="s2"&gt;&amp;#34;content&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; log_error &lt;span class="s2"&gt;&amp;#34;请在项目根目录执行此脚本&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;log_info &lt;span class="s2"&gt;&amp;#34;开始升级 PaperMod 主题...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 显示版本信息&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;log_info &lt;span class="s2"&gt;&amp;#34;当前版本:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git -C themes/PaperMod log -1 --oneline
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;log_info &lt;span class="s2"&gt;&amp;#34;待更新版本:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git -C themes/PaperMod log origin/master -1 --oneline
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;log_info &lt;span class="s2"&gt;&amp;#34;待更新提交:&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git -C themes/PaperMod log HEAD..origin/master --oneline
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 更新 submodule&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git -C themes/PaperMod fetch origin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git -C themes/PaperMod checkout master
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git -C themes/PaperMod merge origin/master
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 验证更新&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;log_info &lt;span class="s2"&gt;&amp;#34;新版本: &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;git -C themes/PaperMod rev-parse --short HEAD&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 测试构建&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;log_info &lt;span class="s2"&gt;&amp;#34;测试构建...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; hugo --gc --minify --cleanDestinationDir --quiet&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; log_info &lt;span class="s2"&gt;&amp;#34;构建成功!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; log_error &lt;span class="s2"&gt;&amp;#34;构建失败！&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;log_info &lt;span class="s2"&gt;&amp;#34;升级完成!&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="执行升级"&gt;执行升级&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 赋予执行权限&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod +x scripts/upgrade-papermod.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 执行升级&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./scripts/upgrade-papermod.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="提交更改"&gt;提交更改&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add themes/PaperMod
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;chore: upgrade PaperMod theme&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="启用-llms-dot-txt-可选"&gt;启用 llms.txt（可选）&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;config.yml&lt;/code&gt; 中添加：&lt;/p&gt;</description></item><item><title>WebStorm 在 macOS 15.7.3 显示器切换时崩溃的解决方案</title><link>https://liujiale.me/til/2026-02-01-webstorm-crash-fix/</link><pubDate>Sun, 01 Feb 2026 22:24:00 +0800</pubDate><guid>https://liujiale.me/til/2026-02-01-webstorm-crash-fix/</guid><description>&lt;h2 id="问题描述"&gt;问题描述&lt;/h2&gt;
&lt;p&gt;WebStorm 在运行约 1.5 小时后崩溃，错误日志显示：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SIGABRT (0x6) at pc=0x000000019fd3a388, pid=82249, tid=259
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Problematic frame: C [libsystem_kernel.dylib+0x9388] __pthread_kill+0x8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NSApplicationReactToScreenInvalidation&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这是 JBR-9927 已知 bug，在 macOS 15.7.3 显示器重配置时触发。&lt;/p&gt;
&lt;h2 id="解决方案"&gt;解决方案&lt;/h2&gt;
&lt;p&gt;禁用 Metal 渲染，在 &lt;code&gt;Help | Edit Custom VM Options&lt;/code&gt; 添加：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-properties" data-lang="properties"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;-Dsun.java2d.metal&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;false&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="参考链接"&gt;参考链接&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtrack.jetbrains.com/issues/JBR-9927"&gt;https://youtrack.jetbrains.com/issues/JBR-9927&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://intellij-support.jetbrains.com/hc/en-us/community/posts/24632437221906"&gt;https://intellij-support.jetbrains.com/hc/en-us/community/posts/24632437221906&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>选择适合自己饲养的蚂蚁品种</title><link>https://liujiale.me/til/choose-suitable-ant-species-for-raising/</link><pubDate>Tue, 23 Dec 2025 09:48:00 +0800</pubDate><guid>https://liujiale.me/til/choose-suitable-ant-species-for-raising/</guid><description>&lt;h2 id="快速选择"&gt;快速选择&lt;/h2&gt;
&lt;p&gt;根据自己的条件和喜好来选择饲养的蚂蚁品种&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;graph TD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Start([开始测试]) --&amp;gt; Q1[问题一：体型偏好？]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Q1 --&amp;gt;|A. 体型越大越好| Q2[问题二：饲料接受度？]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Q1 --&amp;gt;|B. 团结但体型适中| Q3[问题三：颜色偏好？]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Q1 --&amp;gt;|C. 团队协作最重要| Q4[问题四：工蚁形态？]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Q2 --&amp;gt;|A. 不养活体饲料| A1[工匠收获蚁]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Q2 --&amp;gt;|B. 可养面包虫| A4[红足修猛蚁]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Q2 --&amp;gt;|C. 接受活体饲料| Q5[饲料类型细分？]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Q3 --&amp;gt;|A. 灰黑色| A3[日本弓背蚁]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Q3 --&amp;gt;|B. 黄/橙色| A2[尼科巴弓背蚁]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Q4 --&amp;gt;|A. 工蚁单型| A6[铺道蚁]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Q4 --&amp;gt;|B. 工蚁多型| Q6[食性偏好？]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Q5 --&amp;gt;|A. 仅面包虫| A4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Q5 --&amp;gt;|B. 蟋蟀/蟑螂| A7[猎镰猛蚁]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Q6 --&amp;gt;|A. 草籽/水果| A1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Q6 --&amp;gt;|B. 杂食性| A5[大头蚁]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; A4 -.-&amp;gt;|北方警告| Note1[螫针危险！需专业防护]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; A7 -.-&amp;gt;|北方警告| Note2[需恒温环境]
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; classDef question fill:#f0f5ff,stroke:#597ef7,stroke-width:2px
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; classDef answer fill:#e6f7ff,stroke:#1890ff,stroke-width:2px
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; classDef note fill:#fffbe6,stroke:#faad14,dashed
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; class Q1,Q2,Q3,Q4,Q5,Q6 question
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; class A1,A2,A3,A4,A5,A6,A7 answer
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; class Note1,Note2 note
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; linkStyle 14,15 stroke:#faad14,stroke-width:2px,stroke-dasharray:5 5&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;figure class="content-figure "&gt;
&lt;img src="https://liujiale.me/til/choose-suitable-ant-species-for-raising/ant-choose.svg" alt="" loading="lazy"&gt;
&lt;/figure&gt;
&lt;p&gt;总的来说新手选收获蚁是最简单的，我选择的是工匠收获蚁。&lt;/p&gt;</description></item><item><title>让 CLAUDE CODE 使用 GLM4.6 等其他模型</title><link>https://liujiale.me/til/let-claude-code-use-other-models-glm46-and-more/</link><pubDate>Mon, 22 Dec 2025 11:23:00 +0800</pubDate><guid>https://liujiale.me/til/let-claude-code-use-other-models-glm46-and-more/</guid><description>&lt;h2 id="安装-claude-code"&gt;安装 CLAUDE CODE&lt;/h2&gt;
&lt;p&gt;macOS 上使用 Homebrew 安装&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install --cask claude-code&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;在 Linux 上使用安装脚本安装&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://claude.ai/install.sh &lt;span class="p"&gt;|&lt;/span&gt; bash&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;详细安装文档&lt;/p&gt;
&lt;p&gt;&lt;a href="https://code.claude.com/docs/en/overview"&gt;https://code.claude.com/docs/en/overview&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="手动切换模型"&gt;手动切换模型&lt;/h2&gt;
&lt;h3 id="编辑-claude-配置文件"&gt;编辑 CLAUDE 配置文件&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;编辑或新增 Claude Code 配置文件 `~/.claude/settings.json`&lt;/li&gt;
&lt;li&gt;新增或修改里面的 ENV 字段&lt;/li&gt;
&lt;li&gt;注意替换里面的 `your_zhipu_api_key` 为您上一步获取到的 API Key&lt;/li&gt;
&lt;/ul&gt;
&lt;!--listend--&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;env&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ANTHROPIC_AUTH_TOKEN&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;your_zhipu_api_key&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;ANTHROPIC_BASE_URL&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;https://open.bigmodel.cn/api/anthropic&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;API_TIMEOUT_MS&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;3000000&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC&amp;#34;&lt;/span&gt;: &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3 id="解决无法连接到-anthropic-service-的问题"&gt;解决无法连接到 Anthropic Service 的问题&lt;/h3&gt;
&lt;p&gt;~/.claude.json&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;hasCompletedOnboarding&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="自动切换模型"&gt;自动切换模型&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;使用 Claude Code Router&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/musistudio/claude-code-router"&gt;https://github.com/musistudio/claude-code-router&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g @musistudio/claude-code-router&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;配置 alias 快速启动，我使用 fnm 来管理 Node.js 版本&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;claude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ENABLE_IDE_INTEGRATION=t &amp;amp;&amp;amp; CLAUDE_CODE_SSE_PORT=123456 &amp;amp;&amp;amp; fnm use v22 &amp;amp;&amp;amp; eval &amp;#34;$(ccr activate)&amp;#34; &amp;amp;&amp;amp; fnm exec --using=v22 claude --dangerously-skip-permissions&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;启动 Claude Code Router 的管理界面&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ccr ui&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;CC Mate&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/djyde/ccmate"&gt;https://github.com/djyde/ccmate&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install --cask djyde/brew/ccmate&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="模型及模型提供商选择"&gt;模型及模型提供商选择&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;OpenRouter：&lt;a href="https://openrouter.ai/"&gt;https://openrouter.ai/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>米家空调伴侣 2 无法连接 Wi-Fi</title><link>https://liujiale.me/til/mihome-air-conditioner-remote-2-cannot-connect-to-wi-fi/</link><pubDate>Wed, 24 Sep 2025 23:05:00 +0800</pubDate><guid>https://liujiale.me/til/mihome-air-conditioner-remote-2-cannot-connect-to-wi-fi/</guid><description>&lt;h2 id="tl-dr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;是加密方式的问题，米家空调伴侣 2 只支持 WPA (这一点存疑，因为我的更早版本的空调伴侣连现在的 Wi-Fi 用 好好的)，而我之前设置的是 WPA2-PSK 和 WPA3-PSK。&lt;/p&gt;
&lt;p&gt;需要降级到支持 WPA-PSK 加密，尽管这引入了额外的安全风险。&lt;/p&gt;
&lt;figure class="content-figure "&gt;
&lt;a href="https://liujiale.me/til/mihome-air-conditioner-remote-2-cannot-connect-to-wi-fi/20250924-224526_screenshot_hu_dcb2f23b12a2c052.webp" data-fancybox="gallery" data-caption=""&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://liujiale.me/til/mihome-air-conditioner-remote-2-cannot-connect-to-wi-fi/20250924-224526_screenshot_hu_f6e59a2f91024b68.webp 400w, https://liujiale.me/til/mihome-air-conditioner-remote-2-cannot-connect-to-wi-fi/20250924-224526_screenshot_hu_f0284701ccc18cb6.webp 720w, https://liujiale.me/til/mihome-air-conditioner-remote-2-cannot-connect-to-wi-fi/20250924-224526_screenshot_hu_dcb2f23b12a2c052.webp 1200w" sizes="(max-width: 720px) 100vw, 720px" /&gt;
&lt;img loading="lazy"
src="https://liujiale.me/til/mihome-air-conditioner-remote-2-cannot-connect-to-wi-fi/20250924-224526_screenshot.png"
alt=""
width="720"
height="358"
/&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;p&gt;有网友发现仅仅修改现有接入点的加密方式还不够，需要新建一个新的 AP 才行。&lt;/p&gt;
&lt;p&gt;我没有碰到这个问题，直接修改就可以了。&lt;/p&gt;
&lt;h2 id="引申"&gt;引申&lt;/h2&gt;
&lt;p&gt;如何做到 Wi-Fi 安全？&lt;/p&gt;
&lt;p&gt;列举 Wi-Fi 加密方式&lt;/p&gt;
&lt;p&gt;隐藏 SSID 能够提升安全性吗&lt;/p&gt;
&lt;p&gt;客户端隔离&lt;/p&gt;
&lt;p&gt;Wi-Fi 漫游的功能和设置&lt;/p&gt;
&lt;p&gt;物联网 Wi-Fi&lt;/p&gt;
&lt;p&gt;网桥&lt;/p&gt;
&lt;p&gt;如何设置透明代理&lt;/p&gt;</description></item><item><title>虚拟拨号的实现流程</title><link>https://liujiale.me/til/virtual-dialing-implementation-process/</link><pubDate>Mon, 25 Aug 2025 14:13:00 +0800</pubDate><guid>https://liujiale.me/til/virtual-dialing-implementation-process/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;虚拟拨号一般是指通过一个第三方的号码实现 用户 A 和 A 用户 B 之间的通讯，使双方不必知道对方的号码就可以建立通讯。起到了保护双方用户隐私和企业机密数据保障的作用。&lt;/p&gt;
&lt;p&gt;常见使用场景是网约车打车和外卖，此时保护的是乘客和用户的隐私。&lt;/p&gt;
&lt;p&gt;另一个场景是房地产销售等企业客户数据的保护，一些机密的号码不能直接交给销售，以防止客户流失。&lt;/p&gt;
&lt;p&gt;还有一个比较小众的场景是类似小号的产品，用户使用小号来拨打其他号码、接收短信，但是这种用法并非本文需要讨论的场景。&lt;/p&gt;</description></item><item><title>让 AI 模仿 linus 谈生物节律</title><link>https://liujiale.me/til/let-ai-mimic-linus-talk-about-biological-rhythms/</link><pubDate>Thu, 21 Aug 2025 11:48:00 +0800</pubDate><guid>https://liujiale.me/til/let-ai-mimic-linus-talk-about-biological-rhythms/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;最近比较忙，基本全天没有摸鱼时间，有时候还会牺牲睡眠时间来干活。尽管内心知道这样做是不可持续的，却仍然会下意识的去做。&lt;/p&gt;
&lt;p&gt;也许需要想办法来警醒自己。&lt;/p&gt;
&lt;h2 id="claude-的回复"&gt;Claude 的回复&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;时间置换？这 TM 就是基本的生物节律常识！&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;听着，你们这些人总是把简单的事情搞得像什么哲学一样。什么&amp;quot;像风一样流动&amp;quot;——这就是任何一个不是完全白痴的人都应该知道的基本作息管理。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;困了就睡？&lt;/strong&gt;&lt;/strong&gt; 当然困了就睡！你以为你是机器吗？人类大脑在疲劳状态下的代码质量就像屎一样。我宁愿你睡 8 小时然后写出干净的代码，也不要你熬夜写出一堆需要我后来修复的垃圾。&lt;/p&gt;</description></item><item><title>为什么很多人会攒自己的 Emacs 配置？</title><link>https://liujiale.me/til/why-many-people-will-save-their-emacs-configuration/</link><pubDate>Mon, 18 Aug 2025 14:37:00 +0800</pubDate><guid>https://liujiale.me/til/why-many-people-will-save-their-emacs-configuration/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;我大概从 2020 年开始使用 Doom Emacs，但是在今天之前从来没有想过要攒一套自己的 Emacs 配置。原因有很多，主要考虑到没有足够的时间，而且自己攒的未必能比一些发行版做得更好。&lt;/p&gt;
&lt;p&gt;但是最近我开始重新考虑这件事情，因此记录下来自己的一些想法。&lt;/p&gt;
&lt;h2 id="为什么"&gt;为什么&lt;/h2&gt;
&lt;p&gt;我发现自己对 Emacs 本身缺乏理解。我的快捷键是 evil + general + 原生 Emacs 混合起来的，我配置包的方式是 Doom Emacs 在 straght.el 的基础上封装的，并且很多包经过了发行版内部调整，用了很多私有变量和方法。&lt;/p&gt;
&lt;p&gt;如果不去看源码，我是不知道他们是如何配置出来的，面对茫茫多的快捷键组合，我也不知道哪些是我需要的，哪些是“我不知道的”。&lt;/p&gt;</description></item><item><title>站点大扫除：提升博客首页的信息质量</title><link>https://liujiale.me/til/improve-the-information-quality-of-the-blog-homepage/</link><pubDate>Thu, 14 Aug 2025 15:03:00 +0800</pubDate><guid>https://liujiale.me/til/improve-the-information-quality-of-the-blog-homepage/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;首页一般是读者进来之后看到最多的一个页面，我希望它能够承载一些长文、精选文章。希望首页的更新频率能够低一点，但是质量高一点。&lt;/p&gt;
&lt;p&gt;那么 TIL（Today I Learned ）栏目就不大适合放在首页了。因为其范围比较杂乱，内容有的长短不一，质量层次不齐。&lt;/p&gt;
&lt;p&gt;那么本文章就讨论如何让 TIL Section 的文章不出现在整个站点的 RSS &lt;code&gt;/inde.xml&lt;/code&gt; ，但不影响 TIL section 本身的 RSS 生成。&lt;/p&gt;
&lt;h2 id="现有研究"&gt;现有研究&lt;/h2&gt;
&lt;h3 id="papermod-主题讨论"&gt;PaperMod 主题讨论&lt;/h3&gt;
&lt;p&gt;我先搜索了一番 PaperMod 主题中有没有现成可用的配置。发现有相关讨论&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/search?q=repo:adityatelange/hugo-PaperMod&amp;#43;exclude&amp;#43;&amp;amp;type=discussions"&gt;https://github.com/search?q=repo:adityatelange/hugo-PaperMod+exclude+&amp;type=discussions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;其中一篇：&lt;a href="https://github.com/adityatelange/hugo-PaperMod/discussions/1188"&gt;Best way to exclude a group of posts from home page · adityatelange/hugo-PaperMod · Discussion #1188&lt;/a&gt;&lt;/p&gt;</description></item><item><title>低成本爱好</title><link>https://liujiale.me/til/low-cost-hobbies/</link><pubDate>Wed, 13 Aug 2025 19:15:00 +0800</pubDate><guid>https://liujiale.me/til/low-cost-hobbies/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;指的是金钱低成本，时间精力成本可不低。因为真正的快乐，一定是一个创造学习的过程，所以时间精力上的付出，是不可避免的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="常见的低成本爱好"&gt;常见的低成本爱好&lt;/h2&gt;
&lt;p&gt;这里列出了一些，看起来会有用的爱好。没用的爱好比如“躺屋顶看星星”就没列出来了&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;编程、英语、数学的技能组合：人们说这是一个能够相辅相成，实现效果叠加的爱好，而且有用。&lt;/li&gt;
&lt;li&gt;写作：跟上面的编程、英语、数学，可以说是打工人技能套餐了。不过观察下来属于每个人都想要但是又不想花精力的技能&lt;/li&gt;
&lt;li&gt;打游戏：低成本，一个游戏便宜的一百块不到，贵的两百块。但是可以玩一年。&lt;/li&gt;
&lt;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;</description></item><item><title>Sketch MeaXure 工程流程图文档</title><link>https://liujiale.me/til/sketch-measure-engineering-flowchart-document/</link><pubDate>Wed, 13 Aug 2025 18:55:00 +0800</pubDate><guid>https://liujiale.me/til/sketch-measure-engineering-flowchart-document/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;最近在看 Sketch 设计稿标注插件，Sketch MeaXure 是其中比较经典的一款。&lt;/p&gt;
&lt;p&gt;他是在多个版本的基础上迭代开发的，目前维护的仓库是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gitea：&lt;a href="https://gitee.com/hubzyy/sketch-meaxure"&gt;https://gitee.com/hubzyy/sketch-meaxure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub：&lt;a href="https://github.com/hubzy/sketch-meaxure"&gt;https://github.com/hubzy/sketch-meaxure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：出场有 Claude Code&lt;/p&gt;
&lt;h2 id="谱系"&gt;谱系&lt;/h2&gt;
&lt;figure class="content-figure "&gt;
&lt;a href="https://liujiale.me/til/sketch-measure-engineering-flowchart-document/overall-history_hu_8cf6d93800e66557.webp" data-fancybox="gallery" data-caption=""&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://liujiale.me/til/sketch-measure-engineering-flowchart-document/overall-history_hu_8cf6d93800e66557.webp 400w" sizes="(max-width: 720px) 100vw, 720px" /&gt;
&lt;img loading="lazy"
src="https://liujiale.me/til/sketch-measure-engineering-flowchart-document/overall-history.png"
alt=""
width="720"
height="961"
/&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href="#d41d8c"&gt;sketch 插件开发&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最开始是&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/utom/sketch-measure"&gt;https://github.com/utom/sketch-measure&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;后续维护版本&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/qjebbs/sketch-meaxure"&gt;https://github.com/qjebbs/sketch-meaxure&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;又没有维护了，因此后续有人 fork 了再继续维护&lt;/p&gt;
&lt;p&gt;这个 fork 版本一开始在 GitHub&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/hubzy/sketch-meaxure"&gt;https://github.com/hubzy/sketch-meaxure&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;后面不知道为啥搬到了 gitee&lt;/p&gt;
&lt;p&gt;&lt;a href="https://gitee.com/hubzyy/sketch-meaxure"&gt;https://gitee.com/hubzyy/sketch-meaxure&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后还有一个 fork 版本：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/firsthubgit/sketch-meaxure"&gt;https://github.com/firsthubgit/sketch-meaxure&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="工程概述"&gt;工程概述&lt;/h2&gt;
&lt;p&gt;Sketch MeaXure 是一个基于 TypeScript 开发的 Sketch 插件，用于设计规范标注和导出。该插件在原 Sketch Measure 基础上进行了优化升级，提供了更丰富的标注功能和更友好的导出体验。&lt;/p&gt;</description></item><item><title>拯救工作中燃尽状态的七个建议</title><link>https://liujiale.me/til/saving-workplace-burnout-seven-suggestions/</link><pubDate>Thu, 07 Aug 2025 17:22:00 +0800</pubDate><guid>https://liujiale.me/til/saving-workplace-burnout-seven-suggestions/</guid><description>&lt;p&gt;最近读到博主的几个建议，我尝试从中提取出关键点.&lt;/p&gt;
&lt;p&gt;原文：&lt;a href="https://www.kawabangga.com/posts/7005"&gt;Burn out 逃生指南 | 卡瓦邦噶！&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提升工作效率，而非延长工作时间&lt;/li&gt;
&lt;li&gt;安排工作的优先级和时间&lt;/li&gt;
&lt;li&gt;推进大项目时需要记录工作日志&lt;/li&gt;
&lt;li&gt;用异步的方式来使用即时通讯软件&lt;/li&gt;
&lt;li&gt;每周日安排下一周的工作计划&lt;/li&gt;
&lt;li&gt;每天专注于至少完成一件事情&lt;/li&gt;
&lt;li&gt;不要完全放弃长期有收益的事情&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;想法：&lt;/p&gt;
&lt;p&gt;我觉得这是一个很难避免，非常常见，长期来看影响职业发展和生活质量的事情。&lt;/p&gt;
&lt;p&gt;我自己也偶尔会有这种情况，失眠、花费很多精力在工作上，外表看起来不知疲倦，实则身心俱疲。&lt;/p&gt;</description></item><item><title>Claude Code 搭配 Kimi k2 使用</title><link>https://liujiale.me/til/claude-code-kimi-k2-/</link><pubDate>Fri, 25 Jul 2025 14:25:00 +0800</pubDate><guid>https://liujiale.me/til/claude-code-kimi-k2-/</guid><description>&lt;p&gt;目前跟 Claude Code 搭配比较好的是 Kimi k2&lt;/p&gt;
&lt;h2 id="为什么"&gt;为什么&lt;/h2&gt;
&lt;p&gt;为什么使用 Kimi K2&lt;/p&gt;
&lt;p&gt;因为相比 Claude Pro 的订阅价格，Kimi k2 效果不错，而且还便宜。&lt;/p&gt;
&lt;h2 id="获取-kimi-的-api-访问-key"&gt;获取 Kimi 的 API 访问 Key&lt;/h2&gt;
&lt;p&gt;这里是中国境内端口：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://platform.moonshot.cn/console/account"&gt;Moonshot AI 开放平台 - Kimi 大模型 API 服务&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;注册之后有 15 元的赠送金，但是有并发数的限制，需要至少充值 50 元才能正常使用。&lt;/p&gt;
&lt;h2 id="配置-claude-code-使用自定义的-api"&gt;配置 Claude Code 使用自定义的 API&lt;/h2&gt;
&lt;p&gt;将以下内容添加到 .zshrc 文件中，并且关闭再重新打开终端，或者 &lt;kbd&gt;source ~/.zshrc&lt;/kbd&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-xxxxxxxx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.moonshot.cn/anthropic&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;当然也可以用境外端口&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ANTHROPIC_AUTH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk-xxxxxx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ANTHROPIC_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.moonshot.ai/anthropic&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;安装 Claude Code&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g @anthropic-ai/claude-code&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后启动 Claude Code&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="使用"&gt;使用&lt;/h2&gt;
&lt;p&gt;参考了以下文章：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://platform.moonshot.cn/docs/guide/agent-support#%E9%AA%8C%E8%AF%81%E5%AE%89%E8%A3%85-1"&gt;在 software agents 中使用 kimi k2 模型 - Moonshot AI - 开放平台&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/engineering/claude-code-best-practices"&gt;Claude Code Best Practices \ Anthropic&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Anki 为什么不流行？</title><link>https://liujiale.me/til/anki-why-not-popular/</link><pubDate>Tue, 22 Jul 2025 09:16:00 +0800</pubDate><guid>https://liujiale.me/til/anki-why-not-popular/</guid><description>&lt;h2 id="总结不流行的原因"&gt;总结不流行的原因&lt;/h2&gt;
&lt;p&gt;Anki 不仅仅用于死记硬背，同时可以增强理解，因为理解其实是记忆的一部分。但是为什么 Anki 不流行？&lt;/p&gt;
&lt;p&gt;原因可能是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;好的东西未必流行。&lt;/li&gt;
&lt;li&gt;有使用门槛&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;具体而言：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用成本高。Anki 软件的设计比较复杂，需要安装一些插件，如何创建卡片都需要研究不少社区文章才能掌握。&lt;/li&gt;
&lt;li&gt;容易用错方法。因为其复杂，就容易用错。这类工具想用得好有难度，但是用得不好则很容易&lt;/li&gt;
&lt;li&gt;需要长期使用。人们喜欢短期恶补，而不是 Anki 这种需要长期分散复习的方法&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="相关讨论"&gt;相关讨论&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://augmentingcognition.com/ltm.html"&gt;https://augmentingcognition.com/ltm.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;中文翻译：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://readit.vip/a/npBn7"&gt;增强长期记忆&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.reddit.com/r/Anki/comments/1in4jo5/why_do_so_little_people_use_anki_despite_how/"&gt;Why do so little people use anki despite how effective it obviously is : r/Anki&lt;/a&gt;&lt;/p&gt;</description></item><item><title>总结基于 Agent 的 AI 编程工具</title><link>https://liujiale.me/til/summary-of-agent-based-ai-programming-tools/</link><pubDate>Tue, 22 Jul 2025 08:31:00 +0800</pubDate><guid>https://liujiale.me/til/summary-of-agent-based-ai-programming-tools/</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/claude-code"&gt;Claude Code: Deep coding at terminal velocity \ Anthropic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursor.com/agents"&gt;Cursor - The AI Code Editor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.augmentcode.com/"&gt;Augment Code - AI coding platform for real software.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kiro.dev/"&gt;Kiro: The AI IDE for prototype to production&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/features/copilot"&gt;GitHub Copilot · Your AI pair programmer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>饲养一群工匠收获蚁</title><link>https://liujiale.me/til/raising-a-group-of-craftsmen-harvesting-ants/</link><pubDate>Mon, 14 Jul 2025 23:23:00 +0800</pubDate><guid>https://liujiale.me/til/raising-a-group-of-craftsmen-harvesting-ants/</guid><description>&lt;h2 id="介绍"&gt;介绍&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;工匠收获蚁的学名是 Messor structor。﻿&lt;/p&gt;
&lt;p&gt;工匠收获蚁是收获蚁属（Messor）的一种，属于切叶蚁亚科。它们以收集和储存种子而闻名，是切叶蚁亚科中常见的一种蚂蚁。﻿&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="为什么"&gt;为什么&lt;/h2&gt;
&lt;p&gt;因为养起来简单又省事，一周打理一次就行，甚至可以挂机（也就是放好水和食物后可以较长时间不管）。&lt;/p&gt;
&lt;p&gt;蚂蚁是一种真社会性生物，在小小的盒子里能够看到成百上千的小蚂蚁在活动，就觉得充满了大自然的神奇。&lt;/p&gt;
&lt;p&gt;蚂蚁属于长寿昆虫，工蚁寿命长达两三年左右，蚁后寿命可达 10 年以上。&lt;/p&gt;</description></item><item><title>程序员在技术领域的打怪升级圣杯有哪些？</title><link>https://liujiale.me/til/programmer-in-the-technical-field-monster-upgrade-grail/</link><pubDate>Fri, 06 Jun 2025 08:51:00 +0800</pubDate><guid>https://liujiale.me/til/programmer-in-the-technical-field-monster-upgrade-grail/</guid><description>&lt;h2 id="介绍"&gt;介绍&lt;/h2&gt;
&lt;p&gt;我会日常与 LLM 对话交流，并将一些有趣的内容整理到 TIL（Today I Learned）栏目中。&lt;/p&gt;
&lt;p&gt;工作近十年来，我发现自己的技术视野逐渐局限在 Web 开发领域。无论是前端的 JavaScript、CSS，还是使用 Taro 开发跨端应用，抑或是用 Node.js 构建后端服务和命令行工具，这些技术栈其实只是计算机科学的冰山一角。&lt;/p&gt;
&lt;p&gt;我希望能够拓宽视野，深入了解程序员在整个技术生态中的更多可能性。我想探索各个细分领域，发现除了传统的&amp;quot;Web 开发&amp;quot;岗位之外，还有哪些技术方向值得我去尝试和发展。&lt;/p&gt;</description></item><item><title>关于 Screeps: World 链接索引</title><link>https://liujiale.me/til/about-screeps-world-link-index/</link><pubDate>Sun, 18 May 2025 16:02:00 +0800</pubDate><guid>https://liujiale.me/til/about-screeps-world-link-index/</guid><description>&lt;h2 id="介绍"&gt;介绍&lt;/h2&gt;
&lt;p&gt;这游戏应该叫：Screeps: World，后面出了一个
MMO sandbox game for programmers&lt;/p&gt;
&lt;p&gt;是一个使用真实的编程语言，来控制单位和殖民地的一个游戏&lt;/p&gt;
&lt;p&gt;这个游戏主要靠时间和程序的效率来取胜。&lt;/p&gt;
&lt;h2 id="官网文档"&gt;官网文档&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;官网：&lt;a href="https://screeps.com/"&gt;https://screeps.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;英文文档：&lt;a href="https://docs.screeps.com/"&gt;https://docs.screeps.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Steam 商店页面：&lt;a href="https://store.steampowered.com/app/464350/Screeps_World/"&gt;https://store.steampowered.com/app/464350/Screeps_World/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="社区资源"&gt;社区资源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Screeps World 的玩家数量：&lt;a href="https://steamcharts.com/app/464350"&gt;https://steamcharts.com/app/464350&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Screeps Arena 的玩家数量：&lt;a href="https://steamcharts.com/app/1137320"&gt; Screeps: Arena - Steam Charts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;中文文档：&lt;a href="https://screeps-cn.github.io/"&gt;https://screeps-cn.github.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;中文 API 索引：&lt;a href="https://screeps-cn.github.io/api/"&gt;https://screeps-cn.github.io/api/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;研究 Screeps 技术的作者：&lt;a href="https://www.jianshu.com/u/02d597cfe36b"&gt;https://www.jianshu.com/u/02d597cfe36b&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;非常好的 Screeps 教程中文目录：&lt;a href="https://www.jianshu.com/p/5431cb7f42d3"&gt;https://www.jianshu.com/p/5431cb7f42d3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Steam 用户的入门教程： &lt;a href="https://steamcommunity.com/id/aopika/recommended/464350/"&gt;https://steamcommunity.com/id/aopika/recommended/464350/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;极简的新手教程，能够帮助理解游戏机制：&lt;a href="https://github.com/Tim-Pohlmann/Screeps-Nooby-Guide"&gt;https://github.com/Tim-Pohlmann/Screeps-Nooby-Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="代码资源"&gt;代码资源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;脚手架工程，包含了用于编写 Screeps 代码的一切： &lt;a href="https://github.com/screepers/screeps-typescript-starter"&gt;https://github.com/screepers/screeps-typescript-starter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Screeps Plus 包含 Creep 计算器、房屋计算器： &lt;a href="https://screepspl.us/services/creep-calculator/"&gt;https://screepspl.us/services/creep-calculator/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="建议"&gt;建议&lt;/h2&gt;
&lt;p&gt;建议自己玩，不要加入任何群组，有问题查文档，问 AI。&lt;/p&gt;</description></item><item><title>使用 gptel 帮助生成博客的 url</title><link>https://liujiale.me/til/using-gptel-to-generate-blog-urls/</link><pubDate>Tue, 06 May 2025 23:42:00 +0800</pubDate><guid>https://liujiale.me/til/using-gptel-to-generate-blog-urls/</guid><description>&lt;p&gt;&lt;strong&gt;背景：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;经常需要写博客，又期望定制一个符合博文主题的 url，以前是自己去 Google translate 翻译然后改成 slug 格式（全小写，连字符连接）。&lt;/p&gt;
&lt;p&gt;像这篇文章的格式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;using-gptel-to-generate-blog-urls&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;现在有 llm 之后，会开一个 deepseek 的网页或者 ChatGPT 的网页，设置基础 prompt，然后就将中文的文章名称发给它，让他给出对应的英文&lt;/p&gt;
&lt;p&gt;最近我想到也许可以将这个步骤通过一个 elisp 函数来实现，最终基于 gptel 加上一些简单的 elisp 代码实现了整个流程。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;完整代码：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-emacs-lisp" data-lang="emacs-lisp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;defun&lt;/span&gt; &lt;span class="nv"&gt;my/gptel-gen-hugo-properties&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Generate Hugo export properties for current Org heading.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;unless&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-at-heading-p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ne"&gt;user-error&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;必须在 Org 模式标题位置使用&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;gptel-request&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;将中文标题转换为英文 slug（全小写，连字符连接）：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;需要翻译的原文：「%s」&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;string-trim&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-get-heading&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:system&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;只返回转换后的字符串&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;:callback&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;response&lt;/span&gt; &lt;span class="nv"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;when-let*&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;raw&lt;/span&gt; &lt;span class="nv"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;slug&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;replace-regexp-in-string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;\\([^a-z0-9]\\|-\\)+&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;-&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;downcase&lt;/span&gt; &lt;span class="nv"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="no"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-set-property&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;EXPORT_HUGO_BUNDLE&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;org-set-property&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;EXPORT_FILE_NAME&amp;#34;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;index.zh&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;message&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;生成成功：%s&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;)))))&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;使用方法：&lt;/p&gt;</description></item><item><title>一种不使用微信 sdk 实现 App 分享小程序卡片的替代方案</title><link>https://liujiale.me/til/an-alternative-solution-for-app-sharing-mini-program-cards-without-wechat-sdk/</link><pubDate>Tue, 06 May 2025 14:39:00 +0800</pubDate><guid>https://liujiale.me/til/an-alternative-solution-for-app-sharing-mini-program-cards-without-wechat-sdk/</guid><description>&lt;p&gt;&lt;strong&gt;背景：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;目前 iOS 和 Android app 想要直接分享微信小程序卡片给其他微信用户时，都需要通过调用微信开放 sdk。&lt;/p&gt;
&lt;p&gt;这个过程中需要做平台认证、绑定包名等步骤。&lt;/p&gt;
&lt;p&gt;但是有一种情况软件还在开发过程中，或者根本没有来得及申请微信开放平台，但是仍然想要实现分享小程序卡片。本文就提供一种可行的方案。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心原理：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;拼装分享中转页面转页面 scheme，用于 从微信 App 外分享中转页面中的分享中转页面。&lt;a href="https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/url-scheme.html#%E6%98%8E%E6%96%87-URL-Scheme"&gt;开放能力 / 获取小程序链接 / 获取 URL Scheme&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;上述明文 scheme 中应该带有想要分享的小程序卡片的参数：title、path、imageUrl，&lt;a href="https://developers.weixin.qq.com/miniprogram/dev/reference/api/Page.html#onShareAppMessage-Object-object"&gt;框架接口 / 页面 / Page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;编写小程序的分享中转页面，解析 query 参数 &lt;code&gt;title、path、imageUrl&lt;/code&gt; ，并作为 pages 对象中 onShareAppMessage 的返回值，实现打开中转页面后右上角分享卡片功能&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;注意事项：&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Emacs 上的 AI 相关的 package</title><link>https://liujiale.me/til/emacs-ai-packages/</link><pubDate>Mon, 21 Apr 2025 14:07:00 +0800</pubDate><guid>https://liujiale.me/til/emacs-ai-packages/</guid><description>&lt;p&gt;基础工具&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;gptel - &lt;a href="https://github.com/karthink/gptel"&gt;https://github.com/karthink/gptel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;mcp.el - &lt;a href="https://github.com/lizqwerscott/mcp.el"&gt;https://github.com/lizqwerscott/mcp.el&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI 对话/repl&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;elisa - &lt;a href="https://github.com/s-kostyaev/elisa"&gt;https://github.com/s-kostyaev/elisa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;chatgpt-shell - &lt;a href="https://github.com/xenodium/chatgpt-shell"&gt;https://github.com/xenodium/chatgpt-shell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;代码补全&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;minuet-ai - &lt;a href="https://github.com/milanglacier/minuet-ai.el"&gt;https://github.com/milanglacier/minuet-ai.el&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;copilot.el - &lt;a href="https://github.com/copilot-emacs/copilot.el"&gt;https://github.com/copilot-emacs/copilot.el&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI 辅助编程&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aider.el - &lt;a href="https://github.com/tninja/aider.el"&gt;https://github.com/tninja/aider.el&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;aidermacs - &lt;a href="https://github.com/MatthewZMD/aidermacs"&gt;https://github.com/MatthewZMD/aidermacs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;copilot-chat.el - &lt;a href="https://github.com/chep/copilot-chat.el"&gt;https://github.com/chep/copilot-chat.el&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>微信开发者工具 Cannot read property 'getCurrentPagesByDomain'</title><link>https://liujiale.me/til/wechat-devtool-cannot-read-property-get-current-pages-by-domain/</link><pubDate>Wed, 16 Apr 2025 22:03:00 +0800</pubDate><guid>https://liujiale.me/til/wechat-devtool-cannot-read-property-get-current-pages-by-domain/</guid><description>&lt;h2 id="问题"&gt;问题&lt;/h2&gt;
&lt;p&gt;最近在做小程序自动化测试，核心原理是利用小程序自动化库： &lt;a href="https://www.npmjs.com/package/miniprogram-automator?activeTab=dependencies"&gt;miniprogram-automator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;文档如下：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://developers.weixin.qq.com/miniprogram/dev/devtools/auto/automator.html"&gt;小程序自动化 / API / Automator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;但是最近突然出现问题，执行自动化测试脚本时报错：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;Cannot&lt;/span&gt; &lt;span class="nx"&gt;read&lt;/span&gt; &lt;span class="nx"&gt;property&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;getCurrentPagesByDomain&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="nx"&gt;Transport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onMessage&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node_modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;miniprogram&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;automator&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;Connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1087&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="nx"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;anonymous&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node_modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;miniprogram&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;automator&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;out&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;Transport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;322&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="nx"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onMessage&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node_modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="nx"&gt;Receiver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;receiverOnMessage&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node_modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;789&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="nx"&gt;Receiver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataMessage&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node_modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;422&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="nx"&gt;Receiver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getData&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node_modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;352&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="nx"&gt;Receiver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;startLoop&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node_modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;138&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="nx"&gt;Receiver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;_write&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node_modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;receiver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;74&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;at&lt;/span&gt; &lt;span class="nx"&gt;Socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;socketOnData&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node_modules&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;websocket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;js&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;864&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="困难"&gt;困难&lt;/h2&gt;
&lt;p&gt;翻遍全网没有结果：&lt;/p&gt;
&lt;figure class="content-figure "&gt;
&lt;a href="https://liujiale.me/til/wechat-devtool-cannot-read-property-get-current-pages-by-domain/20250416-215224_screenshot_hu_10adb5718edc7f0a.webp" data-fancybox="gallery" data-caption=""&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://liujiale.me/til/wechat-devtool-cannot-read-property-get-current-pages-by-domain/20250416-215224_screenshot_hu_6f05e44264db0a77.webp 400w, https://liujiale.me/til/wechat-devtool-cannot-read-property-get-current-pages-by-domain/20250416-215224_screenshot_hu_f5ea87eed59a101e.webp 720w, https://liujiale.me/til/wechat-devtool-cannot-read-property-get-current-pages-by-domain/20250416-215224_screenshot_hu_10adb5718edc7f0a.webp 1200w" sizes="(max-width: 720px) 100vw, 720px" /&gt;
&lt;img loading="lazy"
src="https://liujiale.me/til/wechat-devtool-cannot-read-property-get-current-pages-by-domain/20250416-215224_screenshot.png"
alt=""
width="720"
height="591"
/&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;p&gt;找到的连接全部无法打开&lt;/p&gt;
&lt;figure class="content-figure "&gt;
&lt;a href="https://liujiale.me/til/wechat-devtool-cannot-read-property-get-current-pages-by-domain/20250416-215302_screenshot_hu_161bfda03701ab16.webp" data-fancybox="gallery" data-caption=""&gt;
&lt;picture&gt;
&lt;source type="image/webp" srcset="https://liujiale.me/til/wechat-devtool-cannot-read-property-get-current-pages-by-domain/20250416-215302_screenshot_hu_c9a0a7461d1093cc.webp 400w, https://liujiale.me/til/wechat-devtool-cannot-read-property-get-current-pages-by-domain/20250416-215302_screenshot_hu_bb76897f22c21b7.webp 720w, https://liujiale.me/til/wechat-devtool-cannot-read-property-get-current-pages-by-domain/20250416-215302_screenshot_hu_161bfda03701ab16.webp 1200w" sizes="(max-width: 720px) 100vw, 720px" /&gt;
&lt;img loading="lazy"
src="https://liujiale.me/til/wechat-devtool-cannot-read-property-get-current-pages-by-domain/20250416-215302_screenshot.png"
alt=""
width="720"
height="375"
/&gt;
&lt;/picture&gt;
&lt;/a&gt;
&lt;/figure&gt;
&lt;p&gt;就算找到几个还能打开的，也是久久没有人回复。&lt;/p&gt;
&lt;h2 id="解决"&gt;解决&lt;/h2&gt;
&lt;p&gt;整整一个下午，尝试了各种方法都没有结果，我甚至让 Gemni 2.5 pro 帮忙逆向了 miniprogram-automator 的代码。&lt;/p&gt;
&lt;p&gt;发现核心逻辑其实在微信开发者工具里面，这个库其实只是基于 RPC 通讯将这些功能封装成 Node.js 版本 API 而已。&lt;/p&gt;</description></item><item><title>2025 年 3 月稳定可用高并发的 DeepSeek-R1 模型</title><link>https://liujiale.me/til/deepseek-r1-api-providers-comparing-integration-and-pricing/</link><pubDate>Sat, 22 Mar 2025 22:02:00 +0800</pubDate><guid>https://liujiale.me/til/deepseek-r1-api-providers-comparing-integration-and-pricing/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;LLM 发展到现在，领先的大模型在能力上已经得到了认可，问题就是如何找到稳定可靠，并且便宜的 API 服务商。&lt;/p&gt;
&lt;p&gt;现在将市面上常见的提供完整版（非蒸馏）DeepSeek API 的提供上列出来，作为备忘。&lt;/p&gt;
&lt;h2 id="deepseek-官方"&gt;DeepSeek 官方&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;官网：&lt;a href="https://www.deepseek.com/"&gt;https://www.deepseek.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;开放平台：&lt;a href="https://platform.deepseek.com/"&gt;https://platform.deepseek.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;文档：&lt;a href="https://api-docs.deepseek.com/zh-cn/"&gt;https://api-docs.deepseek.com/zh-cn/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;邀请计划：无&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;价格（RMB）：&lt;/p&gt;
&lt;p&gt;（北京时间 08:30-00:30）按照标准价格计费&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模型价格&lt;/th&gt;
&lt;th&gt;deepseek-chat&lt;/th&gt;
&lt;th&gt;deepseek-reasoner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;百万 tokens 输入（缓存命中）(4)&lt;/td&gt;
&lt;td&gt;0.5 元&lt;/td&gt;
&lt;td&gt;1 元&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;百万 tokens 输入（缓存未命中）&lt;/td&gt;
&lt;td&gt;2 元&lt;/td&gt;
&lt;td&gt;4 元&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;百万 tokens 输出 (5)&lt;/td&gt;
&lt;td&gt;8 元&lt;/td&gt;
&lt;td&gt;16 元&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;（北京时间 00:30-08:30） 按照优惠价格计费&lt;/p&gt;</description></item><item><title>使用 GitHub Actions 发布第一个 MCP</title><link>https://liujiale.me/til/publishing-your-first-mcp-with-github-actions/</link><pubDate>Fri, 21 Mar 2025 11:00:00 +0800</pubDate><guid>https://liujiale.me/til/publishing-your-first-mcp-with-github-actions/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;我最近编写了一个 MCP 服务器：&lt;a href="https://github.com/nailuoGG/anki-mcp-server"&gt;nailuoGG/anki-mcp-server&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;但是有一个问题，用户安装时需要在本地进行构建，流程比较复杂，能否更简单一点呢？&lt;/p&gt;
&lt;p&gt;我想到了将其发布到 npm 上，然后使用 `npx anki-mcp-server` 命令来使用。&lt;/p&gt;
&lt;p&gt;进一步想，作为一个开源项目，为什么不使用 GitHub Actions 来进行自动化发布呢？而且至少有以下几个好处：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;安全性，防止开发者本地电脑被侵入导致意外发包的情况，而且能保持让打包构建过程公开透明&lt;/li&gt;
&lt;li&gt;便利性，便于多人协作，这样发布时就不依赖单个开发者，也能够保持发布的一致性&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="准备"&gt;准备&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;在 Npm 上创建账户，并创建并获取 Access Tokens，记为 NPM_TOKEN。&lt;a href="https://www.npmjs.com/"&gt;https://www.npmjs.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;在 GitHub 上创建工程仓库 &lt;a href="https://github.com/"&gt;https://github.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;在 GitHub 仓库设置页面添加 secrets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这里详细记录一下如何添加 secrets：&lt;/p&gt;</description></item><item><title>知识索引：使用 Ollama 本地 LLM 模型角色扮演</title><link>https://liujiale.me/til/ollama-llm-roleplay-index-your-ultimate-local-ai-guide/</link><pubDate>Sun, 09 Mar 2025 10:10:01 +0800</pubDate><guid>https://liujiale.me/til/ollama-llm-roleplay-index-your-ultimate-local-ai-guide/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;关于拿 LLM 做角色扮演这件事情，自从 OpenAI 发布 ChatGPT 时就已经发展起来，在近几年的硬件升级和模型升级下，已经形成了一个较为完善的生态。&lt;/p&gt;
&lt;p&gt;相关的资料散落在各个站点，普通人想要了解，需要花费很大的功夫。&lt;/p&gt;
&lt;p&gt;正好最近在逛 Reddit，收集到一些知识索引，本文就尝试做“索引的索引”&lt;/p&gt;
&lt;h2 id="客户端"&gt;客户端&lt;/h2&gt;
&lt;p&gt;唯一推荐的客户端： &lt;a href="https://sillytavern.app/"&gt;SillyTavern&lt;/a&gt; ， &lt;a href="https://github.com/SillyTavern/SillyTavern"&gt;仓库链接&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;安装方法：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/SillyTavern/SillyTavern -b release
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; SillyTavern &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm i &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run start&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="本地模型"&gt;本地模型&lt;/h2&gt;
&lt;p&gt;本地模型通常在性能上比不上云端模型，但是如果考虑到隐私性和费用，并且你也有一些合适的硬件，本地模型也不失为一种选择。&lt;/p&gt;</description></item><item><title>从潜水到高玩：优化你的 Hacker News 使用习惯</title><link>https://liujiale.me/til/from-lurker-to-power-user-optimizing-hackernews-habits/</link><pubDate>Sun, 09 Mar 2025 00:52:00 +0800</pubDate><guid>https://liujiale.me/til/from-lurker-to-power-user-optimizing-hackernews-habits/</guid><description>&lt;h2 id="基础"&gt;基础&lt;/h2&gt;
&lt;p&gt;Hacker News（简称 HN）是一个由 Y Combinator 创建并运营的社交新闻网站，主要面向科技爱好者、程序员、创业者和对技术、创新感兴趣的人群。它于 2007 年由 Paul Graham 推出，旨在提供一个分享和讨论高质量内容的平台。&lt;/p&gt;
&lt;p&gt;我想这是大多数情况下的使用方式是直接访问 &lt;a href="https://news.ycombinator.com"&gt;https://news.ycombinator.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;点开即可看到最新的热门文章。主要板块：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Front Page（首页）：展示当前最热门的内容。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;New：最新提交的帖子，按时间排序。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Past：历史帖子归档。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Comments：单独查看近期评论。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ask HN：用户提问的专区，类似技术或职业建议的论坛。&lt;/p&gt;</description></item><item><title>告别重复输出！QwQ-32B 故障排查与修复实战指南</title><link>https://liujiale.me/til/fixing-qwq-32b-repeated-output-issues/</link><pubDate>Sat, 08 Mar 2025 23:30:00 +0800</pubDate><guid>https://liujiale.me/til/fixing-qwq-32b-repeated-output-issues/</guid><description>&lt;h2 id="问题"&gt;问题&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://huggingface.co/Qwen/QwQ-32B"&gt;QwQ-32B&lt;/a&gt; 是一个性能比肩 &lt;a href="https://huggingface.co/deepseek-ai/DeepSeek-R1"&gt;DeepSeek-R1&lt;/a&gt; 的推理模型，&lt;/p&gt;
&lt;p&gt;但是很多人发现模型会出现无限生成、不停重复输出的情况。&lt;/p&gt;
&lt;p&gt;等了两天后发现已经有解决方案了：&lt;a href="https://docs.unsloth.ai/basics/tutorial-how-to-run-qwq-32b-effectively#tutorial-how-to-run-qwq-32b-in-ollama"&gt;Tutorial: How to Run QwQ-32B effectively | Unsloth Documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;本文是自己的体验记录&lt;/p&gt;
&lt;h2 id="推荐参数设置"&gt;推荐参数设置&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Temperature = 0.6&lt;/li&gt;
&lt;li&gt;TopP = 0.95&lt;/li&gt;
&lt;li&gt;TopK = 20 ~ 40&lt;/li&gt;
&lt;li&gt;Min_P of 0.02&lt;/li&gt;
&lt;li&gt;Repetition Penalty of 1.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;使用对话模板&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;|im_start|&amp;gt;user\nCreate a Flappy Bird game in Python.&amp;lt;|im_end|&amp;gt;\n&amp;lt;|im_start|&amp;gt;assistant\n&amp;lt;think&amp;gt;\n&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="ollama"&gt;Ollama&lt;/h2&gt;
&lt;p&gt;我只有在 MacBook Pro 上才能跑起来这个模型，因此只记录了 Ollama 的使用。 &lt;a href="https://docs.unsloth.ai/basics/tutorial-how-to-run-qwq-32b-effectively#tutorial-how-to-run-qwq-32b-in-llama.cpp"&gt;llama.cpp的用法&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ollama 支持将模型设置打包到 &lt;code&gt;params&lt;/code&gt; 文件里，所以 MacBook 用户直接执行以下命令就行了&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ollama run hf.co/unsloth/QwQ-32B-GGUF:Q4_K_M&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;或者用其他的量化版本 &lt;a href="https://huggingface.co/unsloth/QwQ-32B-GGUF/tree/main"&gt;unsloth/QwQ-32B-GGUF at main&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ollama run hf.co/unsloth/QwQ-32B-GGUF:Q5_K_M&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2 id="效果和总结"&gt;效果和总结&lt;/h2&gt;
&lt;p&gt;我尝试了 unslosh 的 &lt;code&gt;Flappy Bird&lt;/code&gt; 游戏的例子：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Create a Flappy Bird game in Python. You must include these things:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- You must use pygame.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- The background color should be randomly chosen and is a light shade. Start with a light blue color.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Pressing SPACE multiple times will accelerate the bird.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- The bird&amp;#39;s shape should be randomly chosen as a square, circle or triangle. The color should be randomly chosen as a dark color.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Place on the bottom some land colored as dark brown or yellow chosen randomly.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Make a score shown on the top right side. Increment if you pass pipes and don&amp;#39;t hit them.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- Make randomly spaced pipes with enough space. Color them randomly as dark green or light brown or a dark gray shade.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- When you lose, show the best score. Make the text inside the screen. Pressing q or Esc will quit the game. Restarting is pressing SPACE again.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- The final game should be inside a markdown section in Python. Check your code for errors and fix them before the final markdown section.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;对话客户端用的是 chatbox，输出结果由于太长就不放出来了。可以直接看 unslosh 的分享&lt;/p&gt;</description></item><item><title>决策问题：30 岁程序员是否在农村自建房</title><link>https://liujiale.me/til/2025-02-20-decision-dilemma-30-year-dev-rural-house-construction/</link><pubDate>Thu, 20 Feb 2025 14:48:00 +0800</pubDate><guid>https://liujiale.me/til/2025-02-20-decision-dilemma-30-year-dev-rural-house-construction/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;p&gt;程序员喜欢解决问题，追求最优解。然而问题不仅仅存在于代码的世界，现实生活中的问题更多，而且更复杂难以抉择。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://liujiale.me/tags/%E5%86%B3%E7%AD%96%E9%97%AE%E9%A2%98/"&gt;决策问题&lt;/a&gt; 这一分类就是为此而设。希望总结出不同条件下，相对最合适的选项。&lt;/p&gt;
&lt;p&gt;本次问题是跟多个 AI 工具进行多轮对话后给出的最终评分表，对话过程中有很多有意思的结论，基本涵盖了本问题相关联的所有话题。&lt;/p&gt;
&lt;p&gt;链接我放在文章末尾，有兴趣可以了解一下。&lt;/p&gt;
&lt;h2 id="1-dot-明确问题和目标"&gt;1. 明确问题和目标&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;问题描述：30 岁程序员是否应该在农村自建房？&lt;/li&gt;
&lt;li&gt;背景信息：手头资金 30 万，可借 10 万，无房有车，父母养老需求，职业稳定性，情感价值，资金机会成本，未来经济形势。&lt;/li&gt;
&lt;li&gt;主要目标：做出是否在农村自建房的决策。&lt;/li&gt;
&lt;li&gt;次要目标：最大化经济回报，满足父母养老需求，保持职业发展的灵活性，考虑情感价值和陪伴价值。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-dot-收集信息"&gt;2. 收集信息&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;政策环境：当地宅基地政策支持自建房，需符合规划和面积要求。&lt;/li&gt;
&lt;li&gt;经济数据：自建房成本约 40 万，可能的经济回报包括房产增值和租金收入。&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;资金机会成本：将 40 万用于自建房，而非投资其他渠道的潜在收益。&lt;/li&gt;
&lt;li&gt;未来经济形势：房地产市场稳定，政策支持农村自建房。&lt;/li&gt;
&lt;li&gt;其他因素：子女教育、社区环境、个人生活习惯、法律风险。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="3-dot-确定决策因素"&gt;3. 确定决策因素&lt;/h2&gt;
&lt;p&gt;权重：总权重应该为 1，单个因素在 0 到 1 之间，代表单个因素在整体决策里的占比。&lt;/p&gt;</description></item><item><title>在 Next.js 中 添加 Google Analytics</title><link>https://liujiale.me/til/2025-02-17-add-ga-to-nextjs/</link><pubDate>Mon, 17 Feb 2025 11:25:00 +0800</pubDate><guid>https://liujiale.me/til/2025-02-17-add-ga-to-nextjs/</guid><description>&lt;p&gt;挺久没用 Google 分析对它的操作流程都有点陌生了，这里记录一下在 GA 新建站点和添加统计脚本的过程。&lt;/p&gt;
&lt;p&gt;新建站点并拿到统计 ID。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开：&lt;a href="https://analytics.google.com/"&gt;https://analytics.google.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;我已经有账号了，所以直接 管理 -&amp;gt; 创建-&amp;gt; 创建媒体资源，一路点下去就能找到统计代码了&lt;/li&gt;
&lt;li&gt;具体操作流程可以看文档：&lt;a href="https://support.google.com/analytics/answer/9304153?hl=zh-Hans"&gt;https://support.google.com/analytics/answer/9304153?hl=zh-Hans&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最终拿到一串统计代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;&amp;lt;!-- Google tag (gtag.js) --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt; &lt;span class="na"&gt;async&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://www.googletagmanager.com/gtag/js?id=G-0xxxxxxxx&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataLayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataLayer&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;gtag&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&lt;span class="nx"&gt;dataLayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;);}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;gtag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;gtag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;config&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;G-0xxxxxxxx&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;其中 &lt;code&gt;G-0xxxxxxxx&lt;/code&gt; 这一串就是该网站的统计 ID，记录下来后面要用。&lt;/p&gt;
&lt;p&gt;首先确保安装了 &lt;code&gt;@next/third-parties&lt;/code&gt; 这个包&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i @next/third-parties&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;项目结构如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;➜ tree ./src -L &lt;span class="m"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./src
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── app
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   ├── favicon.ico
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   ├── globals.css
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   ├── layout.tsx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   ├── modules
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   └── page.tsx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── components
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│   └── ui
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── lib
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── utils.ts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;如果是每个页面都需要添加统计，则修改 &lt;code&gt;src/app/layout.tsx&lt;/code&gt; ，将之前记下来的 gaId 填进去&lt;/p&gt;</description></item><item><title>一起来将每日所学记录到 TIL 上</title><link>https://liujiale.me/til/2025-02-12-today-i-learned/</link><pubDate>Wed, 12 Feb 2025 23:09:00 +0800</pubDate><guid>https://liujiale.me/til/2025-02-12-today-i-learned/</guid><description>&lt;h2 id="降低创作门槛"&gt;降低创作门槛&lt;/h2&gt;
&lt;p&gt;TIL 是 Today I Learned 的缩写。灵感来自： &lt;a href="https://simonwillison.net/2024/Dec/22/link-blog/"&gt;My approach to running a link blog&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;其他典型的链接分享网站：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://news.ycombinator.com/"&gt;https://news.ycombinator.com/&lt;/a&gt; 采用用户投稿的形式发布新闻、新产品、文章&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.solidot.org/"&gt;https://www.solidot.org/&lt;/a&gt; 分享新闻&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.owenyoung.com/categories/journal/"&gt;https://www.owenyoung.com/categories/journal/&lt;/a&gt; 沉浸式翻译作者的链接博客&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相较于撰写长篇大论，碎片化短篇写作更容易实践。&lt;/p&gt;
&lt;p&gt;持续输出博客内容具有价值，但长文创作往往存在难度。&lt;/p&gt;
&lt;p&gt;若能将单篇体量适当缩减，并保持规律性的更新频率，是否更能形成可持续的创作节奏呢？&lt;/p&gt;
&lt;h2 id="内容创作方向"&gt;内容创作方向&lt;/h2&gt;
&lt;p&gt;任何有价值的记录都值得书写，但需注意信息增量原则——在原始素材基础上进行深度加工。&lt;/p&gt;
&lt;p&gt;创作形式可灵活多样：&lt;/p&gt;</description></item></channel></rss>