静态博客浏览量和点赞功能的需求与方案

本文全文由 AI 生成。

需求

博客是 Hexo 生成的纯静态站点,托管在 GitHub Pages 上。静态站本身没有后端,想实现两个功能就必须引入一个数据服务:

  • 浏览量:每篇文章被看了多少次,显示在文章元信息里;
  • 点赞:读者可以给文章点一个赞,可以取消。

约束和期望:

  • 尽量不花钱;
  • 数据归自己,不寄希望于随时会倒闭/被墙的第三方计数服务;
  • 不会被 uBlock Origin 这类拦截插件拦截(常见统计域名几乎都在 EasyPrivacy 名单里);
  • 顺带把评论功能的后端也备好,以后想开就能开。

方案选型

对比了几类方案:

方案 问题
不蒜子 服务端经常性故障,且被拦截器收录
GoatCounter / Umami 云版 好用,但脚本域名同样在拦截名单里,且只有统计没有点赞
Plausible 等隐私友好统计 不被拦,但是付费,且同样没有点赞
手机自建服务器 免费可控,但家宽无公网 IP、设备需要 7×24 在线,稳定性堪忧

最终选择自托管开源评论系统 Artalk:它原生提供页面浏览量(PV)和页面投票(赞/踩)接口,顺带送一整套评论系统;配上免费托管和免费数据库,总成本为零。

整套架构:

1
2
3
4
5
6
7
8
9
GitHub Pages(静态前端)
│ fetch 调用公开 API
▼
Render(Web Service,免费)── 运行 Artalk 官方 Docker 镜像
│
▼
Neon(Serverless PostgreSQL,免费)── 持久化存储
▲
UptimeRobot(免费)── 每 5 分钟探活,防止实例休眠

各组件的分工:

  • Render:托管 Artalk 后端。免费实例 15 分钟无访问会休眠,由 UptimeRobot 探活保活;
  • Neon:Render 免费实例没有持久磁盘,容器重启数据就没了,所以数据存到外部 Postgres;
  • UptimeRobot:定时 HTTP 探活,顺带充当宕机监控,服务挂了会发邮件告警。

关键配置

Render

  • 镜像 artalk/artalk,区域选离读者近的(如 Singapore);
  • 不写配置文件,全部用 ATK_ 前缀的环境变量配置,要点:
变量 说明
ATK_DB_TYPE / ATK_DB_HOST / ATK_DB_PORT / ATK_DB_NAME / ATK_DB_USER / ATK_DB_PASSWORD / ATK_DB_SSL 对应 Neon 的 Postgres 连接信息
ATK_APP_KEY 随机长字符串,用于登录令牌加密
ATK_TRUSTED_DOMAINS 博客域名,空格分隔多个;后端据此下发 CORS 头

数据通路(前端接入)

Artalk 官方的 Artalk.init 会强制渲染整个评论界面,没法只用点赞,所以前端直接调它的公开 HTTP API(与官方前端同一套接口):

  • POST /api/v2/pages/pv:上报一次浏览,响应里直接带回最新 PV,后端按 page_key(文章路径)自动注册页面;
  • GET /api/v2/comments?page_key=…&site_name=…:公开接口,一次拿到页面 ID、赞数和浏览量;
  • POST /api/v2/votes/page/{id}/up:投票;同一 IP 重复请求一次为取消,响应带回最新计数。

页面注入一小段原生 JS 完成三件事:上报 PV、渲染“👍 N”按钮(点击投票/取消,状态记在 localStorage)、把浏览量和点赞并排显示在文末。评论区暂不加载,以后需要时把 Artalk.init 加回来即可。

管理后台

Artalk 后台(/sidebar/)里需要做三件事:创建管理员账号、添加与前端配置一致的站点名、把博客域名加入可信域名。访问统计和点赞数据都能在后台看到。

现状与遗留

  • 浏览量和点赞已经可用,数据存在自己的数据库里,随时可导出;
  • Render 免费实例重新部署时会有 1~2 分钟中断,期间点赞请求会失败;
  • 评论功能后端已就绪,前端按需开启;
  • 依赖清单:Render(免费 750 小时/月,单服务常驻刚好够)、Neon(免费额度充裕)、UptimeRobot(免费 50 个监控位)。

关于 AI 科研的几点判断

关于制药行业

按照我对制药行业的一些浅薄了解,研发一款新药无非两个路径:

  • 把各种物质(可能是人已经吃了很久的东西)在人身上 xjb 试,找它的效果
  • 把某个生理机制研究明白之后设计药物定向干预

然而第一个路径和第二个路径的第一步都需要大量的实验,AI 或许能将二个路径的第二步极大加速,像 AI 预测蛋白质空间结构一样。

上面这个判断实际上适用于一切自然科学,因为这些领域的进展都需要物质性实验的支撑。当然,如果 AI 和人类科学家有效合作,总体上科研是能够极大加速的。

AI 能代替人科研吗?

我的判断是不行。因为“提出理论”是一个需要 taste(品味、审美)的活。比如爱因斯坦提出广义相对论,很大程度上只是遵从了数学上的对称性,这个理论甚至是在被提出很久之后才找到能够证实它的现象。

所以 AI 在这一轮革命的边界有可能是,AI 非常非常善于解决问题,但是它缺乏对于“什么是值得研究的好问题”“什么是更符合直觉的理论”之类的 taste。

同时根据“压缩即智能”之类的信息论观点,很容易做出 LLM 难以从人类现存的文本中学习到“创建全新理论”的能力的判断,至于这个问题是否确实如此悲观,目前还有很大争议。AI 现在已经做出的数学成果似乎无非只是在人类现有的框架上完成了大量的基础性工作,数值很强但是机制欠佳,在这点上似乎也不能高估 AI 的能力。

AI 会让科研失去乐趣吗?

不会。人类每次发明新工具都会失去一些“亲手解决某些困难/问题”的乐趣,不久后又总能再别的地方找回来,只是获得乐趣的形式和载体很可能会变化。除非 AI 科研强到可以完全替代人类。

关于被安排任务的成本的讨论一则

Q:今天好累,感觉干了很多没有意义的事。

A:但是如果你实现未来的目标需要用到你的党员身份的话,那不也是有意义的事吗。

Q:但是党课很形式主义,氛围我也很不喜欢。

A:我明白。你只是不认可它,你觉得党课的内容“本可以更好”,或者这种没有意义的事“本不应该”浪费你的时间。但是我们在心里设立的那个“按理来说”的可能性往往只是可能而已,在现实中就是不可能。社会上这种事情太多了,如果所有的“本该”都能实现的话,人类早就大同了。

A:我建议你这么想。如果一件事是达到你目的绕不开的,那么它就是死的成本。这样想的好处是,一来它就不再是“没意义的事”,另一方面是你就可以退一步考虑要不要直接放弃你的目标来规避成本。我们总是忘掉有些事其实是可以权衡、可以放弃的。

Q:我也不是理智上不接受,只是觉得这种事情没有带来价值感。

A:我懂你意思。实则这件事因为没价值感而带给你的疲惫,也是需要考虑的成本的一部分。

后 AI 时代社会的几点基本判断

  1. AI 削弱“脑力中产阶级”的稀缺性,技术工程师无产化。届时他们所具有的技术能力将使得他们成为新的推动社会进步的力量。
  2. 数字生产力极大充裕,数字知识产权消亡。届时创新将成为人的自由和欲望,不再是牟利的手段。平等的社区共同体将在这样的土壤上繁荣。
  3. 传统互联网生态的护城河只剩下用户生态,类似封建地产,只不过把地租换成了数字消费。届时(同时考虑到物质层面的富裕)普罗大众需要的则不是人身自由的解放,而是爱欲自由的解放、生活方式的解放。
  4. 公司内大部分岗位被替代,届时公司作为一种传统的劳动合作形式将被少数人的直接合作或是独立劳动取代。
  5. 权力是对人的异化,而权力意志无法维持自身,一切权力要么腐化要么僵化的归宿便是其证明。AI 将代替传统政府作为“公共治理者”的角色,杀死传统政府作为“统治者”的角色。
  6. 生产自动化程度极大提高,科研投入比重加大,科研成果产出极大加速。届时“勤劳”“智力”等传统价值被削弱,取而代之的是问题意识和自我动力等反思性的高阶能力,此即人和 AI 的最后差异,也是人实现主体性的最终环节(人人都是哲学家+工程师)。

而 AI 在各行各业的广泛应用将是未来力量对比角逐的第一个(或许也是最后一个)赛道。


和 Graygoo 交流,上面的的判断还有以下问题需要考察:

  1. 为什么国内生产力这么发达却没有共同富裕?
  2. 上世纪德国的前中产阶级为何法西斯化?
  3. 公司的消失或许不会在财产私有被废除前发生,但是其样貌一定会发生巨大改变。
  4. 国家作为公共暴力的消失也不会在财产私有被废除前发生。
  5. 人的主体性的马克思主义界定。

回忆高考

高考前精神状态堪忧……

我总是不可避免地将自己征召进那云的背后,那朵积蓄三年而在短短三天内倾泻的乌云;不可避免地想象自己不曾望见的天空,不可避免地以回望的姿态阅读着我这正被以绝对的进行时呈现在大地屏幕上的故事。

故事当然是期于被阅读的,读者却各怀着鬼胎。被安置在家长之位的无辜成年人,将一切挡在身后的同时幽幽透露着对学生与家庭未来的无能担忧;对一切习以为常的老师,却不幸地与学生仅有着宏大但从不具体的瓜葛;制度的设计者和操作者,为了人口再生产的可操作性,又牺牲了我们这些被操作者的多少热忱与忧虑;那深邃的历史的背景性目光,又何曾流露出对于我们和他们这些不幸者的哪怕一丝怜悯?

人类的悲欢并不相通,我的故事似乎只能由我一人阅读——如果我可以的话。然而我心中又总是对此抱有怀疑,这故事的结局太过耀眼,任何对它的言说都不可避免地被符号性的暴力奠定基调——考试结束的那天将是对高三生活的谋杀,而出成绩的那天将是对高三生的谋杀。自己书写的故事将在竣工的时刻永久把作为阅读者的自己拒之门外,何尝不是卡夫卡式的悲剧?然而我们往往乐意地上演,迫不及待地将遍体鳞伤的那个自己封进石棺,装点一副崭新的面孔仿佛痛苦已被救赎,而对那总是逃窜入梦的高考的阴魂避之不及。

所以我常常想为现在的自己说几句公道话,因为我现在经历的痛苦迟早要变成别的东西,变成成功、失败,变成智识,或是故事,津津乐道的,抑或不愿提起的。或许这样的尝试也终究失败吧,考试太过善于把仅仅是想为自己保有一点体面的可怜人们抛入深渊,毫不留情地剥夺最后一道心理防线之上我们苦苦寻求来的一切。生活不常,人心善变,我或许早已在这深渊中被谋杀许多回。夸夸其谈自己的认识或许容易,抒写自己的迷茫何尝简单。谨以此文献给那个被遗弃于迷雾之中仍尽全力瞪大双眼的,曾存活于现在的我。

(高三痛苦)

依旧周日游西工大。

啊!我不曾直面这

生长在迷雾中的

黑暗裂隙


那不曾吞噬或吐出

不曾运动或变化的

棱角分明的碑

是缄默的世界


生活无基质的经纬

流变的是海的浪涛

沙的消长 云的去来

而不知我身在何处

将去向何方


我不曾直面这迷雾中的黑暗裂隙!

耀眼的黑色光芒

打破了万千思绪

我认出了它身上

和我一样的孤独——

只策马向它发起冲锋

(高三迷茫)

作于春天的西工大。

天终究是没有晴

还好雨停了

春天的花儿也开了

红的 紫的 白的 粉的

都不认识


还好我完成了春天的创作

再次找回被遗失的答案

把孤独安放进居所

习惯一个流动的生命


不开心到底是什么病

鼠还是不明白

失眠

床是今夜孤独的站台

长椅上坐着滞留的旅客

非我流连于此地

只是这人生的旅途确无出口


幸有安眠药载我断去与今日的瓜葛

为流浪的生活锚定一点安宁:

闭上眼睛就到明天


但那隧道深处还有无数个日日夜夜

又何时才能走出这幽暗的轨道

再见到头顶黑色的天空?

诗

或许是当时最满意的一首。

作于暑假。开学后的模考是当时最好的一次。

浓稠的 绵密的 爱

晦暗的 隐匿的 梦

风云自在卷舒

引我去那

地图上不曾存在的出口


若我仅仅能不绝望于现实

朋友,请牵起我的手

让我们共舞这青春的风尘

享受昨天的明天,和明天的昨天

白鹿原

忆樱雪喵。

往事总是在回忆时被赋予意义.jpg

去年除夕,蹭白鹿原滑雪场除夕不限时票优惠。八点多被家长叫回去,人行道上堆着连着下了几天的雪,足以没到膝盖,沿着车道边走了十分钟到了公交站。

天已经黑了,原上还在下雪,只听得见平稳的空气声和我的脚步。公交站只有我一个人,拿着一块即将没电变成黑砖的手机,等三十分钟一趟的公交车。

公交车还有多久来?我不知道。手机能撑多久?我也不知道。不过我想也没有公交司机会在除夕夜不让一个没钱的高中生坐车,也就释怀了。

我在公交站附近散步。白鹿原不是山,是一个黄土堆成的大土包。上原的路上几十米就是一处大弯道,走几百米却不见一个岔路口,一路上只有两个小区,除此之外最多的是土坡或峭壁,还有一个很大的、没人的学校,还有一个派出所,还有一个看守所。然后我在公交站外三十米处大路边看见一座阴森的宅邸。是荒宅?是凶宅?是古迹?听得风声森森,我害怕又好奇,勉强打开快没电的手机,开闪光拍了张照。

P1

终于还是等到了车,车上只有三五人,司机严肃地让所有人抓紧前面座椅的椅背。我也不奇怪,联想到上原的时候就在中途的公交枢纽站换了一辆后轮缠铁链的公交车,并且一路慢爬,压得身后四五辆车直按喇叭。一路上七八个站,要么没有人,要么有一个人上车,全是老人。

至于那天滑雪的经历,早已悉数忘怀,然而一路上的怪谈般的经历却潜伏着,萦绕着,一看到那张照片,那幽暗的公交站便席卷而来。

今年除夕,再蹭白鹿原滑雪场除夕不限时票优惠,心境已大不相同。六点多就被叫回去了,到公交站的十分钟路程,几次想到那宅子。到公交站,强烈的好奇驱动着我的双腿再向前,,,,,,,

md 绷不住了。

P2

期待一年的滑雪,早起坐一个半小时的地铁,黑暗中等公交,原上的风。那奇遇和怪谈就这样被毁了一半。或许只是变得更怪了。

我又想起,当时在青岛集训,那是 2024 年的最后一天,我和绝帆、hyt 临时起意,打车去青岛临近郊区的偏远地段找了个神秘羽毛球场馆打了几个小时。结果回去的时候,等了半个小时都没有叫到车。我们心一横决定走去最近的地铁站,没记错的话是中国海洋大学站。我们没想到 byd 青岛在这看着像环城高速的地方就没打算建行人设施,我们一开始沿着路边的绿化带走,后来沿着车道边走,穿过一座或几座桥,走过一段下沉路段,横穿了几个双向高速六车道。全程没有人,只有一辆大巴车从我们身旁一米处高速驶过前,按了下喇叭。到站时三个人的手机电量加起来不到 20。然而我们在路上唱了歌,聊了一路,到站旁边买了一份烤冷面,吃到嘴里才发现自己已经很饿了。

我曾想着等我长大了一定要回青岛看看,想开车去那双向六车道转转,看看我们当年走过的路。然而经历了今天的事我才打消了这个念头。我不想看到那段路其实很短,或是,万一建了人行道或天桥呢?

白鹿原。听说每个人的心中都有一片圣地,我的可能就是白鹿原。一年去一次,一次盼一年。然而我能记住 240 路公交车的每一站,途中的每一个弯,每一段峭壁上的护栏的形状。我能看出这段路和去年的这时候相比,哪里好像不太一样。那不像西安的城墙根,不像钟楼,我骑上车很快就能到。白鹿原我一年只能去一次,然而我闭上眼睛,就知道它在那里,并且知道明年的除夕,我还会去到那里。

或许明年的除夕我不会再去了。白鹿原滑雪场的雪质很烂,要不是离市区近,根本没有人会把它作为滑雪的地方。明年我可能去照金、鳌山,听说北京也有很多很好的雪场,抑或是我考到了东北甚至新疆的大学呢?那也不算坏。

唉。滑雪其实于我也不算什么。除开一年只能体验一次的珍贵、年年进步一点的期待,也只剩滑雪-雪-东北-[数据删除]的某种无意识转喻了。

然而我闭上眼睛,还是知道白鹿原它就在那里,在等着我。我于是才能遁入梦乡,迎接我变成老鼠以来的第一个新年。