因为日常工作还是基于 Windows 环境,所以实在没法接受在两种鼠标键盘操作习惯中来回切换。
Ctrl 和 Command 按键的对调。
具体位置:系统设置 -> 键盘 -> 键盘快捷键 -> 修饰键 -> 选择键盘,然后把 Ctrl 和 Command 的作用分别改为对方就好了,这个是在这里学到的。
同时带来一个后果,本来还算顺手的 Command + Tab 也得改到左边用 Ctrl + Tab 了,两害相权取其轻吧。
鼠标的滚动方向。
具体位置:系统设置 -> 鼠标 -> 自然滚动,取消掉就好了。
WORD 和 Excel 文件编辑,免费的 WPS Office 就足够了,不需要微软的 Office 套件。
压缩文件的处理,7z 似乎没有 Mac 版,没找到合适的替代软件,但无意中发现 WPS 居然还支持 .rar 等压缩文件的解压,令人欣喜的不务正业。
后来发现有个叫 Keka 的软件口碑不错,其官网上直接可下载,不一定要去 App Store 下载付费版本。
系统自带的图书应用对 EPUB 格式的处理很好,至少比之前用过的 SumatraPDF 和微信读书都要好,果然基因不一样。
文件夹下的照片浏览,相比较在 Windows 上用自带的软件就挺方便,Mac 上目前有两个方法,但加一起也只能算是勉强可用吧:
本地视频播放,一直在 Mac 上使用的 IINA,最近才发现不支持 Dolby Vision,后面得注意下,另外也在这里学习到一招,直接在 IINA 里调节色调也能将就看,但因为是个全局的设定,感觉也不够好用。
想要从终端直接运行 code 来启动 VS Code,需要先在 VS Code 里执行:Shell Command: Install ‘code’ command in PATH,这个是从这里学到的。
想要中断终端里的程序执行,Command + .。
网络文件共享,主要用来在家里的电视或其他设备上访问电脑里的视频文件。
具体位置:系统设置 -> 通用 -> 共享 -> 文件共享,可以按需添加想要共享的文件夹。
需要注意在同一个地方的“选项”里,针对“Windows文件共享”进行设置。
然后因为我的 Mac mini 是外接了一个移动硬盘,网络共享里默认是看不到上面的共享文件夹的,需要在“系统设置 -> 隐私与安全性 -> 完全磁盘访问权限”中允许 smbd,这个是从这里学到的。
BT 下载,之前在 Windows 下用的 qBittorrent 也有 Mac 版,继续用就好了。
MTP 传输,先是装了 Commander One,结果没几天发现收费版本才能用到相关的功能,只好先装 Homebrew(参照这里用下面的命令安装的,也设置了国内的源),再安装里面的 Android 文件传输(brew install --cask android-file-transfer)。
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
外接硬盘的文件系统格式
默认用了 exFat,但会有一个问题是在比如 VS Code 下,编辑任何文件都会生成 ._ 开头的文件,据说也不是备份文件。考虑下要不要换成 APFS,还不确定 Windows 的可操作性怎么样。
GitHub 访问不畅
之前在 Windows 下一直用的 fastgithub 不好使了,运行就报错,暂时没找到解决方法。
![]()
如果查看这个文件的属性,会看到其实际占用空间远小于文件大小:

如果用 attrib.exe 查看文件的属性,结果输出里会有一个大写的 O。
既然决定不了文件服务器的归档行为,就想要能够比较方便的删除掉文件服务器上被归档的文件,并且重新从本地将原始文件同步上去。
知道这种文件叫离线文件就已经离成功不远了:
os.stat() 可以拿到文件的属性。st_file_attributes 检查是否 stat.FILE_ATTRIBUTE_OFFLINE 已置位。os.remove() 删除不了(已经是管理员权限的命令行窗口),但直接在 Windows 桌面或者在命令行窗口里用 del 命令又都是可以删除掉的,奇怪了。os.remove() 的替代品,找到了 os.unlink(),但按网上普遍的说法,这两个在 Windows 上其实没区别。os.listdir() 遍历源路径,并根据遍历结果是文件还是目录区分处理就行(文件检查是否需要拷贝,目录就直接递归)。将电脑通过 USB-C 接口与家里的戴尔 U2723QX 显示器连接,显示器不显示,而且菜单像是死机了一样,无法做任何操作,而电脑端看上去像是正常检测到了显示器,除了可以从显示器供电,也能看到显示器的型号啥的,鼠标操作也是能感觉到外接显示器是在的(比如在扩展模式下的鼠标可移动范围),但显示器上就是啥没都有。
同一个显示器,试过家里其他的笔记本(长期使用的 M1 款的 MBP,以及工作用的惠普 ProBook 430 G7,都是 USB-C 连接),都能正常显示,所以感觉像是联想笔记本的问题。
第一天,应该先是网上搜索了下,看到有人说的一些方法(断开所有外部连接,进入 BIOS,临时禁用电池,然后常按开机键一段时间,再重新接上 USB-C),试了下没有效果。后来电话联系了客服,给了个地址,让下载安装显卡驱动试试,因为这个笔记本10月才出厂的,所以显卡驱动已经是那个版本了,装了也就没有效果了。
第二天,微信上联系的在线技术支持,确认我干过的事情后,建议将系统里的设备加密(应该就是 Bitlocker)关掉再试试断电大法,晚上回家试了下,仍然没有效果。然后网上也看了一些帖子,各种加强版本的断电大法都尝试了下(比如显示器那一端的线也要拨掉,甚至整个断电之类的),仍然没有效果。
第三天,直接带着新电脑上班,继续微信上联系在线技术支持,这次是让更新下 AMD 官网上的最新显卡驱动(之前第一天那个是联想官网上,稍微没那么新),装完后直接在公司同事的显示器(也是戴尔,型号是 P2723QE,也用 USB-C 连接)上试了下,居然可以正常显示!但晚上回到家继续试家里的 U2723QX 还是不行,郁闷了。
第四天,继续微信上联系在线技术支持,说可能硬件或接口哪里有问题了,建议直接换货试试,我问还有没有什么招可以试,反馈说可以试着还原下系统。于是白天在公司抽空试了下,还原后还是可以正常连接同事的显示器,但看显卡驱动版本又没变(系统还原不还原驱动程序的?),就手工卸载并重装了联想官网稍微旧一点的那个驱动,仍然可以正常显示,但回到家就不行了。看来昨天试的结果是有问题的,显卡驱动升级没产生任何效果(行的一直行,不行的一直不行)。晚上有点怀疑是不是家里的显示器哪里有问题,就上戴尔官网找到了显卡的固件升级,两个版本都试了下(人生第一次给显示器升级固件!需要通过 USB-C 连接才行),依然没有效果。另外也详细对比了 U2723QX 和 P2723QE 的参数,没发现什么明显差异。
第五天,从公司带了个华为的笔记本(G540 Gen2)试了下,不出意外,也是可以和家里的显示器配合工作的。不知道还能怎么试了,换货的话担心换过来的还会是一样的问题(不太相信自己运气这么好正好挑到一个有问题的笔记本),所以想想还是直接退货吧,哎,折腾快一周,回到原点。
总结下问题现象:
最后,下次换新笔记本,先别折腾电脑里的系统和软件啥的,第一个先试能不能 USB-C 连接显示器!
2024/12/29 更新:

2020 年出版的《计算机组成与设计:硬件/软件接口(原书第5版)》,翻译的版本是 2018 年的 RISC-V Edition。

2021 年出版了 RISC-V Edition 的 2nd Edition,前言里也不再说自己是什么第 5 版或第 6 版了。


如果这时重启整个手机,确实可以短暂解决问题,但重启后不久,问题又会出现。
尝试过重装微信以及其他一些网上能看到的方法,但都没有解决问题。最后是在家人建议下(也是碰到了类似的问题),直接抹掉整个系统,并且不要从之前的备份中进行还原,才算解决问题(至少已经超过两个月了,没有再发生)。
整个看上去像是从历史备份还原导致的问题(我的备份大概是从 iOS 12 或更早的版本开始的),和之前碰到的 Firefox 问题可能有点像。
另外,虽然问题主要是体现在微信上,其他应用也有一些可能相关的问题,主要发生在手机网络不好的时候。比如之前去平谭岛的火车上,就碰到过闲鱼 App 里的部分页面白屏而且重启应用都没用的情况,包括高德地图的定位功能也不工作了,目前这些问题都没有再发生过。
]]>PyInstaller 打包一看,输出文件直接从 20+MB 变成 70+MB 了,而且里面出现了明显不太对劲的内容,比如这个工具里没有用到的 numpy 等,实在对不起“小工具”这个名称。。。
后来折腾了一会儿才将输出文件再变成原来的大小,甚至比原来还小一丢丢~
简单记录下:
PyInstaller 和 numpy 这些都在其中openpyxl,但没有安装 PyInstaller
PyInstaller(其中从打包的运行日志中也能看出来,之前没往深处去想)pip freeze > req.txt + pip uninstall -r req.txt -y)
PyInstallerPyInstaller(再次删除了全局 Python 环境中的所有库,免得互相干扰)
如果完全不管后台那些僵尸进程,可以继续启动一个新的,新进程可以正常起来也能正常退出(但僵尸不会退)。但如果把僵尸强杀了,再启动新的 Firefox,就又还是一样的问题现象。
今天有点不能忍,就尝试搜索了下,好像没有比较近的帖子讲这个的,隐约看到一些说重装一下试试啥的,想着要不就试试吧。然后还没开始真正卸载,就看到 Firefox 卸载界面上的提示了,嘿,这不正是我想要的吗:

过程还算快,因为之前使用了 Firefox 自带的账户同步功能,所以 Refresh 后很快就把类似历史记录、书签之类的都恢复了,但也有一些需要手工修改的东西,比如:
about:config 里的设置也复原了(比如一直用的 closeWindowWithLastTab = false)但最重要的,Refresh 后确实我一开始的问题解决了!估计还是无数历史版本一路升级上来,保留了越来越多不那么兼容的配置吧。
Refresh 这个功能的出现位置挺好,卸载再重装总还是更麻烦一些的,虽然说如果能一开始就避免这样的问题就更好了吧。
]]>无意中发现两年前装上的无线路由器不知道什么时候开始已经没在工作了,但因为爸妈的手机还保留了原来那个猫的无线设置,所以没及时发现。
老爸用沉甸甸的指针式万用表测了下发现是路由器的电源有问题,没有正常的 9V 输出,然后我才发现这个还不是路由器原配的电源,可能是之前搬家的时候弄混了,不知道是不是因为功率不匹配用坏的(标称 1A,但路由器要求的是 1.5A)。
再然后第二天我才刚起床,发现老爸已经用家里现成的配件手搓了一个电源出来,用的是据说小区里捡来的一个装饰灯上的电源,配上老爸之前自己买的电源插头,赞,不然大过年的网上能买到的也都不能很快送货。
未解之谜1:旧路由器的不足在用笔记本电脑上网的时候感觉特别明显,用手机的时候倒不怎么觉得,不知道是什么原因。
有次大家在家庭群里发消息的时候,我姐说怎么还没看到老爸发的专属表情包,才反应过来老爸一直有个技能点,是能发出有定制文字的表情。
正好老爸就兴冲冲地来和我说这个功能是怎么回事,以及不知道为啥老妈的手机就没这个功能。
一开始我还以为是输入法的功能,后来才明白原来就是微信自带的功能,正式名称叫“合成表情”,在表情发送界面,使用“搜索表情”的功能即可看到相关的入口。或者如果收到别人发来的类似表情,直接点击也可看到相关的说明。
未解之谜2:老妈的手机上确实没有这个功能,同样最新的微信版本,怀疑可能是对手机处理器有要求,虽然价格没差多少,但老爸手机的处理器是高通的,而老妈手机的处理器是联发科的,不知道是不是这个原因,没找到比较官方的解释或说明。
未解之谜3:老爸老妈的手机有个公共的问题,我们发在群里的一些能产生全屏动画效果的消息(今年是康师傅的?),在他们的手机上除了显示正常的消息没有任何反应(但微信自带的一些表情效果,比如爱心啥的,是有反应的),也没找到什么比较官方的解释或说明。
每周固定时间和爸妈视频的时候,偶尔会碰到他们没接听的情况,一般以为只是爸妈正好没听到,也没太在意。
这次在家的时候,正好有次亲戚发来的视频通话也没接听,而且我当时就在旁边,完全没有听到,这才仔细看了下老爸手机里微信的应用设置,尝试修改了几个通知(不要设置为不重要通知)和耗电(比如允许唤醒和开机自启动之类的,但还没有打开允许后台运行,据说会比较耗电)相关的设置,后面再观察观察效果。
一个月后:结果还是不行。。。得尝试改下允许后台运行了。
三个月后:又尝试了允许完全后台行为,关闭待机优化(默认是平衡模式),关闭耗电异常优化(对微信),包括按网上说的,也确认了应用锁定早就已经对且仅对微信设置了,结果还是不行。。。对 Android 系统杀后台的行为真是没招了,具体型号分别是 realme 的 GT 大师探索版 和 GT Neo,都是 8GB 运存,系统分别是 realme UI 5.0 和 4.0(分别基于 Android 14 和 13)。
老爸教我做微信的表情包,我教老爸用手机的语音助手,老爸说有意思,回头仔细研究研究!
]]>使用了比较标准的方式来读取表格,类似于:
from docx import Document
doc = Document(filepath)
for tbl in doc.tables:
for row in tbl.rows:
value = row.cells[0].text
...
结果对于一个大概 800 多行的表格,需要花费十几分钟才能解析完,从表格一开始大概半秒一行到后来一秒多一行,完全不能理解为啥会这么慢!
然后先写了个更简单的脚本,仅进行表格内容的遍历,可以基本确定性能瓶颈不在表格读取之外的那些处理逻辑上。再然后尝试在网上做了些检索,也没找到合适的答案。
再后来去翻看了 python-docx 的官方文档,想着也许有什么我不知道的接口可能更适合我的使用场景,然后在这里就看到比较奇怪的东西了:
class _Row(Parented):
"""Table row."""
@property
def cells(self) -> Tuple[_Cell]:
"""Sequence of |_Cell| instances corresponding to cells in this row."""
return tuple(self.table.row_cells(self._index))
行的 cells 方法实际是调用了表格的 row_cells 方法,而表格的 row_cells 方法又是这么定义的:
class Table(Parented):
"""Proxy class for a WordprocessingML ``<w:tbl>`` element."""
def row_cells(self, row_idx: int) -> List[_Cell]:
"""Sequence of cells in the row at `row_idx` in this table."""
column_count = self._column_count
start = row_idx * column_count
end = start + column_count
return self._cells[start:end]
@property
def _cells(self) -> List[_Cell]:
"""A sequence of |_Cell| objects, one for each cell of the layout grid.
If the table contains a span, one or more |_Cell| object references are
repeated.
"""
col_count = self._column_count
cells = []
for tc in self._tbl.iter_tcs():
for grid_span_idx in range(tc.grid_span):
if tc.vMerge == ST_Merge.CONTINUE:
cells.append(cells[-col_count])
elif grid_span_idx > 0:
cells.append(cells[-1])
else:
cells.append(_Cell(tc, self))
return cells
也就是说,row_cells 引用的 _cells 看上去每次被调用时都在重新构建一个新的列表???
不确定是否完全理解这些代码及其目的,尝试在自己的代码直接拿到 _cells,然后基于行列坐标自己去访问想要读取的 cell,结果对于上面说的那个 800 多行的表格,不到一秒就访问完了!差不多三个数量级的性能提升?
示例代码如下,供参考:
from docx import Document
doc = Document(filepath)
for tbl in doc.tables:
cells = tbl._cells
row_count = len(tbl.rows)
col_count = tbl._column_count
for row in range(0, row_count):
value = cells[row * col_count].text
...
普通家用的倒不贵,但技术宅可不能随随便便买一个,于是国庆最后一天和接下来的几天花了不少时间,但却也没看出太大的门道。。。知乎在这个过程中没起到太好的作用,主要参考的还是 B 站一个家电 Up 主(知电晓春哥)的视频和他家的测评文档,然后基本收敛到这几个选择:
知电不是太推荐,没明显亮点的缺点,性价比一般。AX3 的具体评测报告是说信号还可以,但负载处理能力一般。没看到 AX3 Pro 的评测报告,但这两款前几年应该都有过被迫换芯的处理,早期 Pro 版本的发热问题应该是好很多了,但其它方面不清楚。
价格正常,也比较好买/好卖。
抱着没有太多期望、能用就行的态度差点下单,后来是看到 B 站另一家的测评,提到这款过热后降速的测试结果,综合考虑了下就基本放弃了,江湖上有说法是华为的无线路由向来做得不怎么样,不知真假。
红米 AX6S(2021 年)
知电推荐,看上去没有明显的短板,但能买到的价格似乎不便宜(近 300),不知道是不是要退市了,感觉不划算,然后内心深处有点对米家产品质量的不是太放心,后来就没怎么考虑了。
另外,相对华为和中兴分别用的高通和自研芯片方案,这个选择的潜在优点之一是应该可以刷第三方固件吧。
中兴 AX3000 巡天(2022 年)/ 晴天(2023 年)
知电倒是很推荐,但从评测报告来看几乎是华为 AX3 的反义词,负载处理能力强,但信号一般(无外置独立 FEM,内置的),感觉上知电的测评更侧重负载,信号的问题更多建议通过类似于有线 Mesh 的方案来解决。
考虑到自己的应用场景,其实一开始是不倾向于这个选择的,家里不会有大的负载(参考知电的评测报告,场景应该还是超出了大部分家用的场景),信号的作用应该要大得多。
但同样是前面提到的另一家的测评,看到这款的信号好像也没有很差的样子,纠结好一会儿之后就还是选择了中兴,并且选择了颜值更高的晴天版墙面路由。晴天的评测报告中基本都认为和巡天的配置是一样的,不知道为啥知电的评测结果会稍微好一点(仅游戏稳定带机数量从 20 降到了 11,和华为 AX3 相当),希望是有一些内部看不见的优化吧。
内心的打算是想着只要能满足当前的使用就行,以后如果房子大了,真有信号覆盖不好的话,再加个同品牌的路由器来组网。
既然是新路由,就得好好整整:
总体来说,还是满意的,有点担心的无线信号覆盖方面完全没有碰到问题,主观上感觉刷 B 站偶发的卡顿也似乎是变少了,也感觉下载软件里接近上限的上传速度曲线似乎比之前更平整了,不知道是不是心理作用,哈哈。
一个月后:好吧,内网无线互连的速度明显比原来快多了,比如在 iPad 上通过 SMB 播放笔记本电脑上的视频文件。
突然觉得换下来的极路由 4 也挺好的,这么多年的产品了,信号覆盖挺好,WAN 口也已经是千兆(可惜被我的烂网线耽误了),运行也挺稳定,甚至外观的品位也还不错,只能感叹小厂商做智能硬件真不容易。
]]>