技术手记

外接键盘映射苹果 Globe/Fn 键

曾经在 macOS 实用小工具记录 2 里提到苹果修改了锁屏快捷键,可以用 Ctrl+Cmd+Q 锁屏,而不用模拟之前的 Power 键,对 Karabiner 不再有需求,结果最近还是装了回来

macOS 26 开始的全屏快捷键变化

在 macOS 26 Tahoe 之前,对应用全屏(新建占据整个桌面)的快捷键是 Ctrl+Cmd+F,这个在外接键盘上也能直接按出来,但后面改成了 Globe+F,这个 Globe 键就是苹果笔记本电脑或原装外置键盘上原来的 fn 键,上面有个小地球图标的,俗称地球键

这下好了,要全屏要么点窗口左上角的红绿灯按钮,要么用苹果笔记本机身键盘上的 Globe+F 的快捷键,在外接键盘上都无法使用

在外接键盘上切换全屏的尝试

macOS 系统设置里改快捷键

这个方式是说在 macOS 的系统设置里,增加一个「切换全屏」或「Enter Full Screen」的快捷键,然后映射成自己想要的键

我自己试过一下,不是那么灵光,也不太好用,放弃

使用第三方窗口管理工具如 Rectangle

Rectangle 是我近年来替换 Spectangle 后的窗口管理工具,本来随着新版本 macOS 把左半屏、右半屏、最大化等几个操作支持后,连这个工具都可以不用,但偏偏 macOS 原生的都是 Ctrl+Globe+LeftCtrl+Globe+RightCtrl+Globe+F,都还是无法在外接键盘上使用的

等为了在外接键盘上更方便使用窗口布局且不用去改系统快捷键,把 Rectangle 装回来后,发现 Rectangle 无法支持系统级的全屏操作,所以这条路也走不通

使用 QMK/VIA 改键位映射

我现在在办公室使用的 Keychron K8P 支持 QMK/VIA,那么去 usevia.app 可以快速改键映射

但是苹果这里又搞事情,原生的 Globe 键并没有相关键位码,网络上找到的方法要么是通过 QMK 改固件,要么说的用 Any 键传入 0x2100 但现在也不生效,至少没法起到 Globe 键的作用

使用 Karabiner-elements 改键位映射

参照 https://github.com/the-via/releases/issues/92#issuecomment-3805418968 这个 VIA 项目里 Issue 的讨论,最后还是用 Karabiner Elements 解决问题

我把自己 K8P 的截屏快捷键先改成 F24(默认行为是发送 Cmd+Shift+4 调用系统截屏快捷键),然后再到 Karabiner Elements 里把 F24 映射成 fn (globe),现在尝试按 F24+F,可以在支持的应用里切换全屏

现在就是这个键并不在右手小拇指周边,不是太方便,本来考虑把 Fn+L_Option 改成 F24 来达到映射,后来发现不行,因为按下 Fn 后,原来 F 键的逻辑也变了,这时候键盘工作在第二层键位上,而 F 键默认是在改键盘灯光 RGB 的参数

剩余对当前 macOS 里全屏快捷键的吐槽

之前 Ctrl+Cmd+F 的快捷键用的好好的,偏偏要改一个外接键盘无法支持的 globe+F,而且原来的快捷键几乎所有的应用都支持,改的这个好多应用又不响应,比如 VSCode 就不行,Ghostty 也不行

多年前让苹果成为开发者友好的设备,据说是 @dhh 及 Ruby on Rails 这帮人推动,现在 dhh 也对目前 macOS 的状态不满,在推动 Omarchy 项目,看看会不会三十年河东三十年河西,回头 Linux 变成开发者更友好的环境

同一网页引入两个不同版本jQuery引发的问题

昨天在前端工程遇到一个以前没有想到过的问题

在维护了十多年的主项目上,最近完成了把 Knockout.js 从用户侧前端子工程 acorn 完全移除的工作,原来的要么迁移成 React 实现,要么把自家运营运维侧的工作移到 staff 子工程。在 staff 子工程里目前还有 Knockout.js 的前端页面逻辑和组件,以及一些以前仿照 bootstrap 写的样式和 js 组件,以及基于 jQuery 的日期选择器 datepicker 和时间选择器 timepicker

但昨天发现某个页面一个封了 datepicker 的 input,通过 data-bind=“textInput” 跟 knockout.js 绑定有奇怪的行为。鼠标点选,input 输入框内文本改变,用 $(el).val() 取的值也正常,但 ko 绑定的值不变。如果直接在 input 框里输入,ko 绑定的值就能正常更新

直接 input 输入可以改变 ko 绑定值,说明 ko 绑定没出问题,鼠标点选后 ko 绑定值不变,说明监听机制哪里有问题。因为这一波迁移里把原来多个版本混用的 ko 统一到了 3.x,先查是不是 ko 跨版本有监听事件的变化,ko 官网没说,某 AI 说 ko 3.x 开始还是现代浏览器有啥啥啥事件不再绑定,但尝试手工验证, $(el).trigger("input")$(element).trigger("change") 这些明确说应该有效的,也不能让 ko.observable 的值更新

自己看业务代码和 datepicker 的代码(都是十年前自己写的),git 记录都显示没变啊,调试过程该有的事件都正常触发。把问题代码涉及的链路和表现丢给 Codex GPT-5.4 xhigh,一开始还说需要检查 ko 绑定机制和 vm 初始化顺序,但这些跟之前正常工作时都没变化。后面揪出来在 jinja2 模板层,渲染 HTML 时引入了两次不同版本的 jQuery,在 ko 绑定时用的第一版,后续 datepicker 初始化时关联到第二版,两边 $.event 不通?两套 jQuery 各自维护了自己的事件缓存和 handler 列表,所以 datepicker 库通过第二套 jQuery 发出的事件到不了 ko 在第一套 jQuery 上注册的 handler,而人肉改 input 里的内容走的浏览器原生 DOM 事件,ko 用的那一版 jQuery 有正常监听能生效。最终移除没必要多引入了一次的 jQuery 后,确保 Knockout.js 和 datepicker 使用的是同一版 jQuery 后恢复正常

前端这些诡异的大坑啊,以前为了弥补浏览器能力不足而需要 jQuery 去封装的各种基础能力,现代浏览器都原生支持(主要是选择器和事件触发监听),未来能走原生都走原生吧

断电长按电源键可解决绝大部分USB-C/雷电口设备问题

个人和公司都遇到过笔记本电脑或显示器或别的设备的 USB-C 或雷电口,不能充电、传输信号等问题,大部分情况下,断电后长按电源键做重置就可以解决绝大部分问题

  • 断电

    • 笔记本电脑需要拔外接电源,最好在 BIOS 里断掉内置电池供电,取下一切连在笔记本电脑上的外设,包括但不限于 U 盘、无线鼠标接收器、网线等
    • 显示器拔掉电源线,最好也把所有数据线也拔掉
  • 长按电源键

    • 笔记本电脑在 BIOS 断内置电池的情况下长按电源键不会开机,保持按下 10 秒以上,最好 15 秒或 20 秒。如果没有 BIOS 断内置电池的机型,大概率长按下会先开机,再自动关机,不管他一样按够时间
    • 显示器就是长按电源键,按够时间
  • 恢复

    • 笔记本电脑插外接电源适配器,正常开机就行
    • 显示器插好电源线和数据线,正常开机就行

原理:设备的 USB-C 控制器或雷电控制器进入了奇怪的工作状态,断电长按电源键是让其恢复默认状态,就是重置

优派VX2478-4K-HD使用12V5A电源可以消解绝大多数故障

公司在 2020 年开始分批采购了不少优派 VX2478-4K-HD 这款 23.6 英寸的 4K 显示器,官网在 https://www.viewsonic.com.cn/products/lcd/VX2478-4K-HD

从前两年开始,我们陆续有同事反馈这个显示器点亮后需要很久才能让电脑有显示信号传输过来,开机后也不会立即出现优派那三只彩色小鸟的 Logo,一度以为这么快就到使用寿命,后来在 https://www.v2ex.com/t/1068514 这里看到一个闲鱼大佬神奇的说法,这款机型的电路设计有问题,把原装的 19V 2.2A 的外置电源适配器换成 12V 5A 的就好

实践的确如此,我司已经有超过 70% 的这款显示器通过更换电源重获新生,淘宝上买的广东汕头发货十几块钱的「台达12V5A电源,接口55*25」都能用

使用 Advanced Font Settings 在 Chrome 系浏览器中正确显示中日韩字体

众所周知浏览器在某些场所会错误判断当前文字隶属的语言,然后会调用不同的语言对应的字体来显示,比如中日韩(CJK)共享的大量汉字,在不同的语言里显示字体不一样就会看着很别扭,对,就是 Twitter,现在叫 x.com 的上面,经常看到犬牙交错别扭的显示

哪怕在浏览器里修改了字体,但只对操作系统默认语言生效,并不对所有语言都有效,还是可能会回落到其他语言的默认字体上,所以需要 Advanced Font Settings 这个插件来解决显示不一致的问题

CJK 地区比较推荐使用 Noto 系列的字体,可在 GitHub 上 noto-cjk 这个仓库免费下载使用,虽然有下载说明,但我个人体验下来还是有一些奇怪,只下载通用文件可能是不够的,需要下载区域或语言特定的字体,所以我装完后一共有十个字体

  • Noto Sans
    • Noto Sans JP
    • Noto Sans KR
    • Noto Sans SC
    • Noto Sans TC
  • Noto Serif
    • Noto Serif JP
    • Noto Serif KR
    • Noto Serif SC
    • Noto Serif TC

在 Advanced Font Settings 里对默认语言选 Noto Sans / Noto Serif 不带后缀的这个,特别是浏览器和系统语言是英文的情况。其他几个语言必须要选带后缀的字体才能正确显示,对应关系分别为

  • 韩语 Korean: Hangul - KR
  • 日语 Japanese: Japanese - JP
  • 简体中文 Simplified Chinese: Simplified Han - SC
  • 繁体中文 Traditional Chinese: Traditional Han - TC

设置好后可以访问 /blog/font_test.html 来确认是否都正常渲染

Win11 宿主机在远程链接时 WiFi 掉线的处理

在公司连的内网无线网络是通过 WPA/WPA2 加 Radius 走 LDAP 认证的,最近有一个奇怪的现象在多台 Win11 宿主机上出现,明明网络是连接状态,但从别的机器发起远程连接,接通的瞬间宿主机切到登录界面时网络就掉了

宿主机连有线没有这个问题,连 WPA2-PSK/WPA3-SAE 模式只用 WiFi 密码连接的无线网没问题

网上各种找解决办法,包括但不限于 设置网卡的电源配置以免节能模式关闭了网卡、升级补丁和驱动、导出网络配置文件并应用到所有用户 等,因为都没起作用所以也不在这里给引用链接了

最终的解决办法是「从已知网络里忘记这个接入点,重新添加一次」就好了,就是这么无厘头……

在 Win11 里忘记已知网络的设置入口在 设置 - 网络和 Internet - WLAN - 管理已知网络

使用 ZeroOmega 替代 SwitchyOmega

在 Chrome 系浏览器上,包括 Chrome、Edge、Arc 等,SwitchyOmega 作为开发测试和科学上网的必备工具,一直是新机优先装的插件,或等待插件自动同步赶紧配好

不过由于 SwitchyOmega 的开发者已经不再维护 [1][2],Chrome 对插件的 manifest meta 要求从 v2 到 v3,再加上原版的 SwitchyOmega 在 Arc 的弹层总有些问题,所以最近一直在找替代方案

在 SwitchyOmega 作者建议有维护能力的人去 fork 一个 v3 版本的推文后,发现了 ZeroOmega [3],看了下项目代码就是直接 fork 然后改各种兼容配置项,界面和文档里好多地方还是 SwitchyOmega,一开始还不太好用,不过这两天用下来已经可以平替了,除了插件 Logo 相比之前略有不协调,但在浏览器插件栏显示的还是之前的圆环,完美替代

安装地址:Chrome Web StoreMicrosoft Edge Addons

注:
[1] SwitchyOmega 的项目地址 https://github.com/FelisCatus/SwitchyOmega
[2] SwitchyOmega 不再维护的推文 https://x.com/_catus/status/1759413399270936672
[3] ZeroOmega 的项目地址 https://github.com/suziwen/ZeroOmega

ThinkPad X1 Carbon 2018 2K 屏会卡死的解决

收了一台 X1 Carbon 2018,配置是 i7-8650U / 16G / 512G / 2K / FPR / 4G LTE,重装系统后发现偶尔会出现屏幕卡死的情况,具体表现是屏幕上任何东西都不动,鼠标光标无法移动,但按大小写锁定等按键,键盘上的灯是在正常响应的,说明系统没卡死。做了如下排查尝试

  1. 有软件冲突。把各种第三方软件都删过,甚至输入法都删过,问题依旧
  2. 电源管理问题。把电源性能都开到最高,问题依旧
  3. 驱动问题。把各种驱动从系统默认到 ThinkPad System Update 都升了一遍,问题依旧
  4. 发现插电时会好转,但没有稳定复现或稳定消除的规律
  5. 跟 CPU 降频有关?但一直开着任务管理器也没发现有什么特别的,其他磁盘等也没有满负载被卡住

最后搜到 https://club.lenovo.com.cn/forum.php?mod=redirect&goto=findpost&ptid=5559793&pid=65060757 这个帖,在 Intel 显卡控制中心里把面板自适应刷新的开关关掉就好了,具体路径在 系统 - 功率 - 使用电池/使用外接电源 下的 面板自刷新

这个奇葩的问题只出现在屏幕型号为 LEN40AA 的 2K 屏的版本上,普通的 1080p 和 4K 屏都没有这个问题,难怪没搜到太普遍的解决办法。之前我的排查思路有遗漏,是因为大部分我插电的时间都连了外接显示器,在外接显示器上这个 bug 触发不出来,而有时候我又是没外接屏幕插电用,所以没有找到稳定复现的条件

改注册表以在旧 CPU 电脑上升级 Windows 11

公司有一批旧 i5-7200u 的笔记本电脑,打算装 Win11Pro 提供远程访问,做一些测试用,发现直接切换专业版序列号提示错误,准备把系统默认的系统通过 ISO 文件先升级到 Win11 23H2 的 Pro 版也提示处理器不支持

通过新增注册表项解决此问题,在 Computer\HKEY_LOCAL_MACHINE\SYSTEM\Setup\MoSetup 路径下,新增一个 DWORD (32-bit) 字段,命名为 AllowUpgradesWithUnsupportedTPMOrCPU 并将值设为 1,再运行 ISO 里的 setup.exe 就不报错了

方法参考自 https://www.theverge.com/22715331/how-to-install-windows-11-unsupported-cpu-intel-amd-registry-regedit

ThinkPad 40AC 雷电三扩展坞

从早期真正放在笔记本底部的 Dock 时代开始,就对 ThinkPad Dock 这样底座连各种线缆,笔记本电脑本体随时拔了就走的模式特别喜欢,买过用过 T60、X200、X230 的底座式扩展坞,和 40A9、40AC 两个外接式的扩展坞,本文介绍下 40AC 这个雷电三协议的扩展坞

办公室桌上这个已经用了两年多了,之前在 v2ex 上开了个帖介绍记录:买了个 ThinkPad 40AC 雷电 3 扩展坞给 2020 Intel i5 MacBook Pro 13 用,近乎完美体验一线通 ,本文为这个帖的整理更新

为什么需要一个扩展坞

因为在办公室,对 MacBook Pro 外接两个 4K 显示器,加上有线键鼠耳机等需求(蓝牙有干扰和延迟),每天笔记本过来插拔一堆线,期待能用上雷电接口连供电加显示数据等特性,一根线搞定

现在桌上还有一个铭凡类似 NUC 的小主机装着 Windows 当主力机在用,也期望能更简单把这一堆外设在小主机和笔记本之间切换

为什么选了 ThinkPad 40AC 这个扩展坞

在 2021 年那个时间点,之前能搜到给 MacBook Pro 的扩展坞,要么指向 CalDigit 这种苹果官方背书但贼贵的,要么是 HP 或 Dell 家需要装驱动且存在 macOS 升级后不可用的风险,或者输出接口没法满足(比如最核心的 2x 4K@60Hz)

ThinkPad 的扩展坞,公司之前买过一个 40A9,是比较早的 USB-C 协议扩展坞,能一根 USB-C 上行到笔记本电脑,解决 供电+单个显示器+USB+LAN+耳麦 的需求,但 macOS 接多个显示器时只能被当成同一个输出源输出同样的信号,偶发有笔记本休眠后再唤醒时显示器无法唤醒的问题,需要重新插拔一下(用在 ThinkPad 上可以多个输出也没唤醒问题),同时最大只能双 1080p@60Hz,所以没有继续选这个

当时参考 https://post.smzdm.com/p/aekzgq6k/ 这个文章,对比下来 40AC 应该是满足需求且价格最合适的,事实上在 2021 年八月,闲鱼五百多买了一套 40AC 加 135W 电源加雷电三线,用下来也是近乎完美的

在 2023 年八月这个时间点,可选的除了已经全套价格降到 300 以内的 40AC,还有 40AN 这个二代雷电三扩展坞,和 40B0 这个雷电四扩展坞等,不过后面两个价格还是略贵,所以当家里有需求时,我还是再买了个 40AC

官网在 https://support.lenovo.com/us/en/solutions/acc100356 ,各种驱动固件和技术规格都可以从这里找到

用起来怎么样

先上个图,左侧那个黑色长条形就是 ThinkPad 40AC 扩展坞本体,后面那个黑色的大块头电源是连这个扩展坞供电同时给更上行设备提供充电能力,右侧那个银白色的小方块是铭凡 NPB5 小主机

ThinkPad 40AC Thunderbolt 3 Dock

目前接上去的线包括

  1. 135W 联想方口电源输入
  2. 雷电三上行线,连接笔记本电脑或其他设备,同时可带 65W 供电(能满足 MacBook Pro 13 和 14 的需求,更大没测试)
  3. DP 到一个 4K@60Hz 显示器
  4. RJ45 接千兆 LAN 有线网
  5. USB-A 接键盘、鼠标、充电线(给自己的小米手环充电用)
  6. USB-C 形态雷电三下行 DP 模式接另一个 4K@60Hz 显示器
  7. 3.5mm 耳机孔接有线耳麦

接 MacBook Pro 13(2020 Intel i5 款)和 MacBook Pro 14 (2021 M1Pro 款)都是即插即用,不需要破解,不需要改 SIP 或系统设置,测过从 macOS Catalina (10.15)一直到 Ventura (13.x)都是可用的,在可见的未来也不应该出其他问题

接 ThinkPad X1 Carbon 2018(Intel i5-8350u)、Lenovo Miix 720 (Intel i5-7200u) 、铭凡 NPB5 (Intel i5-13500H) 这些 Windows 设备也都是完美工作

缺点和瑕疵

  1. 显示输出限制
  • 不管是 Windows 还是 macOS,想双 4K@60Hz 只能一个走雷电三下行,一个走 DP,技术规格详见 https://support.lenovo.com/us/en/solutions/pd029622
  • macOS 对扩展坞上所有除 DP 模式雷电三下行的显示接口,都当做一个输出,所以在这些接口上怎么接多个显示器,都被 macOS 当成一个且输出同样的内容,要分屏只能是雷电三下行走一个,其他接口任选一个(为了跑满 4K@60Hz,还是选 DP)
  1. macOS 下耳机输出音量不可调节
  • 这其实应该赖 macOS,在更早的音频固件下是可以调音量的,最新的固件反倒不行,详见后面固件问题部分
  1. 没有读卡器

固件问题

最新的固件版本是 1.0.0.25,如果没有特殊需求,建议刷到这个最新的版本,下载页面在 https://pcsupport.lenovo.com/us/en/downloads/DS506176 ,单独的固件下载链接是 https://download.lenovo.com/pccbbs/mobiles/ar_tbtdockfw10.exe

这个版本的固件在 macOS 下无法调节耳机音量,不过有一个神奇的办法是把其中音频部分的固件单独降级到 1.0.0.12 版本固件里带的 04-0E-80_Rev_0080 就好了

根据其他版本的下载链接推测出来可用的固件下载链接在 https://download.lenovo.com/pccbbs/mobiles/thinkpad_tbt3_dock_web_fw_v1.0.0.12.exe

下载后运行,固件内容会被默认解压到 C:\DRIVERS\ThinkPad_TBT3_Dock_WEB_FW\ 这个目录下,不要在图形界面里刷新,进入 Windows 的命令行,然后用下面这个命令,强制只刷新音频部分的固件

C:\DRIVERS\ThinkPad_TBT3_Dock_WEB_FW\ThinkPad_TBT3_Dock_TVSU_FW.exe /audio /f

最后用 v1.0.0.25 版本固件更新程序的 check 功能看,其他几个模块是最新,音频部分提示目前是 0080 需要升级到 0087 就好了

不过 04-0E-80_Rev_0080 这个音频固件在 Windows 下,会导致扩展坞上的耳机插孔明明插了设备,但 Windows 不认导致无法输出,所以不是接苹果设备的话,还是建议整体都用最新固件