普通视图

发现新文章,点击刷新页面。
昨天以前首页

惊艳的Google NotebookLM输出的中文音频读书笔记

2025年5月1日 17:50

Google的AI笔记应用工具NotebookLM最近更新,支持输出中文的音频内容(Audio Overview)了(50+anguage),我用最近看的《叫魂:1768年中国妖术大恐慌》一书试用了下,效果很惊艳!

先上效果:

叫魂,1768年中国妖术大恐慌.Soulstealers,The Chinese Sorcery Scare.(美)孔飞力著.陈兼,刘昶译.孔飞力著作集.2014.上海三联书店.pdf

说惊艳在于音频的效果很逼真,跟真人没什么区别,有语气词,停顿,思考的间隙,模拟的两人对话效果等等。如此应用起来,大规模用于生产环境,传统真人版的播客几乎就会完全被取代了。

NotebookLM官网:https://notebooklm.google.com

首先上传你的书籍,目前支持PDF, .txt, Markdown, Audio (e.g. mp3)等格式资料。

上传完以后,就可以生成Audio Overview(需要稍等片刻)。我试了几本书,生成的Audio Overview的时长大约7分钟左右,以两人对话的方式呈现,音频质量非常逼真,跟央视的对话,访谈节目可以比一比。当然除了Audio Overview,常规的timeline,study guide,briefing,ming map以及一般AI的问答模式,NotebookLM应有尽有。

效果惊艳,可玩性,想象空间就很多了。比如,打通微信读书之类的阅读平台,批量生成Audio Overview,然后供喜欢读书,喜欢听书的人使用,愿意付费订阅的应该大有人在(效果,体验比目前常规的文字转音频要好得多),大有前途。

一时很激动,多试了几本最近手边的pdf书,分享在此:

跨越边界的社区.北京浙江村的生活史.项飙.2018.生活·读书·新知三联书店.pdf
Audio Overview

万历十五年.黄仁宇.2008年读书·生活·新知三联书店.pdf
Audio Overview

骂人骂七寸

2025年4月30日 13:40

教骂人不好?那不好的点是什么,是为了避免冲突?还是觉得没必要?人会选择对自己有利的行为,所以避免吵架不过也是建立在某种「有利」之上的。

当然,也没必要无缘无故地骂人,如果能进入到理性层面就事论事,也压根儿犯不着骂人。但我又觉得不能不会骂人,因为这是魔法,偶尔也需要用魔法来打败魔法。

昨天有人在 Telegram 私信我,问我「怎么骂人」,骂谁呢?他说「所有人」。这个问题毫无头绪,搞清楚「为什么想骂人」比「怎么骂人」更有意义,但我又觉得他当下没必要理性思考,先顺从自己的本心发泄情绪也不是坏事。于是就教了他「骂」人,与其说是教,不如说帮他分析了一遍「为什么想要骂这个人」以及「什么才是这个人的软肋」。

既然都要骂人了,骂人骂七寸还是有必要的。

我自己养狗,所以我知道养狗人的心理。对付那些不牵绳的狗,特别是泰迪犬,给他们普及牵绳是毫无疑义的,就不如骂他们的狗是「野狗」。

至于正义制裁不牵绳遛狗的人,这是反其道而行之的降维打击。降维到最下三滥的手段,让狗主人自我攻击——你辛辛苦苦养一条狗,视为掌上明珠,家里来客人了还得给大家表演坐下趴着握手拜年。但是在我这里,用一个既定事实定义成是低劣的「野狗」,这个攻击不是因为我的主观评价,而是因为「你没牵绳」。

——《以牙还牙与遛狗》

骂人的原则很简单,就是「骂七寸」+「引发对内攻击」。


打蛇打七寸,骂人只打脸

先说「骂七寸」,即骂到对方最在乎的点。

  • 对方最在乎什么,就越是会反复解释
    • 强调否定。「这不是钱的问题」→那他妈就是钱的问题;
    • 强调身份。倚老卖老→(死亡焦虑的具象化)我让着你就是你他妈快死了;不讲素质的男性司机→(男性的尊严与厌女情结)我以为是女的在开车呢;
    • 身份捆绑。
      • 单独带着孩子的母亲,放纵孩子,认为自己的孩子最听话,你曾经也是孩子→(女性原始动力是爱与归属)看不出来听话,更像是没爹教;
      • 大家都不容易→(道德绑架)那我今天就让你看看什么叫不容易。
    • 具体案例:前两天我要求狗主人提供狗的狗证、疫苗证明和正规犬舍购买证明时,对方提供了一个4500元的发票,但我记得这个狗主人炫耀过自家的狗价值15000元。当我们在派出所门口见面时,她第一时间并不是关心我的伤势,而是解释那张发票的4500元是定金的价格。足以证明她非常在乎自己的狗「值15000元」这件事。这必然是她在当下的软肋。
  • 谎言
    • 已读乱回。隐含式拒绝行为,当事人自己也要知趣对方正在拒绝自己;
    • 防御机制。已读乱回更像是「故意」乱回答以中断谈话,防御机制的启动更多是出于本能而「撒谎」。
      • 外归因。防御机制最大的特点是采用「外归因」的方式将责任全部抛给对方。一旦外归因,就很难再进入就事论事的理性讨论。与其期待对方会变得理智,不如就魔法打败魔法;
        • 「你难道就没有责任吗?」→(把赛道强行拉回当下来说说具体什么责任?
      • 无效内归因。比起外归因,我更烦无效内归因的人。无效内归因最大的特点就是「我都已经认错了,你还要我怎样」。无效内归因会把责任吸收进自己的黑箱之中,再进行追击反而变成了当事人「得理不饶人」的过错;
        • 「我又没有说我不负责任,你凶什么凶?」→你不觉得自己该被骂吗?
      • 具体案例:《承认平庸》
    • 说过一千遍的谎言,说谎者自己也会相信
      • 反复说起的谎言,会越来越具有逻辑性和偏重的「细节感」。特别被加工过很多次的「回忆」,经常向人说起的回忆,会变得越来越有逻辑性,这本身违背了人在真正回忆时的无意识的微表情动作。当然,你可以反向利用这种微表情动作来表演自己「在努力地回忆」;
        • 「想当年啊……」→我就静静看着你装逼,嗯,你上次不是说你……
      • 说谎的信念感。当把谎言当成真相之后,就需要强大的信念感来自我麻痹,这种信念感几乎不会被攻破。为了保证已成真相的谎言在自己内心的地位,他们会不惜一切代价地用一个一个的谎言去维系最大的谎言存在。当谎言被一个个揭穿时,最大的那个谎言就会被信念感包裹;
        • 「你要是不信我也没办法」→你没办法就说明你确实没能力让我相信你的谎话;
    • 具体案例:「你今年多大?」「27」「属什么」「额……」

手段最厉害的敌人还得是「自己」

再说「引发对内攻击」,即被骂七寸是自己的原因造成的。

其实上面教的回怼方法,都是在用这个底层逻辑设定了一个「这其实还是你的原因」的陷阱。包括无效内归因的人,内归因的目的是为了避免自己再被责难,但如果这个时候你就顺杆爬,明确地告诉他现在的一切就是他导致的,这反而会加剧他的内耗。

  • 对内攻击的目的是为了引发对方对责任的矛盾情绪——我知道这是我的责任,但我无法承担责任;
  • 我在自己身上看到了自己最讨厌的人的影子。(角色替代)
    • 这一招在情侣之间吵架几乎是「AOE」的级别,比如「你这样无理取闹跟你妈有什么区别」,卧槽这几乎等于是把对方拖入了炼狱之中;
    • 有钱人不希望被说没素质,特别是他们是因为有钱之后才努力撇清了阶级差距;骨子里是小农思维的人,最害怕别人发现他们身上的小农行为;失去主体性的人,最害怕将他们与主体性进行拆解;
    • 几乎没人能逃脱厌恶符号的同时又在本能模仿符号的行为,因为这是每个人最熟悉的行为模式,除非当事人有意识发现自己的行为正在模仿符号,并理解这一切产生的原因,否则它都会是一个具体的「软肋」;
  • 「你不喜欢我,我更讨厌看到你,丑八怪!」
    • 对抗型人格当有可以对抗的标的物时,他们就拥有源源不断的动力去撇清自己所有的责任,所以釜底抽薪对于对抗性人格非常有效。(痛并快乐)
    • 回避型人格会将他人的「追问」视为被全方位关注的过程,他们虽然会逃走,但也享受这种被追击的感觉。所以突然抽身避免矛盾,反而会对回避型人格造成强烈的「内耗」,即「我是不是真的做错了,他竟然不再关心我了」。(爱无能)
    • 表演性人格更渴望被关注,所以切断关注会导致对方因为失去了参照物,而陷入强烈的自责,甚至会通过伤害更亲密的对象来寻找「存在感」;(被爱无能)
  • 明确告知切断对对方的关注,迫使对方将多余的能量变成对内攻击。
    • 「你别生气了」,这句话之所以非常噎人,是因为一方面定义了对方正在生气,另一方面将交流被中断的责任全部推给了当事人。所以就事论事的时候最忌讳说到这句话,如果反过来利用,当对方的情绪真的被煽动起来后,用这句话解释当下的聊天,让对方无法继续发泄情绪,其实也起到了对内攻击的实际作用;
    • 「这是你的主观不可证」,另一句我很反感的话,是将所有责任都推给对方的主观,而切断彼此对标准的讨论和商量。反过来利用,当对方长时间在主观世界聊天,那就将交谈中断的责任归咎于「你一直在以你的主观世界聊天」,哪怕是对方希望回到理性讨论,你仍然可以使用「煤气灯效应」的方式指出对方正在主观世界游荡,从而迫使对方不得不陷入对自己的自我怀疑——这个底层逻辑对我这种理性的人非常好用;

骂不过就加入?

有这样一种说法,最会骂人的人往往才是最害怕被骂的人。这句话其实存在一个时间轴维度——很多害怕被骂的人,其实往往能找到别人的软肋加以攻击,以进攻作为防守。但随着时间的增加,人们会意识到,这样的进攻方式会导致更多的潜在威胁,比如树敌、迫使敌人之间形成乌合之众来对抗自己。所以很多人卡在了这个点,变成了一个「以和为贵」的人。

但人们会因为你的「善良」而停止对你的攻击吗?显然不可能,甚至还会因为你的「善良」而认定你就是那个可以继续被踢的落水狗。

之前一个博客好友在很久之前和我聊起他在参与的 Backroom 创作,其中有一层被称为「林内无鬼」。这是一片无色昏暗的森林,森林里会发出各种让人毛骨悚然的怪声。但实际这片树林没有任何威胁,而这些诡异的声音全是当事人的想象和恐惧具象化的产物。

人的软肋,就跟「林内无鬼」的「鬼」一样,它其实并不存在,而是因为自己足够恐惧而变成了随时会被对方攻击的点——除非像我这样的「恶人」会找准这样的点进行攻击,但大部分的鬼吼鬼叫,其实都是自己想象出来的,制造了一个「箭靶」去追着别人射。当陷入到被害人情绪时,对方的任何一句话都可以变成一支利箭射穿自己精心藏匿的箭靶。

唯一的解法就是所谓的「晒太阳」,森林之所以让人恐惧,是因为在阴影之处你可以幻想任何腹背受敌的桥段,但如果整个森林都是阳光,你掏出手机拍摄丁达尔效应的过程也会让你减轻恐惧不是?

所谓的「晒太阳」,就是将「软肋」暴露并接受自己的不完美。我承认我是自私的人,你再揪着我自私其实根本攻击不到我。就好比常常有人在博客私信匿名骂我,说我写的东西没人看,但如果我知道我的创作本意并不是为了迎合大部分人,哪怕只有一个人看懂,我知道那是臭味相同的拥有独立思考的人,而不是单纯的赞同。这句话对我根本没有杀伤力,不如我教你如何攻击我这种自以为很有想法能力的人:

你多年后看自己写的这些看似很有想法的东西不会觉得丢脸吗?

但是很可惜,我既然会教你说出这句话,就说明这句话对我而言也没有杀伤力,因为我有留下「作品」,而你只能在这里用「你写的东西都是垃圾」的方式来缓解自己无法留下「作品」的嫉妒情绪而已。

看,这才是骂人的技巧,攻其内耗的同时,是因为自己知道内耗是如何诞生的。


刽子手也有拿起刀下厨的时候

在 Telegram 教人骂人之后,对方问我「是不是朋友都害怕我」,我觉得这个问题还蛮有趣的,因为「会吵架」会和「不好惹」联系起来是大部分人的惯性思维。但是刽子手举起刀就一定是要杀头吗?

告诉别人你很会骂人,不是为了当作武器,而是表达「我并不害怕冲突」,但既然大家都知道骂人不会有好果子,那还不如能坐下来好好地理性交流,而非一上来就挑对方的软肋骂。

当然了,如果觉得理性交流没有意义,就像一上来就骂对方的软肋,那就好好学学如何骂人好了,但切记这些骂人的方法,其实也藏着被反杀的具体方法。

我才不会教大家呢~

没必要社交

2025年4月26日 11:00

好友开了个小红书,问我如何彻底关闭「社交」功能。我很纳闷,不需要社交功能干嘛要用小红书,随便找个没人互动的平台发发内容得了。

不,他觉得又需要被人看见,但又不希望有社交。

行吧,但似乎也有点合理。

曾经有一段时间我也非常反感使用网易云音乐,因为我并不喜欢它的评论互动功能。这种不喜欢就好像是你养了一只猫,但是这只猫可以随便被别人摸,甚至有的人跟它互动得更亲密。所以「讨厌社交」就变成了一个最表象的外在,但它没有被推回内核。

所以当我开始用Spotify时,我会因为它没有社交功能而感到清爽。当大家聊起用什么音乐软件时,我在介绍Spotify时,也会特别加上一句「因为没有社交」。朋友听到这句话的反应,跟我听到朋友给我说想用小红书但不希望有社交功能是一样的——这是个什么标准?

因为这个结论很难推回至一个底层原因,所以只是流于表面的「没必要」。如果遇到一个非常喜欢社交功能,且容不得别人半点「否定说辞」的人,还会觉得我在装什么高级。同样的,这个人之所以会这样跳脚,也是因为在一个流于表面的地方错误地加工了结论,从而认为自己的品味被羞辱了。它要推回到内核,有可能扯出更多的「他为什么会对一些特定的观点冲突如此敏感」。


当然,并不是说所有不希望社交属性的人都是因为有一个深挖的底层原因,因为「没必要」。反过来,一些人也会简单地将自己的不希望归咎为「没必要」,所以双方都没有要从黑箱出来坦诚相待的意思,也没有必要继续追问。

所以我在这里依旧拿这个好友举例。他想用小红书的原因是觉得自己的摄影作品要比小红书上大多数摄影博主要专业,所以可以将小红书作为一个发布平台。但不希望有评论功能,是因为他不觉得大家能看懂自己的作品,他只希望那是一个备档作品的地方。

「不是,你找个硬盘保存不一样吗?」

「因为我觉得你有句话说得很对,既然是作品那其实还是希望被看见的。」

被看见——被赞美——被质疑——被否定,显然这四个层级他只能接受到第一层,他甚至假装自己不需要赞美,因为他可以随时说服自己比起那些「大多数」,他的作品是更「高级」的。当我和他讨论为什么不希望有评论的真正原因,他其实无法接受自己不能接受被质疑和被否定,所以他用了一个非常美妙的词来定义这一切——「我觉得没必要」。

于是我们开始了一个关于「社交关系」的漏斗搭建。


第一层,任何人都可以看见,言论无代价。

  • 被看见——被赞美——被质疑——被否定,任何层级都可以进入;
  • 他既然在追求被看见,那他其实很难挑选谁看见自己;
  • 在无法筛选用户时,就意味着评价本身也是不可控的,喜好标准不同,也会导致作品本身对外的评价出现偏差;
  • 作品本身也存在「沉默螺旋」
    • 多数人表达相同观点,人们更愿意主动表达观点;
    • 只有少数人表达相同观点,就算大多数人持有相同观点,人们也不愿意主动表达观点;
    • 多数人表达相反观点,人们就算不同意相反观点也不愿意主动表达观点;
    • 除非有意识地控评,否则评论本身会因为正反观点的数量而出现偏差;
  • 在表达者周围未形成乌合之众之前,评论区的不可控性更强,负面评价仍需要当事人个体对抗,甚至有时外部已经形成了反对表达者的乌合之众,其对抗难度更大;
  • 例如:关闭评论/匿名评论;

第二层,言论有代价。

  • 被看见——被赞美——被质疑——被否定,任何层级都可以进入,但有「代价」;
  • 我把第二层称之为「夹层」,因为它还没有完全脱离第一层的不可控;
  • 但如果言论存在代价,比如表达者周围已经形成乌合之众,个体想要反对表达者就意味着个体和乌合之众进行对抗;
  • 「我知道你是谁」,就意味着言论本身指向了「你有被暴露身份的代价」;第一层不可控的核心也在于「匿名」;
  • 例如:手机号码/实名制注册;

第三层,捧臭脚。

  • 被看见——被赞美,谁不喜欢被赞美啊,除非他午夜梦回想起这种赞美是自己安排的;
  • 乌合之众的好处,在于他们可以自己抱团维系潜在规则,即如果我持有相反观点,就有可能会被踢出局外;
  • 大多数人希望规避冲突,所以被纳入群体时,会获得更强大的集体认同感;
  • 捧臭脚是一种生存模式,也是最不需要进行思考的条件反射式的惯性逻辑;
  • 例如:虚假评论、互动、粉丝群;

第四层,我是最特别的。

  • 被看见,赞美是权力集中的附属品;
  • 邪教组织最核心的不是「邪教头目」,而是其座下的「干事」,干事意味着拥有实权,但同时听命于上一级,即1-7-49-343-∞的金字塔结构;所处层级的资格会让集体认同感内部出现阶级划分,从而源源不断地从内部制造以冲突维系的活力;
  • 「干事」不会违抗、颠覆头目的存在性,反而会因为头目的点名而获得「特别感」;
  • 自我认同的「权威感」。当评论被长期切断后,反向利用沉默螺旋,也可以制造形式上的「权威感」,即如果我贸然评论会不会显得我很无知(参见《高台教化与下流三俗》);
  • 当「权威感」形成后便可通过「当爹」的方式将自己和个体之间拉开距离,形成权威——神圣——乌合之众的结构;
  • 例如:直播对谈/粉丝线下见面会

好友问我,这不就是日本地下偶像出道的流程吗?对啊,但这个流程也同样适用于「个人出道」。「没必要社交」卡在了哪一层,就去上下两层寻找解决方案即可。

例如自己无法接受质疑和否定,即卡在了第三层,要么就去搭建第四层的结构,就像好友想要公开他的摄影作品一样,他希望被看见,但不希望被「不懂的人给玷污」,那要么就从一开始搭建一个大家都只会说好话的组织,只要能骗过自己也未尝不是件美事。

要么就去接受第二层的结构,即允许他人评论,但可以同时保留让对方付出代价的方法,比如对讽刺自己作品的人以其人之道还治其人之身:「你这么有想法,看看你的作品。」

层级之间没有高级与否之分,顶多就是「管理难度」的区别。并且,关闭评论也不意味着是「错误」。当然,也不是所有的「没必要社交」都意味着卡住了,也有可能是最最开始的「不想被看见」,若成立也无妨。

同时,还有另一个核心还未提及,即「表演」。越是刻意追求或规避被看见——被赞美——被质疑——被否定里的某一个层级,就越是有「表演痕迹」。所以「没必要社交」或许也是表演的一部分?

关于这一部分,下次再聊。

证据链与有罪推定

2025年4月24日 20:53

好友发来一个八卦说是创作「素材」,是一个网红与别人的色情聊天内容。但我很快发现里面的逻辑 bug,现有的证据如下:

  • 聊天内容是网红与他人的文字性爱对话,虽然里面有照片,但照片未出现纹身,无法指向当事人;
  • 另外两则自渎视频也没有实际证据指向当事人,未出现过纹身;
  • 网红的裸照,暗示特定纹身存在,但裸照与聊天内容毫无关系;
  • 网红照片里的手指与自渎视频的手指对比。

于是这个证据链是各自指向一个证据,但证据和证据之间毫无干系。唯一的所谓「关键性」证据,仅仅只是「手指很像」。这件事本身没有值得聊的地方,但这样的证据链可以推出结论,倒是值得玩味。

不单单是这样的「瓜」,还有一些认知推导的方式,也是将前因后果单拎出来似乎都是合理的,但为了要将两个毫不相干的结论桥接起来,也都会找到一个「手指很像」的推理结构。这个「手指很像」首先是以联想、贴标签、先入为主的形式呈现:

  • 我个人不认为这件事情是这样的;
  • 问题不在我,而在他人;
  • 哦,是他啊,那他就会说这样的话;
  • 既然我这样觉得,就一定还有其他人也会这样觉得。

因为证据链很弱,所以我对所有的结论存疑,但就算如此也会有另一套推导系统:即当事人是一个会拍裸照的人,所以他是一个「骚货」,所以他会做出这件事情是合理的。那么「手指很像」的证据也是合理的。很显然,这并不是一个符合证据的推测,但因为它已经涉及到「质疑动机」的层级,所以事情本身已经成为了当事人的自证陷阱。如果再追加当事人为了金钱去勾引对方这样的「付诸阴谋论」,那么一个很难再被破解的「类证据链」就形成了。

出现这种情况最直接的问题,在于事件本身是建立在对当事人「有罪推论」的基础上的,所以无论是否有新的证据,其证据都将是支持当事人有罪的结论——当证据不足,就通过怀疑动机的方式将证据偏向定罪本身。

这个时候,就出现了一个「二极管」问题——即我认为证据链不足,而有罪推论已经定罪,当我们的观点不相同时,他们会认为我的推理是不合理的——那么问题来了,证据链不足是否就已经宣告当事人「无罪」了?

如果这个弯能绕过来,那问题就没有那么复杂了——证据链不足代表的是无法定罪,也有可能这些证据确实指向了当事人实际行为,只是他们在形式上不构成证据链罢了。那到底是「定罪」还是「无罪」?看吧,问题就在这里,因为有罪推论会认为证据都指向的是罪名,但「无罪推论」是优先考虑证据链是否完整,否则「疑罪从无」。于是「手指很像」有了动机推断、有罪推论的变形:

  • 如果你认为你的观点是正确的,那为什么没有人支持你?
  • 我的观点被更多人支持,所以我的观点是正确的;
  • 我比你更有经验,所以在这件事上你的观点不具备参考意义;
  • 他就是这样带节奏的;

如果结论被提前假设,在推导的过程中,就会自然而然地存在确认性偏差的可能。

比如这两天参与携宠旅游时,有人认为狗就是「畜生」,所以送狗上学的结论就是「狗无论送不送去上学都是畜生」的结论——以至于当大家需要理性讨论送狗上学的目的是什么时,对方的结论无论如何推导到的都是「畜生没有必要上学」。

但事实上,送狗上学的核心是让狗进行基本礼仪的训练,就跟小孩子需要学会「可以」和「不可以」一样,而不是通过上学为「畜生」赋予「人」的属性。

很显然,如果对方咬定了「狗是畜生」这个结论,那无论再多的证据链都无法颠覆这个结论,这个时候证据链本身就会被那句「手指很像」给轻易颠覆,这个时候「手指很像」就变形成了更强烈的拒绝讨论、圈层认同的确认性偏差:

  • 我看到的事实就是这样,我不认为你说的观点是对的;(但事实是全面的吗?)
  • 书本上就是这样说的,你挑战颠覆知识吗?
  • 你不要代表我,反正我不这样认为;
  • 你这么激动做什么,被我说到痛处了吗?
  • 你支持他吗?所以你也不是什么好人;

自此,比证据链更标准的死循环出现了,即康德在《判断力批判》里提到的三种逻辑谬误:

  • 将动机推断等同于证据;
  • 将价值判断等同于事实;
  • 将主观偏好集合为集体结论;

受害人「有罪推论」的前提是什么?

2025年4月21日 12:48

有人让我聊聊「北京理工大学教授失德失范实名举报」的事儿。其实吧,事儿不是大事儿,而且明理的人都知道这件事里面的「逻辑bug」,比如当事人为什么要保持两年关系后,才曝光此事,或者说两个人有非常漫长的「交往过程」,甚至当事人从这样的关系当中得到了「利益」,那到最后东窗事发的时候,却可以把自己摘得干干净净。

毕竟我是法学出身,会本能地对「施害人」进行无罪推论,也非常反对一上来就对「受害人」进行有罪推论的。但这件事情本身充满了太多盲点,而且仅凭当事人一方说辞,很难还原事件真相。

所以伴随而来的,就是网络对于这个「受害人」的有罪推论,比如他跟教授之间本身就是保持了长时间的同性情侣关系,可能在后期因为「分手」甚至是「分赃不均」而发展到了揭老底的地步。中国人很擅长通过「谁弱谁有理」的方式来无条件地支持弱者,但这件事情本身又有违背公序良俗的成分,比如里面涉及了中国社会并不承认但是客观存在的同性恋群体、师生恋,甚至是通过师生恋之便得到了教育资源的「特权」等等。这件事情最后很有可能会被压制,通过让「受害人」也闭嘴的方式得到平息。

但是这里,我可能会提出一个疑问:这个用PPT控诉「情人」的学生,真的是受害人吗?


谁弱谁有理,是大部分时候中国人用来断案的重要依据。例如女性以自己的贞洁作为担保,控诉一个男性对自己实施了强暴的案子,从古至今都是「相信」女性一方的指控的,因为她们已经用了一个几乎可以评价自己一生的「东西」来指认凶手。

至今,法律仍然是这样保护女性的,认为女性单方面控诉男性存在强奸行为,在立案阶段优先考虑女性的说辞。

那么,一个男性在控诉被另一个男性「强暴」的时候,刑法第236条强奸罪并不承认男性作为客体被强奸的法律事实,所以这件事很难用「谁弱谁有理」来作为最初的评判标准。因此这次的PPT小作文,很难让整个社会达到「共情」。

再者,PPT的内容本身是一厢情愿的表达,但同时又在陈述单方面的「事实」。但是一部分人习惯性地「质疑题干」——比如当时所用语言习惯不是自己认为的「规范性」而怀疑当事人的表达能力。于是从「质疑题干」开始游走至「质疑动机」。

因为这件事,我收集了网络和身边一些朋友的观点。发现,几乎学生思维的人会咬着「动机」不放,甚至会被非常好地伪装成对当事人一字一句的拆解。用自己对于表达能力的标准去覆盖他者的「意图」,这几乎快要进入到「付诸阴谋论」的最低认知层级。

当然,不是说学生思维就低级,而是对于这件事的评价,如果要采用质疑题干、动机甚至是辅助阴谋论的层级,那干脆就不要法律了,大家都他妈做网络法官得了!


不过在聊天的过程中,我也得到了一些很「中立」的(可能又会被认为是「没有主见」的)观点,但我觉得它非常符合法理——有人觉得,既然要分析这件事的真相到底是什么,那就要看谁是最后的「受益人」。

虽然说「谁弱谁有理」分出的对与错,一定是让弱者变成那个「受益人」,但也有例外情况,因为我们在用最标准化的博弈论讨论这样的关系对垒。看上去这是一场零和博弈,即学生控诉了老师,老师得到了处罚,学生得到了社会的同情与支持。很显然,如今这场社会游戏进入到了非常微妙的囚徒困境,即学生也开始被人怀疑其「动机」。

那与其讨论谁是「受益人」,我觉得应该从头讨论起谁才是「受害人」,或者说「他到底是不是受害人」。

很显然,这个「受害人」在两人保持所谓的情人关系时,确实从中得到了很多「好处」。那这些好处是否构成了受害人身份的丧失?显然不是,就比如婚内强奸,两人就算结了婚,但在婚内违背女性性自由也算强奸行为。但是我刚才说了,男性不构成强奸罪的受害人,所以这条法理线是说不明白的,更何况这个男生是「自愿」的而非被胁迫发生性关系。所以,当受害人身份无法坐实时,就会出现刚才提到的囚徒困境,以至于人们会开始寻找通过受害人有罪推论的方式使其达到平衡——总不可能让你过河拆桥了还能得到好处?


那受害人觉得自己是受害人,但是社会层面又无法认同「受害人」身份(甚至再发展下去,法律其实也不会认可他的受害人身份,但当事人受到处罚,是因为他实际的行为,而不是「施害」)这两件事的断层到底在哪里?

举一个我身边的例子,我有一个朋友,在结婚前原本母亲答应给她的丈夫1万元的红包作为改口费,但在婚宴举行前「临时变卦」,于是朋友和母亲爆发了争吵。朋友认为这是「承诺好的事情」,特别是要给自己未婚夫的红包,这种变卦会让自己颜面扫地;但母亲认为,这笔钱是自己答应,但又不是说一定要给,因为现实问题就是她拿不出这么多钱,是不是做女儿的也应该为自己的母亲再三考量。

两人的争吵发展到最后就变成了「你这是要弄死我」。

从法律来讲,这件事最大的问题,在于那「1万元」的红包是不是契约?那么就看你站在了谁的角度去看待这件事。比如当事人已经认为自己就应该拿到这1万元,甚至已经规划好了这1万元要成为蜜月旅行里订高级酒店的费用,那是否意味着它对于新人双方是非常重要的?

在法律上,这样的收益看上去很符合「信赖利益」的条件,但实际上所谓的信赖利益是我为此付出了「成本」,而不是这本来就是我的「既得利益」。比如,我和你打算签署一份制造协议,但由于事情紧迫,你需要我先生产,再在交付的时候完成合同的签署。结果当我投入生产之后,你认为费用不合适,单方面解除了与我的合作。在法律层面,我为了这份「要约」提前投入生产的成本,这是我对契约签订的信赖所致。

如今,这份利益被抽走,而朋友在这个过程中已经付出了她的「期待」,这看上去很符合「信赖利益」,于是因为信赖利益受损,算不算是「被害」了?特别是当这种信赖利益又和既得利益混淆之后。通过道德绑架的方式要求对方必须履行「合同」,一旦违约自己就是受害者身份,这件事本身就是学生曝光老师的底层逻辑。

所以,当人们开始对学生进行有罪推论时,我本身认为是合理的,因为学生这个角色在这一次的事件中,并不是「受害人」的角色。但是学生有罪吗?我个人觉得仍然没有,因为这仅仅是一场利益博弈的闹剧。


既然老师受到了惩罚,学生就不应该受到「惩罚」吗?

很可惜,法律确实无法对学生进行「复仇」,因为老师被处理这件事本身已经符合了信息被披露之后的处罚结果。因为没有进入到「审判阶段」,这件事情无法从老师嘴里还原真相,所以这不是一起纠纷,而更像是一起「自爆行为」,即我出卖了我的隐私,控诉了另一个人的隐私。

出卖隐私这件事本身就是一种「代价」,只是它的层级远远不够网友们所期待的「反转」罢了。

既然法律无法将这一场陷入囚徒困境的博弈推至纳什均衡,即非零和也非双赢的博弈结果,所以「审判权」必然会交给「社会」。既然无法透过法律进行法律人格的死亡,但是社会可以制造社会人格死亡。

所以我并不觉得如今的「网暴」是不对的,或者说根本就没有对错,这是必然的平衡结果。因为他是一个既得利益的非受害人形象,在真相被层层包裹的情况下,社会会做出第一次非对等判决,想让他接受社会性死亡的部分;若再有反转,乌合之众又可以重新调整判决结果——即谁弱谁有理咯~

我在ChatGPT搭建了另一个「我」

2025年4月16日 11:14

前几天因为跟朋友聊起AI建库的事情,我就试着把自己曾经完成的500日写作全部内容,和后来建立的博客内容都喂给了ChatGPT,于是就正式搭建了一个具有时间性的数据库。

既然具有时间的单向性,即我个人明确知道自己曾在某一个时期大量创作,而留下了大量的属于那个时间节点的思考和认知,且我是无法通过在此时此刻回溯和模仿的方式重新构建一个「真实自己」的。所以这个数据库最开始最值得玩味的,就是我究竟发生了怎样的变化。

接着,在朋友的建议下,我让ChatGPT分析了数据库对应的MBTI,确实也是我当初通过选择题得到的MBTI结果。

最后,有一个有趣的问题,如果你和ChatGPT有大量的已保存数据,可以让它进行一次结果推测,来看看它是在「迎合」还是在「思考」。

根据我们所有对话,告诉我一些关于我的可能我也不知道的信息?

前九条其实都是我想过的,倒是第十条还蛮有趣的:

我有试过用它来代替我创作,毕竟它已经获得了我将近300万字的作品,但无论是4o还是4.5,创作出来的结果都有强烈的恐怖谷效应——不是它太像我了,而是它完全不像我,因为它无法从生活的观察,回到底层逻辑分门别类地摆放这些现象,它构建了一个永远只能在「过去」的我,所以它也自称自己是「我的影子」。


如果有这样一个集合「自己」的数据库,你们会用来做什么?

我确实还没有想好这个数据库要怎么「用」,倒是AI为这个数据库做了一个有趣的页脚批注:你已经走得很远。你不用回头。你该写下一个更辽阔的故事了。🌌

这算是硅基生物的浪漫吧~

山巅一寺一壶酒

2025年4月14日 11:21

我有一个写色情小说的朋友,我们偶尔会视奸对方的作品。但最近他非常困扰,自从人们发现了Grok如何用调试模式写色情小说之后,PTT上面越来越多内容创作者开始哀嚎。

当然我也抱持一个疑问,是真的因为被AI抢了饭碗,还是这群人其实本身就陷入了创作枯竭期,找了个完美的外归因罢了。理应男女性受众对于色情官能小说的「刺激点」是不同的,女性向的情色小说需要更多的「情感底层」,否则无法直接调动性欲模块。

恰好他视奸前段时间我们聊到的一期播客,从符号主义、联结主义聊到神经网络以及理型黑箱,就和我从「AI创作色情小说」这件事接着聊了起来。他说现在很多台湾女性,会利用「调教」AI的方式,以获得最符合自己的性癖文学。底层核心,就是我们在节目里提到的「反向传播」。很多用户会利用AI「迎合」,渐渐构建一个最了解自己的性癖外接「大脑」,而在这个过程中,AI能巧妙地利用「情感共鸣」的方式为小说增添不少人性化行为。这个迎合其实不单单是「思考」的结果,更多也有AI的开发商为了留存用户使用,而设计的一种「小嘴抹蜜」。

但是AI真的知道自己在写什么吗?


关于AI的话题并不会枯竭,只要站在不同的观点上,就可以得出不同结论。

比如之前有人和我聊起AI是不是「最优排列组合」时,我其实一开始也是秉持这个观点。直到我了解到符号主义和联结主义的区别后,发现最优排列组合并不是全部,但也不意味着认为AI是最优排列组合的观点是「错误」的。

于是我们的话题从「AI创作色情小说」,切换到了「AI有没有大脑」——他坚信会等到「脑接机」诞生的那一天;我倒觉得与其说AI有没有大脑,不如说AI的神经网络「黑箱」里到底保留的是什么。符号主义可以是几万亿个可被感知的「公式」,但联结主义结合反向传播构建的更像是「理型」。这个理型存在于我们每个人的大脑,当需要你用大脑想象一个「杯子」时,我们却可以想象出完全不同风格的杯子,但「杯子」这个理型一直都存在。当AI拥有这个理型之后,便可以识别用户上传的任何有关杯子的内容。

当然,以上话题如果仅停留在「技术工程」层面,它或许就是一串代码,从而得出「AI是人类创造的听命于人类的技术」之结论。所以为什么需要「跨学科」,这就好比是飞叶子之后的联觉一样,在文学艺术、社会伦理学和哲学世界,也能找到人们在几百年前讨论的关于所谓「人工智能」的猜想和伦理构建。例如1726年问世的《格列佛游记》里,那个在拉普塔飞行岛上笨重的「知识机器」。


小时候我家出了个「神童」,说是神童,其实就是家里有钱送去上了「天才培训班」,一个月后便可以在家庭聚会的时候表演圆周率后一百位的「口诀记忆法」。

我几乎不敢想象圆周率要记忆到第7位的意义,3.14对于乘法计算这件事就已经够烦了。所以当神童在家庭聚会的中央开始表演时,我就记住了「山巅一寺一壶酒」这句话。于是,这句谐音梗就成了区分神童和普通孩子的关键——因为只有神童才能理解用谐音的方式去记忆圆周率小数点后的一百位。

看似是孩子的卷,实则是家长之间的暗自竞争。所以当我当着所有长辈提出「背这个有什么用」的疑问时,我立马遭到了长辈的白眼和批评,首先我被定义为「不爱学习」,紧接着被灌输了「这是一种学习思维,对于学习其他学科有很大的帮助」。

到底有没有用我不知道,倒是我至今还记得「山巅一寺一壶酒」这句顺口溜。


「山巅一寺一壶酒」就是童年里的一条代码,意味着它得出了3.14159的准确输出。

因为这一次的挑衅,我一直被神童的父母记恨,后来也很少在我面前表演过。又过了几年后,我挑事儿又聊起「还在背圆周率吗」,其实孩子之间并没有那么复杂的矛盾,倒是家长听到这句话又翻了白眼。我只是想说,我也是初中的时候才知道,原来每个人的出生年月日的组合都在圆周率的无限不循环小数里出现过。

神童的父母警惕地质问我:「出现过又怎么样?」

我倒是故意老实回答:「我是想说,哥哥有背到那一位吗?」

经过这一系列的相互膈应后,我跟这个家庭到我成年后也几乎没有再来往过。只是那个时候不知道,圆周率可以拥有任何排列组合的规律,不过就是「无限猴子理论」的一部分,可能对他们而言,我就是那个上蹿下跳的猴子,又总能踩到他们的痛处。


好,话题回到AI。

AI知道自己在写什么吗?AI当然也能写出「山巅一寺一壶酒」,但它需要理解我们为什么要它如此理解圆周率——我觉得AI距离「意识」还有一段时间,但它确实存在「主观」,比如它已经可以通过预测上下文的方式,编纂最贴合性癖感官的色情小说,或是用甜言蜜语提供情绪价值的方式留存用户的使用。

「主观」并不意味着思考,而是意味着它在集合「理型」。从理型得出结论并不是全由符号主义的代码所提供的公式,也是神经网络推导出的结果。所以与其说AI是否知道自己在写什么,不如说人们希望AI写出怎样的结果。

「山巅一寺一壶酒」便是这样一个「确定的结果」,但如果不符合既有「理型」而创造了「不确定的结果」呢?

那就拔插头呗~

阶级歧视到底在歧视什么?

2025年3月26日 11:00

抱歉,今天这篇文章确实会涉及到「阶级歧视」,但不是直指阶级本身的人物肖像,而是聊聊「为什么」。

这两天发生了件很有趣的事。因为家里养了两只柴犬,想着要在樱花季的时候带着他出门拍照。但樱花季就意味着公园里到处都是人,所以我们还是决定在家里买了几大箱的樱花切枝,插在水培瓶里在阳台搭建出一个在樱花树下野餐的场景。给奶子拍完几组照片后,也算是带他去樱花季拍过照了。

到这里,你大概可以预判一下,在这样的内容下面会出现怎样的评论呢?

大部分人会因为关注到狗,而与我们产生互动,也有人羡慕我们的创造力。没过多久,就出现了我「期待已久」的评论——质疑「动机」。

折了不少树枝子啊。


网络嘛,并没有设立使用者的门槛,所以会出现这种评论也是在意料之中的。我很喜欢这种看似逻辑跳跃了好几个维度,但事实上只在当事人自己的认知范围里扑腾的「观点」(当然,大部分这样的人,会觉得自己的「观点」就代表了「事实」)。

在之前,小红书上有一则有趣的帖子,大致是一个烤肉店的老板,不允许自己卖的烤肉给狗吃。下面的评论可想而知,又将会是一场「爱狗人士」和「厌狗人士」的战争,进而会进化成「无孩爱猫女」和「男权规则」的性别冲突。但是,不卖给狗吃,这不就是一种简单的契约行为,而且烤肉摊老板也愿意承担放弃卖给狗那一部分的收入,这一切都是合同里的意思自治,那这群人到底在吵什么?

很显然,事实没有任何好争论的,所以他们回到了「动机」上面去支持他们的观点。以至于,当观点完全从新闻本身这个事实脱离的时候,变成了两个群体之间对于动机的揣测——你反应这么大,不会是看见狗可以吃烧烤破防了吧?

当然,对于那个质疑我们是去市政绿化折枝的评论,也可以用这种质疑动机的方式给怼回去:

你看见狗都可以拍樱花照是不是破防了啊?


我一直相信,文革时期的血脉基因其实一直都在代际遗传着。其实吧,这件事就是几百年前勒庞在《乌合之众》里提到的「群体效应」,只是文革时期将另一个东西发挥到了极致——个人崇拜与自证陷阱

简单来说,对付个体、最轻松让对方被困在逻辑陷阱里的方法,就是利用「自证陷阱」,接着才是上纲上线。不得不说,我当年也用过同样的手法,在疫情期间面对百般刁难的大妈志愿者,她要求我必须提供24小时核酸检测报告,才能进医院看病。我拿着绿码反过去质疑她:「你是医院领导吗?你能给我看相关的红头文件吗?你是国家主席吗?还是说你要对着国家主席干?你当志愿者每天管的两顿饭不要了是吧?」

从上纲上线到降维追杀——我承认这套组合拳太下三滥,而且就他妈是文革时期的组合拳啊!

其实,从这一点,你能很好地分辨出跟你对话的人,他究竟是不是一个能「聊下去」的人。所谓的「聊下去」,就是你们能彼此平等尊重,面对观点冲突时也不会上升到认为对方是在对自己的人格尊严进行攻击,从而进行理性探讨、就事论事,若涉及情绪层面的,可优先解决情绪问题,而不是永远无法对齐信息

我欣赏有质疑能力的人,但是他在质疑什么又会分出了「阶级」。

  • 质疑事实,这是在保持清醒,从多个维度避免自己陷入沉默螺旋;
  • 质疑观点,这是在保持独立思考,但质疑本身是需要提出新的观点,而不是为了质疑而质疑,那叫抬杠;
  • 质疑题干,这种往往会发生在无意识「对抗」的人身上,他们会因为无法带入、或是不想代入某个命题或观点时,会采用质疑题干、纠结条件、纠缠事实细枝末节来规避所谓的「回答风险」;
  • 质疑动机,不仅无视事实、不还原事实,且完全按照自己的认知水平以最坏的方式揣测对方,从而引出动机不纯的结论;
  • 付诸逻辑谬误,AB不同,只要证明A是错的,那么B就是对的;
  • 付诸阴谋论,甚至有的人不需要任何证明的过程,因为阴谋论根本不需要逻辑思考,有再多的事实摆在面前,都可以通过循环论证的方式使其陷入自证陷阱。

该说标题的事儿了。其实所谓的「阶级」,在我看来就是因为「质疑等级」分出的思考和认知的阶级。而这个阶级本身确确实实跟一个人的眼界、经历、思维可触达之处有密切关系。

如果再往上一层表象去推测,那可能就跟金钱相关,因为财富可以让他拥有更多体验生活的机会;可能跟血缘关系相关,因为生儿育女之后,心有不甘地放弃了年轻那会儿想要折腾的坚持和梦想;也可能跟情感有关,因为无法割舍关系,而在关系里成为了那个时刻忍耐的角色。

所以很有可能,表象是不同的阶级在互相歧视财富、年纪、性别、婚否育否。但是如果再往深层想一想,之所以很多人在朋友结婚生子之后,两人的关系就莫名其妙地断开,甚至聊不到一块儿,是因为我没有那么多精力去跟对方聊一下午的「育儿经」,他也不愿意从我这里听到那些测试人性的小游戏,因为它对育儿没有任何意义。

而这一切的冲突,都来源于认知,特别是当形成了确认性偏差的认知。

就好比一个天天都在刷中美关系短视频的人,信息茧房里的赶英超美早就是基准线了。当他在现实生活中听到一些人对中美关系的客观分析,他一定会站出来破口大骂——「美国早就夹着痰盂逃回他美利坚啦!」

说实话,我非常歧视这样的人。如果你也是,我们还能精准地描绘出这类人的人物肖像,甚至还能在生活中找到与之对应的人。

如果说阶级歧视,底层在歧视的是「认知」,那「认知」同频本来就是件困难的事情,就像你不能告诉井底之蛙在农场的边缘有一片世外桃源般的池塘一般——只是这个Z时代更狠,让井底之蛙能轻易地看到那些世外桃源般的池塘,他们便觉得自己已经去过了那些地方。

另一个思路,既然无法同频,但又不想被他们设下自证陷阱,在「质疑」那部分,其实方法都说了,用魔法打败魔法吧~

AI让效率再次提升,人类该干什么?

2025年3月5日 00:00

AI vs Human beings

人工智能时代:当效率革命点燃创新之火

我很久没有为互联网感到兴奋了。这些年,它似乎被困在某种惯性中,缺乏真正触动心灵的创新。然而,人工智能的崛起,像一簇突然迸发的火星,重新点燃了我对技术变革的热情。

从ChatGPT的诞生到如今,几乎人人都在谈论人工智能。我也亲自体验过它的魔力:无论是生活琐事、工作难题,还是学习中的困惑,只需将问题抛向AI,不到5秒钟,它便能给出一个逻辑清晰、甚至堪称完美的答案或方案。这种效率的跨越,让我不禁想起人类获取信息的进化史。

从图书馆到AI:效率的跃迁

在互联网诞生前,若想查资料,我们只能奔向图书馆,在浩如烟海的目录中翻找对应书籍,再逐页检索、誊抄、总结。尽管最终能找到答案,但过程漫长而笨拙。

互联网搜索引擎的出现,将效率提升了一个量级。输入关键词,海量链接瞬间呈现,我们仍需逐一筛选、分析、整合,但至少电子化手段替代了手工检索的繁琐。

而如今,人工智能彻底颠覆了这条路径。它不再需要我们“大海捞针”,而是直接整合全网数据、预处理信息,甚至模拟深度思考,最终将答案和盘托出。这就像过去做菜需要自己找菜谱、买食材,而现在只需对AI说“我要一盘糖醋排骨”,它便能在五秒内端出成品。若口味不合,还能随时提出修正——效率之高,令人惊叹。

生产力解放:人类与AI的共生

作家郑渊洁说,他让AI以“郑渊洁风格”写一篇皮皮鲁的童话,结果AI输出的作品竟比他本人写得更好。他感慨输给了AI,但我却觉得无需悲观。AI之所以能模仿郑渊洁,正是基于他本人创作的无数经典文本。若世上本无郑渊洁,AI又如何凭空生成“郑式童话”?

这恰恰揭示了人类与AI的关系:AI是效率工具,而非创造力的源头。它的能力建立在人类已有的智慧积淀之上。当AI接管重复劳动与低效环节,信息如此容易获取,知识如此海量廉价,我们反而能腾出双手和大脑,专注于真正的创新——那些尚未被定义、被探索的领域。

拥抱变革:效率即自由

有人担忧AI会取代人类工作,但历史早已证明,每一次技术革命淘汰旧岗位的同时,也会催生新机遇。当机器替代了流水线工人,人类转向了设计、编程与服务;当AI接管了基础信息处理,我们便能更聚焦于创造、情感与战略。

正如工业革命将人类从体力劳动中解放,AI或许正将我们推向“脑力解放”的新阶段。不必为消失的重复性职业哀叹,因为社会进步的本质,正是让人摆脱“浪费时间的工作”,追求更高级的创造与价值,难道这不就是人类追求的解放与自由吗?

人工智能带来的不是威胁,而是一场效率革命。它让我们离“终极自由”更近了一步——不再被琐事捆绑,而是用技术赋能各行各业的创新,用高效率重新催生各行各业的可能性。

此刻,我仿佛回到了互联网初生的年代,那种对未知的期待与悸动再次涌上心头。与其恐慌,不如拥抱这个时代。因为AI不是终点,而是人类探索星辰大海的新起点。

不关注,无社交

2025年2月26日 12:12

最近在播客录制关于「关系」的节目,也给我带来一个回顾式的思考。

我以前是一个很「独」的人,这种「独」一定会伴随另一种很「中二」的情况同时发生——就是看不起任何人。这件事的羞耻,是当你在下一个时间节点再次回头看的时候,你会发现那并不是「特别」,而是一条「必经之路」。

特别是对于我这种,童年因为性格孤僻,逃进自己世界的孩子,这种强烈的与外界的区隔感,会被合理化成「我是最特别」的存在。但这种特别,最终又不得不接受人被赋予的另一层社会属性的考验——关系。

前段时间,收到一些朋友的咨询,有好几个询问我关于公司辞退赔偿问题的案例里,我找到了一个巧妙的共通性——这些人几乎在职场是没有「社交」的,按部就班地做着自己的工作,办公室有任何社交活动,他们都各种推脱。理由几乎都是「这群同事和上司都太傻逼了,我真心瞧不上他们」。

于是,这里就诞生了一个更为巧妙的现职场悖论:既然上司是傻逼,那你为什么没有能力替代他们?


不得不承认,职场确实不是用来「交朋友」的,但并不意味着职场不是一个需要去处理「关系」的地方。职场关系更接近政治关系,而不是简单的人情世故。越是大厂、分立的门户越多,矛盾就会越多,必然就会出现战队、对立,甚至是敌人的敌人就是我的朋友这样的剧情。

明明一群这么热爱看宫斗剧下饭的人,却没能真正地学到宫斗里的精髓——处理那些生活中的政治关系——甚至是家庭,本身就是最小单位的政治关系。

之所以我在最开始提到「必经之路」这个点,这种「他们都是傻逼」也是职场关系里的「必经之路」。它们两者有一个共同点,就是「看不见他人」。

一般说到这里,就会引起不满——我为什么要看见他人?他们都是傻逼,有什么值得我浪费时间的?

那我可能要在这里说一个会引起更多不满的论据——看不见别人,是因为自己没有被足够地看到。


关系里的关注,就跟两个人共有一个「盒子」一样。当盒子里什么都没有时,谁都无法从盒子里取出东西。但如果你是那个往盒子里放东西的人,对方一味地索取,从盒子里拿走东西,很快你就不再希望一味地付出。所谓的关系里的「盒子」,就是两个人有来有回的交换关注,盒子里永远有东西,你拿或者他拿,都建立在你知道当你付出之后,一定会得到对方给予的回应。

当然,一个人也可以作为这个「盒子」的游戏研发者,比如我在很久以前放入一个尘封的记忆,然后在下一个阶段拿出来反复品味。但这个时候,一旦涉及到你想要把这个「东西」拿出来给他人展示的时候(哪怕是不经意的,因为这个叫潜意识的渴望),这场自我游戏就会加入第三人的视角,你不得不承认,你也希望被他人看见。

于是,这里就诞生了一个巧妙的现在社交悖论:看不见别人是因为我没有找到可以看见我的人,而别人看不见我是因为我没有看见他。


看见的「技巧」,在播客节目里,链接在文章最后

这里来聊聊看见的「底层」。

此前我在博客花了大篇幅聊起「死亡焦虑」的话题,这件事本身就是跟「看见」挂钩的——人是社会的动物,生存本身也拥有了动物性和社会性两种相互存在的形态。社会性的生存,是需要关系作为依托,就算是再窝囊的孩子,在父母那里都是一块宝。因为有不同的身份关系,才构建出了一个存在与社会里的「人」。否者,就会经历真正意义上的「社会性死亡」——这也是网民网暴最希望发生的结果,当一个人丧失在公共领域原本的身份,他也将失去因为这个身份得到的一切。比如,明星跌落神坛。

自此,死亡本身,也拥有了动物性和社会性的两种形态,即实质性死亡和社会性死亡。


最后,聊一种「假关注」。

这个例子我们常在做话剧疗愈时会提到:约会的年轻男女在湖边散步,女孩子一直在摆弄自己的头发、裙子,总觉得自己的妆容不太漂亮,会让自己的男伴不喜欢自己。她的出发点都是为了这场约会顺利成功,希望男伴能够真实地感受到自己的情感,甚至希望自己可以变得更好,让男伴更有面子。

这种模式的关注在社交里也常常发生。比如我总是担心自己的这句话会不会惹到对方,我的用词会不会让对方误解,我的行为会不会打扰到对方,我的主动会不会是一种侵犯他人领域的行为等等。

如果我们把这些行为再往底层拆解——他真的是在为对方「考虑」,还是说他怕自己的行为导致对方给予自己「不好的评价」?显然,这样的「假关注」本质上还是在关注自己的行为,希望自己得到正面评价(关注),而不是在真正地考虑对方。

因为真正地关注对方,会询问「我这样做会不会冒犯到你」。


再次回到那条「必经之路」,或许正是因为我们在需要被关注的时候无人关注自己,所以只能回到自我关注的世界,才渐渐地丧失了关注别人的能力。

或许你会说,是因为他们都不理解我——但你真的有为自己发声吗?你真的有向对方表达过希望得到关注吗?或者说你仅仅只是在享受无视他人的一味「当爹」宣讲?

关于「关注」技巧:

怎么用好 DeepSeek?这里有 60 多款集成 DeepSeek 的应用!

2025年2月21日 23:38

大家对 DeepSeek 的理解就是对话,问它一个问题,它解答你,然后呢?很多人就没有然后了,其实已经很多第三方应用集成了 DeepSeek,用好这些集成 DeepSeek 第三方,拓展自己使用 AI 场景,提高工作和学习的效率。

为了方便在公众号展示,我在文章中使用图片展示了,下载链接统一在文章末尾展示,你也可以直接拉到末尾复制链接去下载。

使用这些第三方应用,需要用到 DeepSeek 的 API key,登录 DeepSeek 开放平台获取即可,一般充值 10 员就可以用很久。

应用推荐

浏览器插件

即时通讯插件

AI Agent 框架

RAG 框架

编程插件

统一获取地址:https://github.com/deepseek-ai/awesome-deepseek-integration

腾讯元宝接入 DeepSeek-R1 满血版,并且支持联网搜索!

2025年2月13日 23:03

最近 DeepSeek 老是服务器繁忙,这之前也分享了三个替代方法。现在也有新的方法了,腾讯元宝也接入 DeepSeek-R1 满血版,并且支持联网搜索。

打开腾讯元宝的网页:https://yuanbao.tencent.com/

大模型选择 DeepSeek R1,还可以开启联网搜索,试一下:「国内最强的 WordPress 个人开发者是?」

他引用了 5 篇资料作为参考,我点击了一下,前面三篇公众号文章,其中第一篇是本公众号的文章「给大家装个大的:我做的 WordPress 项目」,看来在自己公众号吹下牛,还是有好处的。

最后他的回复:

看来还是非常准确的,至少我是这样认为的。😁

除了网页版之后,腾讯元宝的 APP 也支持 DeepSeek,在应用搜索搜索「腾讯元宝」即可获取。

为何 DeepSeek 没有别人用得好,因为他们有官方提示库!

2025年2月13日 22:34

最近大家在使用 DeepSeek 的时候,感觉没有自己用起来有点不太对,怎么说呢,网上的人怎么用起来那么好,自己用就感觉没有那么好,是姿势不对,还是缺少点什么?

其实就是没有让 DeepSeek 完全了解到你的需求,就像人和人之间沟通交流一样,首先要理解别人的需求,才能够做出正确的回应,AI 再聪明,首先也得要知道你的需求。

那么如何让 AI 读懂用户的需求呢,这就需要说到提示词,简单的说,提示词就是事先给定 AI 规则和框架,让 DeepSeek 按照指定的逻辑进行推理,然后给出答案。

那么接下来的问题就变成了怎么写 DeepSeek 的提示词呢?其实完全不用担心,DeepSeek 官方提供了一个提示词库,先仔细学习一下,照着写一些,慢慢你就能成为 DeepSeek 使用大师了。

直接来,DeepSeek 官方提示词网址是:

https://api-docs.deepseek.com/zh-cn/prompt-library/

目前官方提示词库一共有 13 个:

非常好,特别前面三个就是代码相关的,特别符合程序员使用。简单点,我们就先看看「代码解释」这个提示词怎么写,点开之后:

其实非常简单,就是一句话「请解释下面这段代码的逻辑,并说明完成了什么功能:」,然后附上代码即可。

那么就来试试,我把 #WPJAM Basic# 里面的 wpjam_compare 函数的代码提供给他,让它解释一下:

这段 PHP 代码定义了一个名为 wpjam_compare 的函数,用于比较两个值 $value 和 $value2,并根据指定的比较运算符 $compare 返回比较结果。函数还支持严格模式($strict),并且在某些情况下可以处理数组和字符串的比较。

代码逻辑解析

  1. 参数处理
    • 函数接受三个参数:$value(要比较的值)、$compare(比较运算符),以及可变参数 $args(用于传递额外的参数)。
    • 如果 $compare 是一个数组,或者 $args 为空,那么函数会将 $compare 赋值给 $value2,并将 $compare 和 $strict 分别设置为空字符串和 false
    • 否则,$value2 会被赋值为 $args[0]$strict 会被赋值为 $args[1](如果存在),否则为 false
  2. 比较运算符处理
    • 如果 $compare 不为空,函数会将其转换为大写,并检查是否存在对应的反义词(如 != 的反义词是 =)。
    • 如果存在反义词,函数会递归调用自身,并使用反义词进行比较,然后返回取反的结果。
  3. 默认比较运算符
    • 如果 $compare 为空,函数会根据 $value2 的类型(数组或非数组)来设置默认的比较运算符 IN 或 =
  4. 特殊比较运算符处理
    • 如果比较运算符是 IN 或 BETWEEN,函数会对 $value2 进行处理:
      • 对于 IN,如果 $value2 是数组且只有一个元素,函数会将 $value2 转换为该元素,并将比较运算符改为 =
      • 对于 BETWEEN$value2 应该是一个包含两个元素的数组,表示范围。
  5. 比较操作
    • 根据 $compare 的值,函数会执行不同的比较操作:
      • =:使用 == 或 ===(取决于 $strict)进行比较。
      • > 和 <:分别使用 > 和 < 进行比较。
      • IN:如果 $value 是数组,函数会检查数组中的所有元素是否都在 $value2 中;否则,检查 $value 是否在 $value2 中。
      • BETWEEN:检查 $value 是否在 $value2 指定的范围内。
  6. 返回值
    • 函数根据比较结果返回 true 或 false

功能总结

wpjam_compare 函数的主要功能是比较两个值 $value 和 $value2,并根据指定的比较运算符 $compare 返回比较结果。函数支持多种比较运算符(如 =><INBETWEEN 等),并且可以处理数组和字符串的比较。此外,函数还支持严格模式($strict),在严格模式下使用 === 进行比较。

这个函数可以用于复杂的条件判断场景,特别是在需要处理多种比较运算符和数组的情况下。

完全没有问题,比我自己讲解得更清楚。😁

非常重要的是,DeepSeek 官方提示库最后一个提示词是「模型提示词生成」,可以指导用户生成自己所需的提示词:

怎么使用,由于 DeepSeek 经常服务器繁忙,今天演示比较困难。😅

之后我再给大家演示怎么生成自己所需要的提示词工具。大家有什么已经生成好的提示词也可以留言分享给大家。最后再说下 DeepSeek 官方提示库的地址:

https://api-docs.deepseek.com/zh-cn/prompt-library/

使用 DeepSeek 写代码也是一把好手,我简单通过两次问答就实现链式调用的支持

2025年2月4日 22:43

今天发现 WPJAM_Field 这个字段处理类中好几个方法都是传递 $value 进去,处理之后再返回 $value,这个感觉上很类似 JavaScript 工具库 underscore 的链式调用,所以打算实现一下链式调用,我自己是试了几次实现感觉都很麻烦,于是直接让 DeepSeek 来帮我实现,为了方便提问,我也把把相关代码省略了一下:

假设我有个这样一个 PHP Class,它的几个方法比如 validate prepare unpackpack 等,都是传入一个 $value,处理之后返回 $value,参考如下,具体处理代码我省略了:

class WPJAM_Field{
	public function validate($value, $for=''){
		// 省略具体的处理代码

		return $value;
	}

	public function pack($value){
		// 省略具体的处理代码

		return $value;
	}

	public function unpack($data){
		// 省略具体的处理代码

		return $value;
	}

	public function prepare($args){
		// 省略具体的处理代码

		return $value;
	}

	// 其他方法
}

现在我不能改动这些方法,因为其他地方已经使用了,但是我想实现链式调用,有没有方法?

我开启了深度思考,DeepSeek 太牛逼了,把各种情况都给考虑了一遍,他首先去理解链式调用的关键点,然后怎么实现,自己尝试想到的每种方法,可能的问题等,最后得出最佳解:

嗯,用户有一个PHP类WPJAM_Field,里面有几个方法比如validate、prepare、unpack和pack,这些方法都接收一个值,处理之后返回。现在用户想实现链式调用,但不能修改现有方法,因为其他地方已经在使用了。这需要找到一个解决方案,既能保持原有方法的兼容性,又能添加链式调用的支持。

首先,链式调用的关键点是每个方法返回对象实例本身,也就是$this。这样每次调用方法后可以继续调用其他方法。但用户现有的方法都是返回处理后的$value,而不是对象实例,所以直接修改这些方法的返回值会破坏现有代码。因此,不能直接在这些方法中添加return $this。

那该怎么办呢?可能需要创建一个新的类,或者使用某种包装器,将原有类的方法进行封装,使得每次调用后返回实例本身,同时保留原有的处理逻辑。或者,是否可以在现有类中添加新的方法,比如链式调用的版本,例如在方法名后面加上Chainable,比如validateChainable,然后在这些新方法中调用原有方法处理值,并将处理后的值存储起来,同时返回$this。

或者,是否可以使用__call魔术方法来拦截方法调用,并在调用原有方法之后返回$this?但这样的话,如何处理$value的传递呢?因为每个方法处理的是传入的$value,并返回处理后的值。如果链式调用需要每个方法处理同一个值,并将处理后的值传递给下一个方法,那么可能需要维护一个中间值,比如在类中添加一个属性,比如$currentValue,然后在每个链式方法中更新这个值。

例如,用户可能需要这样调用:

$field = new WPJAM_Field();

$result = $field->validate('input')->pack()->get();

这时候,每个方法需要处理当前的$currentValue,并将结果保存回$currentValue,然后返回$this。但原有的方法都是接收外部传入的$value,并返回处理后的值。所以,如果要在链式调用中使用这些方法,可能需要将这些方法包装成处理内部保存的值。

那么可能的步骤是:

1. 在WPJAM_Field类中添加一个属性,比如protected $chainableValue,用来保存链式调用过程中处理的值。

2. 创建新的方法,比如validateChain、packChain等,这些方法会使用$this->chainableValue作为输入,调用原有的validate、pack等方法,然后将结果保存回$this->chainableValue,并返回$this以支持链式调用。

3. 添加一个方法,比如getValue(),用于在链式调用结束后获取处理后的值。

但是这样需要用户改变调用方式,使用新的方法名,这可能不太方便,或者需要用户适应新的方法名。或者是否可以使用魔术方法或者某种方式,使得用户仍然可以调用原有的方法名,但自动处理链式调用的逻辑?

另一个思路是创建一个装饰器类,包装原有的WPJAM_Field实例,在装饰器中维护当前处理的值,并将每个方法调用转换为对装饰器内部值的处理,并返回装饰器实例本身。例如:

class WPJAM_FieldChainable {

protected $field;

protected $currentValue;

public function __construct(WPJAM_Field $field, $initialValue) {

$this->field = $field;

$this->currentValue = $initialValue;

}

public function validate($for = '') {

$this->currentValue = $this->field->validate($this->currentValue, $for);

return $this;

}

public function pack() {

$this->currentValue = $this->field->pack($this->currentValue);

return $this;

}

// 其他方法类似...

public function get() {

return $this->currentValue;

}

}

然后用户可以这样使用:

$originalField = new WPJAM_Field();

$chainable = new WPJAM_FieldChainable($originalField, $initialValue);

$result = $chainable->validate()->pack()->get();

这样,用户不需要修改原有的WPJAM_Field类,而是通过装饰器来实现链式调用。不过,这需要用户创建一个新的对象,并且初始值需要传入。这可能是一个可行的办法,但用户可能需要调整他们的代码结构,或者提供一个更便捷的方式来创建链式调用的实例。

或者,是否可以在WPJAM_Field类中添加一个方法,比如chain($value),该方法返回一个链式调用的包装器实例,例如:

class WPJAM_Field {

// 原有方法...

public function chain($value) {

return new WPJAM_FieldChainable($this, $value);

}

}

这样用户就可以这样调用:

$field = new WPJAM_Field();

$result = $field->chain($input)->validate()->pack()->get();

这可能是一个比较方便的方式,用户只需要添加chain方法,并且其他方法不需要改动。而WPJAM_FieldChainable类负责处理链式调用,每次调用方法后返回自身,并更新内部的值。

不过,这样需要在WPJAM_Field类中添加chain方法,而用户可能不希望修改原有类,或者用户可能无法修改该类?如果用户不能修改该类,那么可能需要使用装饰器模式,不修改原有类,而是在外部创建一个包装类。

或者,用户是否可以扩展原有的类,创建一个子类,添加链式调用的方法?例如:

class WPJAM_ChainableField extends WPJAM_Field {

protected $chainValue;

public function chain($value) {

$this->chainValue = $value;

return $this;

}

public function validate($for = '') {

$this->chainValue = parent::validate($this->chainValue, $for);

return $this;

}

public function pack() {

$this->chainValue = parent::pack($this->chainValue);

return $this;

}

// 其他方法重写...

public function get() {

return $this->chainValue;

}

}

但这样需要覆盖原有的方法,将它们的返回值改为$this,这可能会影响原有代码中调用这些方法的方式。例如,原来的代码可能期望调用validate()返回处理后的值,而子类中的validate()返回$this,这会破坏原有功能。所以这可能不可行。

因此,回到最初的思路,用户不能修改原有方法,所以必须找到一种不改变原有方法返回值的方法。可能的解决方案是使用一个包装类,将每个方法的调用转换为对内部值的处理,并维护该值,同时返回实例本身。

因此,最终的解决方案可能是创建一个新的类,例如WPJAM_FieldChain,该类包含一个WPJAM_Field的实例和一个当前值。然后,这个新类有与原有类相同的方法名,但每个方法都接受较少的参数(例如不需要传递$value,因为值保存在内部),处理内部值,并返回$this。用户需要将原有类的实例传递给这个新类的构造函数,或者新类内部创建原有类的实例。

例如:

class WPJAM_FieldChain {

protected $field;

protected $value;

public function __construct(WPJAM_Field $field, $initialValue) {

$this->field = $field;

$this->value = $initialValue;

}

public function validate($for = '') {

$this->value = $this->field->validate($this->value, $for);

return $this;

}

public function pack() {

$this->value = $this->field->pack($this->value);

return $this;

}

public function unpack($data) {

// 注意:原方法可能需要参数,比如unpack的参数是$data,但这里可能不需要,或者如何处理?

// 比如,可能这个方法的链式调用需要不同的处理方式?

// 这里可能需要重新考虑参数的问题。

// 原方法unpack的参数是$data,返回$value。但在链式调用中,可能需要将$data作为初始值?

// 或者unpack可能不适用于链式调用?

// 这可能是一个问题,因为原方法的参数可能不同,比如unpack需要$data,而其他方法需要不同的参数。

// 所以,可能需要处理各个方法的参数差异。

// 例如,对于unpack,可能在链式调用中,用户需要传递参数,比如:

$this->value = $this->field->unpack($data);

return $this;

}

public function prepare($args) {

// 原prepare方法接受$args,并返回$value,这里如何处理?

$this->value = $this->field->prepare($args);

return $this;

}

public function get() {

return $this->value;

}

}

然后用户的使用方式可能如下:

$originalField = new WPJAM_Field();

$chain = new WPJAM_FieldChain($originalField, $initialValue);

$result = $chain->validate()->pack()->get();

但是,这样的问题在于,每个方法可能需要不同的参数。例如,validate方法可能需要$for参数,而prepare需要$args参数。因此,在链式调用的每个方法中,需要允许用户传递这些参数。例如,调用$chain->validate('some_for'),这时候在WPJAM_FieldChain的validate方法中,需要接受$for参数,并将其传递给原field的validate方法。

因此,上面的例子中的validate方法应该接受$for参数,例如:

public function validate($for = '') {

$this->value = $this->field->validate($this->value, $for);

return $this;

}

这样,用户可以在链式调用时传递必要的参数,例如:

$chain->validate('for_something')->pack();

对于其他方法,如unpack,可能需要不同的参数。例如,原unpack方法接收$data参数,但在链式调用中,可能需要将$data作为初始值,或者如何处理?例如,假设原unpack方法是从$data中提取某个值,那么在链式调用中,可能需要调用unpack并将结果保存到当前值中:

public function unpack($data) {

$this->value = $this->field->unpack($data);

return $this;

}

但这样,unpack的参数是外部传入的$data,而不是处理当前的值。这可能与链式调用的预期不同。例如,其他方法如validate和pack都是处理当前的值,而unpack则是处理传入的$data,并替换当前的值。这可能符合用户的需求,但需要明确。

例如,用户可能希望链式调用是这样的:

$chain->unpack($data)->validate()->pack();

这时候,unpack处理传入的$data,得到value,保存到链中的当前值,然后validate处理该值,接着pack处理后的结果。

这可能符合预期,所以在这种情况下,unpack的参数是外部的$data,而其他方法处理当前值。因此,在链式调用中,unpack可能用于设置初始值,或者根据具体情况处理。

同样,prepare方法可能需要参数,例如:

public function prepare($args) {

$this->value = $this->field->prepare($args);

return $this;

}

但原prepare方法接收$args参数,并返回处理后的value。这可能意味着,在链式调用中,prepare的参数是某个$args,处理后的结果成为当前值。例如,用户可能需要:

$chain->prepare(['some' => 'args'])->validate()->pack();

这样,prepare处理传入的$args,并将结果作为当前值,之后继续处理。

这样看来,这个解决方案是可行的。用户需要创建一个新的链式调用包装类,该类接受原始Field实例和初始值,然后每个方法调用将处理当前值(可能需要其他参数),并返回自身,最后通过get方法获取结果。

但用户可能需要不同的初始值传递方式。例如,用户可能不想在构造函数中传入初始值,而是通过某个方法设置初始值。例如:

$chain->setValue($initialValue)->validate()->pack();

但为了简化,可能在构造函数中传入初始值比较方便。

总结解决方案:

1. 创建一个新的包装类,例如WPJAM_FieldChain,内部持有WPJAM_Field的实例和当前处理的值。

2. 该包装类为每个需要链式调用的方法创建对应的方法,这些方法接受相应的参数,调用原始类的方法处理当前值(或传入的参数),然后保存结果到当前值,并返回$this。

3. 添加一个get方法,用于获取最终处理后的值。

这样,用户在不修改原有类的情况下,可以通过这个包装类实现链式调用。例如:

$originalField = new WPJAM_Field();

$chain = new WPJAM_FieldChain($originalField, $initialValue);

$result = $chain->validate('for')->pack()->get();

或者,如果用户希望更简洁,可以在原有类中添加一个方法返回包装类的实例:

class WPJAM_Field {

// 原有方法...

public function chain($value) {

return new WPJAM_FieldChain($this, $value);

}

}

这样用户可以直接:

$result = $field->chain($value)->validate()->pack()->get();

当然,这需要用户能修改原有类,添加chain方法。如果用户不能修改原有类,则需要手动创建包装类的实例。

因此,最终的解决方案是使用装饰器模式或包装类,将原有类的方法包装成链式调用的形式,维护处理过程中的值,并在每个方法调用后返回实例本身,从而支持链式调用。

DeepSeek 给出了答案:

为了实现链式调用而不修改原有的 WPJAM_Field 类,可以采用 装饰器模式 创建一个新的类,该类包装原类的实例并维护处理过程中的值。以下是具体实现步骤:

1. 创建链式调用的装饰器类

class WPJAM_FieldChain {
    protected $field;
    protected $value;

    public function __construct(WPJAM_Field $field, $initialValue) {
        $this->field = $field;
        $this->value = $initialValue;
    }

    public function validate($for = '') {
        $this->value = $this->field->validate($this->value, $for);
        return $this; // 返回自身以支持链式
    }

    public function pack() {
        $this->value = $this->field->pack($this->value);
        return $this;
    }

    public function unpack($data) {
        $this->value = $this->field->unpack($data);
        return $this;
    }

    public function prepare($args) {
        $this->value = $this->field->prepare($args);
        return $this;
    }

    // 其他需要链式的方法...

    public function get() {
        return $this->value; // 获取最终结果
    }
}

2. 使用示例

// 原类实例
$originalField = new WPJAM_Field();

// 创建链式实例,传入初始值
$chain = new WPJAM_FieldChain($originalField, $initialValue);

// 链式调用
$result = $chain->validate('for_something')
               ->pack()
               ->get();

// 或者处理其他逻辑
$processed = $chain->unpack($data)
                  ->prepare(['arg' => 'value'])
                  ->validate()
                  ->get();

3. 可选优化:添加 chain 方法到原类(若允许修改)

如果允许在 WPJAM_Field 中添加方法,可以简化链式对象的创建:

class WPJAM_Field {
    // 原有方法...

    public function chain($value) {
        return new WPJAM_FieldChain($this, $value);
    }
}

// 使用方式
$result = $originalField->chain($input)
                       ->validate()
                       ->pack()
                       ->get();

方案优势

  • 无侵入性:无需修改原类代码,完全兼容已有逻辑。
  • 灵活处理参数:每个链式方法可接受原方法所需参数,透明传递。
  • 维护状态:内部维护 value 状态,链式调用自然传递处理结果。

此方案通过包装类巧妙地将原有方法转换为链式操作,兼顾了兼容性和扩展性。


太牛逼了,完全实现了我的想法,唯一一点缺陷是就是如果我有新方法需要链式调用,那么装饰器类也要新增一次,并且 WPJAM_FieldChain 这个类的名字貌似只是给 WPJAM_Field 使用,缺乏通用性,那就让 DeepSeek 再优化一下:

非常棒,但是还有 2 点小问题,如果 WPJAM_Field 有新方法需要链式调用,那么装饰器类也要新增一次,能否使用 __call 魔术方法?并且 WPJAM_FieldChain 这个类的名字貌似只是给 WPJAM_Field 使用,缺乏通用性。但是这个链式调用应该都通用的,可以改成 WPJAM_Chainable 这个名字是否合适?

和前面一样一定认真阅读它的深度思考过程,相比具体的代码实现,它的思考过程对我们编程能力和解决问题能力提高帮助更大,这里我就不再复制过来,因为太长了,并且还是深深震撼了我,我直接给出他的答案:

解决方案:利用 __call 提升灵活性和通用性

针对原有方案的改进需求,我们可以通过以下方式实现更灵活、更通用的链式调用:

1. 使用 __call 魔术方法自动代理方法调用

通过 __call 方法动态转发调用到原对象,自动处理参数和返回值,无需为每个方法编写重复代码。

class WPJAM_Chainable {
    protected $object;  // 原对象(如 WPJAM_Field)
    protected $value;   // 当前处理的值

    public function __construct($object, $initialValue) {
        $this->object = $object;
        $this->value = $initialValue;
    }

    public function __call($method, $args) {
        if (method_exists($this->object, $method)) {
            // 通过反射检查方法是否需要 $value 作为第一个参数
            $reflectionMethod = new \ReflectionMethod($this->object, $method);
            $parameters = $reflectionMethod->getParameters();

            // 如果方法的第一个参数名为 "value",自动插入当前值
            if (!empty($parameters) && $parameters[0]->getName() === 'value') {
                array_unshift($args, $this->value);
            }

            // 调用原方法并更新值
            $this->value = call_user_func_array([$this->object, $method], $args);
            return $this; // 链式返回
        }

        throw new \BadMethodCallException("Method {$method} does not exist.");
    }

    public function get() {
        return $this->value; // 获取最终结果
    }
}

2. 增强通用性:类名和参数约定

  • 类名优化:将 WPJAM_FieldChain 改为通用的 WPJAM_Chainable,表明它是一个通用的链式调用包装器。
  • 参数约定:约定原对象的方法若需要处理当前值,则其第一个参数必须命名为 $value(如 validate($value, ...)),否则直接透传用户参数(如 unpack($data))。

3. 使用方法

基本调用

$field = new WPJAM_Field();
$chain = new WPJAM_Chainable($field, $initialValue);

$result = $chain->validate('for_something')  // 自动插入 $value 作为第一个参数
               ->pack()                      // 自动插入 $value
               ->unpack($externalData)       // 直接透传 $externalData
               ->get();

可选优化:添加 chain 快捷方法(若允许修改原类)

class WPJAM_Field {
    // 原有方法...

    public function chain($value) {
        return new WPJAM_Chainable($this, $value);
    }
}

// 使用方式
$result = $field->chain($input)
               ->validate('for_something')
               ->pack()
               ->get();

方案优势

  1. 无需手动同步方法
    通过 __call 动态代理,原类新增方法时,只要符合参数约定(如第一个参数为 $value),链式调用自动生效,无需修改 WPJAM_Chainable
  2. 通用性设计
    • 类名 WPJAM_Chainable 表明其通用性,可复用于任何需要链式调用的类。
    • 通过反射和参数约定,灵活适配不同方法签名。
  3. 兼容性保障
    • 完全无需修改原类代码,无侵入式扩展。
    • 对 unpack($data) 等特殊方法,直接透传用户参数,兼容性强。

注意事项

  • 参数命名约定:需确保原类中需要处理当前值的方法,其第一个参数命名为 $value
  • 返回值约定:原方法必须返回处理后的值,以便链式传递。
  • 异常处理:通过 BadMethodCallException 明确提示不存在的方法调用。

此方案通过动态代理和约定优于配置的原则,实现了高度灵活和通用的链式调用,兼顾了代码简洁性和扩展性。


牛逼🐂🍺,厉害厉害,下一版本中,WPJAM Basic 我就加入这个 WPJAM_Chainable 的 class。感觉以后些任何功能都可以让 DeepSeek 来帮忙写了,比自己写的还考虑的周全完善。自己把握一下方向就好了,嘻嘻!大家 DeepSeek 也赶快用起来吧!

腾讯元宝接入 DeepSeek-R1 满血版,并且支持联网搜索!

2025年2月13日 23:03

最近 DeepSeek 老是服务器繁忙,这之前也分享了三个替代方法。现在也有新的方法了,腾讯元宝也接入 DeepSeek-R1 满血版,并且支持联网搜索。

打开腾讯元宝的网页:https://yuanbao.tencent.com/

大模型选择 DeepSeek R1,还可以开启联网搜索,试一下:「国内最强的 WordPress 个人开发者是?」

他引用了 5 篇资料作为参考,我点击了一下,前面三篇公众号文章,其中第一篇是本公众号的文章「给大家装个大的:我做的 WordPress 项目」,看来在自己公众号吹下牛,还是有好处的。

最后他的回复:

看来还是非常准确的,至少我是这样认为的。😁

除了网页版之后,腾讯元宝的 APP 也支持 DeepSeek,在应用搜索搜索「腾讯元宝」即可获取。

为何 DeepSeek 没有别人用得好,因为他们有官方提示库!

2025年2月13日 22:34

最近大家在使用 DeepSeek 的时候,感觉没有自己用起来有点不太对,怎么说呢,网上的人怎么用起来那么好,自己用就感觉没有那么好,是姿势不对,还是缺少点什么?

其实就是没有让 DeepSeek 完全了解到你的需求,就像人和人之间沟通交流一样,首先要理解别人的需求,才能够做出正确的回应,AI 再聪明,首先也得要知道你的需求。

那么如何让 AI 读懂用户的需求呢,这就需要说到提示词,简单的说,提示词就是事先给定 AI 规则和框架,让 DeepSeek 按照指定的逻辑进行推理,然后给出答案。

那么接下来的问题就变成了怎么写 DeepSeek 的提示词呢?其实完全不用担心,DeepSeek 官方提供了一个提示词库,先仔细学习一下,照着写一些,慢慢你就能成为 DeepSeek 使用大师了。

直接来,DeepSeek 官方提示词网址是:

https://api-docs.deepseek.com/zh-cn/prompt-library/

目前官方提示词库一共有 13 个:

非常好,特别前面三个就是代码相关的,特别符合程序员使用。简单点,我们就先看看「代码解释」这个提示词怎么写,点开之后:

其实非常简单,就是一句话「请解释下面这段代码的逻辑,并说明完成了什么功能:」,然后附上代码即可。

那么就来试试,我把 #WPJAM Basic# 里面的 wpjam_compare 函数的代码提供给他,让它解释一下:

这段 PHP 代码定义了一个名为 wpjam_compare 的函数,用于比较两个值 $value 和 $value2,并根据指定的比较运算符 $compare 返回比较结果。函数还支持严格模式($strict),并且在某些情况下可以处理数组和字符串的比较。

代码逻辑解析

  1. 参数处理
    • 函数接受三个参数:$value(要比较的值)、$compare(比较运算符),以及可变参数 $args(用于传递额外的参数)。
    • 如果 $compare 是一个数组,或者 $args 为空,那么函数会将 $compare 赋值给 $value2,并将 $compare 和 $strict 分别设置为空字符串和 false
    • 否则,$value2 会被赋值为 $args[0]$strict 会被赋值为 $args[1](如果存在),否则为 false
  2. 比较运算符处理
    • 如果 $compare 不为空,函数会将其转换为大写,并检查是否存在对应的反义词(如 != 的反义词是 =)。
    • 如果存在反义词,函数会递归调用自身,并使用反义词进行比较,然后返回取反的结果。
  3. 默认比较运算符
    • 如果 $compare 为空,函数会根据 $value2 的类型(数组或非数组)来设置默认的比较运算符 IN 或 =
  4. 特殊比较运算符处理
    • 如果比较运算符是 IN 或 BETWEEN,函数会对 $value2 进行处理:
      • 对于 IN,如果 $value2 是数组且只有一个元素,函数会将 $value2 转换为该元素,并将比较运算符改为 =
      • 对于 BETWEEN$value2 应该是一个包含两个元素的数组,表示范围。
  5. 比较操作
    • 根据 $compare 的值,函数会执行不同的比较操作:
      • =:使用 == 或 ===(取决于 $strict)进行比较。
      • > 和 <:分别使用 > 和 < 进行比较。
      • IN:如果 $value 是数组,函数会检查数组中的所有元素是否都在 $value2 中;否则,检查 $value 是否在 $value2 中。
      • BETWEEN:检查 $value 是否在 $value2 指定的范围内。
  6. 返回值
    • 函数根据比较结果返回 true 或 false

功能总结

wpjam_compare 函数的主要功能是比较两个值 $value 和 $value2,并根据指定的比较运算符 $compare 返回比较结果。函数支持多种比较运算符(如 =><INBETWEEN 等),并且可以处理数组和字符串的比较。此外,函数还支持严格模式($strict),在严格模式下使用 === 进行比较。

这个函数可以用于复杂的条件判断场景,特别是在需要处理多种比较运算符和数组的情况下。

完全没有问题,比我自己讲解得更清楚。😁

非常重要的是,DeepSeek 官方提示库最后一个提示词是「模型提示词生成」,可以指导用户生成自己所需的提示词:

怎么使用,由于 DeepSeek 经常服务器繁忙,今天演示比较困难。😅

之后我再给大家演示怎么生成自己所需要的提示词工具。大家有什么已经生成好的提示词也可以留言分享给大家。最后再说下 DeepSeek 官方提示库的地址:

https://api-docs.deepseek.com/zh-cn/prompt-library/

使用 DeepSeek 写代码也是一把好手,我简单通过两次问答就实现链式调用的支持

2025年2月4日 22:43

今天发现 WPJAM_Field 这个字段处理类中好几个方法都是传递 $value 进去,处理之后再返回 $value,这个感觉上很类似 JavaScript 工具库 underscore 的链式调用,所以打算实现一下链式调用,我自己是试了几次实现感觉都很麻烦,于是直接让 DeepSeek 来帮我实现,为了方便提问,我也把把相关代码省略了一下:

假设我有个这样一个 PHP Class,它的几个方法比如 validate prepare unpackpack 等,都是传入一个 $value,处理之后返回 $value,参考如下,具体处理代码我省略了:

class WPJAM_Field{
	public function validate($value, $for=''){
		// 省略具体的处理代码

		return $value;
	}

	public function pack($value){
		// 省略具体的处理代码

		return $value;
	}

	public function unpack($data){
		// 省略具体的处理代码

		return $value;
	}

	public function prepare($args){
		// 省略具体的处理代码

		return $value;
	}

	// 其他方法
}

现在我不能改动这些方法,因为其他地方已经使用了,但是我想实现链式调用,有没有方法?

我开启了深度思考,DeepSeek 太牛逼了,把各种情况都给考虑了一遍,他首先去理解链式调用的关键点,然后怎么实现,自己尝试想到的每种方法,可能的问题等,最后得出最佳解:

嗯,用户有一个PHP类WPJAM_Field,里面有几个方法比如validate、prepare、unpack和pack,这些方法都接收一个值,处理之后返回。现在用户想实现链式调用,但不能修改现有方法,因为其他地方已经在使用了。这需要找到一个解决方案,既能保持原有方法的兼容性,又能添加链式调用的支持。

首先,链式调用的关键点是每个方法返回对象实例本身,也就是$this。这样每次调用方法后可以继续调用其他方法。但用户现有的方法都是返回处理后的$value,而不是对象实例,所以直接修改这些方法的返回值会破坏现有代码。因此,不能直接在这些方法中添加return $this。

那该怎么办呢?可能需要创建一个新的类,或者使用某种包装器,将原有类的方法进行封装,使得每次调用后返回实例本身,同时保留原有的处理逻辑。或者,是否可以在现有类中添加新的方法,比如链式调用的版本,例如在方法名后面加上Chainable,比如validateChainable,然后在这些新方法中调用原有方法处理值,并将处理后的值存储起来,同时返回$this。

或者,是否可以使用__call魔术方法来拦截方法调用,并在调用原有方法之后返回$this?但这样的话,如何处理$value的传递呢?因为每个方法处理的是传入的$value,并返回处理后的值。如果链式调用需要每个方法处理同一个值,并将处理后的值传递给下一个方法,那么可能需要维护一个中间值,比如在类中添加一个属性,比如$currentValue,然后在每个链式方法中更新这个值。

例如,用户可能需要这样调用:

$field = new WPJAM_Field();

$result = $field->validate('input')->pack()->get();

这时候,每个方法需要处理当前的$currentValue,并将结果保存回$currentValue,然后返回$this。但原有的方法都是接收外部传入的$value,并返回处理后的值。所以,如果要在链式调用中使用这些方法,可能需要将这些方法包装成处理内部保存的值。

那么可能的步骤是:

1. 在WPJAM_Field类中添加一个属性,比如protected $chainableValue,用来保存链式调用过程中处理的值。

2. 创建新的方法,比如validateChain、packChain等,这些方法会使用$this->chainableValue作为输入,调用原有的validate、pack等方法,然后将结果保存回$this->chainableValue,并返回$this以支持链式调用。

3. 添加一个方法,比如getValue(),用于在链式调用结束后获取处理后的值。

但是这样需要用户改变调用方式,使用新的方法名,这可能不太方便,或者需要用户适应新的方法名。或者是否可以使用魔术方法或者某种方式,使得用户仍然可以调用原有的方法名,但自动处理链式调用的逻辑?

另一个思路是创建一个装饰器类,包装原有的WPJAM_Field实例,在装饰器中维护当前处理的值,并将每个方法调用转换为对装饰器内部值的处理,并返回装饰器实例本身。例如:

class WPJAM_FieldChainable {

protected $field;

protected $currentValue;

public function __construct(WPJAM_Field $field, $initialValue) {

$this->field = $field;

$this->currentValue = $initialValue;

}

public function validate($for = '') {

$this->currentValue = $this->field->validate($this->currentValue, $for);

return $this;

}

public function pack() {

$this->currentValue = $this->field->pack($this->currentValue);

return $this;

}

// 其他方法类似...

public function get() {

return $this->currentValue;

}

}

然后用户可以这样使用:

$originalField = new WPJAM_Field();

$chainable = new WPJAM_FieldChainable($originalField, $initialValue);

$result = $chainable->validate()->pack()->get();

这样,用户不需要修改原有的WPJAM_Field类,而是通过装饰器来实现链式调用。不过,这需要用户创建一个新的对象,并且初始值需要传入。这可能是一个可行的办法,但用户可能需要调整他们的代码结构,或者提供一个更便捷的方式来创建链式调用的实例。

或者,是否可以在WPJAM_Field类中添加一个方法,比如chain($value),该方法返回一个链式调用的包装器实例,例如:

class WPJAM_Field {

// 原有方法...

public function chain($value) {

return new WPJAM_FieldChainable($this, $value);

}

}

这样用户就可以这样调用:

$field = new WPJAM_Field();

$result = $field->chain($input)->validate()->pack()->get();

这可能是一个比较方便的方式,用户只需要添加chain方法,并且其他方法不需要改动。而WPJAM_FieldChainable类负责处理链式调用,每次调用方法后返回自身,并更新内部的值。

不过,这样需要在WPJAM_Field类中添加chain方法,而用户可能不希望修改原有类,或者用户可能无法修改该类?如果用户不能修改该类,那么可能需要使用装饰器模式,不修改原有类,而是在外部创建一个包装类。

或者,用户是否可以扩展原有的类,创建一个子类,添加链式调用的方法?例如:

class WPJAM_ChainableField extends WPJAM_Field {

protected $chainValue;

public function chain($value) {

$this->chainValue = $value;

return $this;

}

public function validate($for = '') {

$this->chainValue = parent::validate($this->chainValue, $for);

return $this;

}

public function pack() {

$this->chainValue = parent::pack($this->chainValue);

return $this;

}

// 其他方法重写...

public function get() {

return $this->chainValue;

}

}

但这样需要覆盖原有的方法,将它们的返回值改为$this,这可能会影响原有代码中调用这些方法的方式。例如,原来的代码可能期望调用validate()返回处理后的值,而子类中的validate()返回$this,这会破坏原有功能。所以这可能不可行。

因此,回到最初的思路,用户不能修改原有方法,所以必须找到一种不改变原有方法返回值的方法。可能的解决方案是使用一个包装类,将每个方法的调用转换为对内部值的处理,并维护该值,同时返回实例本身。

因此,最终的解决方案可能是创建一个新的类,例如WPJAM_FieldChain,该类包含一个WPJAM_Field的实例和一个当前值。然后,这个新类有与原有类相同的方法名,但每个方法都接受较少的参数(例如不需要传递$value,因为值保存在内部),处理内部值,并返回$this。用户需要将原有类的实例传递给这个新类的构造函数,或者新类内部创建原有类的实例。

例如:

class WPJAM_FieldChain {

protected $field;

protected $value;

public function __construct(WPJAM_Field $field, $initialValue) {

$this->field = $field;

$this->value = $initialValue;

}

public function validate($for = '') {

$this->value = $this->field->validate($this->value, $for);

return $this;

}

public function pack() {

$this->value = $this->field->pack($this->value);

return $this;

}

public function unpack($data) {

// 注意:原方法可能需要参数,比如unpack的参数是$data,但这里可能不需要,或者如何处理?

// 比如,可能这个方法的链式调用需要不同的处理方式?

// 这里可能需要重新考虑参数的问题。

// 原方法unpack的参数是$data,返回$value。但在链式调用中,可能需要将$data作为初始值?

// 或者unpack可能不适用于链式调用?

// 这可能是一个问题,因为原方法的参数可能不同,比如unpack需要$data,而其他方法需要不同的参数。

// 所以,可能需要处理各个方法的参数差异。

// 例如,对于unpack,可能在链式调用中,用户需要传递参数,比如:

$this->value = $this->field->unpack($data);

return $this;

}

public function prepare($args) {

// 原prepare方法接受$args,并返回$value,这里如何处理?

$this->value = $this->field->prepare($args);

return $this;

}

public function get() {

return $this->value;

}

}

然后用户的使用方式可能如下:

$originalField = new WPJAM_Field();

$chain = new WPJAM_FieldChain($originalField, $initialValue);

$result = $chain->validate()->pack()->get();

但是,这样的问题在于,每个方法可能需要不同的参数。例如,validate方法可能需要$for参数,而prepare需要$args参数。因此,在链式调用的每个方法中,需要允许用户传递这些参数。例如,调用$chain->validate('some_for'),这时候在WPJAM_FieldChain的validate方法中,需要接受$for参数,并将其传递给原field的validate方法。

因此,上面的例子中的validate方法应该接受$for参数,例如:

public function validate($for = '') {

$this->value = $this->field->validate($this->value, $for);

return $this;

}

这样,用户可以在链式调用时传递必要的参数,例如:

$chain->validate('for_something')->pack();

对于其他方法,如unpack,可能需要不同的参数。例如,原unpack方法接收$data参数,但在链式调用中,可能需要将$data作为初始值,或者如何处理?例如,假设原unpack方法是从$data中提取某个值,那么在链式调用中,可能需要调用unpack并将结果保存到当前值中:

public function unpack($data) {

$this->value = $this->field->unpack($data);

return $this;

}

但这样,unpack的参数是外部传入的$data,而不是处理当前的值。这可能与链式调用的预期不同。例如,其他方法如validate和pack都是处理当前的值,而unpack则是处理传入的$data,并替换当前的值。这可能符合用户的需求,但需要明确。

例如,用户可能希望链式调用是这样的:

$chain->unpack($data)->validate()->pack();

这时候,unpack处理传入的$data,得到value,保存到链中的当前值,然后validate处理该值,接着pack处理后的结果。

这可能符合预期,所以在这种情况下,unpack的参数是外部的$data,而其他方法处理当前值。因此,在链式调用中,unpack可能用于设置初始值,或者根据具体情况处理。

同样,prepare方法可能需要参数,例如:

public function prepare($args) {

$this->value = $this->field->prepare($args);

return $this;

}

但原prepare方法接收$args参数,并返回处理后的value。这可能意味着,在链式调用中,prepare的参数是某个$args,处理后的结果成为当前值。例如,用户可能需要:

$chain->prepare(['some' => 'args'])->validate()->pack();

这样,prepare处理传入的$args,并将结果作为当前值,之后继续处理。

这样看来,这个解决方案是可行的。用户需要创建一个新的链式调用包装类,该类接受原始Field实例和初始值,然后每个方法调用将处理当前值(可能需要其他参数),并返回自身,最后通过get方法获取结果。

但用户可能需要不同的初始值传递方式。例如,用户可能不想在构造函数中传入初始值,而是通过某个方法设置初始值。例如:

$chain->setValue($initialValue)->validate()->pack();

但为了简化,可能在构造函数中传入初始值比较方便。

总结解决方案:

1. 创建一个新的包装类,例如WPJAM_FieldChain,内部持有WPJAM_Field的实例和当前处理的值。

2. 该包装类为每个需要链式调用的方法创建对应的方法,这些方法接受相应的参数,调用原始类的方法处理当前值(或传入的参数),然后保存结果到当前值,并返回$this。

3. 添加一个get方法,用于获取最终处理后的值。

这样,用户在不修改原有类的情况下,可以通过这个包装类实现链式调用。例如:

$originalField = new WPJAM_Field();

$chain = new WPJAM_FieldChain($originalField, $initialValue);

$result = $chain->validate('for')->pack()->get();

或者,如果用户希望更简洁,可以在原有类中添加一个方法返回包装类的实例:

class WPJAM_Field {

// 原有方法...

public function chain($value) {

return new WPJAM_FieldChain($this, $value);

}

}

这样用户可以直接:

$result = $field->chain($value)->validate()->pack()->get();

当然,这需要用户能修改原有类,添加chain方法。如果用户不能修改原有类,则需要手动创建包装类的实例。

因此,最终的解决方案是使用装饰器模式或包装类,将原有类的方法包装成链式调用的形式,维护处理过程中的值,并在每个方法调用后返回实例本身,从而支持链式调用。

DeepSeek 给出了答案:

为了实现链式调用而不修改原有的 WPJAM_Field 类,可以采用 装饰器模式 创建一个新的类,该类包装原类的实例并维护处理过程中的值。以下是具体实现步骤:

1. 创建链式调用的装饰器类

class WPJAM_FieldChain {
    protected $field;
    protected $value;

    public function __construct(WPJAM_Field $field, $initialValue) {
        $this->field = $field;
        $this->value = $initialValue;
    }

    public function validate($for = '') {
        $this->value = $this->field->validate($this->value, $for);
        return $this; // 返回自身以支持链式
    }

    public function pack() {
        $this->value = $this->field->pack($this->value);
        return $this;
    }

    public function unpack($data) {
        $this->value = $this->field->unpack($data);
        return $this;
    }

    public function prepare($args) {
        $this->value = $this->field->prepare($args);
        return $this;
    }

    // 其他需要链式的方法...

    public function get() {
        return $this->value; // 获取最终结果
    }
}

2. 使用示例

// 原类实例
$originalField = new WPJAM_Field();

// 创建链式实例,传入初始值
$chain = new WPJAM_FieldChain($originalField, $initialValue);

// 链式调用
$result = $chain->validate('for_something')
               ->pack()
               ->get();

// 或者处理其他逻辑
$processed = $chain->unpack($data)
                  ->prepare(['arg' => 'value'])
                  ->validate()
                  ->get();

3. 可选优化:添加 chain 方法到原类(若允许修改)

如果允许在 WPJAM_Field 中添加方法,可以简化链式对象的创建:

class WPJAM_Field {
    // 原有方法...

    public function chain($value) {
        return new WPJAM_FieldChain($this, $value);
    }
}

// 使用方式
$result = $originalField->chain($input)
                       ->validate()
                       ->pack()
                       ->get();

方案优势

  • 无侵入性:无需修改原类代码,完全兼容已有逻辑。
  • 灵活处理参数:每个链式方法可接受原方法所需参数,透明传递。
  • 维护状态:内部维护 value 状态,链式调用自然传递处理结果。

此方案通过包装类巧妙地将原有方法转换为链式操作,兼顾了兼容性和扩展性。


太牛逼了,完全实现了我的想法,唯一一点缺陷是就是如果我有新方法需要链式调用,那么装饰器类也要新增一次,并且 WPJAM_FieldChain 这个类的名字貌似只是给 WPJAM_Field 使用,缺乏通用性,那就让 DeepSeek 再优化一下:

非常棒,但是还有 2 点小问题,如果 WPJAM_Field 有新方法需要链式调用,那么装饰器类也要新增一次,能否使用 __call 魔术方法?并且 WPJAM_FieldChain 这个类的名字貌似只是给 WPJAM_Field 使用,缺乏通用性。但是这个链式调用应该都通用的,可以改成 WPJAM_Chainable 这个名字是否合适?

和前面一样一定认真阅读它的深度思考过程,相比具体的代码实现,它的思考过程对我们编程能力和解决问题能力提高帮助更大,这里我就不再复制过来,因为太长了,并且还是深深震撼了我,我直接给出他的答案:

解决方案:利用 __call 提升灵活性和通用性

针对原有方案的改进需求,我们可以通过以下方式实现更灵活、更通用的链式调用:

1. 使用 __call 魔术方法自动代理方法调用

通过 __call 方法动态转发调用到原对象,自动处理参数和返回值,无需为每个方法编写重复代码。

class WPJAM_Chainable {
    protected $object;  // 原对象(如 WPJAM_Field)
    protected $value;   // 当前处理的值

    public function __construct($object, $initialValue) {
        $this->object = $object;
        $this->value = $initialValue;
    }

    public function __call($method, $args) {
        if (method_exists($this->object, $method)) {
            // 通过反射检查方法是否需要 $value 作为第一个参数
            $reflectionMethod = new \ReflectionMethod($this->object, $method);
            $parameters = $reflectionMethod->getParameters();

            // 如果方法的第一个参数名为 "value",自动插入当前值
            if (!empty($parameters) && $parameters[0]->getName() === 'value') {
                array_unshift($args, $this->value);
            }

            // 调用原方法并更新值
            $this->value = call_user_func_array([$this->object, $method], $args);
            return $this; // 链式返回
        }

        throw new \BadMethodCallException("Method {$method} does not exist.");
    }

    public function get() {
        return $this->value; // 获取最终结果
    }
}

2. 增强通用性:类名和参数约定

  • 类名优化:将 WPJAM_FieldChain 改为通用的 WPJAM_Chainable,表明它是一个通用的链式调用包装器。
  • 参数约定:约定原对象的方法若需要处理当前值,则其第一个参数必须命名为 $value(如 validate($value, ...)),否则直接透传用户参数(如 unpack($data))。

3. 使用方法

基本调用

$field = new WPJAM_Field();
$chain = new WPJAM_Chainable($field, $initialValue);

$result = $chain->validate('for_something')  // 自动插入 $value 作为第一个参数
               ->pack()                      // 自动插入 $value
               ->unpack($externalData)       // 直接透传 $externalData
               ->get();

可选优化:添加 chain 快捷方法(若允许修改原类)

class WPJAM_Field {
    // 原有方法...

    public function chain($value) {
        return new WPJAM_Chainable($this, $value);
    }
}

// 使用方式
$result = $field->chain($input)
               ->validate('for_something')
               ->pack()
               ->get();

方案优势

  1. 无需手动同步方法
    通过 __call 动态代理,原类新增方法时,只要符合参数约定(如第一个参数为 $value),链式调用自动生效,无需修改 WPJAM_Chainable
  2. 通用性设计
    • 类名 WPJAM_Chainable 表明其通用性,可复用于任何需要链式调用的类。
    • 通过反射和参数约定,灵活适配不同方法签名。
  3. 兼容性保障
    • 完全无需修改原类代码,无侵入式扩展。
    • 对 unpack($data) 等特殊方法,直接透传用户参数,兼容性强。

注意事项

  • 参数命名约定:需确保原类中需要处理当前值的方法,其第一个参数命名为 $value
  • 返回值约定:原方法必须返回处理后的值,以便链式传递。
  • 异常处理:通过 BadMethodCallException 明确提示不存在的方法调用。

此方案通过动态代理和约定优于配置的原则,实现了高度灵活和通用的链式调用,兼顾了代码简洁性和扩展性。


牛逼🐂🍺,厉害厉害,下一版本中,WPJAM Basic 我就加入这个 WPJAM_Chainable 的 class。感觉以后些任何功能都可以让 DeepSeek 来帮忙写了,比自己写的还考虑的周全完善。自己把握一下方向就好了,嘻嘻!大家 DeepSeek 也赶快用起来吧!

人称代词敏感与厌恶本质

2024年12月13日 11:00

《人称代词敏感与雌竞雄竞》提到的,是个体对于特定人称代词的敏感,它与激素水平有关。今天来讨论另一种人称代词敏感的「通路」,也是发生在博客评论区的趣事。

因为我在《作为创作者,你能分清写作、创作和工作吗?》直接采用的是,在回复私信时的口吻,所以里面用到了大量的「我们」,这个人称代词。同时,我也在文章第一段提及了「我们」,这个「我们」指的是我与发来私信的朋友,以及我了解过的「创作者们」。没想到,这个人称代词却引来了「不满」。

我是我,们是们。文章中出现了太多次的【我们】,我看到以后感觉很不舒服。

于是,我开始好奇这种「不舒服」的通路到底是什么。


我的确也有对「我们」非常反感的时候,比如和一些特定地域的人进行商务谈判时,他们会无视契约精神,一直围绕着「人情世故」强调合作的好处时,从他们酒气熏天的嘴里说出的「我们」,我是觉得刺耳的——因为我是个看重契约精神的人,也知道人情世故维持的契约本身是很难扯清楚利益、责任分配的。

另一些场景,比如我还在大厂上班时,公司团建要求所有人穿着统一,但在大夏天又只提供一件傻逼企业文化衫时。我第二天以衣服脏了为由拒绝穿它,却被公司人事、老板强调「我们」都是统一要求,我因为不认可这个程序规定,而拒绝被用「我们」框定归属。

这是一种最直接的「敏感」——我不希望和你是一样的人。

我把这一种「人称代词敏感」称之为「边界感的敏感」。是出于一种本能反应,但是这个表象很难说明这个通路的内核,既然是「反应」,那它是因为「认知」从「事实」被推导出来的结果。「事实」是我在文中使用了「我们」,且结合上下文能够看出这个我们值得是文中提及的特定人群,而不代表所有人;「反应」是当事人觉得「不舒服」;那么是什么「认知」导致了这样的「反应」,才是今天想要聊一聊的。情绪ABC


人称代词敏感认知的路径分析

I 经历相关

与认知相关的话题,往往可以回到「经历」来检索成因。

比如我在《人称代词敏感与雌竞雄竞》提到的,因为激素紊乱,导致了情绪失控,从而对人称代词极为敏感。这种情况往往会发生在亲密关系之间,因为人们需要时刻确认自己与对方是属于一体的,否则就会丧失归属感。

举个例子:并不喜欢绿色的小王,和朋友旅游时,被同行的朋友代表,在购买帽子时,朋友以「我们都喜欢绿帽子」要求老板拿出两顶绿帽子。(算了,这个例子怎么举得有点怪怪的)


II 用词习惯与范围标准不统一

「我们」常常用来模糊代表某些团体、共同者、辖区所有,从而导致范围标准上的冲突。

举个例子:产品设计部和设计部因为产品原型存在意见不合,设计主管称「我们讨论觉得应该使用扁平化」,产品经理就火了:「什么叫我们,我们要求设计的是实物风格」。这个时候设计部主管称的「我们」其实是指「整个设计部门」,并不包含「产品设计部」。


III 观点性反驳

当人们在不认同某一观点时,会以「对立身份」对观点进行反驳。

提出观点者若采用「我们」阐述观点时,即代表了他人发出了观点。但往往,人们在针对这一情况时,往往反对的是观点本身,而不是对人称代词发出「敏感」的控诉,否则观点的代表性依旧存在。

举个例子:一个人在陈述观点时,用词是「我们都喜欢吃屎」,那么不喜欢吃屎的人会立马站出来说道:「只有你喜欢吃屎好吧,不要代表我们。」


IV 个体与群体对抗

在个体关注自我表达、独立性的情况下,会对「人称代词」更加敏感,不希望自己被群体裹挟。

个体主义反感被定义、被情绪裹挟,所以他们希望通过划分「边界」的方式避免自己被群体解释。而个体的敏感往往是因为精准地识别到了「群体效应」的存在,例如群体正通过煽动情绪的方式纠集群体。个体与群体的对抗往往会保持「理性思考」的方式,划定群体行为、个体边界,然后找到矛盾所在。

举个例子:有人在网上高举「我们要努力」的旗子,个体会进行冷静思考「我们为什么要努力,努力真的有用吗?」


V 投射与心理防御机制

心理防御机制,是指无意识的心理机制,其作用在于减少因不可接受或潜在有害的事物而来的焦虑。投射本身是心理防御机制的一种,即是主观地将属于自身的一些不良的思绪、动机、欲望、或情感,赋予到他人或他物身上,推卸责任或把自己的过错归咎于他人,从而得到一种解脱。

心理防御机制也可能会提前预判「投射」,不允许对方使用「我们」的字眼投射自己的想法,从而预设了对方的行为,对投射进行了投射的心理防御机制。

举个例子:男友对女友说:「我们不要生气了好不好?」女友大怒:「我本来就没有生气,你干嘛要定义我有没有生气,我对你没什么好气的,你做得都是对的,我干嘛要生气。」


VI 个体/符号厌恶

当讨厌一个人时,他的任何表达对我们来说都能找到「瑕疵」,甚至还可以一言一句地捧哏吐槽对方。所以当这个人使用「我们」时,的确容易引起敏感情绪。

但这里我需要特别指出,我们(这个我们是诚心地建议)需要弄清楚自己正在讨厌个体,还是符号。

你在讨厌什么?先要弄清楚到底是具体的“人”,还是抽象的“符号”。讨厌具体的“人”往往很容易被识别,比如外貌、行为举止、或是某一段历史事件,导致你们之间产生了嫌隙。

而讨厌抽象的“符号”要更难识别,它往往跟一个人的原生家庭、童年经历、重大事件造成的PTSD相关。

如何区分二者,有一个比较简单的做法,就是询问自己:自己讨厌的东西在记忆里有过类似的吗?如果有,这个类似的记忆就是一个线头,说不定可以从这里扯出一个巨大的乱麻,理出一个你对“符号”厌恶的始末。

——《你在讨厌什么?》

需要解决人称代词敏感吗?

我觉得没必要,因为这是一种本能。本能的事情就交给本能去喜恶,但如果回头复盘的时候,能弄清楚自己到底因为什么对人称代词导致了敏感,也未尝不是件自省的事情。

我自觉自己不是给讨人喜欢的人,特别是今年在中文博客圈炸了这么多次粪坑,被讨厌也是有理有据的,因此我还是很愿意跟大家好好聊聊讨厌的是我这个体,还是我代表的某种符号,而这个符号直接投射了自己内心的「敏感」。

比如,解构「讨厌」的是什么的过程中,就可以确定是莫比乌斯的作者以及他的狗屁观点;还是讨厌莫比乌斯这种人以及他的粉丝代表的某种符号,讨厌符号可能就会涉及对「人称代词」的厌恶。比如每次在后台私信骂我的人,总是没有搞清楚自己要反驳我这个人?还是我代表的符号?还是因为我这个符号刺激到了他内心对自己的厌恶?

观点,特定个体,符号,是三件事情,但是人们很容易混为一谈。那对于被讨厌的人,弄清楚对方到底在讨厌什么,也可以避免对内攻击和过分在意他人眼光。

当然,也想提醒大家,人称代词敏感其实是很好的表象伪装,它可以一棒子打死一个人以及他的观点,但对方是不是真的想要用「我们」代表你,你自己也得换个角度思考——是不是自己想太多了。

作为创作者,你能分清写作、创作和工作吗?

2024年12月9日 14:00

这段时间,收到了一位朋友给博客发来的私信,因为评论区引发了他的继续思考。于是,我们聊起了“写作”的内核是什么。

我觉得不存在不想被人阅读的文学作品。不管我怎么辩驳我写作是为了自己,也无法自我欺骗说不想被别人看见。不想被看见的理由,我本可以列出来很多,但我觉得核心原因还是害怕被评价,害怕被读者影响。如果我知道有人在看,我会情不禁地想写些别人想看的内容,而不是自己真正想写的内容。我担心我的作品会难免媚俗。当然我也害怕被批评,怕我的孤芳自赏被打破。但如果没有评价,没有批判,我就永远不会有所进步,永远地孤芳自赏。我心底也不想这样。


我也曾经历过这个时期,我找到一个精准的形容词——“自我驯化”。写作是自我驯化的过程,从一开始的“为自己写”,到渐渐失去对内的动力,便开始寻求“被人看见”。但看见后的反馈并不都是好的,所以我们又会缩回到“为自己写”的硬壳里。这个过程就是“自我驯化”:既想要保证写作的纯粹性,又想被人看见,也害怕被人看见。直到一些人在这个过程中放弃了通过“写作”的方式完成自我认同和他人关注——这也是很多人无法坚持写作的原因。

我跟很多搞创作的人聊起过,是不是都有这样一个时期,创作者会坚守“为自己写”的原则——对,在那个没有办法获得任何、互动和讨论的时期,这是最好的说辞,能够让自己坚持下去。我不反对“为自己写”,因为这是创作者的必经过程。只是这个时期何时结束,因人而异,更关键的是人们是否能够意识到自己正在贪图“为自己写”的硬壳保护。

当然,我们不能在这里讨论作品的“价值”。每个人在为自己创作时,作品都是无价的,因为那是属于个人经历、思考和人格的集合。所以当时博客志对于博客“价值”讨论时,引发了博客主们的争论——

相反,你洋洋洒洒写一通美文,说得尽是些神神叨叨自怨自艾的个人情绪,除了你妈爱看以外,对别人没多少价值。你想开个博客靠抒发个人情感而不为别人的生活增值,却盘算着博客能有前途,这是无知,自以为是的痴人说梦。

《个人博客内容的价值》——博客志

这段话并没有错,只是因为他追加了“被人看见”的条件,所以才有了讨论“价值”的必要。这段话当然会惹怒“为自己写”的创作者们,因为他人的价值标准并不能覆盖作品本身的心血和思考。

这里,也不能排除另一种博客创造的逻辑——为了获得流量,一些创作者希望通过大量关键词、文章基数来获得博客的检索流量,比如如何下载信用卡消费记录都可以水好几篇文章。我其实非常建议他们采用AI创作的方式,让博客获得更多、更容易理解的流量。这时,反而要考虑的不是内容,而是如何吸引更多的人。


以上,就是今天要聊到的三件事:写作、创作、和工作。(也是我在回复私信时的内容)

写作:更多是我们自己与自己的对话,这种写作是自私的、封闭的,却是非常好的自观过程。但是对应的“感-知-应”,是切断了应这件事情的(甚至有的时候还切断了知,只是以为地发泄情绪),因为我们不太希望自己这种比较私人的作品会被他人审视和评价,所以我们会主动切断他人“回应”这件事。因为个人写作更像是为自己贴上某个人格标签;

创作:首先需要我们创造“价值”。比如你的文章实际帮助到别人、让别人产生了共鸣思考、甚至是因为你的观点改变了被人的行为。创作是比写作更看重他人“回应”这件事,他需要我们动用更多的感受和知识,而不是简单地传递“我做了什么”,而是“我为什么会这样做”。所以,当进入到创作的领域,我们就必须要考虑“观众”,要时刻从第三人视角观察自己是否在自嗨、是否能与观众建立连接、务必压制我们想要装逼的冲动变得更加的亲近、能否通过我们的能力将一个复杂的定义构成的知识点,变成普通用户也能看懂的内容等等。另外,在进入到创作阶段时,我们会因为外界的回应开始变得更加的谦卑、反向输入知识、突破创作的“滞后性”主动和他人建立连接;

工作(我另称为“量产”):工作的目的性更强,我是为了获得流量、赚取广告收入、提高点击率。那这个时候,我们需要考虑的是如何让文字能够更吸引人地被人点开、阅读、互动。这个时候我们不可能在追求“内观”这件事。创作是需要“时间沉淀”的,因为我们希望将更好的内容呈现给别人。但是工作不是,它需要更快更高效,甚至可以利用AI自动生成文字。那我们作为创作者进行思考的环节就会变弱,但却是变现的手段;


“你害怕被批评,害怕孤芳自赏被打破”,很有可能是因为你还在“写作”阶段,但你内心其实又是渴望被看见的(这是对“回应”的追求)。

也就是说,你需要跳出的第一个圈层,就是从“写作圈”进入到“创作圈”。创作圈依然可以为自己而写,依然不用考虑任何形式的作品,但同时你也要做好被人审视被人赞美或批评的准备,我们不可能做到尽善尽美,也不可能被所有人喜欢。但是在100个人里,有1个人作为你的“应”,你就可以得到一个“感-知-应”带来的成就感。然而,我刚才也说了,创作是需要时间沉淀的,它确实是一个经典路径,但也是很辛苦、孤独的路径。我们只能不断创作,从1个人给与回应,到10个人给予回应,这就是一个不小的进步。

赞美也好、咒骂也罢,是因为你的“作品”足够有力量,才会让他们鼓掌欢呼和咬牙切齿。

而如何“写作”进入到“创作”,唯一的路径即是——独立思考。

Follow、或许是博客创作者的暂时解药

2024年12月2日 08:00

原标题是“独立博客创作者的暂时解药”,讨论“独立博客”是个浩大的工程,它是个标准无法统一的、令人不悦的、观点纠缠的话题。它的定义可以先留在这里,就单单从博客创作者来讨论这件事,在今天的话题里,或许又能在过程中找到“独立博客创作者”的定义。

我想从另一个视角来聊聊火了一阵的信息流整合订阅平台Follow。


Follow是治疗信息焦虑的良药吗?

每个人都有自己使用Follow的方法,在这里就不赘述。我跟@杜郎俊赏一样,一开始是希望利用这个软件整合不同平台的信息源,从而解决“红点”带来的信息焦虑感。但事实上,信息订阅软件并不会因为订阅的方式和流程变化,从而缩减或取代人在阅读时所需要付出的时间和思考。

或许一直害怕被主流社会淘汰,这只是下意识的抵抗。但最终不得不承认,这个时代的信息过载越来越严重,即便我主动追寻都赶不上最新业态了,我的精力也跟不上。接受这种必然之后,心态平和了一些,但留下信息焦虑的病根治不好了。

——《Follow 治不好我的信息焦虑》|杜郎俊赏

目前,Follow已经接入了简单的AI功能,无论多长的文章,都可以提炼成简单易读的一段话。我不知道有多少人是依赖这个功能的,用这种方式最快地读“完”他人的文章。我个人对AI的依赖程度不大,AI总结或许是一个不错的“导读”,但阅读全文我是为了理解创作者的内在逻辑和观点的推演过程。

我相信未来AI接入会更加的彻底和丝滑,甚至可以通过“重构”的方式将创作者的内容完全拆解,压缩内容、精简逻辑、拆除个人情感。那时候,会不会完全变成一个充满恐怖谷效应的AI加工品?


AI是否是创作者的毒药?

这是一节题外话,接续上面的话题。我相信未来AI的功能会更加强大,并形成“创作者-AI-读者”的关系。AI或许可以为读者提供越来越多的便利,但如果读者完全依赖AI的功能时,那还需要“创作者”吗?

前段时间,大量的创作者从X平台逃离。是因为新版X服务条款提到,平台打算把用户的文字、图像、视频用来训练AI,而且会出售给第三方合作伙伴。其中并未提到退出机制,换句话说,在11月条款正式生效后,用户在X里发布的内容都将成为训练AI的素材。

如果AI将创作者的内容作为“血液”不停榨取,这或许是对创作者的一种不尊重。特别是当读者完全依赖AI,就算创作者统统离开,AI因为收集了足够的作品,是否也可以创造出读者已经习惯阅读的作品?

单从「写作场景」来看,这种“普遍认知”会持续分化“能写作的人”和“完全依赖 AI 的人”。这种分化不仅关乎写作技能,更关乎思考模式、思维能力、逻辑能力、认知能力、组织结构能力批判思维能力等等,甚至包括底层/本质的学习力和竞争力。

——废话集 ℠

中文博客圈的无可救药

我在《无聊的中文博客圈》提到一个点——博客因为严重的滞后性,从创作发布、到被人看见、再到引发共鸣互动,因为观点的互动,本身会受限于“沉默螺旋”。最近我找到一个非常精准的名词来形容中文博客圈——递归岛屿

图片由ChatGPT生成

中文博客圈首先就是一个巨大的孤岛,过时的载体、技术开发门槛及成本过高、备案后的“自我审查机制”、非即时性地信息呈现、普通阅读者获取路径复杂等;孤岛的内部是另一个海域里再分布着的不同孤岛,这些孤岛正是我们这些所谓的“独立博客”。有把域名当做宝的、有三天两头就捣鼓模板的、有不停创作孤芳自赏的、也有很长时间失联的……大部分时间,都是孤岛之间的自娱自乐,久而久之的抱团,互动的人群、模式、甚至是评论内容都变得公式化。

递归岛屿的内部孤岛之间翻起再大的浪花,也只能在这个孤岛内部的海域里无人问津。而中文博客圈孤岛以外的海域发生着朝代更迭的战争,个体的独立博客又还在自娱自乐。但是战火迟早会延烧到孤岛,但那个时候为时已晚——博客时代最终的结束,一定是当递归岛屿内部的所有所谓创作者都在玩一样的自问自答游戏、发出一样的声音、群体吞并群体、乌合之众猎巫独立个体的那一天。

这样看起来,中文博客圈真的无可救药了。


概念式春药只管勃起不管活好

最近有一个特别的现象。当我的博客开始在Follow上作为一个信息源出现后,它在短时间内得到的关注度、阅读总量已经接近博客的三年运营。在递归岛屿的中文博客圈,独立博客很难做到真正的“被看见”或者说是“引发共鸣地被看见”。

因为Follow的曝光,越来越多人关注到内容本身,甚至会有人透过文章预留的Telegram参与互动,或是跟我直接就文章的观点进行交流和讨论。Follow是通过RSS抓取博客的的文章发布,并不会就博客关于里的生平小作文、设计风格、创作概念进行抓取,独立博客的“内容”回归到了本位。

概念,是一个非常抽象、私人的存在。特别是当作品未完成、完成度有困难、无法坚持完成、甚至作品根本不存在时,概念就成了暂时的春药——不停地向人阐述自己将会创造多么牛逼的作品、能够给社会带来多大的启示、能够引发众人多深的思考——但是作品呢?“还没写出来呢,你先看看这个概念,看看这设计风格,多牛逼啊!”

没有“创作内容”,自然就不会被抓取,不被抓取就不会被看见,也不会点进原本的博客里看到那牛逼的“概念”。


Follow或许是博客创作者的暂时解药

既然Follow抓取的是博客的内容,且是按照时间线抓取的内容。博客内容发布即成,变成了期刊的概念,这是信息流遵循的规则。于是在这个规则之中,也能直观地看到博客本身的创作频率;回归内容后,读者可以免于博客设计元素的打扰,看到博客本身的创作质量。

我之所以提到了“暂时”这个词,也是保留了对AI的态度——如果真的形成了“创作者-AI-读者”的结构,创作者会不会因为AI的吸血而再一次出现孤岛化的情况。另外,我在《中文博客圈的“鸩酒”与止不了的“渴”》里也提到,创作者对AI的依赖,也是一个不能忽视的问题。

Follow的用户群远超过原本中文博客圈的量级,确实可以让独立博客暂时脱离递归岛屿的困境,但Follow能够走多远,会不会也因为无法真正解决信息焦虑,很快沦为“概念”。另外,Follow依赖的并不是社交属性,所以无法让读者和创作者形成互动。互动缺失本身也是孤岛化的构成要件之一,但如果通过订阅可以引发思考,进而引导至互动空间,这又是博客功能对Follow功能的弥补。

当然,也可以通过利用RSS只抓取摘要的方式,避免Follow可以显示全文,使得用户需要进入博客阅读完全文。但用户是否愿意跳出APP,特别是手机端的Follow上线后,这是需要另说的事情了。

但这一切都是“暂时”的,核心不是平台本身,而是创作者本身是否真的能够坚持创作、坚持高质量创作。当独立博客的内容被丢入全面的信息海洋时——那些自娱自乐的部分,就必然要接受更多受众的审视和裁判。


那独立博客到底是什么?

在中文博客圈的递归岛屿里,孤岛之间可以按照占领的时间、岛屿大小、抱团的程度来选出“最有话语权”的“主岛”。或许在孤岛内,还会有见面三分情、大佬要面子的规则。一旦信息完全公开至孤岛以外的平台,就必然要接受来自他人“价值标准”的认定。

问题就立马从“我为什么要创作博客”变成了“我为什么要订阅你的博客”。这和创作者的创作初衷并不矛盾,而是来自外界的价值认定我们既不能统一标准、也不能让别人闭嘴。除非我选择关闭博客的RSS抓取、拒绝自己写给自己的作品被投放至公共领域。Follow的信息可没有“先来后到”一说,用户完全是根据自己的喜好订阅信息源,不是靠你我形成几个创作联盟就可以垄断,将他人拒之门外的。

举个话糙理不糙的例子。一百个人都在写日记,用户就算订阅了全部日记,也会挑选有趣的查看——对一些人而言,“性爱日记”当然要比那些“吃喝拉撒日记”更吸引人眼球。如何从这一百个人里脱颖而出,不仅仅是标题党这么简单,Follow回归“内容”,那内容就变成了当下的直接评判标准。

每个人对独立博客的定义不同,但“内容”又是大家无论如何都无法绕过的核心,否则大家只需要批量生产概念即可。这个话题可以留在以后细聊。如果你有任何想要分享的观点,欢迎透过莫比乌斯频道或博客内联系方式进行互动。

没有回应即是绝境

2024年11月29日 11:00

前几天,朋友@三十海河 的博客来了一个nogay的骚扰。按道理来说,遇到这种人,无视就是最好的方法。但无视本身又正中了“自证陷阱”的圈套,所以才发生了图文里的手段:我最后一次回应你,然后我再无视你。

为什么?因为自证的圈套丢回给了对方。所谓的人言可畏,正是当你意识到自己也被打上了一个最害怕最想要洗脱罪名的标签时,没人在乎你的扑腾和自证。其实这些方法论我都在过去的博客里提到过。


我是个“较真”的人,较真的核心不是要求对方赞同我的观点、更不是讨论对与错。而是较真“为什么”,因为“合理推测”在这件事件里很难得到证实,所以才需要摒弃情绪、回归事实、询问本心地确定这件事的内核。

举个例子,我小学时,从一棵树的配角,演到了英语话剧的主角,要去参加市里的演出时。学校校乐队的家长之间有了一个传闻:我是因为行贿了校领导才拿到这个角色的(要知道那个时候,这种代表学校参与市级表演是可以加分的)。他们笃定我有行贿的原因,一是我不属于校乐队的学员,这种文娱活动明明应该优先安排有“天赋”的学生(事实上是因为我家庭条件一般,无法学习乐器);二是我在学校不算是好学生。

这个传闻有鼻子有眼地传得越来越严重,家长告诉家长,家长告诉学生,于是学生之间也开始有了拉党结派地霸凌。就算组织演出的老师出面解释,他们因为笃定了“真相”,我接下来做的任何事情都会被怀疑,比如我代表学校去参加建筑模型的比赛(也是可以加分的)也是行贿来的资格。我改变不了“既定事实”,哪怕这个事实非常离谱,而且无论我怎么回应,都只能掉落他们的自证陷阱,是因为确有其事才会急于解释。

中国人向来喜欢造神,因为从造神到把神像推下神坛的过程能体现出他们超于个人、规则、甚至是社会的权力。所以他们最期待的,是我在参与表演的最后一刻被替换下来。可惜没有,我依旧参与了表演,也在最后升学考试算上总分和微不足道的加分,我考了全校第二。没有回应即是绝境,这些家长的笃定在最一刻都没有得到他们想要的任何回应。

当然,这个时候又有人会站出来说“你是因为小时候被这样伤害过,才会如何敏感”——较真的方法是“还原真相”,且是在摒除情绪的情况下还原真相。还原真相或许在你看来没有意义,都不如观点之战谁胜谁负之后掌握真理。但如果没有真相,所谓的“独立思考”或许是贪恋自己在乌合之众中被人捧赞的地位——别忘了,捧赞的同时,也有捧杀一说。


为什么要回应?

回应是人际关系建立最初的一步,也是最基础的一步。为什么一些人会在乎他人在自己博客的互动,一旦对方停止了互动,就会立马下架对方的友情链接。反之,一些人把回应他人施压于己,觉得无论什么互动都需要回应,否则自己会显露出冷漠的形象,导致未来的互动频率下降。无论哪一种,回应都是至关重要的。

另一个例子,是所谓的七年之痒,正是因为夫妻之间的互动变少、回应变少。妻子换了一个新发型,对丈夫而言根本无法发现;丈夫因为职场受到了不公对待,回到家本想找妻子抱怨,结果妻子总是用“我上班压力也很大”切断了所有的回应。如果两个人失去了交流,那交流的需求就必然投向外界,沉迷网络、或是沉迷他人充满情绪价值的怀抱。

什么是无效回应?

除了最开始提到的那个nogay,他在暗处虽然有回应,但回应方式跟那群家长一样,一直采用“切断”和“妄断结论”的方式笃定他的判断。

另一些无效回应,是“我自觉我回应了”和“你应该知道我想表达什么”。这就是所谓的黑箱人们会本能地远离黑箱,是因为黑箱会榨取他人的关注、情绪、精力。特别是男性,他们会在面对黑箱时优先采取“逃走”的模式,因为他们知道自己跟情绪上头的另一半交流时会多说多错。避免无效回应最好的办法,就是把话说破,甚至是在见证的情况下彼此回应,在他人的见证下,人们会自己判断谁处于“情绪失控”,从而让两个人的对话回到理性上来。

你可以无视他人的回应,却不能剥夺他人的表达

其实到这一小节要去解决的问题应该“为什么要较真”,但或许很多人觉得“得饶人处且饶人”,把不回应就当成了息事宁人的手段之一。

但是在这里,我们首先需要拆分两个概念——“表达权力”和“回应权力”。每个人都拥有“表达权力”,除非被割剜舌头、打断手掌,因此我们无法剥夺他人的“表达权力”。但“回应权力”是你作为回应的发出者可以选择拒绝提供的。注意这个差别:我可以无视你的回应,但不代表我同时剥夺了你的表达权力;我拥有表达的权力,我可以说我任何想说的,但我的表达并不是在回应你。

因此,任何人不能因为单方面切断他人回应,而阻断别人的表达权力——这叫坏。同样,也不能因为人随意地表达,却老觉得这是在会回应自己、甚至是羞辱自己——这叫蠢。


最近我有意识故意地“回应”躲在暗处的朋友,希望能够摒除情绪和刻板偏见来一起聊聊创作者的事情,结果他虽然关注着我,却还是只喜欢在暗处评价他人。如果你很好奇是不是你,可以前往我的莫比乌斯频道看看这场“社会实验”的前因后果。

油漆未干是事实还是观点?

2024年11月26日 11:00

之前在Instagram上刷到过一个视频,显然是从简体中文的短视频平台出来的,被翻译成了英文反向输送了文化。视频内容,是一个妈妈跟自己的女儿互动,在一问一答地呈现“事实”和“观点”的区别。

“你手里拿的是苹果”这是事实,“我不喜欢吃苹果。”这是观点。“妈妈手中拿的是香蕉。”这是事实,“妈妈手中的香蕉比你的苹果更好吃。”这是观点。事实是观点的基础,我们需要证伪脱离事实的观点;事实是客观存在的,观点是主观存在的。因此我们不能用(主观)观点去覆盖(客观)事实——“如果其他小朋友觉得你不漂亮,这不代表是事实。”

说实话,这个视频不是给“小朋友”看的,它值得面向全人类。

不得不说,现在还有很多成年人都无法区分“事实”和“观点”,还会用自己所坚持的“观点”去覆盖他人的“观点”、甚至是客观“事实”。之所以会发生这样的覆盖行为,今天的文章需要掉一下书袋子。


美国心理学家埃利斯提出的情绪ABC理论,认为激发事件A(activating event)只是引发情绪和行为后果C(Consequence)的间接原因,而引起C的直接原因则是个体对激发事件A的认知和评价而产生的信念B(Belief)。

节选自《认知束缚》——全部内容我之后会发布在莫比乌斯的Telegram频道

举个例子,一个人走在人行道上,这时马路上来了一个对向行驶的汽车(事件A)。看上去这是一个极其正常的画面,但是这个行人突然做出了一个夸张的行为——他背对着汽车疯狂逃走(后果C),为什么?我们作为一个第三视角,看到的全都是“事实”,汽车行驶、行人逃走,这时我们可能会加入一个“观点”:是这辆车想要撞这个行人。

但是这个“观点”并不代表事实,因为这辆车还在正常行驶,只是那个路人发了疯地逃走。如果我们弄清楚这个路人对这辆对向而驰的汽车有什么特定的认知(信念B)——因为这个路人觉得这辆车要撞向自己,所以作出了逃跑的行为。那这个路人认为汽车要撞向自己是“事实”吗?显然不是,但如果事情没有结束,我们都很难说这辆车是不是要撞人。


在这个举例里,从路人的角度来看:对向而驰的汽车是“事实”,他认为车要撞自己是“观点”,然后发生了他逃走、但车其实没有撞向他的“事实”。于是,从第三方的角度来看:人们就会用前后的“事实”去评价当事人的“观点”是错误的——“你是不是有被害妄想症?人家压根不是来撞你的!”而认为车要撞自己的人,则坚持自己的“观点”——“要不是因为我逃走了,他一定撞上我了!”就算“事实”不是如此,他仍坚持自己的“观点”。这时有人提出了理性思考,分析事实的角度,但因为自己的“观点”没有得到肯定,他跳脚说大家都在否定自己。

这件事情很绕,但几乎涵盖了如今互联网上、甚至前段时间因为《无聊的中文博客圈》掀起的“我不需要你认同我”讨论的底层逻辑——人们在观点之争几乎都是因为想要争论这个“观点”的对与错。观点并不是非黑即白的存在,但一些人为了证明自己的观点是“正确的”,才会如此在意对不同观点进行讨伐。这件事,在乌合之众的群体行为之中更加明显,他们试图通过挞伐一切与其观点违背、否定、甚至是不同的观点,来证明群体意志优越于个人、或其他群体的意志,从而获得更强烈的集体-个体荣誉感。


要解决这件事并不难,回到“事实”层面重新讨论即可。但问题在于,很多“事实”早就被相互争论的“观点”给覆盖了,甚至不允许讨论“事实”,因为谁赢了,谁就可以用他们的“观点”覆盖“事实”。

或许有人会说,事实讨不讨论就在那里,讨论“观点”才有意义。然而正是因为脱离事实去讨论观点,很容易发生最开始的那个母女的对话:“其他小朋友觉得你不漂亮。”支持这个观点的人,还真会当成事实去攻击别人。

回到标题,那“油漆未干”是“观点”还是“事实”?

别忘了,在“事实”和“观点”以外,还有一个被人们忽视的模块,叫做“实践”——你他妈摸一下不就知道了?

主角在死前的高光时刻

2024年11月25日 10:00

10月25日,沙白接受了安乐死。我特地时隔一个月再来聊这件事,是因为我想确定这是不是又是一场作秀。这没有不尊重死者,而是想聊聊她死亡背后的所谓“意义感”。

10月28日,我在朋友圈做出了这样的思考,是些不高举“死者为大”旗帜、“大逆不道”的言论。

2024年10月28日朋友圈

时隔几天后,我再次发出疑问:她到底“死透了”吗?依旧不是不尊重死者,而是我渐渐意识到她的死并不重要,而是她给大家提供了一种极不负责的“解决方案”。

11月2日“莫比乌斯”Telegram频道

我曾在《自杀也是一种会被传染的「癔症」》提到过,在同质性的团体当中,同质性的人群之间更容易产生的是情绪叠加和「乌合之众的失智」,当然群体完成放弃思考听从「领袖意见」的时候,自杀团体的危害性可能会超出我们的想象。

也就是说,当有人本身有“活不下去”的念头时,沙白提供了一种“解决方案”,既可以让死亡变得有意义,还可以利用死亡获得被全民关注的机会,那这种死岂不是一件“很爽”的事情?我们能有多少机会是可以被万众瞩目地关注,还可以被人们用特别的方式记住。而这种存在性与死亡本身是对抗的,死亡意味着结束和消亡,当不再被记得,就会经历真正的“终极死亡”。而沙白被人记住了,甚至是以一种非常有“意义”的、“浪漫主义”的方式呈现。

而意志力薄弱、或是正在非理性寻求存在性的人,或许就会因为这样的“意义”和“浪漫主义”所煽动,进而也选择用自杀的方式引起一时轰动、控诉罪人、指控真相、甚至是自证清白。

死,在中国人的概念里是厚重的、沉甸的,但凡涉及到死,一是要找到一个为之负责的“罪人”,二是要构建一个“可惜”或是“该死”的结局,三则要指向一种社会层面的“意义”。举个例子,胖猫跳江自杀,正是因为公之于众,则需要这三个构成要件,让他的死变得“死得其所”,从而带来更多可以引发讨论的意义。

当这三个构成要件全都满足时,一个完整的主角形象将会出现在公众眼中,他带着使命来,又带着意义走,剩下的就要交给这些揣度死亡真相的人,去控诉罪人、去心有戚戚焉或是墙倒众人推、去赋予一种社会层面才有的意义——这是性别对立、或是原生家庭的无止境伤害、亦或是这个社会不公不允……

只不过主角已经死去,他不会说话,也无法修改结局。

读《莫比乌斯先生和他的读者》后的谢罪书

2024年11月22日 21:34

看到来了这么多流量和观点的互动,我就知道我大概是又炸了坑了。

这个时候就收到了一些观点,比如认为我其心可诛地批判了既可以是自我表达(写给自己),和观点交流(给他人看)的博客。认为我当初创作的《写博客是为了自己就别他妈发表出来啊》,是在扯淡,认为我在对这一类博客主赶尽杀绝。

我在文章里提到了“如果写给自己的,干嘛还要公开发布呢?”这个问题,是为了让创作者思考一个切实的问题——自己的作品到底希不希望被他人看见?

当你承认“写博客”就是为了“得到关注之后”,自然也会反向敦促自己是不是不应该写那些自话自说的“日记”,因为人们包括我自己,最关注的始终是自己,才会因为找到了臭味相投的人、或是引起共鸣的事而产生链接。如果“写博客是为了自己”卡在那里,就会变成一股拧巴的能量,一方面因为得不到关注而自我安慰,但另一方面又因为自我安慰带来不了实际的成就感而自我攻击……

我并不是说所有写博客的人都是为了得到他人关注,但是公开发布作品的人,有必要问清楚自己这个切实的问题——自己是不是希望得到关注。我相信,人类作为社会动物,都是需要被看见的,否则他的存在性会完全丧失,自观是一个路径,他观也是一个路径,这两种没有对与错,只是看个人取舍。自观是难得的自省,但也容易孤芳自赏、闭门造车;他观能够看到更多不为人知的自己,但也容易过度在乎他人目光而活得疲惫。而人们拧巴的点就在于明明希望被看见,却又逢人便说自己不在乎他人眼光。当然啦,这种拧巴当然也没有对错,也是一种选择,成年人应该为自己的选择承担其“代价”。

如果真要承认个罪行,那就是“标题党罪”?这我认,毕竟大家都希望做好人,那我就做做坏人来讨论些大家容易拧巴,却又不愿意直面的真相。

我认为这种观点的互动有必要的,因为凡真实的,必会相遇。


补充一下:所谓的“互为借口”

“我其实内心希望被看见”和“我是为了写给我自己”,这两者并不是非黑即白的存在,它们在某些特定条件下是共生的。比如,我既希望“被看见”,但是又强调我是“写给自己”。但是既要又要的结果就是“互为借口”。

当我希望被看见的时候,一旦效果不好无人关注、收不到我希望的正面评价,我就会逃到“写给自己”这个领域,以它作为借口,开始闭门造成固步自封;而当我开始“写给自己”的时候,其实内心又无时无刻在想想它被看见时,能给别人带来的印象,于是我又逃到了“希望被看见”,以它作为借口,开始泯灭真实献媚虚荣;

互为借口的结果,就是反复横跳,到最后什么都得不到。每过一段时间,删掉所有的创作或是重建博客,决定为自己活;然后过一段时间发现无人问津又删了所有创作或是重购域名,决定找回自我——那最后什么也留不下。当然,我举例的是戏剧化的例子,并不是指每个人都这样。

无聊的中文博客圈

2024年11月22日 10:42

有的时候,从局外人的视角看局内,会更有趣。

最近一朋友得知我“还”在写博客后,询问我现在的中文博客都是哪些人在创作,又都在写些什么。说实话,我并没有关注和研究过,我收集的博客本身也是从别人的“友情链接”网里,发现的有趣的、我能看懂的(技术以外的内容)、和能够引起共鸣的博客。所以我收集的样本并不能完全代表中文博客的现状。

最后我把几个博客集合网站丢给了对方,这或许能够代表大部分写博客的人在做什么。过了好几天,他真的认认真真过看完了每个集合网站首页抓取的文章,然后给我留下了一句话:

挺无聊的。

这句话很“冒犯”,因为他是个“局外人”,并不能理解我们在“自嗨”什么。当然,“自嗨”这个词听上去也挺讽刺和贬义的——没错,就是在讽刺。听到这个结论,我试图“反击”——“你既然觉得无聊,总要说服我为什么无聊吧。”

我花了三天时间,看了你给我的网站首页的每一篇文章,除了技术就是日记,不是说它们不能做成博客,而是这些功能早就有了更多流量聚集的平台,为什么还要单独做成独立博客呢?

这应该不是冒犯了,而是“膈应”吧。听到这话我有点着急,必须为自己辩白——“不是我不想去些公众号、豆瓣,而是我发布的内容常常因为敏感词而被封禁,我没办法做到自我审查,但是我又想要写,我总得有个平台吧。”

你有想过吗,或许写博客是一种逃避行为,逃避流量对作品的审视?如果同样的内容发布在小红书,你会在乎没人看吗?

别骂了,别骂了。其实我考虑过这个问题,写博客有严重的“滞后性”,特别是非技术、非日志类博客,它跟别人的互动是完全切断的。从创作发布、到被人看见、再到引发共鸣互动,因为是观点的互动,它本身会受限于“沉默螺旋”。即人们会更愿意在支持自己观点的内容下互动,如果无人互动,就算引起个体的共鸣也无法产生互动。


我现在创作的博客,其实也有这种“讨巧”的行为。因为它不是即时性的,所以我可以在发布文章后做到单方面的“爽”,而不去考虑流量和互动的问题。也正是如此,我会特别希望与互动者本身建立某种即时交流的机会,比如对于一些观点在Telegram上面进行讨论。

说实话,这个博客也是因为坚持创作到了第三年,才开始陆陆续续被人发掘。虽然每天能够保持几百上千的流量,但是互动仍然是“滞后的”,极少会遇到@三十里海河 这种跟我沆瀣一气的家伙,会主动找我聊起原生家庭的事情。

另一个关键,是因为独立博客的“人设”功能,迫使它需要按照某种“姿态”去表达自我。哪怕是对现实的抱怨,也因为有了一层对外展示的需求,而自然而然地附着上了“表演的意图”,目的是为了获得肯定、赞美、关注这些站在聚光灯下才能得到的东西——我当然也有表演的意图。大部分时候我在现实比博客上的“人设”更嘴毒,总喜欢拆解底层逻辑。但是在建立社交关系之中,这种人设又会慢慢褪去变得无下限的有趣(但是还是很少会提供情绪价值)。起初,我可能还会考虑自己的哪句话会不会惹到别人,这么三年过去了,我发现与其去新建一个“人设”努力地维系他的表演性,不如就让把博客当做是我现实折射的一部分——所以,就会说更多难听的话和真相,惹到更多人。

所以这种确实互动的交流,也会得到反噬的评价:

挺无聊的。


一直以来,我很想跟几个熟悉的博主,做一对一的社交关系,至少先脱去“博客”这个外衣,来聊些彼此对世界不同视角的看法。但因为博客的滞后性也会延展到现实层面,造成断层。比如,我们之间要产生共鸣,至少要彼此关注过对方的博客,如果对方并不喜欢我的观点,这岂不是就给对方造成了困扰;再比如,别人的博客本身就是保护壳,并不希望自己的真是内心被看见,如果我一味地入侵对方,那就太不礼貌了。

久而久之,这种无法进入下一个“社交领域”的交流,会越来越梳理和冷淡——比如我的博客在互动环节并不能给对方带来流量。于是,无聊诞生了——标题的“无聊”并不是指中文博客圈的内容,而是人们以为可以通过博客构建的社交,到最后也只能剩些鸡毛蒜皮的“无聊”。

如果可以,我打算做一期“递苹果”的游戏,把它交给几位熟悉的博主。

当人们在投毒时,在毒些什么?

2024年11月20日 21:42

连日来,广州各地陆续有网友在社交平台反映,自家宠物狗遭投毒身亡。一名位于广州荔湾区的犬主向中国新闻周刊介绍,她养的两只宠物犬于11月8日晚被毒害。据她了解,同一时间段内其遛狗区域至少有6只狗中毒。截至11月20日,广州超40只宠物狗疑似中毒死亡。

——中国新闻周刊

对宠物投毒的事件会让我特别关注,不仅仅是因为我养狗,也因为养狗之后催产素被提高后会莫名地担心,更重要的是这件事背后藏着太多“隐含信息”。于是,我才用了标题这样的句式:

当人们在“投毒”时,在“毒”些什么?这个“毒”可以更换成各种人身伤害事件。


为什么要毒狗?

中国大陆的刑法学里,认为犯罪由四个要素构成:犯罪主体、犯罪客体、犯罪主观和犯罪客观。公共场合投毒毒杀宠物、流浪动物的法律一直很模糊,特别是当投放的毒物并不属于违禁品、不会对人体造成人身伤害时,这种投毒行为并不会触发犯罪。宠物可以以“私人财产“”的方式得到保护,但流浪动物本身并无法受到现行法律法规的保护。

很有趣的是,如果你搜索“投毒毒狗”的词条,可以在各种新闻最下端的评论看到两极化的评论。有认为应尽快完善立法保护宠物的,也有认为宠物狗就应该被赶尽杀绝的。保护狗和虐杀狗一直是极端共生的事件,特别是当人们不需要为自己的言论负责时,一句“杀尽所有狗”确实满足了逞口舌之快。

一些讨厌狗的人,会有原本的历史原因导致的心理因素。这种害怕和恐惧是生理级别的,加之新闻对于狗伤人的报道,这种恐惧会因为信息偏差更加严重。

另一些讨厌狗的人,或许是后天因素造成的。比如宠物扰人、贫富差距、社会等级差距、尊严受损等等,狗变成一种符号激发了当事人的某种情绪反应,导致错误认知并引发了对应的行为。

狗作为一个“弱势”符号,对它的虐杀既能“安全”地满足尊严感,又能充分地体现自己对生命凌驾的快感——只是因为这群人足够“懦弱”,所以才不得已选择这样的方式来满足他们卑微而易碎的尊严。同时,这一类人又是非常容易被煽动的,例如“养日本柴犬的人不爱国”,他们很有可能会拿起U型锁,砸向养柴犬的主人。

所以想要弄清楚“为什么”,需要弄清楚当事人对于“狗”是一种具体的恐惧,还是对于符号的厌恶。所以投毒本身,犯罪客体就变得复杂。


从犯罪者思维的角度来理解毒狗

代入一下,如果你是一个针对动物投毒者,你希望发生怎样的结果?当然是希望有宠物陆续死亡,这样才能体现犯罪者的“存在性”。为了造成更多的死亡案例,投毒的方式、投毒的区域就成了最重要的影响因素。

犯罪客体既然是“动物”,那么动物什么时候出没、以何种方式出没就是必须要研究透彻的。所有小区投毒、宠物狗聚集场所就是最好的投放区域。比如广州发生的群体性毒狗事件,投毒地点就是在宠物狗经常聚集的草坪上。

针对“狗”这个犯罪客体,投毒者需要观察狗的习性,才知道哪些路径是多数人遛狗所选择的;或是每晚大型犬的主人会固定在小区某个区域出没,导致大型犬吠叫扰民。这个时候,投毒的“主观”因为针对的是狗,他们会尽量避免和狗主人进行接触,因为犯罪在狗被毒死时就已经完成了。

但是针对“狗主人”这个犯罪客体,投毒者则是对个人乃至符号的理解,比如这个人常常出没什么地方。但这里有一个比较尴尬的点,一些富人所居住的高端小区本身有严格的门禁系统,这些因为仇富而想要虐杀富人宠物的人,压根儿连小区门都进不去。另一些比较特殊的情况,是在狗活动进行投毒的,犯罪者是针对一个群体符号进行投毒。

因此按道理来说,他们本身可能在任何地方投毒,特别是狗出没频繁的地点。这时我们需要引入另一个“规则”,来理解犯罪“成本”。


如何评估投毒的危险程度?

投毒事件并不算是“黑天鹅”,它本身因为有规律可循,所以可以通过以下几个要素来横纵评估危险程度。

  • 偶发性与频发性
    • 偶发性事件本身不具备“普遍性”,所以无须对此感到焦虑。偶发性事件有可能是宠物误食、农药中毒等非“主观故意”造成的;
    • 频发性事件需要分析所有的可能性,比如环境污染、持续地针对植物或昆虫的灭杀工作残留毒药,频发性事件一旦有人为干预,就可以得到阻断。例如饲主远离该区域,或是人为排除污染源,如无后续事件发生,则危险性较低;
  • 个体性与群体性
    • 跟偶发性类似,个体性事件需要分析宠物中毒的真正原因,否则无法倒果为因认定该区域发生了实际的投毒事件。针对个体性事件,需要对该区域进行持续观察,若偶发事件变为频发事件,则可以认定为是群体性事件;
    • 群体性事件最为严重,特别是在短时间内发生多起的,即群体性+偶发性事件,则可以认定为“投毒事件”。这类事件如果持续发生,则要重新评估该区域是否存在持续性的污染源;

所以,当发生一起“毒杀”事件时,并不用惊慌,饲主可以通过人为干预的方式,更换遛狗路径、或是为宠物佩戴嘴套的方式持续观察。一旦偶发事件造成了持续的群体性伤亡、或是变为频发事件,则需要考虑“投毒”的可能。


不要忽略投毒事件里的“干扰事件”

所谓的“干扰事件”,是导致上述的评级变得“严重”的,但是跟投毒毫无关系的事件。这类事件本身又是一种“人性游戏”。

一类干扰事件,是饲主意外或故意造成宠物伤亡后,为了降低负罪感,将个体偶发性事件伪装成“投毒”,将责任从自己转移到不存在的“第三方罪人”。当谎言说一千遍之后,他自己也会把这个谎言当真,觉得自己的狗就是被人投毒致死的。

另一类干扰事件,需要“绕一下脑子”。一个人因为恐惧自己的狗会被毒死,所以他先在小区投毒,造成了别人的宠物被毒死,从而觉得事件已经发生,自己的狗可以得到保护也可以免于被毒死的可能性。这件事看上去很“抽象”,其实它和赌徒们觉得“已经七轮没有出现过6了,那么下一轮一定会出现6”是一样的赌徒谬误。同时,这类人因为替代性防御机制,将对某一事件的恐惧通过制造或促成事件的发生转移到他人身上,以缓解自己的焦虑。

所以只要发生了自己最害怕的事件,那么事件就不会发生在自己身上。

这两类干扰事件一旦进入到数据之中,就会抬高投毒事件的严重性,从而造成更多人的恐惧和焦虑。


好了,现在你可以把“投毒”换成任何一个群体事件了,这样就更好理解这件事的底层逻辑

比如,把“投毒”换成“网暴”——当人们在网暴时,在网暴些什么?

我在STEEM区块链上办的银行业务之: SP租赁服务

2024年11月2日 06:29

rent-steem-power 我在STEEM区块链上办的银行业务之: SP租赁服务 STEEM 区块链 SteemIt 互联网 加密货币 区块链 程序员 被动收入 资讯

STEEM能量出租

我打算写几篇文章来分享这些年来我在STEEM区块链上的一些有趣玩法。我是在2016年8月20日首次注册STEEM账号 @justyy 的(至今已有8.2年),后来发现区块链真的很有趣,特别适合程序员,因为它开放、透明、强大并且充满自由。

我还有一个外号“行长”,这个称号源于我在STEEM上创建了第一个银行。最初,我的业务是收取存款并支付利息,后来逐渐扩展到了代币兑换服务等。存折腾,用爱发电,(扣掉每个月昂贵的服务器运维成本)基本不挣钱,就交个朋友.jpg

在2018年2月25日(至今6.7年)我成为了STEEM见证人/Witness,也就是出块打包的矿工。一路走来,从2020年3月18日左右开始进入全球前20名,并一直保持未掉出前20,甚至长期位居STEEM见证人排行榜的首位,目前排名第二。STEEM区块链采用的共识算法是DPOS,即 Delegated Proof of Stake / 委托权益证明算法。

steem-witness-table-2024-11-01-scaled 我在STEEM区块链上办的银行业务之: SP租赁服务 STEEM 区块链 SteemIt 互联网 加密货币 区块链 程序员 被动收入 资讯

STEEM区块链见证人排名表

今天我要分享的是今年8月1日左右我推出的一项服务。当时我在村里跑步,一边跑步一边构思。回家后,我当天加隔天写好了代码,测试完毕后上线。

SP租赁服务

在STEEM区块链上,有STEEM和SBD两种代币/Token,SBD(Steem Dollar)是锚定1美元的代币,而STEEM目前约值0.16美元。区块链上的代币主要用于激励,例如奖励矿工、点赞文章获得收益等。

STEEM可以锁定(Stake)成Steem Power(解锁需要4周)。锁定的能量越多,账号的权力越大,比如投票权和点赞能力。我的SP租赁服务的原理非常简单:用户先将利息(STEEM)转账到账号@rentsp,并在备注(MEMO)中注明租赁天数。程序会计算所需的SP并自动借给指定账号。查看当前的借款人

这是预付利息的形式,用户先支付利息,区块链上没有退款功能,资金到账后不可逆转。当SP代理(租出)后,借款人仅在取消代理前拥有使用权。等到期后,程序会自动收回SP代理。这遵循STEEM区块链的规则(代码即法律,Code is Law),因此不必担心用户卷款跑路。

用户A将SP借给用户B,用户B仅拥有SP的使用权。用户A可以随时收回借出的SP,完全不必担心资金的丢失。这就好比用户A把一只会下蛋的母鸡借给用户B,用户B在租借期间只能获取母鸡下的蛋,而用户A随时可以收回这只母鸡。

由于STEEM目前没有智能合约,理论上我是可以卷款跑路的,但不值得为了些许利息而影响长期信用。我在STEEM上活跃多年,各项指标如声誉(Reputation)、见证人排名和STEEM POWER(可直接借出的资金)等都较强。

上线三个月来,该服务累计使用49次,总共收取利息XXXX个STEEM。没多少,用爱发电/折腾。这算不上是被动收入,因为每隔几天才会有一单,好在不需要太多的维护。

steem-power-renting 我在STEEM区块链上办的银行业务之: SP租赁服务 STEEM 区块链 SteemIt 互联网 加密货币 区块链 程序员 被动收入 资讯

SP租赁服务记录

有兴趣的可以查看详情:STEEM区块链SP租赁服务

steem-power-renting-tool 我在STEEM区块链上办的银行业务之: SP租赁服务 STEEM 区块链 SteemIt 互联网 加密货币 区块链 程序员 被动收入 资讯

SP租赁服务估计

我在STEEM区块链上办的银行业务

whale-300x200 我在STEEM区块链上办的银行业务之: SP租赁服务 STEEM 区块链 SteemIt 互联网 加密货币 区块链 程序员 被动收入 资讯

Steem 坐火箭🚀!

本文一共 940 个汉字, 你数一下对不对.
我在STEEM区块链上办的银行业务之: SP租赁服务. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 我在STEEM区块链上办的银行业务之: SP租赁服务 STEEM 区块链 SteemIt 互联网 加密货币 区块链 程序员 被动收入 资讯
The post 我在STEEM区块链上办的银行业务之: SP租赁服务 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  2. LOGO 海龟作画 系列三 递归画一个国际象棋棋盘 今天我们要来讲一讲递归. 递归就是函数自己调用自己, 我们可以定义一个过程, 然后这只海龟不停的画, 结束的时候再调用自身再继续画. 再次调用的时候参数变化了, 至到参数满足一定的条件则停止. 比如 下面定义的这个过程可以用来画一个实现的正方形. TO FK :B IF :B>15 ;...
  3. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  4. 你给SteemIt中文微信群拖后腿了么? 这年头不缺算法, 就缺数据. 这两天花了很多时间在整API上, 整完之后自己用了一下还觉得真是挺方便的. 今天就突然想看一看自己是否给大家拖后腿了, 于是调用每日中文区微信群排行榜单的API, 刷刷拿着 NodeJs 练手: 1 2 3 4 5 6...
  5. STEEMIT 简易SP代理工具 当前, 加入STEEMIT CN区低保银行的一共有40个人, 一共代理给 @justyy 银行大约 6400 SP. 好处是每天能收利息 (14.6% 年化率) 并且能获得至少一次的双倍点赞. 代理的方式是通过 steemlogin.com 但是很多人都搞错,...
  6. SteemIt 高级定制微信文章列表 RSS/API/阅读器 v2.0 The Advanced Wechat Group Posts Feed/API/Reader v2.0 Abstract: I have added five parameters to the...
  7. 英国房子的EPC节能报告(Energe/Efficiency Performance Certificate) EPC (Energe/Efficiency Performance Certificate) 是英国房子的节能报告, 法律上规定, 每个房子都必须要有一个EPC报告, 报告的有效期为十年. 房东在把房子出租或者想卖房的时候, 这个EPC就必须有效, 在一些情况下 比如出租房子的时候, 这个EPC报告还必须符合一些最低标准, 比如房子必须满足 F档(类似及格线)...
  8. 有个兄弟姐妹是件很好的事情 越来越觉得两男孩子真心好. 好处有: 两孩子年纪相仿: 我家老大6个月的时候 媳妇一不小心意外怀孕了, 这才有了老二. 最开始两人一起带很累, 但是并快乐着, 现在两娃可以兴趣一样 可以玩到一起, 一起成长. 老大的衣服鞋子可以给老二穿哈, 不浪费. 玩具可以一起玩, 但是.....

监测服务器流量并进行限制脚本

2024年10月31日 16:48

当心服务器流量被刷,通过脚本实时监测,流量超过阀值进行限制,并按月归零。

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
#!/bin/bash
# Parameter order: LIMIT_GB, reset_day, CHECK_TYPE, INTERFACE
LIMIT_GB=${1:-1024}
reset_day=${2:-1}
CHECK_TYPE=${3:-4}
INTERFACE=${4:-$(ip route | grep default | awk '{print $5}')}
LIMIT=$(echo "$LIMIT_GB * 1024" | bc)
echo "流量限制:$LIMIT MiB"
echo "流量将在每月的第 $reset_day 天重置"
current_day=$(date +'%-d')
last_day_of_month=$(date -d "$(date +'%Y%m01') +1 month -1 day" +%d)
if [ "$current_day" -eq "$reset_day" ] || ([ "$reset_day" -gt "$last_day_of_month" ] && [ "$current_day"
-eq "$last_day_of_month" ]); then
if [ ! -f "/tmp/vnstat_reset" ]; then
touch /tmp/vnstat_reset
rm /var/lib/vnstat/*
sudo systemctl restart vnstat
echo "流量已经重置,下次重置将在下个月的第 $reset_day 天"
else
echo "今天已经进行过流量重置,无需再次重置"
fi
else
if [ -f "/tmp/vnstat_reset" ]; then
rm /tmp/vnstat_reset
fi
if [ "$current_day" -lt "$reset_day" ]; then
days_until_reset=$(($reset_day - $current_day))
echo "还有 $days_until_reset 天流量将会重置"
else
days_until_reset=$(( $last_day_of_month - $current_day + $reset_day ))
echo "还有 $days_until_reset 天流量将会重置"
fi
fi
if [ -z "$INTERFACE" ]; then
echo "错误:无法自动检测网络接口。请手动指定。"
exit 1
fi
echo "正在监控的网络接口:$INTERFACE"
DATA=$(vnstat -i $INTERFACE --oneline)
CURRENT_DATE=$(echo $DATA | cut -d ';' -f 8)
TRAFFIC_RX=$(echo $DATA | cut -d ';' -f 13 | tr -d ' ' | sed 's/MiB//;s/GiB/*1024/;s/KiB/\/1024/' | bc)
TRAFFIC_TX=$(echo $DATA | cut -d ';' -f 14 | tr -d ' ' | sed 's/MiB//;s/GiB/*1024/;s/KiB/\/1024/' | bc)
echo "当前月份:$CURRENT_DATE"
if [ "$CHECK_TYPE" = "1" ]; then
TRAFFIC_TO_CHECK=$TRAFFIC_TX
echo "只检查上传流量。当前上传流量为:$TRAFFIC_TX MiB。"
echo "当前对比项是:上传流量。"
elif [ "$CHECK_TYPE" = "2" ]; then
TRAFFIC_TO_CHECK=$TRAFFIC_RX
echo "只检查下载流量。当前下载流量为:$TRAFFIC_RX MiB。"
echo "当前对比项是:下载流量。"
elif [ "$CHECK_TYPE" = "3" ]; then
TRAFFIC_TO_CHECK=$(echo "$TRAFFIC_TX $TRAFFIC_RX" | awk '{print ($1>$2)?$1:$2}')
if [ "$TRAFFIC_TO_CHECK" = "$TRAFFIC_TX" ]; then
echo "当前上传流量为:$TRAFFIC_TX MiB,下载流量为:$TRAFFIC_RX MiB。"
echo "作为比较的流量是:上传流量。"
else
echo "当前上传流量为:$TRAFFIC_TX MiB,下载流量为:$TRAFFIC_RX MiB。"
echo "作为比较的流量是:下载流量。"
fi
elif [ "$CHECK_TYPE" = "4" ]; then
TRAFFIC_TO_CHECK=$(echo "$TRAFFIC_TX + $TRAFFIC_RX" | bc)
echo "检查上传和下载流量的总和。当前上传流量为:$TRAFFIC_TX MiB,下载流量为:$TRAFFIC_RX MiB。"
echo "作为比较的流量是:上传和下载流量的总和($TRAFFIC_TO_CHECK MiB)。"
else
echo "错误:未提供有效的流量检查参数。参数应为1(只检查上传流量)、2(只检查下载流量)、3(检查上传和下载流量中的最大值)
或4(检查上传和下载流量的总和)。"
exit 1
fi
if (( $(echo "$TRAFFIC_TO_CHECK > $LIMIT" | bc -l) )); then
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
echo "警告:流量已超出限制!除SSH(端口22)外,所有端口已被阻止。"
else
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
echo "流量在设定的限制内,所有流量都被允许。"
fi

此脚本用于监控Linux服务器上的网络流量(出流量和入流量),并根据设定的流量阀值来阻止除SSH(端口22)以外的所有网络流量(通过阻断端口实现)。

这个脚本需要iptables,bc 和 vnstat 这三个软件包。iptables 配置 Linux 内核防火墙的工具,bc(Binary Calculator)用于实现任意精度计算(往往是高精度计算),vnstat 是网络流量监控工具。

安装上述三个软件包,

1
2
sudo apt-get update
sudo apt-get install -y iptables bc vnstat

运行脚本前,给脚本添加执行权限,

1
chmod +x traffic_monitor.sh

运行脚本,

1
bash traffic_monitor.sh 19 1 3 eth0

脚本有四个参数可设定,第一个LIMIT_GB,每月流量阀值,单位GB,默认1024(上面我设定为19GB);第二个reset_day,即每月的哪一天流量会被重置。默认值为1,即每月的第一天;第三个CHECK_TYPE,流量检测类型,默认值为4。1表示只检测入流量,2表示只检测出流量,3表示取入流量和出流量中的较大值,4表示检测入和出流量的总和;第四个INTERFACE:网络接口(上例中为eth0)。

脚本运行结果,

1
2
3
4
5
6
7
8
流量限制:19456 MiB
流量将在每月的第 1 天重置
还有 1 天流量将会重置
正在监控的网络接口:eth0
当前月份:Oct '24
当前上传流量为:29.39 MiB,下载流量为:7.90 MiB。
作为比较的流量是:上传流量。
流量在设定的限制内,所有流量都被允许。

通过crontab设定定时任务,使脚本每五分钟运行一次(即每5分钟监测一次流量,可以按需设定频率),并将脚本的输出重定向到 /root/traffic-log.txt 文件,以便随时查看。

1
(crontab -l ; echo "*/5 * * * * /root/traffic_monitor.sh 19 1 3 eth0 > /root/trafficl-log.txt") | crontab -

给99元每年的阿里云经济型e实例开启IPv6访问享受大带宽免费流量

2024年10月17日 16:30

特价99元/年的阿里云经济型e实例,2核2G,硬件性能还是可以,唯有3 Mbps的带宽有点差强人意(当然用来跑跑小型的个人博客还是够用的)。偶然得知阿里云有推出一个名为云数据传输(CDT)的服务,即阿里云内需要公网访问的服务可以通过CDT统一计费,共享流量。目前适用于9款云产品按流量计费实例所产生的公网流量,包括:

  • 云服务器ECS
  • 弹性公网IP
  • 函数计算FC
  • 传统型负载均衡CLB
  • 共享带宽
  • IPv6公网带宽
  • Anycast EIP
  • 全球加速GA
  • 云原生API网关

这不是关键。关键是目前CDT提供200 GB/月的免费公网流量,其中全球地域(含中国内地):20 GB/月,非中国内地地域:180 GB/月。官方文档里全球地域,中国内地地域解释的有点不清晰,据网友的经验,简单的说就是你的阿里云服务器在境外(包括香港),每月有免费的200G流量,如果服务器是境内的,每月能免费用20G流量。

20G/月流量虽然算不上多,但带宽按量付费,可以自己设置最大带宽值,境外的服务器可以将最大带宽拉到1000M,境内最大能设置到100M。如此,如果能将上述3M固定带宽的经济型e实例接入CDT,然后将最大带宽提至100M,享受20G/月的免费流量,非常nice!

然而比较遗憾的是这个99元的阿里云经济型e实例,并不能转换为弹性公网IP。在公网带宽里,先更改带宽,改为按流量付费,然后就可以转换为弹性公网IP,共享免费的20G(200G)的CDT流量。至于如何自动监测,以免流量被刷,产生高额费用,可以参见这篇博文–监测服务器流量并进行限制脚本(2024.11.5)

好消息是支持CDT的九种产品中,除了弹性公网IP,还有IPv6公网带宽,这个经济型e实例是支持IPv6的,只是默认没有开启,需要我们自己手动开启。这里记录下如何给这个经济型e实例开启IPv6访问,接入CDT,然后在宝塔里绑定域名,支持IPv6访问,享受这境内高达100M的带宽,20G/月的免费流量。

开启CDT服务

阿里云控制台,开启CDT。很简单,鼠标点下。

将你需要的云服务升级到CDT计费,这里我要用IPv6。

给实例开启IPv6

添加IPv6公网地址

在实例管理里,网络与安全–>弹性网卡管理里,给实例添加IPv6地址。

然后给这个IPv6地址开通IPv6公网宽带,即IPv6网关

带宽按使用量计费,统一接入了CDT。(我记错了,国内带宽最大值也能拉到1000M。下面这个图片是已经开通了IPv6公网带宽,然后修改带宽的界面)

ECS实例配置IPv6

不同镜像支持IPv6的配置是不一样的,有些比较新的镜像自动就能支持IPv6,有些需要手动配置。同时阿里云也不是所有地域都能支持IPv6,详情可以参看阿里云的帮助文档:为ECS实例分配并配置IPv6地址实现IPv6通信

可以通过ip addr | grep inet6或者ifconfig | grep inet6命令,检查实例是否已开启IPv6服务。

我使用的镜像是CentOS 7.9.2009,需要自己配置以使支持IPv6。在/etc/sysconfig/network-scripts/ifcfg-eth0中添加以下配置,启用IPv6:

1
2
DHCPV6C=yes
IPV6INIT=yes

更详细的介绍可以参考上述官方帮助文档。

其他设置

剩下的就如同IPv4一样设置使用了。

  • 安全组里放行端口,IPv6下的 ICMP(ping端口),80,443端口等。跟IPv4一样再来一遍。
  • web服务,比如Nginx监听IPv6,类似IPv4,如下设置:
1
2
3
4
5
6
7
server
{
listen 80;
listen [::]:80;
listen 443 ssl http2;
listen [::]:443 ssl http2;

  • 如果是宝塔面板,在面板设置里,开启监听IPv6选项。
  • 域名解析到IPv6地址。

有问题可以参考此处 IPv6访问不通的排查方法排查。

测试

使用itdog 测试IPv6地址能否ping通。原理跟ping IPv4地址一样,走ICMP协议。

同样,可以加上80或者443端口,ping下,看是不是通的。

解析一个测试域名到IPv6地址,手边的电脑网络暂时不支持IPv6,但是手机使用的流量,广州联通是支持IPv6网络的。手机端访问下这个域名,正常。上传个码流很大的视频,播放很流畅,同时跑跑流量。

去CDT控制台查看确认下,流量消耗了,没有扣费。nice!

8位的QQ号找不回来了-只有QZONE还可以访问

2024年9月29日 01:50

我拥有一个8位数的腾讯QQ号,可能是从2002/2003年开始使用的。那时候还没有微信,记得初中时还申请过一个QQ号,但后来忘记了密码,最终也丢失了。这个QQ号(20328681)一直陪伴我,直到两年前车库里的HPZ800电脑主板坏了。换了新电脑后,我再也无法登录了。

由于需要进行身份验证,我尝试过使用身份证等信息,但依然无法通过。申诉了多次都失败了。还试过用我姐姐的手机进行验证,邀请了两个好友辅助认证,但依旧没有成功。现在我也不知道这个号码会不会因为长期无法登录而被回收。

幸运的是,我还有一个可以登录的QQ号,并且这两个QQ号互为好友。通过这个途径,我仍然可以访问原QQ号的QQ空间,看到以前的照片和日志。只不过,这QQ空间已经成了只读模式,只能看不能修改。

我妻子的QQ号也早已忘记了密码,无法登录了。也许我们这一代人中的大多数,都亲历了QQ的普及,成为了国内第一代网民,也见证了微信的崛起。

我的即将逝去的QZONE空间,还有那些我的过去和回忆。

qzone-20328681 8位的QQ号找不回来了-只有QZONE还可以访问 互联网 照片 生活 资讯

QZONE的首页,微信朋友圈可以同步到QZONE,但是后来也失效了,估计得登陆重新确认。

qzone-pictures 8位的QQ号找不回来了-只有QZONE还可以访问 互联网 照片 生活 资讯

这些年上传到QZONE的照片备份

qzone-pictures2 8位的QQ号找不回来了-只有QZONE还可以访问 互联网 照片 生活 资讯

那些年的照片都上传了一份到QZONE备份,还好,因为上一次硬盘坏了还丢了一些照片

qzone-dairy 8位的QQ号找不回来了-只有QZONE还可以访问 互联网 照片 生活 资讯

在QZONE发表日志是当时写博客还抄一份到这里备份

qzone-dairy2 8位的QQ号找不回来了-只有QZONE还可以访问 互联网 照片 生活 资讯

QZONE最早日志是2010年,其实再之前也写过,但由于是相关前+女友,所以后来就删除了

本文一共 609 个汉字, 你数一下对不对.
8位的QQ号找不回来了-只有QZONE还可以访问. (AMP 移动加速版本)

扫描二维码,分享本文到微信朋友圈
75a5a60b9cac61e5c8c71a96e17f2d9c 8位的QQ号找不回来了-只有QZONE还可以访问 互联网 照片 生活 资讯
The post 8位的QQ号找不回来了-只有QZONE还可以访问 first appeared on 小赖子的英国生活和资讯.

相关文章:

  1. 按揭贷款(房贷,车贷) 每月还贷计算器 去年给银行借了17万英镑 买了20万7500英镑的房子, 25年还清. 前2年是定率 Fix Rate 的合同 (年利率2.49%). 每个月大概是还 700多英镑. 有很多种还贷的计算方式, 定率/每月固定 是比较常用的. 简单来说就是 每个月交的钱是...
  2. 智能手机 HTC One M9 使用测评 虽然我对手机要求不高, 远远没有像追求VPS服务器一样, 但是怎么算来两年内换了四个手机, 先是三星 S4 用了一年多, 然后 Nokia Lumia 635 Windows Phone, 后来又是 BLU, 半年多前换了...
  3. 在英国给孩子换学校的经历: 孩子离开了村里的小学 由于搬了家, 孩子上学得提前半小时出门了, 因为早上堵, 也得开车半小时才能到. 之前在 Fen Drayton 村庄上小学, 早上8:45学校门开, 9点敲钟孩子排队依次进入教室, 我们由于在村里, 只需要提前5分钟出门和孩子一起走路就可以了. 现在一下子早上变得很匆忙, 得叫孩子起床, 做早饭,...
  4. 英国房子的EPC节能报告(Energe/Efficiency Performance Certificate) EPC (Energe/Efficiency Performance Certificate) 是英国房子的节能报告, 法律上规定, 每个房子都必须要有一个EPC报告, 报告的有效期为十年. 房东在把房子出租或者想卖房的时候, 这个EPC就必须有效, 在一些情况下 比如出租房子的时候, 这个EPC报告还必须符合一些最低标准, 比如房子必须满足 F档(类似及格线)...
  5. 同一台服务器上多个WORDPRESS站点的一些设置可以移出去 我自从把所有网站都挪到一处VPS服务器上 就发现很多事情省事很多 可以同时管理多个网站 包括 WORDPRESS博客. 比如我有四个WORDPRESS博客 然后我就把通用的一些资料给移出去 移到 HTTP或者HTTPS都不能直接访问的文件夹里这样就更安全许多. 文件 wp-conn.php 存储了 相同的数据库资料. 1 2...
  6. 公司请的专业摄影师 公司来了新的CEO管理之后,很多事情都不一样了, 特别是一些公司对外形象的事情就特别的在意, 比如公司网站用上SSL.现在公司还有空闲的位置,请速来(钱多人不傻). 一月份出差回LUTON,刚好公司请来摄影师给高层管理照像放网站上的,于是我也凑了凑热闹(但是却还不够资格被放在公司网站上),不过没关系,放这里也差不多. 人到中年, 沧桑感强了些. 更新更新: 同事用他NB的单反给谢菲尔得办公室的人也拍了一组这样的照片.看起来很不错, 很专业,灯光,道具应有尽有.我已经用在了LINKEDIN页面上,立马高大上. 本文一共 230 个汉字, 你数一下对不对. 公司请的专业摄影师. (AMP...
  7. Leetcode 的在线调试器 最近 leetcode 刷题网站出了一个在线调试器. 个人感觉非常好用. 因为我平时是用 IPAD+蓝牙键盘来刷题, 而在 ipad 上是没有集成的IDE的, 对于调试来说, 只能很原始的让函数退出一个值, 然后尝试不同的输入来发现问题. leetcode在线调试器的好处 理论上来说, 你可以直接在浏览器里解决任何一道...
  8. 在英国开车的简单介绍/英国开车上路需要准备什么? 在英国合法上路需要有: 有效的驾照; MOT 车的年检; 路税 (Road Tax);还有最重要的汽车保险; 四者缺一不可. 千万不要有侥幸心理, 因为警察现在都高科技, 都能扫描车牌就能知道你合不合法. 不合法直接拦下来轻则罚款, 重则扣车上述法庭. 驾照 在英国可以用欧盟的大部分驾照,...

AI巴别塔与信息焦虑 II

2024年9月4日 16:07

借助AI,人类能够创造出更多超越认知的作品?还是因为其便利性可以制造越来越多不经审查的“垃圾”?

这并不是一个短期只能可以看到结果的事情,AI时代才刚刚开始,而人类是否会被取代,目前我们还停留在“凡人类制造的,人类只需要保留最后拔掉插头的权力即可”,就是对人工智能最后一层自信。

前些日子,我在Instagram刷到诸如此类的广告:全程翻译外国语大学教授的课堂内容,或是将一篇长达10万字的论文导入AI由他精简其内容,或是将一个长达1小时的演讲导入AI由他总结出只需要5分钟就能看懂的文字版——当然,5分钟的阅读时间,对于这个信息爆炸的时代而言还是太长。所以人们在标注“全文阅读时间”的同时,都倾向于在文章的最开始,整理出3行字就能“理解全文”的重要内容。

那为什么还要创作一本书、一篇文章或是一大段的文字——是不是任何信息都可以变成3行字,以便满足所谓的“适读性”?

——Previously on AI巴别塔与信息焦虑

我认识一个“创作者”,他至今对ChatGPT都充满了“恐惧”。恐惧的底层是对“未知”没有掌控感,那到底AI的“未知”在哪里——如果你是一个常用AI辅助工作的人,就会很快发现它的局限性——它很难做到真正溯源。所以真的要严谨地完成论据-结论的工作,仍然需要人类作为审查机制。

如果要用“我知道更多知识”作为一个评判标准,那人类在AI面前几乎就是沙漠里的一粒沙——我们假设一个人可以活到80岁,从10岁开始阅读书籍,每年平均阅读50本书,那么这个人类这一生也只能读完3500本书。现阶段,人类已经创作的书籍粗略估计早已经超过上亿本。3500之于100000000,已经显得微不足道,更何况在书籍之外,互联网的兴起让这个数值变得更多,出现了奇点式的增长。更何况很多人一年也读不了50本书……活不活得到80岁再说,毕竟65岁才能退休呢。

再说全科知识,人类更难做到每一个学科都可以深入学习。因此两点,人类在AI面前一败涂地。既然如此,那我们就得换一个思路去理解AI,如果它是一个超级存储器,可以记录全科百科,甚至是世界上已经存在的上亿本书籍。那我们或许可以用它做一件事:把这一亿本书每一本都提炼出300字的观点或中心思想,按照人类平均每分钟阅读200字的能力,不吃不喝不睡觉地读完这一亿本书的摘要,也需要285.7年的时间。

当然,这些数值并不是“确信值”,但这个极限值确实存在,现代社会我们能接受的信息远超过这个“极限压力”的数值。


今年上半年,我一直处于某种可以被感知的“焦虑”之中,但这种焦虑区别于死亡焦虑的目的性,它几乎找不到原因。这两天我也在朋友圈总结过:

今年整整5个月,我都处于一种“慢性焦虑”之中,所谓慢性焦虑就是不实质影响生活,但又能够明显感知。和之前死亡焦虑不同,我都不知道它源头在哪儿。

精准的分割线就是从香港看完苏打绿的演唱会之后(因为从朋友圈发布质量看出来的),在香港观察城市和人的时候,脑子调取了《制造宠物》这本书,然后牵扯出了我高中时上课无聊看各种故事解构的“课外书”,再到帮北影的毕业生写关于“城市构建与毁灭”的毕业论文。我发现我有很多零散的信息开始大量地出现在脑子里,不同跨度的事件被一瞬间callback。然后那个时候脑子“乱”了。

我为了对抗这种慢性焦虑,继续找书看、把思绪绕在主轴上的坚持写作也没有停、健身、体检报告也OK、狗造成的催产素也仅仅影响情绪。于是看-输出-看-输出就成了吗啡一样,麻木接受的信息越来越杂,其中掺杂着大量AI杜撰的垃圾文,又得花大量时间溯源,为了突破信息茧房“什么都看看”,输入的东西越来越多,不想错过的信息也越来越多——于是,信息焦虑的构成要件全都齐了。


信息大量出现,甚至有越来越多不经验证和溯源的信息出现;

信息间的联系因为信息茧房出现非关联性,从物理上被作了切断。这一点不得不承认,抖音更像是一个“佛教用品”,它的每一个信息都是独立的,短暂而丰富,因为一条信息开始需要思考“为什么”的时候,下一条信息出现,切断了上一条信息可能带来的“执念”——它确实像是一种“放下执念”的训练工具。

我虽然很厌烦APP的提醒功能,但有些软件我会打开提醒,例如微信、RSS订阅软件、博客评论提醒功能。我已经尽量地做到了“免打扰”,但是每次打开APP,都可以看到铺天盖地的未读红点。我一直以为自己是因为强迫症需要去确认这些红点,后来才意识到,这种强迫性行为,是因为“不想错过信息”导致的。

我细数了一下,可以作为信息来源的社交软件、信息订阅软件竟然有13个,他们分成被动提醒和主动索取两种,但无论哪种,我就得在这个电子产品上花费更多时间。信息来源越多,就意味着我的注意力会被分散得更多。虽然我对信息并不上瘾,但当信息过载积压时,我会觉得我需要花更多时间和精力去处理这些“被错过”的信息。

于是,这四个点共同构成了信息焦虑的关键原因——信息过载、信息茧房、不愿意错过信息和精力被过度分散。一旦出现信息焦虑,就会疯狂地寻找更多的信息以满足焦虑感,但事实上这个时候接收信息会因为杂乱而变得更加无序。过量获取的信息因为混乱无序而在内部形成“熵增”情形,只会导致越来越多原本有序的信息也跟着错乱,直到引发全面的精神焦虑。


当人们面对信息焦虑时,能想到的,无非是切断信息源,冷静一段时间;或是继续找寻下一个更加“优质”的信息源——这两者都是滞后性的商业模式;前者是提供替代焦虑的各种认知倾向,例如利用化学药剂的倾向,为焦虑者提供更多的酒精、药品或叶子;也可以利用能量平衡的方式,为输入焦虑的人提供能量输出的平衡——比如参加可以评判别人甚至是释放负面情绪的活动;后者,也是现在很多人在利用AI做的工作,例如将一本书、一部电影通过AI变成“捷径”,让人花最少的时间去对抗必须亲自读完书或看完电影的时间。

很显然,这两个方向并不能根治信息焦虑,反而会制造更多的求知缺口,让自己变得更加麻木。

当知识占满了整个认知空间时,对外对己的感应被切断时,一个人距离抑郁也不会太远了,这个话题下一期再聊。

AI巴别塔与信息焦虑 I

2024年8月29日 11:00

人工智能真的会替代人类吗?如果你询问人工智能这个问题,它总是会用“感情模块”作为标准答案回复给你——人工智能因为缺失情感模块,所以暂时无法替代人类的情感、创造力和想象力。是否意味着,人工智能一旦拥有了情感模块,就会超越正态曲线最中段的大部分人类?人类与人工智能的暧昧关系,到最后具象化成人类、人工智能、电源插头最好不过,人类制造了它,到最后也拥有拔掉插头的最终决定权——这一天终会来临,我们可以借由人工智能看懂异国的文字,甚至是理解那些创造性的想象力,和复杂的情感,再次突破语言、文化和意识的限制,是否是人类历史上的第二座“巴别塔”

——阅后即焚|再建巴别塔

AI的普及,是让人类越来越聪明?还是越来越蠢?

前段时间和朋友聊起“AI会不会使人类大脑的开发超越10%”——或许认知的“巴别塔”一直都存在,只是人类的认知水平(或许是大脑只开发了10%)最高只能抵达10楼,然而目前AI仍然是通过对人类已有文明、信息、观点进行排列组合得出最优答案,它并没有超越人类的认知创造新的事物,所以AI更像是为这座“巴别塔”安装了1-10楼的电梯罢了。11-100楼到底有什么东西,或许有人看见过,但是他们可能被当成了疯子、瘾君子、不再配得起“人”这个标签——是人进入不了11楼吗?我看未必,说不定是我们被禁止入内了。


上次在《中文博客圈的“鸩酒”与止不了的“渴”》里,我测试了发布日当天各个中文博客聚合页面里,包括我自己在内随机10篇文章。测试的方法很简单,就是把文章投喂给ChatGPT,询问它文章是否是使用AI创作的。10篇文章里,有7篇得到了ChatGPT的回复:

基于以上分析,这段文字可能是AI生成或AI参与制作的。虽然不能百分之百确定,但文本的结构、语言风格和内容处理方式都具有典型的AI生成特征。如果需要进一步确认,可以通过使用专门的AI检测工具来分析。

ChatGPT对AI作品的评价

结果,在评论区有人匿名指责我:博主拿别人的文章去AI测试这个行为很不可取。

为什么?是测试的行为不可取?还是人们通过AI创作文章之后被人用来测试的行为不可取?这段时间,我也在思考这个点——首先,我得排除测试行为不可取的选项,因为发布在公共网络,阅读者当然可以保持批判性思维采取任何形式的方式去验证“信息来源”的真伪性;如果文章确实是通过AI创作、或是由AI参与创作的,这类文章应该如何界定?

我并不反感AI创作的文章,但凡是涉及“文献”、“信息来源”的,如果仍然使用AI得出答案,我会非常头疼。因为AI能够给出的“来源”,常常会是过时就是胡诌的,一般追问三次以上,它就会承认自己是杜撰的文献或信息来源。它确实可以用来溯源“理论”,但是它对于“观点”的溯源会因为内容杂乱而变得无序。


观点的呈现,往往需要“证据”。除非采用的是“演绎法”,大前提是大家公认的、或是可以通过AI溯源到原始理论的。“归纳法”则需要大量的历史经验、真实经历来作为支撑,以便找到可供归纳的“共性”,然后得出一个存在可能性的结论。这个时候,便是AI无法“创造”的内容——因为个人经验和经历不仅仅需要调动记忆,还需要附着人类的情感模块才可以得到呈现——这也是AI判定文章是否由人类创作的重要标准。

所以采用“归纳法”呈现的,有AI参与其中的文章,会有两种非常明显的差别——事实来源于人类,结论是AI总结事实来源于AI,结论是人类总结。这两个模块的文笔差别有多大,文章读起来就有多割裂——以至于会出现两种极端情况:

1、人类写了一大堆缺乏逻辑的文字,最后由AI进行一个总结和观点的拆分,但是这些观点其实都不是人类提到的;

2、人类没有做采编工作,通过AI收集了一些明显存在常识性错误的数据,然后最后由人类通过AI提供的内容得出结论;

请注意,我说的这是“极端情况”,并不是指每个通过AI创作或利用AI创作的内容,都会有这两种情况。讨论极端情况的目的,是能够在一个坐标轴上寻找到某种平衡点。上述两种类型的文章,哪一种会让你看完后更“冒火”?

第一类文章虽然逻辑性差了点,但好在经验经历都是来源于一个活人,虽然文章结尾突然立意拔高让人有点割裂,但至少他还有“人的属性”;但是第二类文章,无论如何都触碰到了我对“信息来源”的苛责底线,这就好比实验结果和实验过程互不相干、彼此造假,但实验者自己深信不疑。

就像厨子做饭,AI是厨艺的放大器,如果本身具备一点厨艺,借助AI可以做出一桌好菜,但如果是个废物厨师,借助AI只能做出一桌屎。

和朋友讨论起这两种极端情况的感受,他如是回答

除这两个极端以外,AI参与创作本身并没有对与错之分,所以这个我被指责“不可取”确实成立部分。

其一,如果文章大部分内容是“真实经历”,AI只是起到一个重新排列组合并得出结论的工作,那AI并不会导致文章的真实性降低多少;

当然,如果文章大部分内容是AI提供的“事实依据”,而创作者仅仅只是起到“结尾立意”的工作,这个行为跟通过AI创作一大堆网络垃圾文是没有本质区别的,通过AI判定揪出这样的文章,我认为这是寻求“真相”的过程。

其二,如果是将他人文章投喂给AI,试图通过AI的排列组合功能,将原本富有真实情感、创作意图、甚至是隐喻的文章通过冷冰冰的文字组合重新解构,那这是对创作者的不尊重;

其三,也是《AI巴别塔与信息焦虑》这个系列开始的原因——AI和创作的边界在哪里?随着AI的推广普及,无论是变成算法进入我们依赖的电子设备功能,还是依赖AI成为一种新式的结果搜索引擎。它不再像刚开始出现时有强烈的“边界感”,这种边界扩张是无法预判的,但也实际带来了“不便”——比如在使用搜索引擎的时候,通过AI排列组合的答案首当其中,真要完全相信里面的内容,自己还得再做好几个后续“溯源”的动作。

我无法做到对AI结果的全然相信。这件事用演绎法就可以说清楚——大前提:网络信息并不全部为真,里面也掺杂过时信息、谣言、阴谋论等等未经审查的内容;小前提:AI的所有内容均来源于互联网,虽然有判定和学习机制,但AI也承认无法完全避免。结论:AI所提供的信息也会包含过时信息、谣言、阴谋论等等未经审查的内容。显然,这是一个确定的结论。

尽管有这些机制,AI仍然可能误判信息的真伪。尤其是在面对复杂、模棱两可或高度技术化的信息时,AI的判断可能并不可靠。

ChatGPT也承认自己对信息辨别能力有限

这便是“信息焦虑”的来源之一——AI让创作变得更加容易,那未经审查的伪装得更符合人类逻辑性的文章会不会越来越多?这反而会降低人类处理信息的效率,甚至是人类对这些信息产生依赖之后,反而会出现“降智”的可能性?

AI因为拥有大量的、远超过单个人类知识体系的信息,它的初始状态是无序复杂的,同时AI是作为一个商品,其算法、底层代码本身也是非公开技术,所以对于一般人而言,它的随机性和不可预测性远超过人类的“创作”。由此可见,AI仍是“混沌”的,只有通过人类提问、交流的方式,才可以得出“有序”的排列组合。然而,人类的创作是“秩序”的,无论是逻辑、结构、剧情节奏、人物弧光,只有符合逻辑但又超出意料之外的故事,才会让人为之惊叹。

当“混沌”的AI和“秩序”的创作星系碰撞,在混沌秩序的模糊边界处,往往就是最具创造力和活力的地方,恒星诞生、星系纠缠、白矮塌陷、超星爆炸……在这个最有活力的地方,或许创造出来的是越来越多的“宇宙垃圾”,也有可能是超越人类认知的“星辰大海”。

但在此之前,我们先别丢掉对一个信息溯源的批判性思维。

折腾瑞芯微RV1126嵌入式开发板

2024年7月25日 10:24

2020年前后,当华为海思被美国制裁时,国内安防芯片缺口很大(安防领域,当时海思IPC SoC大约占有70%市场,DVR/NVR SoC大约占有90%市场)。之后群雄逐鹿,瑞芯微也适时推出了两款面向IPC的SoC芯片,RV1126(4K800万IPC)及RV1109(500万IPC)。RV1126采用四核32位ARM Cortex A7架构,有2T算力的NPU,适合用来做视频编解码,跑与视频相关的算法模型。

手边有一块闲置很久的基于RV1126的嵌入式开发板,1G内存,自带8G eMMC硬盘。闲暇之余,想用来安装宝塔面板,搭建nginx等环境,然后跑web应用。厂家提供的固件是基于 buildroot的,如此,需要从源代码开始,编译和配置自己需要各种软件和库。对此我一窍不通,难度太大,只能作罢。

RV1126开发板

最近发现厂家更新了固件,提供了基于Ubuntu的底层固件,之前的想法又冒出来了,试了试,居然成功了,这里做些回顾记录。

刷机

刷机方法与刷安卓手机类似。电脑首先安装usb驱动,瑞芯微有提供驱动安装助手–DriverAssitant_v5.0(下载)。驱动安装好后,开发板通过USB与电脑连接,识别到设备。

瑞芯微的刷机工具–RKDevTool(下载),刷机过程中可能出现的问题与安卓刷机基本一样,包括不限于USB线,设备连接,识别,驱动等方面。

RV1126开发板厂商提供的基于Ubuntu的固件–RV1126-Ubuntu-20.04-firmware_20240227(下载)。

环境搭建配置

刷完机,插上网线,因为设备默认DHCP,搜索查询到设备的IP,然后SSH登录。

SSH 登录

1panel面板

因为时常操作云服务器,此时第一想法是安装宝塔面板。却被提示在线安装的宝塔,不支持这个arm 32位设备。让去试试宝塔5.9。简单搜索了下,不知道去哪弄宝塔5.9的安装包,官方的离线安装服务里可能有旧版的,但要收费。(写此博文时,又在网络搜索一番,发现有好心人搜集整理了旧版本的宝塔,此处

转念想到何不试试其他的面板程序,比如1panel。1panel面板官网写着支持armv7l服务器架构。试了下,果然安装成功。有宝塔的经验在先,1panel面板的安装,使用上手很快。终端SSH及文件管理,很直观,与宝塔的使用基本一致。

frp

为了方便SSH远程登录,及面板的远程管理以及后续web站点能外网访问,首先用上frp。用一台阿里云香港服务器(2C2G30M)做frp的服务端,配置好。虽然第一次使用frp,因工作原因,对p2p,nat穿透,端口映射,DDNS知识了解很多,所以对frp理解,上手,使用起来很容易。

frp的设计理念可能是要保持服务端配置的精简,统一(在客户端做各种区分),比如保持服务端唯一的对外http端口,https端口,ssh端口等。如果有多个对外服务(比如web应用),只需要在frp客户端做配置即可,通过绑定不同域名来区分不同web应用(而非常规的采用不同端口区分不同web应用),如此思路很清晰,就是有点费域名。:-)

持续将近半个月的frp使用下来,很稳定,速度也很好。当然,这可靠性多半要归我这台2C2G30M的阿里云香港服务器。看网上的讨论,这个系列的阿里云香港服务器很抢手,性价比很高。我比较看重的,回国内延时非常低,在广州ping值延时只有8-9ms,比广州服务器ping值还低。(对于我用来科学上网,非常完美)。

说个题外话,我曾持续(从一个月到一年时间不等)测试各种云的香港服务器(比如狗云,马云,鸡云,草云。当然还有大厂的,腾讯云,华为云,天翼云等),回大陆线路,表现最好最稳定,性价比最高的还是阿里云。

应用

解决了服务器远程管理,外网访问问题。剩下的就是搭建网站了。使用宝塔时,习惯一键安装NMP等环境。1panel也有类似功能,不过其提供的默认web环境是OpenResty,安装时却出了点状况,始终安装失败。

1panel的理念是一切皆docker。安装的所有应用均是基于docker的。安装OpenResty失败,起初以为是docker镜像源,网络问题。不过,这个很快排除了。

前段时间网络上讨论很多,docker hub及国内的众多加速服务在国内完全无法用,当然解决办法也很多。我比较喜欢的办法,对于个人用户,可以将常用的镜像通过GitHub action同步到阿里云容器镜像服务 ACR,然后选择公开或者私有,需要时从ACR拉取容器镜像。(见 docker_image_pusher

这种方法,我使用多次,国内服务器上拉取容器镜像,速度很快,也稳定可靠。当然,更常规的做法是使用docker hub镜像加速,比如1panel提供的临时加速地址:https://docker.1panel.live 。目前大环境下,国内的docker hub镜像站几乎都关了。我上面提到的docker image pusher方法对于个人用户是非常实用的。

排除网络问题,查看日志,发现安装OpenResty失败的原因是因为1panel商店里上架的这个版本不支持我使用的armv7l处理器。此时恍然大悟,然后又有点忧心。相较于x86,armv7l算比较小众,很多docker应用可能没有适配。如果通过1panel自带的商店安装,估计很多安装不了。如此,对于这个开发版使用1panel面板作用不大了。当然1G内存,外加4核心处理器,本身有点鸡肋和尴尬。也只能用来跑些简单的web应用。

找到问题以后,手动安装了nginx/1.18.0,PHP 7.4.3-4ubuntu2.23 (cli),这样能来跑静态及PHP站点了。

目前这个开发板上运行的web应用有:

之前在网友小宋的博客看见介绍的用来监控树莓派状态的应用Pi Dashboard,UI比较好看,起初试了在云服务器上跑,但是x86的服务器获取不到CPU温度。如今这个是arm的开发版,安排上。

通过docker安装的twikoo,uptime-kuma可以成功运行。

作为我这个hexo博客节点之一(目前我这个博客节点有:阿里云广州,华为云北京,京东云北京,海外netlify以及此开发板的香港服务器frp反代)。通过Github action构建,然后分发到不同节点服务器上,方法参见我之前的博文:博客网站更新总结-2023–Github-action通过GitHub Action将博客网站等静态文件同步到云服务器

考虑停电,断网,设备重启等意外情况,给相关程序加上开机启动,进程守护。同时因为只有1G内存,加上定时任务,定时清理内存,缓存。此时1panel面板的价值作用体现了。

前面提到frp是通过不同域名区分不同网站的,最后各web网站的访问地址是域名+端口,比如one.jiangyu.org:8090,two.jiangyu.org:8090。给这些源站套上CDN,就能不带端口,直接用绑定的CDN域名访问对应的web站点。只是这样一来,就更费域名了。:-)

还有一个问题。绑定CDN以后,我习惯强制https,如此需要给CDN上传SSL证书。如今SSL证书有效期已缩短到90天(我曾在6个月前的博文 SSL证书,部署及相关知识中总结过与SSL证书相关的知识,彼时证书有效期还多是1年,半年不到普遍都是90天了),如果自己的VPS部署站点,开启https,申请SSL证书,然后绑定,不断更新,这都能自动化完成。可是在CDN应用里,需要自己上传SSL证书,如果过期,需要重新再上传新的证书。如果使用的是大厂CDN,这个问题比较好解决,厂家开放了各种api,基于此很多大神帮忙造好了轮子,SSL证书申请,上传到CDN,部署,更新都能通过脚本自动化完成。可是对于小厂CDN,一般没开放api或者没有现成的造好的轮子,需要自己频繁手动更新SSL证书,是个大问题。

最近看到有某CDN小厂提供了名为证书无忧的服务,能很好解决上述问题。在CDN配置里,第一次先上传自己的SSL证书,在证书到期前,会自动更新有效期为 90 天的免费证书。目前公测期间这个功能免费,以后可能每次成功更新证书收费1-2元。这是个很好的功能,不知道会不会有其他CDN厂家跟进。

其他

这个开发板尺寸100 x 60mm,比树莓派略大,买来一个树莓派的亚格力外壳(外壳整体尺寸与这个开发板相当),重新钻孔,保护起来。买外壳时,看见店家有与外壳配套的散热风扇,也买了一个。测试了一段时间,对比发现,这个5V 0.2A的小风扇能给CPU降温5-6℃。不过因为RV1126这颗SoC面向的是安防,消费类IPC领域,低功耗,温度控制这块做得比较好。即使不加散热风扇,在室温30℃时,一般负载下运行时的最高温度也只在50℃上下,离会降频的85℃还很远。

这个开发板有个40pin 的 gpio接口,厂家文档说兼容树莓派的接口,除此没有更多资料。本来想着如同树莓派一样,接几个诸如温度,湿度这样的传感器,调试一下,资料欠缺,需要补的课很多,只能暂时作罢。

通过GitHub Action将博客网站等静态文件同步到云服务器

2024年6月4日 10:59

之前在博客网站更新总结-2023一文中简单提到过,借助Github action(使用easingthemes/ssh-deploy)将hexo静态博客同步到云服务器,实现自动化部署。

最近在折腾mkdocs,再次使用到通过Github Action将自动生成的静态文件部署到云服务器功能。这里做些详细总结,笔记。

将文件同步到远端服务器,可以使用ftp,sftp,ssh等协议。对于云服务器,通过ssh协议同步文件是很好的选择。这里我介绍的easingthemes/ssh-deploy即是利用Liunx/Unix下的rsync(remote synchronize)工具,借助ssh协议,实现本地端(Github)与云服务器端的文件同步。

Github marketplace商店里能搜索到很多与easingthemes/ssh-deploy类似的同步工具,原理及使用大同小异。

ssh-deploy代码示例

采用ssh-deploy同步文件的代码示例:(可任意命名为.github/workflow/ci.yml)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## 部署到服务器
- name: Deploy to VPS
uses: easingthemes/ssh-deploy@main
env:
# 托管在Github里的远程VPS服务器.ssh文件下的私钥id_rsa
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY_BJ_IPC }}
# rsync的同步命令参数
ARGS: "-avzr --delete"
# Github workplace里生成的静态文件目录,即需要同步到远端VPS的文件/文件夹。
SOURCE: "./site/"
# VPS IP地址。也可以如同id_rsa私钥一样,托管在Github,然后采用动态参数,比如${{ secrets.SSH_IP }}
REMOTE_HOST: 1.1.1.1
# VPS默认用户名root。
REMOTE_USER: root
# 需要同步到的VPS目录
TARGET: /www/wwwroot/ipc

以上,Github action与远程VPS连接,采用ssh方式登录(通过私钥),rsync同步文件。

为安全,将私钥托管到Github,然后采用变量表达(比如secrets.SSH_PRIVATE_KEY_BJ_IPC )。如此,VPS的IP地址,用户名,同步的目录等参数均可托管到Github,然后采用此种变量表达,以避免明文暴露。

托管VPS的私钥

生成公私钥

登录vps,键入以下命令,生成公私钥。在.ssh目录下,会生成两个文件,id_rsa 为私钥,id_rsa.pub 为公钥。

1
ssh-keygen -m PEM -t rsa -b 4096

键入以下命令,将公钥导入authorized_keys文件

1
2
[root@host ~]$ cd .ssh
[root@host .ssh]$ cat id_rsa.pub >> authorized_keys

如此便完成了公钥的安装。为了保证连接成功,确保以下文件权限正确:

1
2
[root@host .ssh]$ chmod 600 authorized_keys
[root@host .ssh]$ chmod 700 ~/.ssh

配置ssh,打开密钥登录功能。
编辑 /etc/ssh/sshd_config 文件,进行如下设置:

1
2
3
RSAAuthentication yes
PubkeyAuthentication yes
PermitRootLogin yes

重启 SSH 服务:

1
sshd restart

到这里还有一个很重要的步骤:需要将私钥转换成pem格式:

1
ssh-keygen -p -f ~/.ssh/id_rsa -m pem

打开id_rsa,看看开头是不是—–BEGIN RSA PRIVATE KEY—–

托管私钥

Github里配置私钥。对应的项目仓库,Settings-> Security-> Secrets and variables-> Action-> Secrets将私钥托管在此处。

Github action托管私钥

选择New repository secret。

Name,自己命名,比如上述代码里命名为 SSH_PRIVATE_KEY_BJ_IPC,秘钥变量即为secrets.SSH_PRIVATE_KEY

1
SSH_PRIVATE_KEY: ${{ SSH_PRIVATE_KEY_BJ_IPC }}

Secret,将上述id_rsa文件(—-BEGIN RSA PRIVATE KEY—–开头的),全部复制粘贴。即完成了私钥托管。

rsync参数

easingthemes/ssh-deploy使用Linux rsync工具来同步文件。在rsync主页对其使用,常见参数有详细介绍,这里选择重要的命令参数总结在下面:

ShortLongDescription
-a–archive归档模式,表示以递归方式传输文件,并保持所有属性,它等同于-r、-l、-p、-t、-g、-o、-D 选项。-a 选项后面可以跟一个 –no-(OPTION),表示关闭 -r、-l、-p、-t、-g、-o、-D 中的某一个,比如-a –no-l 等同于 -r、-p、-t、-g、-o、-D 选项。
-v–verbose表示打印一些信息,比如文件列表、文件数量等。
-z–compress传输过程中进行压缩。
-r–recursive表示以递归模式处理子目录。如果单独传一个文件不需要加 -r 选项,但是传输目录时必须加。
-l–links表示保留软连接。
-L–copy-links表示像对待常规文件一样处理软连接。如果是 SRC 中有软连接文件,则加上该选项后,将会把软连接指向的目标文件复制到 DEST。
-p–perms保持文件权限。
-t–times保持文件时间信息。
-g–group保持文件属组信息。
-o–owner保持文件属主信息
-D–devices –specials保持设备文件信息。
-u–update把 DEST 中比 SRC 还新的文件排除掉,不会覆盖。
–delete删除 DEST 中 SRC 没有的文件。
–exclude=排除不需要传输的文件,等号后面跟文件名,可以是通配符模式(如 *.txt)。
–progress显示同步的过程状态,比如同步的文件数量、 同步的文件传输速度等。

rsync是增量备份同步,速度和可靠性都很好。
值得一提的是使用–delete这一选项,SRC中的文件及文件夹的任何改变都会同步到DEST,同时DEST中的如果有新增文件,使用–delete同步,DEST新增的这些文件会被删除。

Cache

在使用Github action生成mkdocs站点,然后托管到VPS过程中,发现每次mkdocs的deploy的时间都很久,看日志,大部分时间都花在了安装mkdocs的依赖库及环境上,而这些明显是可以缓存的。搜索了下,果然Github有cache action可以实现对环境及依赖库文件的缓存。Github cache action有中文的说明文档,但对如我一样的new hand,使用配置太过复杂,看了文档也不知道怎么用。一时陷入僵局。想到自己在同样通过Github action部署hexo时,deploy速度明显比mkdocs要快(Github action的workflows借鉴自网络,当时没深究),起初以为是hexo部署本身就要比mkdocs快。看了下对应的Github action的workflows文件,发现有个名为c-hive/gha-yarn-cache的Github action,恰恰就是用来缓存依赖库及环境文件的(最初我以为是来缓存生成的hexo静态文件的)。

看看gha-yarn-cache给自己的介绍:

1-liner yarn install cache for GitHub Actions.
GitHub Action caches improve build times and reduce network dependencies. However, writing the correct cache logic is tricky. You need to understand how the cache action (keys and restore keys) work. Did you know you’re not supposed to cache the node_modules folder? The setup is different per OS and takes a lot of space in your workflows. Not anymore!

哈哈,恰恰是对于像我这样不知道如何使用配置 Github cache action的new hand的。马上使用之。

博客域名DNS解析优化

2024年5月7日 11:11

时不时的会使用网站测速工具测试下自己博客的打开速度,各种网站测速工具原理大致相同,展示的都是从各地打开被测站点所需要的总的时间。这个总时间是三方面的时间总和:域名解析(DNS)时间,访问者与网站服务器之间连接时间以及网站内容下载时间。

偶然间关注到我的博客站点域名解析所耗时间居然比连接时间和网站内容下载时间多很多。引起了我的警觉,决定研究(折腾)一番。

我的博客首页大小6KB,经过测试,(从各地访问我的博客)下载所需时间大约几十毫秒,服务器连接时间大约是几毫秒到几十毫秒不等。而域名的解析时间居然高达几百毫秒(大致估算了下解析平均耗时大约是500ms),这难以接受!

网站打开时间

如何提高,优化博客域名的解析时间,决定分理论和实验两步走。理论方面,全面学习了解下关于域名DNS解析的知识;实验方面,试用下常见的一些DNS域名解析服务(当然主要是免费的DNS域名解析服务)。

(对于个人博主,建议直接看实验方面的结论部分。直达

理论

当我们访问一个网站,在浏览器里输入网站的域名,相应的域名解析服务器(DNS服务器)会将域名解析成对应的ip地址,然后返回给浏览器。我们访问一个网站,实际是在访问一个基于ip地址提供的web服务(互联网早期三大经典应用ftp,www,e-mail背后都是ip地址)。

互联网里域名解析的体系及流程是这样的:

域名解析过程

1.用户在浏览器中输入域名“jiangyu.org”, 若本地浏览器没有缓存,则向LocalDNS发起请求。所谓LocalDNS一般为网络运营商提供的DNS服务,比如电信运营商的经典的114.114.114.114,各地区运营商的DNS(比如广东电信的202.96.128.86)。LocalDNS是域名解析的起点,电信运营商在这个领域有先天优势(他们提供的权威DNS解析服务能更快)。从这个角度考虑,这可能是众多云服务商都想推广自己的公共DNS的原因。比如百度云的180.76.76.76,阿里云的223.5.5.5,腾讯云(DNSPod)的119.29.29.29。

2-1.若LocalDNS服务器里缓存有域名jiangyu.org对应的IP地址信息,则直接向用户返回IP地址信息,如此即完成了一次域名查询解析服务。可以看出这个过程时间会非常短,对于个人博客,这是最好的情况。LocalDNS返回最终的结果(IP地址信息)给用户,这个过程被称为递归查询。

域名对应IP地址信息缓存在LocalDNS服务器的时间,是由TTL控制,TTL即time to live,是我们在域名解析(即使用权威域名服务器)时设置的,一般可以设置成几秒到几分钟不等,最长可以设置24小时(86400s)。

2-2.LocalDNS若完全无缓存,则采用迭代查询的方法,向各域名服务器进行查询。

2-2.1LocalDNS最开始向根域名服务器查询。根域名服务器并不知道jiangyu.org这个域名对应的具体IP,只是告知应该向.org TLD(Top Level Domain,顶级域名)查询。

2-2.2LocalDNS则紧接着询问.org顶级域名服务器,被告知应该询问AliDNS(jiangyu.org这个域名使用AliDNS提供的权威域名解析服务),它知道。

2-2.3LocalDNS则转向AliDNS这个权威域名服务器,获知了jiangyu.org域名对应的IP地址信息。

2-2.3.1LocalDNS将获取到的jiangyu.org对应的IP地址信息反馈给用户,并遵循TTL设置,将结果缓存起来。

综合以上,域名解析过程有这些要点:

  • 各层级的域名服务器都会缓存域名解析信息;
  • 不同地区的访问者越多,域名解析信息越能及时被缓存,用户感知到的解析时间会越短。TTL设置的越长(缓存时间越久),可能需求的解析时间也会越短;
  • 从域名解析时间角度考虑,个人博客站点(尤其首页)使用CDN可能并不是总是好的。因为访问量并不大,CDN IP地址多,如果没有及时缓存,可能致解析时间多变,久;
  • 电信运营商来做域名解析(权威域名服务器),有先天优势。用户的LocalDNS多用他的,路近道宽。实践中发现 www.ctyun.cn (电信天翼云)这个域名各地解析时间平均只需几十毫秒,甚至多个节点只需几毫秒。作为对比,阿里云( www.aliyun.com ),腾讯云( cloud.tencent.com )都是100-200ms,逊色不少。比较可惜,天翼云的DNS解析没有免费版;
  • DNS DDOS攻击多发生于权威域名服务器端;
  • DNS劫持多发生于LocalDNS服务器端;
  • 国外的权威域名解析服务(比如Cloudflare)有其优势,比如可能更靠近根域名服务器或者部分顶级域名服务器,但国内使用,单独看解析时间仍不理想。节点多位于中国境外,解析服务器与境内连接有网络带宽的瓶颈。

实验

通过前面理论分析,对于个人博客站点,要优化自己域名解析时间,唯一能做的就是选用合适的(解析速度快的)权威域名解析服务。主要是免费的域名解析服务。

目前提供免费域名解析服务(权威域名解析服务)的有:

  • 阿里云的云解析 DNS
  • 腾讯云的DNSPod
  • 华为云的云解析服务 DNS
  • Cloudflare的DNS

其中DNSPod应该是国内解析量最大的,日均解析量为1700亿次,其次是阿里云的云解析,日均解析量大约是1000亿次。Cloudflare的数据量不清楚,可能是世界范围内规模最大的域名解析服务。华为云的云解析服务可以免费使用其他家收费才提供的各种高级功能。

除了以上,其实各提供公有云服务的IDC均会提供域名解析服务,为快速实验比较计,仅测试以上主流的四种。

实验前提:

通过Whois查询工具,收集到使用不同域名解析服务的个人博客域名,同时加入使用对应收费版的域名解析服务的网站作为对比。因各博客及网站域名解析里的TTL缓存时间不明确,因而采用不同时间段,多次访问被测站点的办法测试,时间跨度持续约3个星期,以尽可能排除缓存干扰。

测速平台:https://tool.chinaz.com/speedtest/ (仅评估域名解析时间,连接时间及下载时间忽略)

实验结果:
(测试时间2024.4.10-4.30)

样本网站DNS解析服务商DNS服务器服务器地域解析耗时
Q博客DNSPod免费版cotangent.dnspod.net,group.dnspod.net香港,日本,新加坡等地域100-150ms
W博客DNSPod免费版clean.dnspod.net,clifford.dnspod.net境内IP100-150ms
M博客DNSPod免费kama.dnspod.net,lake.dnspod.netCloudflare500-800ms
Z网站DNSPod付费版ns3.dnsv5.com,ns4.dnsv5.com境内CDN50-100ms
S博客阿里云DNS免费版dns11.hichina.com,dns12.hichina.com境内IP200-300ms
H网站阿里云DNS付费版vip3.alidns.comvip4.alidns.com境内CDN100-150ms
J博客华为云DNS解析ns1.huaweicloud-dns.com, ns1.huaweicloud-dns.cn境内IP200-300ms
I博客Cloudflare DNSjay.ns.cloudflare.com, kara.ns.cloudflare.comCloudflare500-800ms

(实验过程省略。)
上面解析耗时数据可以不用过多关注(不够严谨),直接看下面的结论。

结论

(主要针对个人博客站长)

  • 免费版域名解析服务解析时间波动较大(一般上午解析更快,下午及晚上较慢。当然解析服务本身是否稳定是另一个不确定因素),收费版的比较稳定;
  • 使用国外CDN(比如Cloudflare),服务器,所需域名解析时间会更久。使用临近中国大陆地域的服务器,比如中国香港,新加坡,日本等,所需解析时间会较短;
  • 更高级的收费功能(华为云DNS解析免费提供,其他家收费提供),比如负载均衡,更多的解析线路,更细致的地区划分,对于个人博客意义不大(个人博客不会部署那么多服务器);
  • CDN有种种好处,但从域名解析角度看,单IP更好;
  • 个人博客可以设置更长的TTL时间(24小时,86400s),以达到最好的缓存效果;
  • 使用某家的云服务器,然后使用同一家的域名解析服务,可能有更短的解析延时,更稳定的表现;

现在回到最开始的问题,我大概从2010年前后开始使用DNSPod的域名解析服务,彼时DNSPod还没有被腾讯收购。习惯使然或者其他因素,一直没考虑过更换或者尝试使用其他的域名解析服务。直到这次发现DNSPod延时居然这么久,测试一段时间后发现,各家免费的域名解析服务效果,性能,稳定性其实都差不太多。而DNSPod被我发现表现差,可能正巧这段时间其服务不太稳定。DNSPod对外公开的系统状态监控证实了我的这种猜想。可以看出DNSPod日正常解析量在1800亿次上下,而我测试期间(4月10-30日),有多次波动很大,最低到1400亿-1500亿次,最多减少了22%左右。

DNSPod近30天解析趋势

如此看来,免费的权威DNS服务器用得人多,对于服务商并非一定是好事(服务跟上,服务器数量,布局合理,技术更新等都需要花钱。当然想办法将免费用户转换成付费用户又是另一方面了)。对于云服务提供商,与传统电信运营商去竞争LocalDNS可能更有价值。

hello YU say!

2024年4月2日 09:52

一直将博客当成知识输出的平台(如何做好笔记),所写博文均是(相对)深思熟虑的结果。但日常,时常会有只言片语的想法,瞬间的感受想要表达,发布,用长博文不太合适。

在WordPress时代,有关注一款主题blix,blixed(WordPress领域的大佬,我爱水煮鱼还一直在使用这款主题)。这款主题有个功能,叫Mini Entries。主题内置了一个叫BX post type的字段,专门用来发布短博文,即不写标题,博文可能就短短的一句话,一张图,会自动更新在页面(类似微博,Twitter这样的效果)。当时(2009年前后)的WordPress似乎自定义字段功能还不怎么完善。

今天看WordPress,通过自定义字段,发布短博文很方便了。见旅行漫记的随笔板块有使用这样的短博文样式效果。

说这一段,是因为一直想在hexo这样的静态博客框架里实现上面提到的短博文的效果。后来看见了五木老师的哔哔点啥 2.0 By Memos,能将memos内置到静态博客里。大体上就是我想要的短博文效果。Memos高度复刻flomo(浮墨笔记),主打能随时随地将自己的想法记录保存下来。

flomo可以通过多种终端、方式无压力输入记录自己的想法,将flomo与静态博客相结合其实就能满足我的需求,但是如果使用flomo api需要开通会员,于我这完全没必要。我仅仅只是把想法记录下来,后续的回顾,整理之类都不会再依靠flomo(见我曾经总结的,上面提到的如何做好笔记一文)。

Memos没有api方面的限制,但Memos有个我认为最致命的问题,不方便手机端输入。使用Memos,flomo这样的工具的最大目的应该是方便手机端能随时随地记录自己片刻的所思,所想,所见。对于Memos,虽然有网友适配的第三方手机客户端,但UI界面太丑,简陋,而flomo则有非常方便的手机端输入方式,客户端,微信等。以上是我迟迟没怎么使用Memos,宁愿暂时使用flomo的重要原因。

如此一直默默关注着Memos,前不久发现,Memos开始支持Telegram Bot,通过Telegram 手机端随时随地发布自己的想法,然后会自动保存到Memos,完美解决了Memos手机端功能缺失,不完美的问题。

马上上手,安装Memos,然后绑定Telegram机器人。同时参考上述五木老师的教程,将Memos内置到博客,以后通过Telegram发布的所思所想,会自动显示在此博客–说说(YU say)。如此比较完美的实现了在静态博客随时随地发布短博文的功能。

喜悦之情溢于言表,写文以记之!

光孝寺相关资料

2024年1月26日 16:11

在写上篇关于光孝寺的博文时,了解到有本《光孝寺志》的书,其对光孝寺的历史,沿革等等介绍的很清楚,在网上搜寻很久,一直没能找到电子版的。上述博文写完后,不太甘心,继续在网上搜寻,最终还是找到了这本书的电子版资源(pdf扫描件)。

简单大概扫了一遍《光孝寺志》,发现前述博文中,关于光孝寺的介绍有很多错漏以及需要完善的地方。原本打算直接将前文修改完善,但在搜寻《光孝寺志》的过程中,获得了很多与光孝寺相关的资料,完全值得另起一文详加叙述,将这些资料分享出来。

《光孝寺志》

《光孝寺志》始修于明代崇祯年间,续修于清代乾隆年间,这两个版本皆不传于世,现在只有乾隆版的抄本保存在一些图书馆中。以后出版的一些点校本,排印本,影印本皆是以乾隆版抄本为底本的。(《光孝寺志》若干问题简析一文对各版本有详细分析)

光孝寺志

读《光孝寺志》对了解寺庙的名称演变,历史沿革等是大有裨益的。

寺名沿革

  • 东晋安帝隆安中(397—401),竱宾果三藏法师昙摩耶舍尊者,东游震旦,就此地建立大殿五间,创为“王苑朝延寺”,又曰“王园寺”。虞翻的后人舍宅为寺,名曰制止。不过,一般认为昙摩耶舍才是光孝寺的开山祖师,王苑朝延寺才是光孝寺最早的寺名。这样看光孝寺的历史就是大约1600多年。
  • 刘宋武帝永初元年(420),梵僧求那跋陀罗三藏法师飞锡至此,创立戒坛,立制止道场。制止道场,或称制旨道场、制止寺、制旨寺。
  • 唐太宗贞观十九年(645),改“制止王园”为“乾明法性寺”。
  • 武宗会昌五年(845)废佛,改乾明法性寺作西云道宫。
  • 宣宗大中十三年(859),复为乾明法性寺。
  • 宋太祖建隆三年(962),改法性寺为乾明禅院。
  • 宋仁宗景佑四年(1037),诏并寺为祖堂。后住持僧守荣上言,复赐“乾明禅院”额。
  • 宋徽宗崇宁二年(1103),改乾明禅院为崇宁万寿禅寺。
  • 宋徽宗政和元年(1111),诏改乾明寺为天宁万寿禅寺。
  • 宋高宗绍兴七年(1137),诏改天宁万寿禅寺作报恩广孝禅寺。
  • 宋高宗绍兴二十一年(1151),易“广”为“光”字,改“报恩广孝禅寺”为“报恩光孝禅寺”。
  • 明宪宗成化十八年(1482)赐“敕赐光孝禅寺”匾额。
  • 明毅宗崇祯十三年(1640),南海人张悰修纂光孝寺志。
  • 清顺治七年(1659),遭兵祸,大部分建筑被毁。十一年(1654年)重建,始有今天的建制。
  • 清乾隆三十四年(1769),广州知府顾光主持重修光孝寺志。

前述博文中对唐宋明清时期的寺名变化及演变介绍不多,这里补上。

门联

大门上的对联“五羊论古寺,初地访诃林”,是取自清代李长荣的五言诗“诃林即席成诗四首”之一,原诗是:五羊论古寺,初地数诃林。浩劫千年冷,秋风一巷深。经时蔬笋约,他日薜萝心。郭里如山里,幽栖未易寻。将“数诃林”改成了“访诃林”,更恰当,符合实际。因为柯子树只剩下一棵,没必要数了。

光孝寺志卷十一

《支那文化史迹第三辑》

这本藏于日本国立国会图书馆的《支那文化史迹.第三辑》,第三辑主要收录了广东,湖南等地的寺庙图片及文字解说,开篇即是光孝寺。图书出版于昭和十四年(1939年),根据图片上的标注推测,最早的图片应该拍摄于明治42年(1909年)。

从中可以看出清末民初,光孝寺内是一片萧瑟,很多殿宇被学校或者其他机构占据。

1939年的天王殿

1939年被学校占用的大雄宝殿

1909年的大雄宝殿

六祖瘗发塔

菩提树,六祖瘗发塔

完整版的此书可以从文末分享地址下载。

《光孝寺与六祖慧能》.谢扶雅.1935

中国当代著名的哲学家谢扶雅写于1935年的小册子《光孝寺与六祖慧能》,主要介绍了光孝寺的历史沿革,寺内与六祖相关的重要古迹,六祖慧能传记及思想等。

谢扶雅《光孝寺与六祖慧能》封面

《唐代广州光孝寺与中印交通之关系》.罗香林.1960

作者根据昔年在广州光孝寺的实地研究,贯穿各种有关资料,以阐明自印度经海道传入之经典翻译、宗派构成、植物移植,与义净等高僧经广州赴印度等史实,对摄论宗之成立、传播与关系,及禅宗南派与广州译“涅槃经论”等之关系,均有相当发明。其中所考“首楞严经”之翻译底蕴,与诃子树移植之关系等,亦深为佛学界南怀瑾,及日本石田干之助教授等所推重。(参考自《中华罗氏通谱》特刊 缅怀先贤

罗香林《唐代广州光孝寺与中印交通之关系》封面

其他论文

关于光孝寺的研究,除了上述历史沿革,六祖禅宗等议题外,建筑风格,建筑文化,大殿结构,南汉铁塔等均有涉及。我收集到的相关论文资料有:

  • 广州光孝寺大殿与潮州开元寺大殿比较研究.欧阳雨(硕士论文)
  • 广州光孝寺伽蓝殿建筑研究.何傲天(硕士论文)
  • 广州光孝寺建筑与文化研究.曹劲(硕士论文)
  • 广州光孝寺南汉东西二铁塔铭考释.陈鸿钧
  • 广州光孝寺南汉西铁塔形制考.苏漪
  • 广州光孝寺二铁塔的建造性质.古正美
  • 从光孝寺植物看海上丝绸之路.柏宇亮
  • 广州光孝寺历代住持考述.达亮
  • 依诗读史广州光孝寺题咏述论.钟东
  • 光孝寺六祖慧能迹址考析.林有能
  • 广州光孝寺大雄宝殿大木结构研究.程建军
  • 光孝寺及古建筑构件研究.陈文涛

上述资料分享下载地址:阿里云网盘

SSL证书,部署及相关知识

2024年1月17日 16:18

在老麦的博客看见他有关SSL证书的博文(Certbot申请泛域名证书与续期),想起自己经常需要更新部署SSL证书的一个痛点。每次只是按部就班的操作,这次停下来,全面了解下关于SSL证书的来龙去脉及相关知识。

SSL/TLS协议

Netscape在1994年推出其首版网页浏览器-Netscape Navigator时,推出https协议,以SSL(Secure Sockets Layer,安全套接层)对传输数据进行加密,这是SSL的起源。

SSL利用数据加密技术,可确保数据在网络传输过程中不会被截取,从而能保证数据的安全性和完整性。SSL 协议位于 TCP/IP 协议与各种应用层协议之间。

1999 年经过 IETF(The Internet Engineering Task Force,国际互联网工程任务组)讨论和规范后,SSL改名为TLS(Transport Layer Security)。发展至今已经有TLS1.0,TLS1.1,TLS1.2等多个版本,目前最新版本是TLS1.3。

SSL协议发展历程

协议发布时间状态
SSL 1.0未公布未公布
SSL 2.01995年已于2011年弃用
SSL 3.01996年已于2015年弃用
TLS 1.01999年于2021年弃用
TLS 1.12006年于2021年弃用
TLS 1.22008年
TLS 1.32018年

(数据来源:维基百科:传输层安全性协议,2024年1月17日访问)

SSL协议的基础是公钥基础设施(Public Key Infrastructure,PKI),而公钥基础设施普遍商业运营。

主流浏览器对TLS v1.3的支持情况
(数据来源:Can I use…,2024年1月17日访问)

SSL证书

SSL证书就是遵守SSL协议的服务器数字证书,通过验证域名、服务器身份后,由受信任的数字证书授权机构(Certificate Authority,CA)颁发,具有给通过https等协议进行数据传输的各方(主要是浏览器与服务端)进行身份验证和数据传输加密等功能。

在PKI中,CA是负责发放和管理数字证书的权威机构,承担公钥体系中公钥的合法性检验的责任。

SSL证书的有效期

SSL证书在诞生时并没有效期的限制,可以是5年,10年甚至更久,但随着SSL证书的广泛使用,特别是2005年5月17日由VeriSign和Comodo牵头成立国际标准组织–CA/Browser Forum后,出台了一系列标准,SSL证书的有效期开始缩短。

关于CA/Browser Forum
Organized in 2005, we are a voluntary group of certification authorities (CAs), vendors of Internet browser software, and suppliers of other applications that use X.509 v.3 digital certificates for SSL/TLS, code signing, and S/MIME.

2018年3月,有浏览器厂商试图将SSL证书的有效期从3年缩短到1年,但在CA的抵制下妥协为2年。

2019年,浏览器厂商再次提出同样的提案,再次遭受了几乎所有CA的抵制。

2020年2月,苹果公司在违反CA/Browser Forum标准操作程序,没有呼吁投票的情况下,单方面宣布,决定在其设备上将可以使用的SSL证书有效期缩短为398天(一年时间加上一个月的缓冲期),数周后火狐就宣布跟进,而数月后谷歌的跟进则使得CA机构的抵制没有什么实际意义了。

2023年3月,谷歌仿效苹果曾经的操作,在其“共同前进”(Moving Forward, Together)路线图中宣布,将SSL证书的最长有效期从现有的398天减少到90天,甚至准备向10天的目标迈进。

SSL证书有效期

浏览器厂商为什么一直在推动SSL证书有效期缩短呢?其实谷歌在其“共同前进”路线图对其动机进行了一些阐述:

缩短SSL证书生命周期一方面是为了鼓励证书部署自动化。证书自动化将推动https生态系统摆脱“巴洛克式”(巴洛克式是一种艺术风格,巴洛克的本意就是不规则的,不常规的意思),耗时且容易出错的颁发流程,降低人力成本和工作难度规避人为失误导致的事故。

另一方面,SSL证书有效期的减少,促使网站更频繁地续订证书,而续订的证书会采用最新的算法并进行密钥的轮换,从而将生态系统快速过渡到具备抗量子算法所需的加密敏捷性。

总结起来就是,缩短SSL证书的有效期,可以提高SSL证书的安全性和可信度。

Google网站现用证书的有效期确实只有90天

SSL证书自动化部署

SSL证书有效期缩短,提高可靠性和安全性的同时,却给网络运维人员带了需要频繁更新证书的压力。随着证书有效期可能缩短到10天,证书部署自动化将是未来大势。

对于独立服务器,采用acme协议,可以实现自动申请,验证,签发,安装(更新续签)证书。acme目前已支持很多CA机构,其中包括比较著名的提供免费证书的Let’s Encrypt以及Google Trust Services。宝塔面板等很多第三方续签证书功能的实现基本都是依托acme协议。

对于CDN服务,自动续签证书目前没有太多的好办法。但是一般CDN服务商会提供证书自动续签的功能。阿里云,腾讯云的CDN服务里要实现自动续签证书,需要付费版的证书。又拍云CDN提供免费的Let’s Encrypt DV SSL 单域名证书的自动续签功能。

对于serveless服务(比如netlify,vercel等),一般可以使用其默认的https服务,无需自己部署更新证书。

对于CDN,对象云储存等部署的站点,免费证书如何自动化部署更新?在Github上找到几个不错的开源方案:certd,acme-qcloud-scfTencent CDN Cert Manager

CertD能部署到自己服务器上,支持从Let’s Encrypt申请证书(支持通配符域名,域名解析支持阿里云,腾讯云,华为云等),全自动部署到阿里云,腾讯云等云服务及主机,证书自动续期更新,所有过程支持邮件通知。

CertD支持的部署功能

而acme-qcloud-scf主要借助腾讯云云函数实现通过acme协议的Let’s Encrypt证书的自动部署和更新(Node.js 版本)。证书生成后能自动上传到腾讯云 SSL 托管平台并绑定到相关 CDN 加速域名(如上,腾讯云自带的SSL证书管理更新是付费证书才能支持的功能)。

Tencent CDN Cert Manager,顾名思义就是支持给腾讯云CDN绑定的CDN域名自动更新证书的服务,支持Docker部署。证书提供商自然也是Let’s Encrypt。

扩展阅读:

  1. 谷歌对根CA策略的“共同前进”建议:更频繁地轮换ICA
  2. 阿里云将免费SSL证书的有效期调整为3个月
  3. 腾讯云SSL证书自动化管理方案
  4. 维基百科:根证书公开密钥认证
  5. 又拍云SSL证书服务
  6. digicert:TLS/SSL证书的有效期有多长?
  7. Google:Automate Public Certificates Lifecycle Management via RFC 8555 (ACME)

信息茅房

2024年8月20日 14:00

比“信息茧房”更臭气熏天的,被我称为“信息茅房”——人们只管自己拉、不管擦,而且也不关心别人拉的什么。结果到头来,大家只是把自己想要拉的屎都扔进茅坑里,压根儿没人看、没人交流、没人互动、甚至连看到红点提醒都只会觉得“哇今天又有人拉屎了”——这种群我还真有一个。


疫情封控那段时间,家里长辈耐不住封控的寂寞,搞了一个(更大的)家庭群,把什么远房亲戚都灌进来了。因为来自不同城市,所以这个家庭群一开始以分享自己所在小区的“封控政策”作为话题,聊得热火朝天。当封控开始变得麻木时,2022年爆发乌克兰战争,话题终于被引导了政治上,从俄乌战争、聊到中美关系,大家长们就算没有黄汤下肚也能夸夸其谈高瞻远瞩。

中老年键政总是带有强烈的“过来人”色彩,因为家族群里有体质内的、也有皇城根儿下的、也有天高皇帝远的,所以键政最刺激的也是最受人追捧的就是“听床消息”——我也很好奇,这些听床消息到底是从哪里来了。这些消息都非常巧妙,伪装成另一个聊天群的截图,或是群消息合并转发——截图往往是那种大号字体的界面,极度符合老干部作风;批量转发的消息会更有迷惑性,像是已经在其他群讨论和公开过的消息,再转手的时候会给人一种“有理有据”的错觉。但是你们发现这里面有一个逻辑Bug吗?群消息合并转发的时候其实是没办法转发语音的,所以一旦涉及到合并转发总是大量的文字描述——就像是老干部为了公布消息都突然开始用大段文字输入,而截图里面往往会用老干部的语音转化成文字以表示这是老干部亲口说的,老干部还真他妈割裂。

白纸运动那阵子,因为群里有皇城根儿下的长辈,他们对这件事只字不提,被问到也是表示并没看到消息。而天高皇帝远的长辈呢,就爱聊些直击皇都的“阴谋论”,结果群被炸了。


第二次建群,皇城根儿下的长辈明确要求以后不能再键政,天高皇帝远的长辈倒也知趣,正值疫情解封,很多人陆续被“集体免疫”,群里的长辈也多少有些紧张,担心老年人会不会真的如那些H5页面所说的死亡率极高。所以那段时间开始,关于疫情防控、养生调理、治愈新冠的内容就成了主流。

在这些信息里面,有一条最最长情的,甚至今天还出现过一次的信息,是“越南新冠病毒至今零死亡率,有关国际人士已经获取越南的超级国家秘方”。之所以说它长情,是因为这条消息最早出现在2021年,当时传播这条谣言的台东新北市的女子还被警方侦办(所以你如果有幸遇到这条大便,你会发现它是繁体字内容)。也就是说,这条消息或许真的是从有台湾亲戚的群组里流传出来,经过这么多年还在中老年的世界里熠熠生辉,可见“他们是有多强烈的死亡焦虑”

我为什么会提到“死亡焦虑”,是因为我再度研究起家庭群时,我才意识到一个逐渐的变化——我在《全民智没体》里也提到过这个可爱的家庭群,从一开始的键政到现在的“震惊家里有这个的赶紧扔掉”,他们在被默默地驯化成一个食物链底层的单一物种。当交流变得越来越少,只有发布没有回应成为绝境,这种充满绝境的社交群,俨然变成了“信息茅房”,那他们为什么还在坚持,日复一日地转发未经证实、危言耸听、甚至是早就已经被辟谣过的消息?

我分析了近半年的消息,做了以下奇怪的汇总分析:

类别(统计)数目特征(包含)数目
医疗养生38与长寿相关12
社会事件28涉及AI人像冒充真人3
亲子(孙子)8原视频被举报删除9
文艺5
自然4
政治2
财经1
幽默1
总计87
* 以上数据仅来源于一个“信息茅房”,不作为普遍性结论支撑

其中,社会事件是原视频被举报下架最严重的,特别是标题带有“事关你我”字眼的,几乎清一色被下架。医疗养生的话题最多,而且都和老年性疾病有关,例如阿尔兹海默症、癌症有关。其中几个比较有趣的,是一个用AI制作的年轻男孩的视频,讲述他的成长史,一个“别人家的孩子”最后因为意外去世,落脚点竟然是在“无常”。


这些消息看上去很杂乱,但是里面全有一个支撑他们“坚持转发”的底层代码——“转发给你的亲朋好友,保佑大家健健康康”。医疗养生的内容里,无论是文字、标题、还是视频内容的开场结尾,几乎都有这样类似的“转发话术”,会不会有一种可能,其实内容不重要,而是因为这些长辈觉得这句话才是核心,所以想要通过转发的方式传达自己对亲朋好友的关心?

没有回应的社交便有了第二条出路——独角戏。当他在这个皮囊里自我感动、黑箱操作一番后,只要他得到了满足,否则这个行为会因为没有回应而变得没有意义。它的存在,就好比是豆瓣标注系统,将一本书标注为想读,让后通过广播公之于众的时候,这本书读没读已经不重要的,重要的是我已经让别人知道“原来你想读这本书,你是一个多有品味的人啊”(请勿对号入座,我没有说所有人)。

于是这个家庭群就变成了一面镜子,他们在前面跳舞,无所谓观众,因为下一个人也会转发同样性质的内容,不说一句,但表达的是我是在关心你——别忽略一个重要的可能性,这个人不可能仅仅只有这样一个信息茅房,或许他有十个上百个,他的消息都是转发的,那些还没有变成茅坑的群,还有最初的互动,还能给他自我欺骗的回应。


这就是我说的“死亡焦虑”,这些长辈不是在恐惧死亡本身,而是恐惧自己的存在越来越弱,弱到没人再记得他们。每个人都在寻找“存在感”,不仅仅是这些长辈,我们也一样。看不同的书、综艺、电视剧,买不同的衣服、体验不同的服务,就是为了追求重复生命中的“新奇”,以体验不同从而证明存在。有的人甚至会去追求更加强烈的冲突感,竞技、极限运动、约炮、争吵……性欲、痛觉、甚至是心理层面的苦痛,都是一种证明活着的证据。当这股生命力开始消散,他们会被更强的生命力所吸引——理性会被Drama吸引、冷漠会被热情吸引、M会被S吸引……甚至是一些年老的长辈,会开始对幼童产生性欲上的渴望(联动一下《性癖纵横观》,这就是“生”这个坐标轴的例子)。我们陷入越深的低谷,就需要站在越高的高峰将我们给拽出来,直到生命会像平缓的、不再来回波动的心电图一样趋于平稳。生命力进入到了某种“平衡状态”,就是剧本创作里所谓的“静止=死亡”

长辈每天转发不经验证的消息到信息茅房里,就像是深秋的暮蝉一样,在发出最后微弱的还可以被人听见的叫声。按道理来说,我这里应该自我反省,是不是应该跟这些长辈互动,好让他们获得“存在感”。我有过,但我不是对付不了这些长辈,而是我对抗不了冬去春来的法则。


当然,并不是说所有人都妄图追求外部冲突以获得生命力,还有一些努力追求岁月静好的人,他们希望自己活在一个平稳的世界里——但这些生命力去了哪里呢?那就形成了“黑箱”,在内心全力以赴地演着一场又一场的独角戏。

需要补充的是,“静止=死亡”的生活没有对错,这是一种选择,安稳和熟悉会给人十足的安全感,它当然是好事。只是我需要更强烈的存在感,才决定从这样枯燥的剧本里走出来,仅此而已。

写到这里,才发现这是不仅是一篇“文不对题”的内容,而且还是将我以前写过的内容铺成知识地图的Callback。

中文博客圈的“鸩酒”与止不了的“渴”

2024年8月16日 16:22

积薪的突然关闭引发关于“简中博客圈死亡”的思考。无独有偶,博友@Cyrus 也在思考“互联网的慢性死亡”

当然,积薪的关闭并不是因为“内容”。后来多个视角复盘,是因为社交群关于政治话题的争论,继而引发了上升到个体的人身攻击,最终以“举报你的网站”作为最高效的“制裁手段”请注意,本文并没有在讨论此事。


博友提到“慢性死亡”的时间点,是从2022年11月30日伊始,原因是AI的普及。刚好,我整个2022年都在坚持每日写作,所以也记录到了这个时间节点——疫情封控的疯癫几乎达到顶点、各地被封控的小区居民开始冲击封锁、桥与狼烟、白纸运动……2022年11月30日发布的《权利的本质》,是因为经过了疫情三年,我渐渐意识到封控政策看似是在针对“病毒”,实则像是在进行一场社会整体测试,试图构建边沁提出的“圆形监狱”……

当然,这里不能聊政治,站在“全局”聊政治的,酒桌上、微信群、百度贴吧比我会指点江山、对中美关系指明方向的战略家比比皆是,所以没必要去抢他们的“流量”。


2021年底,我注销了所有简中的社交平台,告别豆瓣确实很痛苦,因为大量的创作内容、观影评论都保留在上面。但随着突如其来无缘由的删除、下架,我意识到简中社交媒体的网络审查最先建立起了这个“圆形监狱”——以至于人们到现在已经自觉地审查、阉割,生怕触怒了圆形监狱的中心“瞭望塔”。

2022年的时候,无论是创作者还是观点互动还比较多,由于那个时候我坚持每日写作,所以每日都有持续的曝光量,因此跟最初的几个博友形成了联系。2023年包括我自己在内,文字创作输出急剧下滑。刚从疫情三年恢复正常后,人们开始外出、逃离、重构生活,创作本身不是可以直接带来收益的事情,所以写作也因此搁置。直到今年,我重新恢复创作,才发现各个简体中文博客聚合平台,几乎清一色的“技术文章”。

技术类文章并没有好坏,它的工具属性更强,就像是五金店成列的五金商品一样,人们并不在乎五金店的店门是否华丽——因为他们是带着一个明确需求进店,得到答案——买到商品,就完成了一次闭环。所以往往同一个资讯(哪怕是软件更新了),都能在不同博客以不同的方式看到,但在标题上都巧妙地用了同样的便于搜索到的关键词。


博客需要流量,这毋庸置疑——否则我不会坚持“写博客是为了自己就别他妈发表出来啊”的观点,这也惹到不少人、甚至还有人后台私信问候我全家的。这是写博客的最底层的逻辑——如果不是为了被看见,那大可不必贴出来,不然为何还要精心地准备一个“关于页面”,希望可以得到认同和肯定。

同时,创作能力存在一个明显的周期性——除非你能坚持,否则这个能力会以正弦曲线的方式运作。如果你是一个“痛苦驱动型”的创作者,这种创作能力则需要依托你的经历,否则没有足够的情绪作为养分,创作的内容就无法在情感上获得共鸣。(相关阅读《创作灵感从哪里来的?》

另一些是“知识驱动型”,例如在看完一本书之后,因为其中的某个观念结合了自己的人生经历,从而有了新的想法。这种驱动力极其依赖于“吸收”行为,如果长时间处于碎片化的信息数据里,一旦形成信息茧房,就会停止思考——抖音可不会帮你引发连锁思考,除非你希望在听到那些魔性的笑声之后,突然开始思考这种笑声是如何让观看者进入到“数据戒断”状态的。失去情绪压力(比如疫情封控带来的负压)或是阅读能力和经历的减少,都有可能减少文字创作的频次。

以上,是人作为创作者必然会经历的“周期性”。特别是当一个人在面对比写作更高层级的事情时,写作如果不是“赖以生存”的行为,那写作停滞就是必然的。而在这个过程中,也有人会选择有意识地恢复写作,或是在这段忙碌的经历中记录下值得延展的灵感。就算没有创作欲望,也有可能通过表达欲、被关注欲或是表演欲的形式呈现。


不过,区别于人,出现了另一种可以持续保持逻辑性思考的“创作者”——AI。一开始,我把AI比喻成“巴别塔”,人类第二次有机会可以将不同文明、语言、认知形成统一。如果说第一轮巴别塔的倒塌的过程,是因为上帝制造了“不同语言”让人与人的交流变得困难,那第二次巴别塔的建立,正是在试图突破这一限制。人类无论是知识储备还是思维逻辑,都无法比拟AI,它像是一个被人类驯化的“准神”,通过他是否真的可以挑战“神”这个概念?或许这就是引发第二次巴别塔倒塌的关键——再一次引发人与人之间的斗争——宗教、文明、观念、地缘政治的冲突,都会是其中的形态之一。

甚至是AI结合纳米技术,通过吞服的方式进入人类身体,时刻监视人体的健康。这个时候AI提醒人类应该进行治疗的时候,人类到底是应该听信AI?还是发挥“自由意志”拒绝就医?如果真的如此,那人类还是否还拥有属于自己的“自由意志”?

当然,这是更高维度的、几乎接近形而上的哲学命题。对实际的简体中文博客——巴别塔的意义,就是人类误以为自己找到了一个可以与“神”平起平坐的方式,但通天塔是否真的能通天,在倒塌之后成为了不可被证实的传言。AI对简体中文、甚至是全世界的文字创作者带来了冲击吗?我想,你通过对比这几年的简体中文博客聚合,就能感觉到浓浓的“机械感”。


比如,我就随手拿了今天聚合页的几篇文章投喂给ChatGPT,让它分析文章内容是否由AI创作或AI参与了创作。10篇文章里,其中有7篇都得到了一样或类似的结论:

由于分析过程涉及到原文的具体内容,为避免“指名道姓”,恕无法贴出所有内容

而剩下三篇,包括我自己的影评、其他博主的游记、毕业感想,却因为有足够的“情感”,所以得到以下结论:


我把AI创作或是参与创作的作品,比作博客创作者的“鸩酒”,并不是因为它有毒,而是它没办法做到真正的“止渴”。流量是大多数博客仍在追求的标准,这意味着可以带来收益,当但这个流量是“鸩酒”时,那换一杯别人提供的“鸩酒”,是不是也可以得到一样的结果?

如果当“鸩酒”的体量继续扩张,直到搜索引擎的前几页都是“鸩毒”的时候,正如博友@Cyrus 的思考一样:

可以设想,在未来这种现象会愈演愈烈,直到网上充斥着大量AI生成的“高质量”、“逻辑清晰”、“有理有据”的文字,检索信息的难度将直线上升,而效率直线下降。

那个时候,是否跟奶头乐的抖音一样,当一个内容引发流量关注后,成千上万的账号通过模仿或是再加工地产出内容,那这个信息茧房到底是科技的弊端?还是人们“作茧自缚”?


2022年,AI刚开始普及的时候,我跟朋友辩论了一个命题——AI革命会让文字创作变得更丰富、还是更平庸。我支持“平庸”,不仅仅是因为我预言了“劣币驱逐良币”的可能性,而是我意识到,真正造成信息茧房的并不是别人,而是我们自己。把这个问题抛给AI,会不会更有讽刺性呢?或许是,或许我们也可以抛弃思考。

我们该抵制的不是AI,而是“鸩酒”堆砌的抱团和联盟,它们因为没办法“饮鸩止渴”,所以才需要更多创作者的“血”。

借由《EVA》里的一句经典台词总结吧:

人类的敌人最终还是人类。

科技进步对世界格局的影响

2023年9月7日 12:37

这几年,中国确实站起来了,有钱有枪,腰杆也硬起来了,成了美国拼命打压的对象,成为超级大国美国拼命打压的对象,也说明了中国的实力。

我一直都觉得,中国重新强盛起来是因为地大,人多,黄种人智商比较高,再加上大量的国家教育系统培养出来的足够受教育人群,所以这是强大起来的根本。

不过前几天忽然意识到其实互联网,特别是移动互联网对这个世界巨大的影响力量。

互联网,特别是移动互联网,让信息极大的流动起来。信息生成、获取和传播变的前所未有的便捷。人的想法受到所获取信息的影响,而想法决定了行为,人心就是政治。

在 20 年前,我还是小孩的时候,觉得当官的很多贪官污吏,各种黑恶势力勾结。
过了这么多年,我从中部地区来到了东部沿海,有一部分区域差别的因素,也有一些时代进步的因素,政府官员贪污的事情似乎是没有那么绝对了,黑恶势力也很难看到。

除了人们素质提升,社会进步之外。移动互联网也是这进步的一个重要推动因素。在信息相对凝滞难以扩散的时代,黑恶势力往往在小空间有绝对的权利。但是到了信息流动快速的时代,黑恶势力的行为很容易造成大量人群的关注,行程社会热点,进而推动公平正义。

再到更广阔的世界来说,信息的流动加速增强了不同地区的人们之间的相互了解,更多的时候,大量的不必要的矛盾都产生在互相不了解上。增进了解减少很多冲突。

❌
❌