MoreRSS

site iconDeppWang | 德普王修改

男|程序员|爱折腾|工具控|五笔 er|麻将爱好者
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

DeppWang | 德普王的 RSS 预览

用 DashPlayer 看美剧学英语

2026-10-27 23:09:27

最近在用 DashPlayer 看《绝命毒师》学英语,体验下来觉得还可以,推荐给也想用本地视频、音频学英语的朋友。软件开源免费,可以控制字幕显示,也方便反复听一句台词。

它支持 Windows 和 Mac,我自己用的是 Mac,下面就按我在 Mac 上的使用方式来写。

先到官方下载页面,展开 Assets,找到适合自己电脑的安装包。Mac 下载以 .dmg 结尾的文件,M 系列芯片选 arm64,Intel 芯片选 x64,不要下载 Source code,那是源代码。下载后打开,把 DashPlayer 拖进 Applications 文件夹就可以了。安装说明

接下来准备视频和对应的字幕文件。我现在用的是《绝命毒师》,一般是在猫狸盘搜中找资源,目前我找到的资源只有「迅雷云盘」中有。《绝命毒师》具体资源链接

DashPlayer 的按句播放等操作需要用到字幕文件,所以最好找到和视频对应的字幕。如果没有的话也可以用 AI 生成,但我还是更想用现成的翻译字幕,所以在 assrt.net 中找了对应的字幕文件。

准备好后,在 DashPlayer 里通过「打开文件」选择视频和字幕。不过,我偶尔会碰到打开视频后,再打开字幕没有反应的情况,还没确定是什么原因。

字幕文件准备好了,还有一个问题:视频画面里本身就带着中英文字幕,在播放器里关字幕也去不掉。我想练英语,希望视频不要带中文字幕,但找了很久没找到合适的版本,就想到一个曲线救国的办法:用字幕遮挡工具,把画面里的中文字幕挡住。

这个字幕遮挡工具叫 Menu Bar Cover。也是需要你下载安装的。它默认是菜单栏遮挡,使用这个快捷键 Cmd + Option + M 切换到字幕遮挡。

通过快捷键调整遮挡的高度、宽度和位置,就可以把画面里的中文字幕挡住。

不过,Menu Bar Cover 我用着偶尔会碰到 D 键失灵,退出遮挡工具后才能恢复。

我一般会先正常开着中英文字幕看一遍,第二遍再专门拿来学英语。第一遍先把剧情看了,第二遍就不会一直被剧情吸引,可以把注意力放在台词上。我配置跳过没有台词的部分,专门听有对话的地方。

界面上,我会关掉侧面的字幕列表,只留下方的字幕条,设置成只显示中文。快捷键切换字幕很方便,我常用 B 来显示或隐藏字幕。

遇到不认识的单词,也可以用它的查词功能。当前版本已经内置离线常用词词典,不配置 API Key 也能查基本释义;AI 查词、字幕翻译和整句学习等功能,则需要另外配置 AI 接口。软件免费,自己接入的 AI 服务可能会收费,具体配置可以看官方说明。

如果不想坐在电脑前看视频,只想听听台词,也可以用「每日英语听力」。我也让 AI 生成了一些《绝命毒师》的对白听力内容,把链接放在下面,想纯听英语的朋友也可以直接听。

【每日英语听力中的《绝命毒师》台词听力链接。】

花 20 元,让实体卡手机也能用上 eSIM

2026-10-26 21:18:27

如果像出国旅游想用 eSIM 流量套餐,但手机只有实体卡槽,可以试试小白卡。

它就是一张可以写入 eSIM 信息的实体卡,写好之后,像普通手机卡一样插进手机使用。小白卡和 9eSIM 这类实体卡,基本原理一样,都是把 eSIM 套餐装进卡里。卡本身不带流量,套餐需要另外购买。

拼多多搜索「eSIM 小白卡」或「eUICC 实体卡」就能找到,我当时买的价格大概 20 元。买之前确认支持 EasyEUICC,以及能保存多少个套餐。只是旅游时用,没必要追求大容量。


安卓和苹果的区别,主要在怎么把套餐写进去。

安卓手机可以下载 EasyEUICC,把小白卡插进手机,打开软件,扫描套餐商提供的二维码,就可以下载并写入。

不过,手机需要支持 OMAPI。我最开始用 OPPO Find X 写入就不行,当时发现它没有 NFC。这里容易误会:不是靠 NFC 把套餐写进卡里,真正需要的是 OMAPI 支持,不能只看有没有 NFC 来判断兼容性。兼容性说明

iPhone 则需要买一个兼容的 eSIM 读卡器,可以配合 9eSIM iOS App 使用。把小白卡放进读卡器,连接 iPhone,再通过 App 扫码写入。买的时候可以直接选「小白卡 + 读卡器」套装,我当时看比单买划算,也要注意读卡器是否适配自己的手机接口。

我用读卡器时遇到过「下载失败」,拔出来换个面再插就好了,应该是接触不良。

写好之后,把小白卡放回手机卡槽,选择它作为上网用的卡,按套餐要求打开数据漫游,就可以使用了,读卡器不用一直插着。

如果卡里存了多个套餐,我这张卡可以在 iPhone 的「设置 → 蜂窝网络 → SIM 卡应用程序 → LPAe Menu」里切换。这个入口叫 SIM 卡应用程序,背后是卡片提供的 SIM 工具包菜单,并不是苹果自带的「eSIM 助手」。普通小白卡和 9eSIM 的常规实体卡,都可以用这种方式管理卡里的套餐,具体看卡片支持哪些功能。原理说明

从 AI Passport,看一种 AI 变现的思路

2026-10-25 23:07:12

前阵子在网上了解到一个 AI 小玩具,叫 AI 通行证(AI Passport),最近在京东上买了一个。

长这样:

它有一块小屏幕、麦克风、扬声器和实体按键。除了安装别人做好的玩法,也可以让 AI 帮自己写些小软件,装进去玩。

用下来,我觉得 FoloToy 对这个产品的设计和玩法挺有先见之明的。现在大家都在讨论怎么用 AI 赚钱,它把 AI 写软件的能力和一个能卖出去的硬件结合起来,算是在 AI 变现这件事上走通了一步。

首先,它做出了一个让人愿意买的小东西。外观好看,有点科技感,价格也不贵。可以当个装饰品,也能用来表达自己的兴趣,反正我就挺吃这一套的。能控制住成本,做出这么一个好看又好玩的产品,本身也是一种能力。

买回来之后,它也有些实用价值。现在社区里已经有不少玩法了,小游戏、电子书、音频播放、AI 助手、小工具都有。我装了一个「英语磨耳朵」,没事儿就播放点英语听力,磨磨耳朵。

这些事情手机当然也能做,但独立设备也有它的好处。打开之后就专心干这一件事,不容易顺手又去看消息、刷别的东西。比如蹲坑时使用就挺好,不用带手机,也能满足想玩点东西的欲望。

更让我觉得它想得比较远的,是后面的玩法怎么来。

小屏幕、麦克风、扬声器和实体按键,给开发者留了不少发挥空间。虽然硬件有性能限制,但拿来做些简单的游戏、学习工具和语音交互,已经能玩出不少花样。FoloToy 自己做硬件、开放固件,开发者可以围绕这套硬件设计整套玩法,连设备开机后变成什么样,都能自己决定。

AI 又把开发这些玩法的门槛降低了。用户有了想法,可以让 AI 帮忙开发,再通过安装工具装到设备上。FoloToy AI 开发集成这块做得不错,一句提示词就可以让 AI 开发出第一版玩法出来,一键就可以安装到设备使用测试使用。

我就挺喜欢「英语磨耳朵」这个应用,还让 AI 帮忙稍微升级了一下。

FoloToy 也做了玩法社区,让大家上传自己的作品。这样一来,后面能玩什么,就不只靠官方自己想、自己开发了。有人做出新玩法,其他用户也能安装来玩;玩法多了,这个硬件也就多了些值得买、值得继续玩的理由。

我觉得这几部分放在一起,才是这个产品有意思的地方:硬件是用户愿意付钱买的东西,AI 帮用户把想法做出来,社区再把这些玩法分享给更多人。公司卖硬件,用户贡献创意,已经有了一个能运转起来的做法。

另外,我是在京东自营买到的,也看到了京东对它的采访。结合京东也在布局 AI 硬件,我猜平台可能会给这类公司一些渠道和曝光上的支持。具体有没有针对这个产品的扶持,我还不清楚,但我觉得这个方向值得留意。

现在可能也是做这类产品的一个好时机。AI 降低了开发玩法的门槛,如果再有平台的渠道和推广支持,能把硬件和玩法做好的团队,就有机会让更多人看到和买到自己的产品。

因为产品的设计,其续航不是很持久;不能切换应用,只能在电脑上才能切换应用,切换应用后数据会丢失;重新安装数据也会数据丢失。

不过,这些问题不影响我对它产品思路的认可。我觉得以后类似的产品会越来越多,先把硬件、开发方式和玩法社区做起来的团队,也更有机会积累一批愿意持续折腾的用户。至于最后能做成多大的生意,还得看后面能不能一直有好玩的东西,以及这些人玩过一阵之后,还愿不愿意继续用。

每日计划 - 行动力基于清晰力

2026-10-24 22:56:26

最近在微信读书上看了一本书,叫《认知觉醒》 ,作者周岭。

这本书写了一个观点,我觉得还是挺有启发性的。

这个观点说:读书其实不需要读完后将这本书总结一遍,而是去找一个最有感触的点,去思考、去行动、去改变。这可能是读书最有收获的一种方式。而我以前读完一本书后就会自己去整体总结一遍书中的内容,去输出一篇文章,这种方式是比较费时的,最后确实好像收获也不大。

作者提到整体总结是理性思考,找最有感触的点是感性思考。有时候,我们更需要感性思考。

这本书给我最有感触的一个点就是:作者说行动力是基于清晰力的,我们很多东西明知道要做却不做,其实就是不够清晰,要消除模糊。

而获得清晰力一个很好的办法就是做一个大概的每日计划,写下来。每日计划比较清晰,所以第二天的行动力就会更好。我实践了一下,确实挺有作用的。

不过因为作者是自由职业者,其每日计划太细了,不太适合职场人士。

在微信读书的笔记里面看到以下这种方式,我觉得还是比较适合职场人士使用。

我一直很喜欢做计划,但很多年前,我就放弃了,提前安排一整天进度条的计划。用非计划日程管理时间。

非计划日程是啥呢?就是先把一天内可预见的必定会发生的事情,列到表格上, 剩下的才是你可支配的时间。在可支配时间内,一天只关注2-3件重要的时间。

先做事情,再把完成的事及花费的时间,列到表格上。

这么做你会发现,我们可支配时间比想象中少很多,就不会盲目列很多必定完不成的事情。一天能做好2-3件重要的事情就非常好了。不要排满,因为总有机动时间去处理突发事件。

自从这样规划后,我的精力就是集中在做事情本身,不再被计划被打乱的焦虑牵扯。

安利给所有喜欢做计划,又怕计划被打乱的崽崽们

这种方式不用花太多时间就可以做好计划,着重在于自己知晓自己每日可支配时间还有多少,有时间紧迫感,再安排合适的事项。

我没有手写计划,是基于 Apple 的「提醒事项」与「日历」这 2 个软件来做的。在「提醒事项」中写「每日计划」,「日历」中可以看见历史的每日计划。

「提醒事项」截图:


「日历」截图:

读《中国历代政治得失》

2026-09-24 21:50:28

我最开始是在一位同事那里了解到这本书的。

最开始也看了一点,感觉写得比较干,讲的都是制度、官职和税收,就没继续读下去。后来因为看了《万历十五年》,我又想到了这本书。那时我正想了解明代的历史,于是先看了明朝和清朝,之后又把前面的汉朝、唐朝、宋朝都看完了。

这本书还是有很多观点,是我以前从没有想到过的。

可能很多人都和我一样,觉得中华民国建立之前,中国古代的制度大体上都是封建的、落后的、不可取的。可是钱穆这本书并不是简单地否定过去。他会把每个朝代的制度放回当时的历史条件里,看它为什么这样设计,后来又为什么产生问题。

我读完才发现,古代制度里也有不少值得细看的安排。它们后来出了问题,不等于一开始就没有道理。

在正式讲各个朝代之前,我还想先说一下钱穆对「封建」的解释。真正的封建世袭,是天子的儿子还是天子,诸侯的儿子还是诸侯,卿大夫的儿子还是卿大夫,政治身份和官位都在家族内部传下去。

秦汉以后,做官已经不再照着这套世袭办法来。钱穆往下讲汉、唐、宋、明、清,也不是把它们当成一个笼统的「封建时代」,而是逐个看政府由谁来管、权力怎样分配。我最先看的明朝,正好让我看到这种差别。

01 明朝:朱元璋废除宰相以后,皇帝承担了太多事情

明朝有一个非常重要的变化,就是朱元璋废除了宰相制度。从此以后,皇帝不再有一个正式的政府首脑来分担日常政务。

朱元璋还给其子孙留下过两条禁令:不许再立宰相,也不许太监干预政事。后来的明朝一直没有恢复宰相,太监却逐渐参与政务,甚至掌握了批红的权力。前一条守住了,后一条没有守住。

内阁一开始并不是宰相府。它更像是皇帝的秘书机构,帮助皇帝整理文件、提出意见,但没有一个名正言顺的政府领袖地位。

问题在于,国家的事情越来越多,皇帝一个人不可能真正处理完所有政务。于是内阁的权力慢慢扩大,首辅也逐渐拥有了类似宰相的实际影响力。

张居正就是其中最典型的人物。

他在事实上承担了很多宰相的工作,但在明代制度中,又没有一个正式的宰相职位来保护他的权力。换句话说,他拥有了宰相的实际权力,却没有宰相的制度名分。

所以张居正活着的时候可以推动改革,死后却很容易被清算。因为他的地位太高,权力太重,又缺少正式制度的支持。皇帝一旦改变,官僚集团就可以重新解释他的行为,把他从改革者变成权臣。

这也是明朝制度的一个矛盾:皇帝希望所有权力都集中到自己手里,但皇帝又不可能亲自处理所有事情。于是内阁、太监和官僚集团就不断填补皇帝留下的空缺。

朱元璋和朱棣都是从战争中走出来的皇帝,能力强,精力也非常旺盛。他们可以处理大量政务,也能够用强力控制整个官僚系统。

但他们的子孙未必有同样的能力和精力。

朱元璋规定每天多次上朝,试图让皇帝亲自掌握所有事情。可是到了后期,皇帝不可能永远保持这样的工作强度。有的皇帝长期不见大臣,皇帝和政府之间就需要有人传递信息,太监也因此逐渐进入权力中心。

张居正后来也必须和太监合作,才能推动自己的政治计划。这并不只是个人选择,而是明代制度结构造成的结果。

从汉、唐到明,皇权越来越集中。皇帝越来越强,正式的政府首长却越来越弱。表面上看,这是皇帝权力的加强;但从另一个角度看,也意味着整个国家越来越依赖皇帝个人的能力。

02 汉朝:地方有活力,但汉武帝的扩张消耗了国家积累

汉朝这一部分,最让我意外的是,宰相在当时竟然有这么大的权力。

我原来一直以为,皇权才是绝对的,所谓相权可能只是一个摆设,宰相也只是替皇帝办事的人。看完这本书之后才发现,钱穆说汉代宰相采用「领袖制」,由一人掌握全国行政大权,代表政府处理政务,并不是皇帝身边的秘书。

到了唐代,宰相改为「委员制」,相权分由几个部门、多人共同承担;再到明代,朱元璋废除了宰相制度。这样往后看,宰相并不是从一开始就只有一点权力,而是从一人统领全国行政,变为多人分掌,最后连这个职位也被废除了。

汉朝的地方制度,在钱穆看来有它的优点。

汉代地方行政层级相对较少,郡守的权力也比较重,地方官和中央官在品级上并没有后来那样明显的差距。这样的制度虽然仍然是中央集权,但地方并不是完全没有自主处理事务的空间。

这和后来的宋朝不同。

宋朝吸取唐末五代地方军人掌权的教训,把军权和财权更多地集中到中央。这样有助于防止地方割据,却也使地方缺少财力,遇事更难自行应对。相比之下,钱穆更推崇汉代的地方制度,认为汉代郡县层级较少,地方官也更有施展空间。

汉代还有一个值得注意的地方,就是它对工商业和资本有一定的限制。

汉武帝之前,盐铁原来原本可以由民间商人经营。但汉武帝为了对匈奴作战、经营西域,需要大量军费。国家原来的积蓄逐渐用尽,于是把盐铁经营收归政府,实行盐铁官营。

我以前一直在想,为什么古代做官的人大多从读书人里选?国家要有人能看懂政令、处理文书,也要懂一些治理的道理,所以读书会成为做官的一道门槛。

但在古代,书不像今天这么容易得到。一个人要读书,往往得有家里的条件支持。钱穆说,学问和书本是一种「变相的资本」。大家族有书,也有条件培养子弟,子弟就更容易读书、得到推荐、进入政府。

到了汉朝,察举由地方推荐人才,再由中央考核,本来不是让官位由父亲直接传给儿子。但书籍和教育的优势会在家族里延续,读书、做官的家庭更容易培养出下一代官员。钱穆认为,魏晋以后的门第社会,很大程度要追溯到汉代察举制度长期运行后的变化。

东汉末年天下大乱,中央和地方失去联系,察举无法正常进行。到了曹魏时期,朝廷改用九品中正制,把人物分成九品,再交给政府任用。这原是为了在乱世重新建立选人办法;后来评定人才越来越看重家世,使已经形成的门第势力更加固定。到了魏晋南北朝,重要的政治职位便更容易在大门第之间流转。

南北朝长期打仗,军人的地位也越来越高。门第掌握政治,军人掌握军队,双方交织在一起,使这一时期很难形成稳定的政治秩序。

03 唐朝:唐初允许上层致富,也要保证底层活下去

如果说汉朝更重视限制资本,那么唐朝前期的思路就不完全一样。

唐初通过均田制和租庸调制度,对普通人的土地和赋税作出安排。均田制简单说,就是政府按规定把田地授给农户耕种,其中一部分到一定时候要交还。租庸调则是按成年男子征收:交粮食叫「租」,交布帛叫「调」,成年男子还须服劳役,若交布帛来代替服役,所交的布帛就叫「庸」。先设法让人有田可种,再规定他们要承担多少赋税和劳役;同时,政府没有强力限制上层社会积累财富。

这不是现代意义上的计划经济,但它确实体现出一种思路:国家要保证普通人能够生活下去,同时允许有能力的人变得富裕。

这和单纯限制财富不是一回事。

一个社会如果完全不允许上层致富,经济活力可能会受到影响;但如果只允许上层致富,不管底层人的生存,社会也会越来越不稳定。

唐朝前期的均田制和租庸调,至少试图在两者之间取得平衡。

汉代的兵制,钱穆概括为「全国皆兵」。这里的「全国」主要指到了服役年龄的男子有服兵役的义务,并不是所有人都同时在军队里。

唐初实行府兵制,钱穆称之为「全兵皆农」:当兵的人平时也种田,但并非所有农民都要当兵。按书中的说法,下三等民户没有当府兵的资格,主要从愿意当兵的中、上等民户中挑选。这和汉代的「全国皆兵」正好形成对照。

唐代还有一个让我印象很深的地方,就是对阵亡士兵的抚恤。

士兵还没有回到家,政府的慰问、封赏和抚恤安排就已经下达。这样的制度,对军队士气影响很大。一个士兵知道自己战死之后,家人不会完全无人照顾,他才可能真正相信自己是在为国家作战。

钱穆在书中说,现代西方国家也在这样做;但中国唐代,早就已经这样做了。

但是,唐朝后期的问题同样来自军事。

唐玄宗时期不断对外扩张,钱穆把这种做法称为「穷兵黩武」,甚至认为它已经很像近代所说的「帝国主义」。战争不断消耗国家积累,也使人民承担越来越重的赋税负担。

唐朝设置节度使,最初的本意是加强中央对边疆和地方的控制。中央派出的官员长期驻守地方,并被授予调动军队、处理地方事务的权力。可是这种权力一旦交给地方军事长官,就可能逐渐失去中央的控制。

钱穆说,这项制度「本意在中央集权,而演变所极,却成为尾大不掉」。节度使后来拥有了过大的军政权力,安禄山、史思明等人掌握地方军队,最终反过来威胁中央,安史之乱就是这种制度演变造成的严重后果。

钱穆还特别提到,安禄山、史思明虽然名字是中国式的,也在唐朝担任边疆大吏,但按他的说法,他们其实都是「外国人」。

唐朝后期,原来的租庸调制度也难以继续维持,于是改行两税法。简单说,就是不再主要按人丁征税,而是看一个人在当地有多少土地和财产,每年分夏、秋两季征收。它是为了适应人口流动、土地买卖和户籍制度的变化,也减轻了原来的劳役负担,本身并不是一开始就要加重百姓负担。

但后来政府不断增加征收项目,茶、盐等也逐渐纳入征税。两税法又要求以货币缴税,农民需要把粮食卖掉换钱纳税,实际负担便逐渐加重。这样一来,战争造成的财政压力和赋税制度的变化叠加在一起,成为唐朝后期衰落的重要原因。

04 宋朝:养了很多兵,却不能真正使用

宋朝之前,是五代十国的军人政治。唐朝灭亡以后,军人掌握地方和中央权力,皇帝更替频繁,谁能控制军队,谁就有机会成为新的统治者。

宋朝建立在这样的历史背景下,所以它最警惕的就是武人掌权。赵匡胤本身就是军人出身,但宋朝建立以后,却反过来不断削弱武将和地方军队,把军权尽量收回中央,形成了重文轻武的制度方向。

宋朝的问题,钱穆讲得非常直接。

宋朝建立以后,面对辽、金等北方政权,军事上长期处于防守状态。它不敢轻易主动进攻,因为一旦失败,首都开封就可能直接暴露。

可是既然不能进攻,又不能裁兵,宋朝就只能长期养着大量军队。

这些军队需要财政供养,但又未必真正能够解决国防问题。于是宋朝形成了「冗兵」。

同时,因为宋朝重文,又需要养大量文官,最后又形成了「冗吏」。

军队越来越多,官员越来越多,国家的财政负担一年比一年重。钱穆的概括很有力量:弱了转贫,贫了更转弱。

宋朝并不是没有钱,而是国家的钱越来越多地被用来维持一个低效率的军事和官僚体系。

这也是为什么钱穆会说,宋朝成为一个「因养兵而亡国的朝代」。

宋朝的优点,是它尊重知识分子,给读书人留下了比较大的政治议论空间。台谏制度和士大夫清议,使官员能够公开讨论政策,甚至批评政府。

但是,尊重知识分子并不等于军事实力强大。

宋代社会一方面重视文化,另一方面又轻视武人,最后形成了「好铁不打钉,好男不当兵」这样的社会观念。

所以宋朝的悲剧在于:它有非常发达的文化和知识体系,却没有建立起与之相匹配的军事和财政制度。

05 清朝:一个部族政权如何控制知识分子

清朝和汉、唐、宋不一样。

钱穆把清朝看成一种部族政权。基本就是满族人、蒙古人、汉人三个等级,满洲人在政治权力和军事组织中拥有特殊地位。

清朝的统治,不只是皇帝个人统治,还依赖整个满洲贵族和部族军事体系。

因此,清朝对汉族知识分子的控制也更加严密。

文字狱、科举限制、对书籍和结社的管理,实际上都在限制知识分子的独立思考能力。科举制度表面上仍然存在,但它不再只是选拔和吸收人才,也承担了安抚、控制和规训知识分子的功能。

这会造成一个问题:底层人民可能有反抗的力量,但未必有组织和制度建设的能力;知识分子有文化和组织能力,却长期被制度驯化,失去了独立行动的空间。

太平天国就是一个例子。它有很强的动员能力,也能够迅速占领大片土地,但在建立稳定政府、设计合理制度方面非常薄弱。

清朝后来之所以重新重用曾国藩、李鸿章等汉人官员,也是因为太平天国战争使清政府发现,单靠满洲旧有的军事体系已经无法应对全国性危机。

至于清朝末期应该改革还是革命,这也是书里非常重要的一个问题。

康有为主张变法,希望保留清朝的统治框架,在这个框架里进行制度改革。他认为,只要光绪皇帝能够支持自己的方案,清朝就可以通过改革重新振作起来。

但钱穆认为,康有为的问题在于「只看到了制度,没有看到主权」。清朝并不是皇帝一个人的政权,而是满洲部族支持下的部族政权。光绪皇帝即使愿意改革,也无法只凭个人意志改变背后的统治集团。

所以钱穆认为,清朝不能只靠改革,必须先通过革命改变政治主权,再进行制度建设。孙中山所主张的,正是先革命,废除原来的皇位传袭和部族统治基础,然后再讨论国家制度应该怎样建立。

这不是说革命以后就不需要改革,而是说在清朝当时的权力结构下,光靠皇帝支持的改革不可能真正解决问题。

清代地方行政中还存在一种「胥吏政治」的问题。它最主要的问题,是把「有名分的人」和「真正办事的人」分开了。

明清以后,官和吏逐渐分流,变成两条不同的道路。官员负责名义上的决策和管理,胥吏、师爷则负责具体的文书和行政事务;但胥吏虽然熟悉地方事务,却很难通过正常渠道转为官,上升的通道被堵住了。

这样一来,真正熟悉具体事务的人没有正式的政治地位和上升空间,名义上负责的人又未必真正掌握事情,权力、责任和能力就被分开了。地方行政容易变成胥吏掌握办事流程,官员承担名义责任的「文书政治」。

钱穆说,明清地方行政官大都是「管官的,不是管事的」,事情都交给师爷和胥吏去办。这就是官吏分流最后造成的问题。

06 从古代税收,看今天的财政

读完这本书之后,我越来越觉得,判断一个政府是否健康,不能只看它有没有强大的军队,也不能只看它的 GDP 增长。

还要看普通人是不是越来越难以生活,国家的财政是不是建立在长期透支之上。

汉武帝时期,战争消耗了国家积累,政府于是加强盐铁控制。唐朝后期,军事扩张和藩镇体系加重了国家负担。宋朝则因为长期养兵,形成冗兵冗吏,财政越来越贫弱。

这些问题表面上不同,但背后有一个共同点:政府为了维持某种制度目标,不断增加支出,最后把成本转嫁给社会。

读到这里,我也会想:今天政府的钱,主要是从哪里来的?

以 2025 年为例,中国全国税收收入约 17.6 万亿元,其中,国内增值税约占 39%,企业所得税约占 23%,个人所得税约占 9%。增值税和企业所得税是大头,个税的占比小得多。

美国 2025 财年联邦收入约 5.2 万亿美元,个人所得税约占一半,工资税约占三分之一。美国的第一大来源是个人所得税,工资税也占相当大的比重。

中国这里看的是全国税收,美国这里看的是联邦收入,统计范围并不完全一样。但至少可以看出两边的收入重心:中国更多从商品交易和企业经营环节收税,美国联邦政府则更多从个人收入和工资环节取得收入。

07 中西政治为什么走上不同的路

读到最后,我又想到西方政治和中国历代政治的差别。两边面对的国家规模、社会结构和经济条件不同,政治制度自然不会沿着同一条路发展。

西方一些政治制度,最早和城邦、地方自治有关。地方团体和城市共同体先发展起来;到了近代,工商业和资本发展,又带来了新的政治要求。

中国秦汉以后长期要治理一个幅员辽阔的农业社会,面对的是大量人口、土地和地方行政问题。所以中国的政治传统,更重视统一、选官和地方管理。

因此,不能拿西方的某一种政治制度,直接判断中国历代政治的得失。两边的制度都不是凭空出现的,背后各有自己的社会基础。

西方近代革命,还有一个重要特点:工商业和资本先发展起来,但拥有财富的人未必拥有政治权力。

中国古代则有些不同。中国通过察举、科举和读书人入仕,把大量知识分子吸收到政府中。读书人可以获得政治权力,但普通人和知识分子未必有独立的经济基础。

也就是说,西方的问题更像是「有钱但没有权」,中国古代的问题更像是「有机会获得权,但财富和社会资源不足」。

这两条道路最后形成了不同的政治冲突。

过去我们喜欢用「帝国主义」「封建主义」这样的词,一次性概括几千年的历史。但真正去读这本书之后,会发现这些词太大了。

汉武帝时期的对外战争,唐玄宗时期的军事扩张,可以被看成一种强烈的帝国扩张;但中国历史上也有很多时期主要是在内部整合,并不能全部用同一个词解释。

钱穆还用英国统治香港和印度来解释另一种「帝国主义」:英国本土有议会,有自己的民主和自治,但殖民地没有同等的政治权利。书里说,殖民地总督名义上由英国国王任命,而不是由代表民意的议会选出;实际人选也有英国政府参与,更不是由殖民地居民自己决定。英国本土有通过议会参与政治的渠道,殖民地的人却不能以同样的方式决定谁来治理自己,这就是两边的差别。

制度的好坏,也不能只看它最后有没有灭亡。一个制度在某个时期可能有效,在另一个时期可能失效;同一个制度,换一个皇帝、换一种财政状况、换一种社会结构,结果也可能完全不同。

这大概就是《中国历代政治得失》最值得看的地方。

它不是简单告诉我们哪个朝代好、哪个朝代坏,而是让我们看到:一个国家真正的得失,往往不在于它有没有一个英明的皇帝,而在于制度能不能长期运行,权力能不能受到约束,普通人能不能承受它的成本。

而一个社会真正危险的时候,通常不是政府一开始出现问题,而是政府已经没有能力修正问题,却还在不断要求普通人承担更多代价。

AI 写下的那把 Redis 锁

2026-09-08 21:51:22

配套代码:transaction-lock-demo。文中的代码位置都可以直接跳转到 GitHub 查看。

一个具体的技术问题

最近看 AI 写的一段后台代码时,我遇到一个具体、也很容易被忽略的技术问题。

代码里有这样一行:

HjEventDtos.CreateResult result = lockService.inTransaction(
idemKey, () -> {
// 创建活动
// 创建行程
return result;
});

方法名叫 inTransaction,第一眼看起来只是「把操作放进数据库事务」。但继续看它的实现,才发现它先获取了一把 Redis 分布式锁,然后才开启数据库事务:

public <T> T inTransaction(String key, Supplier<T> action) {
RLock lock = redissonClient.getLock("activity:" + key);
lock.lock();
try {
return transactionTemplate.execute(status -> action.get());
} finally {
lock.unlock();
}
}

也就是说,它实际做的是:

Redis 分布式锁
└─ 数据库事务

这把锁不一定有问题。原来的系统是一个后台管理系统,操作人数不多,同一活动很少被多人同时修改。用一把活动级锁,简单,也可能足够安全。

但我还是停了下来:

这段代码是真的需要 Redis 锁,还是 AI 只是习惯性地加了一把「大锁」?

这个后台到底在做什么

这个 demo 模拟一个活动运营后台,里面有几种常见操作:

  • 运营人员创建活动并维护签到、分享等行程,活动和行程必须一起保存。
  • 用户报名时占用「场次 + 区域」的额度,已用人数不能超过总额度。
  • 管理员修改运营人员的权限,但已经停用的权限不能继续修改。
  • 活动产生报名后不能直接删除,删除和报名不能互相绕过。
  • 创建请求可能因为双击或网络重试重复到达,相同请求在 60 秒内只能创建一场活动。

我让 AI 做了一个小实验

为了把这个问题看清楚,我没有继续在原系统里大范围改动,而是抽出一个独立的活动报名后台。然后,我让 AI 针对上面的业务规则,分别给出不同版本:

业务问题 采用的方式
修改一条活动记录 一条原子 UPDATE
同时修改活动和行程 只使用数据库事务
多人抢最后一个名额 条件 UPDATE
修改权限前检查权限状态 事务加精确行锁
删除活动前检查报名记录 事务加活动父记录锁
重复提交创建请求 Redis 请求锁加数据库事务

这六个版本不是为了凑齐六种技术。它们来自六种不同的业务问题。

从几个例子看差别

一条 SQL:不需要为了「安全感」加大锁

修改活动名称和地址时,数据库只需要执行一条更新:

UPDATE activity_event
SET name = ?, address = ?
WHERE id = ? AND deleted = 0;

代码位置:业务方法 updateSingleRow,SQL 方法 updateEvent。

InnoDB 会自动对命中的行加写锁。这里不需要再用活动级 Redis 锁来证明「这条 SQL 不会被同时执行」。

当然,自动行锁也不是万能的。如果两个请求先读取旧对象,再把完整对象写回,仍然可能出现旧值覆盖。这时应该考虑版本号、字段级更新或 FOR UPDATE。

错误情况可以这样发生:

事务 A:读到 name=旧名称、address=旧地址
事务 B:也读到同一份旧对象
事务 A:把 name 改成「技术交流会」,写回 name + address,提交
事务 B:把 address 改成「上海徐汇」,仍把旧 name 一起写回,提交
结果:A 的新名称被 B 覆盖

这里的行锁只保证两次写入不会在同一时刻改同一行,并不能保证 B 写回的对象仍然是最新版本。要避免这种丢更新,可以只更新实际变化的字段,或增加 version 条件。

多张表:事务解决的是共同提交

保存活动时,还要删除旧行程并写入新行程。这里最重要的规则是:

活动更新成功,行程更新也必须成功

用一个数据库事务就可以保证共同提交或共同回滚。不需要因为操作涉及两张表,就顺手再加一把活动级 Redis 锁。

代码位置:事务方法 updateEventAndItinerary,替换行程的 SQL。

错误情况不一定来自并发,也可能来自中途失败:

操作 A:更新 activity_event,成功并自动提交
操作 A:删除旧行程
操作 A:插入新行程时因为数据错误失败
结果:活动基础信息已经变更,但行程只删了一部分,留下半成品

事务的作用是让这几步一起成功或一起回滚;它不等于自动把不同请求串行化。

额度:把判断和修改放到一起

先查询额度,再在 Java 里加一,容易发生这种情况:

请求 A 查到还剩一个名额
请求 B 也查到还剩一个名额
A 报名成功
B 也报名成功

更直接的写法是:

UPDATE activity_quota
SET used_quota = used_quota + 1
WHERE session_id = ?
AND region_id = ?
AND used_quota < total_quota;

代码位置:额度服务 consume,条件更新 SQL。

数据库在一条语句里完成判断和修改。Service 只检查受影响行数。这比先加一把活动大锁更贴近真正的业务规则。

如果把判断放在 SQL 外面,两个事务就可能同时通过检查:

事务 A:查询到还剩 1 个名额,暂停
事务 B:也查询到还剩 1 个名额,暂停
事务 A:报名并把 used_quota 加 1,提交
事务 B:也报名并把 used_quota 加 1,提交
结果:两个请求都认为自己成功,实际报名数超过 total_quota

used_quota < total_quota 必须和自增放在同一条条件更新里,不能依赖两次独立操作之间「应该不会撞上」。

需要先读、再检查、再改:精确锁一行

管理员修改权限前,要确认权限仍然有效。这个过程不能被另一个操作插入:

读取权限 → 检查状态 → 修改角色

因此可以在事务中锁住这一条权限:

SELECT id, event_id, employee_id, role_name, status
FROM activity_permission
WHERE id = ?
FOR UPDATE;

代码位置:权限业务方法 changeRole,带 FOR UPDATE 的查询。

这里锁的是一条权限记录,不是整个活动。

如果只是普通查询,可能出现这样的交错:

事务 A:查到权限状态为 ACTIVE,准备改角色
事务 B:把同一条权限改为 DISABLED,提交
事务 A:没有重新检查,继续把角色改成 EDITOR,提交
结果:已经停用的权限仍被修改,A 的检查结果已经过期

FOR UPDATE 让 A 的「读取、检查、修改」成为一个受保护的过程;B 要等 A 结束后才能修改这条权限。

规则跨越多张表:锁一个父记录

删除活动前,需要确认报名表里没有报名记录:

锁活动记录
→ 查询报名记录
→ 没有报名才允许删除

活动记录在这里是父记录和共同互斥点。新增报名也必须先锁同一条活动记录。这样删除和报名才会遵守同一条规则。

代码位置:删除流程 deleteIfNoRegistrations,报名流程 register,锁活动父记录。

如果删除和报名都只使用普通查询,错误交错可能是:

事务 A:查询报名表,发现还没有报名,暂停
事务 B:插入一条报名记录并提交
事务 A:继续把活动标记为已删除并提交
结果:活动已经删除,但报名记录仍然存在,违反「有报名不能删除」

锁住父记录本身还不够,新增报名和删除活动两条路径都必须先锁同一条父记录;只在其中一条路径加锁,规则仍然可能被绕过。

父记录锁的重点不是数据库天然知道「这些表属于一个聚合」,而是所有相关代码共同遵守一个约定。

创建前没有记录:Redis 才有用武之地

活动还没有创建时,没有活动 ID 可以拿来执行 FOR UPDATE。如果两个应用节点同时收到相同创建请求,就可以用「操作人 + 请求内容」生成指纹,让相同请求竞争同一把 Redis 锁。

流程是:

锁外检查结果
→ 获取请求指纹对应的 Redis 锁
→ 锁内再次检查结果
→ 事务中创建活动和行程
→ 保存 60 秒结果
→ 释放锁

代码位置:完整创建流程 create,生成请求指纹。

这里使用 Redis 锁是因为「创建前没有数据库记录」,而不是因为 Redis 锁比数据库锁更高级。

错误情况有两种常见写法。第一种是完全不加锁:

请求 A:检查 60 秒结果,未找到
请求 B:也检查不到结果
请求 A:创建活动 A,保存结果
请求 B:创建活动 B,保存结果
结果:同一个请求创建了两场活动

第二种是加了锁,却忘了锁内再次检查:

请求 A:拿到锁,创建活动 A,保存结果,释放锁
请求 B:随后拿到锁,但没有再次检查,创建活动 B
结果:锁只让操作排队,没有实现幂等

所以「锁内二次检查」不是重复代码,而是把等待期间已经发生的结果读回来。

后来我对原代码的看法

回头看,原来的活动级 Redis 锁并不能简单地贴上「错误」标签。

对于一个并发量不高的后台系统,它可能是一个简单的工程取舍;但如果同一个活动下的修改、额度和权限都共用这把锁,原本可以并发的操作也会被迫排队。是否保留它,关键还是看它保护的业务规则,以及数据库能不能用更小的范围表达这条规则。

最后

这次只是从一把 Redis 锁开始追问:AI 写出的代码能够运行,还要看得懂它为什么这样设计。掌握这些基本原理,才能更好地判断、修改和使用 AI 写出的代码。