FoxThinking #21: 如何将用户「拉下水」
by SouthFox
2026-03-14
这位用户,你是想用这个金功能还是那个银功能呢?都不是,你说你想自己写?
配置文件一般承担着记录状态的功能,然后应用会根据状态作出决定去改变某些实现,例如调整某些参数 或者是在 A 或 B 的功能之间切换。大部分情况这都够用,可惜总有撞到各种小脚趾的情况,例如有些值 是想要动态决定的比如二进制文件的路径在多台设备中路径不相同的情况怎么办?只能在每台设备上为其 单独写配置文件了吗?如果这个时候能用 if 语句就好了……
对于功能,很多时候用户想要什么新功能该怎么办?最直接的就是开发者着手集成,然后开放配置给用户, 用户在配置中启用并填入相关参数就能启用了,类似 Miniflux 里的集成(Integrations),很多时候这 都够用了,不过这种方式只有「勤奋」的开发者能实现……我这种「懒惰」的开发者只会决定将配置当成代码, 然后在应用的相应阶段运行这些代码。例如拿我现在正在开发的 ActivityPub 应用来说,当应用收到请求的 时候想发出通知怎么办?这里的情况很复杂:这个请求可能是 Note 代表收到新帖子,帖子中可能是 at 用户的帖子, 也有可能是 Follow 这种新关注请求,也有可能是 Like 这种对用户之前帖子的喜欢请求。对于通知,用户可能想 用 Ntfy, Gotify, 电子邮件甚至飞书接收请求,比起一个一个去实现,我这种「懒惰」开发者打算在配置中定 义一个 Hook 配置的列表配置,不是放字符串而是……放函数!没错,是函数,这个函数接受的参数就是应用接受到的 请求。想要根据类型判断?直接拿出 type 进行比对就好了,想要往特定的服务发送信息?没问题,直接 导入 requests 包,想往哪发就往哪发。类似这样:
;; config.hy 这其实是用户编写的配置文件
(import requests)
(setv ingress-hook [])
(def like-hook [payload]
(when (= (get payload "type") "Like")
(requests.post
"https://ntfy.example.com/mytopic"
:data "收到一个新 Like !")
(.append ingress-hook like-hook);; app/app_config.hy 应用程序读入配置文件
(import hy)
(setv ingress-hook [])
(with [f (open "config.hy" "r")]
;; 是的,直接 eval 用户的代码,相当于将用户的代码粘贴到这里执行
(hy.eval (hy.read_many f));; app/boxes.hy 应用程序处理请求的代码
(import app app_config)
(def process_incoming [payload]
(for [f app_config.ingress-hook]
;; 就这么简单,直接往注册 hook 的函数塞参数执行就好了
(f payload))
...)是的,这绝对有安全风险,这也是把用户拉到和开发者同坐一条船必然要承受的风险吧,这种配置也是代码也不是什么新 鲜的思想了,我就直说了吧:这就是 Emacs 一直在干的事,配置不是配置,而是应用的一部分。
阅读
Slay The Spire 2's placeholder art should be a lesson to all the developers c...
杀戮尖塔二在最近发售了,我喜欢里面的拿看起来像是用画图画的用来凑数的美术资源,这种风格也变成了杀戮尖 塔的一部分了,我看过的一些主播都会开着这种测试画风的卡面进行游戏,因为确实更令人快乐啊。
Boy I was wrong about the Fediverse
是的,五年联邦宇宙经验后,我也发现,其实联邦宇宙是一个获取「新闻」的好地方。我总能通过一 些「口口相传」获取到「真正」的新闻。这就是二十世纪九十年代承诺的互联网,虽然来晚了,但至少 已经在了。
PILK #3 | Facebook is absolutely cooked
算法驱动的平台的另一个侧面就是……它已经不会管帐号的初始默认状态了,苍白、空洞,待用户把自己的「精气神」填入 进去后像夜幕降临后的吸血鬼一样活过来。
Why don't Indians read for pleasure?
For a large part of India, reading has never been detached from purpose. It is tied to utility. It is tied to survival. In a country obsessed with competitive exams, reading must promise a return on investment.
在印度大部分地区,阅读从未脱离过目的。它与效用挂钩。它与生存息息相关。在一个痴迷于竞争 考试的国家,阅读必须承诺投资回报。
真是不可思议相同情况,这或许是高速发展的社会的「趋同演化」吧。
A Decade of Docker Containers
我在想,深夜中的一个开发者对着终端的 docker ps 输出的心态,和一个在港口塔台上的操作员面对眼下
装满集装箱的货轮的心态,会不会有相同之处?
港口永不眠。
Rebasing in Magit
很多时候 magit 给我的感觉就是 ?!魔法!? ,很多文章都说了 magit 的好,但我还想加一点就是 magit 其实 并没有隐藏掉在底层执行的 git 命令,可以很轻松调出来之前执行 git 命令窗口看看执行的命令借此学习背后 的 git 。
I Still <3 The Internet - by Delia Cai - Deez Links
I love the internet because I love that a random set of clicks I made as a teenager led me to a blog that has become one of the few constants in my life.
我喜欢互联网是因为它藏着奇妙的际遇——年少时随手的几次点击,竟让我撞进了一个博客,从此它成了我生命 中为数不多的底色。
I still love the internet because despite all the brain rot and soul-sucking algorithms, you can still find your people.
我依然热爱互联网,因为即便这里充斥着让人的「脑腐」信息和吞噬灵魂的算法,你依然能找到属于你的人。
kubernetes-el Compromised: How a Pwn Request Exploited a Popular Emacs Packag...
之前 emacs 生态就在慢慢收紧一些对 shell 运行的情况,例如默认异步评估 shell 指令或者进行警告啥的,毕 竟 emacs 这种可能用上会拉取一两百个包的配置来说,就这么相信来用没出问题真得是纯凭幸运。这次幸好 是 Melpa 的维护者发现不对劲挡了下来,攻击者也很高调没有小心将恶意代码隐藏,否则真就不知道会出现什么后果 了。对于我这种追求滚动更新的人来说,确实得好好想想要有什么策略提升这方面的安全性了……
Present day, Present time
有强度的工作 + 有点偏离常态的身体状态(并不是很明显的疼痛、疲惫而是那种隐隐约约的不适?) = 成功 摧毁了作息,每天回来唯有暴睡……空闲时间只能简单摸点小功能,不过至少本博客现在有反链显示了(感觉没什么用),能显示其它 提到此博文的博文;完善了引用的语法解析(我就是欠折腾了才选自己取折腾 org-mode 的解析),之后应该会多加利用引用功能吧。

