最近博客图床又被刷 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
这是我的第十篇年终总结。我这辈子似乎很少有坚持做了十年以上的事情。很难想象高考复读那年年末，脑子一拍想着随便写点东西，居然能变成一个习惯直到现在。可能是因为我并不觉得写总结是一件麻烦事，反而乐于在每次年末去回忆有哪些值得记录的东西。虽然到最后大部分都还是没什么营养的琐碎口水，但是把记忆变成文字保存下来，总比在多年后逐渐遗忘要好，偶尔回头翻阅，似乎还能体会到当时的心境。关于电吉他今年首个要说的事，大概就是我尝试入门了电吉他。首先我得先忏悔一下，其实电吉他是从去年靠近年底的时候就买的，但当时并不能确定自己是不是三分钟热度，怕买回来没学两天又丢一边吃灰，最后闲鱼收场，所以并没有在去年的年终总结里提到这事，担心自己兴致勃勃地宣布自己要学吉他了，结果什么也没练成，搞得很丢人。不过很庆幸，虽然当初买吉他时给自己定的目标没有完成，中间也因为各种事情把吉他搁置过几个月，好在还是没有放弃练习。其实我从很多年之前就有了想学习一门乐器的想法。小的时候爸爸一直想让我学，但是那会性格贪玩，被我严词拒绝，现在想起来当时错过了最好的学习时间。之后自己慢慢对乐器有了些许兴趣，想过学钢琴、小提琴、大提琴...都是一些我自认为演奏起来很优雅的乐器，但也一直没有付出行动。为什么最后选择了电吉他，可能是之前玩 2077，受到了武侍的反叛精神感染；也可能是这两年开始听草东，喜欢那种酣畅淋漓的情绪释放；又或许是孤独摇滚和 MyGO 后劲太大，想找人组一辈子乐队（。总之在某个熬夜看完 GBC 的晚上，我脑子一热就兴冲冲地去搜了几篇吉他入门推荐，然后光速下单，拥有了人生中的第一把电吉他。刚上手的时候的确热情高涨，游戏也不打了，每天下班就是对着 B 站的入门教程哐哐练几个小时。对于这辈子没学过乐器的我来说，能听到自己演奏出来的旋律确实是一件很有成就感的事情。同时我就开始四处拉拢朋友试图组乐队，刚好一个朋友几乎和我同时间入手了贝斯，又找来了键盘手和鼓手，主打一个全员零基础入门（。顺便定了乐队第一个目标：在夏天结束之前合奏《夏霞》，当时还有大半年的时间。虽然最后计划赶不上变化，鼓手人在日本，键盘手忙于毕业论文没空练习，缺的第二个吉他手也再没拉到人，只剩了我和贝斯。好在终于赶在秋天来临的前几天，磕磕绊绊地完成了 cover 视频，发布了我的第一条朋友圈。原本是打算发 B 站的，但是乐队人不齐想想还是算了，等以后有机会真的能凑齐所有人再来重新完整录一次。前几天看到朋友分享的视频感觉说的很有道理，很多成年人活得很痛苦，因为他们即使在休息的时候也没有办法真正地玩，每天下班刷视频打游戏只是在麻痹自己去逃避焦虑，并没有真正自我的投入。而学吉他，大概就是我试图让自己摆脱这种状态的方式。作为一个纯粹的爱好，不为任何功利性的目的，不在乎对错，只是因为好玩。这能让我从每天应对现实的人格中抽离出来，收获了短暂的专注与快乐，而不是变成一个麻木的机器。希望自己明年也能有更多的时间去弹吉他。关于 Live今年其实看的演出并不多。三月份去梅奔听米津玄师，虽然只是看台，但好在位置正对舞台。终于是听到了我心心念念了多年的《LOSER》现场，还跟《KICK BACK》连着唱，真的是 high 到飞起来。有一说一在现场听音乐的确是有一种魔力，我至今都能回想起《海の幽霊》震撼到令我头皮发麻的副歌，回来之后再怎么用电脑手机听都还原不了当时的感觉。六月份 Reol 成都文化课，没想到我的抢票圣手好兄弟直接搞到了两张全场只有几十份的 VIP，真得磕一个了。第一次在 live house 第一排听雷，蹦得最爽的一次，又是甩手甩得第二天全身都在疼。不知道为什么，每次现场听《No title》都会忍不住流泪，眼泪和汗水混在一起，搞得每次结束都很狼狈。不过这回大合照终于没人挡我脸了（，专门带上了我的至尊收藏《事実上》黑胶用来合照。散场还拿到了亲签海报，舍不得卷起来塞海报桶，直接捧在怀里从成都抱回了西安。八月份 Reol 上海武道馆复刻，这场因为公布地很突然，完全是预期之外的。但由于是雷第一次在海外大场馆演出，还能弥补去年没去武道馆的遗憾，那又不得不去了（。回想起来演出前的一个月，大概是我今年最快乐的一段时间。一边准备无料一边跟雷批们水群，每天最期待的就是在小红书上又刷到其他没见过的老师们的制品，然后立马加上好友约定互换，这期间结识了很多新朋友，我的微信朋友圈在短短十几天就变得热闹起来。似乎也是从这里慢慢开始，我对跟大家见面的期待甚至超过了演出本身。还记得演出当天，我一整个下午都在场馆门口一边上蹿下跳找人，一边手忙脚乱地交换无料。虽然跑得很累，但是很开心，尽管大部分人都是线下第一次见面，却又好像熟悉得像多年的老友，这种感觉真的很奇妙。回到家之后收拾东西，换到的无料足足有十几斤，光整理就花了我好几天时间。最后就是十月份的鸡狗对邦。去年看 MyGO 之前我也没想到会喜欢上邦邦这个企划，年初每周和朋友们连麦一起看 Mujica 的日子还历历在目。这次出门给我最大的感受就是邦邦人实在是太多了，虽然我是一个人从西安出发，但是从到达火车站直到我回来下飞机坐上地铁，只要掏出棉花娃娃，周围就有一群人探出头来对上暗号（感觉比粥批更像蟑螂x。演出现场梅奔四面全开，虽然旋转舞台有些弱智，但是能看到上万人举着绿色荧光棒合唱《春日影》大概这辈子也就这一次了（。原本还计划着明年一月去看刺团演出，没想到年底中日关系恶化直接打消了之后所有日音的念头（高市早苗我*）。还有好多想看的歌手和乐队没去看，希望以后还有机会吧。为什么我这两年开始喜欢上去现场看演出，这里我想引用一下周杨在 HOPICO 里的一段话：现场音乐的魅力在哪里，真正的答案不在台上，而是在台下的你，突然在二十多年之后，发现你看的演唱会变成了大家讨论的经典。又或是那天糟糕的天气，你非常狼狈，然后很多年之后你能想起来的，就是那天很狼狈。所以，现场音乐可能并不能帮助你记住那天的音乐，但是可以帮助你，记住那天的你。关于相亲我觉得我大概就是图上这种状态。我妈给我微信推别人介绍的对象，我总是很抗拒，因为我感觉目前一个人独处的状态很惬意。就连每次放长假回家，我都会选择提前一两天回来，就为了能一个人独自呆一会，只有这时候才会感觉身心是完全放松的。对我这种人来说，无论是否自愿的与人打交道，都是个消耗能量的过程，并不像某些人可能日常的放松方式就是出去社交。我会一直在思考如何与人相处和交流，这是个让我感觉很累的过程。相亲更是如此，两三句话没有对上电波，在我感觉就已经没有再继续交流的必要了，更多的对话也只是在浪费时间罢了。没有一丝心动的感觉，只有应对人际关系的疲惫。我妈总是说不要只在微信聊，约出来线下见见，说不定会有感觉，但我一直认为，在微信都没什么想聊的，面对面又能说什么。虽然最后我也尝试了，结果也与我想的并无差别。公式化地看电影，吃一些不怎么好吃的漂亮饭，一边麻木地找话题聊天应付。这种无意义的社交感觉还不如我在家练一会琴，至少还能提供一些正向的情绪价值。我妈说我的要求不要这么高，但是如果就这么随意，我想象不到这样的婚姻能给我带来什么，意义在哪里，还是只是为了完成一个莫名其妙的任务。虽然有时候在网上刷到别人甜甜的恋爱也会羡慕，但经常感觉如果把我放进这段关系里大概会很不自在。可能是还没遇到对的人吧。转眼已经 28 了，我也不知道未来会是怎样，是否真的会有一个那样的人出现。一切随缘吧。关于家人九月底的时候爷爷因为脑出血去世了。我心里知道迟早会有这么一天到来，但是不知道会是以何种方式，也没想好如何面对，更没想到会这么的突然。那天下午爸爸给我打电话说情况不太好让我有个心理准备，没想到晚上再问就已经阴阳两隔。明明前几天我还跟爷爷打电话说国庆就回去看望他，没曾想竟是最后一次对话。手机里最近的照片是年初给爷爷过生日，戴着生日帽许愿的爷爷还在开心地笑着。可我现在甚至都不敢再点开那天的相册。上一次经历亲人的离别还是 22 年，我唯一的舅舅因为车祸离开了，我现在还能清晰地在脑海里回忆起他的声音和面容。现在终于明白，人这一辈子注定要不断接受所爱之人的离去，我们并不能改变什么，能做的只有把握当下，想做的事就尽力去做，不要等分别了再后悔。所以今年春节打算带家人出门去玩一玩，工作之后已经很久没有跟爸妈一起旅游了，虽然目的地还没想好去哪，总之尽量多陪陪家人吧。珍惜眼前人。其他剩下就是一些杂七杂八的琐事。去年开始刷的多邻国到现在已经六百多天了，虽然今年因为有太多事情要忙没有时间冲榜，但是至少每天一节的打卡还没断。去年说要考的业余无线电 A 证也拿到了，考试相当顺利，直接满分通过。不过还是因为忙别的事导致至今没有买手台，证拿到一年了还没有呼号（。今年骑车一次长途也没骑，昆明池刷圈也因为西安两个月的雨季暂停，导致今年骑行总量还不到 3000 公里。明年需要上一上强度了。前几天我服役八年多的笔记本因为电源问题自杀了，直接炸掉了一颗显卡的 MOSFET，无奈被迫组装了我的第一套台式机。Ultra 7 265K + 5070Ti 的配置，虽然这个时间点内存在价格山顶，但是其它配件多少还有降价，整体配下来还在预期范围内。专业技能方面，除了工作依然在写 C 以外，业余就一直在折腾 NAS，感觉我真能辞职去当个弱电师傅了（。不过现在换了新电脑，明年大概能折腾一些 AI 的东西玩了，希望能再点一些奇奇怪怪的技能树。大概就是这样。祝大家新年快乐！
前因很难想象访问内网服务这玩意我居然能水到第三篇博客，究其根本还是前面的方案虽然能用，但或多或少还是有些小毛病。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 Protocol，同一端口只能都启用 Proxy Protocol 或者都不用，所以我这样配置必然会导致其中一个冲突无法使用。最后我选择了一个简单粗暴的解决方案：直接再起一个 Nginx Proxy Manager 容器，一个开 Proxy Protocol，一个不开，分开配置反向代理，这下没有问题了（
接上篇的内容，我要从公网访问家中的内网服务，这完全依赖 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_lifetime 为 0 的地址，就可以快速废弃失效地址。#!/bin/bash IFACE="br0" ip -6 addr show dev "$IFACE" | \ grep -B1 "preferred_lft 0sec" | \ grep inet6 | \ awk '{print $2}' | while read -r addr; do echo "[IPv6 Cleanup] Removing deprecated address: $addr from $IFACE" ip -6 addr del "$addr" dev "$IFACE" done
先说一下我这里的网络，光猫改桥接，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 Key 到 /path/to/credentials.ini：dns_aliyun_access_key = 12345678 dns_aliyun_access_key_secret = 1234567890abcdef1234567890abcdef然后通过这条命令申请证书：certbot certonly \ --authenticator=dns-aliyun \ --dns-aliyun-credentials='/path/to/credentials.ini' \ -d "*.example.com,example.com"最后在 crontab 里加一条自动续期：0 3 1 */2 * certbot renew --quietNginx 配置的时候需要注意一点，我们平时配置 301 HTTP 重定向到 HTTPS，是从 80 端口跳转到 443 端口。但是这里我想只使用一个端口，如果在 11452 上配置了 HTTPS，此时如果通过 HTTP 访问，就会报 400 错误 The plain HTTP request was sent to HTTPS port，字面意思是 HTTP 请求被发送到了 HTTPS 端口。那么，有没有办法能在同端口进行跳转呢？还真被我找到了解决方案：只要在 Nginx 配置里加一行error_page 497 301 =307 https://$host:$server_port$request_uri;意思是把 497 和 301 错误重定向为 307 到指定 URL。497 是 Nginx 的非标准错误码，专门用来处理这种情况，表示“客户端尝试用 HTTP 访问了一个只支持 HTTPS 的端口”，所以完美地解决了问题。Unraid 反代NAS 这边我用的是 Unraid，原本想法是用 certbot 的 docker，和上面一样的方案申请证书，但是折腾了半天都没解决阿里云 DNS 插件的问题，只能另寻方案，最后决定使用 Nginx Proxy Manager，可以同时解决证书申请和反代。安装好 NPM 之后，在首页选择 SSL Certificaltes - ADD SSL Certificalte - Let's Encrypt这里勾上 Use a DNS Challenge，DNS Provider 选 Aliyun，下面填上阿里云的 Access Key，其它照常填写，就能顺利申请到证书，并且 NPM 会自动完成证书续期，不需要自己操心。接下来配置反代，添加一个 Proxy Host。由于 NPM 的 HTTPS 反代只能在 443 端口监听，所以这里需要一丢丢的歪门邪道：就是把 NPM 容器的网络类型改为 Bridge，然后容器的 443 端口映射到 11452 端口，这样 NPM 自己在 443 端口监听，实际到物理机这边通过 11452 端口访问。其它的就没有什么问题了，转发本地的 11454 端口，协议选 http，最后在 SSL 一栏选择刚才申请的证书，并勾选 Force SSL，保存之后就可以通过 HTTPS 完美访问。参考链接关于eui64的一些说明Configure ZeroTier on OpenWrtHow to redirect on the same port from http to https with nginx reverse proxy
最近我喜欢上了听磁带。起因是前段时间买了孤独摇滚发行的磁带专辑，然后就去搞了台磁带机。我好像一直都喜欢干这种为了醋去包饺子的事，当年也是为一张黑胶去买了唱片机。倒不是因为这些介质的音质有多么优秀，而是它们能让我静下心来去聆听。移动互联网时代人们能接触到的信息量是爆炸式增长的，一打开手机就是无数的内容涌入，信息流可以一目十行地刷，音乐可以随意地切换，就连短视频都想二倍速播放。如此高强度的刺激带来的后果便是思维愈发麻木，再不断寻求新的刺激，如此反复，大脑似乎停止思考了。但是磁带不一样，它还保持着上世纪的模样，没有上一首下一首，听完了要手动翻面，甚至播放进度都只能看它卷了多少去估计。就像小时候看电视一样，遇到喜欢的节目可以慢慢欣赏，播到广告了也得耐着性子看完。但我逐渐开始喜欢上这种感觉，静静地看着磁带旋转，完整地听完一整张专辑，从 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，从十年前在贴吧认识的时候他就在写代码了，那时候他甚至还在上小学，十年过去了，他依然保持着比我高太多的学习热情。今年他因为在西安实习，机缘巧合跟我当了几个月室友，他似乎永远都有写代码的动力，相比之下我就是那个躺平的懒狗。所以最后他如愿以偿拿到了阿里的 offer，如果换我大概第一轮面试就被刷掉了（。希望明年我能找到新的方向，趁自己脑子还能转得过来，再学习一些新的东西，最好还能再接触一些之前没有涉足过的好玩的领域。近期的计划大概是想在年后着手准备考一下业余无线电的 A 证，想玩无线电好多年了，一直没有一个合适的机会入坑，就以此为契机吧，祝我明年考试顺利。想了想今年确实没太多可写的东西，也不抒发什么感想了，就到这吧，也不浪费大家时间了。祝各位新年快乐！
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 都在用，感觉应该没啥问题。后来在 NGA 发帖问了问，又去 B 站翻了几篇电源评测，发现这款电源的电压稳定性比较差，用在 NAS 上可能有毁盘的风险。于是又加了几百块钱，升级到了 Tt 钢影 SFX 450W，80 PLUS 金牌，还是全模组，这下只有钱包受伤的世界达成了。散热CPU 散热由于机箱大小限制，只能选择 65mm 以下的下压风冷散热器，12100 应该还是比较好压的，就在京东随便挑了个看着销量还不错的 ID-COOLING IS-40X V3。实测下来 CPU 温度也就三四十度，还是比较靠谱的。乔思伯 N2 自带了一把 12015 的硬盘散热风扇，但是翻一下网上的装机评测，基本都会推荐把这玩意换掉，不但没啥风，而且声音很大。买了一把零度世家的风尊 T30，12025 规格，用着虽然确实安静，但似乎风量也不大。这个等到夏天了再看吧，实在不行再换别的。需要注意的一点是乔思伯 N2 背面留给风扇的空间相当狭小，如果要换 12025 的风扇，必须把硬盘转接板的供电和 SATA 数据线换成弯头，否则根本装不下。UPS为了 NAS 的长期稳定运行，UPS 还是得上一个的。这里我选择了经典型号 APC BK650M2-CH，支持宽电压输入，390W 最大功率也足够使用，还能通过 USB 与 NAS 通信，实时显示 UPS 的负载、剩余电量等信息，并在断电后控制 NAS 关机。其它剩下就是一些零碎的配件了。首先是四条弯头的 SATA 线，当时为了尽快到货直接选择了京东自营的山泽，担心 30cm 不够长于是买了 50cm 的，结果发现买长了，30-40 之间的长度会比较合适。而且这玩意线材又粗又硬，在 ITX 这狭小的地方属实理线地狱，打算后期换成那种长度合适的多合一线材。然后是硬盘供电线，乔思伯 N2 的硬盘转接板上预留了两个大 4 Pin 接口，可以直接给仓内 5 块硬盘进行供电，在淘宝上翻到有一家「斯恩线材」专门给 N2 做了一拖二的弯头双大 4 Pin 供电线，可以很好地与 12025 风扇兼容。还有 N2 的硬盘风扇自带的防护网由于网眼非常小，影响风量的同时还加大了风噪，我也一并换掉了，一块二买了这种透风的防护网，非常好用。最后还有给 Unraid 用的系统 U 盘，本来随便翻了个当年打比赛送的垃圾 U 盘凑合用的，结果没想到跑了一周就挂了，没办法又去买了个 32G 的闪迪 CZ50 酷刃，选这玩意是因为 Unraid 官方文档写的不建议用 3.0，而且还有 GUID 的限制，不然谁会在 2024 年去买个 USB 2.0 的 U 盘（。汇总完整的配置单如下：配件型号价格板 U 套装铭瑄 H60iTX 2LAN + i3-121001178机箱乔思伯 N2598硬盘希捷 7E10 10TB * 43867SSD致态 TiPlus5000 1TB * 2858内存光威 战将 普条 16G DDR4 2666 * 2281电源Tt 钢影 SFX 450W442散热ID-COOLING IS-40X V374风扇零度世家 风尊T3033.9UPSAPC BK650M2-CH468.82SATA 数据线山泽 SATA3.0 数据线 50cm * 433.68硬盘供电线斯恩线材 一拖二16风扇防护网-1.2系统 U 盘闪迪 CZ50 酷刃 32GB27.8合计 7879.4最后合计 7879，不到八千块，勉强还控制在预算内。单主机不算机械硬盘价格 3515.8（我怎么记得我最开始预计的是两千块左右呢）。总之所有 NAS 的硬件就是这些，目前装起来已经稳定运行了几周时间没有发现什么问题，非常稳定，待机功耗控制在 30W，已经是我比较满意的程度了。接下来的软件方面，我会在下一篇进行更新，详细说一下在 Unraid 使用上遇到的一些坑。
恍恍惚惚又到年末，回看过去一年，除了感慨时间的流逝好像又变快了一些，似乎也没有多少事情是值得留念的。年初因为 @归零 同学要离开西安去杭州挣大钱，于是我们就离开了从毕业开始住了快两年的出租屋。我在附近又重新租了一个小单间，面积不大，三十几平，但就我一个人住，还算宽敞。说起来这才算我第一次真正意义上的一个人住，所以一开始我也是很期待之后的生活。年前签了租房合同，年后正式搬家，忙前忙后到收拾完可能花了大半个月的时间。因为一开始计划的可能会在这里住比较久，所以也有蛮多布置的想法，换了智能门锁、规划了网络、预留了之后装扫地机器人自动上下水的位置...一切都安排妥当，仲景着未来几年的生活，结果没住几个月，计划就发生了大变化。那是一个普通的周末，我以为爸妈只是像之前一样过来随便看一看房，没想到定得这么果断，没有一丝丝防备，我就这么就突然地背上了房贷。之后就是到处跑，处理各种手续、交首付、办贷款...在我还没来得及反应的时候，我拥有了自己的一套房，在西安这座城市的一处犄角旮旯有了自己的容身之地。房子的事情处理得差不多之后，我就跟公司提了辞职。倒也不是一时兴起，虽然刚买完房就辞职怎么看都不是个明智的决定，但确实是我深思熟虑了很久之后的打算，公司老板反复试图挽留也被我拒绝了。在这家公司我从刚毕业一直干到今年，也的确学到了很多东西，但小公司终究是有小公司的局限性，军工的环境也多少有些严肃和压抑，于是我选择了辞职，希望能换一个更广阔的也更年轻的平台去发展，也想给自己一个调整的时间。两周时间交接工作，三月最后一天正式辞职，之后我就开摆了。难得有这么好的休息时间，早上睡到自然醒，除了吃饭就抱着手柄，要么就出门闲逛。悠闲到可以两周拿三个白金；可以为了西安第一家 IMAX 花两个小时通勤时间去看电影，再一个人溜达回来。虽然表面上看起来无比自由，但实际我只是在尽力逃避现实，不想这么快去面对，找工作的事一拖再拖，因为我也不知道未来到底什么打算，索性放弃思考，先摆一段时间再说。因为买的是二手房，不用装修置办家具，所以事情处理完就确定五一搬家了。年初租的单间合同还有半年，刚好大学舍友换房就转给了他。搬完家就是 25 岁生日。我曾经一直感觉自己还在二十出头的年龄，感觉自己和那群大一的没什么两样，直到那天刷微博，看到说大一和小学六年级只隔了六年，而我离大一也已经过去六年了...我突然意识到：20 岁已经比 30 岁更加遥远了。虽然一直以来的口癖都是年轻人怎么怎么样，但我好像已经没那么年轻了。变成了那个要考虑还贷、要为生活奔波、不知道自己的理想的，可悲的社畜。时间一年年过去了，而我似乎还并没有实现什么值得炫耀的成就。啊他妈的，这本该是我人生中最美好的几年，怎么还没干啥就奔着 30 去了。但生活不会因此停下，emo 完还得往前看，既然不知道未来怎么走，就先完成一下之前没完成的事。于是我把自行车收拾妥当，去年骑车回家的愿望还没达成，正好现在有时间，趁着端午前几天，我揣着一个充电宝和打气泵就出发了。之前跟我妈提这事她不同意，所以我出发时甚至没跟家里说，当她知道的时候我已经在半路上了。经常骑车的朋友都知道，一天两百公里并不是什么难事，所以我的计划是边走边看情况，状态好就一口气骑到家，不好就在凤翔休整一下。大概是辞职之后没怎么骑车，也可能是因为一直在爬坡，100 公里之后速度明显慢了下来，到达凤翔街道的时候小腿不出意外的抽筋了，差点一口气没缓上来躺在路边。于是就跟好哥们在凤翔吃个饭暂住了一晚，第二天上午很轻松地溜完了剩下的四十公里。虽然没有一天骑完有点遗憾，但至少完成了自从我买车以来一直的愿望。正式开始找工作应该是七月多的时候了，这应该是我今年最痛苦的一段时间。刚开始投简历还挑挑拣拣，准备面试到处跑，每次都信心满满觉得没什么问题，结果越面越开始怀疑自己，总是有各种意想不到的理由被拒。之后每天睁眼就是各种招聘 app 挨着翻，翻累了就去打两把 COD 睡一觉再接着翻。期间前公司老板还给我发消息，问我有没有意愿回去，但我确实不想再回到之前那个环境里，所以婉言拒绝了。这段时间几乎每天都是在焦虑中度过的，反复失眠然后思考人生，甚至给我培养出来一个睡前听 ASMR 助眠的新爱好。大概是今年行情确实不行，又或许是我的确技不如人，每拖一天，空窗期就实打实地又多一天，但又没什么好的办法。印象比较深的是去面中船泛华，前两面都没什么问题，技术面该说的也都说到了，因为还是 Qt，所以还算是我比较熟悉的领域。本来觉得已经稳了，结果到了最后项目经理面，对面反复透露出对学校不是很满意的意思，过了几天很敷衍地拒绝了。这时候我是有点不爽的，一开始有意见你不提，非要拖到最后才说，纯属折磨人。但也确实是咱学校不太行，没什么可辩解的，你不愿意那就告辞。经过漫长的折腾，八月份好歹是找到了工作，虽然不是很满意，但还是决定先干着，一是再拖下去空窗期会越来越长，二是已经当了快五个月的无业游民，加上现在还有房贷，积蓄快要不能支持我继续躺平了。先保证自己饿不死，再考虑后续发展，等明年看看有好的机会再跳槽好了。不过新的工作环境确实比之前舒适很多，跟同事相处得很融洽，工作强度也不高，每天写写代码摸摸鱼。只是有一点我到现在也没想明白，上半年我还在写 Qt，怎么突然就成底软搞文件系统了，这俩似乎八杆子打不着，也导致新工作我经历了好一段时间才慢慢上手，不过能点一些新的技术栈总是好的。之后就又回归了每天两点一线的生活，直到年末。回想今年有挺多想做的事没做成，比如报名了西安马拉松却没抽上签，比如想了两年的音律联觉又一次被各种事情耽搁没去成。但也完成了一些去年的目标，比如终于上手去学了一直想玩的 Blender，像模像样鼓捣出来第一个甜甜圈。也有意料之外的惊喜，没想到自己能在二开抢到林俊杰演唱会的门票，去看人生第一场演唱会。总之，又浑浑噩噩地度过了一年。今年我总是在思考人生的意义是什么，上学的时候等毕业，毕业之后等工作，工作之后等结婚...这辈子似乎就是被安排好的，必须循规蹈矩地这么走下去，最后被装进那个小盒子里。但我不想按部就班地活着，我会想去发疯，想去冒险，像瑞克和莫蒂，即使会有意外，会把自己的尸体埋在后院里。我好像从来不在乎死后会怎样，管你后人会把骨灰糊在墙上还是洒在海里。既然当下活着，就尽可能去实现一些价值，可是我现在有一种被铁链拴住的感觉。直到我那天看完《宇宙探索编辑部》，有这么一段话：我们这个杂志，它不是让大家朝九晚五，上班下班的。我们之所以现在是朝九晚五上班下班，那终究还是希望有一天，我们能有机会，去探索宇宙的。也许我们正在经历人生中的一段无意义时刻，就像电视上无尽的雪花点，但《编辑部》告诉大家，这是宇宙爆炸的余晖。这电影乍一看有点神经病，却恰好在我刚辞职最迷茫的时间，击中了我。当石狮落满麻雀，当毛驴穿越山间，宇宙的一切似乎都有了答案。从电影院出来的时候，我有种被触动了很多，却又表达不出来的感受。但它切实让我理解了那句话：“人生的意义在于承担人生无意义的勇气。如果你一直在找人生的意义，你将永远不会生活”。OK，今年的总结就写到这吧，最近一直懒得没动，拖到最后几天了才开始写，有点敷衍，也有些前言不搭后语，想起啥写啥，大家凑合看吧。祝大家新年快乐！
将电脑开关加入 HomeKit 以及基于 IPv6 的远程桌面
由于我目前打游戏已经全线转移到主机平台，所以一直没有什么换电脑的需求，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 网络，都可以一键开启家里的电脑，并连接远程桌面随意控制，非常方便。将电脑接入 HomeKit 之后，还能联动智能家居进行一些更有趣的玩法，比如配合人体传感器在我靠近桌面之后自动打开电脑，或是在晚安场景中关闭灯光的同时控制电脑关机，更多的玩法就自由发挥想象力吧。
一到年底这时间总感觉特别浮躁，人心惶惶地，干什么都静不下心来。年终总结也一直拖着不知道怎么写，反反复复写了又删，删了又写。主要今年也确实没干什么事，月初的时候洋洋洒洒写了几千字，越写越感觉不对，跟年终检讨一样，不想搞得那么沉重，就又删了重来。前几天还得了新冠，公司只要有一个人阳了，那终究是躲不过的。在家躺了十来天，除了第一晚发烧比较难受以外，后面除了咳嗽倒也没什么。就是味觉失灵了好几天，吃啥都没味儿。本来说趁着不上班在家闲着就把总结写完，结果能拖一天是一天，把 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 块钱的价格也算不上什么好车，不过就我而言入坑足够了，真让我花大一万去买个碳架车，我还舍不得用它通勤，最后零零碎碎买配件和装备总共花了大概有五千多吧。刚买车的那几个月真的是有劲儿没处使，每天晚上游戏都不打了，绕着三环就是三四十公里，骑到晚上十一二点才顶着满头大汗回家，拉爆路上的电动车成了我那段时间最爱干的事（危险行为，好孩子请勿模仿）。后来几个朋友也陆陆续续买了车，有空就一起结队出门溜车，享受风拍在脸上的感觉，安逸。关于骑车有两个目标希望能在明年实现：一是和朋友上一次分水岭，感受环法标准的最高难度赛段是否真的遥不可及；二是找个假期从西安骑车回宝鸡，这个想法从我刚买车就有了，甚至研究好了路线，希望明年能有机会完成这个愿望。去年本来是计划想给家里装台洗碗机的，后来因为各种原因没有装，今年也没给家里买什么东西，最后就给爹妈换了台手机。先说我爹，之前用的还是从我这换过去的 MIX 3，想着小米用习惯了，就继续小米吧，刚好小米发了个新的折叠屏旗舰 Fold 2，看起来也还不错，我就眼馋了好久。但为什么最后没有买呢，主要还是网络的评价看下来，折叠屏这玩意，如果给我这种爱折腾的人手里，尝个鲜倒也没什么。但是八九千的手机给我爹手里，要是三天两头出问题，那就不太能接受了。折叠屏毕竟还是个新鲜玩意，没有那么成熟，所以最后稳妥起见还是选了小米的当家旗舰 12S Ultra。我妈这边呢，用的还是我大一时给买的 iPhone 8，其实早都卡得不能用了，今年换了块电池还在坚持。想继续给换 iPhone，但 Pro 的重量我妈大概是不能接受的，所以虽然没了高刷有些遗憾，最后还是给换了标准版 14，不过 iPhone 8 本来就没高刷，换过来倒也没什么割裂感。为什么不是 14 Plus 呢，因为当时要赶着国庆带回去，苹果首发没有 14 Plus 所以没赶上档期（。虽然手机带回去之后一如既往地吐槽我乱花钱，但看得出爸妈还是很开心的，这也就足够了。好了，今年大概也就这么些值得讲的东西，再写下去又成流水账了，那就这样吧。祝各位新年快乐！无限进步！