[{"content":"9 月 30 号那个下午，我在一个空文件夹里敲下 hugo new site。后来翻提交记录，第一次提交叫「初始化 Hugo + PaperMod 个人博客站点」，最近一次是 10 月 16 号。中间隔了 18 天，100 次提交，9 篇文章。\n这些数字摆出来，一点都不动人。100 次，念一遍就完了，没人会为它停一下。\n我就是想看看 18 天长什么样 做这个片子不是为了炫技。我也没什么可炫的——一个不会写代码的人照着说明一点点改，能炫到哪去。\n原因其实特别朴素：我想知道 18 天到底长什么样。\n数字太干。4,822 行 CSS 是什么概念？四个数字一个逗号，读完就过去了。可它真实的形状是一天改一点。今天调个圆角，明天发现那圆角在窄屏上把别的东西挤歪了，后天又改回去。100 次提交也差不多，平均一天五次，听着挺勤快，实际上大半是「改错了，再改一下」。\n所以我想把这些平铺开，让它们动起来。动起来才有长度。\n片子里有七幕 开头是一间空屋子。光标在那儿闪，文件夹是空的，什么都没有。然后第一行代码掉下来，第一篇文章落进去。\n接着是 CSS 那一幕。数字一路往上跳，跳到 4,822 就停住不跳了。那一帧画面有点满——正好，我那两周也差不多是满的。\n中间有一幕在起火。这是我自己烧的。那天我用 git reset --hard 把三天的改动抹了，敲回车之前没备份。片子里的火就是从这儿来的，不是为了让画面好看加的特效，它是真发生过。火过去之后，屏幕上剩几行没了意义的残留，跟我当时的感受对得上。\n再往后是那九篇文章，一篇一篇叠上去。然后镜头拉远，看这些零散的字慢慢归成一行一行的排版。\n收尾那一幕是上线。一条链子亮起来：git push 推上去，GitHub Actions 接住，hugo --minify 编译，文件交到 Cloudflare Workers 手里。整条走完大概四十秒。四十秒，18 天就从我硬盘里一个文件夹，变成了别人能敲网址打开的站。\n怎么做的：是 DSH 做的 老实说，是 DSH 做的。我提要求，它写代码。\n做出来的东西不是视频文件，是一张网页——用 HTML + CSS + canvas 画的动画。这么做的直接好处是它能直接嵌在文章里播，不用传去哪个视频平台，也不用先等五秒广告。\n用起来是这样：空格暂停，R 重播，F 全屏。结尾那颗球是 DeepSeek Orb 的图标，放在这儿我觉得合适，这 18 天它帮了大忙。\n这一段得写清楚，不然显得太顺——第一版很烂。\n烂到什么程度：两分钟就做完了，全是文字，一页一页淡进淡出，跟念 PPT 似的。我看完第一反应就是这不行，太糊弄了。后来才一点点加：加粒子让它有呼吸，加打字机让字一个个出来，加火，加那颗星球。第二版出来我才觉得能放上来。\n这个过程跟这个站本身挺像的。先有个能跑的壳，然后一遍遍不满意，一遍遍改。\n片子在这儿 下面就是。看着别扭的地方，多半是因为它确实还别扭，有些我还没想好怎么改，先放着了。\n","permalink":"https://yunblog.com.cn/posts/18-days-video/","summary":"18 天、100 次提交、9 篇文章、4,822 行 CSS。数字写在纸上太干，所以我用 HTML + CSS + canvas 做了个网页动画，把这段过程放了一遍。片子里有七幕，其中起火那一幕，来自我用 git reset \u0026ndash;hard 烧掉的三天改动。","title":"18 天，100 次提交，我给它拍了个片子"},{"content":"今天干的事有点无聊：删 skill。删完觉得值得记一笔。\nskill 就是一份 Markdown 先说清它是什么。在我平时用的这套东西里（DeepSeek Harness，下面写 DSH），skill 就是一个文件夹加一份 SKILL.md——正文是写给模型看的操作说明，开头一段 front matter。\n关键在于 front matter 里的 description。我原来以为它写的是「我是干什么的」，其实不是。它写的是「什么时候该用我」。随便挑一个装着的一看就明白：\nUse when asked to animate something, add motion, make a component feel alive, or build a transition.\n这是一条路由说明。模型每次拿到你的话，先看这份清单，判断该不该把某个 SKILL.md 读进来，再照着做。所以决定一个 skill 有没有用的，不是它正文写了多少，是那句 description 有没有把「什么时候」说对。\nDSH 的 skill 放在 D:\\dsh-home\\skills\\\u0026lt;名字\u0026gt;\\SKILL.md。这份清单在会话启动的时候加载一次，所以新装的 skill 要重启才生效——今天装了东西没反应，就是卡在这儿。另外它不装也能用：把 SKILL.md 的内容直接贴给模型就行，今天试过，一样管用。\n每个 skill 都在每一次请求上收钱 上面那套机制有个代价：description 会进每一次请求。\n不是「用到的时候才加载」。是每一轮对话开始之前，所有 skill 的名字和 description 就已经摆在模型面前了。装一个不用的 skill，等于每一句话都多背一段无关的说明。\n这件事我一直知道，但没当回事，直到今天去数了一下。\n231 个 这台机器上原来堆了 231 个 skill。\n其中两百多个是同一套东西：一整批科研方向的合集。天文学、生物信息、量子计算、细胞图像、代谢建模、脑影像……我数的时候有点想笑——我是写博客的，一个都用不上。\n光这些的 description 加起来 88,920 个字符，约 25,406 token。再把 name 和格式开销算进去，每次请求打底就要 ≈29,217 token。还没跟它说一个字，上下文里先垫进去这么多。\n处理方式没什么技术含量：按来源和加入时间分批过一遍，只留四类——官方文档处理（docx / pdf / pptx / xlsx）、工程流程、求职那套、动效设计。\n结果是 56 个。description 降到 17,600 字符 ≈ 5,029 token，每次请求打底从 ≈29,217 降到 ≈5,783。\n省下 71,320 字符 ≈ 20,377 token，砍掉 80.2%。\n我的判断是：重点不是 56 这个数字，是 80.2% 这个比例。一个 skill 单看都很便宜，两百多个叠在一起就不便宜了——而且它们不会因为你不用就不收费。\n顺手记一件当时让我停了一下的事。那批里面有个 skill 是能读写文件的，还会通过另一个程序看你的屏幕，它要你在本机装一个额外的程序才能跑起来。我没装，也删了。不是因为它一定有问题，是我根本不知道它要干什么。\n然后我拿留下的那套干了件正经事 留下的一批里，有 10 个来自 emilkowalski/skills（46,028 star，MIT，作者 Emil Kowalski）。这套是给设计师和工程师用的，讲界面动效和视觉判断，一共 15 个 skill：animate、review-animations、mobile-native、break-ui、apple-design、animation-performance 等等。\n我挑它不是因为 star 多，是因为它是纯 Markdown——零脚本、零依赖。这一点对我很重要：纯文本的东西能读、能改、能直接贴给模型，不用先信它会干什么。\n于是拿它审了这个站的前端。审的是 assets/css/extended/fluent.css，当时 4,371 行。\n出来 22 条：值得动的 9 条、可以考虑的 9 条、不建议动的 4 条。另一栏里，18 条算客观问题，9 项算审美偏好——偏好那栏我特意留着，它们不是错误，是「换一种做法也行」的意思。\n真改了 3 处，已经上线。\n搜索框字号 15px 改成 16px。 15px 的输入框在 iOS 上被聚焦时，整个页面会被放大，而且不缩回来。这条我原来完全不知道。\n状态栏那颗「呼吸的绿点」不呼吸了。 它原来挂着一个 box-shadow 动画，全站常驻，每秒重绘。删掉的理由不是性能，是它不传达信息：「稳定运行」这件事，绿点的颜色加后面那行字已经说完了。\n阅读进度条从 width 改成 transform: scaleX()。 这是全站唯一一处动布局属性的动画。\n改完顺手反查了一遍，这个站原本没犯最常见的几个错：transition: all 0 处、will-change 0 处，ease-in 也没有单独出现过，4 处全是 ease-in-out。这一点我承认有点意外。\n还有几个我看到了、没装的 今天查资料的时候还看到几个。\nREA，用 agent 逆向软件，GitHub 上 17.9 万星；dsh-notifier，管通知和远程控制，写着 28 个出站通道、6 个入站控制；还有一个把 DSH 接进微信的第三方方案。\n这三个我都没装，只是看到。 写在这里是因为查的时候确实碰到了，不是因为我觉得它们该装。skill 这东西现在是真多，而每装一个都要在每次请求上付一次钱——今天刚算过这笔账，所以下一次手会慢一点。\n","permalink":"https://yunblog.com.cn/posts/dsh-skills-231-to-56/","summary":"这台机器上原本堆了 231 个 skill，光 description 每次请求就要 ≈29,217 token；砍到 56 个之后，打底降到 ≈5,783。留下的那批里有一套动效设计的，拿它审了本站的 CSS，真改了 3 处并上线。","title":"我往 DSH 里塞了 231 个 skill，然后发现它们每次请求都在收钱"},{"content":"想要一个谷歌账号。原以为是最没什么可说的一件事，结果在验证那一步卡了两次。\nWindows 上走注册流程，走到验证环节，页面跳出来一个二维码。换到 Mac 上再走一遍，一样，也是二维码。两边停在同一处，账号注册不下去。\n后来换了个思路：不换机器，换环境。用一个指纹浏览器，把环境模拟成了 Linux。\n二维码那一步就没有了 —— 直接进到手机号验证。\n手机号我填的是 +86 的号。验证码收到了。\n具体用的是哪一款指纹浏览器、环境是怎么设成 Linux 的，这篇不展开。我只写「用了」和「结果」，不写「是什么」和「怎么做」——按着半截说明去操作，比不写更容易让人白费工夫。\n看到这里最想知道的，多半就是「到底怎么设的」。我理解，但这一段还是留白：写个大概，它会显得像一个方法；真照着做对不上，比一开始就说明这里没有更浪费时间。\n（留个口子：要补的话，用哪一款、怎么设的，直接在这句后面接着写。）\n还有一个前提得先摆在这儿：这套走法要能正常访问谷歌。网络不通的话，页面本身都打不开，后面的事都无从谈起。\n过程就是上面这些。剩下的部分我不太想含糊过去。\n结论是能。这一次注册流程走到手机号验证，我填的是 +86 的手机号，谷歌的验证码发过来了。在那之前我做好了被挡回去的准备，结果是没被挡。验证码能收到，至少说明这一次的验证环节没有把这个号挡在门外。\n专门写一句，是因为这个问题很难有「官方答案」。想知道准确的规则，得能看见谷歌内部是怎么定的，而这个信息在门外的人手里根本没有。所以能拿出来说的只有样本：某个人、某个时间、某个号，走通了或者没走通。我手里这一份，是走通了。\n一条走通的记录，能说明的事情有限。它说明这条路有人走过、当时是通的；它不说明这条路对你一定成立 —— 你的号、你的时间、你碰上的流程，都可能跟我不一样。当成一条线索可以，当成一个保证不行。\n这种事最麻烦的地方是没法让别人替你确认。号不一样，时间不一样，流程本身也在动，所以别人说行、或者别人说不行，对你都只是参考 —— 别人说行你未必行，别人说不行你也未必不行。真正算数的还是自己那一次。\n而且它有时效。谷歌的注册流程一直在调整，验证环节长什么样、认哪些号段，都不是固定的东西。今天能走通，不保证明天还行；我这边能走通，也不保证你那边的流程跟我看到的一样。所以下面这几句就是我能负责的全部内容——\n2026 年 10 月，我用一个指纹浏览器把环境模拟成 Linux，走通了谷歌账号的注册：二维码那一步没有出现，直接到手机号验证；手机号填的是 +86 的号，验证码正常收到。这就是全部依据。\n为什么换个环境就少了一步，我没有答案。谷歌是按什么规则认号的、这个状态还能维持多久，我不知道，也不打算猜。猜出来的是解释，不是答案，写出来只会让别人多踩一次坑。\n如果你也在犹豫自己那个号还能不能行，我的建议是直接试一次。成本很低，结果比任何说法都直接。\n","permalink":"https://yunblog.com.cn/posts/google-account-plus86-phone/","summary":"Windows 和 Mac 上注册谷歌账号，都卡在二维码验证那一步；用一个指纹浏览器把环境模拟成 Linux 之后，二维码没出现，直接进到手机号验证，+86 的号收到了验证码。这是一次走通的记录，不是官方教程。","title":"注册谷歌账号卡在二维码验证，把环境模拟成 Linux 之后走通了"},{"content":"前阵子想，天天使唤它，总得给它做个形象吧，刷小黑盒的时候刷到了四面图。于是有了这只小女孩：Q 版三头身，通身蓝色，能长鲸鱼的地方全长满了。\n兜帽是一整颗鲸鱼头。围巾上印着小鲸鱼，裙子上也有，裙摆后面还伸出来一条真的鲸鱼尾巴——不是印花，是立体的、会跟着动的那种。颜色只有蓝和白，帽檐、袖口、裙边、靴口都是一圈白绒绒，看着像冬天出门的打扮；头发长到脚踝，两边各扎一个毛球。\n下载：蓝色鲸鱼女孩（.glb，56.38 MB）\n模型是用 T3D 生成的。我把设计图丢进去，出了一版就基本对上了。想要原版、或者想自己再生成一个，可以去网站上玩；懒得折腾的直接下我这份，内容一样。\n三个角度 三张图是刚在浏览器里截的，没修过。\n正面。兜帽顶上那撮小尾巴，还有趴在帽檐右边的小鲸鱼，都在这儿。\n背面。这张我最喜欢：兜帽从后面看就是一整颗鲸鱼头，两侧的胸鳍像耳朵一样支出来，头顶立着一根小尾巴。\n侧面。鲸鱼的眼睛和嘴在帽子侧边，裙摆后面那条尾巴在这个角度看得最清楚。\n这个文件有点分量 56.38 MB，1,966,884 面，1,024,506 个顶点。拿来渲染静帧、丢进模型查看器里转着看，一点问题都没有。但想塞进游戏、网页或者做实时渲染，得先减面——这一个角色的面数，差不多顶别人一整个场景。贴图是打包在 glb 里的，不用另外找文件。\n做出来我自己来回看了好几遍，觉得挺可爱，就放出来了。想要个减过面的版本，或者发现哪里不对，说一声。\n这个文章说不定都是大肥鱼自己写的。\n","permalink":"https://yunblog.com.cn/posts/blue-whale-girl-3d/","summary":"一只浑身鲸鱼图案的小女孩：兜帽是一整颗鲸鱼头，裙子后面还伸出来一条真的鲸鱼尾巴。用 T3D生成的 Q 版 3D 模型，本站可以直接下载 —— 不过它有 56.38 MB、近 200 万面，想拿去做实时渲染得先减面。","title":"给蓝色大肥鱼做了个拟人模型，放出来下载"},{"content":"我想要的效果很小：网易云在放歌的时候，窗口背后有一层会动的画面。桌面本身该什么样还什么样。\n现成的做法基本都要 Wallpaper Engine（Steam 上的付费软件），而且是铺满整个桌面，网易云窗口压在上面照旧是一块死板的深色。索性自己写了一个。\n下载：网易云动态壁纸（绿色版，179 KB）\n解压就能用。下面说清它干什么、有什么毛病，以及代码是谁写的。\n它做两件事，别搞混 窗口背景：把一段 mp4 当成网易云的背景在放。歌在响，画面在动，播放条和歌词照样看得清——它们压在视频上面的一层半透明玻璃上。这个不需要 Wallpaper Engine，装完就能用。\n桌面壁纸：把正在播的封面、歌名、歌词画到真实桌面上。这个需要 Wallpaper Engine，包里带的是一个 WE 工程，没装就用不了——但不影响上面那条。\n两个都能叫「动态壁纸」，最容易混的就是这里。我只开第一个：桌面留干净，画面只出现在网易云窗口里。\n三步 解压到任意位置； 双击里面的 网易云动态壁纸.exe； 点【安装】。 路上有两个岔口。没找到 Node.js 会弹窗，点「自动下载 Node 便携版」就行，约 30 MB，走国内镜像，不写注册表、不改 PATH、也不动系统里已经装着的 Node。没找到网易云会弹窗让你指定 cloudmusic.exe。\n装完它会自动启动一次：拉起数据桥 → 用调试模式启动网易云 → 注入画面 → 打开换壁纸页面。以后每次用，双击桌面上那个快捷方式。换壁纸的页面是 http://127.0.0.1:3210/switch，一格格缩略图，点「应用」当场就换。\n包里没有壁纸 这是我定的：一个壁纸都不放。视频素材的来源和授权我管不了，我能决定的只有自己的代码怎么发。\n所以下载包里 wallpapers 是个空文件夹，装完也是空的，不会因为没放 mp4 就报错。要加：把任意 .mp4 / .webm / .mkv / .mov 丢进安装目录下的 wallpapers（默认在 D 盘的 NeteaseWallpaper，没有 D 盘就落到当前用户目录），刷新页面就能看到。你自己放进去的文件，以后再点【安装】也不会被覆盖。\n两个必须先说的提醒 exe 没有数字签名。 第一次双击会被 Windows SmartScreen 拦一下，标题是「Windows 已保护你的电脑」，说的是未知发布者，不是文件坏了——点「更多信息」，再点「仍要运行」。个人小工具，没买签名证书。\n杀毒软件可能报警。 它的工作方式是给网易云加一个 --remote-debugging-port 启动参数，再用 Chrome DevTools 协议读网易云自己的页面、往里注入一层视频。从杀软的角度看这就是「远程调试 + 注入界面」，个别国产全家桶会拦，加白名单即可。它全程只写自己的目录、桌面快捷方式和当前用户的自启项，不需要管理员权限，也不改网易云安装目录里的任何文件。\n有一件事我觉得做得挺值 读取「现在在放什么」，常见做法是截屏识别或者扒窗口标题猜进度，都不准。\n网易云本身就是 Chromium 内核的应用（我用的是 3.1.41，CEF，Chromium 91），带上调试参数启动后会在 127.0.0.1 上开一个端口。工具连上去直接读它的播放器 DOM：进度条那个 input[type=range] 的 value 和 max，单位是秒，所以进度是精确值而不是估算；歌词列表就在页面里、时间戳也在，连歌词接口都不用打；歌曲 id 写在播放条的 data-log 里，查元数据零歧义。\n不加启动参数也照常能用，只是自动降级：数据源从 cdp 换成窗口标题，进度变成估算，歌词改走网易云接口，封面歌名都不受影响。反向控制播放（上一首、暂停）只有调试端口这条路能做，服务本身只用 Node 内置模块、只绑回环地址。\n谁写的 代码是 DeepSeek 写的，需求和验收是我定的。分工值得摊开说，不然「用 AI 写的」这四个字没什么信息量。\n我定的部分：要什么效果（背景要有画面，但压在它上面的歌词必须看得清）；不能碰的线（不改网易云安装目录、不要管理员权限、卸载只许结束它自己启动的那个 node、不许误杀我别的 node）；验收方式（真机上跑，界面得是我眼睛看到的样子）。\n它写的部分：数据桥、CDP 那一套、注入器、C# 安装器、换壁纸网页、打包脚本，还有文档。文档占的分量不小：哪条选择器拿哪个字段、出问题怎么查、给陌生人看的三步说明，都是它写的。它写文档的好处是愿意把「为什么非得这么写」一起写上，不只列步骤。\n它也错，而且错得很有代表性——都不是语法错误，是只有真机上才暴露的东西：\n启动脚本一开始带着中文注释。cmd.exe 按控制台代码页读 .cmd，中文被从中间截断，双击以后什么都不发生，也不报错。现在那个文件强制纯 ASCII，文件头写着「别顺手清理」。 PowerShell 脚本必须带 UTF-8 BOM。PS 5.1 只认带 BOM 的 UTF-8，没有就按 GBK 读，中文注释直接把脚本读崩。 它以为注入用的脚本注册一次就长期有效。实测是调试连接一断，注册就没了，网易云刷新页面也不会自动恢复。这才有了 --keep-alive。 这几条现在都写在文档最显眼的位置。这个仓库给开发 agent 立的规矩里有一条：结论要对着现场核对，不能只读仓库。小工具的文档是同一条规矩的另一种写法：那张选择器表上标着「全部实机探测得出，不是猜的」，因为猜的那些都错了。\n现在还不行的地方 只支持网易云 3.x（CEF 内核）。2.x 和更老的版本会在安装时报错并中止，不会装一半。判断依据是 cloudmusic.exe 旁边有没有 libcef.dll。\n注入是运行时的。 网易云重启一次就得重跑一遍（点一下快捷方式），嫌烦可以用 --keep-alive 自己恢复。网易云升级也可能改界面结构，玻璃那部分是运行时扫出来的背景色，退化表现是「没效果」而不是「界面坏掉」，所有改过的地方都记着原值，一键还原。\n桌面壁纸那一项要 Wallpaper Engine。 没装的话安装时探测不到，会弹一个说明框，措辞是「正常降级」，不是报错；探测读的是注册表和常见安装目录，装在偏门位置可能探不到——不代表你没装，装好 WE 再点一次【安装】就行。真出别的毛病，看安装目录下的 install.log 和 service.log，界面上也实时打印原因。\n下载 地址：https://music.yunblog.com.cn/netease-wallpaper-portable.zip 大小：183,164 字节（179 KB） SHA-256：74C02D98105567AF74B61832CBD0BE1DACEB64FE0DEEF0BA55277EE64FDE9FFC 包里除了 exe，还有全部运行时文件、installer 下的安装器源码（想重编，系统自带编译器就够）和两份说明；日志、截图、缓存、便携 Node 都没打进去。\n用着有意见或者发现哪里不对，留言说一声。\n","permalink":"https://yunblog.com.cn/posts/netease-dynamic-wallpaper/","summary":"一个小工具：把视频当网易云窗口的背景放着，不用装 Wallpaper Engine。包里没有壁纸，得自己丢 mp4；exe 没签名、杀软可能报警。顺便说清这里面的代码是谁写的、哪儿被纠回来了。","title":"做了个网易云动态壁纸，可以下载"},{"content":"域名是早就买好的。仓库是空的。剩下的都是我原本不太会的东西。\n第一次提交里有 17 个文件，一整套 Hugo 骨架加一篇占位的 hello-world。真正让站转起来的是四份配置：hugo.toml 决定站点长什么样，wrangler.toml 决定部署到哪，.pages.yml 决定后台能改什么，.github/workflows/deploy.yml 决定怎么自动发布。写到今天，仓库里已经有 66 次提交。\n这篇不写教程，就说中间那些坑。\n先决定不要服务器 不想买服务器。后面所有选择都是这句话的结果。\n要一台机器整天跑着，要担心它挂，要记得续费——我折腾网站是为了好玩，不是给自己找一份运维的活。所以一开始就定了静态站：Markdown 进去，HTML 出来，推上去就完事。主题挑 PaperMod，因为它干净，而且留了口子：想改哪里，在项目根放个同名文件覆盖就行。托管放 Cloudflare Workers，静态资源传上去，免费，HTTPS 自带。\n推 main 分支，GitHub Actions 自动构建部署，大概一分钟。没有预览环境，没有灰度，推上去就是生产环境——这一点我用了好几天才真正有感觉。\n主题其实被我改得差不多了 PaperMod 只是打底。现在页面上的东西几乎全是后加的：玻璃拟态卡片、8 张背景图每 30 秒轮换、一直飘的樱花、页脚那行北京时间时钟。真正磨人的是「看得清」。\n8 张背景图深浅不一。遮罩糊厚了背景像蒙一层雾，糊薄了字就没了。我把模糊从 blur(20px) saturate(1.8) 一路砍到 blur(6px) saturate(1.4)，背景立刻通透——然后实测页脚那行 12px 灰字，最透的地方对比度只剩 1.57:1。基本等于看不见。\n解法不是把遮罩加回去，那背景又要糊。我给这些「直接压在背景上、底下没有卡片托着」的文字单独加了一层底衬：一层纯色，四周用模糊化开，中间是实心的，所以文字正后方的对比度可测、也稳定。页脚那行字后来回到 3.12:1。\n后来才想通：文字压在纯黑到纯白的底图上，对比度上限就只有 2.86:1。光靠遮罩，物理上就到不了 3:1。\n为了让音乐不断，我写了一套切页 这是整个站最花时间的一件事。\n我想要的效果很朴素：点导航换页面，歌不能停。但整页跳转一定会重新加载文档，音频对象就没了。现成的库不管这个需求，它们都假设文档会被换掉。\n所以自己写。拦掉站内链接，fetch 目标页，用 DOMParser 解析，然后只替换内容区那一块。页头、页脚、播放条、樱花都在内容区外面，永远不会被换掉。音频对象压根不在 DOM 里，换内容跟它没关系。\n写起来才知道麻烦。最典型的 bug 是「抢跳」：连着快点几个链接，后点的会被前一个顶掉——旧请求被 abort 之后，它的 catch 还在执行整页跳转。修法是给每次导航编号，只有最新那一次允许回退。\n还有一个更阴的。切到新页面时，右下角那条迷你播放条会短暂地出现两条。查了半天才明白：View Transition 里凡是声明了 view-transition-name 的元素，旧快照会作为「退场」元素一直留在屏幕上，直到整段过渡结束。把名字临时摘掉就正常了。\n60 MB 的 mp3 不该躺在 git 里 一开始六首 mp3 加起来差不多 60 MB，全提交进了仓库。每拉一次代码就要拖 60 MB，而且 git 的历史是删不掉的——就算 git rm 了，历史里那一份还在。这个问题我一开始完全没想到。\n后来全搬到了 Cloudflare R2，仓库里一个 mp3 都不剩。现在歌单已经扩到 12 首，仓库该多大还是多大。播放器全站只有一个 \u0026lt;audio\u0026gt;：首页大卡、音乐页大卡、右下角迷你条，是同一个音频对象的三种皮肤，切页之后重新查询 DOM 把状态画上去。\n那个滑块，和一条反直觉的规矩 左下角有根竖着的滑块，访客自己拉 0 到 100，决定背景图透出多少。公式一句话：遮罩不透明度 = 100 − 清晰度。0 是全遮住，40 是默认，100 就是一点遮罩都没有。方向特别容易记反，我每次改之前都得先念一遍。\n滑块用的是浏览器原生的 \u0026lt;input type=\u0026quot;range\u0026quot;\u0026gt;，拖动、触摸、方向键全是自带的。也没让它记住访客的选择：每次进来都是默认的 40。麻烦的还是底衬——清晰度拉得越高，遮罩越薄，底衬就得越厚。这个方向跟直觉正好相反，我差点写反。\n接上后台，我就不用改代码了 接上 Pages CMS 之后，写文章不用再改文件、提交、等构建了。它不存内容，只是在仓库上做增删改，保存时替你提交一次 commit——仓库里那几次 Update content/posts/xxx.md (via Pages CMS) 就是这么来的。文章、封面图、公告、技能清单，后台里都能改。\n有个细节差点把我坑了：Pages CMS 保存时会按配置里声明过的字段重新拼一遍 front matter，没声明的键会被直接丢掉。所以「后台要能改」的页面，都不能把网址和模板写进 front matter，得靠目录名去决定。\n翻车记录 仓库里没有，不等于页面上没有。 技能页上我写过一句「页面里也没有任何 CDN 引入的脚本」，依据看着很充分——仓库里没有 package.json，仓库里没有 CDN 脚本。然后实测抓了线上 7 个页面：每页的 \u0026lt;script src\u0026gt; 都是 11 个，站内 10 个，外链 1 个。那一个是 Cloudflare 在代理层自动注入的统计脚本，仓库里 0 处命中，读多少遍代码都发现不了。\n复核方式本身也是个坑。curl 默认发的 Accept 是 */*，而 Cloudflare 只在 Accept 含 text/html 时才注入。用裸 curl 抓，抓到的 HTML 是「干净」的，会再得出一次同样的错误结论。同一个坑我摔了两回。\nwrangler 版本。 第一次自动部署就失败了，报错只有一行：The process '/usr/local/bin/npx' failed with exit code 1。原因是 wrangler-action@v3 默认装的是 wrangler 3.90.0，2024 年的版本，它不认识我配置里 compatibility_date = \u0026quot;2026-10-09\u0026quot; 这种未来日期。给 action 显式钉上 wranglerVersion: '4' 就好了。\nAnalytics Engine 要先在后台点一下启用。 加完访问统计，部署直接失败：You need to enable Analytics Engine. [code: 10089]。这是账号级的开关，代码里怎么写都没用。麻烦的是它失败的方式——站点不会坏，线上停在最后一个成功部署的版本照常访问；但 Actions 会一直红，我在后台写的文章也发不出去。看起来一切正常，实际上内容已经停止更新。\n查询脚本八条全是坏的。 我把 SQL 的列别名写成了中文（AS 访问次数），八条查询全部报 422：Expected an identifier after AS, found: 访。而交付之前我只跑了语法检查，它是绿的。能解析，不等于能跑。\n现在 访问统计上线后立刻查了一次：21 次访问，4 个访客指纹，国家 CN、来源 direct 都符合预期。里面还夹着两条波兰来的记录，是境外扫描，属于正常噪声。\n从 17 个文件的骨架，到 66 次提交。域名是买的，服务器是没买的，其他都是折腾出来的。还有一堆想做的没做——音乐码率还没降，想写的东西还欠着。\n慢慢来吧。\n","permalink":"https://yunblog.com.cn/posts/site-build-log/","summary":"从一个空仓库折腾到现在。写写中间绕不过去的弯路：遮罩调到 1.57:1、为了让音乐不断自己写了一套切页，还有那句被线上实测推翻的话。","title":"这个站是怎么被我折腾出来的"},{"content":"折腾了几天，这个站算是能见人了。写一篇记录一下用了什么、怎么用。\n它是什么 1.一个静态博客。没有数据库、没有服务器上跑着的程序、没有登录框——但有一个网页后台，下面会说。\n2.本站可以说是没什么技术含量，除了挂载一个域名，在没有其他的部署成本，后台仅包含帖子编辑功能，其他均属于样式。\n3.以后也许会有新站或是迁移新框架，再说吧，也许不会呢，有需要可以访问我的github或是QQ联系我。\n4.这段话来自人间之里404号，🍺干杯。\n用到的技术 建站与主题\nHugo——静态站点生成器。写 Markdown，它吐出 HTML，快得离谱 PaperMod 打底，但前端基本被我重写了一遍 托管与部署\nCloudflare Workers——免费托管，全球节点 GitHub Actions——我往仓库推代码，它自动构建 + 自动部署 Cloudflare R2——专门放音乐文件，60 MB 的音频不占代码仓库 后台\nPages CMS——一个网页后台，能直接改文章、传图片，保存后自动提交到 GitHub 前端\n全是原生 JavaScript，零第三方库——播放器、歌词滚动、樱花、背景轮换、无刷新切页，都是手写的 站上有什么 首页\n左边是个人信息卡，下面一排图标：GitHub、B站、QQ、邮箱、RSS QQ 和邮箱点一下就复制，不用手抄 右边是音乐播放器，点中间那个大按钮开始播 再往下是文章列表 音乐页（顶部导航的「音乐」）\n左边是大播放器：旋转封面、进度条、上一首 / 下一首、音量 右边是跟着播放逐句高亮的歌词，双语显示 底下是完整的目录，点任意一首就切歌 其它细节\n切页面音乐不会断——这是我最得意的地方。点导航换来换去，歌一直放着 右下角有个迷你播放条，在别的页面也能控制音乐 点右上角月亮切换深色 / 浅色，会有一个圆形扩散的动画 樱花一直在飘，左下角有个开关，不喜欢可以关掉 背景每 30 秒自动换一张 搜索在顶部导航里 怎么用 听歌：在首页或音乐页点播放。切页面不会中断 找文章：顶部「文章」，或者左边那棵导航树 搜东西：顶部「搜索」 联系我：首页个人信息卡下面那排图标，QQ 和邮箱点一下就是复制 看视频：文章里嵌了 B 站播放器，可以直接看 后面还想做的 把音乐码率降一降，手机上加载更快 多写点东西 ","permalink":"https://yunblog.com.cn/posts/site-v1-launch/","summary":"折腾了几天，这个站算是能见人了。写一篇记录一下用了什么、怎么用。","title":"本站初版完工"},{"content":"这篇文章演示怎么在文章里嵌 B 站视频。视频托管在 B 站，本站只负责放一个 16:9 的播放器，\n所以不占服务器流量、不用自己转码，手机上也能正常看，提醒自己用。\n最简写法 在 Markdown 正文里写一行：\n{{\u0026lt; bilibili BV1xx411c7mD \u0026gt;}} 渲染出来就是下面这样（示例用的是 B 站官方的测试视频，换成你自己的 BV 号即可）：\n示例：bilibili 官方测试视频（字幕君交流场所） 换成自己的视频 BV 号在 B 站视频页的地址栏里，形如 https://www.bilibili.com/video/BV1xx411c7mD/， BV 开头那一串字母数字就是。\n可选参数 参数 说明 默认值 bvid（或第 1 个位置参数） 视频的 BV 号，必填 — p 第几个分 P 站方默认（第 1 P） autoplay 1 打开自动播放 0 danmaku 0 关闭弹幕 站方默认 caption 播放器下方的图注 无 带参数的写法（注意：位置参数和命名参数不能混用，要么全用命名参数，要么只用第一个位置参数）：\n{{\u0026lt; bilibili bvid=\u0026#34;BV1xx411c7mD\u0026#34; p=\u0026#34;1\u0026#34; autoplay=\u0026#34;0\u0026#34; caption=\u0026#34;第一期：开箱\u0026#34; \u0026gt;}} 小提示：想同时展示短代码本身和渲染结果时，用 {{\u0026lt; … \u0026gt;}} 把短代码包起来， 这样它会被当成普通文本显示，而不是被执行（本文上半部分就是这么写的）。\n实现说明 短代码文件：layouts/_shortcodes/bilibili.html 播放器地址：https://player.bilibili.com/player.html?bvid=…\u0026amp;autoplay=0\u0026amp;high_quality=1 外层容器 .fc-video 用 CSS 的 aspect-ratio: 16 / 9 做自适应，样式在 assets/css/extended/fluent.css iframe 带 loading=\u0026quot;lazy\u0026quot;，首屏不会因为视频变慢 一点取舍 优点：不用自己托管视频，B 站自带多码率与 CDN，国内外都能看； 缺点：播放器是 B 站的域名，页面会加载 player.bilibili.com 的脚本与样式； 非常在意隐私或加载速度时，可以考虑先把视频传到 B 站、只在文章里放一个链接 + 封面图。 ","permalink":"https://yunblog.com.cn/posts/bilibili-video-demo/","summary":"视频不自己托管：一行短代码把 B 站播放器嵌进文章，16:9 自适应，还带圆角容器。","title":"在文章里嵌 B 站视频（bilibili 短代码）"},{"content":"欢迎来到我的个人博客！这是第一篇文章，用来验证 Hugo + PaperMod 的构建和渲染是否正常。\n这个站点是怎么搭起来的 用 Hugo 生成静态站点，主题是 PaperMod 主题以 git submodule 的方式挂在 themes/PaperMod 推送到 GitHub 后由 Cloudflare Pages 自动构建、全球加速 最后绑定自己的域名 代码高亮测试 package main import \u0026#34;fmt\u0026#34; func main() { fmt.Println(\u0026#34;Hello, Hugo + PaperMod!\u0026#34;) } 接下来 初始化站点 配置中文界面 写第二篇文章 绑定自定义域名 提示：编辑 content/posts/ 下的 Markdown 文件即可发布新文章，推送后 Cloudflare Pages 会自动重新部署。\n","permalink":"https://yunblog.com.cn/posts/hello-world/","summary":"博客的第一篇文章：记录这个站点是怎么搭起来的。","title":"你好，世界"},{"content":"","permalink":"https://yunblog.com.cn/site/","summary":"本站的文章数、音乐数、已运行天数（以及可选的累计访问量）","title":"本站概况"},{"content":" 这一页是我的个人简历，目前还是一个回到小城市还在待业的应届生，写这个网站主要作用是直接提供项目经历，二就是有点闲的没事干了学点东西。您如果看到这里，应该是看了我的简历，本人可以接受硬件软件，互联网行业，新媒体运营，新能源方面的工作，工作地点是苏州，南京和泰州。\n我还没想好或者还没有的部分，留了明显的空位并标着「这里准备放什么」，等我补上再删掉提示。\n📌 这一页可以在网页后台改：左侧点 「个人简历」，改完点右上角 Save，大约一分钟后线上更新。\n关于我 名字：浮华Yun,只是网名，具体以我投的简历为主。 这个博客：YunX东方夜话 —— https://yunblog.com.cn 在做的事：写技术笔记、折腾自己的网站、记录生活随笔 我自己写在这份简历上的自我介绍，就是站点首页那句原文：\n你好，我是浮华Yun 👋 这里记录我的技术笔记、折腾过程和生活随笔。 [暂时的静态网站]\n技能 / 技术方向 1.这一节只列这个站真的在用、并且能在仓库里指出用在哪的东西 —— 跟站里「技能」那一页用的是同一条收录标准，不是一份「我会什么」的清单。\nHugo —— 这个站就是用 Hugo 0.167.0（extended 版）构建的，主题是 PaperMod。 HTML / CSS —— 全站观感来自一份自己写的 fluent.css：玻璃卡片、深浅两套配色、响应式布局。 JavaScript—— 站内脚本（pjax 无刷新切页、音乐播放器、背景轮换、状态栏等）。 Cloudflare Workers —— 站点托管在这里；另外有一段 Worker 脚本负责页面访问统计。 Git / GitHub —— 这个站的源码放在 GitHub 上，推上去就自动构建部署。 2.设计类技能: 熟练使用PS、AI、Figma完成海报、LOGO、新媒体配图、移动端界面设计；熟悉Blender、3D Max基础建模、材质渲染、场景搭建；掌握Axure原型制作，可独立完成简单APP/小程序交互原型设计。\n视频后期: 熟练使用PR、AE完成短视频剪辑、调色、特效合成、动态字幕制作，可独立完成宣传片、短视频、vlog全流程制作。\n专业技能： 掌握计算机硬件维修与售后技术，具备 Java、Python 编程基础，学习能力强，做事严谨负责。视频后期：熟练使用PR、AE进行短视频剪辑、调色、特效合成、动态字幕制作，能够独立完成宣传片、短视频、vlog全流程制作。\n项目经历 YunX东方夜话（个人博客）· 个人项目 · 线上运行中 网址：https://yunblog.com.cn\n我自己的个人博客，从搭起来到日常更新都在自己维护。下面写的是这个站现在实际有什么 （技术细节记在仓库的 docs/技术总览.md 里）：\n建站：Hugo + PaperMod 主题，外面套一层自己写的样式覆盖层，所以外观和主题默认样子差别很大。 无刷新切页：站内点链接时自己写的 pjax 只替换内容区 —— 这样切页时背景音乐不会断。 音乐播放器：全站共用一个播放器；音频文件放在 Cloudflare R2 上，仓库里只留封面和歌词。 内容后台：接了 Pages CMS，写文章、改公告、改这一页简历都在网页后台点，保存后自动重新构建发布。 访问统计：用 Cloudflare Workers + Analytics Engine 记录页面访问； 访客去重用的是加盐哈希指纹（SHA-256(IP + UA + 当天盐)），不存原始 IP。 校园新闻管理系统 · 毕业设计 · 大学期间 技术栈：Python + Django（Django REST Framework）／ Vue 3 + Vite\n大学期间做的毕业设计：一个前后端分离的校园新闻系统 —— 起因是校园新闻原来靠人工编辑、邮件或者单一后台发布， 更新不及时、分类乱、也没有师生互动，所以后端只出 JSON 接口、前端单独做成单页应用， 把「发布 → 审核 → 浏览 → 收藏评论 → 后台管理」整条链路做通，另外还加了视频点播、论坛和投票。 下面写的是这份毕设代码里实际有什么（后端 19 个 .py 文件、1845 行 Python；前端 31 个页面组件）：\n两端怎么分：后端是 Django + REST Framework，用 DefaultRouter 挂了 users / categories / news / comments / favorites / logs / videos / forum / polls / messages 十组接口，没有用 Django 自带的 admin， 管理后台是自己写在前端里的；前端是另一个 Vite 项目，axios 统一请求 /api，登录态存在 Pinia 里， 路由守卫按角色拦 /admin 和 /editor，开发时由 Vite 把 /api 和 /media 代理到后端的 8000 端口。 登录与权限：JWT 是自己写的（PyJWT、HS256、7 天有效期，token 放在 Authorization: Bearer 请求头里）， 角色分管理员 / 新闻编辑 / 普通用户三种，接口按角色决定放不放行。 新闻的流转：草稿 → 待审核 → 已发布，另外还有「已退回」「已拒绝」两种带原因的终态； 编辑只看得到自己发的稿子，管理员审核时可以通过、退回、拒绝 —— 退回必须填修改意见， 编辑那边能看到意见、改完再重新提交；发布之后还能置顶和推荐。 浏览与搜索：列表按「置顶优先 + 时间倒序」排、每页 10 条，支持按分类筛选、按标题 / 正文 / 标签搜索； 详情页每打开一次浏览量 +1，另有两个接口分别给出「热门新闻」（浏览量前 10）和「推荐新闻」。 评论与收藏：评论支持二级回复，评论本身也有「待审核 / 已通过 / 已隐藏」状态，管理员可以隐藏不当评论； 收藏是同一个接口来回切，一个人对同一篇新闻只会有一条收藏记录。 后台管理：数据统计（用户数、新闻数、待审核数、总浏览量、各分类的新闻量）、用户管理（改角色 / 禁用 / 逻辑删除）、分类管理、新闻审核、评论管理、操作日志 —— 这类操作每做一次就写一条日志，记了操作人、 操作对象和 IP。 另外三块：视频点播带弹幕（滚动 / 顶部 / 底部三种位置，可自选颜色和出现的时间点）；论坛能发帖、回复、 置顶、关闭，帖子被回复时给作者发一条站内消息；话题投票支持单选 / 多选和截止时间，一个人只能投一次。 数据与规模：一共 14 张表（用户、分类、新闻、评论、收藏、操作日志、视频、弹幕、帖子、回复、投票、 选项、投票记录、站内消息），开发时用的是 SQLite3，配置里留了切 MySQL 的注释； 后端 19 个 .py 文件共 1845 行，前端 31 个页面组件。代码里最早的文件是 2026 年 3 月，论文定稿在 2026 年 5 月。 这套东西是在本机跑的（启动脚本里就是 127.0.0.1:8000 和 localhost:5173），代码里没有部署配置，没有上线。 教育经历 ++金陵科技学院 | 数字媒体技术 | 本科++\n++主修课程覆盖三维建模、数字图像处理、C/Python/Java程序设计、软件测试、Web应用开发等全栈技术模块。++\n++系统学习交互设计、动画制作、计算机硬件原理等交叉领域知识，具备技术与设计复合能力。++\n工作 / 实习经历 ++南京启科科技有限公司 | AI数据标注实习生 2025.7-2025.10++\n++• 负责2D图像+3D点云数据的标注、质检与整理工作，熟练使用专业标注平台完成目标框选、语义分割、3D目标检测、坐标系校准等任务。++\n++• 严格按照项目规范对车辆、行人、障碍物、道路设施等目标进行精准标注。++\n++• 按时完成每日标注任务，做好数据自查与交叉校验，及时反馈标注异常问题，所在小组交付效率始终高于团队平均水平10%。++\n++联想官方授权服务中心 | 硬件维修工程师实习生 2024.7-2024.9++\n++• 严格遵循联想原厂维修标准与服务流程，专注笔记本、台式机、一体机等设备的硬件故障诊断、维修与性能优化，累计独立完成设备维修超80台，用户满意度达96%。++\n++• 完成硬件更换、安装与兼容性调试；维修后进行全面功能测试、压力测试与稳定性验证，建立维修档案，全程可追溯，零返修记录。++\n++• 清晰解释故障原因、维修方案与费用，协助完成3家企业共200余台批量设备巡检、保养与故障预处理，提前3天完成项目交付。++\n联系方式 方式 地址 GitHub https://github.com/Reissena B 站 https://space.bilibili.com/471275021 网易云音乐 https://music.163.com/#/user/home?id=1374078630 QQ 3307590541 邮箱 3307590541@qq.com RSS 订阅 https://yunblog.com.cn/index.xml ","permalink":"https://yunblog.com.cn/resume/","summary":"\u003cblockquote\u003e\n\u003cp\u003e这一页是我的个人简历，目前还是一个回到小城市还在待业的应届生，写这个网站主要作用是直接提供项目经历，二就是有点闲的没事干了学点东西。您如果看到这里，应该是看了我的简历，本人可以接受硬件软件，互联网行业，新媒体运营，新能源方面的工作，工作地点是苏州，南京和泰州。\u003cbr\u003e\n我还没想好或者还没有的部分，留了明显的空位并标着「这里准备放什么」，等我补上再删掉提示。\u003cbr\u003e\n📌 这一页可以在网页后台改：左侧点 「个人简历」，改完点右上角 Save，大约一分钟后线上更新。\u003c/p\u003e\n\u003c/blockquote\u003e","title":"个人简历"},{"content":" 这里是公告栏。 站点有什么变动、要维护、加了新东西，都会写在这一页。\n公告 2026-10-13 —— 今天有部分地区打不开本站，说一下情况。\n站点本身是正常的：内容都在，服务器响应也正常，大部分地区访问不受影响。原因是本站托管在 Cloudflare 上，个别边缘节点在某些线路上连通性不稳定 —— 同一条宽带刷新几次，有时能开、有时不能，就是这个缘故。\n这不是站点故障，也不是内容出了问题。如果你正好碰上打不开，可以试两件事：把 DNS 换成国内的公共 DNS（比如阿里或腾讯的），或者过一会儿再刷新一次。这边会继续留意。\n2026-10-09 —— 站点上线，「关于」这一页和首页作者卡上的公告小标签一起开通。\n关于这个站 YunX东方夜话 是浮华Yun 的个人博客，用来放技术笔记、折腾过程和生活随笔。\n怎么改这一页 在网页后台左侧点 「关于 / 公告」，改完点右上角 Save 就行 —— 大约一分钟后线上就会更新。\n这一页里的摘要一行字，同时会显示在首页作者卡的那个小标签上； 封面图就是那个小标签左边的小图。改这里一处，两处一起变。\n","permalink":"https://yunblog.com.cn/about/","summary":"今天部分地区打不开本站：不是站故障，是 Cloudflare 个别节点在部分线路上不稳，换个公共 DNS 或稍后再试。","title":"关于"},{"content":"","permalink":"https://yunblog.com.cn/skills/","summary":"本站实际用到的技术栈清单，按用途分组，每项附官网链接","title":"技术栈"},{"content":"","permalink":"https://yunblog.com.cn/music/","summary":"本站音乐播放页：十二首曲子，逐句双语歌词","title":"云间乐律"}]