书评:《那不勒斯四部曲》

这四本书是花了十多天一口气读完的,因此也就放在一起写一写。这本书像一部不怎么严肃的意大利近当代史诗,着眼于两个女性的成长——拉法埃拉·赛鲁罗和埃莱娜·格雷科,也即莉拉和莱农,在半个多世纪的荏苒中讨论了童年、友情、亲情、爱情、女性权利、意识形态、社会变迁等等话题。这本书长篇累牍,让我总是不想开始读,直到看到腰封上的 “我的整个生命,只是一场为了提升社会地位的低俗斗争” 这句话——以前听到过这句话,但是这时才知道是出自这本书,于是决定立刻开始读。

第一本书是《我的天才女友》,“天才女友” 指的是莱农(也就是 “我”)从小的朋友莉拉,主要内容是两个人和她们生活的世界在童年和青春期的故事,截止到莉拉的婚礼。

第二本书是《新名字的故事》大概是指莉拉在嫁给斯特凡诺·阿奇勒之后的新名字 “拉法埃拉·阿奇勒”

第三本书是《离开的,留下的》

第四本书是《失踪的孩子》

这本书并不想庸俗地表达什么 “垃圾堆里的百合花” 之类的主题,书中的人物包括主角都并不特别坏也不特别好,刨去事业因素来看就是极其普通的人,这也就让这本书有了在现实中扎根的立足点。

莉拉是一个疏离的人,一个漫不经心的,找不到方向的天才,意识游离在自己的灵魂之外,并不爱自己。莉拉因为家庭因素并没有继续读书,把自己的另一个可能性,自己真正喜欢的另一个可能性寄托在了莱农身上。

阅读更多

2023 年 01 月书单

书名 作者 作者国籍 出版社 类型 评分
潜规则 吴思 中国 复旦大学出版社 社会科学-政治军事 8.5
中国国家地理百科全书:河南、湖北、湖南 张妙弟 中国 北京联合出版公司 自然科学-科学普及 5.0

Docker Multi-Stage Builds

Docker 的 multi-stage 技术可以把不同的构建阶段分离开,方便修改和复用,同时还能更好地把缓存层组合在一起,避免重复劳动,还能保证最后运行时的干净纯粹,不会带入前边阶段的副产品。不过我在实际场景中遇到的问题比单纯的构建更加复杂一些——我不仅需要不同的构建阶段(build stage),还需要在不同的环境里构建同一个镜像,比如在本地和在 CI/CD 中。CI/CD 的特殊之处在于在前边的阶段中基本上已经完成了 dependency download, build, package 等一系列阶段,因此直接把 build 的结果拷贝到 Docker context 里执行 Dockerfile 的最后几步就可以了。如果复用一个 Dockerfile,那么基本上要做前边的很多重复工作,如果用两份 Dockerfile,则又会造成配置上的冗余,迟早会出幺蛾子。

为了解决这个问题,我打算使用 Docker 的 multi-stage 来做,本意是把 package 之后的几步合并到一个 stage 里,在前边的 build 阶段来区分不同的环境。就像下边的配置一样,设想中这个流程非常完美,Docker 可以根据 ENVIRONMENT 来区分不同的环境,并且在最后的 runtime 阶段中从不同的环境构建阶段中把二进制内容拷贝出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
FROM ubuntu:22.04 AS build-base
FROM ubuntu:22.04 AS runtime-base

# 当前环境
ARG ENVIRONMENT=dev

# 本地构建阶段
FROM build-base AS build-dev
RUN build
RUN package
RUN cp . /app

# CI/CD 构建阶段
FROM build-base AS build-prod
COPY . /app

# 最终阶段
FROM runtime-base AS runtime
COPY --from=build-${ENVIRONMENT} /app /app
ENTRYPOINT [ "/app/main" ]

但是这样做有个非常大的问题就是 Docker 的 build arguments 是只在单个阶段之内管用的,因此倒数第二行的 COPY 压根不认识 ENVIRONMENT 这个变量,进而这个 Dockerfile 根本无法正常构建。找了很多解决方案,最终看到虽然在 Docker 某一个阶段内不认识其他阶段的 build arguments,但是在定义阶段本身的时候是可以复用的,也就是 FROM runtime-base AS runtime 这一行,在这里是可以用 ENVIRONMENT 这个变量的。因此思路就很清晰了,可以直接改成下边这种情形:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM ubuntu:22.04 AS build-base
FROM ubuntu:22.04 AS runtime-base

# 当前环境
ARG ENVIRONMENT=dev

# 本地构建阶段
FROM build-base AS build-dev
RUN build
RUN package
RUN cp . /app

# CI/CD 构建阶段
FROM build-base AS build-prod
COPY . /app

# 最终阶段
FROM build-${ENVIRONMENT} AS runtime
ENTRYPOINT [ "/app/main" ]

但这样有个最大的问题,就是最后的 runtime 阶段直接继承前边 build 阶段,会把这些阶段运行过程中的副产品、垃圾文件和系统包带到最后,这显然极大地违背了 multi-stage 的初衷。继承还是要继承的,关键是不能从 build 阶段继承,那么自然而然地就想到再加上一层干净的 ready 阶段来过渡,保证 ready 阶段中的内容是纯粹的二进制,每个环境都有自己对应的 ready 阶段,然后分别把自己的二进制拷贝进去就行,如下配置:

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
FROM ubuntu:22.04 AS build-base
FROM ubuntu:22.04 AS runtime-base

# 当前环境
ARG ENVIRONMENT=dev

# 本地构建阶段
FROM build-base AS build-dev
RUN build
RUN package
RUN cp . /app

# CI/CD 构建阶段
FROM build-base AS build-prod
COPY . /app

# 本地准备阶段
FROM runtime-base AS ready-dev
COPY --from=build-dev /app /app

# CI/CD 准备阶段
FROM runtime-base AS ready-prod
COPY --from=build-prod /app /app

# 最终阶段
FROM ready-${ENVIRONMENT} AS runtime
ENTRYPOINT [ "/app/main" ]

这样就可以完美地解决上边的所有问题,除了多出两个几乎一样的 build stages 以外没有什么成本。只要在执行 docker build 的时候传进入对应的 ENVIRONMENT 参数就行。还要注意的是,一定要使用 Docker Buildkit 来执行,这样才会根据最后的 runtime 阶段有挑选地执行需要的阶段,否则 Docker 会傻乎乎地执行所有的阶段,这样就得不偿失了。

2022 年 12 月书单

书名 作者 作者国籍 出版社 类型 评分
克拉拉与太阳 石黑一雄 英国 上海译文出版社 文学名著-外国文学 7.0
隳三都:蒙古灭金围城史 周思成 中国 山西人民出版社 品读历史-专题研究 8.5
海边的卡夫卡 村上春树 日本 上海译文出版社 文学名著-外国文学 7.0
我们台湾这些年:一个台湾青年写给13亿大陆同胞的一封家书 廖信忠 中国台湾 重庆出版集团 社会科学-世界格局 7.5
了凡四训:中华人生智慧经典 袁了凡 明朝 中华书局 文学名著-古代文学 7.0
鹿川有许多粪 李沧东 韩国 武汉大学出版社 文学名著-外国文学 6.5
失明症漫记 若泽·萨拉马戈 葡萄牙 南海出版公司 文学名著-外国文学 9.5
错把妻子当帽子 奥利弗·萨克斯 美国 中信出版社 自然科学-科学普及 7.0
喜:一个秦吏和他的世界 鲁西奇 中国 北京日报出版社 品读历史-专题研究 7.5

书评:《了凡四训:中华人生智慧经典》

“命由我作

福自己求”

短小精悍的四篇文章,分别覆盖了立命、改过、积善和谦德四个方面。有趣的地方是这几篇文章不是围绕中国古代朴素的哲学观念来论证的,而是糅杂了儒释道三家之说,谈及某一话题时哪个趁手就用哪家之言。这种思想兼容的趋势越到近古越是明显。比如在《立命》篇中,既谈到了道家命术,也有释家 “修来世” 之说,还请来了《易》和《孟子》来辅助强化,整体风格竟颇为圆融。

全文的中心是颇有 “圣人之德” 的意味的:为生民立命,君子修德有盛名,今生阴德荫子孙,终生自省不断改过,君子谦谦等等,总结下来就是那句 “命由我作,福自己求”。所以在我看来,儒释道三家之言本质上还是为引出和强化孔孟之道,这仍然是一篇放在唐宋时期也并不违和的经典古文。

不过这是一篇原文加评注的综合之作,因而实际上【注释】、【译文】和【评注】占据了绝大多数的内容。通篇看下来注者也不免有水字数之嫌,虽然评注中有大量的内容,很是能补充二氏之学的知识背景,但终究与译文部分有着高度的重叠性,甚至很大一部分的评注都是直接抄了一遍译文,以此看来书中大概有三分之一强的篇幅都是重复内容。

了凡先生这四篇文章是值得反复读的,甚至背诵也不为过,尤其是对于高中生而言。不过再读时只读原文加上有限的注释就可以了,评注可免矣。

阅读更多

书评:《克拉拉与太阳》

人工朋友(AF, Artificial Friend)克拉拉在商店橱窗里等到了自己的主人乔西。作为以阳光为能量的机器人而言,克拉拉对于太阳有着强烈的信仰,她依赖太阳,信任太阳,向太阳许愿。主人乔西是一位体弱多病的少女,虽然对于克拉拉而言乔西是特别的,但是纵观全文乔西实在是一个非常普通的人:脾气多变,有时甚至于刻薄,同时性格坚毅,情感丰沛。剧情虽然发生在 “未来”,但是几乎并不和任何科幻元素相关,这只是方便塑造克拉拉这一 “假人” 的角色,以及乔西和里克、里克和其他 “提升人” 之间的身份差异。

剧情上的冲突和爆发点有几个:克拉拉和乔西的相遇,乔西家的派对,乔西和里克的决裂与和好,克拉拉跟着 “母亲” 去看瀑布,克拉拉对太阳许愿,乔西病情加重,父亲的出现和克拉拉真实用途的揭露,破坏库廷斯机器,以及最后克拉拉在垃圾回收站回忆前边所有的剧情。克拉拉抱着一个服务者的心态进入乔西家,慢慢融入这个表面和内里都不和谐、却在底层隐藏着深深的爱的家庭,克拉拉为了乔西真心向太阳许愿,并不惜损坏自己也要破坏掩盖太阳的凶手——库廷斯机器,最后克拉拉发现自己进入这个家庭很有可能是来成为乔西的代替者的,一切的铺垫自此全部揭开。最后回忆慢慢拉回到现实,克拉拉躺在垃圾回收站,遇到了自己在商店时的 “经理”,在对话中结束了全书。

克拉拉作为一个感情是模拟来的机器人,却道出了人类内心的真谛:“但如今我相信,他是找错了地方。那里真有一样非常特别的东西,但不是在乔西的心里面,而是在那些爱她的人的心里面。”

整本书没有特别跌宕的剧情,也没有什么硬伤,就是一个平淡温馨的故事,有种看完一部平淡的豆瓣高分电影的感觉,说实话并不是特别对我的胃口。不过倘若书荒那么本书也是一个不错的选择。

阅读更多

书评:《喜:一个秦吏和他的世界》

不得不说这本书的名字定得非常有趣,历史的视角从来都是大开大合地瞄准皇城深宅之中,从个体角度来审视某个朝代的书非常少(近年来这类书渐渐多了起来,比如谌旭彬的《活在洪武时代:朱元璋治下小人物的命运》,罗新的《漫长的余生:一个北魏宫女和她的时代》,马伯庸的《长安的荔枝》等等)。本书中作者通过大量的秦简和文献剖析了秦帝国治下安陆城和鄢县的一个小吏喜的生平,进而也不失客观地系统介绍了秦帝国的家庭关系、社会结构、风俗习惯、官吏设置等等方面,虽然正文中的考据部分实在是太多了些,但仍不失为一本有趣且涨知识的书。

睡虎地的秦简是秦朝的第一手资料,作为一个 “治狱令史”,喜的的遗体旁摆放了大量的秦简,有记录了当时很多案件的《封诊式》,有浸透着家族传承的《为吏之道》,也有巨细靡遗的《秦律》。看着书中贴出的几张秦简图片真的有种恍惚的感觉,其中相当一部分文字甚至不需辨认就能直接认出,难以想象其与我们隔了两千年的光阴。也多亏了这些秦简和作者不懈的考证,很多历史书不屑一顾的琐碎小知识得被众人看到:秦人的身高、房子、两性关系、家庭组成、社会结构,乃至书信往来中的语言习惯等等都能在这本书中发现,还有政治制度、官吏设置、讼狱流程等等国家层面的框架结构也可以从不同的角度(确切地说是自下而上的角度)加以审视。书中内容非常丰富,能吸收十之二三已经算得上收获颇丰了。

如果要挑一个毛病的话,就是本书的考据太多太多了,不仅注释独占一大章,约为全书四分之一的篇幅,而且在正文中也往往为了一个定量的细节动辄贴上好几页的各方考据资料(比如在描写喜的家有几房几厅时就侧面考据了其他家庭的情况,既而合理地推断出了喜的家庭状况),这就使得阅读体验有了一定的割裂感。看到豆瓣上对此书的评价不太高也多是这个原因。不过我对此还好,比之这个月看的《了凡四训:中华人生智慧经典》中为了水字数而重复贴上的注释,《喜》这本书的考据多一些也并不是什么大问题,毕竟这些考据如果不在正文中而是贴在注释中估计我就一翻而过,不会认真看了,也少了很多深入了解秦朝的机会。

这是一本挺有趣的书,脱离了始皇帝和李斯赵高这一系列高堂之上的符号,秦朝从一个小吏的眼中看出去并没有太多 “封建”、“第一帝”、“扫六合”、“短命” 之类的历史符号,而是有血有肉、有碌碌众人、有人情世故、有希望、也有痛苦,正如今天的我们看待我们所处的时代一样,没有历史,只有生活本身罢了。

阅读更多

书评:《我们台湾这些年:一个台湾青年写给13亿大陆同胞的一封家书》

台湾对我而言是一个陌生又熟悉的地方。无论是在电视新闻、影视作品还是各种教材中,台湾都是相当重要且敏感的一个话题,台湾的流行文化乃至很多俗语口癖都在大陆以各种形式流传。但是倘若深入到台湾的政治格局和近代历史,则很难在上述的各种渠道中系统地获得。这本书条理地,甚至于啰嗦地一一罗列了台湾这几十年来发生的大事小情,从中能够看到一个更加立体和丰满的台湾。

本书读来很难沉浸,各种事件之间本就没有内禀逻辑,中断感十足,不过这也恰是本书的一个优点——可以作为碎片化阅读的绝佳素材。有时读到某些情节时都不由轻笑,感慨台湾果然是我国不可分割的一部分,当地人的所思所想还有各种场景真的太有即视感了,比如老师交代学生在应对教育部门检查时该怎么回答,又比如政治书中的某些固定表达,又比如戒严了三十多年之后开始解严等等。本以为台湾要比大陆早很多年开始在各种方面飞速发展,没想到两岸的发展节奏竟然这么类似,很难说是冤家路窄还是血浓于水了。

这本书挺适合在 “厕上枕上马上” 读,一来可以补充一下相关的知识,二来书中语言活泼轻快,也是打发时间的不错的选择。

阅读更多