Weekly #0:每个平凡的日子,都在闪闪发光

📰 发刊词:每个平凡的日子,都在闪闪发光

这是我博客的一个新的系列。之前类似的内容发在 whisper.skywt.cn,不过后来由于某些原因没有再更新了。然而,我还是觉得生活中经常有些有意思的事情,值得记录和分享。所以,现在打算以周记的形式发布。

我们的青春岁月如同列车呼啸而过。我们每一天的所听、所见、所思、所想,都在让我们一点点增进对这个世界的了解。我认为这一切都非常值得被记录下来。

每个平凡的日子,都在闪闪发光。

目前这个周记的定位并非提供知识的周刊 / 周报 / Newsletter,所以对内容价值没有任何保证。可能是技术相关的,可能是最近发生的有趣的事情,也可能是各种天马行空的想法。本来,是想给每期划定各个模块的,比如「学习」、「阅读」、「见闻」之类。不过觉得这种内容框架过于死板了,因为每周都有不一样的安排。只有唯一相同的是,每周都有值得记录的事情。所以,现在的内容规范是:想说什么就说什么。

这个系列还没想好一个好听的名字,暂时就叫做「Weekly」。不过我也不能保证每周都能更新。总之作为一个长期的全新系列,希望能坚持记录。

(注:本节标题「发刊词」带有比喻意义,该文章系列仅为个人博客文章,并非正式出版物)

🌆 封面图:一缕晨光

封面图:一缕晨光

阳光灿烂的早晨,在中楼拍的。

🔬 人文社科中的科学精神

本学期选了一门法学院的专业选修课,高中老师的《西方法律思想史》。大学里上的所有课里,真正让我感觉有很大收获的课其实非常少,但是这门课是其中之一。能上到这样的课,感觉还是挺幸运的。

高老师说了这样一个观点:我们(他们)法律人实际上是 social engineer,即「社会工程师」。法律人是通过法律建构出这个社会的形态。

仔细想想,其实这和我们「软件工程师」很像!只是我们构建软件的工具是代码,他们构建社会的工具是法律。纵观整个西方法律思想史,从一种观点发展到另一种观点,理性总是法律思想发展的工具。从这个角度看,怎么能说法学这类是「文科」呢?明明和我们软件开发一样,需要严谨的逻辑思维和表达。

进一步想想,法律条文不也是一种接近于形式化的语言吗?相比自然语言,法律条文似乎更像代码:晦涩但严谨清晰。这么看来,制定法律条文这一过程,甚至和我们写代码也有些相似。

所以,是谁一直散播「人文社科不需要逻辑思维,更需要感性思维」这类的观点的?对于文学一类的专业或许成立,但是对社科这类的专业而言,这类观点甚至对这个专业的人才输送产生了非常不好的影响。联想到最近看到马督工的《【睡前消息682】支持张雪峰批文科,没有独立性哪有尊严》,他认为,近来在文科领域盛行脱离科学的风气,对科学精神的重视严重不足。回想我们高中时期,确实是家长和老师都认为「理科学不好的才去学文科」。而马督工认为,这才是反过来导致文科整体走向低端,被歧视的原因。

🃏 一起优诺!UNO 纸牌的魅力

五一期间逛 App Store 看到「一起优诺」这个游戏,就是我们小学玩的 UNO 纸牌的官方手游。于是心血来潮下载体验了一下。

相比我们小时候玩的纸牌版本,游戏的「经典模式」加入了两条规则:1)每局限时 3 分钟,每次出牌限时 10 秒;2)玩家打出 +4 牌,下家可以选择「质疑」。如果玩家出 +4 之前其实有同色的牌可出而不出,则质疑成功,玩家拿六张牌,下家不加牌;如果质疑失败,下家拿六张牌。如果不质疑,下家拿四张牌。

而游戏推出的「欢乐场模式」则更加刺激,添加的规则是:1)增加「同色全出」牌,出此牌即可一次全出同色所有牌;2)上家出 +2 或 +4 牌,玩家可以出 +2/+4 牌叠加给下家。

这个游戏还有金币系统,一局结束后,输家将给赢家金币。在不同倍率的场次,输赢金币数量不同。

在多轮体验之后,感觉这个游戏规则有一个显著特点:非常看牌运,决策空间其实很小。玩家初始只有 7 张牌,由于有上家的 +2/+4 牌、禁止牌等等的存在,很容易出现连续几轮没有出牌机会或者被一直加牌的情况,能够导致有强力牌的玩家连续掌控牌权;单人模式中能攻击的只有下家,所以决策的唯一选择是:永远对下家造成最大的伤害。决策空间小,就导致随机变数大,即使再技术高超的玩家也无法保证高胜率。(所以,我多次累积到 1w+ 金币,又多次破产 😭)

那为何这种缺乏决策空间的游戏能够风靡全球呢?我认为主要是由于其游戏规则带来的牌局的戏剧性和刺激感。和传统纸牌游戏不同的是玩家能够被动增加手牌,只剩一两张牌的玩家可以突然被加上六张牌。特别是在「欢乐场模式」中,同色全出牌和 +2/+4 可叠加两条规则,让出牌和加牌的规模都增加了,相当于增加了持牌数量的方差,使牌局更加戏剧化。所以,在玩的过程中会非常欢乐。比如下图,我出了一张 +4,结果在场每个玩家都跟了 +4,轮到我成了 +16,我一下拿了 16 张牌,手牌已经叠得看不清了 😭

被加了十六张牌的我

事实上,手游加入的两条规则,是在为游戏增添策略元素。1)通过「质疑」,玩家可以怀疑此次 +4 是否是为提供对手出牌条件而「战略性」出牌;2)限时规则中,当 3 分钟时间到时,如果没有牌出完的获胜方,则根据所有玩家持牌扣分,普通牌扣排面数字对应的分值,而功能牌则扣分幅度大得多(印象中 +4 牌一张扣 50 分),这导致在牌没出完的情况下优势逆转(如果此时继续出牌,显然功能牌多的玩家更更可能赢),所以在牌局中玩家需要决策当前是否可能出完手牌,如果时间内已经不可能则要优先出功能牌(这可能又会被「质疑」);甚至到快结束的时候玩家可以战略性地减慢出牌速度(拖时间),减少对方的机会……不过相比其他纸牌游戏,即使加入了规则,决策空间依然很小。

以前一直认为,一种游戏长盛不衰的原因一般是由于其为高端玩家提供了足够的决策空间,即在竞技性方面有很高的上限,比如围棋。然而,很多游戏更多提供的是社交属性,例如 UNO 纸牌这种戏剧性和刺激感的特点,非常适合好友聚会的欢乐氛围。这或许才是它能够风靡全球的原因,

🎛️ 无状态 Stateless 的优雅性

周六被桂总狠狠地传教了 NixOS。在面对其陡峭的学习曲线望而却步的同时,确实被它的优雅性所深深折服。

本质上 NixOS 的理念有点像 Docker,即将每个软件本身视为无状态的,通过外部的配置文件显式地管理其状态。每次启动计算机,所有软件都处于被用户控制的初始状态。

这种感觉实在是太酷了!在以前,我们使用计算机的时候往往觉得这是一个巨大的黑盒,比如在 Firefox 中登录了账户,相比没有登录账户,存储部分产生了什么变化呢?我们根本不知道。这导致我们无法随心所欲地控制软件的状态,比如我们希望这次启动 Firefox 是在未登录状态下启动的,我们只能使用 Firefox 软件提供的接口(在设置中退出登录),而没有一种统一的接口控制这一状态。

而有了外部的状态管理,就可以在一个配置文件中管理 Firefox 的状态。根据类似的原理,能够通过配置文件管理整个系统的状态。使用的软件包、启动的选项,等等。没错,NixOS 中整个系统的状态都是由一个配置文件表示的。这样,每次系统启动时,各个组件是什么样子,我们都能够控制了。计算机对于我们来说再也不是一个黑盒了。

React 之前推出的「函数式组件」也使用了「组件无状态」的思想。

正由于这种优雅性,我很早就将服务器上所有部署的服务容器化,使用 Docker Compose,通过将数据挂载到外部,实现全面的「容器无状态」。然而,NixOS 能将这种状态管理做到如此的极致,以及其提供的强大简洁的工具链,着实震撼了我。

⚙️ 从零开始的 PVE 折腾之旅

上学期入手的零刻 Ser6 Pro Vest 迷你主机,一直装着 Windows 11 和 Kali 双系统,因为我既有使用 Windows 软件和玩游戏的需求,又有用 Linux 的需求。然而,这样只能同时运行一个系统,这意味着任何一个系统不能 24 小时在线,不能用来跑 NAS 或者其他服务。

最近决定入这个大坑:Proxmox Virtual Environment。这是一个开源的 Linux 发行版,提供了面向企业运维的虚拟化环境。在上面能够方便地配置 Windows 虚拟机和 Linux 容器,达到同时运行两个系统的目的。

然而,我作为硬件方面的小白(在此之前连 PCI 是什么都不知道),折腾 PVE 真的能用名副其实的「折腾」作为动词。因为文档充斥着大量我不了解的概念,大多教程也只告诉你怎么做,没有过多的解释;不同硬件的情况也千差万别(比如 AMD Radeon 存在的 reset bug),遇到了无数的坑。之后一定要写一篇博客记录一下。😭

昨天终于配置好了核显直通。现在可以直接外接显示器玩 Minecraft 和 Cities: Skylines 之类的游戏了。之后打算尝试一下黑群晖,还要选购一块硬盘来存 NAS 的数据。这样或许可以逐渐抛弃 iCloud 云上贵州。或许还可以将服务器上一些非常耗费资源的 self-hosted 服务迁移到这台主机上。

这种 all-in-one 的感觉真好。

🔐 使用 Keycloak 搭建统一登录平台

很多软件都需要用户登录鉴权。然而对于开发者来说,开发这样一个登录功能,不仅需要额外的数据模型,也有一堆安全方面的坑;对用户来说,同一个组织可能存在很多应用,如果他们都有独立的登录系统,用户的使用负担不小。

所以就有了 SSO,即单点登录。对开发者,相当于将登录流程「外包出去」;对用户则是多个网站只要同一个账号密码即可登录。这是非常优雅的解决方案。

本周我在服务器上部署了 Keycloak,这是 Red Hat 开发的开源的 SSO 软件,兼容 OIDC 等多种协议。非常好用,除了 UI 有点丑。

部署地址在这里:auth.skywt.cn。现在,我自部署的 Memos、Nextcloud、Cloudreve、Headscale 等等服务都已经配置接入了 SSO,可以用统一的账号登录。之后开发需要用户登录功能的软件,也可以「外包出去」了。

很喜欢这种「大一统」的感觉。😁

⌚️ 触发了 Apple Watch 摔倒检测 😅

本周三,在骑共享单车经过信息院门口的时候,路边有一道高约 5cm 的路沿。我打算骑车冲上路沿,但是车的前进方向和路沿的夹角过小。于是自行车发生了侧翻……(不过只是膝盖擦破了一点皮,没啥事)

这居然触发了 Apple Watch 的摔倒检测。这是我第一次真正体验这个功能。自行车侧翻之后我在地上坐了一会,经过了大概十多秒,手表提示「你似乎摔得很厉害」,显示了一个 SOS 滑块和一个「我没事」按钮。如果一定时间没有响应,手表就会帮我紧急呼救。

点击「我没事」按钮,会给出进一步的选项:「我摔倒了,但是没事」或者「我没有摔倒」。选择前者之后,此次摔倒会记入健康 App,通过统计图表展示……

Apple 健康 App 中的摔倒次数

希望大家体验不到这个功能 😇。

✨ 博客系统更新日志

自从 4 月 19 日起,我上线了自己开发的博客后端。现在,这个 skywt.cn 使用的博客系统已经完全脱离了 Typecho。

(不过,还没有做内容管理相关的 API,所以现在发文章和管理评论都是直接去数据库里用 SQL……)

后续会将 blog.skywt.cn 这个旧的博客完全重定向到新的博客,包括 RSS 地址。

Typecho,感谢你陪我走过的路。再见啦。

文章来源:

Author:me@skywt.cn
link:https://skywt.cn/blog/weekly-0/