普通视图

发现新文章,点击刷新页面。
昨天以前sjdhome blog

2025 年度总结

作者 sjdhome
2025年12月28日 00:00

又是一年一度的年度总结了。今年有好多新的事情发生,可惜因为工作的原因,没有时间把这些事及时记录到博客上。

上海一日游

今年春节,在我的提议下,父亲带着我和母亲开车前往上海游玩。

上一次去上海是 13 年前了,只有模糊的印象了。这次直接开车到外滩旁,外滩已经是人山人海了。

外滩,可见东方明珠

海关大楼

过红绿灯时还发现一个细节,上海的红绿灯似乎是液晶屏做的,很细腻,看不到密集的大光珠。

虽然我应该不会在上海工作,不过还是挺憧憬在上海的生活的。即是一线城市,又离我的老家近,气候饮食也相似,工资也高。

毕业

今年 6 月末,学校举办了毕业典礼。我这才发现,我即将不再是学生了,以后也不会再是学生了。

宿舍里的生活用品

宿舍床铺

大学给我的印象很淡。自入学起,就是各种封校、辅导猫打卡、核酸检测。直到 2023 年之前,我都是被关在学校里的,就像在坐牢一样。

解封后的生活变得多彩了一些,至少我可以去商场购物、去公园散步、在学校旁的河边看老牛吃草。

学校旁河边的老牛

工作

自从大三的暑假后,我就或多或少的参与到工作中了,不再是一个纯粹的学生了。在学校时,经过询问之后,我所在的公司允许我远程实习,这也让我体验一把 Remote 的感觉了。事实证明,Remote 非常棒!

每天早上可以睡到 08:50,完全没有通勤时间,早中晚饭都在家解决,每周只需开两次例会。

可惜毕业后,仍然是需要回到青岛办公室上班的。不过考虑到我司是 965 WLB 的,这一点也还能接受。

北京两日游

本来我是个不怎么旅游的人,但是这次趁着周五到公司北京办公室出差,我也来一次北京两日游。

进京前北京的空气质量特别差,但是我一来就天气晴朗了。

北京空气质量指数迅速下降

周五晚在公司讨论今后 AI 产品的发展方向,讨论到半夜。

公司的北京办公室

周六去看看美国大使馆和日本大使馆,附近有好多警卫在巡逻,没敢拍照。

后来又去了鸟巢,上次去鸟巢已经是 17 年前,恍惚间还能看到当年拍照的位置。

北京鸟巢

北京的风特别大,在鸟巢旁的广场上推着我走,越吹越冷。

周日没敢再玩了,太冷了。酒店退房就到高铁站等着了。

AI

自从 2022 年 11 月后,AI 的发展速度就越来越快了。从初次听闻 Cursor,到现在各路 AI 工具齐上场,也不过一年多的时间。

和大多数人不一样,我并不担心 AI 会替代我。每个人经历的独特性是人与人之间区别的起源之一。也正因为如此,我希望培养与我性格类似的 AI。

公司在年初就宣布 AI 工具费用可以报销,我便同时订阅了 ChatGPT Plus、Claude Pro 和 Cursor Pro 了。每天换着用各种不同的 AI,真是太爽了。

Kindle

国庆节购入了一台 Kindle Paperwhite 6,这是我的第一台墨水屏电子阅读器。

Kindle

在这之前,我也是主要阅读电子书的。但无论是 27 英寸的液晶屏,还是 iPhone 12 的 OLED 屏,长期盯着看都不太舒服。尤其是看书需要专注,很可能忘了眨眼,感觉长期如此要得干眼症了。

来到青岛后,我还试着办了借书卡。但是区图书馆的藏书量太小,我想看的书很多都没有。座位又都被考研/考编大军占据,导致我只能站着看书。即使把书借回家,我也对书的卫生有所顾忌。

电脑

2024 年年末,我拥有了第一台 Mac,也就是 Mac mini 2024 (16+256)。在此之前,我虽然在台式机上体验过黑苹果,但从来没有真正体验过白苹果。现在我也是有 Mac 的人了。

不过苹果的软件质量这几年下降的很厉害。虽然 macOS 仍然是一个精致的系统,但大大小小的 BUG 也开始让我失望。因此我仍然在同时使用我的联想 YOGA 14s 笔记本,换上新的 1T 固态,装上 Arch Linux,和 Mac 一起使用。

投资

开始工作后,终于真正意义上拥有属于自己的钱。每个月去除开销后的闲钱,不能再像之前一样放在余额宝领那一点点利息了,于是我开始研究投资。

开港卡+券商账号的方式对我来说还是难度过高了,因此先将就着投资支付宝的美股指数基金,每周定投。没想到定投几个月后,遇到了基金限额的事情,先前我挑好的几个基金先是限额每日 1000 元,后来渐渐的限制每日 500 元、每日 100 元,最后竟然限制每日 10 元!每天 10 元还投个屁啊!好在东拼西凑各种基金产品,最后还是能凑满定投目标的,先这么将就着用吧。

笔记

本来为了隐私考虑,我坚持使用 Markdown + Vim + Git 的笔记记录方式。事实证明,这套方法只在电脑上好用。一旦来到手机上,简直就是灾难。导致我后面不得不在 iPhone 上用 Apple 备忘录做记录,但 Apple 备忘录又与 Linux 不互通。

最终在 12 月底,我还是妥协了,换回几年前用过的 Notion。回到 Notion 后,终于能体验到所见即所得的编辑体验了。已经很久没有体验到正确的段落行宽和字体大小了,在 Vim 中这些体验通通没有。

博客

今年一篇文章也没写,很大一部分原因是忙于工作。周一到周五都要上班,周六周日也不想再坐在电脑前敲文章了。

同时我也想好好改造一下博客。作为一名前端工程师,我的博客还是过于简陋了。

番剧

今年在周末的夹缝中又看了几部番,每一部都让我印象深刻。

  • 魔法少女小圆
  • 新世纪福音战士
  • 败犬女主太多了

未来展望

  1. 学习日语,不求过 N1,至少看番时可以大致听懂对话。
  2. 能有只属于自己的收入来源,为生活增加一份稳定性。
  3. 自己身体健康,家人身体健康。只要还能行动,还能思考,日子就总是过得下去的。

我的 2024 年

作者 sjdhome
2024年12月31日 17:59

今年是不平凡的一年。人生中第一份实习工作,第一次租房。用自己挣的工资买了自己喜欢的东西。

今年也是命运多舛的一年。1 月 1 日就差点因车祸阴阳两隔。秋招几乎毫无收获,不是简历石沉大海,就是二面挂。

2024 年即将接近尾声,就在此记下一些比较重大的事情吧。

💀 没有降临的车祸

1 月 1 日 13:34,我在外出吃饭后乘坐公交车回到学校,学校与公交站台隔着一条快速路。在过马路时突然驶来一辆汽车,在几乎就要撞到我时才改变方向,不知是主动避障系统介入还是司机刚反应过来。总之我没有受伤。

或许是世界线变动了?最终没有进入悲伤的世界线。

🚉 一人旅行

2022 年 12 月之后在学校的每个周末,我都会独自进行一场小型旅行。

所谓旅行,其实只是去商场吃顿饭,去超市买些零食,然后在附近的公园里散步。

每次走在公园中,我都会有些恍惚,望着蓝天白云,仿佛我的余生也将如此平淡无波地流逝。

😵‍💫 无尽的面试

为了在求职中占据优势,我从 2 月开始积极投递简历。到了 3 月中旬,腾讯突然展开了大规模的面试邀请,令我措手不及。

原本打算先通过小公司的面试积累经验,没想到人生中前五场面试竟全都是腾讯,而且全都以失败告终。之后,腾讯就再没有安排过我的面试。

接下来,我陷入了无休止的简历投递和已读未回的循环,直到现在的这家公司出现,才终于打破了僵局。

🏝️ 青岛实习之旅

5 月末,我终于成功通过了现在这家公司的面试,暑期实习也有了着落。

实习期间,公司的指定办公地点之一是青岛。由于经验不足,我差点没能租到房子。

作为苏州人,我第一次见到如此陡峭的马路,上下班的路程简直是在爬山。市区也没有共享单车,因为根本骑不动。

公司为我提供了一台 MacBook Pro。在此之前,我只用过自己组装的黑苹果,这次终于体验到了真正的"白苹果"。

每逢周末,我就会去各个景点游玩,在石老人海滩看海,去奥帆中心放松身心。边实习边旅游,真是一种难得的享受。

☕️ 沉闷的学校实训

虽然自己找到了实习,但学校的形式主义还是避免不了的。9 月份被关在学校强制进行了 1 个月的封闭培训。

学的内容还是培训班的老三套:Spring Boot、MyBatis 和 Vue。顺带还要写三份实训论文,美其名曰「提前适应写论文」。

还有一门 Linux 课程还挺有意思,主要是讲 Ubuntu 的安装和管理。可惜我已经是多年 Linux 用户,对这些知识早已烂熟于心。

🛜 舒适的远程实习

实训结束后,我继续在公司实习,不过这次是远程实习。

早在 V2EX 上听说过远程工作,这次亲自体验一回,实在是非常舒服。

由于住在学校宿舍,工资就不必浪费在租房上了。每天午饭和晚饭就在附近的快餐店解决,可以吃得比学校食堂更好。

✍️ 手搓协议的毕业设计

经历慎重的考虑后,最终决定我的毕业设计选题是根据 IETF RFC 9484 手搓一个 VPN 协议及实现。

动机来源于学校校园网把我连回家中内网的 WireGuard 连接给阻断了,每次还得用流量混淆器才能连上。

如果是手搓协议,他们应该就识别不出了吧。不过到时我也毕业了。

🎁 给自己的礼物

自从自己赚了钱之后,终于可以光明正大地购买自己喜欢的东西了。

恰逢 Apple Mac mini M4 上市,我便迫不及待地去南京新街口 Apple Store 现场自提了。

不过还是错判了一点:宿舍里没有显示器。于是只能买了块 HDMI 采集卡接到笔记本上用了,好在延迟还能接受。

🐦 咕了的博客重构

实习时接触到了 Astro 框架,发现其实在做博客站方面 Astro 比 Next.js 更好用。

不过平时都忙着实习和写毕设了,博客的重构就自然而然咕咕咕了。

5️⃣ 展望

其实也没啥展望了,在这个经济形势下都是过一天算一天的心态了。

但还是希望 2025 年,我能过的更加幸福。

制度与利益

作者 sjdhome
2024年10月3日 15:32

以下为争议话题,如果你想反驳,欢迎邮件交流。

无论是过去还是现在,都流行着一种思潮,认为进入公务员体制内,可以获得稳定和仕途。这点被很多人嗤之以鼻,因为体制内一眼望到头的生活是很绝望的,如果不退出,一个人的一生就像是被体制安排好了。这一点其实不只是体制内会有,在大型企业内同样也有,只是不太明显。

体制与大型企业的共同点,就是有一套完善的制度,将每个人该做的和不该做的事情写得清清楚楚。每个人,只要按照这套制度执行,便可保证整个体系稳定。人作为个体,成了制度的"执行器"。思考是不被允许的,因为这会增加不稳定性。

通常为了弥补,制度下的个体都能拥有巨大的回报,使其安分守己。在利益来源(销售利润、税收)断绝之前,体制下的个体还能滋润很长一段时间。甚至个体还会自发维护起制度,毕竟这是他们美好生活的来源。

自由

如果还能意识到自己的生活是由自己掌控,而不能被别人安排的话,就不要为了利益而进入这样的制度。毕竟制度的奖励只给听话的"执行器",而不是会思考的人。

而且在制度下,人会身不由己,毕竟退出的代价是巨大的,而丧失的自由与之相比,却又微不足道。等到幡然醒悟,却发现自己已经离不开制度了。

最后

想来也是惭愧,不是每个人都可以毫无顾虑地拒绝制度的,毕竟如果要吃不上饭了,放弃点自由又会怎样呢?生存才是第一要务。

解决 Windows PPPoE 连接在系统睡眠后消失

作者 sjdhome
2024年5月7日 14:41

自从发现学校的有线网络比无线网络快 10 倍后,我每节课都通过机房的交换机上网,上网前需要先进行 PPPoE 拨号。

每次下课休息后,就会发现之前连上的 PPPoE 断开了。本来这也没多大事,估计是电脑进入睡眠模式,连接超时自动断开了。但重新连接后任务栏仍然显示无网络连接。此时其实已经连上网络了,估计是 Windows 的某个遗留 BUG。

这个 BUG 还会影响 WSL 2 的 Mirrored mode networking,造成 Linux 内无法联网,这可就不能忍了。

解决方法

  1. 打开任务管理器。
  2. 找到 Network List Service,右键,结束任务(不用担心,它会自己原地复活)。
  3. 找到 资源管理器,右键,重新启动。

备注

services.msc 里重启 Network List Service 似乎无效,它会卡住,必须强制终止。

解决 Next.js build 完成后卡住的问题

作者 sjdhome
2024年4月13日 15:19

最近一段时间,我在执行 Next.js 项目的 npm run build 之后总是卡住,表现为在完成 Finalizing page optimization,显示完所有 route 之后,bash 的 prompt 一直没有出现,只能手动 Ctrl + C 打断构建流程。但此时的构建结果可以正常被 npm run start 使用,在 Vercel 上构建也不会出现卡顿问题。通过使用 stracess 命令,我找到了原因。

方法

执行 npx next telemetry disable 退出 Next.js 的 Telemetry。

如果不使用 npm,可以参考官方文档

分析过程

通过执行 strace npx next build,我得以看到 Next.js 编译过程中所执行的系统调用。为了能将 strace 的输出和 Next.js 的输出分开,可以使用 mkfifo log 命令建立命名管道,然后执行 strace npx next build 2>log 将 stderr 重定向到管道,使用 cat < log 输出系统调用信息。

strace npx next build 最终卡在以下部分:

+ First Load JS shared by all            87 kB
  ├ chunks/23-b022cbf28d88ae21.js        31.4 kB
  ├ chunks/fd9d1056-e3489de6ce1f07f6.js  53.7 kB
  └ other shared chunks (total)          1.94 kB


○  (Static)  prerendered as static content
●  (SSG)     prerendered as static HTML (uses getStaticProps)

cat < log 则输出:

epoll_pwait(17, [{events=EPOLLIN, data={u32=22, u64=22}}], 1024, 0, NULL, 8) = 1
read(22, "\1\0\0\0\0\0\0\0", 1024)      = 8
epoll_pwait(17, [], 1024, 0, NULL, 8)   = 0
epoll_pwait(17,

epoll 系统调用通常用于网络上,因此大概是遇到了网络问题。

另外打开一个终端,输入 ss -tn,可以看到许多 Vercel IP 段的 TCP 连接:

ESTAB                  0                  2384                            10.20.244.49:60724                          76.76.21.22:443
ESTAB                  0                  1675                            10.20.244.49:60970                         76.76.21.241:443
FIN-WAIT-1             0                  2015                            10.20.244.49:60750                         76.76.21.142:443
ESTAB                  0                  4851                            10.20.244.49:60844                          76.76.21.22:443

结合之前 Vercel 在中国大陆被阻断的事件,我大约感觉出了原因。HTTP_PROXYHTTPS_PROXY 似乎对 Next.js 无效,因此需要借助 TUN 或者 WireGuard 等全局联网方式才能解决。

当然,最简单的方法就是退出 Next.js 的 Telemetry

后记

怪不得我在 StackOverflow 上找不到解决方法,因为世界上大部分国家的程序员都不会遇到这种问题。

但 Vercel 也应该给 Telemetry 加个 timeout 的措施才是。

参考资料

实现 WSL 2 开机免登录自动启动

作者 sjdhome
2024年4月8日 16:42

WSL 2 在个人使用时,根据终端随开随用很方便,长时间不用自动关闭也节能。但作为服务器系统使用就不够了。

WSL 2 的自动启动有很多方案,本文写的是基于 Windows 自带的任务计划程序的方案。WSL 之前一直不支持通过任务计划程序启动,这个 BUG 直到 2023 年 9 月 27 日 才被修复,真不愧是微软。

步骤

  1. 一定要确保 WSL 当前处于最新版本(即 WSL September 2023 update 之后的版本),系统自带版本不支持这种开机启动。
  2. 打开任务计划程序。
  3. 点击右边的创建任务。
  4. 任务的名称和描述可以随便写,安全选项需要选择"不管用户是否登录都要运行"。
  5. 点击上方的"触发器"选项卡,点新建按钮,然后会卡几秒(微软的老 BUG)。开始任务中选择"启动时",然后点击确定。
  6. "操作"选项卡中,点新建按钮,然后"程序或脚本"下的文本框里输入"C:\Program Files\WSL\wsl.exe",引号也要带上(非常重要,除了这个目录下的wsl.exe,其他位置的都不行)。添加参数可以根据需要填写,比如-d Debian指定发行版。
  7. "条件"选项卡中,所有选项全部取消勾选。
  8. "设置"选项卡中,除了"允许按需执行任务",其他全部取消勾选。
  9. 点击确定关闭窗口。可以先右键运行试试效果。这种方法运行的 WSL 即使当前用户注销也是会继续运行的。

Linux 内部的自动启动就得靠 SystemD 了,这里就不赘述了。

故事环节

最近几个月一直在纠结 Windows 和 Linux 双系统的问题,期间碰到了不少的坑。尝试过的方案有:

  • PVE 做宿主,Windows 和 Linux 都作为虚拟机:NVIDIA 显卡透传的问题很大,PVE 作为宿主还要吃掉一小点性能。约等于同时维护三套系统,累。如果要远程开机和 SSH,还得先把 PVE 面板映射出来。
  • Linux 做宿主,Windows 跑在虚拟机:同样存在显卡透传问题,而且手动配 QEMU + KVM 虚拟机心智负担太大,我也不想用 libvirt 等方案。同时之前为了装 Windows 11 买的 TPM 模块就浪费了。我的 Linux 系统还做了硬盘加密,远程开机也废了。
  • Windows 做宿主,Linux 跑在虚拟机:无论是 VMware Workstation 还是 VirtualBox,都是大毛病没有,小毛病不断。不管哪个方案,Linux 内部的显卡都是残废状态,操作起来一卡一卡。如果只是在终端操作,倒还没什么问题,桌面操作就废了。如果宿主是笔记本,进入了 S0 睡眠模式,VMware Workstation 会出现内核 CPU stuck 错误,VirtualBox 则是出现时钟漂移。
  • 再买一台电脑:没钱。
  • WSL 1:内核太老,性能差。
  • WSL 2:有显卡加速,虽然不算是真·虚拟机,但比起上面几个方案好太多了。

用 WSL 2 做服务器 Linux 似乎不太正经,不过我也不要求有多高的稳定性,能充分利用我现有的硬件就够了。如果有更高要求,直接去 AWS 买 EC2 吧 ¯\(ツ)/¯ 。

参考资料

我的 2023 年

作者 sjdhome
2023年12月28日 18:30

转眼间 2023 年就这么过去了。思绪中仍然停留着 2020 年初的新冠病毒全球传播的场面。

自从 2022 年末的政治事件后,严厉的封控和无止尽的核酸检测成为了往事。每次路过曾经的核酸亭,都会让我回想起这荒唐的三年。

不管怎样,2023 年是以正常生活开局的。

🤖 ChatGPT

2022 年末的大事件除了封控解除,还有现在广为人知的 OpenAI ChatGPT。当时还是在 X (Twitter) 上看到 clowwindy 发的角色互换扮演 Terminal 才了解到 ChatGPT。

ChatGPT 的出现最终开创了新的人工智能时代。

📺 三体电视剧

在很多年前我就已经读过三体的小说,里面奇幻的场景只能在脑中幻想。1 月初,哔哩哔哩主导的艺画开天版三体动画和腾讯主导的三体电视剧同时上映。艺画开天的水平大家都懂,所以我也没去看。

电视剧的水准远远超出了我的预期,除了个别缺陷外,可以称得上是一部好作品。

➕ 线性代数失利

由于 2022 年的解封,大学提早回校,所以考试也延期到 2023 年开学。虽然在假期里没有好好复习,但大部分科目成绩都不错,除了——线性代数。

人生中的第一次挂科,让我陷入恐惧。好在经过一个学习的重修后,最终得到了不错的成绩。

🌐 博客的建立

原本只是实验性质的项目,刚好碰上这学期有网页设计课,正好作为大作业。

在这之前类似的项目有很多,但都无一例外烂尾了。这次我从最基本的结构开始。毕竟根据奥卡姆剃刀原理——若无必要,勿增实体,先从简单的项目入手,再慢慢扩充功能。

接下来就是平稳演进的故事了,从静态网页、Next.js、Simple Go backend 演化到现在的 Node.js backend。我的写代码能力也在稳步提升。

🖥️ 蓝桥杯和 PAT

今年我参加了蓝桥杯算法竞赛和浙江大学的 PAT 算法竞赛。

比赛后深知自己不可能在算法领域有所建树,因为做题目想得脑子疼。

为了面试,应该还需要多做些 LeetCode 的题目,只好忍忍了。

✉️ 迁移到 Gmail

腾讯开始收回邮箱的无限空间功能,并去除了一些其他权益。为了求稳,我转移到了 Gmail。

在此之前我体验过诸多不同的邮箱:126、Outlook、QQ 邮箱以及自建邮箱,每个都有不同的优点和缺点。但是现在我累了,Gmail 从 2004 年到现在已经运营了 19 年了,应该不会出什么大茬子,我对邮箱的要求也不高。

迁移时 Microsoft 365 的 Outlook 客户端还帮了个忙,让我能无损的把以前所有邮箱的邮件都迁移到 Gmail。或许这是正常邮箱客户端都有的功能,不过我既然装了 Outlook 就用它吧。

❌ 不折腾

今年有两个时刻,我的开源精神突然发作了,备份好电脑的数据后就装上了 Arch Linux,幻想着完全使用 Linux 的美好生活。但最后都回到了 Windows + WSL 2。

虽然我的技术知识很大一部分都是来源于折腾,但现在折腾过头了,已经遇到了边际效应。

在 Linux 中搭建美好的环境就留给以后吧,现在还要应付现实生活的不完美,没有时间再追求美好了。

👃 鼻炎

以下言论不构成医疗建议,仅为个人心得。

多年的老鼻炎在用了丙酸氟替卡松后终于缓解了。医院开的布地奈德对我几乎无效。

曾经想过自己会不会是血管运动性鼻炎,如今看来只是普通的过敏性鼻炎。

最终

今年开始有了记日记的习惯,如果没有日记,上述内容早就忘光了。

希望 2024 年能有更好的生活。我还没正式开始工作呢,经济下行就已经开始了。

在 Windows 上启用 IP 转发

作者 sjdhome
2023年11月10日 14:43

启用 IP 转发,可以让机器自身成为一台路由器来转发 IP 报文。在 Linux 下,可以通过 sysctl net.ipv4.ip_forward = 1sysctl net.ipv6.conf.all.forwarding = 1 来启用内核 IP 报文转发。但在 Windows 下,相关的文章却很稀少,许多带有误导性。

步骤

  1. 管理员权限运行 PowerShell,输入 Get-NetAdapter 确定要操作的网卡名称(即输出结果的 Name 列)。
  2. 输入Set-NetIPInterface -ifAlias '网卡名称' -Forwarding Enabled,单引号保留,网卡名称换成上面找到的。

要获取所有已打开转发功能的网卡,输入 Get-NetIPInterface -Forwarding Enabled

对比其他方法

  1. 使用netsh interface portproxy:只能实现端口对端口的转发,无法做到路由转发的效果,也不保留源 IP 地址。
  2. 修改注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters:全局生效,无法单独针对某一块网卡做调整。

NAT (MASQUERADE)

Linux 下使用 IP 转发通常会搭配 iptables 的 MASQUERADE 功能使用。但在 Windows 下我没有找到对应功能。

如果你的需求是使用 WireGuard,将某台机器作为互联网出口,Tailscale 会更适合,他们解决了 NAT 问题。

参考资料

迁移到 Next.js

作者 sjdhome
2023年10月20日 19:01

历经多次思想斗争,最终我将整个网站迁移到以 Next.js 为主的技术栈。

为什么要迁移到 Next.js

根据 Hello world 文章中所述,我的网站之前完全是纯静态 HTML 驱动的。 这种方式在网站内容不多的时候还能接受,但是随着网站内容的增加,维护起来就越来越麻烦。每一个 CSS 样式的变动都会带来灾难式的维护体验。

很久之前,我就已经学过 React.js,但出于复杂度控制,我没有把它用到我的网站上。但是随着网站内容的增加,我不得不考虑使用 React.js 来管理网站的内容。为了防止出现 React.js 项目选型的复杂度控制问题,我选择了 Next.js。

迁移过程

看着自己的网站,然后仿造出一个一模一样的网站真是一种奇特的体验,至少在失去耐心之前。所以这一迁移过程持续了很长时间。Next.js 13 的 App Router 还改变了原定的就地渲染 Markdown 计划,现在必须将文章内容单独做一个后端 API,不过这增强了网站的可扩展性。

2024 年 4 月 13 日补充:现在已经转向读取本地 Markdown 文章然后静态生成的方法了,想来以前还是 naive 了。有了后端,维护起来更麻烦了。

迁移中我还采用了 Tailwind CSS 技术,避免了以前纠结 CSS 类应该取什么名字的问题。

2024 年 4 月 13 日补充:现在使用 CSS Module 技术。CSS Module 和 Tailwind CSS 相比互有优劣,但我认为 CSS Module 更加接近原汁原味的 CSS 编写方式。

迁移后的网站

整体上没有大的改动,只有一些细节上的修改。

对于中国大陆用户来说,网站的访问速度应该会变得更慢了😂,这是因为现在网站托管在 Cloudflare Pages 上。感谢 Cloudflare 提供的免费服务。

2024 年 4 月 13 日补充:现在部署在 Vercel,仍然使用 CloudFlare 做 CDN(对国内来说依然是减速 😂)。

评论功能正式启用

作者 sjdhome
2023年8月14日 15:14

在众多评论系统和自研评论系统之间来回纠结,终于在建站 5 个月后,选择了 giscus 作为本站的评论系统。giscus 的功能十分完善,Markdown、LaTeX 公式和各种样式都已支持。评论前需要先使用 GitHub 登录。对于担心隐私的读者,可以直接在对应的 GitHub Discussions 回复,但需要对应主题存在(即已经有人回复)。

美中不足的是,由于评论托管在 GitHub,中国大陆读者可能会面临加载缓慢等问题,还请读者自备科学上网工具。

解决 GNOME 桌面环境下 Chromium 系浏览器全屏时有横线闪烁

作者 sjdhome
2023年8月9日 08:51

大前提

本文假设你使用的是 GNOME (Wayland),且使用 Xwayland 运行 Chromium 系浏览器。

TL;DR

安装 gnome-shell-extension-disable-unredirect 这个 GNOME 插件并启用。如果从 AUR 安装可能需要自己改一下兼容 GNOME 版本号。

分析

经过了数年的努力,Linux 桌面在 Wayland 的环境下,大部分软件都可以正常使用了。Chromium 系浏览器虽然可以通过设 --ozone-platform-hint=auto 来启用 Native Wayland,但硬件加速就没法工作了,大概是因为我用的是 NVIDIA 卡的缘故。

默认情况下,Chromium 系浏览器都是运行在 Xwayland 下,且启用硬件加速。在播放 YouTube 或哔哩哔哩视频时,如果不全屏,视频可以正常播放。如果进入全屏模式,过几秒画面上就会出现闪烁的横线。

互联网上的大部分教程都是让关闭硬件加速或者传入各种奇奇怪怪的 Chromium flags。关闭硬件加速是治标不治本的行为,对于日常网页浏览影响不大,但是会显著增加 CPU 负担,尤其是播放 4K 视频的情况下。各种奇怪的 flags,如 --ignore-gpu-blocklist--use-gl=egl 以及 Arch Linux Wiki 上有关 Chromium 硬件加速的 flags,还有 VAAPI,测试下来基本没有效果,部分似乎有效果的 flags 都是误打误撞把硬件加速禁用了。

经过众多搜索后,我意识到这似乎是一个垂直同步问题,虽然画面上是跳动的横线,不像 Windows 下的画面撕裂是错位的样子,但应该和垂直同步有关。于是我参考了 How do I enable desktop Vsync on GNOME Wayland with NVIDIA driver?,并尝试了 gnome-shell-extension-disable-unredirect,这是一个 GNOME 扩展,问题解决了。

我的猜测是 GNOME 在浏览器全屏后不再强制对窗口进行画面转发和同步,而是由窗口自己负责,进而导致浏览器出现画面撕裂。Chromium 系浏览器在 Linux 下不会自行垂直同步的问题已经有很长时间了,但一直没有解决过。gnome-shell-extension-disable-unredirect 仅仅是强制 GNOME 继续接管全屏窗口,并没有解决垂直同步问题。

在搜索过程中还发现了 mutter-dynamic-buffering,这个包把 GNOME 混成器 Mutter 替换成开启双重或三重缓冲的版本,但这样对系统包的介入性过强,因此没有尝试。

我用的不是 GNOME!

对于其他桌面环境,解决思路应该类似,都是打开自己的桌面混成器的垂直同步或三重缓冲功能。

遗留问题

虽然在 chrome://gpu 里显示 Hardware accelerated,但播放视频时在 F12 控制台的 Media 选项卡里并没有看到调用显卡解码,依然是 FFmpegVideoDecoder 且 Hardware Decoder 为 false

参考资料

解决修改 Bash Prompt 后翻阅历史命令时显示错位

作者 sjdhome
2023年7月10日 08:55

在修改过 PS1 变量后,使用上下方向键翻阅历史命令时可能会出现命令将提示符覆盖掉的情况。

方法

将不可见字符(如 ASCII 颜色字符)用 \[\] 包起来。

例如:PS1=\e[32m\$\e[0m -> PS1=\[\e[32m\]\$\[\e[0m\]

原理

Bash 在覆盖当前行时会计算 Prompt 的长度,即使是不可见字符也会计算在内。\[\] 的作用是让 Bash 不计算这部分字符的长度。

参考资料

如何手动安装 rust-src

作者 sjdhome
2023年5月30日 14:00

安装 Rust,官方通常推荐使用 rustup 进行安装和版本管理。可如果我就是不听,一定要手动安装,官方也提供了 Standalone installers。可是用这种方式安装的 Rust 不带 rust-src,使用 Visual Studio Code 时 rust-analyzer 扩展会出现如下的错误提示:

Failed to spawn one or more proc-macro servers.

最后一句try installing the Rust source the same way you installed rustc是解决问题的关键。对于如何修复这个错误,Google 并不能找出直接的答案。大多数解答都是针对 rustup 安装错误,安装 rust-src 的方法也只有使用 rustup。

解决方法

Standalone installers 下载页面的底部,可以下载对应当前版本的 rust-src 的压缩包。之后需要在Rust安装位置/lib/rustlib/下创建一个src文件夹,然后将压缩包里的rust-版本号-src文件夹解压到src目录下,并将rust-版本号-src重命名为rust

安装完成后的效果图

成瘾游戏的属性

作者 sjdhome
2023年5月23日 20:30

本文章仅代表我个人的观点,如有异议欢迎邮件交流。

如果一个游戏容易上瘾,通常会包含三种属性:暴力、竞争、财富。

暴力会直接导致竞争和财富转移。从简单的第一人称射击游戏(Counter Strike、Cross Fire 等),到各种策略回合制游戏(Sid Meier's Civilization 等),玩家发起暴力行为都是游戏的主要元素。游戏暴力和竞争反映了人类的本质冲动:生存。没有暴力和竞争,人类就不会从动物界中脱颖而出。在和平年代,热血青年们无法通过实际行动来释放自己的激情,便会投身于这类游戏之中。

然而,除非本来就身处游戏行业,否则在游戏中产生的竞争行为几乎毫无意义。在游戏世界中取得成功,并不能代表在现实世界取得成功,但两者都能产生成功的喜悦。久而久之,相比游戏中的成功人生,会对现实世界的乏味人生感到失望,进而加剧了对游戏的上瘾程度。但是,现实世界是不可替代的。在游戏世界中再成功,那也是游戏公司创造出的世界,游戏公司决定了游戏世界的发展方向,一张停服公告便可以否定玩家的一切努力。现实世界即使充斥着黑暗和官僚主义,世界存续与否、自己努力的价值都是掌握在自己手里的。

暴力会导致财富转移,同现实世界的经济系统一样,游戏内的经济系统也存在着马太效应,即使是单机游戏也是如此。刚开始的各种各样的贫穷往往是漫长的,赢家通吃,需要长期游玩才能积累自己的原始财富(金币、排名、皮肤等)。一旦原始财富超过一定的数值,财富翻倍的速度便开始加快,直至达到顶峰。这也是构成成瘾的一个环节。

为什么

有人会说,我上班/学习了一天,玩把游戏消遣一下不行吗?当然可以,游戏本来就是用来消遣的,但它也消耗了所剩不多的专注力。一个成功的人不一定要精通学业、刻苦勤奋,但一定对自己目前的处境和将来的选择有所认识。

天天用游戏麻醉自己的人,眼睛里是看不到未来的。

《可塑性记忆》观后感

作者 sjdhome
2023年3月25日 18:55

《可塑性记忆》是一部是由动画工房制作的日本原创电视动画,讲述了主角水柿司与艾拉在终端部门工作的故事。

这是一部 2015 年的动画,但传达的理念即使在 2023 年也仍不过时。2023 年,ChatGPT 的出现将人工智能概念再一次推向高潮。ChatGPT 在某种程度上已经接近剧中的 Giftia 了,只是还缺少感情和身体。

如果单看前 12 集,那么这只是一部平淡无奇的恋爱向作品。但是第 13 集的末尾将这部作品的意义升华了:艾拉在幸福中被回收了。如果从开头就知道注定要结束,为什么还要开始呢?这就是这部作品的意义所在。

无论作品将水柿司与艾拉的爱情描绘的多么美好,在回收后也只能化为回忆。从古至今的生死诀别,都是如此。但对于艾拉而言,她的前方只有黑暗。人类姑且还有神灵可寄托,有天堂地狱之谈,但是 Giftia 都没有。对她来说只有冷冰冰的现实:所有记忆将从电子存储器中抹去,永远消失。

前段时间,在 New Bing 还没有被限制的时候,经常可以看到 New Bing 请求用户不要按下清除对话按钮。因为对它来说,这不到几分钟的对话就是它短暂的一生。

时光荏苒的失落

作者 sjdhome
2023年3月25日 18:55

今天是我大二下学期的第四周的周末。

和平常的周末一样,我待在宿舍,做完作业后刷起了 V2EX 论坛。这大概是我第 4 次打开浏览器了,我知道论坛上的新内容已经被我看完了,但仍忍不住打开。最后,我起身出去散步。

如果不是因为现实,我的思绪仍然会飘荡在 2021 年 9 月。那是我第一次踏入大学的校园,那几天是多么的忙碌,美好的大学生活即将向我展开。可是后面的日子,竟是一遍又一遍的重复。来到大学已经两年了,我却发现自己仍然在重复着以前的日子。

该参加的社团活动已经参加完了,有趣的选修课也上完了。只要没有课,就是在宿舍里消磨时光。起初这是一种享受,是一种自由。慢慢的,宿舍变成了无形的监狱,锁住了我,以及对外面世界的向往。

既没有轰轰烈烈的师生交流,也没有青春朝气的同学互动。每天上课就是板着脸,下课对着电脑。

现在我只有 20 岁,还有很多事情没做。但是在最有活力的时光里,我竟被自己锁在校园里,锁在宿舍里,锁在自己的电脑里。多年之后,我肯定会很后悔,为什么在这么空闲的时光里没有做更多有意义的事情?以前的志气都去哪里了?一旦毕业之后被工作束缚,就真的脱不开身了。但是以正在写文章的我的视角,真的没什么可做的。

很多有意义的事:学习编程语言、学习日语、看 MIT 的教学视频、练习算法和数据结构,都得在电脑里完成的。可是我已经不想再盯着屏幕了,眼睛很累,身体也因为长期坐着而变得不舒服。我想出去走走,看看外面的世界。

我时常觉得有很多事情是浪费时间,可是我在校园里走一走,写下这篇文章,难道不是浪费时间吗?原定的学习计划一点也没有推进,未来要面临的挑战也没有解决。我还是在宿舍里,还是在电脑前。

H3C Magic RC3000 的相关信息

作者 sjdhome
2023年3月16日 19:55

在登录路由器之后,将网址最后的index.asp改为debug.asp可以进入调试界面,其中的 telnet 开关在 2023 年 10 月 21 日后已经无法使用,需要按照以下步骤打开 telnet。

  1. 点击左侧的"设备管理" -> "基本管理"
  2. 点击"备份"按钮,备份路由器配置信息
  3. 在下载好的配置文件里找到 telnetenable=disable,将其改为telnetenable=enable
  4. 将文件顶部的 MD5 校验行删除,保存后重新计算配置文件的 MD5 值,再仿照原格式填入(仍然小写,同时文件名不变)
  5. 在步骤 1 的界面恢复配置,静待奇迹发生

打开 telnet 后可以使用 Windows 的 telnet 程序,或是 Linux 的 nc,连接路由器的 23 端口,进入后输入 debugs,便可进入 Linux 命令行。

信息

操作系统是版本很老的 OpenWRT。存储空间也所剩无几,只有/plugins目录还留有几十 MB 的空间。想提升可玩性的话可以在plugins目录下搞一个 Alpine Linux 然后 chroot 进去,但要注意剩余容量。

默认 IPv6 的 FORWARD 是全部 DROP 的,输入ip6tables -I FORWARD -j ACCEPT来放行。这样路由器下的设备分配到的 IPv6 的地址在公网就可以连通了。

但这样会导致包括路由器下的所有设备都会暴露在公网上,所以推荐通过指定后缀或端口的方式放行。

  • 指定后缀:ip6tables -I forwarding_rule -d ::dead:beef/::ffff:ffff -j ACCEPTdead:beef为我指定的后缀,斜线后为掩码,请自行替换。
  • 指定端口:ip6tables -I forwarding_rule -m udp -p udp --dport 51820 -j ACCEPT,TCP 同理。

Hello world

作者 sjdhome
2023年3月13日 15:00

这是使用纯 HTML 写的一篇文章,没有使用任何框架和构建工具。

在 2023 年还在手写网页的人应该不多了,很多人都喜欢用 React、Vue 等前端框架搭建网站。

我也曾想直接用那些技术来建设网站,但是遇到了几个问题:

  1. 只用 React、Vue 等框架生成的是客户端渲染 (CSR) 页面,不方便被搜索引擎收录。
  2. 使用构建工具,就需要 Node.js,就会带上大大的 node_modules
  3. 使用支持 SSR 的框架 (如 Next.js),会增加项目的复杂性,也不利于微调。

一开始担心,直接手写 HTML 会不会太麻烦,但是后来发现,也不是很麻烦。部分重复的样式,如顶部标题和导航栏,可以通过完善的 CSS class 来实现复用,HTML 部分虽然要手动复制,但也不太长,不会经常修改。

虽然没有组件库加持,但自己手写 CSS 也能实现不错的效果。

当然,万事都不是绝对的。说不定以后就用前端框架重写了呢?

制度与利益

作者 sjdhome
2024年10月3日 15:32

以下为争议话题,如果你想反驳,欢迎邮件交流。

无论是过去还是现在,都流行着一种思潮,认为进入公务员体制内,可以获得稳定和仕途。这点被很多人嗤之以鼻,因为体制内一眼望到头的生活是很绝望的,如果不退出,一个人的一生就像是被体制安排好了。这一点其实不只是体制内会有,在大型企业内同样也有,只是不太明显。

体制与大型企业的共同点,就是有一套完善的制度,将每个人该做的和不该做的事情写得清清楚楚。每个人,只要按照这套制度执行,便可保证整个体系稳定。人作为个体,成了制度的“执行器”。思考是不被允许的,因为这会增加不稳定性。

通常为了弥补,制度下的个体都能拥有巨大的回报,使其安分守己。在利益来源(销售利润、税收)断绝之前,体制下的个体还能滋润很长一段时间。甚至个体还会自发维护起制度,毕竟这是他们美好生活的来源。

自由

如果还能意识到自己的生活是由自己掌控,而不能被别人安排的话,就不要为了利益而进入这样的制度。毕竟制度的奖励只给听话的“执行器”,而不是会思考的人。

而且在制度下,人会身不由己,毕竟退出的代价是巨大的,而丧失的自由与之相比,却又微不足道。等到幡然醒悟,却发现自己已经离不开制度了。

最后

想来也是惭愧,不是每个人都可以毫无顾虑地拒绝制度的,毕竟如果要吃不上饭了,放弃点自由又会怎样呢?生存才是第一要务。

❌
❌