<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>项目演示 on Laurence-042's Workshop</title><link>http://blog.laurence042.com/project/</link><description>Recent content in 项目演示 on Laurence-042's Workshop</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Wed, 14 Oct 2026 15:27:11 +0000</lastBuildDate><atom:link href="http://blog.laurence042.com/project/index.xml" rel="self" type="application/rss+xml"/><item><title>rimworld-ordinatus-calculi</title><link>http://blog.laurence042.com/project/rimworld-ordinatus-calculi/</link><pubDate>Wed, 14 Oct 2026 15:27:11 +0000</pubDate><guid>http://blog.laurence042.com/project/rimworld-ordinatus-calculi/</guid><description>&lt;h1 id="rimworld-计算仪典破甲者之歌留命者之吟"&gt;RimWorld 计算仪典：破甲者之歌・留命者之吟&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;RimWorld Ordinatus Calculi：Song of the Breaker ・ Chant of the Keeper&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一个基于 Vue 3 + TypeScript 的 RimWorld 战斗机制计算器，用于计算给定武器在不同的距离/护甲情况下的DPS，以及给定护甲组合在不同单发伤害/穿甲情况下的受伤期望。&lt;/p&gt;
&lt;h2 id="功能特性"&gt;功能特性&lt;/h2&gt;
&lt;h2 id="features"&gt;Features&lt;/h2&gt;
&lt;hr&gt;
&lt;h3 id="武器-dps-计算器weapon-centric"&gt;武器 DPS 计算器（Weapon-Centric）&lt;/h3&gt;
&lt;h3 id="weapon-dps-calculator-weapon-centric"&gt;Weapon DPS Calculator (Weapon-Centric)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;多武器对比&lt;/strong&gt;：同时评估多个武器在不同护甲率（0–200%）下的 DPS 表现&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Multi-weapon comparison:&lt;/strong&gt; Evaluate multiple weapons across armor values (0–200%).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;精确命中率&lt;/strong&gt;：基于距离分段（贴近/近/中/远）的线性插值算法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Accurate hit chance:&lt;/strong&gt; Linear interpolation across distance segments (touch / short / medium / long).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;连发机制&lt;/strong&gt;：完整模拟预热、连发间隔、冷却时序&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Burst mechanics:&lt;/strong&gt; Full simulation of warm-up, burst interval, and cooldown timings.&lt;/p&gt;</description></item><item><title>my-pen-is-broken</title><link>http://blog.laurence042.com/project/my-pen-is-broken/</link><pubDate>Wed, 14 Oct 2026 15:26:39 +0000</pubDate><guid>http://blog.laurence042.com/project/my-pen-is-broken/</guid><description>&lt;h1 id="-言阅姬-yanyueji"&gt;🖋️ 言阅姬 (YanYueJi)&lt;/h1&gt;
&lt;p&gt;Steam 好评率98%，全球首款「寻找对话中敏感词」的游戏《ウーマンコミュニケーション/ 女性交流》通关后做的小玩具，既可以直接标红页面上的敏感词，也可以人工寻找敏感词并点击以标红。&lt;/p&gt;
&lt;h2 id="-两种模式"&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;&lt;strong&gt;🤖 自动检测版&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;加载后立即扫描并高亮所有敏感词&lt;/td&gt;
 &lt;td&gt;让我看看这个网页会被言阅姬抓到多少次无意识风纪违反&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;👆 手动点击版&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;点击文字才检测敏感词并显示拼音&lt;/td&gt;
 &lt;td&gt;一定程度上模拟了原作，但是说实话自从我小学毕业就失去了在日常网页中找敏感词谐音的技能，所以我自己只用自动检测版&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="-在线demo"&gt;🌐 在线Demo&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;👉 &lt;a href="https://laurence-042.github.io/project/my-pen-is-broken/demo/bookmarks.html"&gt;点击这里体验在线版本&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在上面链接指向的页面中获取书签，然后那个页面同样提供了用于测试的示例文字！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="-已知限制"&gt;⚠️ 已知限制&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DoubleShot 重叠问题&lt;/strong&gt;: 当两个敏感词重叠时，自动模式只会标记其中一个，手动模式可以标记多个&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拼音相同词汇重复计数&lt;/strong&gt;: 敏感词库中拼音相同的词会被分别计数，导致统计数量可能偏高&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-开发"&gt;🛠️ 开发&lt;/h2&gt;
&lt;h3 id="项目结构"&gt;项目结构&lt;/h3&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;my-pen-is-broken/
├── src/
│ ├── index.js # 核心逻辑
│ └── index.html # HTML模板
├── scripts/
│ └── build-bookmarklets.js # 书签构建脚本
├── dist/
│ ├── bookmarks.html # 书签使用页面
│ └── bookmarklets/ # 生成的书签文件
└── webpack配置文件...&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;h3 id="npm-脚本"&gt;NPM 脚本&lt;/h3&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run build &lt;span style="color:#75715e"&gt;# 构建书签版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run start &lt;span style="color:#75715e"&gt;# 启动开发服务器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run watch &lt;span style="color:#75715e"&gt;# 监听文件变化&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;&lt;h3 id="技术实现"&gt;技术实现&lt;/h3&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;原始文本 → 拼音转换 → Token化 → 敏感词匹配 → DOM替换&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;加载敏感词库&lt;/strong&gt;: 访问&lt;a href="https://github.com/57ing/Sensitive-word/blob/master/%E8%89%B2%E6%83%85%E8%AF%8D%E5%BA%93.txt"&gt;57ing/Sensitive-word&lt;/a&gt;获取敏感词列表&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拼音标准化&lt;/strong&gt;: 使用 &lt;code&gt;pinyin&lt;/code&gt; 库对页面上的文本和敏感词库里的文本进行中文-拼音转换&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模糊匹配&lt;/strong&gt;: 忽略标点符号进行无音调的拼音比对&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DOM替换&lt;/strong&gt;: 自动模式下将匹配的部分标红，手动模式下给每个文本元素添加“点击时检测敏感词”的回调&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-外部依赖"&gt;📚 外部依赖&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;敏感词库&lt;/strong&gt;: &lt;a href="https://github.com/57ing/Sensitive-word/blob/master/%E8%89%B2%E6%83%85%E8%AF%8D%E5%BA%93.txt"&gt;57ing/Sensitive-word&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拼音转换&lt;/strong&gt;: &lt;a href="https://www.npmjs.com/package/pinyin"&gt;pinyin&lt;/a&gt; 库&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;构建工具&lt;/strong&gt;: Webpack + Babel&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-更多信息"&gt;📄 更多信息&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;详细构建说明&lt;/strong&gt;: &lt;a href="./BUILD_GUIDE.md"&gt;BUILD_GUIDE.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;项目许可证&lt;/strong&gt;: &lt;a href="./LICENSE"&gt;LICENSE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="-贡献"&gt;🤝 贡献&lt;/h2&gt;
&lt;p&gt;欢迎提交Issue和Pull Request来改进这个项目！&lt;/p&gt;</description></item><item><title>ya-byok-chat</title><link>http://blog.laurence042.com/project/ya-byok-chat/</link><pubDate>Wed, 14 Oct 2026 15:26:39 +0000</pubDate><guid>http://blog.laurence042.com/project/ya-byok-chat/</guid><description>&lt;h1 id="ya-byok-chat"&gt;YA-BYOK-Chat&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Yet Another Bring-Your-Own-Key Chat — a minimal single-page chat app for OpenAI-compatible APIs.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;面向&lt;strong&gt;非技术用户&lt;/strong&gt;设计：技术人员配置一次，生成分享链接，收到链接的人打开即可直接聊天，无需填写任何设置。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.laurence042.com/project/ya-byok-chat/demo/"&gt;在线 Demo&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="功能"&gt;功能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;开箱即用的分享链接&lt;/strong&gt; — 配置（Endpoint / API Key / 模型 / 系统提示词等）编码进 URL，一键复制，对方打开即自动填入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;兼容所有 OpenAI 格式 API&lt;/strong&gt; — 只需填入 Base URL，支持 OpenAI、Azure、本地 Ollama、各类代理等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markdown &amp;amp; Mermaid 渲染&lt;/strong&gt; — 助手回复支持富文本格式和流程图&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长对话自动摘要&lt;/strong&gt; — 消息超过阈值后自动将早期对话压缩为摘要，节省上下文窗口（可关闭）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异常诊断&lt;/strong&gt; — 请求失败时弹出诊断对话框，一键复制（API Key 已脱敏）方便排查&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;code&gt;localStorage&lt;/code&gt;，刷新不丢失&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cloudflare Worker KV 日志（可选）&lt;/strong&gt; — 在设置中填入 Worker 地址后，每轮对话结束时自动将收发消息 POST 至 Cloudflare Worker 写入 KV 存储；Worker 地址和鉴权 token 同样可通过分享链接传递&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="技术栈"&gt;技术栈&lt;/h2&gt;
&lt;p&gt;Vue 3 + TypeScript · Vite · Element Plus · vue-i18n · marked · Mermaid&lt;/p&gt;</description></item><item><title>oral-oiiaioiiiai</title><link>http://blog.laurence042.com/project/oral-oiiaioiiiai/</link><pubDate>Wed, 14 Oct 2026 15:26:38 +0000</pubDate><guid>http://blog.laurence042.com/project/oral-oiiaioiiiai/</guid><description>&lt;h1 id="-oiiaioiiiai--魔性发声音游"&gt;🐱 OIIAIOIIIAI — 魔性发声音游&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;对着麦克风发出 &amp;ldquo;oiiaioiiiai&amp;rdquo;，让猫咪疯狂旋转！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一个基于实时元音识别的浏览器音游。玩家对着麦克风连续发出 O / I / A 元音，驱动猫咪旋转并触发五阶段视觉进化。灵感来自那只一边旋转一边发出魔性声音的猫 🐱🔄&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://laurence-042.github.io/project/oral-oiiaioiiiai/demo/"&gt;▶️ 在线试玩&lt;/a&gt;&lt;/strong&gt; ｜ &lt;a href="story.md"&gt;设计文档&lt;/a&gt; ｜ &lt;a href="src/composables/VOWEL_DETECTOR_ML.md"&gt;ML 检测器文档与项目细节&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;oiia 素材来源：https://www.bilibili.com/video/BV1AvLizFEPn/&lt;/p&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h2 id="特性"&gt;特性&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;🎤 &lt;strong&gt;实时元音识别&lt;/strong&gt; — TensorFlow.js CNN 模型，浏览器端推理&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;序列校验&lt;/strong&gt; — 检测 O→I→I→A→I→O→I→I→I→A→I 循环，支持模糊匹配 (U↔O, I↔E)&lt;/li&gt;
&lt;li&gt;🔥 &lt;strong&gt;五阶段视觉进化&lt;/strong&gt; — 从缓慢旋转到全屏彩虹漩涡，粒子 / 色差 / 残影 / 屏幕抖动&lt;/li&gt;
&lt;li&gt;🎵 &lt;strong&gt;程序化 BGM&lt;/strong&gt; — Tone.js 8 轨道逐阶段叠加，BPM 跟随发音速度&lt;/li&gt;
&lt;li&gt;📸 &lt;strong&gt;分享系统&lt;/strong&gt; — 结算卡片 + 高光时刻 + QR 码，扇形卡片轮播&lt;/li&gt;
&lt;li&gt;🏆 &lt;strong&gt;全网排行榜&lt;/strong&gt; — Cloudflare Workers KV 后端&lt;/li&gt;
&lt;li&gt;📦 &lt;strong&gt;资源包系统&lt;/strong&gt; — 可替换猫咪帧动画、音节音效、阶段文案&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="快速开始"&gt;快速开始&lt;/h2&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 安装依赖&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 启动开发服务器 (https://localhost:3000)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run dev
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 生产构建&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run build
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 仅类型检查&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npx tsc --noEmit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;⚠️ 麦克风 API 需要 HTTPS 或 localhost。开发服务器已配置自签名 SSL。&lt;/p&gt;</description></item><item><title>KP-Explain-This</title><link>http://blog.laurence042.com/project/kp-explain-this/</link><pubDate>Wed, 14 Oct 2026 15:26:32 +0000</pubDate><guid>http://blog.laurence042.com/project/kp-explain-this/</guid><description>&lt;h1 id="kp编啊--关键词即兴叙事"&gt;KP，编啊 — 关键词即兴叙事&lt;/h1&gt;
&lt;p&gt;本项目采用 &lt;a href="LICENSE"&gt;MIT License&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;把骰子扔在书上，用砸中的词讲故事。&lt;/p&gt;
&lt;p&gt;一款基于&lt;strong&gt;随机文本约束&lt;/strong&gt;的即兴叙事游戏（MVP）：导入 TXT/PDF 电子书，系统用程序掷骰从书中随机抽取关键词，玩家（PC）与 LLM 主持人（KP）各自被自己的关键词约束——KP 用关键词驱动场景，玩家的行动必须&lt;strong&gt;真正使用&lt;/strong&gt;自己的关键词并通过独立 Validator 的验证，剧情才会推进。&lt;/p&gt;
&lt;p&gt;基于 &lt;a href="../YA-BYOK-Chat"&gt;YA-BYOK-Chat&lt;/a&gt; 脚手架二次开发。BYOK：API Key 只保存在本机浏览器，浏览器直连任意 OpenAI 兼容端点，无后端。&lt;/p&gt;
&lt;h2 id="玩法循环"&gt;玩法循环&lt;/h2&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;导入 TXT / PDF → 合书初掷（定初始页，掷骰动画）
 ↓
每轮：在打开的书页上掷 K 个 1d10（全屏演出：带封皮/书脊/内页的实体书，骰子落定在被砸中的词上，
 书签可查看「落点顺序 → 骰面数字 → 取模 → 页码」的推导）
 ├─ 骰子盖住的词 = 本轮关键词（PC 一组 / KP 一组）
 └─ 骰子按落点从上到下、同行从左到右排成数字（面 10 视为 0；3 颗骰子 ≈ 1d1000）
 mod 总页数 = 本轮结束后翻到的页（翻页动画；无字页就近映射并在演出中标注）
 ↓
KP LLM 用 KP 关键词生成场景（流式叙事）
 ↓
每位玩家依次用自己的 PC 关键词描述一次行动
 ↓
Validator LLM 独立判定（宽松即兴标准：关键词实质展开即可，只拦硬性世界违规）
 ├─ 驳回 → 玩家修改重交（KP 全程不知情）
 └─ 通过 → 记录行动，交给下一轮 KP 承接
 ↓
每位玩家都行动一次 → 全体自动翻页、重新掷骰 → 下一轮 KP 裁决这些行动并展开新场景
 （没有&amp;#34;主动结束场景&amp;#34;按钮；对当前场景不满意可发起&amp;#34;重骰场景&amp;#34;，
 需全体角色同意——LLM KP 默认同意——重骰即**跳过本轮**：回滚后直接翻到
 本轮骰面指示的页，在新页重掷开局）&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;p&gt;&lt;strong&gt;关键设计&lt;/strong&gt;：KP 与 Validator 是两个完全独立的 LLM Session（可分别配置不同模型/温度/端点）。Validator 按&lt;strong&gt;宽松即兴标准&lt;/strong&gt;判定——这是即兴游戏，内心独白、对话、观察、联想都算合法回应，关键词实质展开即可，只有凭空获得物品、瞬移、否认既定事实这类硬性世界违规才会驳回。世界状态（地点/物品/NPC/事实）以结构化 JSON 维护，不依赖聊天记录。&lt;/p&gt;</description></item><item><title>color-change-image</title><link>http://blog.laurence042.com/project/color-change-image/</link><pubDate>Wed, 14 Oct 2026 15:26:26 +0000</pubDate><guid>http://blog.laurence042.com/project/color-change-image/</guid><description>&lt;h1 id="color-change-image"&gt;color-change-image&lt;/h1&gt;
&lt;h2 id="project-setup"&gt;Project setup&lt;/h2&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;npm install&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;h3 id="compiles-and-hot-reloads-for-development"&gt;Compiles and hot-reloads for development&lt;/h3&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;npm run serve&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;h3 id="compiles-and-minifies-for-production"&gt;Compiles and minifies for production&lt;/h3&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;npm run build&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;h3 id="lints-and-fixes-files"&gt;Lints and fixes files&lt;/h3&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;npm run lint&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;h3 id="customize-configuration"&gt;Customize configuration&lt;/h3&gt;
&lt;p&gt;See &lt;a href="https://cli.vuejs.org/config/"&gt;Configuration Reference&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="在线版"&gt;在线版&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://laurence-042.github.io/project/color-change-image/demo/"&gt;https://laurence-042.github.io/project/color-change-image/demo/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这个应用已更新到可以正式使用的程度，进行恰当标记后处理得到的图片中，被标记区域的颜色将随背景颜色变化而变化，而且会一定程度上地保留变色区域的阴影高光与花纹。具体保留效果取决于原图相应区域的颜色，颜色越接近平和的灰色效果越好。&lt;/p&gt;
&lt;p&gt;这个应用的功能包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用二次贝塞尔曲线标记选区，可调阈值的相似颜色标记选区。&lt;/li&gt;
&lt;li&gt;将选区作为加工范围，或者使用选区操作蒙版后将蒙版作为加工范围。&lt;/li&gt;
&lt;li&gt;使用RGB色域修改输出图片的背景色，作为变色图效果的预览。&lt;/li&gt;
&lt;li&gt;使用内置的几个背景图片作为输出图片的预览背景。&lt;/li&gt;
&lt;li&gt;使用本机上传图片作输出图片的预览背景。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;个人感觉现在唯一的更新点差不多就是“将输出图片png和背景一起导出为jpg”，但由于几种背景的显示逻辑不同，这个功能做起来挺麻烦的，所以短期内不准备继续更新这个应用了。除此之外，一开始我只准备让这个应用可以处理整张图就行，后来的加工区域标记功能全是半路加上的，所以这个项目的代码结构非常糟糕，我不想再被自己的代码恶心了（这个是不更新主要原因）&lt;/p&gt;
&lt;h2 id="如果你对这个玩具的灵感来源与原理感兴趣"&gt;如果你对这个玩具的灵感来源与原理感兴趣&lt;/h2&gt;
&lt;h3 id="灵感来源"&gt;灵感来源&lt;/h3&gt;
&lt;p&gt;实际上，这个项目的灵感来源是半年前QQ群里刷屏的几张图，其特点是图片中的元素（比如丝袜，衣服之类的）的颜色会随着聊天气泡的颜色（也就是背景色）变化。比如说那张丝袜图，如果聊天气泡是黑色的，丝袜就是黑色的；聊天气泡是白色的，丝袜就是白色的。&lt;/p&gt;
&lt;p&gt;关键是，变色部分的阴影是被完美地保留了的，这不是简单的抠图所能做出来的。我猜想可能是画师在画图时预先设定了一个背景色，然后将阴影之类的上完色之后去除背景色，并以png格式导出的方式做出来的。&lt;/p&gt;
&lt;p&gt;但我觉得我们可以自己动手试着做一个工具出来，使其可以自动将正常的jpg加工成那种变色图。就这样，这个纯属娱乐的项目就开工了。&lt;/p&gt;
&lt;h3 id="思路"&gt;思路&lt;/h3&gt;
&lt;p&gt;如果纯色底图A加上带透明通道的图B可以得到很和谐的图C，那么可不可以把现有的无透明通道的图C拆成纯色底图A与透明通道图B？&lt;/p&gt;
&lt;p&gt;如果已知一个图片的长宽，那么就能把图片转成一维点阵向量的形式（就像二维数组在内存中的真实存放方式是按行拼接在一起的一维数组一样），那么就是向量分析了。A为元素为三维向量（RGB）的N维向量（N为长宽乘积），B为元素为四维向量（RGBA）的N维向量，C为元素为三维向量的N维向量。为了方便起见，我们将三维向量RGB当作Alpha值为1的RGBA，这样ABC的形式都一样了。&lt;/p&gt;</description></item><item><title>life-credit-pill</title><link>http://blog.laurence042.com/project/life-credit-pill/</link><pubDate>Wed, 14 Oct 2026 15:26:20 +0000</pubDate><guid>http://blog.laurence042.com/project/life-credit-pill/</guid><description>&lt;h1 id="回春丹-mv-项目---经验总结"&gt;回春丹 MV 项目 - 经验总结&lt;/h1&gt;
&lt;h2 id="项目背景"&gt;项目背景&lt;/h2&gt;
&lt;p&gt;这是一个游戏内药物公司产品&amp;quot;回春丹&amp;quot;的广告歌曲 MV 项目。使用前端技术（TypeScript + SVG 动画）制作与歌词同步的动画视频。&lt;/p&gt;
&lt;h3 id="产品设定"&gt;产品设定&lt;/h3&gt;
&lt;p&gt;回春丹是一种能透支生命力的药物：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;效果&lt;/strong&gt;：让35岁的人外貌和活力都像20岁&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;副作用&lt;/strong&gt;：在老年期显现，导致预期寿命降低&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;讽刺点&lt;/strong&gt;：药物公司不惮于威胁顾客——&amp;ldquo;你不吃有的是人吃，被时代抛下反而死得更快&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="可复现的完整流程"&gt;可复现的完整流程&lt;/h2&gt;
&lt;h3 id="第一步生成歌词"&gt;第一步：生成歌词&lt;/h3&gt;
&lt;p&gt;使用 &lt;strong&gt;ChatGPT / Claude&lt;/strong&gt; 等有创造力、会押韵的 AI 生成歌词。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;提示词示例&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;pre tabindex="0"&gt;&lt;code&gt;我需要为游戏内的一个虚构药物&amp;#34;回春丹&amp;#34;写一首广告歌曲。

背景设定：
- 回春丹能让35岁的人看起来像20岁
- 副作用是老年期寿命缩短
- 这是一个反乌托邦世界，职场年龄歧视严重
- 歌曲表面是昂扬的宣传曲，但歌词暗含威胁

要求：
- 押韵，朗朗上口
- 表面积极向上，实则讽刺
- 包含具体的职场焦虑元素（裁员、绩效、竞争）
- 时长约2-3分钟
- 需要 intro、verse、chorus、bridge 等结构
- 使用 Synthwave 风格

请同时给出 Suno 的 style 提示词。&lt;/code&gt;&lt;/pre&gt;
 &lt;/div&gt;&lt;h3 id="第二步生成音乐"&gt;第二步：生成音乐&lt;/h3&gt;
&lt;p&gt;使用 &lt;strong&gt;Suno&lt;/strong&gt;（https://suno.ai）生成音乐：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将歌词粘贴到 Lyrics 区域&lt;/li&gt;
&lt;li&gt;将 style 提示词填入 Style of Music&lt;/li&gt;
&lt;li&gt;生成并选择最满意的版本&lt;/li&gt;
&lt;li&gt;下载 MP3 文件&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="第三步标注时间轴"&gt;第三步：标注时间轴&lt;/h3&gt;
&lt;p&gt;使用 &lt;strong&gt;LRC 时间轴工具&lt;/strong&gt;（如 &lt;a href="https://lzltool.com/audio-lrc"&gt;https://lzltool.com/audio-lrc&lt;/a&gt;）：&lt;/p&gt;</description></item><item><title>ForcePhone-Test</title><link>http://blog.laurence042.com/project/forcephone-test/</link><pubDate>Wed, 14 Oct 2026 15:26:18 +0000</pubDate><guid>http://blog.laurence042.com/project/forcephone-test/</guid><description>&lt;h1 id="forcephone-lab"&gt;ForcePhone Lab&lt;/h1&gt;
&lt;p&gt;基于 Vue 3 + Vite 的 ForcePhone 原理实验。通过本机扬声器播放 18–22 kHz、25 ms 的扫频信号（每 50 ms 一次），用麦克风录音做匹配滤波，并观察主峰之前约 20 个采样点处的相关强度变化。&lt;/p&gt;
&lt;h2 id="本地开发"&gt;本地开发&lt;/h2&gt;
&lt;p&gt;需要 Node.js 20.19+ 或 22.12+。在项目根目录运行：&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run dev&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;&lt;p&gt;打开 Vite 输出的 &lt;code&gt;http://localhost:5173&lt;/code&gt;。localhost 属于安全上下文，可以使用麦克风；修改 &lt;code&gt;src/&lt;/code&gt; 下的文件会热更新。&lt;/p&gt;
&lt;p&gt;手机与电脑在同一局域网时，使用 HTTPS 开发服务器：&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run dev:https&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;&lt;p&gt;Vite 会列出局域网地址（通常是 &lt;code&gt;https://&amp;lt;电脑局域网 IP&amp;gt;:5173&lt;/code&gt;）。此模式使用 &lt;code&gt;@vitejs/plugin-basic-ssl&lt;/code&gt; 生成自签名证书；手机必须信任该证书，或改用自己信任的 HTTPS 证书/隧道，否则浏览器可能拦截页面或麦克风。请勿将开发服务器暴露到公网。&lt;/p&gt;
&lt;p&gt;构建与预览：&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run build
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm run preview&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;&lt;p&gt;&lt;code&gt;dist/&lt;/code&gt; 是构建产物，不需要手工编辑。源码入口是 &lt;code&gt;src/App.vue&lt;/code&gt;，信号分析在 &lt;code&gt;src/signal.js&lt;/code&gt;，音频工作线程在 &lt;code&gt;public/probe-processor.js&lt;/code&gt;。部署继续读取 &lt;code&gt;.openai/hosting.json&lt;/code&gt; 中的 &lt;code&gt;dist&lt;/code&gt; 目录。&lt;/p&gt;</description></item><item><title>ai-health-video-starter</title><link>http://blog.laurence042.com/project/ai-health-video-starter/</link><pubDate>Wed, 14 Oct 2026 15:26:17 +0000</pubDate><guid>http://blog.laurence042.com/project/ai-health-video-starter/</guid><description>&lt;h1 id="ai-health-video-starter"&gt;AI Health Video Starter&lt;/h1&gt;
&lt;p&gt;一份给长辈照着做的 AI 养生短视频制作陪练单。&lt;/p&gt;
&lt;p&gt;这个项目不是给懂技术的人看的教程，而是一个可以直接打开的静态网页，目标是帮助一位对中医养生感兴趣、但不熟悉 AI 工具的用户，完成第一条 15 秒养生科普短视频。&lt;/p&gt;
&lt;h2 id="项目定位"&gt;项目定位&lt;/h2&gt;
&lt;p&gt;很多 AI 入门材料会讲一堆工具和概念，但真正的新手往往卡在更具体的地方：&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;AI 回答不好时怎么继续问？&lt;/li&gt;
&lt;li&gt;页面看不懂、找不到按钮时怎么办？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个网页把流程拆成一条可以照着做的路线：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在电脑上安装并登录 ima。&lt;/li&gt;
&lt;li&gt;把中医养生资料上传到 ima 知识库。&lt;/li&gt;
&lt;li&gt;让 ima 从资料里整理出一个适合短视频的知识点。&lt;/li&gt;
&lt;li&gt;把总结交给清言，生成 15 秒短视频脚本。&lt;/li&gt;
&lt;li&gt;用 updream 根据脚本生成短视频。&lt;/li&gt;
&lt;li&gt;任何一步卡住，就截图问豆包。&lt;/li&gt;
&lt;li&gt;最后用检查清单判断视频是否清楚、可信、能发。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="推荐项目名"&gt;推荐项目名&lt;/h2&gt;
&lt;p&gt;GitHub 仓库名建议使用：&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ai-health-video-starter&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;&lt;p&gt;含义是“AI 养生短视频入门起步器”。它比 &lt;code&gt;ai-intro&lt;/code&gt; 更具体，也比中文拼音名更容易在 GitHub 上阅读。&lt;/p&gt;
&lt;h2 id="使用方式"&gt;使用方式&lt;/h2&gt;
&lt;p&gt;这是一个纯静态网页，不需要安装依赖。&lt;/p&gt;
&lt;p&gt;直接用浏览器打开：&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;index.html&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;&lt;p&gt;也可以用任意静态服务器预览，例如：&lt;/p&gt;
&lt;div class="code-block"&gt;
 &lt;button class="code-copy" type="button" hidden aria-label="Copy code to clipboard"&gt;
 &lt;span class="code-copy-label" aria-hidden="true"&gt;Copy&lt;/span&gt;
 &lt;/button&gt;
 &lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python -m http.server &lt;span style="color:#ae81ff"&gt;4173&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
 &lt;/div&gt;&lt;p&gt;然后访问：&lt;/p&gt;</description></item><item><title>silly-butt-helper</title><link>http://blog.laurence042.com/project/silly-butt-helper/</link><pubDate>Wed, 14 Oct 2026 15:26:15 +0000</pubDate><guid>http://blog.laurence042.com/project/silly-butt-helper/</guid><description>&lt;h1 id="silly-butt-helper"&gt;silly-butt-helper&lt;/h1&gt;
&lt;p&gt;一个也许可以帮助您身边伸手党朋友的小东西&lt;/p&gt;</description></item></channel></rss>