普通视图

别让你的烟,呛到无辜的人

2025年12月7日 20:08

最近发现公共场所抽烟的人越来越多了,楼道、电梯、路上,经常能碰到。那股烟味非常让人不太舒服。

我的店所在的这个写字楼楼道是一个密闭的空间,虽然物业也贴了楼道禁止吸烟的标语,但是也并没有什么实质性的作用,每当有人抽烟,屋里就会飘来一股烟味,有时候不得不把门关上,但是你又是在做生意,关上门又不合适,真实左右为难。

电梯里抽烟就更让人头疼了。很多次,进入电梯,里面都是一股浓浓的烟味,很多邻居也都在物业群里吐槽,这时候物业就是一只鸵鸟,不吭声,不吭声,逼急了,就说在电梯有禁烟的标语。其实他们也很无奈。还有一些年轻人也是,抽的电子烟,虽然没有那么难闻,但是危害是一样的。

电梯空间小,烟味散得慢。后面坐电梯的人还得闻这个味道。那些对烟味敏感的人,或者带着孩子的人,确实会不舒服。

路上抽烟的人也常见。走在他后面,风一吹,烟味就飘过来。有时候想超过去,他还走的挺快,闭着气赶紧穿过去,心里在骂他的娘。

我琢磨了一下,这些人大概有这么几种心态。第一种是觉得抽烟是自己的权利,想在哪抽就在哪抽。他们忘了自由的前提是不妨碍他人的自由。你的抽烟自由,不能建立在我吸二手烟的不自由上。

第二种是觉得抽几口没事,烟味一会儿就散了。他们也知道二手烟里的有害物质可以在空气中停留很久,但是,关我鸟事。

第三种是看到别人在公共场所抽烟,觉得自己也可以。典型的法不责众心理。问题是,错的事情不会因为做的人多就变成对的。

第四种是知道公共场所抽烟不对,但只要没人管,他们就照抽不误。说白了就是缺乏公德心。

有些人可能觉得,闻点烟味没什么大不了的。但二手烟确实有危害,特别是对孩子、孕妇、老人和有呼吸系统疾病的人。

其实我们国家早就出台了《公共场所控制吸烟条例》,明确规定室内公共场所、公共交通工具、电梯等地方禁止吸烟。问题是,规定是规定,执行是执行。很少看到有人因为公共场所抽烟被处罚。物业不管,保安不管,大家也都抱着"多一事不如少一事"的心态。

这就形成了一个恶性循环:没人管→更多人抽→更没人敢管。

说实话,作为一个普通市民,我们能做的有限。但至少可以从自己做起,如果家里有人抽烟,劝他们去专门的吸烟区,或者至少不要在密闭空间抽。遇到公共场所抽烟的人,可以礼貌地提醒。虽然可能没什么用,但至少表达了态度。

也可以支持公共场所设立明显的禁烟标志,支持物业加强管理。告诉孩子们吸烟的危害,特别是二手烟的危害。

抽烟是个人的选择,这个我理解。但如果在公共场所抽,确实会影响别人。公共场所是大家共用的,不是某个人的吸烟室。你的自由,不应该让别人不舒服。

那些在楼道、电梯、路上抽烟的朋友,可以换个角度想想:如果你的家人每天都要闻别人的烟味,你会怎么想?将心比心,其实大家都明白这个道理。

  •  

冬日杂记

2025年12月3日 17:07

这两天,气温又开始下降了。看着女儿因为脚伤在家里,晚上不开空调就有点不乐意,心里不免感慨。虽然今年集中供暖依然未能实现,但室内的温度保持在19度左右,体感上其实还算可以。都说今年会是一个寒冬,但我总感觉现在的冬天,已经远没有记忆中那么冷了。

小时候,对“冰冻三尺非一日之寒”这个成语,曾有过非常具体的、亲身的体会。在我们村子南边,有一个叫做“南坑”的水塘。那时候的南坑是终年有水,而每年冬天,它都会给我们带来一场盛大的冰雪游戏。特别是到了最冷的三九天,冰层会厚到我们一群小伙伴在上面尽情玩耍、奔跑跳跃,冰面都不会破裂。那厚厚的、结实的冰层,正是对“冰冻三尺”最生动的诠释。

然而,物是人非,现在的冬天,很多地方已经不结冰了,就算偶尔结了一层薄冰,也往往捱不过中午的日头,早早地融化。单从这一点来看,现在的冬天确实不如以前寒冷了。

想到那般彻骨寒冷的冬天,真的非常佩服那时候的河南人,竟然几乎是全靠着被窝熬过一整个季节。现在想来,那并非是不想取暖,而是生活条件所限,主要还是能源不足。有些人家连平常做饭的柴火都捉襟见肘,更别说拿来取暖了。那时候,河南农村主要的柴火来源是秸秆和树叶,这些燃料不耐烧,难以维持长久的温暖。那是一个物质匮乏的年代,是靠着坚韧和“硬扛”度过的冬天。

如今,时过境迁,村南的南坑虽然还在,但水面早已干涸见底。以前的南坑终年有水,正是因为我们那里的地下水位非常高。家家户户使用的压水井,往往只需一丈多深就能轻松出水,所以坑里常年水波荡漾也就不足为奇。可后来,水井越打越深,水位也越来越低。到了现在,打井必须依靠下潜水泵才能抽出水来,传统的一丈老井早已成为历史遗迹。冰冻三尺的南坑、充沛的地下水、还有全靠硬扛的童年冬季……这些记忆中的片段,都随着岁月的更迭和环境的变化,渐渐成为了历史。

  •  

EndeavourOS + Btrfs + Snapper + GRUB:完整的快照回滚系统配置指南

2025年11月30日 10:00

EndeavourOS由于使用的是滚动更新,系统存在着滚挂的可能性(尽管我已经使用了1个多月也没有问题),所以快照回滚是一个必须的选项。本文将详细介绍如何在 EndeavourOS 系统中配置完整的快照回滚系统,让您在系统出现问题时能够轻松恢复到之前的状态。

前言

为什么需要快照回滚系统?在日常使用中,我们难免会遇到以下情况:

  • 系统更新后出现兼容性问题
  • 安装某个软件导致系统不稳定
  • 配置文件修改错误导致系统无法启动
  • 恶意软件或误操作破坏系统

有了快照回滚功能,这些问题都可以通过简单的重启和菜单选择来解决。

系统要求

在开始之前,请确保您的系统满足以下条件:

  1. 已安装 EndeavourOS(或基于 Arch 的其他发行版)
  2. 使用 Btrfs 文件系统作为根分区
  3. 安装时选择 GRUB 作为引导加载程序

核心组件介绍

我们的快照回滚系统将由以下几个核心组件构成:

组件 作用 必要性
Snapper 快照管理核心程序,负责创建、删除和管理快照 必需
snap-pac 在 pacman 操作时自动创建 pre/post 快照 强烈推荐
grub-btrfs 将 Snapper 快照集成到 GRUB 启动菜单 必需
inotify-tools 文件系统监控工具,确保 GRUB 菜单及时更新 可选但推荐

安装步骤

步骤 1:安装核心软件包

打开终端,执行以下命令安装所需的软件包:

1
2
# 安装 snapper, snap-pac 和 grub-btrfs
sudo pacman -S snapper snap-pac grub-btrfs

软件包说明:

  • snapper:快照管理的核心程序,提供快照创建、删除、比较等功能
  • snap-pac:自动化工具,在每次 pacman 操作时自动创建"操作前"和"操作后"快照
  • grub-btrfs:GRUB 扩展模块,自动扫描 Snapper 快照并将其添加到启动菜单

步骤 2:配置 Snapper

安装完成后,我们需要创建 Snapper 配置:

1
2
3
4
5
# 创建根分区的 Snapper 配置
sudo snapper -c root create-config /

# 创建第一个手动快照作为基准
sudo snapper create --description "初始系统快照"

步骤 3:启用 GRUB 集成服务

grub-btrfsd 服务会监控快照变化并自动更新 GRUB 配置:

1
2
# 启用并启动 grub-btrfs 守护进程
sudo systemctl enable --now grub-btrfsd.service

步骤 4:生成初始 GRUB 配置

手动生成一次 GRUB 配置,确保现有快照出现在启动菜单中:

1
2
# 重新生成 GRUB 配置文件
sudo grub-mkconfig -o /boot/grub/grub.cfg

验证配置

检查服务状态

确认 grub-btrfsd 服务正常运行:

1
2
# 查看服务状态
sudo systemctl status grub-btrfsd

正常情况下,您应该看到类似以下的输出:

1
2
3
 grub-btrfsd.service - GRUB Btrfs snapshot detection daemon
   Loaded: loaded (/usr/lib/systemd/system/grub-btrfsd.service; enabled; vendor preset: disabled)
   Active: active (running) since ...

查看快照列表

检查 Snapper 是否正常工作:

1
2
# 列出所有快照
sudo snapper list

您应该能看到包含刚才创建的"初始系统快照"的列表。

测试自动快照功能

安装一个简单的软件包来测试自动快照功能:

1
2
3
4
5
# 安装测试软件包
sudo pacman -S neofetch

# 查看是否自动创建了快照
sudo snapper list

您应该能看到两个新的快照:一个在安装前(pre),一个在安装后(post)。

故障排除

问题 1:GRUB 菜单中没有显示快照

如果重启后 GRUB 菜单中没有显示快照选项,可能是因为缺少 inotify-tools

1
2
3
4
5
6
7
8
# 安装 inotify-tools
sudo pacman -S inotify-tools

# 重启 grub-btrfsd 服务
sudo systemctl restart grub-btrfsd.service

# 重新生成 GRUB 配置
sudo grub-mkconfig -o /boot/grub/grub.cfg

问题 2:服务启动失败

如果 grub-btrfsd 服务启动失败,检查以下内容:

1
2
3
4
5
# 检查服务日志
sudo journalctl -u grub-btrfsd.service -f

# 检查 Btrfs 子卷挂载情况
mount | grep btrfs

问题 3:快照无法启动

如果快照在 GRUB 菜单中显示但无法启动,可能是由于以下原因:

  1. 内核版本不匹配:确保快照中的内核版本与当前系统兼容
  2. initramfs 问题:重新生成 initramfs 镜像
  3. 子卷挂载问题:检查 /etc/fstab 配置

高级配置

自定义快照保留策略

编辑 Snapper 配置文件来自定义快照保留策略:

1
2
# 编辑配置文件
sudo nano /etc/snapper/configs/root

在文件中找到以下部分并根据自己的需求调整:

1
2
3
4
5
6
7
8
9
# 数量限制
TIMELINE_LIMIT_HOURLY="10"
TIMELINE_LIMIT_DAILY="7"
TIMELINE_LIMIT_WEEKLY="4"
TIMELINE_LIMIT_MONTHLY="12"
TIMELINE_LIMIT_YEARLY="0"

# 清理算法
TIMELINE_CLEANUP="true"

配置定时快照

启用定时快照功能,系统会定期自动创建快照:

1
2
3
4
5
# 启用 snapper-timeline.timer
sudo systemctl enable --now snapper-timeline.timer

# 启用 snapper-cleanup.timer
sudo systemctl enable --now snapper-cleanup.timer

使用指南

创建手动快照

1
2
3
4
5
# 创建描述性快照
sudo snapper create --description "安装显卡驱动前"

# 创建带类型和描述的快照
sudo snapper create --type single --description "系统优化完成"

删除快照

1
2
3
4
5
# 删除指定快照(替换 <ID> 为实际的快照编号)
sudo snapper delete <ID>

# 删除多个快照
sudo snapper delete <ID1> <ID2> <ID3>

比较快照

1
2
3
4
5
# 比较两个快照之间的差异
sudo snapper diff <ID1> <ID2>

# 比较特定文件的变化
sudo snapper diff <ID1> <ID2> /etc/fstab

回滚到快照

  1. 重启系统
  2. 在 GRUB 菜单中选择"Snapper snapshots"
  3. 选择要回滚的快照
  4. 按照屏幕提示完成回滚
  •  

电影《捕风追影》:老戏骨的港式动作片

2025年11月29日 08:30

还是暑假的时候,有次偶尔看到这部电影的信息,看到是成龙、梁家辉、张子枫主演的,还是有点期待的,但也不多,让我花上几十块钱去看还是有点舍不得的。如果是春节上映的话,还有这么点可能,最近在视频平台也上线了,昨天看了一下,感觉也还不错,是一部港味十足的动作片无疑。

老戏骨的精彩对决

成龙饰演的黄德忠是一位退休多年的跟踪专家,被请出山对付高科技犯罪团伙。虽然年事已高,但成龙依然展现了他标志性的"成龙式"动作喜剧风格——在洗衣房利用晾衣杆为武器,将反派塞进滚筒洗衣机,既规避了老年人硬拼体力的不合理,也延续了他独有的喜剧感。

而梁家辉则贡献了从影以来最凶猛的反派表演。一场在孤儿院走廊中手持短刃与30人近身缠斗的戏份,刀刀见血的暴力美学令人脊背发凉。67岁的他每一刀都精准狠辣,癫狂中透着末路枭雄的悲凉。

新老交替的传承主题

影片巧妙地融入了新老交替的主题。成龙与张子枫饰演的何秋果之间的师徒关系,既有《成龙历险记》中龙叔与小玉的感觉,又展现了传统跟踪术与现代高科技的碰撞。张子枫在片中的表现可圈可点,从最初被戏称为"吉祥物",到最后成为"团队王牌",展现了女性在警队中的成长与价值。

反派阵营中,梁家辉饰演的"影子"与他的"狼崽团"之间的关系同样复杂。从小收养的孤儿们长大后成为他的棋子,“父子"间互相猜疑中又带着一丝温情。这种矛盾的情感羁绊为影片增添了不少深度。

紧张刺激的动作场面

《捕风追影》的动作戏也很不错。从开场反派团伙的空港逃脱戏,到中段的各种跟踪与反跟踪技巧展示,再到最后的终极对决,每一场戏都设计得很好。

影片融合了跑酷、跳伞、枪战、爆破、近身肉搏等多种动作元素,展现了成家班的风采。特别是成龙在洗衣房的械斗场景,让人仿佛回到了他的黄金时代;而梁家辉的匕首戏则简洁狠辣,与成龙的风格形成鲜明对比。

剧情的亮点与不足

影片剧情紧凑,141分钟几乎无尿点。以"跟踪与反跟踪"为核心,融入AI、高科技犯罪等元素,对决不断层层反转。

当然,影片也有部分情节值得商榷。比如梁家辉饰演的"影子"如此心狠手辣,最后却对张子枫网开一面,如果影片能交代一下原因会更好。

此外,影片在技术细节上也存在一些硬伤。黑客几下就把警方的"天眼"系统搞瘫痪,这种情节过于简化了网络安全攻防的复杂性。现实中,像"天眼"这样的国家级监控系统应该有多重防护措施,不可能如此轻易被攻破。

另一个明显的技术硬伤是加密货币的处理方式。影片中加密货币被描绘得像普通文件夹一样可以直接拷贝,这与加密货币的实际工作原理大相径庭。真正的加密货币交易需要复杂的区块链验证过程,不可能简单地通过复制粘贴来完成转移。这种处理方式显然是为了剧情需要而牺牲了技术真实性。

不过,这些技术细节的简化也可能是为了照顾普通观众的理解,毕竟不是所有人都熟悉网络安全和区块链技术。作为商业动作片,《捕风追影》的主要卖点还是精彩的对决和紧凑的剧情,技术细节的准确性可能被放在了次要位置。

结语

《捕风追影》是一部诚意满满的商业动作片,它不仅让观众看到了成龙与梁家辉这两位老戏骨的精彩表演,也让我们看到了港式动作片的希望。在这个特效大片扎堆的时代,这种以拳拳到肉的动作爽感、实景拍摄诚意的作品,确实让人热血沸腾。

影片结尾那句"可能会后悔,但不会犯错,职责所在"道出了警察的职业精神,而"时代不同了,但规矩还是要有的"则反映了传统与现代的碰撞。这不仅仅是一部动作片,更是一部有深度、有温度的港式警匪片。

如果你是港片的爱好者,如果你想看看成龙和梁家辉这对老搭档时隔二十年的再次合作,《捕风追影》绝对值得一看。它不仅仅是一部动作片,更是一场关于传承、关于时代变迁的思考,也是对港式动作片黄金时代的一次致敬。中确实

  •  

《浪浪山小妖怪》:小人物的取经之路

2025年11月26日 10:30

自从关注到《浪浪山小妖怪》这部电影的信息后,就一直期待着。作为《中国奇谭》中《小妖怪的夏天》的衍生电影,我本以为只是简单的扩展,没想到在上映后在线上平台观看时,却被深深触动,打开了我内心深处那些久违的情感。

随着剧情的展开,我发现自己最初的期待还是太保守了,这部电影远比我想象的要深刻得多。这部电影讲述的是四个小妖怪——小猪妖、蛤蟆精、黄鼠狼精和猩猩怪,假扮唐僧师徒西天取经的故事。

最让我印象深刻的是这四个角色的设定。小猪妖成了团队的核心,蛤蟆精戴着大头娃娃假冒唐僧,口吃的猩猩怪被说服做了齐天大圣,黄鼠狼精则自己粘胡子、戴佛珠扮演沙师弟。这种"最不可能的师徒四人"组合,充满了荒诞的喜剧效果。

看着这些小妖怪笨拙地模仿着传说中的英雄形象,我不禁笑了出来。但笑着笑着,心里却涌起一阵酸楚。我们每个人不也常常是这样吗?在生活中扮演着各种角色,努力模仿着那些我们认为成功的人,却往往忘记了自己本来的样子。

电影中最打动我的,是这些小妖怪们踏上取经路的动机。它们不是为了普度众生,而是为了最朴素的愿望——“长生不老”,或者说,是为了改变自己作为底层小妖怪的命运。

这种动机让我想起了现实生活中的我们。多少人离开家乡来到大城市打拼,不也是为了改变命运吗?我们或许没有"取经成佛"这样宏大的目标,但我们都渴望通过自己的努力,过上更好的生活。

电影中有一个情节特别触动我:小妖怪们在取经路上时而被一眼识破、穷追猛打,时而被错认成真身,当作"唐僧肉"下锅。这种身份错位带来的荒诞感,不正是我们现实生活中常常遇到的困境吗?我们既想被认可,又害怕被看穿,在这种矛盾中挣扎前行。

电影的画面美学值得称道。制作团队采用了"笔墨入镜"的方法,将中国传统绘画的笔墨意境与现代电影镜头的光影空间完美融合。水墨氤氲的山川云气在银幕上舒展,工笔勾勒的精细角色在光影间跃然生动。

特别让我感动的是影片中那些自然景物的描绘。据说影片有大约80%的画面是自然景物,制作团队选择用手绘而非三维技术,正是为了更好地传达中国传统美学的意境。看着那些山峦、村落,我仿佛回到了儿时记忆中的乡村,那种朴素而真实的美感,在如今这个数字化的时代显得尤为珍贵。

影片的音乐也很出色。埙、洞箫、竹笛等中国传统乐器与西洋乐器的融合,为小妖怪们的旅途增添了妙趣。海浪声、虫鸣、鸟叫、风声共同构成的"声音蒙太奇",生动地再现了夏日场景,让人仿佛置身于那个充满奇幻色彩的世界。

电影中有一个情节让我深思:小妖怪们在小雷音寺与黄眉大王的斗争。在实力悬殊的对抗中,它们不再简单地模仿齐天大圣的外表,而是以行动与选择诠释了"踏平坎坷成大道"的精神。

这一情节重新定义了"取经"的含义。它不再是宿命式的任务,不是只有天赋异禀的人才能追寻的圣路,而是每个普通人都可以踏上的道路,都可以实现的转变。正如电影所展现的,“取经人"不再是唐僧师徒的专属称谓,每个想要改变命运的普通人,都可以成为取经人。

这种解读让我深有感触。我们常常觉得自己是平凡的小人物,不可能成就什么伟大的事业。但这部电影告诉我们,重要的不是我们是谁,而是我们选择成为谁,以及我们为此付出的努力。

看完电影,我忽然意识到,这部电影不仅仅是给孩子看的,更是给那些在生活中挣扎的成年人看的。

在这个充满压力和竞争的社会里,我们每个人都像是浪浪山中的小妖怪。我们或许没有显赫的背景,没有过人的才华,但我们都有一颗想要改变命运的心。我们或许会犯错,会迷茫,会走弯路,但只要我们不放弃,就总有希望。

《浪浪山小妖怪》用最荒诞的方式,讲述了一个最真实的故事。它告诉我们,无论我们多么渺小,多么不起眼,都有权利追求自己的梦想,都有可能成为自己生命中的主角。

看完后我一直在想,如果每个人都能像这些小妖怪那样,勇敢地踏上自己的取经路,这个世界会不会变得更美好一些呢?

也许会的。因为重要的不是起点在哪里,而是是否愿意迈出第一步;重要的不是有多少人相信你,而是你是否相信自己。

这大概就是《浪浪山小妖怪》想要告诉我们的道理吧。

  •  

体检、微恙与放下酒杯

2025年11月21日 10:38

日子在不经意间加速,转眼又到了做“身体年报”的时候。这几天在医院做了一系列检查,把身体各个部件都摸了一遍。总体而言,情况比想象中要好,这无疑是今年最让人松一口气的消息。

最让我欣慰的是一些老毛病正在逐渐清零。

  • 肝功能: 以前因为化疗的后遗症,我的胆红素指标一直偏高。这次复查,它终于回归了正常区间。这就像是在说,身体已经彻底走出了那段艰难的日子,开始稳步运行了。

  • 脂肪肝: 对比了以往的记录,脂肪肝的情况应该也在减轻。去年的 CT 报告还明确写着“脂肪肝”,而今年的结果,大夫给出的判断是程度已经比较轻了,甚至不再单独拿出来强调。这说明在日常的调整和控制上,方向是正确的。

  • 基础指标: 这个年纪,血脂和血压能够保持在正常水平,也算是给自己的健康管理打了一个合格分。

当然,时间的脚步不会因为谁而停止,身体机能的退化也是不可避免的。比如,报告单上清晰地写着:左心室舒张功能降低。这是年龄带来的必然印记,提醒着我要更珍惜和维护好现有的健康资本。

肠胃两年后的复查与新的治疗方案

前天又去做了两年多没做的肠胃镜。结果是好消息占了上风:无论是胃里还是肠里,都没有再长出息肉

但也检查出了老问题和一些新情况:

  • 新问题: B 级的反流性食管炎和浅表性胃炎。这大概是生活压力和饮食习惯累积的小小抗议。

  • 老问题: 结肠手术后的吻合口,依然有一如既往的溃疡,都快七年了,还没有完全长好。

过去,我一直是在肿瘤科复查,大夫通常没有针对这个溃疡给出特别的治疗建议。这次,我决定挂了消化科主任的号,听听更专业的意见。主任建议我服用四个月的美沙拉嗪,这是一种专门用于治疗溃疡性结肠炎的药物。希望这一次,能彻底让这个“七年之痒”的溃疡面愈合。

生活,从此放下酒杯

昨天和媳妇聊天时,做出了一个决定:以后酒不再喝了

其实我本身也不是一个嗜酒的人,主要是逢年过节、朋友聚会,以及遇到高兴的事情时,会小酌两杯。但从现在开始,能不喝就不喝了。毕竟身体已经过了可以随便挥霍的年纪,既然已经有食管炎和胃炎的苗头,那就应该更加彻底地避免任何刺激。

放下酒杯,不仅是对健康的负责,也是对生活态度的重新调整——很多快乐和庆祝,并不需要酒精的参与来放大。

说到酒,倒让我想起了一点童年旧事。

那时候酒的种类很少,在我们当地,最常见的可能就是鹿邑大曲宋河粮液。宋河粮液的酒瓶设计得特别好看,瓶型优雅,更重要的是,它的盖子是拧的,不是那种以前白酒和啤酒常用的,需要用起子撬开的金属皇冠盖。在那个年代,一个好看又结实的拧盖酒瓶,简直是小孩子心中的“高科技产品”。

我特别羡慕班里有这个酒瓶的同学,他们把酒瓶洗干净,用来带水到学校喝。那个瓶子不仅结实耐用,拧盖设计还能保证不漏水,在当时是一种象征,代表着家里有“好酒”喝。

现在回想,那段记忆简单又美好。而如今,我则要和手中的酒杯说声再见,转向更加朴素和健康的生活。

身体是革命的本钱,这次体检就像是身体给我交出的一份“年报”,有合格的成绩,也有需要改进的提示。接下来的日子,就是带着这些提示,更加认真地生活,做好健康的“减法”和“维护”。

  •  

独立思考,是抵抗所有现代焦虑的最终防线

2025年11月11日 11:36

你有没有过这样一种体验:自信满满地认为自己对某件事情了解透彻,直到你尝试向别人详细解释时,才发现原来自己并不如想象中那般了解。比如,试着解释一下你每天用的扫码支付是如何工作的,或者马桶是如何冲水的。突然间,你会发现自己只是会使用这些工具,却未必懂得它们的原理。 史蒂文·斯洛曼和菲利普·费恩巴赫在《知识的错觉:为什么我们从未独立思考》说,人类往往高估了自己的知识深度,误以为掌握了某些复杂事物的原理,然而我们其实只是知道如何操作这些事物,而非它们是如何运作的。这种现象作者称之为 “解释深度错觉”(Illusion of Explanatory Depth)

最后,作者得出结论说:你永远不会单独思考 (We Never Think Alone)。它呼吁我们对自己的知识保持谦逊,对社群的知识保持警惕,并在教育和政治中利用对这种错觉的理解,来促进更好的协作与决策。

书的作者一定没有看过《庄子》这本书。庄子在几千年前就说过:

“吾生也有涯,而知也无涯。以有涯随无涯,殆已!”

这本书给我的启示是一定要有独立思考的能力,特别是在如今这种信息爆炸的环境中——我们一方面生活在知识的洪流中,另一方面又无法真正掌握这些知识。我们把自己从不懂的事物中得到的片段信息,误认为是掌握了全局的理解。

焦虑背后的根本原因,在于我们对核心系统缺乏理解,丧失了“解释权”。无论是金融市场、公共卫生政策还是其他复杂的社会系统,普通个体常常无法真正理解这些系统如何运作。信息和规则只掌握在少数专家和机构手中,我们只能被动地接受结果。

当我们无法验证和理解这些系统的运行时,我们的知识焦虑就悄然滋生。焦虑的表现不再是基于对事物的理性分析,而是基于情感的“信不信”。我们被外部复杂的系统所支配,陷入了情绪化的决策和反应中。

这种缺乏独立思考的状态,使得我们容易被外界的声音带节奏,成为“知识节点”,把自己的决策权外包给简单且情绪化的答案。由此,集体焦虑的爆发成为不可避免的结果。

这也是这本书让我们对社群的知识保持警惕的原因。

独立思考,正是抵抗焦虑的最终防线。老子在《道德经》里说:知人者智,自知者明,明之后就不可能在有什么焦虑的情绪产生。而只有独立思考,才能自知。

独立思考的第一步,是承认自己的局限性,即认清自己的“有涯”。在面对复杂决策时,我们要质疑自己是否真的了解其运作原理,是否能够详细解释清楚。通过这种方式,我们能打破“知识的错觉”,将自信转化为理性。

独立思考并不是让我们脱离知识而是提高我们与他人合作的能力。 我们需要学会如何评估信息的来源、立场与专业性,筛选出真正的智慧,避免被噪音干扰。同时,我们还要能够批判性地整合不同的观点和信息,构建属于自己的认知框架。

只有具备独立思考的能力,我们才能在知识的海洋中保持清醒,不被情绪和集体焦虑所左右。

我们无法阻止知识的无限膨胀,也无法避免社会复杂性的增加,但我们可以改变自己在这个大系统中的角色。通过独立思考,我们不仅能应对信息时代的挑战,还能在集体智慧中保持自己的独立性和理性。

作为现代人,我们的使命是:以独立思考,成为知识社群中一个清醒、批判、高质量的合作者。只有这样,我们才能在理解世界复杂性的同时,不被任何形式的焦虑和节奏所支配。

  •  

以直报怨,怨未尽而心已定

2025年10月28日 14:36

《论语·宪问》中,有人问孔子:

“以德报怨,何如?” 孔子答:“何以报德?以直报怨,以德报德。”

我对这句话,之前一直理解为以牙还牙,昨天看书时候又看到这个词,觉得以牙还牙,爽是爽了,但不应该是这样一种情况,很多时候,我们也无法做到如此的酣畅淋漓。那么“以直报怨”究竟是什么意思?难道报了怨,心里就真的没有怨气了吗?


一、“以直报怨”,不是让怨消失,而是让怨归位

“怨”来自不平。 当你被误解、被伤害、被欺骗时,心里自然会生怨。 因此,与其把怨恨留在心心里,不如给它找到一个出口。 “以直报怨”的“直”,指的是公正、理性、合宜。 不是以牙还牙,也不是逆来顺受, 而是用正直的方式让怨发泄出来。 不久前我们小区发生的事情。小区的车位到现在还没有建好,前段时间,开发商说要建车位,并开始售卖剩余的车位,可是价格确实比几年前卖的价格低的多的多。所以,之前买车位的业主就很难受,去退也没有,开发商根本没钱给你。用一个业主的话说就是:

意难平

意难平,就是怨 虽然最终也不了了之了,但是把这个怨表达出来给了开发商,也算是有个出口,可能有时候还是会觉得窝囊,但是能有什么办法呢。当今的大环境就是如此,车位还好点,算是赔了几万块钱,想想同一个小区的房子呢,最高价的时候14000,现在只有不到一万,所以,想想还有别人比你惨,心里是不是好受点。当了韭菜就要有韭菜的觉悟。

所以,怨未必能尽,但若能“直面”它,怨就不会蔓延成恨。 这就是孔子所谓的“直”。


二、“直”的意义,在于止怨而非无怨

人若被怨气缠久了,容易迷失是非。 有时怨的不是别人,而是自己心里的不甘。 “直”让人不被情绪牵着走, 它像一条沟渠,让积怨之水有路可出。

你可以反击,可以申辩,可以拒绝, 但不必怀恨。

以直报怨,不是清除怨气,而是防止怨气滋生。

怨止于直,这一刻,心定了。


三、“以德报怨”,是怨止之后的更高境界

老子说:“报怨以德。” 那是更高的修养,是怨尽心清之后的平和。 但若怨尚未平,便谈以德相报, 那只是压抑,不是化解。

所以孔子说,先“直”后“德”。 以“直”立界,以“德”安心。

先止怨,后化怨。先明理,后谈仁。

两人讲的,不是冲突的两条路,而是修心的步骤。


四、怨未尽,而心已定

“以直报怨”的真正意义在于: 怨或许仍在,但它已不乱人心。 它变成了经验、成了界限、成了智慧。

怨,是人之常情; 直,是理之常道; 德,是心之常明。

当怨有界,德才有根。 怨未尽,心却已定—— 这,便是孔子的智慧。


怨若未报,会伤己; 怨若乱报,会伤人; 以直报怨,则两者皆安。

怨未必无,但心可以静; 怨未必尽,但人可以明。 “以直报怨”,正是这份有界的清醒。

  •  

把GotoSocial嵌入到Hugo

2025年10月21日 11:10

把博客重新换成Hugo后,我又把GotoSocial安装了起来,就是想发布自己有一些碎语之类的东西,在memos和GotoSocial中纠结了一会,最终选择了GotoSocial,主要原因还是看到memeos的作者随意改动API,为了以后不再有不必要的麻烦,还是选择一个更稳定的最好。整体完成后的效果可以参考:

我的微博

总体思路

由于 GoToSocial 默认开启了严格的 CORS 限制,获取内容的时候需要token,由于Hugo是静态博客,直接把token写在前端非常不安全,所以我们需要一个中转层。 Cloudflare Workers 可以完美胜任代理转发的功能,作用是:

  • 从 Hugo 前端发请求 → Cloudflare Worker
  • Worker 向 https://你的域名/api/v1/accounts/…/statuses 请求 GoToSocial 数据
  • Worker 再把 JSON 数据返回给 Hugo 前端
  • Hugo 构建时渲染

获取 GoToSocial 的 toot API 接口

目标概述

我们要:

  1. 向 https://你的域名/api/v1/apps 注册一个应用;
  2. 通过浏览器授权;
  3. 用授权码换取 access_token;
  4. 把这个 token 放入 Cloudflare Worker 的环境变量;
  5. 然后 Hugo 博客就能安全地从 Worker 获取嘟文数据。

详细步骤

注册一个新应用

在命令行执行以下命令(用 curl,别忘了改你的 app 名称):

1
2
3
4
5
6
7
8
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
        "client_name": "hugo-gts-proxy",
        "redirect_uris": "urn:ietf:wg:oauth:2.0:oob",
        "scopes": "read"
      }' \
  'https://你的域名/api/v1/apps'

成功后会返回类似:

1
2
3
4
5
6
7
{
  "id": "01J1CYJ4QRNFZD6WHQMZV7248G",
  "name": "hugo-gts-proxy",
  "redirect_uri": "urn:ietf:wg:oauth:2.0:oob",
  "client_id": "xxxxxxxxxxxxxxxx",
  "client_secret": "yyyyyyyyyyyyyyyy"
}

👉 复制并保存 client_id 与 client_secret。

获取授权码

打开浏览器访问以下链接(注意替换 YOUR_CLIENT_ID):

1
https://你的域名/oauth/authorize?client_id=YOUR_CLIENT_ID&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=read

系统会要求你登录并授权。 点击「允许」,你会看到页面上出现:

1
2
Here's your out-of-band token:
YOUR_AUTHORIZATION_CODE

👉 复制这个 YOUR_AUTHORIZATION_CODE。

用授权码换取访问令牌

然后在命令行执行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
curl -X POST \
  -H "Content-Type: application/json" \
  -d '{
        "redirect_uri": "urn:ietf:wg:oauth:2.0:oob",
        "client_id": "YOUR_CLIENT_ID",
        "client_secret": "YOUR_CLIENT_SECRET",
        "grant_type": "authorization_code",
        "code": "YOUR_AUTHORIZATION_CODE"
      }' \
  'https://你的域名/oauth/token'

会返回类似:

1
2
3
4
5
6
{
  "access_token": "YOUR_ACCESS_TOKEN",
  "created_at": 1729436650,
  "scope": "read",
  "token_type": "Bearer"
}

🎉 这就是我们需要的 access_token!

验证 token 是否可用

试试看:

1
2
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  'https://你的域名/api/v1/accounts/verify_credentials'

如果返回你的用户资料( username, id, url 等),说明 token 有效 。

Cloudflare Worker的设置

接下来打开 Cloudflare → Workers → 你的 Worker → 「Settings」→「Variables」→「Add Variable」

1
2
Name: GTS_TOKEN
Value: YOUR_ACCESS_TOKEN

保存。 Worker 代码示例如下 👇:

点击展开查看完整的配置代码(大约 160 行)
  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
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160

export default {
  async fetch(request, env) {
    const url = new URL(request.url);
    const headers = {
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Methods": "GET, OPTIONS",
      "Access-Control-Allow-Headers": "*",
    };

    if (request.method === "OPTIONS") {
      return new Response(null, { headers });
    }

    const target = `https://你的域名${url.pathname}${url.search}`;
    const resp = await fetch(target, {
      headers: {
        "Authorization": "Bearer " + env.GTS_TOKEN,
        "User-Agent": "GTS-Proxy-Worker",
      },
    });

    if (!resp.ok) {
      return new Response(await resp.text(), {
        status: resp.status,
        headers: { ...headers, "Content-Type": "application/json" },
      });
    }

    const data = await resp.json();
细步骤
    // 并行拉取每条嘟文的回复
    const statuses = await Promise.all(data.map(async (status) => {
      let replies = [];
      try {
        const ctx = await fetch(`https://你的域名/api/v1/statuses/${status.id}/context`, {
          headers: { "Authorization": "Bearer " + env.GTS_TOKEN },
        });
        if (ctx.ok) {
          const contextData = await ctx.json();
          replies = contextData?.descendants?.map(r => ({
            id: r.id,
            content: r.content,
            account: {<details>
<summary>点击展开查看完整的配置代码大约 100 </summary>
              username: r.account?.username,
              display_name: r.account?.display_name,
              avatar完全正确 : r.account?.avatar,
            }
          })) || [];
        }
      } catch (err) {
        console.log("Reply fetch failed:", err);
      }

      return {
        id: status.id,
        created_at: status.created_at,
        content: status.content,
        url: status.url,
        account: {
          username: status.account?.username,
          display_name: statuexport default {
  async fetch(request, env) {
    const url = new URL(request.url);
    const headers = {
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Methods": "GET, OPTIONS",
      "Access-Control-Allow-Headers": "*",
    };

    if (request.method === "OPTIONS") {
      return new Response(null, { headers });
    }

    const target = `https://l22.org${url.pathname}${url.search}`;
    const resp = await fetch(target, {
      headers: {
        "Authorization": "Bearer " + env.GTS_TOKEN,
        "User-Agent": "GTS-Proxy-Worker",
      },
    });

    if (!resp.ok) {
      return new Response(await resp.text(), {
        status: resp.status,
        headers: { ...headers, "Content-Type": "application/json" },
      });
    }

    const data = await resp.json();

    // 并行拉取每条嘟文的回复
    const statuses = await Promise.all(data.map(async (status) => {
      let replies = [];
      try {
        const ctx = await fetch(`https://l22.org/api/v1/statuses/${status.id}/context`, {
          headers: { "Authorization": "Bearer " + env.GTS_TOKEN },
        });
        if (ctx.ok) {
          const contextData = await ctx.json();
          replies = contextData?.descendants?.map(r => ({
            id: r.id,
            content: r.content,
            account: {
              username: r.account?.username,
              display_name: r.account?.display_name,
              avatar: r.account?.avatar,
            }
          })) || [];
        }
      } catch (err) {
        console.log("Reply fetch failed:", err);
      }

      return {
        id: status.id,
        created_at: status.created_at,
        content: status.content,
        url: status.url,
        account: {
          username: status.account?.username,
          display_name: status.account?.display_name,
          avatar: status.account?.avatar,
        },
        replies_count: status.replies_count || 0,
        reblogs_count: status.reblogs_count || 0,
        favourites_count: status.favourites_count || 0,
        media_attachments: (status.media_attachments || []).map(media => ({
          url: media.url?.startsWith("/") ? "https://域名" + media.url : media.url,
          preview_url: media.preview_url?.startsWith("/") ? "https://域名" + media.preview_url : media.preview_url,
        })),
        replies,
      };
    }));

    return new Response(JSON.stringify(statuses, null, 2), {
      headers: { ...headers, "Content-Type": "application/json" },
    });
  },
};</details>
s.account?.display_name,
          avatar: status.account?.avatar,
        },
        replies_count: status.replies_count || 0,
        reblogs_count: status.reblogs_count || 0,
        favourites_count: status.favourites_count || 0,
        media_attachments: (status.media_attachments || []).map(media => ({
          url: media.url?.startsWith("/") ? "https://你的域名" + media.url : media.url,
          preview_url: media.preview_url?.startsWith("/") ? "https://你的域名" + media.preview_url : media.preview_url,
        })),
        replies,
      };
    }));

    return new Response(JSON.stringify(statuses, null, 2), {
      headers: { ...headers, "Content-Type": "application/json" },
    });
  },
};

Hugo模板设置

在 Hugo 博客根目录下,新建:

1
2
content/toots/_index.md
layouts/_default/toots.html

📄 content/toots/_index.md

1
2
3
4
---
title: "我的嘟文"
description: "来自 GoToSocial 的最新动态"
---

🧩 layouts/_default/toots.html

点击展开查看完整的配置代码(大约 280 行)
  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
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
{{ define "main" }}
<main class="main post-single" id="toots-page">
  <header class="page-header">
    <h1>{{ .Title }}</h1>
    {{ with .Description }}
      <p class="page-description">{{ . }}</p>
    {{ end }}
  </header>

  <div id="toots-container" class="toots"></div>

  <div class="load-more-wrapper">
    <button id="load-more-btn">加载更多嘟文</button>
  </div>

  <script>
  let tootsData = [];
  let displayedCount = 0;
  const pageSize = 5; // 每次加载条数

  // ✅ 加载嘟文
  async function loadToots(initial=false) {
    if (initial) {
      // 请注意:如果您要使用 Cloudflare Worker,这里的 URL 应该是您的 Worker URL,而不是原始 Mastodon/GoToSocial 实例的 URL。
      // 假设您的 Worker 地址是 https://worker.yourdomain.com/api/v1/accounts/01M4A5Q58VD6GJH97T2TE6W25J/statuses?exclude_reblogs=true
      const url = "https://toots.iliu.org/api/v1/accounts/01M4A5Q58VD6GJH97T2TE6W25J/statuses?exclude_reblogs=true"; 
      const res = await fetch(url);
      tootsData = await res.json();
    }

    const container = document.getElementById("toots-container");
    const nextToots = tootsData.slice(displayedCount, displayedCount + pageSize);

    for (const t of nextToots) {
      const date = new Date(t.created_at).toLocaleString();
      const username = t.account?.display_name || t.account?.username || "匿名";
      const avatar = t.account?.avatar || "https://l22.org/path-to-default-avatar.png";

      // ✅ 九宫格多图布局
      let mediaHTML = "";
      if (t.media_attachments && t.media_attachments.length > 0) {
        mediaHTML = `
          <div class="toot-media-grid">
            ${t.media_attachments.map(m => `
              <div class="toot-media-item">
                <img src="${m.preview_url || m.url}" alt="${m.description || ''}" loading="lazy" onclick="showLightbox('${m.url}')">
              </div>
            `).join('')}
          </div>
        `;
      }

      // 🚨 【修复点】直接使用 Worker 预取的 t.replies 数据来构建回复内容
      let repliesHTML = "";
      if (t.replies && t.replies.length > 0) {
        repliesHTML = `
          <div class="toot-replies">
            ${t.replies.map(r => {
              const avatar = r.account?.avatar || "https://l22.org/path-to-default-avatar.png";
              const name = r.account?.display_name || r.account?.username || "匿名";
              return `
                <div class="toot-reply">
                  <img src="${avatar}" class="toot-reply-avatar" alt="${name}">
                  <div class="toot-reply-body">
                    <strong>${name}</strong>:${r.content}
                  </div>
                </div>
              `;
            }).join('')}
          </div>
        `;
      } else if (t.replies_count > 0) {
        // 如果 Worker 没有返回 replies 但计数大于 0,可能是 Worker 拉取回复失败
        repliesHTML = `<div class="toot-replies"><p class='no-reply'>暂无回复(或Worker拉取失败)</p></div>`;
      }

      const tootHTML = `
        <article class="toot-card">
          <div class="toot-header">
            <img class="toot-avatar" src="${avatar}" alt="${username}">
            <span class="toot-username">${username}</span>
          </div>
          <div class="toot-date">
            <a href="${t.url}" target="_blank">${date}</a>
          </div>
          <div class="toot-content">${t.content}</div>
          ${mediaHTML}
          <div class="toot-footer">
            ❤️ ${t.favourites_count} 🔁 ${t.reblogs_count} 💬 ${t.replies_count}
          </div>
          ${repliesHTML}
        </article>
      `;

      container.insertAdjacentHTML("beforeend", tootHTML);
      
      // 🚨 【修复点】移除了原有的 loadReplies(t.id) 调用
    }

    displayedCount += pageSize;
    document.getElementById("load-more-btn").style.display = displayedCount >= tootsData.length ? "none" : "inline-block";
  }

  // 🚨 【修复点】移除了 loadReplies 函数

  // ✅ 初次加载
  document.getElementById("load-more-btn").onclick = () => loadToots();
  loadToots(true);

  // ✅ 简易图片灯箱
  function showLightbox(src) {
    let lightbox = document.getElementById("lightbox");
    if (!lightbox) {
      lightbox = document.createElement("div");
      lightbox.id = "lightbox";
      lightbox.innerHTML = `<img id="lightbox-img"><span id="lightbox-close">×</span>`;
      document.body.appendChild(lightbox);
      document.getElementById("lightbox-close").onclick = () => lightbox.classList.remove("show");
      lightbox.onclick = e => { if (e.target === lightbox) lightbox.classList.remove("show"); };
    }
    document.getElementById("lightbox-img").src = src;
    lightbox.classList.add("show");
  }
  </script>

  <style>
  /* 容器样式 */
  #toots-container {
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
    margin-top: 2rem;
  }

  /* 嘟文卡片 */
  .toot-card {
    background: var(--entry);
    border-radius: var(--radius);
    padding: 1rem 1.5rem;
    box-shadow: var(--shadow);
    transition: transform .2s ease, box-shadow .2s ease;
  }
  .toot-card:hover {
    transform: translateY(-2px);
    box-shadow: var(--shadow-hover);
  }

  .toot-header {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 0.5rem;
  }
  .toot-avatar {
    width: 36px;
    height: 36px;
    border-radius: 50%;
    object-fit: cover;
  }
  .toot-username {
    font-weight: bold;
    color: var(--primary);
  }

  .toot-date {
    font-size: .85rem;
    color: var(--secondary);
    margin-bottom: .25rem;
  }

  .toot-content {
    font-size: 1rem;
    color: var(--primary);
    line-height: 1.6;
    overflow-wrap: break-word;
  }

  /* 九宫格多图 */
  .toot-media-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
    gap: 4px;
    margin-top: .5rem;
  }
  .toot-media-item img {
    width: 100%;
    height: 100px;
    object-fit: cover;
    border-radius: 6px;
    cursor: pointer;
    transition: transform .2s ease, opacity .3s ease;
  }
  .toot-media-item img:hover {
    transform: scale(1.05);
    opacity: .9;
  }

  /* 回复样式 */
  .toot-replies {
    margin-top: .75rem;
    border-left: 2px solid var(--border);
    padding-left: .75rem;
  }
  .toot-reply {
    display: flex;
    align-items: flex-start;
    gap: .5rem;
    margin-top: .5rem;
  }
  .toot-reply-avatar {
    width: 28px;
    height: 28px;
    border-radius: 50%;
  }
  .toot-reply-body {
    font-size: .9rem;
    line-height: 1.4;
  }
  .no-reply {
    color: var(--secondary);
    font-size: .85rem;
  }

  /* 加载更多按钮 */
  .load-more-wrapper {
    text-align: center;
    margin: 2rem 0;
  }
  #load-more-btn {
    padding: .6rem 1.5rem;
    border: none;
    border-radius: 9999px;
    background: linear-gradient(90deg, #1e90ff, #0066cc);
    color: #fff;
    font-size: 1rem;
    cursor: pointer;
    box-shadow: 0 3px 10px rgba(0,0,0,.1);
    transition: all .3s ease;
  }
  #load-more-btn:hover {
    transform: translateY(-2px);
    box-shadow: 0 5px 15px rgba(0,0,0,.2);
  }

  /* 灯箱样式 */
  #lightbox {
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,0.8);
    display: none;
    justify-content: center;
    align-items: center;
    z-index: 9999;
  }
  #lightbox.show {
    display: flex;
  }
  #lightbox img {
    max-width: 90%;
    max-height: 85%;
    border-radius: 8px;
    box-shadow: 0 0 15px rgba(0,0,0,.5);
  }
  #lightbox-close {
    position: absolute;
    top: 20px;
    right: 30px;
    font-size: 2rem;
    color: #fff;
    cursor: pointer;
  }

  @media (prefers-color-scheme: dark) {
    .toot-card {
      background: #1c1c1c;
    }
  }
  </style>
</main>
{{ end }}

生成页面

运行:

1
hugo server

访问: 👉 http://localhost:1313/toots/ 即可看到自动加载的嘟文列表。 部署后访问 https://你的博客域名/toots/ 就能看到相同效果。 我是把CSS和模板写到了一起,有兴趣的可以把CSS单独弄一个文件,还会更简练。

  •  

禅让制度以及无为的再思考

2025年10月16日 16:15

最近阅读南怀瑾先生的《禅宗和道家》,书中关于上古史的一些观点引起了我深深的思考。他提到,帝尧是黄帝的曾孙,大禹则是黄帝的玄孙。 禹的儿子子启建立夏朝,开启了中国的“家天下”时代。 从这个角度来看,夏朝的建立,似乎也承继了黄帝的血脉和基业,在某种意义上,称之为黄帝家族的延续也未尝不可。

禅让制:实力与贤德的交织?

这就引出了一个关于古代禅让制度的疑问。传说中尧曾想将位子禅让给许由,但许由拒绝了,这种高洁的精神境界固然令人敬佩,但传说毕竟是传说。 古代的禅让,真的仅仅是“禅贤”吗?从尧、舜、禹的血缘关系和历史记载来看,禅让的对象往往是有实力的部落或部落联盟的首领。例如,舜在被禅让前,已是一位拥有四方部落支持的首领。因此,即使是在被推崇为“天下为公”的禅让时代,“贤德”固然是重要的衡量标准,但“实力”和“政治影响力”恐怕也是不可或缺的砝码。 贤德需要实力的支撑,才能真正实现治理天下的抱负。

历史课本对“无为”的误解与“消极”的标签

第一次接触“无为”,是在初中历史课本上。课本将老子的思想概括为“消极”,用“小国寡民”、“鸡犬之声相闻,老死不相往来”来论证其“退步”和“与世隔绝”。那时候,我对课本的观点深以为然。 然而,十几年过去了,令人遗憾的是,这种对老子思想的刻板化和标签化的误解似乎依然存在于某些教育体系中。前几天与女儿讨论古代史,她口中重述的,依然是老子思想“消极”的论调。 我深感,历史课本在这种误解的传播中,“功不可没”。

“无为”的真谛:非“躺平”,而是“有所不为”

“无为”的本意,绝非我们现在常说的“躺平”或“不作为”。 我认为,这里的“为”的真正内涵,应该是“妄为”或“刻意而为”,即:

  • 违反自然规律;
  • 勉强行事;
  • 出于私心或主观意愿的强行干预。

“无为”不是不行动,而是“无不当为”。它体现在行动上,就是“有所为,有所不为”。只做自己能做的、该做的,不强求能力范围之外的事,不进行过度焦虑或私欲驱动下的强行干预。

这种“妄为”在当今的教育领域尤其明显,“鸡娃”现象便是典型。父母过度焦虑,强行推动孩子做超出其年龄和兴趣范围的事情,便是典型的“刻意而为”与“强行干预”。

“无为”的智慧,在于顺应自然,尽己所能。

当你顺其自然地、尽心尽力地去努力,在各个方面都做到位了,不执着、不强求,最终自然而然会达到“无不为”的境界。这才是“无为而无不为”的真正含义——以不妄为的态度,最终成就一切该成就的事业。 老子的思想,远不是简单的“消极”二字可以概括的,它蕴含着深邃的治理智慧和人生哲理,值得我们每一个人重新去审视和体悟。

  •  

给Hugo PaperMod主题添加一个漂亮又简洁的友情链接页面

2025年10月13日 15:45

PaperMod 默认是极简风格,没有自带“友情链接(Friends / Links)”页,但是我们博主也不是互联网的孤岛,总有一些自己喜欢的左邻右舍,最简单的方法是用生成一个页面来作为友情链接页面,但是太丑了。老刘结合chatgpt,自己添加一个漂亮的友情链接页面,下面是 详细教程(以 Hugo + PaperMod 为例):

一、创建友情链接页面

在你的 Hugo 项目根目录执行:

1
hugo new friends/_index.md

这会在 content/friends/_index.md 生成文件。 打开该文件,修改为:

1
2
3
4
5
---
title: "友情链接"
layout: "friends"
summary: "那些值得一去的好地方"
---

( 注意: layout 是我们下一步要创建的模板文件名。)

二、创建页面模板

PaperMod 的页面模板位于:

1
themes/PaperMod/layouts/

但我们不直接改主题文件(避免主题升级覆盖),而是复制到你的项目中:

1
mkdir -p layouts/_default

然后创建一个新模板文件:

1
nano layouts/_default/friends.html

写入以下示例模板(简洁、与 PaperMod 风格一致):

 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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
{{ define "main" }}
<main class="main-content" id="main-content">
  <article class="post-single">
    <header class="post-header">
     

      <h1 class="post-title">{{ .Title }}</h1>
      {{ with .Params.summary }}
        <p class="post-description">{{ . }}</p>
      {{ end }}
    </header>
<style>
.friend-links {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 1.2rem;
  margin-top: 1.5rem;
}
.friend-card {
  display: flex;
  align-items: center;
  padding: 1rem;
  border-radius: 0.75rem;
  background: var(--entry);
  box-shadow: 0 1px 3px rgba(0,0,0,0.1);
  transition: all 0.25s ease;
}
.friend-card:hover {
  transform: translateY(-4px);
  box-shadow: 0 4px 10px rgba(0,0,0,0.15);
}
.friend-card img {
  width: 3rem;
  height: 3rem;
  border-radius: 9999px;
  margin-right: 1rem;
}
.friend-card .text-gray-600 {
  color: var(--secondary);
}
</style>

    <div class="post-content">
      {{ .Content }}

      <div class="friend-links grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4 mt-6">
        {{ range .Site.Data.friends }}
          <a href="{{ .url }}" target="_blank" rel="noopener" class="friend-card flex items-center p-4 rounded-xl shadow-sm hover:shadow-md transition">
            <img src="{{ .avatar }}" alt="{{ .name }}" class="w-12 h-12 rounded-full mr-4">
            <div>
              <div class="font-semibold">{{ .name }}</div>
              <div class="text-sm text-gray-600">{{ .desc }}</div>
            </div>
          </a>
        {{ end }}
      </div>
    </div>
  </article>
</main>
{{ end }}

三、创建数据文件(友情链接信息)

在项目根目录新建:

1
data/friends.yml

添加如下内容(你可以随意扩展):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
- name: "PaperMod 官方"
  url: "https://github.com/adityatelange/hugo-PaperMod"
  avatar: "https://avatars.githubusercontent.com/u/21258296?v=4"
  desc: "简洁优雅的 Hugo 主题"

- name: "Hugo 官网"
  url: "https://gohugo.io/"
  avatar: "https://gohugo.io/images/hugo-logo-wide.svg"
  desc: "世界上最快的静态网站生成器"

- name: "老刘博客"
  url: "https://iliu.org/"
  avatar: "https://iliu.org/img/apple-touch-icon.png/"
  desc: "分享我的思考与生活"

四、将“友情链接”加入导航栏

打开 config.yml 或 config.toml(根据你使用的格式),找到菜单配置部分:

1
2
3
4
5
6
menu:
  main:
    - identifier: friends
      name: 友情链接
      url: /friends/
      weight: 30

五、重新生成并预览

1
hugo server -D

打开浏览器访问:

1
http://localhost:1313/friends/

即可看到一个简洁、卡片式的友情链接页面,与 PaperMod 风格一致。 具体风格可以参考: 老刘博客

通过以上步骤,你就成功地为 Hugo PaperMod 主题添加了一个既美观又简洁的友情链接页面。这个页面不仅能增强你的站点互通性,还能提升用户体验。如果你喜欢,也可以根据自己的需求对样式和布局进行进一步的调整和优化。希望这篇文章对你有所帮助!

  •  

群晖NAS安装FRP客户端(frpc)

2025年10月11日 08:12

今年5月份的时候,购买了一款搬瓦工的VPS,当时是想用来做博客的VPS,用的是美西的优化线路,速度非常的理想,前几天我又把博客系统转回到了Hugo,这样这台VPS就空出来了,加上最近群晖的QC以及tailscale这些都不太理想,所以我决定使用FRP的方式来穿透群晖。搜了一下网上的教程都是采用的docker,但是我安装后总是报错,所以研究了一下,采用直接安装的方式,省资源还不容易出错。本文详细介绍如何在用户目录下部署frpc,并实现开机自启。

一、FRP 简介

FRP(Fast Reverse Proxy)是一款高性能反向代理应用,可实现 内网穿透。 通过在公网服务器上运行 frps(服务端),在内网设备上运行 frpc(客户端),你就可以从外网直接访问局域网中的群晖 DSM、SSH 等服务。

二、准备条件

一台有公网IP的服务器,这里老刘推荐搬瓦工的美西优化线路,速度非常的理想。购买服务器后,安装1panel面板,然后在应用里搜索FRP,安装frps。到这里,你所需要的条件如下:

  • 公网服务器 IP(frps):104.***….
  • 认证 token:xxxxx
  • 群晖局域网 IP:192.168.3.19
  • 群晖登录用户:xxxxx

token、端口号这些可以在你安装的frps应用里查找。

三、在群晖上安装 frpc

1. 进入用户目录

1
cd /var/services/homes/xxxxx

放在用户目录无需 root 权限,最安全。

2. 下载 frpc

x86_64 群晖(Intel/AMD 平台)

1
wget https://ghproxy.net/https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_amd64.tar.gz

ARM64 群晖(J 系列或低功耗 NAS)

1
wget https://ghproxy.net/https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_linux_arm64.tar.gz

解压并重命名:

1
2
3
tar -zxvf frp_0.61.1_linux_amd64.tar.gz
mv frp_0.61.1_linux_amd64 frp
cd frp

四、创建配置文件

1
nano frpc.toml

写入内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
serverAddr = "104.***.***.***"
serverPort = 7000
auth.token = "xxxxx"

[[proxies]]
name = "synology_web"
type = "tcp"
localIP = "192.168.3.19"
localPort = 5000
remotePort = 5000

[[proxies]]
name = "synology_ssh"
type = "tcp"
localIP = "192.168.3.19"
localPort = 22
remotePort = 6000

保存退出。

五、测试运行

1
./frpc -c ./frpc.toml

若看到:

1
start proxy success

说明连接成功。

六、后台运行(可选)

1
nohup ./frpc -c ./frpc.toml > frpc.log 2>&1 &

查看日志:

1
tail -f frpc.log

停止运行:

1
2
ps aux | grep frpc
kill [进程号]

七、开机自启(可选)

  1. DSM → 控制面板 → 计划任务 → 创建 → “触发的任务” → “用户定义的脚本”
  2. 用户选择 xxxxx或者root
  3. 脚本内容:
1
/var/services/homes/xxxxx/frp/frpc -c /var/services/homes/xxxxx/frp/frpc.toml
  1. 保存并勾选“启动时运行”

八、验证连接

在外网访问:

1
http://公网服务器IP:5000

如果配置了 SSH 通道:

1
ssh xxxxx@公网服务器IP -p 6000

即可远程登录群晖。

✅ 总结

  • 所有文件都放在 用户目录下,无需 root 权限
  • 支持 DSM 重启后自动运行
  • 安装简单、权限安全、长期稳定
  •  

夜里玩手机差点失明:一位老顾客的青光眼惊魂记

2025年10月10日 09:39

假期期间一个老顾客说眼镜腿被他给踩坏了,约了节后来修理。加了面第一句话就说:“差点瞎了。” 我一愣,他接着说自己最近被诊断为急性青光眼,发作时眼压高达 40 多,医生说再晚点去,眼睛就保不住了。

事情的起因听起来似乎“无关紧要”——晚上不开灯玩手机

夜间看手机


一、隐秘的“视力小偷”

青光眼,是一种非常狡猾的病。 它往往悄无声息地出现,不疼不痒,等人察觉到视力模糊、看东西不全时,视神经已经受损。 医生甚至给它起了个名字—— “无声的视力小偷”

但青光眼并不是一种单一的病,而是一个大类,主要分为两种:

  • 开角型青光眼:最常见,病程缓慢,早期几乎没症状,视野一点点变窄;
  • 闭角型青光眼:发作急、来势猛,常伴剧烈眼痛、头痛、视物模糊,看灯出现彩虹圈,有时甚至恶心呕吐。

老顾客得的就是第二种——急性闭角型青光眼


二、从“头疼”到“看不清红绿灯”

最近一年多的时间,他总感觉头痛,洗澡、咳嗽的时候眼睛发红 平时有高血压史的人,大多会以为这是“血压高”或“心脏累”。 于是他量了血压,正常。 心电图,也没问题。 于是自己吃了几片止疼药,把疼痛压住了。

直到有天开车上路,发现看不见红绿灯了。 “我给你李姐(他媳妇)说,坏了,我的眼睛有问题了!” 那一刻他才意识到,问题出在自己的眼睛上。

去医院一查,眼压飙到 40 多毫米汞柱(正常一般在 10~21)。 医生说让他手术,他有点顾虑,后来找到一个省人民医院的大夫,在肚子上扎的针灸,扎过之后眼压立马降低了。 经过一个月的针灸治疗,他现在恢复的不错,只有少许的视野有点受影响,可能视神经还是有点没有恢复。


三、为什么“黑暗+手机”会出事?

很多人听到这里会惊讶: 玩手机也能玩出青光眼?!

其实关键不是“手机”,而是黑暗环境。 在光线昏暗时,我们的瞳孔会自然放大,以便获得更多光线。 而对于有“前房浅”“房角窄”的人来说,这个过程会让虹膜向前鼓起,把房水的排出通道堵住,就像堵死了下水道。 于是,房水排不出去,眼压瞬间升高——青光眼发作。

换句话说: “黑暗+瞳孔扩大”是导火索,前房结构异常才是火药桶。

而“躺着玩手机”“关灯看屏幕”恰好提供了一个最完美的诱发环境: 单眼注视、黑暗环境、瞳孔持续扩张,再加上长时间疲劳——足以让高危人群中招。


四、谁属于高危人群?

以下几类人要特别小心:

  • 年龄超过 45 岁;
  • 有远视(眼轴短、前房浅);
  • 女性;
  • 家族中有人得过青光眼;
  • 曾被眼科医生提示“前房浅”“角隙窄”;
  • 长时间服用某些扩瞳或抗抑郁药物。

这类人群,即使没有症状,也应定期做眼压测量裂隙灯检查,最好加做前节 OCT 或房角镜检查。 医生能判断你的“房角”是否够宽,是否有闭角的风险。


五、急性发作时该怎么办?

一旦出现以下症状,请立即去眼科急诊:

  • 突发性剧烈眼痛、头痛;
  • 看灯有彩虹圈;
  • 视物模糊、看不清;
  • 恶心、呕吐、瞳孔固定发亮。

别再等,别再吃止疼药。 止疼药只会掩盖症状,让眼压继续升高。

到医院后,医生会尽快:

  • 给予降眼压药物(滴眼液、口服或静脉用药);
  • 必要时进行激光周边虹膜切开术(LPI) ,开出一个“逃生孔”,让房水顺利流通。

这是救眼的关键一步,做完后一般不会再急性发作。


六、预防:从今天开始

  1. 不要关灯玩手机。 睡前刷手机最好开盏柔和的小夜灯,让环境光保持平衡。
  2. 避免用眼过度疲劳。 每用眼 40 分钟,休息 5~10 分钟,看远放松。
  3. 定期眼科体检。 特别是 40 岁以上、有家族史或远视的人,每年查一次眼压和前房角。
  4. 谨慎使用药物。 有青光眼或窄角倾向的人,使用含伪麻黄碱、抗抑郁或抗胆碱药物前,应咨询医生。
  5. 保持良好睡眠与血液循环。 青光眼和全身循环状态有关,规律作息同样重要。

七、一个普通人的提醒

那位老顾客最后感慨地说:“真没想到,晚上玩个手机能差点瞎。” 医生告诉他,这次算是幸运,抢救得早,视力才恢复得快。 但受损的视神经不会再生,他必须长期用药、定期复查。

有时候,灾难离我们并不远。 它藏在一个不起眼的习惯里—— 比如,在黑暗中盯着那块小小的屏幕。


写在最后: 夜里玩手机,并不会让所有人得青光眼,但对于有风险的人,它确实可能成为压垮视神经的最后一根稻草。 比起事后抢救,不如提前了解、提前预防。 一盏小夜灯,也许能照亮的不只是屏幕,还有你的未来。

  •  

秋雨连绵的假期

2025年10月9日 16:22

这个秋天的雨,似乎特别多。几乎每隔两天就要下一场,断断续续地已经一个多月没停了。仿佛老天爷是要把春天欠下的雨水,一次性补回来似的。看天气预报,说又有新一轮降水,我一点都不意外——整个十月,家门口的景色都快成“江南水乡”了。

今年国庆假期,哪儿也没去。整个假期最“远”的一趟路,是3号那天。女儿和同学相约去电影小镇玩,我们顺道把她送过去,然后去了一趟媳妇的娘家。岳父家从过完年就开始建房,到现在还没完工。路上买了点烧饼和卤菜,到家已经下午一点多了,吃了点东西,又去新房那边看了看,就匆匆往回赶。车流量挺大,好在一路都还算顺畅,没有遇到堵车。

阴雨中的农家小院

只是回来的路上,感觉车子有点不对劲。车速到110公里左右时,方向盘开始轻微抖动——这一般是动平衡的问题。我心想,既然后轮的轮胎也用了十年,干脆一起换掉吧。现在轮胎价格也不算贵,两条加起来五百来块钱,花点钱换个安心,尤其最近跑高速的次数多,安全最要紧。

换轮胎时才发现,右前轮里面竟然有个小东西晃着——原来是加装的胎压监测发射器掉了。车子本身没这个功能,当年我花八百块加装的,现在的同款设备早就便宜多了,三百块就能装一个,还包安装。看来技术的更新换代,连“小玩意儿”都在不断降本提效。

假期最后一天,也就是8号,女儿返校。想着出城方向应该不会堵,结果还是太天真了——高速上车子最多只能跑到80公里,平常一个小时的路程,愣是开了一个半小时。好在回程时我有经验了,提前绕开了几个易堵点,虽然还是用了一个半小时,但比导航推荐的路线快了半小时,算是小小的胜利。

烟雨迷蒙的公路

这个假期没有远行,没有风景大片,也没有热闹的聚会,只有连绵的秋雨、湿漉漉的道路,以及一次关于轮胎的小插曲。倒也挺好,平淡的生活里,总能遇见点有趣的小事——这不,也成了一篇小小的秋日记。

  •  

Ubuntu24.04安装Windterm

2025年10月2日 10:33

经过这一段时间的使用Linux,我发现确实是可以满足我日常的使用。系统也流畅,再没有了之前使用Windows 11的时候偶尔的卡顿,决定长期使用了。既然要长期使用那么EndeavourOS就不是太适合了,毕竟这个以Archlinux为基础的系统,追求的是新而不是稳定。所以我决定换成Ubuntu,而之前科学软件换了一款之后,影响我使用的因素也不存在了。

换了Ubuntu之后,我常用的微信,wps,anytype等软件都有deb的安装包,只有windterm是源码的形式。没法直接点击安装,当然,可以在终端中用命令直接打开,但是不是很方便。找了一下网上的方法,也没有能很好的解决,最终还是借助ai,才安装成功。如下:

下载

在这里下载最新的源码:https://github.com/kingToolbox/WindTerm

安装

首先在opt下建立一个叫windterm的文件夹,把刚才下载的源代码解压复制过去。然后按下列步骤进行:

1. 给可执行权限

进入目录,确保主程序能运行:

1
2
cd /opt/windterm 
sudo chmod +x WindTerm
1
/opt/windterm/WindTerm

如果能启动,就说明没有问题

建立软链接(让你直接用 windterm 启动)(可选)

1
sudo ln -s /opt/windterm/WindTerm /usr/local/bin/windterm
1
windterm

之后在终端输入这个命令,就能直接用了

创建桌面图标(应用菜单里显示)

新建一个 .desktop 文件:

1
sudo nano /usr/share/applications/windterm.desktop

输入以下内容:

1
2
3
4
5
6
[Desktop Entry]
Name=WindTerm
Exec=/opt/windterm/WindTerm
Icon=/opt/windterm/windterm.png
Type=Application
Categories=Utility;TerminalEmulator;

保存并退出。然后刷新数据库:

1
sudo update-desktop-database

现在你就可以在应用菜单里找到 WindTerm 了。

ubuntu-24-04-install-windterm

  •  

秋日絮语

2025年9月29日 10:31

又是一年秋。

周一的清晨,难得的阳光驱散了连日的阴雨。空气里也弥漫着一股清甜的香气。甜腻而绵长的香味仿佛在风里缓缓流动,钻进鼻腔,沁入心脾。古诗云“桂子月中落,天香云外飘”,在这样的季节,桂花似乎成了中秋最鲜明的注脚。

这香气,让我的思绪瞬间飘回了遥远的过去。1998年的郑州,郑州工业大学的校园里,小礼堂旁的那棵桂花树,在微凉的夜色里,将甜腻的香气无所顾忌地释放。那时的我,书生意气、挥斥方遒,总觉得这香味过于浓烈,像一个热情过度的姑娘,让人难以消受。

可岁月是一剂奇妙的良方。它让人慢慢褪去年少时的锋芒,也教会人珍惜那些看似寻常的气息。如今,郑州的街头已然种满了桂花树,每逢中秋,整座城市都弥漫在甜香中。人到中年,心境已不同往昔,那股曾经嫌弃的香气,如今却成了记忆的触媒。每当它再次出现,总能勾起我心底最柔软的角落,让我想起青春、想起已逝的亲人,也想起人生中无数个微小却真切的瞬间。

抵达叔叔家,却吃了个闭门羹。大门紧锁,给他打了电话才知道,老两口趁天晴去了城边的地里——他们在那里种了些芝麻和红薯。叔叔也七十多岁了,年纪大了闲不住,都劝他们别摆弄这些东西了,但是他们还是放不下,说趁身体还能动弹,做点农活心里踏实。

我在楼下等他们归来,秋日的阳光透过树叶的缝隙洒下来,本是温柔的时刻,却被花脚蚊子搅得不得安生。蚊子在小腿上肆意叮咬,痒得让人直跺脚。这让我忽然想起小时候在老家院子里乘凉的夜晚,夏天的蚊子成群结队,父亲总要点上几支蚊香,烟雾缭绕中,星空格外清晰。

等了片刻,叔叔婶子回来了。两个人衣衫上沾满了尘土和汗水,却神情满足。中午的饭菜极为简单,几样家常小炒,一壶老酒。叔叔劝我陪他喝一杯,我也没推辞。杯中酒不算烈,却有股子实实在在的醇厚。饭桌上没有什么客套话,都是家长里短,正是这种自然不加修饰的氛围,让人觉得格外踏实。

婶子提起了老家的近况,声音里带着几分叹息。小姑父在三个月前去世,走得安静,没有什么遗言。表哥因为年轻时一时冲动,因追债动了手,被判刑入狱。十几年光阴一晃而过,小姑父始终没能等到儿子出狱的那一天。老人走了,留给身后的亲人只是无尽的遗憾。

小姑的身体也每况愈下。她一个人孤零零地待着,病痛缠身,生活失去了依靠。说到这里,婶子忍不住摇头,叹了口气。其实老年人啊,最怕的就是孤独。病痛也许还能靠药物缓解,可心里的寂寞无人能替。

我想起了年初去世的舅舅。舅舅在世时,虽然也是卧床不起,妗子还得照顾他,但家里有他,总归是个支撑。如今他走了,舅妈像失去了全部寄托,整个人一下子萎顿下来。人到暮年,失去了伴侣,生命仿佛也失去了方向。

人生啊,真是转瞬即逝。年轻的时候,总觉得日子长得没有尽头。可当你眼睁睁看着一位又一位长辈离开,才真正明白什么叫做无常。

说起堂哥那一支,叔叔的语气便冷淡下来。堂哥家依旧是一地鸡毛。儿子不成器,整日吊儿郎当,不务正业。孙子学习也不好,贪玩成性。家庭就像是一面镜子,反映的往往不是一时的成败,而是几代人累积下来的习惯和风气。(可以看我的另一篇文章《 谋占田园决生败子》)

“家风”这个词听起来古旧,却实实在在地影响着后代。堂哥一家总爱在亲戚之间占点便宜,看似是精明,实际上却让亲情变得疏远。农村生活的表象常常是诗意的:炊烟袅袅,阡陌纵横,邻里之间热络相处。但在这些田园风光的背后,藏着太多微妙的人情世故。亲情常挂在嘴边,可一旦涉及到利益,情分也会显得脆弱。

我望着婶子微微叹息的神情,心里忽然涌起一种复杂的感受。农村的确淳朴,但也绝非理想化的天堂。生活里的真相,总是夹杂着温情与冷漠,善意与算计。

午后,我独自走在回程的路上。阳光斜斜地照在街道上,桂花的香味依旧浓烈,仿佛要把人的心都填满。可无论香气多么甜美,也遮掩不了岁月的无情。

想起少年时的轻狂,想起如今亲人的渐渐老去,心里不免五味杂陈。人生就像四季更替,有过春天的蓬勃,有过夏天的热烈,也终究要走向秋日的凋零。

可即便如此,生命中依旧有值得珍惜的东西。就像这一日的阳光,哪怕转瞬即逝,也足以温暖人的心。就像这一城的桂花香,哪怕甜得过头,也足以提醒人:在流逝的岁月里,还有一些东西,是恒常不变的。

人生有限,所能做的,不过是在有限的日子里,珍惜当下的人,走好脚下的路。

  •  

浅谈阿Q精神

2025年9月25日 10:15

最近看释万行法师的《降伏其心》,看到一段很有意思的话:

“比如今天我俩打了一架,我输给了你。表面上看是你赢了,我输了。实际上我内心的承受力增强了,甚至增强了许多倍。而你的我执、虚荣心、好胜心也增加了,甚至也增加了许多倍。”

读到这里,我忍不住笑了,这不就是鲁迅先生笔下的阿Q吗?然后,翻了一下评论区,果然也有读者说这是阿Q,但笑过之后再仔细一琢磨,又觉得法师所说的和阿Q的“精神胜利法”还是有着本质的区别。

鲁迅笔下的阿Q,是在压迫和逆境中挣扎求生的一个可怜人。他没有能力去反抗,于是只能发展出一套扭曲的心理机制来维持生存。这种机制的核心,就是通过自我欺骗、自我麻醉的方式来面对失败和屈辱,达到自我安慰的目的。阿Q精神的具体表现,可以总结为以下几点:

  • 精神胜利法: 这是阿Q精神最核心的特征。当他被别人欺负、侮辱时,他不会反抗,而是迅速在内心找借口,把失败看作胜利,把屈辱看作光荣。比如,他被打了,会想象成是“儿子打老子”,或者认为自己是“第一个自轻自贱的人”,从而在精神上取得胜利。
  • 选择性遗忘: 阿Q的记忆是选择性的。他会迅速忘记那些让他感到痛苦和屈辱的事情,只记住那些能让他感到一丝优越感或胜利感的事情。这种选择性遗忘帮助他维持内心的平衡,继续活在自己的世界里。
  • 盲目自大: 尽管阿Q在现实中处处碰壁,但他内心却充满了盲目的优越感。他看不起所有的人,认为自己比别人都高一等。这种自大是一种虚假的自我膨胀,用来弥补现实中的卑微。

总而言之,阿Q精神是一种向内退缩、逃避现实的防御机制。它是一种病态的心理,虽然能让人暂时获得安慰,但从根本上讲,它无法解决任何问题,反而会让人变得更加麻木不仁。

那么,万行法师所说的又是什么呢?法师说,失败让我内心的承受力增强了。这里的关键词是承受力,这和阿Q那种“我没输,我赢了”的自欺欺人完全是两回事。阿Q是在逃避,他拒绝承认失败的存在,把失败扭曲成胜利。他从不面对失败,也从不从失败中汲取任何有益的东西。他的“胜利”是虚幻的,一碰就碎。

而法师所说的,恰恰是直面失败。他承认自己输了,接受了这个事实。正是因为接受了,他才能在失败中反思、总结、成长。他从这次挫折中获得了宝贵的经验,让自己的内心变得更加坚韧。这个过程,是一种向内成长、直面现实的建设性行为

一个是通过欺骗自己来逃避失败,另一个是直面失败并从中汲取力量。一个是为了维护脆弱的自尊,一个是真正让内心变得强大。这二者的区别,就好比是饮鸩止渴刮骨疗毒

阿Q的精神胜利法,就像是饮鸩止渴。它能让你暂时忘记痛苦,但毒素仍在体内,最终只会让你走向灭亡。而法师所说的内心强大,则是刮骨疗毒。虽然过程痛苦,但它能彻底清除病灶,让你重获新生。

所以,当我们面对挫折时,不妨扪心自问:我是在欺骗自己,还是在强大自己?这一个简单的区别,可能就是你未来人生走向天差地别的关键。

  •  

从 Windows 到 Linux:重新体验的过程与心得

2025年9月23日 10:13

几年前,我使用过一段时间Linux,后来因为没有官方的微信客户端,并且每三个月需要报税的软件只能在Windows上使用,所以我放弃了Linux,转而使用了Windows 11,过了几年,便懒得再折腾。最近,电脑偶尔会出现卡顿的情况,每次都需要重启才能解决。我曾经重置过系统,但问题依然没有得到彻底解决。恰好,我看到某位博友写的主力使用Ubuntu24的博客,因此,我决定重新尝试使用Linux,毕竟我的电脑使用场景非常简单,除了偶尔报税,其它基本需求都能在Linux下实现。

我的需求

  1. 写博客:主要使用思源笔记。
  2. 上网:浏览网页,查找资料。
  3. 微信:官方已经出了客户端,体验基本上和Windows上一致
  4. 偶尔结合AI写点小程序:一些简单的开发任务。
  5. 每三个月报税一次:这一点只能在Windows下实现。

对于我来说,Linux完全可以满足上述需求,除了报税以外,其他都可以在Linux上顺利完成。

选择发行版

我尝试过几个Linux发行版,分别是:

  • Deepin:虽然其界面精美,但安装过程中出现了问题——将系统烧录到U盘后,安装时屏幕闪烁,无法正常安装,因此我放弃了。
  • Ubuntu:安装没有问题,系统也非常流畅。不过,由于Snap源中有些软件版本过低,且GitHub上没有直接的deb包,我在使用“科学”时遇到了些许麻烦。同时,安装WPS时,还需要去Windows系统中搞字体,非常繁琐。
  • EndeavourOS:最终我选择了EndeavourOS,使用GNOME桌面环境。这个发行版的软件更新较为及时,且桌面体验与Ubuntu非常相似。安装和使用都非常顺利,整体性能也非常好。

安装过程

现在Linux的安装已经变得非常简单。回想起1999年左右的那段日子,记得我有个室友想尝试安装Linux,结果不但没有成功,还把硬盘搞得无法识别,最后不得不花钱请人来重新分区。现在的安装过程就简单得多了。

我的分区方案如下:

  • Snap分区:8GB
  • EFI分区:4GB(其实EFI不需要这么大,分区时手滑多了个0,结果就这样了)
  • 系统分区:80GB
  • Home分区:剩余的全部分配给了Home

安装过程也非常简便,选择在线安装后,可以根据需要选择桌面环境。分区完后,只需要按照提示操作就能完成安装。

安装后的使用

安装完成后,我就开始配置常用软件了。以下是我目前使用的一些软件:

  1. 微信:archlinux安装软件现在是非常的方便了,直接用yay命令,省去了到处找软件的步骤,这也是很多人使用Arch Linux的原因。
  2. 思源笔记:写博客、做笔记时使用,功能强大且稳定。
  3. SSH客户端(WindTerm):这是我在Windows下也常用的工具,功能全面,非常推荐。
  4. 小狼毫输入法(RIM):为Linux提供了中文输入支持,配合雾凇拼音方案,和Windows下体验一致
  5. Edge、Chrome浏览器:Microsoft的浏览器在Linux下也运行流畅。
  6. WPS:在Linux上安装WPS办公套件,安装时需要同时安装相关字体,方便使用。

例如,如果要安装微信,只需要在终端输入以下命令:

1
yay wechat

然后按照提示选择你要安装的软件即可,比macOS和Windows上的软件安装要简单得多。这是我安装完成后的截图:

总结

Linux的安装和使用已经变得越来越方便,尤其是对于像我这样需求简单的用户。通过选择EndeavourOS和GNOME桌面,我可以顺利完成日常的写作、上网、使用微信、开发小程序等任务。虽然报税这一场景仍然需要依赖Windows,但除此之外,Linux已经足够满足我的工作和生活需求。

如果你也是个需求简单的用户,或许可以考虑尝试Linux系统。无论是安装过程的简便,还是软件的丰富性,都能给你带来不小的惊喜。

  •  

风动,幡动还是心动

2025年9月19日 10:35

读南怀瑾先生的《禅宗和道家》,读到“风动、幡动、心动”这个典故(佛家称为公案)时,我的思绪回到了过去。

记得第一次读到这个公案,大概是在初中的政治课本上。故事是这样的:

唐代仪凤元年(676年),慧能大师在广州法性寺(今光孝寺)听印宗法师讲《涅槃经》。一阵风吹来,寺中的幡旗随风摇曳,引发了两位僧人的争论。一位僧人说:“是风在动。”另一位坚持:“是幡在动。”两人争执不下,慧能大师便上前说道:“不是风动,也不是幡动,是仁者的心在动。”

当时读到这里,我心想古人真傻,这看似很有哲理,实则是对自然现象缺乏了解,根本就是一种空气流动罢了,和风、幡、心都毫无关系。甚至到了大学,我和信奉佛教的父母聊起这个公案时,依旧是以嘲弄的口吻,当时还试图用这个典故让他们“回头”。

随着年龄增长,读书和见识也多了,才发现当初的小丑恰恰是我自己。

这哪是古人没有见识,分明是我的认知高度不够,没有达到那个层次,所以才会去嘲笑古人。这正如庄子所说的“小知不及大知,小年不及大年”;我就是那只嘲笑大鹏的蜩与学鸠。

古人不仅不愚蠢,反而在思想和心境上高出今人许多。越到现代,物质文明越是发达,但在思想和文化上的建树却越来越少。自明代王阳明的《传习录》之后,似乎再也没有新的经典流传下来。

如今再回看这个公案,才真正体会到它的深刻内涵。慧能大师所言的“心动”,并非指生理上的心脏跳动,而是指我们内心的分别、执着和妄念。风和幡不过是客观存在的现象,真正赋予它们意义,并引发争论的,是人心中的“分别心”。

这或许就是现代人所缺失的——向内观照的能力。我们习惯于向外追寻、向外比较,沉溺于物质世界的纷繁复杂,却忘了回望自己的内心。正如风动、幡动,我们的人生看似被外部环境所驱动,实则,是我们自己的心动,在决定我们如何看待世界,如何经历人生。

写到这里,忽然发现,当年和现在对这段公案的不同认知,何尝又不是一个心动呢。

  •  

金钱心理学:财富、人性和幸福的永恒真相

2025年9月18日 10:10

我曾以为,理财是一个很复杂的东西,股票、基金、保险等等,充满了复杂的公式和博弈。所以,对理财这方面一直抱着敬而远之的态度,只会挑选一些风险小的项目。也曾在股市上投入了一些,但每次都赶不上节奏,所以慢慢的这方面的心思也就淡了。

前几天偶尔在微信读书上看到了摩根·豪泽尔的《金钱心理学:财富、人性和幸福的永恒真相》这本书,才发现原来理财也可以是这么简单的一件事情,但简单的事情,往往也是最不容易做到的事情。

我们很多人都会大精力花在寻找下一个“暴富”的机会上,希望能一击即中,实现财务自由,其实这是很不现实的东西。这本书没有教我们如何赚钱,而是教我们如何守财

这听起来似乎现在主流的消费观向左,但我认为却触及了财富的本质,特别是当下这个大环境中,守财才是更重要的。书中虽然用了大量的例子,但给我印象最深,也是颠覆我原来概念的一个例子是:地球的冰河期并非由某个特别寒冷的冬天造成,而是因为无数个凉爽的夏天。那些看似不够热的夏天,导致上一年的冰雪没有完全融化,日积月累,最终形成了巨大的冰川。我一直以为,冰河期的形成,是突变的,是哗啦一下子,地球被冻上了。

作者用这个例子来说明,真正的财富积累,靠的不是一夜暴富的“寒冬”,而是日复一日的“凉爽夏天” 。每一次克制消费的欲望、每一笔看似微不足道的储蓄和投资,都像那没有融化的冰雪,一点一滴地堆叠,最终形成难以想象的“财富冰川”。

作者还说,很多人把“有钱”等同于拥有昂贵的消费品,比如豪车、名表或名牌包。但这些东西都是已经花掉的钱,是已经变成资产负债的消费品。它们在账面上是负债,因为它们会贬值,并且需要额外的维护费用。

相比之下,账户里的钱——无论是存款、股票、基金还是其他投资——才是你真正拥有的财富。这部分钱是你的流动资产,是你可以随时调动、用来抵御风险或创造更多价值的资本。

这本书也给了我一个全新的视角来看待金钱:财富的终极目的,不是为了炫耀,而是为了获得掌控时间的自由。这本书告诉我们的是如何调整自己的心态,理解人性的贪婪与恐惧,从而在长期的金钱游戏中稳步前行。

真正的财富秘密,不在于你赚了多少钱,而在于你守住了多少钱,以及你如何让这些钱,为你赢得更广阔的人生。

  •  
❌