2026-01-07 08:00:00
不是读书总结,只是一点数据复盘。
看 NeoDB 年终总结 页面时意识到可以自行改年份看往年数据,于是把前两年的拉出来对比了下。
| 年份 | 书 | 影 | 剧 | 音 | 戏 |
|---|---|---|---|---|---|
| 2023 | 155 | 4 | 1 | 24 | Null |
| 2024 | 99 | 4 | Null | 16 | 6 |
| 2025 | 249 | 1 | 5 | 10 | Null |



看起来数字变动很大,不过实际阅读数字应该相差并不太多,23 年有 40 来本漫画/绘本,24 年则是有套 14 册的医学科普只能在 NeoDB 标记成一本,25 年数字唬人,实则有超过一半是绘本/漫画,加加减减凑下来,文字为主的书每年都是 100 左右。
2025 读过 249(不含网文和同人),中文 70 多,英文 170 上下(纯文字大概 30+),此外有几本无字绘本,两本西班牙语识字绘本,以及一本德语自然图鉴(不认识字,纯看图)。
书籍类型,虚构类(小说/戏剧)14,绘本 140 左右?(数不过来了),余下都是非虚构。
书籍形式,全面拥抱电子化和图书馆的一年。实体书 19 本,一多半借自图书馆,自有的几本看完全部卖出。中文电子书,Z-Library/Anna’s Archive、微信读书(下半年几乎没用),以及本地图书馆电子库(只能用微信小程序在手机上看,非常让人恼火)。英文电子书,绘本全部借自 Libby,文字为主的英文书大部分 Anna’s Archive,小部分 Libby,另外很多英文书我会电子书和有声书交错着读,有声书也多半借自 Libby。
阅读体验(评分)。五星我向来十分吝啬,要十足喜爱或震撼才会打出这个分数,有十本,不过绘本我明显手松了点,现在回头盘点会发现有些五星还是差些火候。四星和三星分别是 30+ 和 40+。两星则是史上最多,14 本。剩下的大批只标记了读过没有打分,绘本类是因为翻得太快过于囫囵吞枣,文字类则是有些为难,卡在聊可一读和勉强推荐的界限中间,读完不至于骂街,不读好像损失也不大,索性就都不评分了。这样看来多数是在 3-3.5 的这个区间,所以说五星制不科学嘛!一星空缺,差到这份上的我必然是不会读了。
列完数字聊聊纯主观的感受。2025 好像没有太多让我非常兴奋的书,这是没办法的事,读得多了标准不可能不提高。所以相伴而来的就是,我似乎读了太多纯打发时间的书,但如果让我再选一次,可能我还是会读,不是这本就是那本,我总得需要点东西塞进我的脑子和耳朵。另一个需要反省的点是,我还是读得太东一榔头西一棒子了,2026 在消遣性阅读之外,应该有一份学习书单和几个更体系化更主题性的阅读。
此外,我真的需要看这么多绘本吗?其实 2025 年之所以会看这么多,纯粹是因为中文书看得少了(懒得去下资源),Libby 全是英文书,我的英语又还没有好到随便打开一本英文就能无痛读下去,可不读东西我又难受,这时绘本就成了消遣放松的不二之选。当然我不是说绘本没有好作品,有几位作者我确实会长期关注,但──我还是更想读体量更大一点的东西。此时怨念就成了到底何年何月我的英语才能好到可以不假思索像翻开任意中文书那样唰唰往下刷进度呢。不过话说回来,虚构作品我还是喜欢读中文,尤其是同人或者网文,中文的美感和情绪共振英语很难带给我。所以我的英文阅读几乎全是集中在非虚构上,自然或者科普,专有词汇不少,速度就更难提起来。
至于阅读记录,2026 我应该不会像过去几年一样按月份逐本点评了。读过的很多想写更详细的书评,可2025 每个月少则十几多则三十的数量根本让我赶不过来进度,在读和写之间我大部分又会选择再看本新的(不过 25 年的记录我还是会补完的,可能在农历年前吧)。新年的第一天我还想今年不要读那么多,把步调放慢,结果才七号,又读完十本了。对自己完全无可奈何。或者说,我应该要克制尝鲜的念头,而去啃一些更需要脑力和精力的大部头,不能只追求纯粹的愉悦和消遣。
最后,丢一个毫无用处的 2025 读过列表,实在是有数据在手就忍不住想把它晒出来。
| 2025 读过(倒序) |
|---|
| 躁郁之心 |
| Round: A Whimsical Picture Book About Discovery in Nature for Kids |
| The Tea Party in the Woods |
| Tigers Between Empires |
| Rapido y Lento/Fast And Slow |
| One Day This Tree Will Fall |
| How Does Santa Go Down the Chimney? |
| DON’T TRUST FISH |
| Hello, is this planet Earth? |
| Hurricane |
| Here is New York |
| Father Christmas |
| Los pequeños |
| I Am We: How Crows Come Together to Survive |
| Little Shrew |
| The Storm |
| Mushroom Hunting: Forage for Fungi and Connect with the Earth |
| 山川纪行 |
| The Night Walk |
| 今天也要好好地过 |
| Hello, Earth! |
| How to Be a Woman Online |
| What You Need to be Warm |
| Everything & Everywhere |
| Brother Eagle, Sister Sky |
| 打破社交媒体棱镜 |
| A Stone Is a Story |
| Pocket Nature Series: Cloud Spotting |
| Sam and Dave Dig a Hole |
| Du Iz Tak? |
| 给智人的极简人类进化史 |
| We Are Starlings: Inside the Mesmerizing Magic of a Murmuration |
| 游牧的智慧 |
| A Walk in the Woods |
| Whale Fall: Exploring an Ocean-Floor Ecosystem |
| Beastly Puzzles |
| Woe: A Housecat’s Story of Despair |
| Fox: A Circle of Life Story |
| The Museum of Odd Body Leftovers |
| 鱼不存在 |
| The Conference of the Birds by Peter Sis |
| You Belong Here |
| Plasticus Maritimus: An Invasive Species |
| Keeping the City Going |
| This Is Orange: A Field Trip Through Color |
| Fluent Forever |
| Elizabeth, Queen of the Seas |
| Raising Hare |
| The Little Wooden Robot and the Log Princess |
| Big And Small/Grande y Pequeno |
| Moonshot |
| 隐性疲劳 |
| 破形记 |
| Fungarium |
| The Way Home in the Night |
| Pimsleur Japanese Level 1 Lessons 1-5 |
| To see an owl |
| Grumpy Monkey |
| I Am Wind: An Autobiography |
| Kunstformen der Natur. Sonderausgabe. |
| 源自尘埃的世界 |
| 松鼠先生和月亮 |
| Beaks! |
| The Strangest Thing in the Sea |
| Polar |
| 陌生的阿富汗 |
| Night Creatures |
| And Then You’re Dead |
| Four Thousand Weeks |
| Hunchback |
| The Fox Went out on a Chilly Night |
| Puffin |
| The Little Ghost Quilt’s Winter Surprise |
| The Little Ghost Who Was a Quilt |
| Red Sings from Treetops |
| A Shell Is Cozy |
| Swirl by Swirl |
| 旅行在樹梢 |
| Things I Don’t Want to Know |
| 流明 |
| Emily Carr and Her Dogs |
| Frederick |
| How to Catch a Mole |
| The Boy, the Mole, the Fox and the Horse |
| 那个苹果也很好 |
| 在古老的土地上 |
| 病者生存:疾病如何延续人类寿命 |
| 我就是这样变笨的 |
| The Leaf Detective |
| 初老的女人 |
| Jonathan Cleaned Up … Then He Heard a Sound |
| Ocean Meets Sky |
| 饮食的迷思 |
| Pool |
| 恶女书架 |
| 老女孩 |
| It Fell from the Sky |
| Barnaby Unboxed! |
| 西伯利亚一年 |
| The Night Gardener |
| The Monarch |
| 八堂自然课 |
| The Barnabus Project |
| Rain Before Rainbows |
| The White Darkness |
| Pepper & Me |
| Cloth Lullaby |
| 多面的谷氨酸 |
| The House of Owls |
| Mushroom Rain |
| Once Upon a Northern Night |
| Spork |
| The Mushroom Fan Club |
| On a Mushroom Day |
| 我活下来了 |
| The Snowman and the Snowdog |
| The Snowman and the Snowdog |
| We Should All Be Feminists |
| Best Foot Forward |
| Starry Messenger |
| Can You Keep a Secret? |
| In Defense of Food |
| Madlenka |
| The Pilot and the Little Prince |
| You’ll Find Me |
| Is a River Alive? |
| 如何找到想做的事 |
| ISLAND STORM |
| The Lost Spells |
| In and Out the Window |
| Migration |
| Migration |
| Snow Birds |
| 树的秘密语言 |
| Curiosity |
| The White Cat and the Monk |
| Heatwave |
| Town Is by the Sea |
| Blue |
| How to Keep House While Drowning |
| Bird Builds a Nest |
| A Bird Day |
| Look What I’ve Got! |
| As An Oak Tree Grows |
| English Pastoral |
| Mighty |
| The Backyard Bird Chronicles |
| In the Night Kitchen |
| Because of an acorn |
| Dear Reader |
| Over and Under the Wetland |
| Biblioburro |
| Over and Under the Pond |
| The Serviceberry |
| Over and Under the Waves |
| Over And Under The Canyon |
| Over and Under the Snow |
| White Snow, Bright Snow |
| Over And Under The Rainforest |
| Do You Remember? |
| The Hawk’s Way |
| Sidewalk Flowers |
| 雪舞者 |
| Santa’s First Christmas |
| Small in the City |
| Little Owl’s Night |
| My Baba’s Garden |
| 古典的回声 |
| The Tiger Who Came to Tea |
| Me and You |
| 读库1504 |
| 大汗之城 |
| The Lord of the Rings (BBC Dramatization, Consumer Edition) |
| 献灯使 |
| 生而为女,不必抱歉 |
| 时间熊,镜子虎和看不见的小猫 |
| 在西伯利亚森林中 |
| 格外的活法 |
| 扔掉水晶鞋 |
| 飞鸟奇缘 |
| 恐龙疗法3:你是我最好的朋友 |
| 老头我,负责收拾一切 |
| We Found a Hat |
| This Is Not My Hat |
| I Want My Hat Back |
| 我曾这样寂寞生活 |
| Stolen focus |
| 巴基斯坦寻根之旅 |
| 何以为鸟 |
| The Mole Sisters and the Fairy Ring |
| The Mole Sisters and the Way Home |
| The Mole Sisters and the Piece of Moss |
| Hello, Squirrels! |
| Bringing Down the Moon |
| Up in the garden and Down in the dirt |
| The Crucible |
| 木骨禅心 |
| The Search for the Giant Arctic Jellyfish |
| When Dad Showed Me the Universe |
| 手机断舍离 |
| 手机大脑 |
| 马可瓦尔多 |
| 发酵完全指南 |
| I Talk Like a River |
| 满是空虚之物 |
| 哥伦比亚的蘑菇 |
| 创造自然 |
| 随机快乐 |
| 险境奇谈 |
| 我的健康厨房 范志红谈厨房里的饮食安全 |
| Mei Li |
| 念念远山 |
| 读库1304 |
| Five Flying Penguins |
| 一神论的影子 |
| 我们花园里的鸟 |
| 我们唱歌的鸟 |
| 抓住十二只喜鹊的尾巴 |
| Feathers |
| The City of Ember |
| They All Saw a Cat |
| Bird Day |
| Little Witch Hazel |
| 妖怪事典 |
| The Elephant and the Bad Baby |
| Goodnight Moon |
| 营造天书 |
| 长恨歌图 |
| Atlantic Puffin |
| The Emperor’s Egg |
| Life as a Barnacle |
| Broken Glass |
| 无器械健身 |
| 追寻逝去的时光 第一卷:去斯万家那边 |
| 宇宙来我手中啄食 |
| 格里格外 |
| 无钱幸福 |
| 末日愚人 |
| 强风吹拂 |
| 让路给小鸭子 |
| 绝佳时间 |
| 美国式死亡 |
| The Tomten |
| 我们在非洲 |
| The Tomten and the Fox |
| Little Polar Bear |
| The Snowman |
| 我用中文做了场梦 |
| Kakapo Rescue |
2026-01-01 08:00:00
好久没写生活向的内容了,把之前清单里的这篇拎出来解决掉。
1.不锈钢咖啡滤网
当时买来做手冲咖啡用,想着替代一次性的纸质滤纸更环保些。滤网也确实很细,只是用了一段时间之后下水的速度非常非常慢,过滤时间变长导致咖啡口感相当差劲。卖家产品说明里写用洗洁精泡泡就好,但我是洗洁精、小苏打甚至柠檬酸配合刷子挨个试了一遍全不奏效,一气之下扔了。扔完发现我应该留着它做希腊酸奶用的……
2.可量化油壶
这种油壶一般是倒油口那里做了个缓冲区,但是这就导致其实有一部分油会和空气接触氧化,而且我买的那款断口不利索,每次壶嘴那里都要残留点油渍,相当烦人。一壶油用完还得彻底清洗壶身再晾干,实在过于麻烦。之后我意识到,以我几乎三餐都自己做但一年也才用 500 ml 不到植物油的用量(烹调和烘焙偶尔还会用到黄油),无论如何都难以超过摄入警戒线,直接把油壶扔掉,每次只买 250 ml 小包装的橄榄油/亚麻籽油。
3.一次性吸管
好多好多年前逛宜家,朋友说买包吸管日常备着我就顺手也抓了一袋,完全用!不!上!最后在夏天喝冰拿铁时硬是用个超级高的杯子每次拿吸管搅搅,五六年了终于用完了。
4.pixel pen
Google Pixel Slate 官方标配里是没有这支手写笔的,看别人用平板都似乎很潇洒地写/画,我抱着或许也用得上的想法给 pixel slate 也配了支笔。好几年了,用的次数可能两只手就数得过来。其实要算起来,这台机器也算是一个失败购物,纯娱乐,生产力是(几乎)一丁点也没有,我觉得不需要它也可以。但我就是好奇 ChromeOS 系统!而且它可以在平板上体验完整的 Chrome 浏览器,总比买台没用的安卓平板好吧(什么,iPad?本果黑拒绝为苹果花哪怕一分钱)。
5.无线迷你搅拌机
想得很美好,可以拿来打个葱姜蒜或者香料又或者牛油果的,但有这事前充电、事后刷机器的功夫,我拿菜刀拍几次或者勺子捣几下就结束了。不过我有洗碗机的话可能它的利用率又不一样吧。
6.罗技 K380 键盘
笔记本常年连着外接显示器就需要外接键盘,我对键盘没什么要求,试过机械键盘但还是最喜欢笔记本上那种薄膜键盘的手感,也不想多花钱就随便挑了这个大路货。最大的问题是,我其实不需要蓝牙!每次开了机都得等几秒钟它才能连上这个感觉很糟糕,既然我常年都不需要挪动键盘位置完全可以买个 2.4 G 或者直接上有线键盘。可能之后卖二手看看有没有人要,再换个不是只支持蓝牙的。
7.电动牙刷
我用过两个飞利浦(一个中端机型,一个低端机型)和一个小米。差不多十年前,花了四五百买的飞利浦非常精准地在刚过两年保修期的那个月坏掉了。网上一刷都是同样的控诉,但我不信邪又买了只低端的,再次,刚过保就出问题。这时国产品牌也铺天盖地出电动牙刷了,我就又换了只小米,again,两年魔咒。我气炸了,后来想想可能移动电池的寿命就是这么久,所以所有厂家都非常鸡贼地把保修期也定了这么长。现在我常年回购狮王细齿洁宽版,非常好用!而且用十年也比不上我第一支飞利浦牙刷的一半价格。想想过去真是个超级大傻子。
8.欧包藤篮
凡是做欧包的人很难不买这个塑形的藤篮,但问题在于,在欧洲人家似乎没有我们这边这可怕的梅雨潮湿诅咒吧?正常使用藤篮之后是不会洗的,多余的粉就留在里面防黏下次继续用。然而不管我怎么保存,总是要么生霉,要么生虫。干燥地区太阳下晒晒就没事,我这儿每年固定有一两月湿度可能到 90,怎么晒都没用啊!后来我意识到只要不追求欧包上那一圈圈的花纹,有没有这个篮子完全没差,所以现在我都用洗菜的滤水篮子垫张油纸做二次发酵,一样很成功。
9.五年日记笔记本
今年是第五年,几乎没写过。幸好我颇有先见之明没有花大价钱买 Leuchtturm 或者其他类似牌子,当时就想着这种严格规定日期的方式多半会引起我的逆反心,果然如此。打算当普通本子随便写写画画赶紧用完。之后就算我想实践五年日记的形式完全可以搭个静态站调调格式让它把不同年份同样日期的内容放在同一页面显示就行,别说五年,十年二十年也不成问题。
10.「人体工学」坐垫和靠背
前几年我达到了一种坐在椅子上超过半小时就背痛不止的程度,不管怎么调整坐姿都无济于事。恰好那几天看到少数派的购物分享就病急乱投医地买了,稍微好过了那么一丁丁点吧,但该痛还是痛。没想到之后在我非常三天打鱼两天晒网的锻炼之下,居然就不药而愈了。所以,锻炼比外物有用。真的不适到影响生活了,那还是赶紧先看医生。至于这个坐垫和靠背,加上之后我还必须得搭个脚踏,不然脚离地面的高度又过高了,而且锻炼之后脊背感觉靠在上面也不得劲儿,最后还是都扔掉了,坐姿靠自觉保持,不舒服了就站起来动一下。
居然正好攒了十条出来,虽然这期的标题是 shopping fails 1,但还是最好不要再有 2 。(多半会有的,人在河边走,哪能不湿鞋……)
2025-12-22 08:00:00
发现我还有这篇草稿,随便发一下好了。一些过去(已经不知道是多久之前攒下的)我觉得有意思的文章。
One Giant Stunt for Womankind
Blue Origin’s all-female flight proves that women are now free to enjoy capitalism’s most extravagant spoils alongside rich men. 之前看到所谓全女性成员的太空之旅,豆瓣还有某 KOL 写小作文煽情其中一位在遭遇性暴力用法律手段维护自己后重新追逐她的「宇航员」梦想。前半部分没有问题,后半部分则问题太大了。和富人的「娇妻」(aka 贝索斯的现任)以及一众社会名流(比如 Katy Perry) 搭乘富人玩具上天那不叫探索太空,更不叫追逐「宇航员梦想」,充其量只是太空乘客好吗。接着就刷到了这篇报道,真是讽刺好笑。
水垢与帝陵:世界上不同的美
很神奇,刷到这篇文章时我正在读王南的《大汗之城》,其中提到北京城当初的规划,或者说中国古人的建筑审美,就是「虽为人作宛若天开」,建筑不应孤立存在,而是和周边景观相辅相成。而这篇文章的中心也正是这个,由自然界的万千美感延伸到建筑设计。更为神奇的是,这是将近十年前的文章,却又被转发到了我的豆瓣首页,内容也并不显得过时。这才是互联网真正应该存在的「长尾效应」。
分享40个科幻短篇
mark 下日后读。
Owls in Towels
一个收集裹在毛巾里的猫头鹰的网站。
余生
《四个春天》导演的家庭故事的后续。看得泪流不止。
到底什么是绝版书
多抓鱼的一篇推送,二手书平台写这个相当有发言权。
三文鱼,真的“自由”了吗?
购买之前需要多想一步。或者,我们真的需要吃这么多三文鱼(以及鳗鱼、高级牛肉等等等等)吗?看到一些人整天嚷嚷着就是要吃肉以及吃这些野外种群已经相当不乐观的动物,我真的忍不住我的白眼。
行走唐陵20年
正好可以和之前读过的《六朝遗石》两厢对照。
以及最后一篇是豆瓣新推出的官方 club 「友邻moment」的推文,我看了下这个系列都相当有意思,但我不想加入它们这个所谓俱乐部只想看长文,研究了下虽然前端页面豆瓣是给这种 club 账号设计了不同的显示效果,但本质还是一个用户 id,用豆瓣的日记 RSS 逻辑一样可以订阅文章更新,所以,感兴趣可以用这个地址订阅: 豆瓣友邻 moment RSS 。
2025-12-22 08:00:00
本月总结主打一个言简意赅。
3.5 星。
前男友那一章真的是突兀且不合时宜,而且作为读者谁有义务去记你死掉的前男友啊?Who cares?可好些人为此打一星也太过了吧。而且异性恋怎么了,难道非得是“酷儿”“性少数”才能当单身女性代表发言?有些人的差评是不是太离谱。
讲中年单身女性的处境和各种思考倒是相当让人感同身受,我们需要有人讲述这样的生活。
两星。
寡淡无趣。几乎每一篇都像是碎片胡乱拼起来的,连个像样的表达都没有,要谈论什么是不是应该有一个比较明晰的、一以贯之的自我呢?未免太过空洞。我不会再看铃木凉美了。
印度人在埃及。(是不是看这个前提就觉得想看了?)或者说,是一个印度学者在埃及做田野调查以及做历史研究。
现代线比历史线精彩一点。但到底为什么这些学者非要沉迷于毫无必要的双线叙事?详细内容看下面两篇书评就好,我懒得多费唇舌了。
留学生的法国生活记录。前几篇文化观察类的还挺有趣,越往后越流水账,尤其日本旅游那篇,抻得老长却又极其无聊。尤其是其中出现了一些出版界的人名(很好认,即使她没写全名我也知道是谁),我会忍不住想,如果不是作者本身就在这个行业内,以这个水准能出书吗?
其实还有更多吐槽但写出来太费劲儿了,谁来找我 Discord 聊天吧我可以连说一小时(什么)。
三星。
在书里写“饮酒可能对健康有益”的作者我觉得没法信任,你说呢?
整本书的核心观点就是饮食要尽可能多样化,以及多吃发酵食物。但其中也有不少言论和我之前读的营养学/饮食相关书籍理论相悖,而多看几本更是发现在营养学这一领域经常彼此矛盾,兼收并蓄姑且听着吧。
看到养猫但不处理有毒植物还狡辩说“没有植物就不是自己”很生气,原本三星半,现在三星。有几篇写死亡还不错,但我还是不会再看伊藤比吕美的书了,总是这种超短小杂志连载合集,很没劲,这稿费赚得太容易了吧?
俏皮话很多,讽刺拉满,可惜也只有这些,还没到结局气就已经泄了,感觉有头无尾,概念取胜。
三星。
有些新鲜观点,但越写越离题万里。
八月读的 The Barnabus Project 的后续故事,我不喜欢这个走向。也懒得放图了。
画面细腻梦幻美丽,故事么略有点说教,不过还在接受范围之内。就是不知道怕虫的人看到这么细致的笔触全是在展示各类昆虫身体细节会不会疯掉。




无字绘本。游泳池里的幻想世界。画得不差,笔触细腻,但和我脑电波对不上
下面这张不知为什么会让我想起爱死机里 Zima Blue 那一集。

一个关于思念的故事。画面极其梦幻美丽,情节虽然有点老套──但有效。我在最后没忍住也落泪了。



有点荒诞过头,不是我的菜。
最早研究“活着的”树叶的女科学家 Meg Lowman 的传记绘本。到热带雨林中、上到树冠上观察研究树叶的状态。比如树叶的寿命,最短可能只有几个礼拜,最长达到了惊人的 19 年。也是她首先提出了安装丛林观光云梯(姑且这么翻吧我不知道术语该是什么)的想法,为雨林地区发展出旅游项目,从而让一部分森林逃离了被砍伐的命运。
Lowman 的个人网站: canopymeg!。


画风特别,甚至有点水墨画的写意味道,可惜文字全是心灵鸡汤,喝一口觉得鲜,整本都是未免有点腻。很温柔不错,但我无法被说服。以及,这个手写体真是让我认得眼睛都快瞎了!


2025-12-21 08:00:00
简单记一下最近的博客变化,不详细写了,基本都是 AI 干的活儿。
series shortcode。放一下 series 的代码。
在博客 layouts/shortcodes 下新增 series.html 文件:
<style>
.callout {
border-left: 4px solid #2d6cdf;
background: #eef3fb;
padding: 1rem;
margin: 1rem 0;
border-radius: 4px;
font-family: sans-serif;
}
.callout p {
margin-top: 0;
margin-bottom: 0.5rem;
}
.callout ul {
margin: 0;
padding-left: 1.5rem;
}
.callout li {
margin-bottom: 0.25rem;
}
.callout a {
color: #2d6cdf;
text-decoration: none;
}
.callout a:hover {
text-decoration: underline;
}
</style>
{{ if .Page.Params.series }}
{{ $currentTitle := .Page.Title }}
{{ $seriesName := index .Page.Params.series 0 }}
{{ $seriesSlug := $seriesName | urlize }}
<div class="callout notice">
<p><strong>本文属于 {{ $seriesName }} 系列,前情提要或后续更新请见:</strong></p>
<ul>
{{ if (index .Site.Taxonomies.series $seriesSlug) }}
{{ range (index .Site.Taxonomies.series $seriesSlug).Pages.ByDate }}
<li>
{{ if eq .Title $currentTitle }}
{{ .Title }}
{{ else }}
<a href="{{ .RelPermalink }}">{{ .Title }}</a>
{{ end }}
</li>
{{ end }}
{{ end }}
</ul>
</div>
{{ end }}
对应文档 front matter 增加 series property,并在文档内使用 /{/{< series >}/}/ 即可(去掉反斜杠)。Hugo 会自动读取博文的 series 信息并将所有同系列文章按创建时间生成序列显示(但是它好像识别不了中文名称,我也懒得修了,都写英语吧……)。
2025-12-21 08:00:00
本文属于 Waline 系列,前情提要或后续更新请见:
2025.12.30 Update:
根据 Waline 的 issues 请问是否有办法设置不收集评论者的IP、UA和所属地信息? · walinejs · Discussion #1315 · GitHub 也可以直接添加 hooks 禁用。如果不需要通过 IP 禁用特定评论防止 spam 可以直接采用这种方式。
之前我一直犹豫没换评论系统的缘故就是 Waline 和 Twikoo 默认会前台展示 IP 和 UA(user agent),后面换了才知道即使前台显示关闭,后台还是会记录具体 IP,这实在是让我难受。我猜多数用这俩评论系统的博主以及留言的人也不一定会知道具体的 IP 会一直被保留在数据库里吧。
理智上我知道这些信息是多数网站都会记录的,但直接交给个人还是感觉不一样。评论系统收集这些也的确有正当性──避免 spam、及时封禁。可我就是不想保留访客的这些资料。琢磨了一阵子后我想着改写 Waline 的评论写入逻辑有点麻烦,那就不如我写个定时跑的任务来自动清除数据库的 IP 和 UA 字段。本质上 Waline 也是用 access key 来和数据库互动,那我也用同样的手段来管理好了。
以及,AI 创作声明:
由于之前和 Gemini 都说的英文,等到我想着整理一份中文步骤发现实在太累,所以下面都是 AI 写的,我只大概改了改(写得比我快多了……)。
本教程适用于:
核心功能:使用 Vercel Cron 定期清理数据库中 90 天前的评论数据,将敏感信息(IP 地址和浏览器 User Agent)抹除。
在 GitHub 上托管的 Vercel 项目仓库中新建一个 Serverless Function,例如:
/api/cleanup.js
将下面代码完整粘贴进去:
const AV = require('leancloud-storage');
const DAY = 24 * 60 * 60 * 1000;
const BATCH_SIZE = 200;
let initialized = false;
function initAV() {
if (initialized) return;
AV.init({
appId: process.env.LEAN_ID,
appKey: process.env.LEAN_KEY,
masterKey: process.env.LEAN_MASTER_KEY,
serverURL:
process.env.LEAN_SERVER_URL ||
`https://${process.env.LEAN_ID.slice(0, 8)}.api.lncldglobal.com`,
});
initialized = true;
}
async function cleanOldComments(cutoff) {
const Comment = AV.Object.extend('Comment');
let cleaned = 0;
while (true) {
const q = new AV.Query(Comment)
.lessThanOrEqualTo('createdAt', cutoff)
.exists('ip')
.limit(BATCH_SIZE)
.select([]);
const results = await q.find({ useMasterKey: true });
if (results.length === 0) break;
results.forEach(o => {
o.set('ip', null);
o.set('ua', null);
});
await AV.Object.saveAll(results, { useMasterKey: true });
cleaned += results.length;
}
return cleaned;
}
module.exports = async (req, res) => {
if (req.headers.authorization !== `Bearer ${process.env.CRON_SECRET}`) {
return res.status(401).json({ error: 'Unauthorized' });
}
initAV();
const cutoff = new Date(Date.now() - 90 * DAY);
try {
const cleaned = await cleanOldComments(cutoff);
res.status(200).json({
message: cleaned ? `Cleaned ${cleaned} records.` : 'No records to clean.',
});
} catch (e) {
res.status(500).json({ error: e.message });
}
};
在 Vercel 项目中添加以下环境变量:
| 变量名 | 说明 |
|---|---|
LEAN_ID |
LeanCloud App ID |
LEAN_KEY |
LeanCloud App Key |
LEAN_MASTER_KEY |
LeanCloud Master Key |
CRON_SECRET |
自定义字符串,用于校验 Cron 请求 |
前三个变量在部署 Waline 时已添加过,无需再变动。CRON_SECRET 的值可随意自定义。
在项目根目录更新 vercel.json:
{
"name": "comment",
"version": 2,
"github": {
"silent": true
},
"builds": [
{
"src": "robots.txt",
"use": "@vercel/static"
},
{
"src": "index.cjs",
"use": "@vercel/node"
},
{
"src": "api/cleanup.js",
"use": "@vercel/node"
}
],
"rewrites": [
{
"source": "/api/cleanup",
"destination": "api/cleanup.js"
},
{
"source": "/((?!robots\\.txt$).*)",
"destination": "index.cjs"
}
],
"crons": [
{
"path": "/api/cleanup",
"schedule": "0 0 1 * *"
}
]
}
即,在 builds、rewrites 下新增 cleanup.js 路径,以及增加定时任务 crons,我这里选择的是 "0 0 1 * *" 每月一号跑一次,可根据自己需要变更。
手动执行方式:命令行 curl 执行或者 Vercel Dashboard 的 Cron “Run now”。