八哥之神后传【7】

大井

物理老师:上一讲,我们介绍了阿基米德在浴缸里发现浮力定理,现在我同时兼任游泳老师,教大家浮力定理的实践!

圣小开:稣怎么坠海了?完了,完了,海岛出生的稣,居然没学过游泳!又得重来一次了……

圣小开:怎么浮出水面了?原来这是一口大井!果然,主角是不会死的。

圣小开:卧槽,又沉了?这……小学时代传说有位学长就是掉进大井死掉的,不会稣也要这样挂吧?从小就被吓唬,一直躲得远远的,没想到还是莫名其妙掉井里了。真是怕啥来啥。下一次,稣要消灭大井,抽水泵的小井多安全!

圣小开:缺氧了,四肢已经没有知觉,但是这井水,还挺清的?小时候在养老院看到一个独腿中年人在井边打水洗漱。当时感到害怕,原来没有手脚是这种感觉。

圣小开:脑细胞死得差不多了?原来当个白痴是这么快乐?稣是谁?算了,不想了,泡成这样子,就算救回来也是残废,早点转世投胎。

圣小开:那边哗啦啦的,是周老师吗?没想到他也有被自己整死的一天!哈哈,该死。

床上

周易:醒了?

圣小开:周老师!怎么你没死?

周易:怎么会?主角是不会死的。

圣小开:哦,稣还以为自己才是主角,原来是老师救了小生。

周易:这倒没有,是这位夫人救了咱们。

圣小开:黄雪?怎么是你。

胡连玉:公子认错人了,民女胡连玉。

圣小开:又是演员不够吗?你明明就是黄雪饰演的,咱们这么熟,你化成灰稣都认得!

周易:这孩子脑子进水,神志还不清醒。夫人别见怪。

胡连玉:吾再去给公子弄点姜汤。

周易:开,她真不是黄雪。咱们现在是在唐朝!

黄雪只拍过一集《八哥之神【2】》就下线了。

圣小开:识界果然历史悠久,但是这么穿越不是会影响未来?

周易:就一个分支,坏了就删除,只有模拟正确的会被合并到主线。

圣小开:这么做就没人能发现?

周易:怎么发现?你调取记忆时,怎么知道这个记忆有没有被修改过?

圣小开:哦哦!所以现在稣可以随心所欲,甚至为非作歹?

周易:可以啊,一切只是你的一个梦,时间不重要。看!本大人现在是朝廷命官——李伯阳,你也可以选个人物。

圣小开:先把这个长得像黄雪的纳为小妾吧?哼哼。

周易:em?她已经嫁人了。而且,你也还没有娶妻,正室都没有,不会娶个寡妇吧?

圣小开:原来如此,是个寡妇,真是可惜了!稣是受过良好时空观教育的,绝不随便干扰时空,还是就这样过完一世又一世清贫的生活。

周易:好啊,发挥你最擅长的观测力,也未尝不可!不过,你为甚对黄雪耿耿于怀?

圣小开:没有没有,只是萍水相逢……

周易:你果然是一个被时间教育过的人。但在老师面前,可以说实话!

圣小开:高中时,大家都在早恋,只有稣埋头苦干,研究机器,按照设定,稣应该是泡不到妞,对着机器孤独终老的。吧?她是稣青梅竹马的玩伴,偶尔可以客串假女友,提高稣的面子……

周易:原来如此啊!哈哈,人之常情,人之常情,哈哈哈。

圣小开:有这么开心?

周易:人性都是一样的。你还挺像人的!

圣小开:哦,呵呵,干您老师,你也是啊。

圣小开:不对……机器正在学会这一切!

周易:开!机器学习远比你想象的强大。你看这历史,它其实是离散的。同时代的人们也正生活在不同时间线,只有合适的时间线被保留,所以历史其实并不悠久,机器完全可以驾驭历史。

圣小开:历史甚至小到稣的一个梦就能装下?

周易:是的!

圣小开:但是稣为啥无法控制它,只能吓醒?

周易:你只是个观测者,最多是个调试器,别想太多哦。

圣小开:周老师!稣有一个绝妙的想法,利用惠乐提出的宇宙尺度双缝干涉,通过一段时间观测,一段时间不观测,得到 1 和 0 两种编码,来向未来发射信息!

周易:好主意,还可以用摩斯密码来编码,未来的咱们或者传人肯定能观测到。

圣小开:那你快拿出钱找人,把这个实现了!

周易:你先养脑,今晚一起观测天象。

圣小开:我要问问未来你是怎么死的……

周易:我是怕死的人吗?被咬死的!

圣小开:这是剧透吗?

周易:所有剧透的本质——主角是不会死的。

胡连玉:公子来喝点姜汤。

圣小开:谢谢,感谢救命之恩。将来一定与你共享荣华富贵。

胡连玉:民女只求平平安安,对荣华富贵不敢有所幻想。

圣小开:没关系,反正是老师出钱。他才是当官的,稣也是一介穷人,你也不用自称民女。

胡连玉:嘻嘻。真的不用,一切听天由命。

圣小开:好高的佛性!稣小时候也有很多想法,很多想要的东西,但等自己快有的时候,就改变想法。

胡连玉:公子的觉悟也是高。

圣小开:是吧,主要是穷惯了。那不如,稣以后帮姐姐介绍个富家老公。

胡连玉:公子果真还神智不清。吾已婚嫁有段时日,相公傍晚便可归来。

圣小开心想:卧槽,周老师果然是个王八蛋。

圣小开:哈哈,夫人保养得真好,小弟初到此地,不善本地风俗,见笑了。

胡连玉:是喱!看汝口音、服饰,就不是本地人。不过吾有一小妹,叫胡小玉,是个读书人,尚未婚配,汝可帮得忙?

圣小开:你们取名真偷懒啊……大的叫辈份加某字,小的就叫小某,或者叫某某,稣已经见怪不怪了!

胡连玉:传统罢了。公子是答应了?

圣小开:救命之恩,自当以身相许……吓醒?等等,等等,小妹该嫁之日便有神人经过此地,稣事先安排一下,相个亲便可。

胡连玉:好哩。

在 MacBook Air M1 上体验 Asahi Linux

故事

macOS 在访问 samba 共享里的图片时,会留下 . 前缀文件,还找不到办法关闭。

1
defaults write com.apple.desktopservices DSDontWriteNetworkStores true

这只能解决 .DS_Store,无法解决对可写 samba 的破坏!要知道,稣的 samba 目录是 SD 卡,哪受得了这折磨?

所以,还是杀掉贵族 macOS,安装游侠 Linux 吧!

安装

按说明,一键安装,即可:

1
curl https://alx.sh | sh

第一次关机时,记得要等 15 秒,再长按电源键开机,直到看到文字提示,松开电源键。

国内源

它是 Arch Linux,所以:

1
2
$ vi /etc/pacman.d/mirrorlist
Server = https://mirrors.ustc.edu.cn/archlinuxarm/$arch/$repo

编译内核

内核代码下载:https://github.com/AsahiLinux/linux/tags

menuconfig 的配置文件:https://github.com/AsahiLinux/PKGBUILDs/tree/main/linux-asahi

运行 make 时,提示缺啥就装啥,没难度。

1
2
3
4
5
6
7
8
make menuconfig
make -j 8
sudo make modules_install
sudo make install
sudo mkinitcpio -g /boot/initramfs-6.2.6-asahi.img -k 6.2.6-asahi
sudo update-grub
sudo vim grub/grub.cfg
sudo reboot

卸载

Asahi Linux 的问题还很多,不能当桌面系统日常使用的原因是:

  • 没有声音!

  • 触控板在 Linux 下表现明显不如 macOS,可能是 Apple 的驱动优化太强了,而且是有专利的。

  • arm64 的桌面软件生态不行,大家只给 Apple 面子……

  • 指纹解锁也废了。

所以,还是卸了吧!

不过稣的 macOS 被玩坏过,重装了,所以分区可能不太一样,暂且看看,原理无非是删除分区。

在 macOS 里:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ diskutil list
/dev/disk0 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *251.0 GB disk0
1: Apple_APFS_ISC Container disk1 524.3 MB disk0s1
2: Apple_APFS Container disk2 125.1 GB disk0s2
3: EFI EFI - ASAHI 500.2 MB disk0s3
4: Linux Filesystem 119.6 GB disk0s4
5: Apple_APFS_Recovery Container disk3 5.4 GB disk0s5

/dev/disk2 (synthesized):
#: TYPE NAME SIZE IDENTIFIER
0: APFS Container Scheme - +125.1 GB disk2
Physical Store disk0s2
1: APFS Volume Macintosh HD - Data 40.6 GB disk2s1
2: APFS Volume Macintosh HD 8.9 GB disk2s3
3: APFS Snapshot com.apple.os.update-... 8.9 GB disk2s3s1
4: APFS Volume Preboot 4.8 GB disk2s4
5: APFS Volume Recovery 783.7 MB disk2s5
6: APFS Volume VM 1.1 GB disk2s6

# /dev/disk0 的 3: 和 4: 是要删除的
$ diskutil eraseVolume free free /dev/disk0s3
$ diskutil eraseVolume free free /dev/disk0s4
# 如果 EFI - ASAHI 上面有一个 2.5 GB 的 disk0sX,可以用以下命令删除:
$ diskutil apfs deleteContainer disk0sX
# 之后再用图像界面的“磁盘工具”操作,确保空间还给 Macintosh HD 宗卷

Debian Testing

故事

稣玩 Debian 10 几年了!大约 2011-2012 年开始,先在树莓派、电视盒子上玩,后来在 PC、服务器上。目前,所有家庭服务器、《智能时钟》都用 Debian Bullseye,而桌面则用 Debian Testing。

其它发行版也尝试过,详情可见《Linux 桌面玩稣》。曾经有一段时间,《用华为擎云 L420 体验国产操作系统(UOS 和银河麒麟)》,打算从此只用 UOS,结果统信发了一个文章,说以后要脱离 Debian……

十几年间,有不少道友试图说服稣改投其它派系的发行版,比如:

  • Arch Linux:它很极客,而且它是滚动更新模型,可以很快使用新内核。

  • Manjaro:它是最容易安装的 Arch 系,国内用户多。

  • openSUSE:它对新手友好,而且很稳,也有滚动更新的“风滚草”,咳,风滚草耶!

对此,稣只有一个坚决的答复:不!稣只要 Debian!因为……它不只名字像大便,连 Logo 都像大便!这么一本正经地搞笑,显然要大便大力支持!

Debian Logo

还有啊,你们要的“滚动更新”,不就是 Debian 的 Testing 版本吗?

ChatGPT 乱入

稣是 Debian Testing 用户,擅长修复声卡外接 HDMI 设备无声问题,请问稣适合做什么职业?

ChatGPT:电子城低级技术支持和运维。

这个职业容易被 ChatGPT 取代吗?

ChatGPT:容易

那有啥职业不容易被 ChatGPT 取代?

ChatGPT:搬砖

折腾记

1. 某 J4125 迷你电脑

用途:下载机、文件共享服务器,兼职电视盒子

由于主要是台微型服务器,系统选择 Debian Bullseye,桌面环境还是反人类的 sddm + i3。

服务器软件的安装可以参考《智能时钟》。至于电视盒子嘛……其实它是一个浏览器:

1
sudo apt install chromium

但是有个问题——用 HDMI 线连电视后,发现没有声音!

1
2
3
4
sudo apt install firmware-linux-nonfree firmware-iwlfifi firmware-sof-signed
sudo apt install pulseaudio
cat /etc/modprobe.d/alsa.conf
echo 'options snd-intel-dspcfg dsp_driver=1' | sudo tee /etc/modprobe.d/alsa.conf

2. 某 N5095A 迷你电脑

用途:娱乐桌面

这次选择 GNOME,依然是轻松搞定,但是有个问题——用 HDMI 线连电视后,发现没有声音!

装完 non-free 的声卡驱动后还是一样。

但是有第二个问题——没有无线网卡的驱动!

是 Realtek RTL8821CE,那就自己编译一个:https://github.com/UMU618/rtw88

又但是,编译后也无法加载呀,它是个没签名的内核模块,稣又不想关闭 Secure Boot!只好装 MOK (Machine Owner Key) 搞定签名。

转念一想,会不会 Testing 版本已经支持这款硬件了?果断切过去。

目前 Testing 的 GNOME 已经使用 PipeWire 取代 PulseAudio,所以不能再安装 PulseAudio,因为这会卸载 GNOME!坑稣呢……只要加个声卡的调教参数,即可!

1
echo 'options snd-intel-dspcfg dsp_driver=1' | sudo tee -a /etc/modprobe.d/alsa-legacy.conf > /dev/null

6.X 的内核和 GNOME 桌面下,娱乐的那点事,一切完美。

稣终于还是战胜甲醛测试仪2

前年写的《稣终于还是战胜甲醛测试仪》介绍了一个曲折离奇的战斗故事,最近终于把根源搞清楚了。很庆幸,当初很果断换掉了漏气的空气能热水器,不然后面可能已经中毒,变成真·神经病了。

1. 甲醛测试仪的局限性

经过一顿学习,大部分甲醛测试仪都是用来测试有机气体的,甲醛(HCHO)只是其中一种,出场时按照甲醛做了标定。举两个例子,乙醇(C2H6O)可以使它读数变高,氨气(NH3)不行。

基本上,如果确认屋子里有甲醛,买个测测是可以的,但不能还有其它干扰物。

2. 慢性神经毒素

最早怀疑空气能热水器工作时,可能有高压,所以可能产生臭氧。这是错的,臭氧(O3)不是有机气体,就算有臭氧,也不能干扰甲醛测试仪。

真正的干扰源是 R22 制冷剂!那台 2013 年产的空气能热水器,它冷媒泄漏了!它漏了!漏了!

R22,二氟一氯甲烷(CHClF2),有 C 又有 H,还不含 O,妥妥的有机气体。很多文章说它无毒、难燃、破坏臭氧层,不买!真是言简意赅。但显然这是错的,稣以身试毒,都差点挂了,您还说它无毒?

这货在 2017年10月27日,世界卫生组织国际癌症研究机构公布的致癌物清单里属于 3 类致癌物。

3. 可怕的巧合

书房历史上的两台空调都是有新风功能的,又因为进气口和空气能热水器过近,所以才能把泄漏的 R22 给吸进室内。

但也是因为 R22 正好能被甲醛测试仪当成甲醛,所以每次吸入 R22 时,稣一发现“甲醛”飙升,就逃了,才没被毒死。

那台漏气的空气能热水器被换掉,也是因为它结冰了,这是冷媒泄漏的表现。只是那时候,看的一些文章都说 R22 无毒,所以忽略了。

终于复盘清楚了,真庆幸当时的谨慎!

诗盗·再战挨踢境逆

《#诗盗#·再战挨踢境逆》:粗茶淡饭,气抗新冠,天选独卫一锅端。漱冰濯雪,力修福报,科技再兴百年好。

注解

看!挨踢裁员潮下艰难生存的程序员。

境逆:就是逆境,闽南语惯用的反序词。

气抗新冠:买不到药,主要靠一身真气抵抗病毒。

天选独卫一锅端:天选打工人,未阳人坚守岗位,捍卫人类,病毒从来无法把人类一锅端。

力修福报:996 是福报……呸!

科技再兴百年好:科技是科技,挨踢是挨踢,两者不是一回事。

参考

霹雳角色“红尘雪”出场诗:

漱冰濯雪,霞佩云冠,眇视万里一毫端;

寄声玉鉴,摇动星辰,翳凤骖鸾策江山。

宋代张孝祥的《水调歌头·金山观月》:

江山自雄丽,风露与高寒。

寄声月姊,借我玉鉴此中看。

幽壑鱼龙悲啸,倒影星辰摇动,海气夜漫漫。

涌起白银阙,危驻紫金山。

表独立,飞霞佩,切云冠。

漱冰濯雪,眇视万里一毫端。

回首三山何处,闻道群仙笑我,要我欲俱还。

挥手从此去,翳凤更骖鸾。

缅怀黄文择

黄文择(n̂g-bûn-tèk)于 2022-06-12 离世。之前其实已经换了配音,当时只觉得这是自然的事情,一代新人换旧人嘛,没想到接着便是死讯。新的配音应该不止一人,但显然还不如黄文择一人,尤其是逼格大降。好多角色都是浓厚的鼻音,略显幼稚啊!稣慢慢对霹雳不那么热情。只是偶尔看到剧末,预告完来一句“欢迎继续收看黄文择布袋戏”,突然内牛满面……

所有的影视明星里,稣最爱的就是黄文择,从初中就一直听他的声音。黄家驹的歌,是在他已经逝世后才发现的。听到挂的,还有 Michael Jackson。不过只有黄大讲的是稣的家乡话,从情感上说,是完全不同的级别的亲切。

黄大也是稣心目中的大侠。在自己的事业上恪尽职守,发挥特长把布袋戏艺术传承下去。

很多时光、很多东西,人类喜欢它们,都是因为背后关联的一些人。如果那些人不在了,对物的乐趣也将消失。

这很霹雳,但这样就很不霹雳了。​

CppWinRT 经验【1】链接 winmm.dll 而不是 api-ms-win-mm-time-l1-1-0.dll

前提

稣使用 ATL/WTL 开发 Windows 程序多年,慢慢地,它们就不太时髦,尤其是命名风格和 STL 不同,显得十分不现代。比如 ATL::CComPtr,和 std::unique_ptr 确实风格迥异。

微软还搞了一套 WRL,例如:Microsoft::WRL::ComPtr,去掉了一个 C 是比 ATL 风格略好一点,但依然是不现代的(不像 STL 的)。

微软说:CppWinRT 才是王道,已经搞成现代 C++ 风格,例如:winrt::com_ptr。你们呀,用就行了。

好的!稣试试。不管用不用,先把它弄进来。这时候 packages.config 长得像下面:

1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Windows.CppWinRT" version="2.0.221121.5" targetFramework="native" />
</packages>

问题

原本设计支持 Windows 7 的程序突然无法在 Windows 7 正常运行了!提示找不到 api-ms-win-mm-time-l1-1-0.dll

分析

找出原本可以在 Windows 7 正常运行的旧版本程序,发现其导入表里链接的是 winmm.dll,而不能正常运行的新版本则是链接并不存在的 api-ms-win-mm-time-l1-1-0.dll

在 Windows 10 上,api-ms-win-mm-time-l1-1-0.dll 会被映射到 kernel32.dll,但 Windows 7 没有这个映射,所以报错。

那么只有让程序链接 winmm.lib 就行了……可是,一直就是链接它的呀!

尝试把 #pragma comment(lib, "winmm.lib") 去掉,居然不报错!

稣开始回忆最开始调用 time API 时,不加 winmm.lib 是链接不过的。很明显加了 CppWinRT 后,它的 lib 重载了 time API 的链接。

解决

CppWinRT 很好!稣用 WIL……例如:wil::com_ptr

割爱吧!稣在 Manage NuGet Packages... 里卸载了 CppWinRT。

__BASE_FILE__ 和 __STEM__

问题

为了更好追踪产品 bug,程序员很可能在日志里打印代码文件名和行号。例如:

1
std::clog << "(" __FILE__ ":" << __LINE__ << "): Failed to initialize!\n";

以上代码有两个问题:

  1. 打印出代码文件的全路径,可能太长影响阅读,而且也没有必要。

  2. 代码文件的全路径暴露在二进制文件(可执行程序)里,有一定安全风险,也更容易被逆向。

分析

第一个问题很容易,打印文件 base name 即可。代码可能如下:

1
2
3
4
5
6
7
consteval std::string_view GetFileBaseName(std::string_view path) noexcept {
return path.substr(path.rfind('\\') + 1); // for Windows path only
}

// Test
std::cout << GetFileBaseName({__FILE__, sizeof(__FILE__) - 1}) << '\n';
std::cout << GetFileBaseName(__FILE__) << '\n';

但是,第二个问题并没有解决,__FILE__ 依然存在于二进制文件里,用任意十六进制编辑器都能很轻易地找到“代码文件的全路径”。

解决

方法一:去掉 Use Full Paths (/FC) 即可把 __FILE__ 设置为只有文件名,没有全路径。

Use Full Paths

方法二:改用 __BASE_FILE__ 吧!新问题是:msvc 不支持。那就自己定义一个:

1
/D__BASE_FILE__="\"%(Filename)%(Extension)\""

接着又想:后缀名有必要吗?如果保持优良习惯,从不在头文件里打日志,那确实没必要。于是再定义一个“文件主干名”:

1
/D__STEM__="\"%(Filename)\""

更多

std::source_location 依赖 __FILE____builtin_FILE(),所以如果开了 /FC,会有一样的安全问题。