WTX's Blog
type: channel
link: https://imwtx.com/
description: Stay hungry, stay foolish.
items: 为博客图片开启 Token 防盗链
items: 2025 年终总结
items: 使用三方 frp 转发内网 Jellyfin
items: 快速移除过期 IPv6 地址，让 DDNS 更好用
items: 如何优雅地访问家中的内网服务
items: 2024 年终总结
items: 我的 NAS 折腾之路 一（硬件篇）
items: 2023 年终总结
items: 将电脑开关加入 HomeKit 以及基于 IPv6 的远程桌面
items: 2022 年终总结

为博客图片开启 Token 防盗链
type: item
date: 2026-05-05T07:04:00+00:00
description: 最近博客图床又被刷 PCDN 的团伙盯上了，几天刷完了我本来能用一年的又拍云联盟代金券，属实恶心至极。之前尝试开 IP 黑白名单和地区访问限制，也是治标不治本。于是开始研究怎么有效地防盗链。看到又拍云的控制面板里有 Token 防盗链，通过服务端生成带有时限的 Token 来控制访问，应该能有效阻止恶意刷流量，所以尝试用 Codex 写了一个 Typecho 插件来支持又拍云的 Token。插件已上传至 GitHub：TypechoUpyunToken，安装到 Typecho 的 usr/plugins 目录下即可。最后在插件设置页面，配置 CDN 域名白名单，以及和又拍云控制面板一致的 Token 密钥，即可快速启用。之后博客输出的图片，只要域名匹配，就会自动追加 _upt 参数进行校验，裸链接将被拦截，有效阻止了盗链的情况。参考又拍云 Token 防盗链文档：https://help.upyun.com/knowledge-base/cdn-token-limite/Typecho Hook 文档：https://docs.typecho.org/plugins/hooksTypecho 插件结构文档：https://docs.typecho.org/plugins/hello-world

2025 年终总结
type: item
date: 2025-12-31T12:00:00+00:00
description: 这是我的第十篇年终总结。我这辈子似乎很少有坚持做了十年以上的事情。很难想象高考复读那年年末，脑子一拍想着随便写点东西，居然能变成一个习惯直到现在。可能是因为我并不觉得写总结是一件麻烦事，反而乐于在每次年末去回忆有哪些值得记录的东西。虽然到最后大部分都还是没什么营养的琐碎口水，但是把记忆变成文字保存下来，总比在多年后逐渐遗忘要好，偶尔回头翻阅，似乎还能体会到当时的心境。关于电吉他今年首个要说的事，大概就是我尝试入门了电吉他。首先我得先忏悔一下，其实电吉他是从去年靠近年底的时候就买的，但当时并不能确定自己是不是三分钟热度，怕买回来没学两天又丢一边吃灰，最后闲鱼收场，所以并没有在去年的年终总结里提到这事，担心自己兴致勃勃地宣布自己要学吉他了，结果什么也没练成，搞得很丢人。不过很庆幸，虽然当初买吉他时给自己定的目标没有完成，中间也因为各种事情把吉他搁置过几个月，好在还是没有放弃练习。其实我从很多年之前就有了想学习一门乐器的想法。小的时候爸爸一直想让我学，但是那会性格贪玩，被我严词拒绝，现在想起来当时错过了最好的学习时间。之后自己慢慢对乐器有了些许兴趣，想过学钢琴、小提琴、大提琴...都是一些我自认为演奏起来很优雅的乐器，但也一直没有付出行动。为什么最后选择了电吉他，可能是之前玩 2077，受到了武侍的反叛精神感染；也可能是这两年开始听草东，喜欢那种酣畅淋漓的情绪释放；又或许是孤独摇滚和 MyGO 后劲太大，想找人组一辈子乐队（。总之在某个熬夜看完 GBC 的晚上，我脑子一热就兴冲冲地去搜了几篇吉他入门推荐，然后光速下单，拥有了人生中的第一把电吉他。刚上手的时候的确热情高涨，游戏也不打了，每天下班就是对着 B 站的入门教程哐哐练几个小时。对于这辈子没学过乐器的我来说，能听到自己演奏出来的旋律确实是一件很有成就感的事情。同时我就开始四处拉拢朋友试图组乐队，刚好一个朋友几乎和我同时间入手了贝斯，又找来了键盘手和鼓手，主打一个全员零基础入门（。顺便定了乐队第一个目标：在夏天结束之前合奏《夏霞》，当时还有大半年的时间。虽然最后计划赶不上变化，鼓手人在日本，键盘手忙于毕业论文没空练习，缺的第二个吉他手也再没拉到人，只剩了我和贝斯。好在终于赶在秋天来临的前几天，磕磕绊绊地完成了 cover 视频，发布了我的第一条朋友圈。原本是打算发 B 站的，但是乐队人不齐想想还是算了，等以后有机会真的能凑齐所有人再来重新完整录一次。前几天看到朋友分享的视频感觉说的很有道理，很多成年人活得很痛苦，因为他们即使在休息的时候也没有办法真正地玩，每天下班刷视频打游戏只是在麻痹自己去逃避焦虑，并没有真正自我的投入。而学吉他，大概就是我试图让自己摆脱这种状态的方式。作为一个纯粹的爱好，不为任何功利性的目的，不在乎对错，只是因为好玩。这能让我从每天应对现实的人格中抽离出来，收获了短暂的专注与快乐，而不是变成一个麻木的机器。希望自己明年也能有更多的时间去弹吉他。关于 Live今年其实看的演出并不多。三月份去梅奔听米津玄师，虽然只是看台，但好在位置正对舞台。终于是听到了我心心念念了多年的《LOSER》现场，还跟《KICK BACK》连着唱，真的是 high 到飞起来。有一说一在现场听音乐的确是有一种魔力，我至今都能回想起《海の幽霊》震撼到令我头皮发麻的副歌，回来之后再怎么用电脑手机听都还原不了当时的感觉。六月份 Reol 成都文化课，没想到我的抢票圣手好兄弟直接搞到了两张全场只有几十份的 VIP，真得磕一个了。第一次在 live house 第一排听雷，蹦得最爽的一次，又是甩手甩得第二天全身都在疼。不知道为什么，每次现场听《No title》都会忍不住流泪，眼泪和汗水混在一起，搞得每次结束都很狼狈。不过这回大合照终于没人挡我脸了（，专门带上了我的至尊收藏《事実上》黑胶用来合照。散场还拿到了亲签海报，舍不得卷起来塞海报桶，直接捧在怀里从成都抱回了西安。八月份 Reol 上海武道馆复刻，这场因为公布地很突然，完全是预期之外的。但由于是雷第一次在海外大场馆演出，还能弥补去年没去武道馆的遗憾，那又不得不去了（。回想起来演出前的一个月，大概是我今年最快乐的一段时间。一边准备无料一边跟雷批们水群，每天最期待的就是在小红书上又刷到其他没见过的老师们的制品，然后立马加上好友约定互换，这期间结识了很多新朋友，我的微信朋友圈在短短十几天就变得热闹起来。似乎也是从这里慢慢开始，我对跟大家见面的期待甚至超过了演出本身。还记得演出当天，我一整个下午都在场馆门口一边上蹿下跳找人，一边手忙脚乱地交换无料。虽然跑得很累，但是很开心，尽管大部分人都是线下第一次见面，却又好像熟悉得像多年的老友，这种感觉真的很奇妙。回到家之后收拾东西，换到的无料足足有十几斤，光整理就花了我好几天时间。最后就是十月份的鸡狗对邦。去年看…

使用三方 frp 转发内网 Jellyfin
type: item
date: 2025-11-09T15:20:00+00:00
description: 前因很难想象访问内网服务这玩意我居然能水到第三篇博客，究其根本还是前面的方案虽然能用，但或多或少还是有些小毛病。Jellyfin 我本来是用一台大带宽 NAT 服务器来做转发，为什么会突然换到 frp，起因是前段时间 Reol 群里要开个 Minecraft 服务器一起玩，而我之前就在 NAS 上跑过一个 MC 服务器跟朋友一起玩生电，所以就很乐意地帮忙开了一个服。但是之前跟朋友玩的时候是直接通过 IPv6 直连的，而为了避免让 Reol 群的群友们折腾 IPv6，所以只能使用 IPv4 服务器转发。一开始用那台 NAT 服务器试了一下，虽然能连上，但是性能非常差，延迟一直在三四百毫秒，并且波动很大，基本不可玩。找了一圈最后尝试了一个很多人在用的三方 frp 服务（避免广告嫌疑就不在这提名字了），使用三线 BGP 节点没想到效果出奇的好，朋友连过来基本都延迟稳定在二三十毫秒，非常好用。MC 的问题解决之后，我就开始考虑既然效果这么好，不如把其它转发服务也转移到三方 frp。最后找到一个每月 15 块钱，单端口能提供 50Mbps 速率的服务提供商，对于我的上传带宽基本够用。HTTPS 还是 TCP使用第三方的转发服务首先要注意的是隐私问题，玩 MC 当然无所谓，但是其他服务我就不希望转发内容明文出现在第三方的服务器上，尤其除了 Jellyfin，转发 Immich 相册之类的东西更要注意安全性。可以看到 frp 虽然是有一个 HTTP/HTTPS 转发模式，但是需要注意，虽然底层协议都是 TCP，在 frp 中，HTTPS 模式并不是“帮你转发一个 HTTPS 流量”，而是让 frps 服务端自己作为 HTTPS 入口，由 frps 来终止 TLS，然后转成明文 HTTP 发回本地服务。也就是说：Client (浏览器) --TLS--> frps(解密) --HTTP明文--> frpc --> 本地服务。一旦使用 HTTPS 模式转发，证书就必须放在 frps 端，TLS 也就在 frps 处结束了，流量在 frps → frpc → Jellyfin 之间全是明文。所以 frp 一定要使用 TCP 模式，此时 frp 只是做一个纯粹的隧道，仅转发加密字节流，看不到明文媒体/接口内容，才能实现端到端加密。配置NAS 本地依然还是跟之前一样，假设 Jellyfin 端口是 11451，使用 Nginx Proxy Manager 配置一个反代端口为 11452 并配置 HTTPS 证书。接下来只要在三方 frp 平台创建一个新的隧道，协议 TCP，本地端口 11452，远程端口 11453，把域名解析到隧道的公网地址上，最后在 NAS 上配置好 frpc 端，就可以通过 https://example.com:11453 访问到内网的 Jellyfin 了。因为证书配置在本地，frp 在转发过程中不会解密，只能看到原始加密的字节流，所以无需担心第三方转发平台会看到转发内容。Jellyfin 获取真实 IP这样配置下来会出现一个问题，Jellyfin 端获取到的源 IP 其实是 frpc 的内网 IP，真实用户的公网 IP 被丢在 frps 那一端，没带过来。而 Jellyfin 需要登录 IP 来判断内网来选择是否强制转码，所以需要想办法让 Jellyfin 获取到真实 IP，Proxy Protocol 协议正是做这件事的。Proxy Protocol 需要 frp 端和 Nginx 端同时启用才能生效。frp 端配置很简单，只需要在 frpc.toml 中添加一行 transport.proxyProtocolVersion = "v2" 即可生效。而 Nginx 端，由于 NPM 目前不支持配置 Proxy Protocol，所以只能手动修改配置文件了，vhost 路径在 data/nginx/proxy_host/ 下。在 server 段中加上如下内容：listen 11452 proxy_protocol ssl; set_real_ip_from 127.0.0.1; set_real_ip_from <frps服务器公网IP>; real_ip_header proxy_protocol; real_ip_recursive on;最后重启 NPM，Jellyfin 后台 Dashboard 就可以看到已经获取到真实的登录 IP 了。Nginx Proxy Protocol 问题正当我以为问题圆满解决的时候，突然发现 Jellyfin 原本 IPv6 直连的地址打不开了。一通排查后发现，因为两个 vhost 都在 443 端口监听，而 Nginx 无法只对某个 server 单独启用 Proxy Protoc…

快速移除过期 IPv6 地址，让 DDNS 更好用
type: item
date: 2025-07-30T14:44:00+00:00
description: 接上篇的内容，我要从公网访问家中的内网服务，这完全依赖 DDNS 脚本能快速更新家里当前的 IPv6 地址，但是经过一段时间的使用，我发现时不时会有连不上的问题，具体体现在路由器重启，或者 WAN 口重新拨号之后，客户端的 DDNS 总是不能及时刷新最新的 IPv6 地址，那么问题出在哪里。地址如何变化首先 IPv6 地址是怎么变的，当路由器重启或者手动重启路由器的 WAN 口，一般都会获取新的 IPv6 地址，旧地址失效。但如果不主动重启 WAN 口呢？经过一段时间的观察，在 OpenWrt 日志看到如下内容：注意到这边联通为了防止长时间连接，会每 48 小时主动断开 PPPoE 会话然后重新拨号，自然的 IPv6 地址会发生变化。为什么客户端 DDNS 没有刷新路由器端的 IPv6 RA 我配置的 SLAAC 模式，客户端的 DDNS 脚本用的是 aliyun-ddns。因为我在路由器上配置了 OpenClash 的 Fake-IP 模式，从在线 API 获取 IPv6 总会有各种问题，所以开启了 CHECKLOCAL 从本地网卡获取 IP。注意到当 WAN 重新拨号之后，路由器的确向客户端下发了新的 IPv6 前缀，但此时旧的 IPv6 地址依然没有失效，客户端同时拥有新旧两个 IPv6 地址，而 DDNS 脚本依然读取的是旧地址，所以无法及时刷新解析。如何快速废弃旧地址现在的问题就来到了如何在下发新前缀之后快速废弃掉旧的 IPv6 地址。这里就要先了解 IPv6 的两个重要参数：valid_lifetime 和 preferred_lifetime。valid_lifetime（有效生命周期）表示该地址在多长时间内是“合法的（valid）”。只要这个时间没过，该地址就仍然存在于系统中，可能用于接收已有连接的数据包。即使过了 preferred_lifetime 变成了“弃用地址”，只要没过 valid_lifetime，这个地址还是可用的。preferred_lifetime（首选生命周期）表示地址在这段时间内是“首选的（preferred）”。首选状态的地址可以用于新建连接。一旦过期，就变成“弃用的（deprecated）”地址：不再用于新建连接，但仍可用于维持已有连接（直到 valid_lifetime 结束）。所以此时我产生了两个修改思路：把 preferred_lifetime 配置为 48 小时，这样运营商重新拨号之后旧地址的 preferred_lifetime 应该会到期，系统优先选择 preferred_lifetime 没有到期的新 IP。或者让 valid_lifetime 尽可能短，这样旧地址就会快速到期并废弃掉。但是实际发现并不可行。先说方法 1，当前 DDNS 脚本并不会优先选择 preferred_lifetime 未到期的地址，虽然似乎只要我自己重新写一个 DDNS 脚本去筛选 preferred_lifetime 就可以解决问题，但是我懒（。而方法 2 呢，这么干会让客户端的 IPv6 地址频繁发生变动，感觉并不是什么很优雅的解决方案。随后我又想，那么在路由器 WAN 重新拨号的时候，发一条 RA 报文把旧地址的 valid_lifetime 变成 0 不就好了。然后我就被 ChatGPT 的幻觉骗了（GPT 像模像样地告诉我可以用 ubus call odhcpd send_ra 自己发送 RA，然后我兴致勃勃地研究了半天，最后发现根本没有这玩意...继续研究 OpenWrt 的配置，终于让我找到了相对完美的解决方案。首先 LAN 口的配置中并不能直接设置 valid_lifetime，只能指定 preferred_lifetime，而 valid_lifetime 会由系统自动计算，会比当前 preferred_lifetime 更长。而配置中还有一项叫做 ra_useleasetime，在 luci 界面中叫做 遵守 IPv4 有效期，此项为 1 时，会把 DHCPv4 的租约时间作为 IPv6 的 valid_lifetime。并且我发现当 WAN 重新拨号时，会发送 RA 广播将旧 IPv6 地址的 preferred_lifetime 置为 0。那问题就很好解决了，开启 ra_useleasetime，并把 valid_lifetime 和 preferred_lifetime 设置为一样的值，这里我就改为默认的 12h。此时只要一个 IPv6 地址没有废弃，那么它的 preferred_lifetime 必不为 0，而当 WAN 重新拨号时，旧地址的 preferred_lifetime 就会变成 0，而我要做的就是写一个脚本定时检查，移除 preferred_lifeti…

如何优雅地访问家中的内网服务
type: item
date: 2025-05-02T11:50:00+00:00
description: 先说一下我这里的网络，光猫改桥接，R5S OpenWrt 作为主路由拨号，没有公网 IPv4，有公网 IPv6，能拿到 /60 的 IPv6-PD，这应该是国内三大运营商下目前大部分人的一个网络环境。需求则是家里的 NAS 搭建了一些内网服务需要从公网访问，大概有这么几个使用场景：电脑需要随时能开机进入远程桌面；Jellyfin 视频服务器，需要远程连接看视频；immich 相册备份，我所有的照片都同步在这里，需要随时能查看相册；Ubuntu 虚拟机里搭建了 MineCraft 服务器，需要朋友们能顺利联机。IPv6 DDNS首先能想到最直接的还是通过 IPv6 直连，我在 NAS 上通过 Docker 部署了 sanjusss/aliyun-ddns，每 5 分钟刷新一次 DNS 记录，然后设置 OpenWrt 防火墙将对应服务的端口暴露给公网即可。需要注意的是因为 NAS 和电脑都能直接拿到公网 IPv6 地址，所以并不需要配置端口转发，而是直接在 OpenWrt 的网络 - 防火墙 - 通信规则中添加相应规则即可。这里我使用的是 EUI-64 地址来配置防火墙。解释一下什么是 EUI-64：EUI-64 是一种根据设备的 MAC 地址 自动生成 IPv6 接口标识符（Interface Identifier） 的方法，常用于 SLAAC（无状态地址自动配置）机制下的 IPv6 地址生成。IPv6 地址长度为 128 位，通常由两个部分组成：区域长度说明网络前缀64 位由路由器下发（如 2408:8270:455:270::/64）接口标识符64 位主机自己生成，可由 EUI-64 算法自动生成要让设备拿到 EUI-64 后缀，需要在 OpenWrt 的 LAN 接口里配置一下，在高级设置 的 IPv6 后缀中填写 eui64，这样就会给所有设备下发带有 EUI-64 后缀的 IPv6 地址。因为国内的 IPv6 为动态前缀，而根据 MAC 生成的 EUI-64 后缀是固定的，所以通过添加掩码就可以将数据包只转发给指定设备，防止内网其它设备同端口暴露在公网。ZeroTierIPv6 虽然能直连，但还是有不小的局限性。首先虽然 IPv6 基本已经普及，但几乎所有人家里的网络配置 IPv6 都是默认关闭的，很大的可能是我要给朋友分享一个东西，然后发现他根本无法访问 IPv6 地址；又或者某些比较敏感的东西并不希望暴露在公网环境；以及某些服务可能根本不支持 IPv6 网络（点名批评帕鲁），折腾半天搭建起来结果发现 IPv6 根本连不进来。于是我又在路由器上搭建了内网穿透工具 ZeroTier，搭建教程我这里就不讲了，网上已经非常多了。配置好之后只要远程连接，就可以访问家里整个内网网段的所有设备，非常方便。缺点就是需要客户端额外安装 ZeroTier 软件并授权才能连接，而且即使我在一台国内阿里云服务器上搭建了 Moon 服务器，某些网络环境下依然会打洞失败，然后网络流量不知道去哪里绕了一大圈才回来，导致延迟爆炸。服务器反代以前我用 frp 做过一些 web 服务以及 ssh 的中转，用一台便宜的小带宽服务器基本够用，但像目前这种需要 Jellyfin 看视频以及相册加载大量图片的场景就力不从心了。于是我又想起来之前大学时折腾过的 NAT 服务器，多台服务器共享一个公网 IP，以及只有数量不多的高位端口，好处是大带宽并且价格便宜。一番搜索之后找到一台只要 9.9 元/月的成都电信服务器，100Mbps 带宽 1TB 流量，相当够用了，毕竟我家里的上传也就六十多 Mbps。因为图省事，这次没有用 frp，而是直接直接在这台服务器上也安装了 ZeroTier，测试了一下延迟没有问题，然后直接反代 ZeroTier 的内网 IP 即可，非常好用。比如我 Jellyfin 内网的端口是 11454，通过 NAS 的 IPv6 地址可以直接访问。那么在服务器上使用 Nginx 在 443 端口反代 11454，然后在服务器的控制面板将 443 端口映射到 11452 端口上，此时通过服务器的 11452 端口就能顺利访问了。最后把服务器的 IPv4 地址添加域名解析，这样无论是 IPv4 还是 IPv6 都可以顺利访问到内网服务了，并且不需要额外安装任何软件。HTTPS暴露在公网的服务还是加上 HTTPS 比较令人安心。目前是 v4 服务器反代和 v6 直连两种访问方式共存，所以需要分别添加 HTTPS 证书。服务器反代因为 80 和 443 端口都不能用，所以申请证书稍微麻烦了一点，常规的 HTTP-01 方式不能用，需要使用 DNS-01 模式。这里我选择用 certbot + 阿里云 DNS 插件。提前配置好阿里云的 Access K…

2024 年终总结
type: item
date: 2024-12-31T12:00:00+00:00
description: 最近我喜欢上了听磁带。起因是前段时间买了孤独摇滚发行的磁带专辑，然后就去搞了台磁带机。我好像一直都喜欢干这种为了醋去包饺子的事，当年也是为一张黑胶去买了唱片机。倒不是因为这些介质的音质有多么优秀，而是它们能让我静下心来去聆听。移动互联网时代人们能接触到的信息量是爆炸式增长的，一打开手机就是无数的内容涌入，信息流可以一目十行地刷，音乐可以随意地切换，就连短视频都想二倍速播放。如此高强度的刺激带来的后果便是思维愈发麻木，再不断寻求新的刺激，如此反复，大脑似乎停止思考了。但是磁带不一样，它还保持着上世纪的模样，没有上一首下一首，听完了要手动翻面，甚至播放进度都只能看它卷了多少去估计。就像小时候看电视一样，遇到喜欢的节目可以慢慢欣赏，播到广告了也得耐着性子看完。但我逐渐开始喜欢上这种感觉，静静地看着磁带旋转，完整地听完一整张专辑，从 Intro 到结尾，感受不同曲目的起伏，就像在电影院看完一场喜欢的电影，酣畅淋漓。好像音乐是一个今年绕不开的话题。三月第一次去北京看 Reol 线下 live，圆了四年前的遗憾，看那个听了十年，陪我度过无数困难时刻的人，在距离不到五米的台上唱着熟悉的旋律，激动到眼眶湿润；紧接着是陈奕迅演唱会，还得感谢好兄弟帮我抢到票；五月去上海看心心念念了几年的音律联觉，就很难想象这个破游戏我居然已经玩了五年（；又在杭州冒着雨听 YOASOBI，跟大家一起喊アイドル的感觉真好，还顺便种草了 Yama；十月许嵩演唱会，一开口就好像又回到了曾经在学校半夜听着许嵩写代码的日子；十一月杭州音乐节，做梦也没想到我今年会两次见到 Reol，在台风刚过的草地上蹦到两腿都是泥，还见到了一直很喜欢的神山羊，回来一翻视频发现全是自己的鬼叫（。线下 live 的魅力，大概就是即使大家素不相识，但是因为有相同的热爱，所以能聚在一起，一句话就能熟络起来，仿佛没有什么隔阂。台上的震撼，以及台下的激情，那一刻我感觉自己好像从每天两点一线上班的麻木中“活过来了”，原来生活依然是这么美好，如此朝气蓬勃，充满能量。前段时间和朋友去电影院看皇后乐队的蒙特利尔现场演唱会，出来之后俩人都不禁感叹：音乐真好。除此之外，今年还有件心愿满足的事，年初组了一台自己从大学念叨到毕业的 NAS，后来又陆陆续续换了交换机、软路由，加上一台 12U 的小机柜，一个简易的 HomeLab 就算搭起来了。目前它承担了家里的整个网络和智能家居中枢，实现了全屋外网超千兆以及内网 2.5G，NAS 上跑一跑存储和一些乱七八糟的小服务。虽说电表转得又快了一点，但折腾的过程还是相当有意思的，尤其是当自己规划的网络跑通的瞬间，感觉前面所有的辛苦的值得了。之后的折腾方向大概就是想办法把 PC 到 NAS 的带宽拉到 10G，买的 X520 到现在都没发挥过作用x。Life is a struggle. 活着就是折腾。没事的时候我甚至喜欢坐在机柜面前发呆，可以看好久，虽然大多数人可能觉得我有病，但是我确实很喜欢这种每台设备各司其职，连接在一起井然有序工作的样子。这让我想起来当年大学玩 Opus Magnum 的时候，每次拼完都能望着那些运动的机械结构望到出神，可能我天生就适合去流水线拧螺丝（。感觉今年一直都在花钱，无论是组机柜、出去玩、买 CD 磁带...说好听点是完成了自己多年的心愿，说不好听也就是虚无的消费主义罢了。尤其是今年工作上感觉没什么提升，大多数时间也只是在 debug 找问题搞维护，代码越写越少了；另一方面家里又一直在催着找对象，经常就不免陷入焦虑中，感觉人生似乎没什么进展，想要有所改变。都说成年人的觉醒是从健身和学外语开始。要说健身，今年自行车倒是依然在坚持骑，除了因为骑车搭子有一位叛徒脱离队伍，导致今年没怎么骑长途以外，每周五昆明池刷圈倒是刷得相当痛快，感觉自己心肺水平比前两年有了不少的提升。至于学外语，我没想到今年上半年随手下的多邻国居然能坚持打卡到现在。捡起来了从大一就被我遗忘的日语，当年兴致勃勃地买了套标日准备学，结果五十音都没认全就塞进床下的纸箱里再也没打开过。虽然都说多邻国并不适合拿来学习，但是它的刷题模式确实很对我的胃口，心情好了一天刷几十个单元冲榜，心情不好也能抽出两分钟随便点点完成日常任务，就这么有的没的每天学一丢丢，日积月累下来发现自己也能磕磕绊绊地说一些日常短语了，听歌看歌词也能认识一些片假名不用纯靠罗马音了。虽然肯定比系统性地学习要慢不少，但本身就是个图一乐的事情（欺骗自己还在努力没有摆烂），就看我还能坚持多久吧。今年的技能树又没什么提升，去年开始学的 Blender 也因为电脑渲染拉垮暂时搁置了，想等明年重新配完电脑再捡起来。想搞点新项目丰富一下技术栈又没什么好想法（说白了究其原因还是懒得动）。我一直佩服的一个人，他叫 Jimmy Tian，从十年前在贴吧…

我的 NAS 折腾之路 一（硬件篇）
type: item
date: 2024-02-09T05:27:00+00:00
description: NAS 这个东西，自从上大学以来，已被我念叨好多年了，但一直没有下手去买一台。从最开始的路由器插硬盘，后来换成树莓派插硬盘，总之一直在用草台班子方案凑合用。毕业之后，本来是打算直接买一台成品 NAS 用的，当时预期的产品大概是群晖 DS920+ 这个价位，考虑到群晖 22 年的新品快出了，我就想着再等等也不迟。结果等来了群晖 DS923+，反向升级了一波，CPU 甚至没了核显，还是祖传的 1G 网口，实在忍不了高价低配，就放弃了群晖。之后看到绿联出了 DX4600，很多数码 KOL 和 B 站 up 都在推荐，看起来很不错，而且价格也不贵，有一说一我心动了。鉴于绿联是才开始做 NAS，我就观望了一段时间，等到准备去年双 11 就下手的时候，听说年底绿联又有新品 DX4800，那就再等等呗，最后等到现在也没等来。而且听说绿联近半年似乎有摆烂的迹象，我就感觉似乎也不是很靠谱。结果到最后市面上也没有一个我满意的成品 NAS，终于忍无可忍，周末花了一天的时间研究配件，打算自己组一台 NAS。机箱所有配件中我最先敲定的就是机箱。想法是体积不能太大，因为后期我大概率还是要塞到机柜里，然后最好是专门的 NAS 机箱，有四个以上的热插拔硬盘位，方便后期维护。在 B 站翻了半天机箱之后，我看中了乔思伯的 N2。见到第一眼我就被它精致的外观吸引了，方方正正的非常漂亮，但又不浮夸，给人一种很沉稳的感觉。它正面有五个 3.5 寸硬盘位，机箱内还有一个 2.5 寸硬盘位，勉强算是个 6 盘位机箱，就我自己用应该是完全足够了。这机箱有白色和黑色两款，白色的颜值确实是要高一些的，但是考虑到白色是喷漆，而黑色是阳极氧化工艺，看起来会更精致，而且后期如果塞进机柜，黑色看着也更协调一些，所以我还是选择了黑色版本。板 U由于乔思伯 N2 只支持 17*17 的标准 ITX 主板，所以一下子就帮我把选择范围缩小了很多。一开始 CPU 我是打算用 i3-8100T 的，因为看到很多人组 NAS 都会选择它，有大把现成的方案可以参考，而且性能和功耗作为 NAS 来说都很合适。于是我就去找 8100T 合适的主板，翻到一款雲星 ITX-CS2，拥有双 2.5G 网卡，双 M.2，6 个 SATA，看起来作为 NAS 使用简直完美。B250 芯片组的版本淘宝售价 469，而 8100T 只要 150 来块钱，这样板 U 六百多块钱就能搞定。可是我后来又犹豫了一下，既然都花钱装 NAS 了，买新不买旧，能用的时间久一些，而且后期跑 docker 和虚拟机万一性能不够了也是问题。于是我决定抛弃 8100T，稍微升级一下，换成了 12100。接着就是找合适的 H610 主板，毕竟感觉给 NAS 上B660、B760 好像没什么必要。翻了好多 ITX 主板基本都是只给一个 M.2 接口。找了一圈下来，最后发现了铭瑄 MS-挑战者 H610ITX 2LAN。这是去年 11 月份才出的挑战者 H610ITX 2.5G 的升级版本，多加了一个 1G 网口，以及主板背面又加了一个 M.2 接口，而且供电在这个价位给得相当豪华，看起来非常合适。唯一的问题是只有 4 个 SATA 接口，而 PCIE 我打算留给后期升级万兆网卡使用，况且从 PCIE 只是为了扩展出来两个 SATA 未免有些浪费。后来我在淘宝找到了 M.2 NGFF KEY A/E 转 SATA 的转接卡，正好可以转两个 SATA 出来，感觉以后可以尝试一下，这样最后的问题也解决了。硬盘NAS 最重要的东西还是硬盘了，迫于预算限制没法一步到位，最后在上海硬盘公园买了四张希捷 7E10 10T，一张 968，价格还算可以。剩下的硬盘位留给以后再加，总要留点后期升级空间嘛（。SSD固态硬盘原本的打算是就买两张 256 的，致态 PC005 经典型号，一张给 Docker、VM 这些东西用，一张作为缓存盘。后来在配置 Unraid 的时候因为不太懂就照着钱韦德的视频把一张 SSD 加到阵列里，一张作为 Pool Device。用了几天才发现这个做法有问题，这个后面软件篇再细讲。而且 256 的缓存盘也不太够用，索性咬咬牙又去买了两张 TiPlus5000 1TB，都放进 Pool Devices 里组 RAID 1。内存作为 NAS 来说其实 16G 应该绰绰有余了，但是我最开始的计划本来是想用 TrueNAS 做系统，想着 ZFS 比较吃内存（虽然最后换成了 Unraid），再加上还想给 VM 这些多预留一些，于是直接买了两条光威 16G DDR4 2666，虽然主板最高支持 3200，但是感觉好像没什么必要。电源电源我确实不太了解，最开始准备的是 Tt TRM SFX 350W，京东只要 169 块钱，而且看到挺多人装 NAS 都…

2023 年终总结
type: item
date: 2023-12-31T12:00:00+00:00
description: 恍恍惚惚又到年末，回看过去一年，除了感慨时间的流逝好像又变快了一些，似乎也没有多少事情是值得留念的。年初因为 @归零 同学要离开西安去杭州挣大钱，于是我们就离开了从毕业开始住了快两年的出租屋。我在附近又重新租了一个小单间，面积不大，三十几平，但就我一个人住，还算宽敞。说起来这才算我第一次真正意义上的一个人住，所以一开始我也是很期待之后的生活。年前签了租房合同，年后正式搬家，忙前忙后到收拾完可能花了大半个月的时间。因为一开始计划的可能会在这里住比较久，所以也有蛮多布置的想法，换了智能门锁、规划了网络、预留了之后装扫地机器人自动上下水的位置...一切都安排妥当，仲景着未来几年的生活，结果没住几个月，计划就发生了大变化。那是一个普通的周末，我以为爸妈只是像之前一样过来随便看一看房，没想到定得这么果断，没有一丝丝防备，我就这么就突然地背上了房贷。之后就是到处跑，处理各种手续、交首付、办贷款...在我还没来得及反应的时候，我拥有了自己的一套房，在西安这座城市的一处犄角旮旯有了自己的容身之地。房子的事情处理得差不多之后，我就跟公司提了辞职。倒也不是一时兴起，虽然刚买完房就辞职怎么看都不是个明智的决定，但确实是我深思熟虑了很久之后的打算，公司老板反复试图挽留也被我拒绝了。在这家公司我从刚毕业一直干到今年，也的确学到了很多东西，但小公司终究是有小公司的局限性，军工的环境也多少有些严肃和压抑，于是我选择了辞职，希望能换一个更广阔的也更年轻的平台去发展，也想给自己一个调整的时间。两周时间交接工作，三月最后一天正式辞职，之后我就开摆了。难得有这么好的休息时间，早上睡到自然醒，除了吃饭就抱着手柄，要么就出门闲逛。悠闲到可以两周拿三个白金；可以为了西安第一家 IMAX 花两个小时通勤时间去看电影，再一个人溜达回来。虽然表面上看起来无比自由，但实际我只是在尽力逃避现实，不想这么快去面对，找工作的事一拖再拖，因为我也不知道未来到底什么打算，索性放弃思考，先摆一段时间再说。因为买的是二手房，不用装修置办家具，所以事情处理完就确定五一搬家了。年初租的单间合同还有半年，刚好大学舍友换房就转给了他。搬完家就是 25 岁生日。我曾经一直感觉自己还在二十出头的年龄，感觉自己和那群大一的没什么两样，直到那天刷微博，看到说大一和小学六年级只隔了六年，而我离大一也已经过去六年了...我突然意识到：20 岁已经比 30 岁更加遥远了。虽然一直以来的口癖都是年轻人怎么怎么样，但我好像已经没那么年轻了。变成了那个要考虑还贷、要为生活奔波、不知道自己的理想的，可悲的社畜。时间一年年过去了，而我似乎还并没有实现什么值得炫耀的成就。啊他妈的，这本该是我人生中最美好的几年，怎么还没干啥就奔着 30 去了。但生活不会因此停下，emo 完还得往前看，既然不知道未来怎么走，就先完成一下之前没完成的事。于是我把自行车收拾妥当，去年骑车回家的愿望还没达成，正好现在有时间，趁着端午前几天，我揣着一个充电宝和打气泵就出发了。之前跟我妈提这事她不同意，所以我出发时甚至没跟家里说，当她知道的时候我已经在半路上了。经常骑车的朋友都知道，一天两百公里并不是什么难事，所以我的计划是边走边看情况，状态好就一口气骑到家，不好就在凤翔休整一下。大概是辞职之后没怎么骑车，也可能是因为一直在爬坡，100 公里之后速度明显慢了下来，到达凤翔街道的时候小腿不出意外的抽筋了，差点一口气没缓上来躺在路边。于是就跟好哥们在凤翔吃个饭暂住了一晚，第二天上午很轻松地溜完了剩下的四十公里。虽然没有一天骑完有点遗憾，但至少完成了自从我买车以来一直的愿望。正式开始找工作应该是七月多的时候了，这应该是我今年最痛苦的一段时间。刚开始投简历还挑挑拣拣，准备面试到处跑，每次都信心满满觉得没什么问题，结果越面越开始怀疑自己，总是有各种意想不到的理由被拒。之后每天睁眼就是各种招聘 app 挨着翻，翻累了就去打两把 COD 睡一觉再接着翻。期间前公司老板还给我发消息，问我有没有意愿回去，但我确实不想再回到之前那个环境里，所以婉言拒绝了。这段时间几乎每天都是在焦虑中度过的，反复失眠然后思考人生，甚至给我培养出来一个睡前听 ASMR 助眠的新爱好。大概是今年行情确实不行，又或许是我的确技不如人，每拖一天，空窗期就实打实地又多一天，但又没什么好的办法。印象比较深的是去面中船泛华，前两面都没什么问题，技术面该说的也都说到了，因为还是 Qt，所以还算是我比较熟悉的领域。本来觉得已经稳了，结果到了最后项目经理面，对面反复透露出对学校不是很满意的意思，过了几天很敷衍地拒绝了。这时候我是有点不爽的，一开始有意见你不提，非要拖到最后才说，纯属折磨人。但也确实是咱学校不太行，没什么可辩解的，你不愿意那就告辞。经过漫长的折腾，八月份好歹是找到了工作，虽然不是很满意，但还是决定…

将电脑开关加入 HomeKit 以及基于 IPv6 的远程桌面
type: item
date: 2023-07-01T16:04:00+00:00
description: 由于我目前打游戏已经全线转移到主机平台，所以一直没有什么换电脑的需求，2017 年上大学时买的神舟战神笔记本一直用到现在。曾经一直以为这破本子不支持 Wake on LAN，因为 BIOS 里找不到任何相关设置项，直到我前几天无聊随手测试了一下，结果非常顺利地唤醒了电脑...于是稍加配置，现在我就可以非常方便地远程控制电脑了。Wake on LAN首先确保电脑是有线连接网络，然后翻一下 BIOS 里有没有网络唤醒的相关设置，有的话就全部打开。然后打开网卡的属性，点击配置。在电源管理标签中勾选“允许此设备唤醒计算机”，下面的“只允许幻数据包唤醒计算机”也可以勾选。电脑上的 Wake on LAN 配置就这么简单，现在可以来简单测试一下能否正常接收到数据。我使用的是这个项目：WakeOnLAN，打开后是这个样子选择“封包监控诊断工具”然后在手机上随便下载一款能够发送 Wake on LAN 消息的 app确保手机与电脑处于同一网络，填入相关配置，尤其注意电脑有线网卡的 MAC 地址一定要写对保存后点击发送，如果电脑接收到相关数据，那就可以关机测试是否能正确开机了。HomeKit 配置现在电脑已经可以在局域网内实现网络唤醒开机，下一个问题就是如何在外网环境向电脑发送指令。因为家里正好有一台 24 小时开机的树莓派在当服务器使用，所以我这里的解决方案是使用 Home Assistant。翻了一下 Home Assistant 的文档，发现正好支持 Wake on LAN 的集成配置，可以作为一个开关设备控制，完美符合需求。编辑 configuration.yaml，照猫画虎加入以下配置：switch: - platform: wake_on_lan name: "电脑" mac: XX-XX-XX-XX-XX-XX host: 192.168.31.108 turn_off: service: shell_command.turn_off_pc shell_command: turn_off_pc: "ssh username@192.168.31.108 shutdown -p"配置完重启 Home Assistant，就可以在控制面版中看到一个名为“电脑”的开关实体了。现在完整的数据流，就是我在手机的 HomeKit 里点击开机，家里作为中枢的 HomePod mini 接收到指令并下发到树莓派 Home Assistant 中创建的开关，开关再在局域网中向电脑发送 Wake on LAN 消息完成开机。关机配置这里需要额外注意的是关机命令，是通过 ssh 登录 Windows 执行 shutdown 命令来实现的，还需要在电脑上做一些相关配置。打开系统设置，在 应用 - 可选功能 中安装 OpenSSH 服务器，让我们可以通过 ssh 连接到电脑。由于我们需要无密码访问，所以还要配置 ssh 密钥。在树莓派上使用 ssh-keygen 生成密钥，由于我的 Home Assistant 使用的是 docker 版本，所以需要进入容器的 bash 再生成密钥才行docker exec -i -t homeassistant /bin/bash将生成的公钥 ~/.ssh/id_rsa.pub 内容复制出来，在 Windows 端的用户目录 C:\Users\%UserName%\.ssh 下创建 authorized_keys 文件，把公钥粘贴进去，现在就可以通过 ssh 命令一键执行 Windows 关机了。远程桌面由于我这边没有公网 IPv4 地址，尝试跟客服申请也无果，所以只能使用 IPv6 来连接了。首先配置光猫，我使用的中国联通的 TEWA-802G，跟宽带安装师傅要到了管理员密码是 CUAdmin，登录后修改 INTERNET 连接的 IP 模式为 IPv4&IPv6。在路由器后台也打开 IPv6 相关设置此时电脑应该已经可以获取到公网 IPv6 地址了由于不是固定 IP，每次开机获取到的 IPv6 地址都会变化，所以还需要 DDNS，我使用的是 GitHub 上的这个项目 DDNS 配合阿里云来实现。直接下载 Windows 二进制版，首次运行会在当前目录生成 config.json，填写域名和 token，就可以在每次运行的时候更新域名解析地址。最后配置任务计划程序，就可以实现每次开机后自动刷新 DNS，并且每五分钟更新一次。在系统中打开远程桌面，就可以愉快地连接了。如果还无法连接，可能是防火墙的原因，需要在路由器和光猫中开放相应端口ip6tables -I forwarding_rule -p tcp --dport 3389 -j ACCEPT最终效果现在出门在外，无论在公司还是在户外，只要有 IPv6 网络，都可…

2022 年终总结
type: item
date: 2022-12-31T12:00:00+00:00
description: 一到年底这时间总感觉特别浮躁，人心惶惶地，干什么都静不下心来。年终总结也一直拖着不知道怎么写，反反复复写了又删，删了又写。主要今年也确实没干什么事，月初的时候洋洋洒洒写了几千字，越写越感觉不对，跟年终检讨一样，不想搞得那么沉重，就又删了重来。前几天还得了新冠，公司只要有一个人阳了，那终究是躲不过的。在家躺了十来天，除了第一晚发烧比较难受以外，后面除了咳嗽倒也没什么。就是味觉失灵了好几天，吃啥都没味儿。本来说趁着不上班在家闲着就把总结写完，结果能拖一天是一天，把 2077 又打完了一遍，总结是一点没写。很好，很符合我今年一整年的状态，开摆就完事了。先说说工作吧，每天循规蹈矩地上班，还是在写 Qt，虽然写了一年也没感觉自己有多大长进，也就是能拿来自己写点程序做点小玩具的水平。期间接触了一点 3D 建模相关内容，学了一丢丢 Blender 和 UE4，给视觉仿真训练做场景用，但也只是学了一点皮毛，真要靠这个吃饭得把自己饿死。对了，还写了一段时间 RT-Thread，接触了一些嵌入式开发，要不是写总结我都快把这玩意忘了。 想我上次玩嵌入式还是疫情刚开始的时候折腾 Arduino 和 8266，居然已经两三年过去了。今年没做自己的项目，主要是没什么好的想法，也大概和我今年没有专门去学习什么新内容有关，切切实实开摆的一年。希望明年我能接触点新技能，继续做些好玩的东西出来吧。上学的时候总想着等上班之后我有钱买主机，能好好地打游戏了，但是真的工作越久就越能理解“电子阳痿”的感受。年初买了 PS5，我的桌面终于凑齐了御三家次世代主机，结果今年打完的游戏寥寥无几。本来我还给自己列了个清单要拿多少白金，结果直到年底 PS5 运行时间也就一百来小时，今年我最快乐的游戏时间居然是玩喷喷 3 上 S+ 的那一个月。思来想去的原因还是因为工作之后，我已经没有更多的精力分给游戏了，下班之后就想躺在那里把整个大脑放空。这也解释了为什么今年我买了一堆游戏，结果只打完了对马岛，老头环、死亡搁浅...都打开玩一会就扔到一边，蜘蛛侠甚至碰都没碰一下，却愿意在英灵殿这个又臭又长的育碧大罐头上花两百多小时。因为罐头游戏不需要思考，我只要开打地图，一个一个清据点，过流水线任务就好，完全不需要带脑子。就连方舟我都懒得自己打了，为此还专门花两千买了台 Redmi K40S 用来挂脚本，全自动定时清日常，连游戏开都不用开，有活动了就电脑模拟器 + 脚本自动过图一把梭，EX8 打完了都不知道怪长啥样，朋友就一直吐槽我“你这玩游戏玩了个啥？”。不过今年课金倒是没少课，原本我一个小月卡玩家，自从感觉能冲全图鉴之后，就大月卡、礼包、648 挨着整，现在目标是达成了，一看统计充了快五千块...明日方舟害人不浅。感觉自己现在玩游戏的心态出现了一丢丢问题，希望明年能调整过来，重拾热情吧。（塞尔达你要支棱起来啊）今年唯一一次出远门居然又是出差，五月份的时候去漳州呆了几天，没什么特别的印象了，只记得一直在下雨。计划了两次出去玩最后都因为疫情打了水漂。九月份想趁中秋和朋友去长沙逛，看好时间约好人，连日程安排都定好了，结果疫情严重，到长沙得隔离，无奈取消。还有方舟的 2022 嘉年华，广州疫情直接导致活动无限期推迟，又没去成。明年我好想出去玩啊！要说今年搞了什么好玩的东西，就是完成了去年鸽掉的智能家居。买 HomePod mini、树莓派配置 Home Assistant、拆客厅和卧室所有的墙壁开关、换吸顶灯、加传感器、改窗帘...一通折腾下来，总算是有点智能家居的样子了，无论是语音控制还是自动化，用起来还是蛮爽的。具体改造思路和实现过程可以看我前一篇博客 (https://imwtx.com/archives/194/)。还有什么值的说的就是今年入坑了自行车，想着是上班通勤用，平时也能出去溜达顺便锻炼身体，最后在有货能买到的前提下，下单了迪卡侬的 RC120 DISC，3000 块钱的价格也算不上什么好车，不过就我而言入坑足够了，真让我花大一万去买个碳架车，我还舍不得用它通勤，最后零零碎碎买配件和装备总共花了大概有五千多吧。刚买车的那几个月真的是有劲儿没处使，每天晚上游戏都不打了，绕着三环就是三四十公里，骑到晚上十一二点才顶着满头大汗回家，拉爆路上的电动车成了我那段时间最爱干的事（危险行为，好孩子请勿模仿）。后来几个朋友也陆陆续续买了车，有空就一起结队出门溜车，享受风拍在脸上的感觉，安逸。关于骑车有两个目标希望能在明年实现：一是和朋友上一次分水岭，感受环法标准的最高难度赛段是否真的遥不可及；二是找个假期从西安骑车回宝鸡，这个想法从我刚买车就有了，甚至研究好了路线，希望明年能有机会完成这个愿望。去年本来是计划想给家里装台洗碗机的，后来因为各种原因没有装，今年也没给家里买什么东西，最后就给爹妈换了台手机…