阅读视图

发现新文章,点击刷新页面。

周报 #79 - 清迈旅居、曼谷之行与 Follow

《Photograph - Ed Sheeran》

前言

weekly_review_20241129

本篇是对 2024-11-042024-11-28 这几周生活的记录与思考。

10 月底又独自回到了清迈开启了两周的旅居生活;后又去曼谷参加了 Devcon 和我们厂举办的 Side Events/Party,三周似乎都在奔波,心境却好了许多;回杭后又回到了珍贵的日常,并且在筹备重要且有趣的事,生活似乎也有了轴心;还有很多有意思的事。

清迈旅居

10 月初在清迈待了两周,不过主要是和学姐一起,更多是旅行的心态,见到了许多风景顺便作为 mentor 在 Invisible Garden 上了几节课;中途回杭两周集中处理了工作和各种事(比如拔了三颗智齿,做了牙周刮治等),又重返清迈去参加 Invisible Garden 活动。

珍贵的独处时刻

果然自己一个人的时候几乎就没什么出门的兴致了,大部分时间都在住所里写代码、办公、开会、写博客,偶尔出门吃个饭或去 7-11 买些生活用品。第一周还略有些许久不出门产生的带些惯性的消沉,第二周开始就好很多了,能够更专注于手上的事,也有了更多时间空间思考。

可能并不那么明显,自己的状态其实很依赖静静坐下来写字做事的时间,但随着工作生活都日渐复杂,这样的时间也越来越少,所以甚至是有时在状态达到一个负荷的时候会熬夜写周报,更像是梳理自己生活的一种解压的渠道,是我有且仅有的心流时刻。

这一周多也思考了很多,关于未来要去哪个国家或是城市、关于感情、关于自己的性格中缺陷的部分以及想成为什么样的自己。似乎都是很大且并没有明确答案的事,但似乎开始了条分缕析的探索后一切也都更加明朗了起来,做了一些决定。

又见 Vitalik

meet_with_vitalik

月初借着 OpenBuild 的机会跟 vitalik 一起吃饭、近距离闲聊(好幸运一个月内见到了两次!),听到了他创办 Bitcoin Magazine、Dropout、在柏林 Bitcoin Kiez 和自由主义者们一起生活、萌生 Ethereum 想法等很多有意思的事,了解到了他作为“v 神”这一符号背后更真实的一面;还聊了一些关于开源的想法。

很有趣的是问他在高密度参加完曼谷 Devcon 各种活动之后会做什么,他说想找个没人找得到他的地方自己待一阵子。

人总还是需要独处来恢复能量的,v“神”也不例外。

曼谷之行

devcon_lantern

完成了清迈 Invisible Garden 的活动之后,又前往曼谷参加 Devcon 和我厂举办的一些 Side Events/Party,见到了好些同事,因为都是远程办公,我这一年多像是集邮一样大部分同事都面基过了,会更能感受到一些亲切感。

跟着我司同事 Songkeys 很 E 地做了两天 DevRel,比做 Dev 累多了,不停拉人讲话交流。但也遇到不少有趣的人,比如跟从澳洲来的 Firefighter 介绍 Follow 和 Open Information;和肯尼亚来的 DJ/Radio Maker 讨论应不应该学 rust;还有很多有意思的事。

活动结束后和 Songkeys 没聊过瘾还一起在酒店继续下一场,从童年、生活、情感聊到前端、开源、职业发展,硬是通宵聊到早上八点多(作为我司著名不睡觉星人熬夜能力确实不相上下)。

关于 Follow

follow_shanhaiwoo

这次带着一个小小任务,去清迈山海坞摆摊了我们的 Follow 应用,因为也还比较临时,没来得及准备什么物料,于是向隔壁的小伙伴借了一个他正在办公用的便携显示器,直接展示了出来,效果意外地不错,有挺多路过的人来问的,还发了一些邀请码出去,也遇到了很多已经是 Follow 的老用户过来夸一下说我们团队做得很不错的。

innei_about_follow

看到 Innei 发的关于 Follow 的推文,自己其实还是有几句话想说。

Follow 从一开始的爆火和快速增长,到慢慢有了一些来自用户觉得不够好的声音,其实也是走过了一个互联网产品从 0 到 1 的必经之路。

从内测开始使用 Follow 已经三四个月了,参与开发也已经快两个月(虽然主要做的其实是 RSSHub 这一端和相关的一些功能模块),不论是作为 RSS 老用户还是开发者的角度来说,真的能感觉到 Follow 已经很棒了,尤其是作为一个从想法萌生到现在也不过半年的一个产品。

作为小团队的产品没办法一下子处理完所有 Bug 和一些功能需求,为了保障用户体验也只能借助邀请码逐步扩大用户规模,期间有大大小小的问题,但一直在努力迭代和改进了,开发群里也常常深夜还有很多讨论,希望大家能够给予更多耐心。

follow_sspai

最近也在少数派首页 App+1 栏目发布了一篇系统性介绍 Follow 的文章 —— 「App+1 | Follow:信息获取的另一种形态」,也算是自己参与开发、作为重度用户使用并且写评测文章、横跨了 Follow 产品的各个环节的有趣体验了。

以及 Follow 移动端适配 & PWA 版本最近上线了!可以用手机浏览器打开 https://app.follow.is 添加到主屏幕使用,没有原生 App 那么丝滑但已经很好用了!可以试试~

个人生活剪影

油画棒课

oil_painting_live

回来的第一周陪学姐去上国美夜校的油画棒课,觉得总是坐家长区有点无聊,决定上手了,一份学费两个人学。

oil_painting_work_02

oil_painting_work_01

找了两张在泰国的照片对着瞎画,新奇的体验,以下是两张对比图,还被老师夸了。

oil_painting_display_wall

家里也有一面一起画画填充的展示墙了!

其他

RSSHub 开发实践

写了一篇关于 RSSHub 中集成 Telegram 频道 RSS 订阅实现与部署方案的文章,感兴趣的可以看看:

还上了自留地频道!!!有一种上电视的感觉。

懒猫微服

lazy_cat_pic

收到了懒猫团队送的懒猫微服,体积、外观和质感是真的好,研究了下开发者文档,打包上架了 RSSHub 应用,整体体验还不错,尤其是内置外网穿透这一点,少了很多折腾。

因为家里已经有了一个 NAS 通过 Cloudflare Argo Tunnel 暴露了一些服务出去,大部分公共服务我也是通过 dedicated server 部署在 Zeabur 上,所以目前其实没有找到特别好的能够融入我工作流的强依赖的应用场景,用得比较多的反而是开发者模式连上懒猫微服再 ssh 到 NAS 上操作,省得用 DDNS 了…

还在继续探索,会再搬几个应用过来,后续深度体验后或许会在博客里详细测评一下~

招聘

我厂(RSS3)在招海外(非亚洲时区) DevOps Engineer,欢迎感兴趣/符合要求的朋友投递~

https://rss3.notion.site/RSS3-is-looking-for-a-DevOps-Engineer-d35ef17da5b341a49bc4484b4533f29a

有趣的事与物

输入

虽然大部分有意思的输入会在 「Yu’s Life」 Telegram 频道里自动同步,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。并且把 Telegram Channel 消息作为内容源搭建了一个微博客 —— 「daily.pseudoyu.com」,可以更方便浏览了。

书籍

  • 沈醉回忆录,学姐对各种奇怪的历史很感兴趣,最近看到她在看军统特务沈醉的回忆录,我也一起看了几章,讲得意外地有趣。
  • 我的父親袁殊,提起特务很难不联想到之前玩的「隐形守护者」游戏中的肖途和「伪装者」剧,他们的原型人物都是袁殊,于是也想找他的传记来看一下。搜到两本,为了尽可能贴合史实一点找的他儿子写的在台湾出版的那本(或许不一定完全中立客观但至少应该相对敢说一点),想更深入了解他的一生。
  • 精力管理,想要更好管理精力看的,但是略有点鸡汤了,花了半天看完累到没精力做其他事了,不过有些关于价值观和思考自己行为出发点的角度还是有些启发的。
  • 創作者的日常生活,好有趣!!!列举了各类创作者、艺术家的 Daily Routine,想单独写一篇来记录一些好玩的。

文章

视频

剧集

动漫

RSSHub 开发实践 #01:Telegram 频道 RSS 订阅实现与部署方案

前言

最近在参与 Follow 以及 RSSHub 这两个开源项目的一些开发维护工作,因为牵扯到与很多订阅源的“斗智斗勇”,有一些很有意思的开发实践,于是开了这个新坑系列记录下来。

本篇是这几周使用 Telegram 官方 API 与 MTProxy 来实现对 TG 频道更新的开发实践与完整配置部署教程。

Follow & RSSHub

follow_telegram_channel

Follow 中提供了一种便捷的订阅信息源的方式,例如用户可以输入对应的 Telegram 频道名称(如 pseudoyulife)来订阅某个频道的更新,这样就无须跳转到各个频道里去逐个查看,这一部分特性依赖的是背后 RSSHub 的实现。

rsshub_homepage

RSS (Really Simple Syndication) 是一个古早的信息聚合标准,它通过统一的数据格式,让用户能够便捷地订阅和获取网站更新。然而,随着社交媒体和移动互联网的兴起,原生支持 RSS 的网站正在减少。

而 RSSHub 秉持着"万物皆可 RSS"的理念,通过开源社区的力量将包括 Telegram、YouTube、播客在内的众多现代内容平台转换为标准的 RSS 格式,让用户能够重新掌控自己的信息获取方式,远离算法推荐的干扰。

RSSHub 中现在包含了上千个平台,针对不同平台和类别也都有着包括但不限于网页爬虫、官方接口、逆向 API 调用等多种处理方式,能够涵盖绝大多数我们日常使用到的信息源,也非常适合作为对平台的一些加密算法和反爬机制学习的实践,例如下文所要介绍的 Telegram 频道 RSS 订阅的实现。

RSSHub Telegram 集成与部署

Telegram 网页预览

yu_channel_online_preview

Telegram 提供了频道的网页预览功能,例如可以通过 t.me/s/pseudoyulife 这一链接直接查看我频道的更新,因此 RSSHub 很早之前就实现了通过抓取网页上的内容并转换为 RSS 格式的方式集成了对 Telegram 频道更新的订阅。

telegram_channel_reorx_preview

然而后来许多用户反馈说部分频道抓不到,去测试了一下,发现 Telegram 用一种黑盒的机制来限制了部分频道的网页预览功能,例如我一直在订阅的「Reorx’s Forge」以及「Newlearnerの自留地」等频道,当使用 /s 来访问页面时会被强制重定向,提示需要打开客户端来查看内容,因此对于这类频道我们没办法直接抓取到内容并转化为 RSS。

Telegram APIs

为了解决这一问题, 我又去查了 Telegram 的官方文档,发现他们将 API 分为以下几种:

其中 Telegram API 中的有一个 channels.getMessages 方法可以返回某个频道的消息,可以满足我们的需求,具体的实现逻辑在 RSSHub 代码仓库 —— lib/routes/telegram/channel.tslib/routes/telegram/tglib 这两部分,有兴趣的朋友可以看一下代码。

创建 Telegram App

manage_telegram_application

使用 Telegram API 需要访问 telegram core,通过手机号登录。

api_development_config

点击 API development tools 模块,创建一个 Telegram Application(详见「Creating your Telegram Application」)。

telegram_api_id_hash

在 App configuration 模块,我们能够获取到 api_idapi_hash 两个参数,记录下值,后续会用到。

获取 Telegram Session

使用 Telegram API 新建一个 client 的流程比较严格,需要通过 SMS 验证手机号登录,在代码中交互获取使用并不现实,因此我们需要预先创建 client 并且获取其 session,后续直接通过 session 来使用 api。

get_telegram_session

拉取脚本「pseudoyu/telegram-api-scripts」后,先运行 npm ipnpm i 安装依赖,然后运行 npm run startnode index.js,按照提示输入 api_idapi_hash 和手机号(需要和申请 Telegram App 时的手机号一致),通过短信或 Telegram App 获取验证码后即可在命令行输出获取 session。

需要注意的是,由于我们后续需要在 RSSHub 服务中使用这个 session,尽量在 RSSHub 服务部署的同一服务器上运行脚本获取 session,这样能避免 Telegram 对于 IP、设备的一些限制。

注:如果 RSSHub 是使用的 Serverless 平台或其他方式,则也可以通过额外配置 MTProxy 的方式来保持 IP 一致,后文会详细说明。

(可选) 使用 MTProxy 保持 IP 一致

之前在 Follow 的 RSSHub 实例上添加了 Telegram API 相关逻辑和配置后,过一会儿就会报一个 AuthKeyDuplicatedError 错误,查看了一下很多开发者也遇到过 —— 「AuthKeyDuplicatedError Eror problem #1488」,猜测是由于我们的 RSSHub 实例是 k8s 集群部署的,会从不同的机器调用 Telegram API,因而受到了一些限制。

于是又开始找针对这一情况的解决方案,发现 Telegram 提供了一种叫 MTProxy 的专属代理协议,可以通过部署一个 MTProxy Server 来代理所有的 API 请求,这样能够确保不同机器发送的请求都来自同一个 IP。

找到了「Dofamin/MTProxy-Docker」这个项目,拉取仓库后,新建一个 .env 文件,添加 MTPROTO_REPO_URL 这一环境变量(默认的官方代码已经不怎么维护,这个版本添加了一些补丁):

MTPROTO_REPO_URL=https://github.com/GetPageSpeed/MTProxy

SECRET 默认值为 ec4dd80983dbf12d6b354cf7bcfe9a48,也可以选择自定义的值;IP 不填写则会自动通过 curl ifconfig.co 获取本机 IP;其他环境变量可以查看仓库的 README.md 文件自行修改。

配置完成后,运行 docker compose up -d 启动,代理服务则运行在 <IP>:8443 上。

注:如果 RSSHub 是通过 Docker、Docker Compose 等方式单实例进行部署,且能够保障在同一台部署机器上运行脚本获取 Session,则可以跳过这个代理步骤。

RSSHub 部署

经过了上述的服务部署,我们获取了以下信息:

  • Telegram API 的 api_idapi_hash
  • Telegram 的 session 字符串
  • MTProxy 的 SECRETIPPORT

这时可以开始部署/更新我们的 RSSHub 实例了,具体可以根据文档选择不同的方式,例如 Docker、Docker Compose、Serverless 等。

推荐通过 Docker Compose 的方式来部署,比较便于维护,需要在 docker-compose.yml 的 RSSHub 服务中添加如下变量:

environment:
  - TELEGRAM_API_ID=<Telegram API ID>
  - TELEGRAM_API_HASH=<Telegram API Hash>
  - TELEGRAM_SESSION=<Telegram Session>
  - TELEGRAM_PROXY_HOST=<MTProxy IP,如 123.123.123.123>
  - TELEGRAM_PROXY_PORT=8443
  - TELEGRAM_PROXY_SECRET=<MTProxy SECRET>

我是通过自己维护的模板部署在 Zeabur 平台上的,可视化部署,比较易用,只需要在部署完成后在 RSSHub 服务的 Variables 模块中添加以下变量并重启服务即可生效:

TELEGRAM_API_ID=<Telegram API ID>
TELEGRAM_API_HASH=<Telegram API Hash>
TELEGRAM_SESSION=<Telegram Session>
TELEGRAM_PROXY_HOST=<MTProxy IP,如 123.123.123.123>
TELEGRAM_PROXY_PORT=8443
TELEGRAM_PROXY_SECRET=<MTProxy SECRET>

测试

yu_rsshub_homepage

经过上述步骤后,我们拥有了自己添加了 Telegram 相关配置的 RSSHub 实例,访问主页显示如上页面即部署成功,可以通过 <RSSHub URL>/telegram/channel/<Channel Name> 来订阅 Telegram 频道。

例如可以通过我的公开实例 https://rsshub.pseudoyu.com/telegram/channel/NewlearnerChannel 来订阅「Newlearnerの自留地」频道。

总结

本篇记录了通过 Telegram API 在 RSSHub 中实现对部分受限制频道的更新订阅的开发实践与部署方案,受限于平台,方案可能会在未来某个时刻失效,我们也会持续研究更稳定的解决方案,使用中有任何问题可以留言或在 RSSHub 仓库中提 Issue 反馈/交流。

Follow —— 信息获取的另一种形态

前言

follow_artitle_pic

我在三个月前作为第一批用户体验到了 Follow 这一产品,很兴奋,使用了一周后就写了一篇文章「周报 #67 - 使用 follow 重塑我的信息输入系统」分享了对 Follow 的一些想法。

而现在三个月过去了,Follow 本身迎来了许多更新,正式开启了 beta 测试;其在我日常信息输入和输出系统中也已经不仅仅是一个 RSS 阅读器 alternative,而是彻底改变了我的信息获取形态。

因此想再写一篇文章更系统性地分享一下我对 Follow 的看法,以及我是如何使用它的。

RSS -> Follow:One more thing

RSS 协议:互联网的活化石

在讲 Follow 之前,我想先介绍一下与之密切相关的 RSS 协议。

RSS (Really Simple Syndication) 是一种能够将网站内容转换为标准数据格式的协议,最早版本诞生于 1999 年,几乎可以算得上是互联网活化石了。

简而言之,它制定了一个包含了 titlelinkdescriptionauthorpubDate 等核心字段的协议标准,采纳并实现了这一标准的网站则可以输出统一的格式以供一些阅读器或代码进行解析,例如可以通过 https://sspai.com/feed 这一链接来获取网站的最新更新;而支持 RSS 的阅读器就像是一本自带目录的刊物,里面收录着来自不同网站和作者的内容,方便我们进行阅读。

但随着移动互联网的发展、社交媒体和音视频等媒体形式的兴起以及网站出于对平台用户流量的保护,支持 RSS 协议的网站越来越少,这一概念也有些式微,慢慢淡出了普通用户的视野,成为了一些爱好者和极客的玩具。

直到 RSSHub 这一项目的出现。

RSSHub:万物皆可 RSS

rsshub_homepage

RSSHub 是由「DIYgod」发起的一个开源项目,其初衷是“万物皆可 RSS”,通过社区贡献,将 Bilibili 视频、网易云音乐、小宇宙播客、即刻用户动态等图片、音视频、社交媒体网站甚至是 App 中的信息转为标准的 RSS 格式。

借助 RSSHub,我们可以把自己习惯性会打开的社交媒体或是关注的各种平台账号都转换为「订阅」这一简单的行为,即可自动获取更新,减少了算法推荐与信息的干扰,提取信息的效率也会更高。

然而,RSSHub 终究还是更中间层一点的工具,即使有了标准的 RSS 数据,大部分阅读器依然只能处理文本显示,对于音视频图片的处理基本上只停留在当作一个 url 这一程度,依然需要点击源链接跳转到对应的网页查看,使用起来常常有些割裂。

直到 Follow 的出现。

RSSHub -> Follow:新一代信息浏览器

follow_og

其实就软件的本质而言,Follow 并没有改变或是拓展 RSS 协议本身,而是通过对 RSS 信息内容媒介呈现方式的改变、浏览体验的优化及与 RSSHub 的深度集成,更面向用户层去解决信息获取与浏览的问题。

确实有一种看久了 pure html 突然飞跃到加了现代化 css 效果的感觉。其实技术层面做到这一步算不上有太高的壁垒,不论是视频 iFrame、音频播放器或是图片预览都有比较成熟的组件可以使用,但 follow 几乎是唯一一个依然在针对这一协议做且做好这一步的产品。

有时候,做好一点就足够了。

信息获取的另一种形态

软件/应用层面的 Follow 给我带来了很好的体验,但不止于此,其更深的影响是对我获取信息的流程与方式潜移默化的改变。

信息困境

不知道从什么时候起,其实能很明显感受到自己对网络世界信息的依赖。可能有别于游戏瘾或是经常被诟病的短视频算法鸦片,我的这种依赖并不是机械性地刷刷刷,而是一种对于信息获取的渴求,甚至内化为了一种生活方式。

而我每天从起床开始就会被来自各个平台的信息流所裹挟,依赖于网络世界其实最难免的是与社交媒体与算法的抗争,一方面是要避免自己被过载的贩卖焦虑的信息或是熟人社交圈的“Peer Pressure”所困扰,另一方面也需要警惕算法所构造的信息茧房。

实话说这一点挺难做到,即使自己多少算是具备一些克制和过滤信息的能力并有意识在这样做,但依然难以避免被其所扰乱思绪或是引导。

我最后采取了一种简单的方式 —— 关闭微信朋友圈入口与大部分软件通知提醒,并且把用于信息获取的平台(如 B 站、即刻等)的关注数量控制在 100 以内,如果新增则筛选优化之前的关注,减少无关内容的干扰。

行之有效,但由于依然需要使用多个平台/App,每当我打开 B 站常常还是会被一些有趣的内容吸引,而 Twitter 这样的平台又多少带了一些社交属性,自己又没有屏蔽或是关键词过滤的习惯,依然难以避免信息噪声。

Self-custodial Feeds

Follow 的出现让我看到了另一种新的形态 —— “Self-custodial Feeds”,即可以自己掌控的信息源。

首先就是厘清我对于 Feeds(信息源)维度的定义与标准。对于我来说,我的信息源由以下组成:

  • 我会几乎每篇都全文阅读的独立博客
  • 每期必看的一些 B 站、YouTube 博主
  • 感兴趣的播客频道
  • 会更多分享思考与新事物的个人社交媒体频道与账号
  • 想要日常积累的绘画或是设计素材
  • 与工作和爱好密切相关的软件/开源项目/编程语言/框架更新
  • 某些只提供 newsletter 的博主/网站

我会尽量避免关注那些像是「v2ex 最热主题」这些热搜类的信息源,并不是对这些资讯不感兴趣,而是刻意减轻自己的信息消化的压力;并且慢慢发现其实也不会错过什么,真正自己会感兴趣的话题也已经在我关注的人的社交媒体分享或博文中了。

也可以说这是自己打造的另一座“信息茧房”,但随着对这些信息源的不断迭代与剔除,最终会慢慢建立一个贴合自己信息获取频率与消化能力的“数字花园”。

follow_choose_view

这些信息源形态各异,但却又刚好符合了 Follow 中的「视图(View)」这一概念。Follow 中除了按照标签和域名分组外,还可以在 Feed 层面设置视图,我上述的这些信息源就可以分别归到文章、社交媒体、图片、视频、音频和通知这几类视图中。

follow_picture_view

比如图片就会有画廊和瀑布流的呈现、社交媒体视图就更像是一条条动态博文,视频可以直接点击播放,而音频/播客则可以全局播放,甚至带进度条或是时间线跳转等功能,这也解决了我需要在 Apple Podcast、Spotify 和小宇宙等多个播客应用之间反复横跳的问题。

follow_inbox

而对于那些只提供 newsletter 的博主/网站,Follow 提供了内置 Inbox 收件箱功能,可以使用对应的邮箱地址来收取 newsletter 并自动将邮件内容转为 Feed 内容,又减少了需要从成堆的邮件里找文章的繁琐,也保障了统一的阅读体验。

打破 RSS 孤岛

RSS 与 RSSHub 的结合确实让信息获取与阅读变得更加简单,但脱离了平台的那些“关注”、“阅读量” 、“点赞”等特性却也容易让这一个个 RSS 信息源成为孤岛。

follow_discover_feed

Follow 将每一个 RSS 订阅源作为一个单元,记录下了这个订阅源的关注与阅读数据,当另外的人通过名称或是链接在搜索时,能看到有哪些人「Follow」了这一信息源(如这个页面 https://app.follow.is/share/feeds/41215011978385440),便于检索的同时,也天然形成了对其内容质量与价值的一种背书。

「Follow/Subscribe」这一行为在社交媒体平台已经几乎成为了标配,但这一概念用于重新建立这些 RSS 孤岛之间的联系却显得尤为巧妙,甚至更进一步,使其变得更为紧密与开放。

follow_view_feature

而在某个 Feed 的文章页面中,我们还可以看到有哪些人阅读过这篇文章,点进那一个个头像又能够看到 Ta 们所订阅的其他 Feeds。

follow_tip_boost

同时,Follow 也提供了打赏(Tip)与助力(Boost)的功能让读者可以通过自己的方式支持创作者,创作者只需要通过一个所有权认证即可收取奖励,形成一种正向的循环。

创作者与读者之间仿佛多了一条细微的橙色细线,感知并不明显,不会形成什么社交压力或是被窥探的不适,但却温暖而坚韧地存在着。

分享信息源

follow_user_sub

有时我们也会想看看他人尤其是同温层的人在关注些什么以丰富自己的信息源,但常常每个人关注点可能分布在不同的网站,而 Follow 提供了用户 Profile 页面可以直接关注,并且也支持直接关注用户的订阅列表,可以很方便地看到 Ta 们关注了哪些信息源以及后续新增加了哪些。

对于有些想要创建自己的「数字花园」的用户来说,也可以创建付费 Lists,感兴趣的用户则可以通过支付一定费用来订阅,形成一种新的信息分享与获取的形态,即不仅仅信息源本身有价值,筛选过滤出高质量的信息源也同样值得付费。

Action 特性

Follow 还提供了一些自动化规则,例如可以将非中文内容自动翻译并使用 AI 进行摘要总结,对正文沉浸式翻译等,根据这些规则提升我们的信息处理效率。

follow_actions

我用的最多的一个 Action 是对个人博客的内容进行摘要、向我推送通知并开启阅读模式(可以自动去抓取一些不提供全文输出的 RSS 源),这样我能够不错过我所关注博主的更新。

总结

Follow 的出现并不只是优化了阅读体验,而是让我对信息源整理这一起点有了更深的思考,慢慢建构起了自己信息获取的新形态,如果将自己关注的订阅源视作一颗颗种子的话,那 Follow 则是这些种子发芽成长的沃土,呵护着自己的「数字花园」。

另外 Follow 目前刚开启公测,可以直接访问 https://follow.is/ 体验。公测账户有一些限制,需要邀请码才能解锁完整版功能,可以评论留言,我会发放一些邀请码。

周报 #78 - NAS、Chromebook 与 Zeabur 折腾小记

《Photograph - Ed Sheeran》

前言

weekly_review_20241104

本篇是对 2024-10-292024-11-03 这周生活的记录与思考。

最近不知怎的又久违地开始折腾开发环境和设备了。

在 Ares 的技术支持下终于拥有了心心念的 NAS;把闲置已久的 Chromebook 重新装了一下并刷了 Arch Linux,甚至还把 MBP 刷了一个 Asahi Linux(不过作为主力机还是不行,先卸载了,打算回家把家里的台式机刷了);Zeabur 支持了 Dedicated Server 之后我也把 RSSHub 等比较消耗资源的服务迁移到了 Hetzner 的 CAX-31 Arm 主机上;还有很多有意思的事。

NAS

my_nas_omv

其实好久之前就对 NAS 很感兴趣,但其实自己看番剧和剧集都是直接在流媒体平台上或者 Infuse 连网盘,对于家庭存储的需求并不那么高,所以一直没下定决心入手。

再加上自己有个 Mac Studio,平时也都是长期开机的,配合上公网 ip 和 Cloudflare Argo Tunnel,其实也已经满足了绝大多数的家用服务需求了。不过由于系统架构的限制等,我在配置 HomeAssistant 的时候网络配置总是有一些奇怪的问题。

有一次跟 Ares 聊的时候,他提到有个自己组好的 NAS 可以出给我(他自己已经迭代了),很是心动,于是找了一个周末来我家里配置完成了,有了技术支持自己少走了无数弯路,一切都完美 work 了。

四盘位(8T 存储外加 8T 的备份),任意热插拔掉两个盘位依然可以正常运作,把之前网盘里的一些照片和影像资料迁移了过来;用的是 openmediavault 这一界面有些古老但是完全够用的系统;使用 Portainer 管理了一些 Docker 服务,16G 内存也基本够用。

Chromebook 与 Arch Linux

yu_chromebook_setup

两年多前在重温 Teahour 的这期「#95 - 用 Chromebook 做开发是什么样的体验?」时对瘦客户端开发模式很是着迷,自己还写了一篇「基于 frp 内网穿透的瘦客户端开发工作流」来实践,顺便也种草了 Chromebook 这一国内并不流行的设备,入了一台 2019 款的 Google Pixbook Go(产品线很快就被 Google 砍掉了,所以倒是有点纪念意义的最后一代)。

但其实因为后来远程办公以及依赖了很多 macOS 专属的软件,这台设备的利用率一直很低,最近在清迈看另一个 mentor 把自己的 Chromebook 刷了 Pop!_OS,很酷,于是想着回来折腾一下。

btw_i_use_arch

本来也是想彻底刷成其他 Linux 发行版的,升级了一下发现 ChromeOS 的 UI 和各类交互很舒服,折腾了一下把内置的 Debian 系统换成了 Arch 也很足够我对于 Linux 的需求,不那么“正统”但够用,折腾了一天,达到了很惊喜的体验,用了几个跨平台的方案保障体验几乎是一致的了。

  1. 1Password。前段时间才从 Elpass 换成 1P,浏览器插件、多平台和强大的自动填充让我后悔没早点换了;再加上能够用 ssh agent 功能来进行 git 签名等,再也不用维护多套 gpg keys 了。
  2. x-cmd。朋友前司的产品,最开始只是想支持体验一下,发现确实满足我的需求,只需要很少的几个命令和配置就能实现一个多设备完全一样的开发环境,也使用 x-cmd 管理了我的 Go, Node.js 等开发环境,很省心。
  3. fydeRhythm。我现在完全投入双拼,在搜索的时候发现了这一开源项目,作为一个 Chrome 插件安装到 ChromeOS 系统中,也能够在终端和各类应用中原生使用,几乎免配置;Linux 上我使用 fcitx-rime 配置,不过折腾了好久才搞定。
  4. Cursor。有打包好的 AUR 包可以很方便在 ChromeOS 上一键安装,加上导入配置的功能,改了几个快捷键后完美还原体验。
  5. Chrome。考虑为了一致体验从 Arc 切换回 Chrome 了,像是 Telegram、Slack、Discord、Follow 这些工作中用到的直接都使用网页版了。
  6. Onedrive。因为没有了 iCloud,刚好利用上我的 Microsoft 365 带的 1T Onedrive 存储,用于文件传输和同步。
  7. Google Play Store。Chromebook 很大的一个优势就是可以直接使用 Android 应用,还提供了一些优化,像是 Clash、HBO Max 这些应用都可以作为应用直接打开了。

yu_chromebook__cursor

我其实有很多高性能设备,例如日常在用的 M2 Max 的 MacBook Pro,由于性能和续航达到了一个很不错的平衡,导致我即使出门在外也随时都能打开来进入工作状态,甚至爬山和散步都会背着,有时候其实并不能很放松地出门或是陪伴身边的人,但我又有“电脑分离焦虑症”,不在手边的时候总是担心有什么紧急事务要处理而焦躁不安。

这台 Chromebook 算是一个完美的方案,同时有满血版的 Chrome、Arch 和 Android 系统,性能不强、轻便好看,所有依赖浏览器的工作都完全能胜任,真的要调试工作项目的代码稍微有点卡但也能用,在缓解我焦虑的同时,每次有需求后也多了一步掂量一下,是不是真的紧急到我即使需要更费力地调试也要当下完成,绝大多数情况下我也都会选择等到家了换上主力设备了再处理。

这一点很有意思,其实设备性能已经过剩到并不会制约自己的效率,反而是需要刻意的约束来让我的目光更多转向周遭。

Zeabur 服务器

我算是 Serverless 平台的重度玩家和 Zeabur 的早期用户了,现在自己的很多服务依然部署在 Cloudflare Pages/Workers、fly.ioZeabur 平台上;同时之前也是各种 vps 的折腾爱好者,有好几台搬瓦工的传家宝,再加上前两年有点上头,又新添置了几台,导致利用率很低。

zeabur_dedicated_servers

最近正好 Zeabur 支持了 Dedicated Server,利用 k3s 外加一些 monitor 服务能够在平台上直接使用自己的服务器进行部署,而关联 GitHub Repo、镜像 build、拉取等高消耗任务则是通过 Zeabur 来进行(目前都是免费的,不知道后面会不会按量计费),不占用服务器本身的资源。

于是把我的 RSSHub 和 Node 节点等一系列服务直接迁移过来了,终于把月账单又控制在 Developer Plan 的 5 刀以内了。

Zeabur 的模板也比较强大,我现在在维护 RSSHub 的 Zeabur 模板,可以无须域名等额外配置,一键部署自己的实例;顺便还把之前自己用的 n8nRemark42GoatCounter 等服务都做了模板,欢迎大家直接部署使用。

有趣的事与物

输入

虽然大部分有意思的输入会在 「Yu’s Life」 Telegram 频道里自动同步,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。并且把 Telegram Channel 消息作为内容源搭建了一个微博客 —— 「daily.pseudoyu.com」,可以更方便浏览了。

书籍

  • 素食者,因为诺奖才了解到的作者,周末得闲才开始读,不长,只有三个篇章。看第一章的时候我正在吃饭(幸好是素食),作者把很多模糊的负面的感受描述得非常具体,以至于我有点反胃,很久都没缓过来,很难得有这样的感受了;后面的剧情走向略有点抽象,但确实加起来四种不同视角却相互关联的方式很奇妙。
  • 献给阿尔吉侬的花束,最开始的错字报告到后来智商跃升后对这个世界和身边人态度的变化的不解,到后来对自己作为一个“人”过去和现在的探索,再到最后的一切回到原点和结束。他用了几个月的时间快速经历和理解作为“人”的一生,很多人几十年甚至终其一生也没办法回头去接纳过去和真实的自己,无关智慧,只是重新拥有了思考这一能力的他就像是失明的人重新见到光一样珍惜。
  • 红与黑,从一个视频看到的讲解,关于于连的自尊和因此表现出来的傲慢的描述印象很深,有一种底层市民向上的野心,但由此产生的矛盾、自尊受挫后的疯狂和极端的转换描写得很具体。
  • 小城与不确定性的墙,读了前几章,感觉跟「世界尽头和冷酷仙境」的设定好相似。

文章

视频

剧集

周报 #77 - 一间只属于自己的房间(对亲密关系的思考)

《Photograph - Ed Sheeran》

前言

weekly_review_20241030

本篇是对 2024-10-212024-10-28 这周生活的记录与思考。

前两天读到了「第三夏尔 | Third Shire」写的一篇「从亲密关系中学到的」,也想写一篇来总结一下自己和学姐这一年多来的一些感受和变化,很多事远远没有像原作者一样找到“最优解”,但也心知亲密关系的一些问题因为有了爱作为挡箭牌而容易拖延甚至搁置,直到矛盾爆发,因此也想记录一下作为自省和对自己的提醒。

只属于自己的房间

我想独立和自我空间是亲密关系中最常见也最难解决的课题了,在我和学姐这样的模式下尤其。两个人其实缘起于互相欣赏,我羡慕她的精力与心境,在香港、北京这样的工作节奏下依然能够保持对生活的热情,画画、攀岩、看书、写作,让我看到了原来还有另一种人生;而她或许也欣赏我的独立和对技术的专注。

但进入到亲密关系后,两个人不免地会变得更依赖对方,不论是情感还是时空上。

之前杭州北京异地的时候,我大概每个月会去北京两三周,留下一周的各自独处的空间和期待下一次见面的心情;而现在一起到了杭州后,在小区隔壁楼各租了一个房间,谈起了异楼恋。但由于两个人都不需要固定通勤,常常连续几天高密度地相处在一起,独立也成为了一个伪命题。

起初我并不很能理解,即使同处一个空间但是做自己的事为什么还会有“不独立”的感受,后来渐渐发现了,学姐更为敏感也更依赖于一个独处的环境才能专注地看书写字甚至只是发呆,而我其实对于环境的感知并不高,打开电脑我就能够进入另一个世界,也并不容易被干扰到。

当我们两个人在一个空间时,我随时可以去看她、问她在做什么,或仅仅是路过的时候抱一下,学姐依然会有一种“侵占感”,本身是享受两个人的亲密,却多了一层隐隐的不安全感。

其实我们也做过一些调整,比如约法三章,一三五各自相处,剩下的时间一起,但依然并不解决问题,因为真正离开后即使一楼之隔也会想念,找各种理由再待在一起,因此常常这样循环。

最近尝试的是早上白天时间里各自专注做自己的事,到了饭点或是下班时间可以约会出去吃或自己做点简餐,似乎完整时空里分割的三个小时会让相见和相处多了一些仪式感,也常常戏言道这个男朋友只有三小时赏味期,时间到了就该放到冰箱里重新保鲜了。

伍尔芙在「一间自己的房间」中写到:

一个女人要想写作 必须拥有两样东西 钱和一间只属于自己的房间

我想这句话的重点可能不在于“房间”这一实体,而是“只属于自己”,即使是亲密关系中的另一个个体,也依然需要排除在外。

真实的自己与缺点

亲密关系中的另一大难题其实是“真实的自己”与对彼此缺点的包容。在与亲近的人相处时人似乎总是会更不加掩饰一些,而在长久相处中也难免会有一些矛盾。

我是个对生活质量要求很低的人,可以连续一两天懒得吃饭和睡觉、几个月不买衣服;对周遭空间也很不敏感,家里我可以只在电脑和床这几平米的空间里活动,一个掉在地上的瓶子我可能一两周后才发现;夜晚也常常是困到开着灯和电脑不知怎么睡着的。而学姐是很认真在生活的人,空间的整洁、物品的摆放、生活的仪式感,都是她很在意的点;对于环境也更敏感些,夜晚的一丁点光亮和声音都会让她难以入眠。

日常的相处中就常常会因为这些习惯上的差异而累积一些小情绪,事情都不大但是很难解决,可能会需要更长久的时间去理解和磨合。

比起这些生活习惯上的琐事,目前更严重的是在漫长的日常中对于对方的尊重。

有时候我手上在忙一些事,跟学姐说了 15 分钟后可以出门,但实际上可能早就过了半小时甚至更久。或许本身其实早 10 分钟晚 10 分钟出门并不会对实际的行程产生太多影响,但其实这种行为是对她时间的一种不尊重,如果预估的时候就说了半小时,学姐就可以坐下来更完整地读几页书或是处理点工作,而不是消耗在毫无意义的等待中。

几次之后我才意识到,在远程办公时间自由以及自己同时在做/想做的事越来越多后,其实自己对于时间的预估和掌控越来越差,但常常又执拗地不愿意承认,有的时候真的忙到无法兼顾依然强行多线程。

发生了好几次之后才更认真地对待这一趋势,也和学姐聊了自己在其中的感受和情绪,其实是可以通过沟通和调整来缓解的,但似乎即使是在亲密关系中,坦言真实的自己和不足依然是一件需要勇气的事。

个人生活剪影

上周末飞了一天又回到清迈了,很累,前几天都在宅着休息,没力气学习和处理太重的工作,就干脆继续折腾 Chromebook 了。

btw_i_use_arch

最终还是刷了 Arch,太喜欢了,翻好多 AUR 包贡献者的博客翻了好久,完美配置完了,follow、cursor 这些比较新的软件都有好心人打包和维护,Wiki 也很详细。

接下来这几周就继续游民生活啦,这次就会一直待到曼谷 devcon 之后了,到时候我们厂也会有主办的活动,欢迎来玩~

有趣的事与物

输入

虽然大部分有意思的输入会在 「Yu’s Life」 Telegram 频道里自动同步,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。并且把 Telegram Channel 消息作为内容源搭建了一个微博客 —— 「daily.pseudoyu.com」,可以更方便浏览了。

文章

视频

剧集

  • 企鹅人,我在上飞机前临时在 HBO 上下载的,The Penguin,以为是企鹅纪录片,没想到是哥谭的企鹅,很精彩,连刷了 5 集。

周报 #76 - 关于 Adulting 的思考

《Photograph - Ed Sheeran》

前言

weekly_review_20241024

本篇是对 2024-09-192024-09-28 这周生活的记录与思考。

Adulting

最近在一个喜欢的博主的频道看到这样一段描述:

因为大学毕业后直接读了博士,博士毕业后就继续研究者的工作,说是说工作,但是和念书时也没啥太大区别,所以总感觉现在的自己和学生也没什么区别,哪怕教过许多的大学生,但我也不认为自己和他们有什么区别,只是比他们早学几年而已。不过区别肯定是在某些时刻发生了。在生活中也偶尔会冒出诧异的感觉,譬如在看剧时、或者在消费时,发现自己的收入已经比家长高很多了,虽然匮乏的记忆仍旧历历在目,但那些好像是发生在另一个人身上的事。再譬如看一些文艺作品,讲那些大姐姐和大哥哥,那些我想以之为生活目标的人,一看发现他们年纪比我还小。再譬如每天起来洗漱时,真真切切地感觉到自己的年岁在增长。

智识是增长了、但是我的情感能力却完全停留在学生时代。虽然读过许多激动人心的文学作品,但仍旧对讲青春期的故事着迷,到现在还在追相关的新番并为之感动。我怀疑自己还在青春期中,似乎就只是在象牙塔里空长了年岁。这十年我在干什么呢,我不理解。身边的人如何进入自己的生活,生活的洪流又是怎么吞噬一个个人的,我不理解。但是更令我难受的是,当我看到现在的中学生时,我也不理解。

我觉得人的经验中是有很多问题需要被解决的,我不知道别人是怎么解决这些问题的,但我不解决它们我就没法进入下一个阶段。当我搁置它们的时候,我就并没有在成长,物理时间、精神时间和情感时间完全错开了。我现在也很困惑自己是否也能和别人一样成为看起来很正常的大人,又或者是否有能力保卫住我现在这样能让自己胡思乱想的生活。每次想到这里我就感到难过。我没有勇气进入新的生活,就像一个因为执念而仍旧留存于世的幽灵一样。

yu_sunrise

心里的某一块似乎一下子被击中了,想到了最近刚听说的一个词「Adulting」,印象里是博主学会了车窗被路上飞来的小石子砸坏是可以走保险之类的这样一个冷知识,称之为 「Adulting 技巧」,很喜欢这个形容 —— “正在学会成为一个大人”

随着自己年岁渐长,即使没有刻意去比较,其实比起学生和孩童时期变化已然很大了。

工作已经三年多,生活独立,买东西时似乎已经可以相对地“随心所欲”;走南闯北,踏过的土地也远远比父母去过的地方要多得多;遇到什么人生的重大决定,似乎也不再那么慌张了。

前几个月考了驾照,现在常常开车出门;前段时间在整理自己一团糟的财务信息,办了一些卡、买了一些定存等等。在做这些时,跟学姐说了句,“我现在好像个大人呀,会开车出门还有很多银行卡。”

学姐回话说,“只有小孩子才会比谁的卡多,大人也不会因为自己像大人了而高兴。”

或许跟我一直以来的经历有关,初高中之后爸妈就不怎么管我,大学后更是按照自己的想法在生活。好处是似乎看上去处事不惊,性格多少成熟稳重些,“坏处” 是并不受父母长辈的标准约束,也早早关了朋友圈屏蔽了 peer pressure 的影响,导致似乎自己的生活和同龄人所在经历的似乎是有些脱轨的。

这两年参加了三场高中同学的婚礼,其中两对孩子应该就在这两个月就要出生了,应该不会有人还在为考出驾照而高兴好几周,或是因为一束「送错的花」而沮丧好几天。

大多数时候我还是乐得如此的,似乎努力保留一点“学生气”也让我面对这世界的时候多一些乐观和勇气,离世界的那些污浊的死气沉沉的真相远一些。

但真的能一直这样么?

和学姐刚在一起的时候,有一次她去公司的一个活动,下班后一脸疲态,跟我倾诉说,同样一件事需要用好几种截然不同的方式向不同的领导汇报和其中察言观色的部分很消耗心力,很累。

我突然发现我没办法给出有效的安慰,并不是不懂其中的门道和“人情世故”,也明白生活在不断吞噬每一个人,只是这些事第一次如此真实地出现在我最亲近的人身上时,而我却也无能为力。

我在周报中也曾大言不惭道要追寻月亮,不能因为要去捡六便士而成为自己所不喜欢的样子,但其实世界原本就是这样运作的,即使我能侥幸逃脱这些桎梏,也没有能力荫庇身边重要的人。

学姐说了一句,“你能有选择不成为这样的人是很幸运的,总好过让这世上再多一个无聊的大人”,有些惭愧和心虚,似乎本该学会长大的自己执拗地搁置了这些,真的是对的么?

我真的有能力守住这样能够继续任性继续胡思乱想的生活么?

有趣的事与物

输入

虽然大部分有意思的输入会在 「Yu’s Life」 Telegram 频道里自动同步,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。并且把 Telegram Channel 消息作为内容源搭建了一个微博客 —— 「daily.pseudoyu.com」,可以更方便浏览了。

文章

视频

周报 #75 - 回答 Dayu 关于独立博客的 9 个问题

《Photograph - Ed Sheeran》

前言

weekly_review_20241023

本篇是对 2024-10-142024-10-20 这周生活的记录与思考。

这周从清迈回到了杭州,但是由于项目发版而忙碌了整整一周,几经波折,有些心力交瘁,于是也搁置了没记录些什么,看到 Dayu 的这篇「博客作者呀,我想采访你这 9 个问题!」,有很多想说的,直到今天晚上才想着写博文回答一下,像是笔友的一次隔空交谈。

回答 Dayu 的 9 个问题

01. 简单介绍下自己或者你的博客

我的博客名称是「Pseudoyu」,和我自己的昵称同名,是以自己名字中有的 Yu 为源自己创造的词。在我的「关于」页有更详细的介绍:

取用了一个前缀「pseudo」,pseudonym 有「笔名、假名」的含义,编程里常用到的 pseudocode 是「伪码」的含义,而很喜欢的日漫 物语系列 - 伪物语 中也不乏对「真物」与「伪物」的探究,那为什么不能有一个 pseudo 的 yu(我)呢?

其实一开始真的是想做一个严肃的技术博主,顺便记录下自己的折腾工具和效率的一些心得,慢慢地,因为搭建博客和周边服务的一系列教程吸引了一批读者,最后,似乎还是以「周报博主」这一身份为大家所熟知,机缘巧合,但却也不错,能够隔着互联网给大家传递一些温度。

即使现在已经有了不少读者朋友,但要说博客对于我自己的意义,还是更像想法和情绪的私人空间吧,状态不好时文字也是丧丧的,甚至是很久不更新;在经历人生的一些重要阶段时,过去的文字又常常给我温暖和勇气。

02. 什么契机让你开始写博客

我高中学的是文科(现在可能已经不分科了?),也曾混迹文学社、有过作家梦,比起其他方式更习惯使用文字来表达自己,曾经也写过个人公众号或是投稿一些平台,在对技术有了更多了解后使用 Wordpress 自建了自己的第一个博客,后续觉得曾经写的又很幼稚,使用 Hugo 重建了博客并买了这个域名,直到现在。

这个博客的话,其实是自己读研的时候把自己的笔记都使用博文发布出来,便于自己回顾和分享,后续也有写一些技术教程和工具效率软件的使用心得,但总体来说断断续续的,直到两年多前决定重新用文字记录生活,开始写周报,不知不觉也已经七十多期了。

要说契机的话,我想到了最近在清迈买到的一本笔记本上写的一段话:

When you read, you are reading the writer’s words

But when you write, you are reading your soul

03. 你是如何完成创作的

写作对于我来说确实是一件下笔不难,但决定坐下来写却需要勇气的一件事。

技术类的文章则是来了灵感或是动力,就算是深夜也会爬起来写完,常常写到清晨;而大部分周报除了极少数的旅行总集篇外,经常是会给自己下一个 deadline,然后在最后几个小时用很短的时间写完,大多都是没有提前构思积累,而是坐下在电脑前一气呵成写完的,只要有想说的话,遣词造句倒不会成为阻碍。

我整体写作算是比较粗糙的,写完后简单通读几遍就直接发布了,发布的前两天会反复看,修改一些小细节,然后就继续下一个轮回了。

工具方面的话,我就是使用 VS Code 写 markdown,截图使用 CleanShot X,图片使用我自己的一套方案「从零开始搭建你的免费图床系统(Cloudflare R2 + WebP Cloud + PicGo)」上传到 Cloudflare R2 并使用 WebP Cloud 优化;封面图是用 figma 编辑一个自定义模板;写完后上传至仓库并自动发布。

04. 运营博客的过程中是否有失去过动力?如果有,是为什么恢复的?如果没有,请问您又是如何保持创作的激情

我的博客间歇性会有断更,不过通常不是因为失去对运营博客的动力,而是失去了对生活或是与自己对话的热情和能力,所幸我有很多篇周报、年终总结和生日总结,我常常会在这样的时候一遍遍去读之前自己写的这些文字,发现其实过去觉得重要的不重要的、开心的难过的,放在两年多周报的维度上,似乎都随着时间过去了,而在其中的我,也一步步变得更有勇气。

与其说是保持创作的激情,不如说是过去的自己的文字常常在救赎现在的我,而现在的我也常常会想,或许现在无心的一句话,又会成为未来自己的一束光;我也常常会去读博客的评论,有很多很用心的话语,同样让我有了继续创作的动力。

当然,也有时候会怀疑自己写的内容的价值,也还是引用我博客之前写的一段话来解答:

就这样平凡的我常常也会犹疑,自己的生活“流水账”是否有这样的价值呈现在所有人的面前,直到最近恰好在 B 站上看到这样一个视频 —— 「什么是好看的色彩?拍视频五年,我调色成了什么样」,是讲调色相关的,里面的一句话却深深打动了我:

当我第一次把镜头对向自己的时候,我才发现拍得可以那么惬意,没有压力。这时我才发现,我以前羡慕的不是那个画面,而是背后浪漫热烈的生活,这是我爱折腾的意义,我想让你看到我眼里的世界,而我屏幕里最好看的颜色,就是我生活的底色。

这是对我现在写周报时的心境最恰如其分的形容。

05. 如何搭建博客,以及运营博客每年需要投入的资金

(搭建博客算是我的专长了 🤣,感觉自己一半时间在写博客,一半时间在研究怎么搭博客

可以参考这篇吧 —— 2024 年了,我的博客有了什么变化

博客本身域名 10.44 美元一年,WebP Cloud 的 Lite Plan 3 美元一个月,其他服务都是在免费或是几乎可以忽略不计的 Serverless 平台上,没什么成本。

06. 推荐 1 篇你博客中的文章,并推荐一个你喜欢读的博客,聊聊原因

近一年我最喜欢的一篇文章是 —— 「27 岁的自白:成长是一件很扫兴的事」,虽然是自己写的文字,一次次重读心绪却也难平,算是这些年不论是阅历还是写作能力提升后,第一次觉得真的有把自己想说的话好好地用文字描摹出一个具体的形状。

很喜欢读的一个博客是「椒盐豆豉」,读她的文字有时像是在体验另一种生活,有时又似乎不知不觉代入思考,说不上来,并不是文字的陷阱,而是真正灵魂有趣的人所散发出来的魔力。

07. 推荐 1 个近期喜欢的事物?(例如书籍、电影、音乐、工具、软件。)

最近的话在折腾 Google 已经停产了的一台 Pixelbook Go Chromebook,很轻很有意思的一台设备,我在做的是让这台设备能够满足我的大部分工作需求却又不要满足得太好。

我其实有很多高性能设备,例如日常在用的 M2 Max 的 MacBook Pro,由于性能和续航达到了一个很不错的平衡,导致我即使出门在外也随时都能打开来进入工作状态,甚至爬山和散步都会背着,有时候其实并不能很放松地出门或是陪伴身边的人,但我又有“电脑分离焦虑症”,不在手边的时候总是担心有什么紧急事务要处理而焦躁不安。

这台 Chromebook 算是一个完美的方案,同时有满血版的 Chrome、Debian 和 Android 系统,性能不强、轻便好看,所有依赖浏览器的工作都完全能胜任,真的要调试工作项目的代码稍微有点卡但也能用,在缓解我焦虑的同时,每次有需求后也多了一步掂量一下,是不是真的紧急到我即使需要更费力地调试也要当下完成,绝大多数情况下我也都会选择等到家了换上主力设备了再处理。

这一点很有意思,其实设备性能已经过剩到并不会制约自己的效率,反而是需要刻意的约束来让我的目光更多转向周遭。

08. 想做还没有做的事,或想尝试还没有尝试的主题

想拍生活 Vlog 以及一些工具效率的视频,其实并不愁内容和表达,只是缺乏开始的动力。

09. 写到这里,闭上你的眼睛,深呼吸几分钟,或是出去溜达一圈,然后回来写任何你想写的东西

每次拖更周报自己的心理压力好大,还是接着这篇重新找找写作状态,谢谢 Dayu,希望自己还是更多能够准时更新吧。

关于 RSS 与信息获取

最近在写 RSSHub 的代码,有一些有意思的感受。

前两天因为要解决 B 站抓取的问题看了 DIYgod 发给我的一个研究 B 站风控机制的 Issue ,看到 B 站的复杂的风控加密算法和开发者的应对策略,有一种两边斗法的感觉,根据里面的一些逻辑改了代码,生效了一阵子,今天看到又失败了 😶‍🌫️;今天发现 Follow 里抓不到我的 Mastodon 实例的数据了,前几天还可以,本地调试了一下发现是抓取的时候有一个 401 Request not signed 错误,分析 Header 里面内容调试了好半天,最后发现可能是我那个实例的 admin 新增了对非登录用户的一些权限限制;还有很多平台也是。

感觉在做网页数据源 RSS 化的时候总是会做很多“无用功”,一下午甚至几天的成果很有可能因为平台策略的微小改变而付诸东流,和平台反爬风控的斗争貌似也永无止境。

往大了说是 Open Information,小一点说只是想我自己能够有一些自主选择想看到的信息的权利,似乎在中心化主流的现在都需要付出很多额外的努力。

工作生活剪影

这周工作项目里要发一个大版本,几经波折,一整周都被熬夜后的恍惚和刚拔完两颗智齿的不适感缠绕。

今天凌晨刚发完版的一瞬间有种字面意义上的「豁然开朗」 ,很像一周前早起去在清迈素贴山上等候和看到日出时的心情。

sunrise_with_boyi

有趣的事与物

输入

虽然大部分有意思的输入会在 「Yu’s Life」 Telegram 频道里自动同步,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。并且把 Telegram Channel 消息作为内容源搭建了一个微博客 —— 「daily.pseudoyu.com」,可以更方便浏览了。

文章

周报 #74 - 清迈异闻录

《Photograph - Ed Sheeran》

前言

weekly_review_20241021

本篇是对 2024-09-292024-10-13 这周生活的记录与思考。

这两周去了清迈参加 invisible Garden 的活动,去当 Solidity 课程的讲师;学姐也请了一些假,凑上了一次为时半月的旅途。这些年在清迈呆过了大概加起来也有一个多月,心情却总是有所不同。

这次整个期间一直没更新周报,但在自己的 Telegram Channel 中还是保留了比较完整的记录,所以这篇也算是总集篇了,这篇偏记事,感受和思考可能后续会再谈一下,包括旅行中的相处。发生和体验了很多有意思的事。

清迈生活

00. 初来乍到

meal_at_chiangmai

9.29 傍晚刚到清迈,经接机的热情司机大叔提醒去逛了周日夜市(清迈最大的夜市了,来了好几次总是错过),这次没计划倒是不期而遇了,很热闹。

work_at_chiangmai

夜市买了一套喜欢的 local 服装和拖鞋,开启 10 月 Thai-style 旅居生活。

甚至偶遇一个周报粉丝,送了他一个 Follow 码 🤣。

01. Invisible Garden

在 Invisible Garden 当 mentor 上了三节课(两次主讲,一次辅助另一个 mentor Daniel 答疑),接下来的一周应该还会密集上三四节。

daniel_class_chiangmai

上一次英文授课还是去年,muChiangMai 活动,但这次时间更久,内容也更深入,虽然多少还是有点磕绊,在第三节课的时候感觉已经比较游刃有余了,见到了很多有趣的开发者,也跟 Daniel 交流合作得很惬意,算是这次最大的收获了。

paint_daniel_yu

在清迈 Invisible Garden 上完第一节课后和另一个 mentor Daniel 在交流后续课程安排的时候被学姐画下来了 增加了有趣的记忆点 🥰。

meet_with_vitalik

还很运气地在一次讲课后下楼刚好遇到了 V 神,在学姐的鼓励下去找他聊了一会儿,还给他买了一杯咖啡,比想象得更有亲和力,还鼓励我 keep programming,感觉现在再写合约都有加持了 🔥

Talking to Vitalik Buterin at Chiang Mai really made my day!!! 🥹 bought him a cup of latte, shared ideas about ethereum and introduced our RSS3 project to him 😊

02. Iyengar Yoga

去了 5 次瑜伽课,几乎都是早上 7 点打车去古城,Iyengar Yoga 对于我这种柔韧性很差的人真的折磨,感觉是该回炉重造了,其实一开始只是想陪着学姐去,但是似乎也坚持下来了,老师说进步很明显,甚至能倒立了,这周应该还会完成一个 4-5 节课的 Session。

有趣的是老师为了让我放松在跟我闲聊:

“You have a very healthy body but apparently lack of exercise, how old are you? 22?”

“27 and I’m a programmer”

“Oh that make sense, you actually need yoga!!!”

其实随着年龄渐长自己已经不得不正视身体和精力已经有些跟不上自己的想法了,早起去瑜伽或是锻炼几个小时,下午回来后常常感觉到疲劳,学习能力和专注力也不如之前了。

有尝试过进行一些调整,如又重新恢复的 8+16 断食和坚持了差不多一个月素食(不算非常严格,跟朋友聚餐也会破戒但大体坚持下来了),再加上现在的瑜伽和偶尔去的各项运动,有点像是人力抵抗自然,痛苦但有用。

03. Meditation

meditation_at_chiangmai

去了两个寺庙练习打坐冥想,算是瑜伽的一种结合,不过很可惜没有足够的时间体验一个更长期完整的禅修(主要还是得断网 10 天+,以及目前的心境也不算适合),看到有一些线上课程有教如何冥想,打算先慢慢练习开始。

但隐隐觉得未来有这样机会的时候会是一些人生比较重要的节点吧。

(没有拍我打坐的照片,发现就目前的打扮和发型来说,学姐穿我的衣服拍的背影已经不容易分辨出来是谁了 🤣

04. A Chiang Mai Couple

chiangmai_couple_meal

经典的一人做一两个菜的聚餐环节。

去学姐 7 年前在清迈旅行时认识的朋友家里作客 2 次,很有意思的一对 couple,大概 30 出头,15 年在清迈 gap year 做义工的时候觉得很喜欢,就留下来了,做民宿生意,一晃已经近十年了,起起伏伏,又经历过了疫情后的几乎从零开始,现在渐渐步入正轨。

男生热情而有责任感,承担了大部分的民宿生意琐碎的部分,为了生计当过中文老师、美术私教,还去考了潜水证和打了几年泰拳比赛;女生一开始自己一个人收拾民宿,洗床单刷马桶,到现在学会了泰语,还开了公司管理着很多泰国的清洁阿姨,坚毅而有力量。

chiangmai_couple_1

chiangmai_couple_2

看着他们挂满的自己画的画,一整面墙的木工用品,羡慕之余开始想,可能这才是真正的生活。

05. People in Chiang Mai

另外一个很有意思的是对清迈人(或者说泰国人)的感受。

泰国是一个很重服务业的国家,之前几次的印象就是酒店 housekeeping 的阿姨总是很友善,出租车司机也都热情到位,但这次跟上条提到的在清迈开民宿的老板娘聊了后发现一些很有意思的文化现象(主要指的是服务业人员,但也能够概括一部分整体特征)

  1. 很少把自己的真实感受会直接地告诉你,当面永远是偏向于热情和善,对所有事情也都应承,但背地里其实会骂你,只有经过了很长很长时间,才会信任你。
  2. 本质上很慢、也很“懒”,对于工作的态度很佛,当他们工作不开心了可能随时就辞职了,把积蓄花完再找一份工作。

带了这样观察的视角又在清迈生活了一周后,在用 Bolt 打车时遇到过两个事。周末的早上打车去瑜伽,有一位司机说正在送上一位乘客,大概两三分钟后到,等了十几分钟后我只是在平台的软件发了一句问他”where are you? I’m late“,他直接取消了订单;还有另外一次是我吃完饭提前打车,但是结账时候耽误了一点,我就跟司机说了一下情况让他稍等一会儿,结果他连续发了好几段话骂我,然后取消了订单 🤡。

可能他们并不想在工作上给自己任何压力,急单能不接就不接,反正又不是接不到了;工作中有让自己不开心了就也按照自己的心情来;对面有一家送煤气的据说是常年挂着招工的招牌,因为员工总是做一阵子,想不做第二天直接不来了。

music_taxi_chiangmai

当然不良的感受是极少数,大部分时间还是能感受到他们的善意,遇到了一个泰国司机,听到我们在讲中文后在 YouTube 上找了杰伦的歌单放给我们听。

这些大概是只有在本地生活一阵子才慢慢感受到的。

有趣的事与物

输入

虽然大部分有意思的输入会在 「Yu’s Life」 Telegram 频道里自动同步,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。并且把 Telegram Channel 消息作为内容源搭建了一个微博客 —— 「daily.pseudoyu.com」,可以更方便浏览了。

文章

视频

音乐

周报 #73 - 《社交网络》、Ego 与中秋的现充生活

《Photograph - Ed Sheeran》

前言

weekly_review_20240918

本篇是对 2024-09-092024-09-17 这周生活的记录与思考。

《社交网络》与 Ego

the_social_network

我和学姐从职业、爱好到性格都有非常多的不同,但并不是会相融的类型,因此常常也会去尝试或试图理解对方的 passion 所在,即使会常常发现更多的差异。

这周和学姐突然聊到为什么喜欢写代码,有时候这些动机和热情很难用只言片语来解释,突然想到几部影响我很深的电影/剧集,《The Social Network(社交网络)》、《Silicon Valley(硅谷)》等等,想到我订阅的 HBO MAX 已经好几个月没有打开了,于是趁着中秋假期一起看了《社交网络》。

大概是大学的时候我看了这部电影,后面的几年里又重温了几次,每次都能燃起我心中对代码与创造的热情,大概是由于把一个小小的想法实现为一个产品的奇妙历程总是让我着迷。

学姐提到 Mark 的自我中心、“渣”与背叛,或许天才或是成功的创业者或多或少有着自己的一些特质,但并不是必要成为一个“坏人”,好的秉性与好的技术/产品并不是那么水火不容,世俗意义上他成功了,但或许也失去了很多原本珍贵的东西。

在和学姐的闲聊讨论过程中我也发现了自己在其中 Ego 的部分,似乎「Code is law」的观念常常也会带来一些副作用,有足够的天赋或是写足够好的代码就会容易让人去忽视其中的自大、不尊重与不真诚的部分。

有时候这些观念也在侵蚀着我的日常生活,似乎 Coding 是极少的“仿佛”不需要合作就可以独立完成的事,也让我变得并不那么习惯于去合作,比如刚结束的 ETH Shenzhen 黑客松中我选择了自己一人队伍,很累,但似乎这于我而言是更为省力的一种模式,我似乎并不那么容易去信任他人,再深层一点我似乎并不觉得临时找几个队友能够做到什么我无法做到/学会的事,更严重一点也容易忽略他人的付出和贡献,尤其是非技术的部分,但有时候这还是挺糟糕的事。

正好公司内部很快就会举办一场为期一周的内部黑客松,我也会试着从中有意识地调整和观察自己在团队合作中的行为,也很期待一起做有意思的项目。

小小预告:和 Follow 有关。

中秋的现充生活

原本中秋想好好窝在家里写三天代码,但可能是由于前段时间总是睡前工作,精神和身体都有些许疲累,有点熬不动了,就趁着这几天好好休息调整了下。游了两天泳、去车库画了两天墙绘、第一次滑板上路、中秋回去家庭聚餐,现在的我现充得可怕。

似乎生活慢慢归于日常,多了很多似乎“无所事事”的时光,却也意外地珍贵。

car_garage_painting

想到今天在给墙绘画一块砖的时候,学姐说可以先近着描一些细节再走远了看一下整体,能够更好地把握画面。也看到墙绘从一开始到现在的对比图,看着墙面一点点增加细节(虽然我基本上是只是画了砖块),似乎也看到了生活的本质。

关于 RSS 的想法

上周我发起了一个选取邀请码的活动,原本只是因为邀请码稀缺而增加一些难度,但收到了很多评论,甚至总字数也远远超过了正文,能看到好多对于 RSS、阅读、信息处理的一些想法和探讨,发现 Remark42 可以订阅某篇文章的评论,我直接导入 RSS 链接 在 Follow 里看更新了。

有趣的事与物

输入

虽然大部分有意思的输入会在 「Yu’s Life」 Telegram 频道里自动同步,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。并且把 Telegram Channel 消息作为内容源搭建了一个微博客 —— 「daily.pseudoyu.com」,可以更方便浏览了。

收藏

书籍

文章

视频

周报 #72 - 滑板体验、Rust Conf 与 Follow 公测(含邀请码)

《Photograph - Ed Sheeran》

前言

weekly_review_20240908

本篇是对 2024-09-032024-09-08 这周生活的记录与思考。

去上海参加了 Rust Conf 2024,度过了两天,收获了很多周边,现场在同事的指导下重构我的用 Rust 写的 Api Server;Follow 进一步扩大了公测规模,要到了 10 个邀请码,会在本篇的评论区发放;还有很多有意思的事。

Lake 游戏

lake_pic_01

虽然团队的项目已经在上一周顺利上线了,似乎依然有不少需要忙的任务,工作时间偏晚,再加上早上要晨跑,工作状态和睡眠之间的界限比较模糊,有时候躺着很久都睡不着。持续了接近几天后,整个人有些提不起精神,于是决定晚上在 Lake 游戏中送送信放松一下。

lake_recommendation

好久之前就在 Randy 的一条推文了解到它,作为「Life is Strange 系列」这类游戏的爱好者,对于这种更生活化、平静却又引发思考的游戏一直很感兴趣。

如我在「周报 #70 - 消失的附近,Burnout 与 Boreout」中所说的那样,早早离开家乡的我现在也几乎没什么还在联系的童年玩伴了,小镇风景和我记忆里的村落当然也是天差地别,却依然被能够在各个小屋、邻居家亲切打招呼,倾听他们故事的感觉心生向往,或许这样的生活方式比起繁华的都市更加让人变得具体而知足。

不要问我一个程序员下班的时候还要扮演一个程序员下班/休假,我之前下班还玩「Shenzhen I/O」模拟程序员上班 🤡…

滑板体验课

我从小时候开始玩了十几年轮滑,几年前也曾学过一小阵子滑板,不过不算很系统,一直很想精进一下,后面也可以习惯滑板上路。

因为只是一小时的体验课,教练更多从滑行、放板、收板和转体的一些入门动作开始,纠正了挺多之前自己玩时候的不规范动作,慢慢也习惯了在板上的感觉。后面有两次因为想尝试下陡坡而狠狠摔了两跤,疼但却反而更有了一些运动后的压力释放感,也更感知到这一运动的魅力。

不过系统性的课程还挺贵的,可能考虑先自己再玩一阵子,10 月去清迈旅居的时候去找当地的教练学。

摔太惨就不放图了。

RSSHub 部署迁移

rsshub_hits

前几天因为不小心同步 OneDrive 和 iCloud 的时候用了自己 VPS 搭的代理,主力机器流量被刷完了,导致自建的 RSSHub 也停了。因为作为公益公开实例挂在 RSSHub 官网上,想着还是维护一下,于是转移到了另一台闲置的 2C2G 的机子上,发现机器瞬间被打爆了,看了下平均每分钟 100+ 次请求…

研究了一下发现 Zeabur 的模板没法通过 WebSocket 来访问 browserless/chrome 服务,现在用的镜像也并不内置 Puppeteer,很多网站没办法抓取,以至于很多路由失效,于是改了一下,发布了一个 Zeabur 模板,现在支持一键部署带 Puppeteer 的 RSSHub 实例了 —— 「RSSHub (With Puppeteer)」,欢迎一键部署。

然后自己部署了一份,也算是为 RSS 事业做贡献了。

Rust Conf

rust_conf_pics

这次没怎么拍照,偷了同事的周边图。

似乎每年都有那么一两个月会更“现充”地参与各种线下活动,和远程办公的同事/朋友们相聚。在参加完 ETHShenzhen 不久后,我又约了一些同事朋友来上海一起参加 Rust Conf,度过了有趣的两天一夜。

搜刮了一圈周边,去看了几个感兴趣的 Talk,和新老朋友浅聊一会儿,最后还是聚众在会场的一角 Review 和修改我写的 Rust 烂代码,学到了。

早上刚到就京东下单了一本「Rust 程序设计」,刚送到在酒店大厅开始学了…

个人生活剪影

偶遇的有趣设计

interesting_tre_huzhou

上周去湖州莫干山尝试了一下林间木屋,本身体验普普通通,但在返程时见到的一个有趣的大眼树却印象深刻,感觉在车窗的滤镜下有很日系。

有趣的事与物

输入

虽然大部分有意思的输入会在 「Yu’s Life」 Telegram 频道里自动同步,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。并且把 Telegram Channel 消息作为内容源搭建了一个微博客 —— 「daily.pseudoyu.com」,可以更方便浏览了。

书籍

文章

视频

音乐

Follow 公测特别活动

在之前的一篇「周报 #67 - 使用 follow 重塑我的信息输入系统」讲了我使用 Follow 这一应用的体验,依然十分惊艳。

一个多月过去了,依然是我每天都高频打开的软件,软件也迭代了不少新功能和亿点细节,慢慢也开始扩大公测规模了。

我向 DIYgod 要了 10 个邀请码来作为博客/频道读者的福利。

参与方式

在本篇文章下评论你关于阅读、信息流、RSS 使用或关于周报的相关想法,我会在北京时间 9.9 日 22:00 挑选 10 位发放邀请码,我会在评论区和 「Yu’s Life」 Telegram 频道公布名单,选中的用户可以联系 pseudoyu@connect.hku.hk 或任意我的社交平台私信。

活动后也可继续留言,如果我后续能拿到更多名额(或者我努力签到赚 Token),也会继续在评论区发放,欢迎参与。

周报 #71 - Indie App 体验计划

《Photograph - Ed Sheeran》

前言

weekly_review_20240903

本篇是对 2024-08-262024-09-02 这周生活的记录与思考。

这周我们团队做的去中心化索引正式主网上线,异常忙碌,输入输出和学习相较之前都少了不少;收到了 PaddingLeft 的贴纸;体验了 Xylect,想到一个好玩的计划;还有很多有意思的事。

RSS3 Node

rss3_node_epoch

这周我们团队忙碌了大半年的去中心化索引项目终于顺利上线 —— 「A New Era of Decentralized & Verifiable Data for AI & Open Web」。

理念和设计方面可以看白皮书 —— 「Whitepaper —— The de facto RSS3 Constitution.」。

有兴趣的朋友可以了解下。

更换贴纸

padding_left_03

Randy 的程序员周边品牌店上线了,见证了从他提到这个想法、到看厂家、再到正式上线售卖,执行力是真的强。

抢先体验成为了第一个下单的用户,刚好更换一批自己的贴纸。

padding_left_01

padding_left_02

在整理和更换贴纸的时候也发现慢慢成为了自己的记忆点。比如去 GopherChina 2023 拿了 JetBrains 官方的贴纸;去了 Rust Conf 2023 收获了很多小螃蟹;和同事去香港参加 Google AI 的会议拿到了 Google Cloud 贴纸,还在网吧枕着他们的周边抱枕度过了一晚。

突然有些理解手账的有意思之处,似乎能够通过这些痕迹来回顾自己去了哪些地方,又解锁了哪些新体验。

Indie App 体验计划

create_things_you_wish_existed

最近看到了一篇 laike9m 写的「推广独立开发产品,我做了哪些尝试」,讲了他推广 Xylect 这一划词 AI 搜索/翻译工具的历程。

自己其实也是早期 PopClip 的用户,后来也高强度使用 Bob、Haye.ai 等基于划词形态的产品,有些好奇,在官网看到有一条:

👨👩 Content creator? Contact me for collaboration and get free licenses

于是试着陈列了自己的 Twitter、TG Channel、博客、「GitHub - yu-tools」项目,发了邮件咨询了一下,很快得到了回复和 License 并加上了 TG 沟通,在使用过程中也提了不少用户侧的建议(有些已经在当前版本上线了),很新奇的体验。

文中有这样一句话:

开源项目永远是用户欠开发者,因为用户享用的是开发者的无偿劳动。而对独立开发(或者说所有的商业行为)而言,这种立场就完全逆转了。

自己一直很关注和向往独立开发,也试着自己开发过一些小产品,对于工具、效率类的开源项目和产品也常常第一时间去体验,时常有机会直接跟其开发者沟通,深知其困境。

而在和 WebP CloudXylect 开发者沟通的过程中,也发现我作为工具类产品的深度用户,时常也能从用户的角度提出一些小的建议,并通过文章(如「从零开始搭建你的免费图床系统(Cloudflare R2 + WebP Cloud + PicGo)」)呈现自己的真实使用体验和教程,常常也有开发者在我的博客评论下留言自荐项目。

于是萌生了一个想法,想着自己的周报和工具站「tools.pseudoyu.com」新增一个 Indie App 体验计划的模块,去体验自己觉得很棒的产品,会尽可能结合开发者和用户两个视角来给出自己的真实体验和使用方式,感觉会很有意思。

我并不是一个体量很大的 Infulencer,只是通过文字传达自己生活、思考和体验的内容创作者,并不一定能为产品带来多少用户或是付费转化,但我依然觉得好的产品值得被看见,哪怕只是增加了一点点。

我会从自己日常使用的产品开始,标准想引用之前看到的这句话:

Create the things you wish existed.

当然也欢迎通过 pseudoyu@connect.hku.hk 自荐~

有趣的事与物

输入

虽然大部分有意思的输入会在 「Yu’s Life」 Telegram 频道里自动同步,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。并且把 Telegram Channel 消息作为内容源搭建了一个微博客 —— 「daily.pseudoyu.com」,可以更方便浏览了。

收藏

播客

书籍

文章

视频

音乐

周报 #70 - 消失的附近,Burnout 与 Boreout

《Photograph - Ed Sheeran》

前言

weekly_review_20240901

本篇是对 2024-08-192024-08-25 这周生活的记录与思考。

消失的附近

disappear_neighbor

大概由于童年有七八年都是在老家长大,刚搬来杭州时候我所在的社区也有一群年龄相仿的玩伴,我大抵还算是一个“野孩子”。

在老家时候就不用说了,爬树、抓知了、下河摸鱼,折几枝柳树藤蔓自己做弓箭或是削弹弓,天地广阔,似乎总能有自己的乐趣。即使是到了杭州后,小时候每次吃完晚饭最期待的都是出去街道喊一声,会有人一起玩轮滑、滑板,会走街串巷地闲逛,也会去“富有”的朋友家里看他玩口袋妖怪(现在的「宝可梦」)。

而不知是自己年龄渐长还是整个城市变了,似乎现在鲜有“邻居”和“社区”的概念,总是一家一户一生活,甚至对家附近有哪些店、发生了哪些事也一无所知。

少年意气风发时候的自己自然是不甚在意,有很多同学、朋友,每次约出门也都是在繁华闹市街区,生活的“附近”太小,装不下自己的多彩生活。

然而,离开校园后的这几年的感受会更明显一些,即使生活确实显而易见地比之前丰富得多了,内心的孤独感却日渐增加。许多朋友渐行渐远,大家都有了新的工作、生活甚至是家庭,有时常常连开心或是难过的情绪都一时不知该向谁说。

还想起有一次在北京和渐仔相约打羽毛球,也一起吃了个晚饭,我们在合生汇看到了一个街机游戏厅,一起打了一个多小时的「三国志」,现在的我们已经可以不太在意花了多少游戏币,能不能打到通关,似乎只是想从中找回少年时的快乐。

可是却再也找不到了。

今年开始更频繁地去良渚和朋友一起办公,即使逾半小时的车程有些折腾,杭州夏日扑面而来的热浪也令人却步,在这每周难得的体验中似乎能够重新获得一些生活的能量和图中所说的对“附近”的感知能力。

Burnout 与 Boreout

前几周的某个周末,同事突然来问我最近状态怎么样,是不是发生什么事了。我起初有些诧异,其实自己感觉一切还算正常,详细聊了下后,才发现是自己的感知和实际的感知之间存在一些偏差,刚好也看到了这篇文章 —— 「Is it burnout or boreout?」,于是仔细回顾了一下这几个月的状态。

Burnout

总是有一些朋友会问我说是不是同时做的事太多了,但其实我自知并没有,甚至内心深处还是会焦虑自己做得依然不够多不够好。大概是“冒名顶替综合征”的影响,我总是觉得自己并不如同事朋友们那般有天赋与创造力,我似乎总是需要额外做一些事来填补内心的这种“不配得感”。

因此自大学来我一直以来都有“多线程”的倾向,在刚毕业职业发展的前期其实这种倾向给我带来了不少好处,我似乎成为了那个别人口中的“卷王”,总是在职责范围内做更多,学更多,也因此取得了许多不错的成果。

然而现在从实习开始算起的话,工作已经三年有余了,随着自己的能力刚刚好能满足工作的需求却有时候似乎难以有一些创新的时候,自己陷入了一种痛苦的“Burning Out”状态,一种职业的倦怠感,似乎有着一些工作量,但其实远远没有达到自己的承受范围或是极限,但有时候会让焦虑和自我怀疑包裹着自己的工作时间:

这个实现方案正确么?

我是不是应该在这个基础上做更多的优化,但似乎还没什么好的思路?

似乎同事都能够 handle 好自己的部分,我是不是应该更主动一点找到自己的定位?

这种 Burnout 的状态很狡猾,并不会让自己倦于工作本身,而是隐藏在工作量之下,所以自己甚至不太容易感知到,倦怠本身是一种情绪,让我缺少足够的能量去应付,同时会侵蚀自己的目标感和控制感,造成拖延和一些任务的错漏,然后加重自我怀疑。

Boreout

工作的前两年其实一切都是新的,工作任务和技术学习所带来的正反馈和刺激感很强,而现在工作任务只要付诸时间基本上能够独立或和同事的协作下完成,但由于工作内容相对稳定了,一项项 checklist 打钩所带来的满足感远远比不上学习一门新语言或是新框架,自己似乎又陷入了一种“Boreout”,对自己所做的工作内容以及自己所能为这份工作贡献的价值产生了怀疑。

以同事聊到工作状态之后这两周正视了这一问题,感觉产生了一些效果,恰好也对应文章中给出的几种解决方案。

Align

当时选择参加现在的公司和项目时,更多是由于其氛围和价值观,一年多过去了,其实原本的理由犹在,外力并不是造成自己状态改变的理由,应该更多向内探索。

Brainstorm

自己其实算不上什么独狼的性格,只是确实常常有些难以做到去麻烦别人,再加上有些 i 的性格,在群组讨论中似乎更多还是听从者的角色,参与感的缺失有时候也是自我怀疑的来源,像是和同事聊聊自己的问题,或是线下一起办公、参加活动,似乎能够更多汲取热情和能量。

Experiment

尝试在工作方式上做一些小的改变而不是因循原有线性的模式,并不每次都把“创新”作为唯一目标(往往会因无法达到而产生挫败感),有时候仅仅是一些方式的改变,在技术调研时的多几分探索,似乎就已经足够产生一些改变了。

有趣的事与物

输入

虽然大部分有意思的输入会在 「Yu’s Life」 Telegram 频道里自动同步,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。并且把 Telegram Channel 消息作为内容源搭建了一个微博客 —— 「daily.pseudoyu.com」,可以更方便浏览了。

收藏

书籍

文章

视频

周报 #69 - AI Coding 体验与学习的源动力

《Photograph - Ed Sheeran》

前言

weekly_review_20240819

本篇是对 2024-08-122024-08-18 这周生活的记录与思考。

从 VS Code 转向 Cursor 写代码,聊聊 AI 加持下的编程体验;和学姐在一起 400 天;某天和学姐有了关于过去经历和兴趣爱好的一次深夜长谈,引发了我对自己的学习源动力思考;还有很多有意思的事。

AI 加持下的编程体验

cursor_screenshot

这两周高强度使用了 Cursor,一个基于 VS Code 的 AI IDE,效果很惊叹。

我其实算是 GitHub Copilot 的非常非常早期的内测用户,直到现在也还在用;而在 ChatGPT、Perplexity、Devv.ai 和 Claude 出现后也都是高强度的付费用户,思维上已经很习惯使用 AI 来帮我写代码了,但是更多还是补全部分逻辑和调试 Bug,没办法做到项目级的辅助。

而在 Cursor 把整个项目作为上下文、提问时可以 @ 其他文件或代码、并且使用 Claude 3.5 Sonnet 模型之后,体验感和可用性已经和我想象的形态越来越近了。

web3insights_demo

实践上,在试用 Pro 的 15 天中,解决了我工作中的 Go 的一些 Bug 修复和新增 Tests;改进了 Electron 应用的一个更新提示界面和功能;从零开始帮助我写了一个 rust 的后端 CRUD api 包括完整的 Dockerfile 和 GitHub Action 部分;帮助我完成了一个 Remix 项目的数据可视化部分以及很多个界面的调整,精确到各个页面之间的交互和布局;以及顺便还帮我学了一些 SwiftUI。

我大概已经有 50% 以上的代码是在 AI 辅助下甚至直接 AI 生成的了,而我更多的时间都是「CMD + K」(Cursor 的代码生成快捷键)的对话框中跟 AI 沟通需求,在梳理 prompts(大部分就是按照对话自然语言来表述),对话或是等待代码生成的时候反而有了更多时间去思考代码架构、逻辑、更合适的第三方库等。

其实让 AI 了解我的需求的时候,自己也在反复思考其合理性,反而能产出功能和代码质量都更优的代码,至于语法和代码风格方面,我常常直接去研读和学习 AI 的实现,比起从零开始去读一个开源项目要好上手得多。

而我需要做的,就是设计和创造。

正如 Randy 在 「代码艺术家」不会被 AI 取代 一文中所引用的:

I realize the reason I like building is not just because I’m a builder.

我意识到我一直喜欢创造点东西的原因不只是因为我就是个创造者.

It’s because software products are how I express my creativity.

而是因为写软件产品是我表达我的创意的一种方式

It’s like a poem to a poet, a song to a songwriter, a painting to a painter…

就像诗人的诗,歌手的歌,画家的画

Software is my art form, my medium of expression.

软件是属于我的一种艺术形式,是我表达(创造力)的媒介。

ETHShenzhen Hackathon

web3insights_ethshenzhen_demo

上文提到的项目是我周末在深圳参加的活动,其实算是自己正经作为选手参加的第一个 Hackathon 活动,通宵两晚写完了 Demo,在现场写了基础的演讲大纲和几张简略的 PPT,最后完成了 Demo 演讲,比想象的还是要累不少,周日才睡上一个好觉。

学习的源动力

有一天晚上从给我妹妹选滑板开启了话题,和学姐夜谈到了过去的一些经历,以及自己的各种兴趣爱好。

我的奇奇怪怪的技能树和兴趣爱好其实不算少。学生时期大大小小的运动至少都接触过,大部分也还算上手;小时候也用那种扭扭的滑板四处刷街;轮滑自小学开始到大学参加轮滑社坚持了接近十年;跟着我表哥一起去游泳馆玩,自然地学会了游泳;大学后玩了摄影、学了剪辑,在全校飞无人机,也成立了工作室从各种灯光布景都研究了下;做过审计的实习、甚至因为创业开公司而自己把注册公司、财务报税、开发票、企业清缴汇算申报以及注销流程在没有中介和财务的帮助下自己操作了近两年;工作中也是对各种编程语言框架都很好奇,算是经常尝鲜。

我似乎一直有这样野路子学习的倾向,以及在学到了恰好足够满足我当时的需要时就戛然而止,并没有更多的欲望去深耕其中。例如,我算是喜欢摄影,甚至在做摄影和视频相关工作室创业的时候也有过把它作为自己事业的念头,但那么多年其实我似乎并没有真正地从构图、光影、色彩、修图这些去系统学过,视频拍摄剪辑也没有从戏剧理论、导演思维这一块打基础,只是在需要用的某个技巧或是功能的时候再去快速学习,够用但也仅仅是够用。

我认真剖析了自己的内心,发现了很有意思的现象,还会追溯到童年甚至更小的时候。

我很小的时候转学来到杭州,其实花了很多时间来让自己讲话不带乡音、以及花了好几年成绩才慢慢达到中上,也经历过一些带着歧视或是不公,内心积累了不少自卑的部分。而随着初中遇到了很好的老师,生活和学业才慢慢走上正轨。

这时候其实多了另一种评价,“你做到 xxx 一定很努力吧”

我并不是否认“努力”的重要性,只是常常被那么说,总觉得有些挫败,似乎连我自己都觉得,我就是不如别人,只是很努力,所以比别人取得了更多的收获,陷入 Impostor syndrome (冒名顶替综合征) 的自我恶性循环。

于是我慢慢开始不那么“努力”,似乎在向他人和自己证明,我能“轻易”做到这些事,渐渐地,也享受其中。

带给我快乐的常常并不是学到的知识或运用它实现什么,而是“学习一个新东西”和“我能够很快学会它”这样的心理正反馈。这带给了我一些好处,如长期这样乱点技能树积攒的信心让我面对新事物或许多看似遥远的目标时不会那么畏惧 ——

“过去的我做到那么多了,现在的我一定也能”。

但也让我有时候并没办法沉下心做好一件事,或者把某项真正喜欢的事做到最好,有广度而缺深度,感觉也是一种 trade off,慢慢也开始有一些改变。

个人生活剪影

400 天纪念日

love_record_400

和学姐 400 天了。

有趣的事与物

输入

虽然大部分有意思的输入会在 「Yu’s Life」 Telegram 频道里自动同步,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。并且把 Telegram Channel 消息作为内容源搭建了一个微博客 —— 「daily.pseudoyu.com」,可以更方便浏览了。

收藏

播客

文章

视频

周报 #68 - 关于写博客这件事与我生活的色彩

《Photograph - Ed Sheeran》

前言

weekly_review_20240811

本篇是对 2024-08-052024-08-11 这周生活的记录与思考。

从 TG Channel 里回顾了一下这周,发现一整周都围绕着搭博客和写博客这两件事,有了一些思考与分享欲,大部分内容都发过,算是一个整理了。

写博客的 ROI

blog_roi_x_discussion

前几天在推特上看到了关于写博客的一些讨论,又看到 Innei 的这篇「从讨厌写作到乐于分享:我与写博客的心路历程」,很有意思,于是趁机仔细回顾了一下整个写博客的历程与收获。

最后得出一个个人的结论是,我也觉得写博客是一件成本不低、周期长但 ROI 非常高的事。

如果按照广义的发自本心的写作来说,从高中左右就开始写散文、公众号、博客等等,持续了接近 10 年了,真正直接从为自己写的文字赚到的收入大概只有少数派发的六七篇上了首页的文章共计 3000 元左右稿费和一位读者坚持了一年多了依然还在每个月给我 GitHub Sponsor 的 5 刀赞助。

一开始就有心理预期,脱离了公司的薪酬外,不管是做产品还是写文字,哪怕让用户/读者为你付一美元都是一件并不容易做到的事,但就像 Randy 在 Notepal 的一篇文章里说的,「有人愿意购买」的意义远比数目的大小更大。

写博客也带来了非常多潜在的意义和回报。我去年来现在的公司面试时,一位当时的面试官现在的同事就有说,全组在面试前都有看过我的周报,对我的性格、技术力和学习能力等已经有了一些初步的了解了;在社交媒体上,也通过文字让我和许多我非常崇拜的人有了更多更深度的交流甚至是合作;在许多线下活动做了简单自我介绍后,也常常能听到一句“哦,我看过你周报,很喜欢”。

这些都是并不以此为目的但在长期的坚持中收获的惊喜。

而不论是写博客还是其他形式的创作,似乎都有着相似的路径。起初新鲜而动力十足;逐渐在漫长的周期中消磨信心,看到别的好的文章/作品感受到的不是美好而是压力 —— “为什么我写不出来”;慢慢沉淀回归自我,恣意、快乐,享受其中。

我生活的色彩

colored_camera

想起来在刚写周报的时候由于读了村上的一本小说而写的「周报 #09 - 没有色彩的 Yu 和他的巡礼之年」,里面我这样写道:

多崎作所在的小群体中其他四人以及后续结交的挚友的名字都巧合地包含了颜色词:“赤”、“青”、“黑”、“白”、“灰”,让他感觉自己就像是一个没有个性的存在,连带着没有色彩的人生。

其实关于自己名字的埋怨常常有,『请回答 1988』里德善也有向父母埋怨自己的名字毫无特色,不如姐姐宝拉。我也曾有过这样的想法,似乎自己的名字简短而没有特色,再加上也是几个大姓之一,常常在一个学校遇到不少同名的人,与之相伴的就是自己常常也需要额外努力才能留下更多记忆点。

虽然后续也和自己和解了,但似乎还总是感觉自己的生活与有趣已经无缘了。总是羡慕别人的有趣个性和经历,也常常在即使自己做得不错时也只是觉得在履行自己平凡人生的职责或是这些都并不属于自己。

就这样平凡的我常常也会犹疑,自己的生活“流水账”是否有这样的价值呈现在所有人的面前,直到最近恰好在 B 站上看到这样一个视频 —— 「什么是好看的色彩?拍视频五年,我调色成了什么样」,是讲调色相关的,里面的一句话却深深打动了我:

当我第一次把镜头对向自己的时候,我才发现拍得可以那么惬意,没有压力。这时我才发现,我以前羡慕的不是那个画面,而是背后浪漫热烈的生活,这是我爱折腾的意义,我想让你看到我眼里的世界,而我屏幕里最好看的颜色,就是我生活的底色。

这是对我现在写周报时的心境最恰如其分的形容。

博客搭建系列

博客搭建系列终于更新完了!前后加起来也有 10 篇之多,自己也算是入围博客装修赛道的了。

从一开始 Vercel 部署都不太会用,到现在市面上的 Serverless 几乎都玩过一圈了,很有意思的体验,一切都按照想法运作的体验真的很美妙,搭博客和写博客确实各有乐趣。

2024 版

比起两年前其实发布流程与外观几乎没什么变化,但组件和内容却已经很不一样了。

2022 版

除了平台有些变化,很多不再提供 Free Plan 外,流程基本都依然适用的。

不知道下一次更新这个系列的时候,自己会在做些什么,又在想些什么呢。

多语言支持

en_version_blog

其实我的博客一直是有双语的功能选项的(导航栏可以全站切换/文章中也可以直接点击对应语言切换),只是一直很偷懒所以只是把中文文档复制过去,今天早上通过 Claude 的 Projects 功能把现存所有文章都翻译了。

新建了一个 Blog Translation 的 Project,输入一个全局 Instruction,之后就把 Hugo 的 markdown 源文件丢进去就可以了。

模型使用的是 Claude 3.5 Sonnet,为了节省上下文,我每篇文章开了一个新的对话,发现一百三十多篇文章都翻译完了居然还没触发 Claude Pro 的 usage limit(在 9:40 am 的时候提醒了一下 10 am 前只剩 10 条,之后再也没有出现过),有点良心。

因为我今天的目的主要是完成所有文章的转换和粗校,后续内容上的还是会人工去校对一下,所以用的 Prompt 比较简单,不过返回格式的可用性和翻译质量都超乎想象。

You will receive a Chinese blog post in Markdown format (.md) using the Hugo template. Translate the content into English, adhering to the following guidelines:

  1. Use a literary tone for posts in the “Idea” category; otherwise, employ a professional tone.
  2. Maintain consistent terminology, especially for structural elements like “preface” and “conclusion”.
  3. Preserve all Markdown formatting and metadata, including Hugo properties, links, audio, images, and other elements.
  4. Translate only the blog content itself.
  5. Return the result in Markdown format for easy copying.
  6. Do not add any introductory statements, explanations, or additional content to the blog.
  7. Provide only the raw translated Markdown content in your response.

有趣的事与物

输入

虽然大部分有意思的输入会在 「Yu’s Life」 Telegram 频道里自动同步,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。并且把 Telegram Channel 消息作为内容源搭建了一个微博客 —— 「daily.pseudoyu.com」,可以更方便浏览了。

书籍

播客

文章

视频

电影

  • 生活多美好,久违的看到流泪的片子。跟《土拨鼠之日》一样,看完会重拾一些对生活的热情与周遭 relationship 的思考;也不需要多么精致的画面或是置景,演员的眼神似乎都是亮的,透着灵性,这大概也是老电影的魅力。

使用 GoatCounter 与 Zeabur 搭建网站数据统计系统

前言

在「2024 年了,我的博客有了什么变化」一文中,我介绍了自己使用 Serverless 平台和一些开源项目搭建的博客系统,也开启了这个系列教程来记录搭建和部署全过程。

本篇是关于统计系统的解决方案。

统计系统方案

相比起博客本体和评论系统,我在很长的一段时间其实都没有在意过统计系统(主要当时也没人看),更加没考虑太多 SEO 或是什么其他推广方向上的事,但后来逐渐发现,其实统计下来的数据并不只是一张好看的可以用来发推的图表,其对于博客的选题、内容都有着很大的参考价值。

其实主流成熟的方案都能够满足基本的需求,即使是免费的 Google Analytics 也完全够用,但在博客发展过程中,我依然因各种原因有过几次迭代,最终使用了 GoatCounter 这一方案。

splitbee

我最初使用的是一个免费的工具 splitbee,它提供了免费的基础统计额度,有着还不错的界面,并且还支持一些复杂的用户追踪,A/B test 等,但印象里好像只能保留半年的数据,并且每月超过 5000 pv 后就需要升级了,所以后来放弃了。

Cloudflare + Google Search Console

cloudflare_web_stats

放弃 splitbee 之后,很长一段时间我没有集成额外的统计应用,而是用的 Cloudflare 自带的站点统计,但是发现它其实统计的只是网络总流量,有包括爬虫在内的非常多的无效数据,并且没有精确到路径等细节。

google_search_console

后来了解到了 SEO 这一概念后,又添加了 Google Search Console 这一统计维度,这也是目前觉得对我写博文最有意义的数据,主要呈现的是用户在搜索引擎中触达我博客站点的关键词以及通过搜索点击进入我博客的页面路径。

可以看到,一篇「Warp,iTerm2 还是 Alacritty?我的终端折腾小记」为我带来了许多访客,而关于博客搭建、智能合约开发也是大部分从搜索引擎来的自然用户对我博客的第一印象。

Umami + Supabase + Netlify

yu_umami_record

但是上述两者依然只能看到网站整体的数据,想精确到某篇文章在一段时间的表现或者文章发布后的实时访问数据,依然需要一个统计系统,我在看了 Reorx 的一篇「搭建 umami 收集个人网站统计数据 | Reorx’s Forge」选择使用了 umami 这一开源、易自部署的统计系统,界面简洁,功能易用,很方便集成到自己的博客系统中。

使用了一年半,一直倒没出现什么问题,,只不过可能因为自己用得比较早,在一次大版本更新的时候数据库 Migration 脚本出现了不兼容的字段更新,其实有点不理解这样量级的开源项目为什么会出现这样的问题,也看到 issue 中有很多其他用户有同样的诉求,但最终并没有给出一个比较好的解决方案。

但其实最大的问题是一个统计系统依赖了两个平台,部署和维护上都还是有些太重了。当数据库或是 Netlify 任一出现问题或需要迁移时,会带来许多额外的成本。于是前段时间在更新博客评论系统的时候,想着干脆就一起更换为更轻量的 GoatCounter。

GoatCounter + Zeabur

goatcounter_stats

这个小众的统计系统是我在看 Reorx 的博客代码更新的时候偶然发现的,一下子被这种 Retro Internet 的风格所吸引,几乎没有任何多余的按钮,功能却很完备,而且使用的是 go 单二进制文件 + sqlite 数据库单文件的架构,轻量而易于部署,于是打算迁移。

其实我自己的 GoatCounter 是部署在 fly.io 上的,但我在上一篇 Remark42 的文章中已经非常详细地介绍了 fly 的操作说明,不想有太多重复,刚好最近又在重度使用 Zeabur 这一 Serverless 平台,于是本文将以 Zeabur 为例,方式同样适用于其他类似平台。

我也在下文的 Zeabur 部署方案之后提供了 fly.io 和在 VPS 上使用 docker-compose 部署的配置文件,供大家参考。

GoatCounter 部署说明

GoatCounter 本身代码开源 —— 「GitHub - arp242/goatcounter」,文档清晰易读,可以根据自己的实际需求进行配置。GoatCounter + Zeabur 的方案仅牵扯到单个服务,数据库使用的是 sqlite 挂载于 volume 中,所以部署起来非常简单。

使用 Zeabur 部署

Zeabur 对于容器应用的部署是需要 Developer Plan 的,5 美元/月,但是像这样的镜像服务整体用量和费用都较低,每月的额度足够部署非常多服务,可以酌情选择。整体部署流程比起 fly.io 简单很多,所有操作都可以使用 Web 界面完成,不需要额外安装命令行工具等。

注册 zeabur

zeabur_login

访问 Zeabur 官网,并点击右上角,使用 GitHub 账号授权登录。

创建新项目

zeabur_new_project

进入主界面后,点击右上角 创建项目 按钮。

zeabur_hk_region

我选择了香港的 AWS 机房,不同机房的访问速度、性能和价格会有一些差异,可以根据自己的需求进行选择。

配置镜像部署

zeabur_build

在下一步中选择 Docker 容器镜像进行部署。

zeabur_docker_custom_config

由于我们使用的是自己构建的镜像,官方也没有上线 GoatCounter 模板,因此我们点击选择自定义。

zeabur_prebuilt_edit_toml

这一步可以自己在界面上填写各种配置项,但可能由于我习惯了 fly.io 的文件配置模式,我选择左下角的 编辑 TOML 文件,大家也可以直接复制我的配置文件并直接修改。

name = "yu-goatcounter"

[source]
image = "pseudoyu/goatcounter"

[[ports]]
id = "web"
port = 8080
type = "HTTP"

[[volumes]]
id = "goatcounter-data"
dir = "/data"

[env]
PORT = { default = "8080" , expose = true }
GOATCOUNTER_DB = { default = "sqlite3://data/goatcounter.sqlite3" , expose = true }

zeabur_prebuilt_goatcounter_toml

配置好后点击右下角部署按钮即可。

部署完成

yu-goatcounter_project

点击部署后,等待片刻,会有一个生成的项目默认名称,可以在左上角的设置中去修改为可读性较强的名称,如 yu-goatcounter

配置自定义域名

zeabur_create_domain

服务部署完成后,我们需要进行域名绑定才能通过公网访问网站,Zeabur 提供了免费的二级域名 xx.zeabur.app,也可以绑定自己的域名。

zeabur_custom_domain

其中生成域名可直接使用,无须进行其他配置,如 goatcounter.zeabur.app;而如果使用的是自定义域名,则需要在自己域名管理后台添加 CNAME 记录,指向格式为 xxx.cname.zeabur-dns.com 的机房地址。

cloudflare_goatcounter_config

例如我的域名托管在 Cloudflare 上,添加的 CNAME 记录如上图所示,有去问过官方,说如果选 AWS HK 机房的话可以不使用 Cloudflare 的代理,速度理论上会更快,可以根据自己的需要酌情配置。

此外,如果你选择的是华为云机房,则需要域名备案并且额外新增一条 TXT 记录,可以根据提示进行操作。

zeabur_custom_domain_success

显示绿色则为配置成功,至此我们的 GoatCounter 服务就部署完成了。

数据备份

我们在配置时候有这么一段

[[volumes]]
id = "goatcounter-data"
dir = "/data"

功能是将容器内的 /data 目录(即我们的 sqlite 数据库存在的位置)挂载到一个 id 为 goatcounter-data 的存储卷,如果不挂载存储卷的话,容器重启或重新部署数据将会丢失。

关于存储卷这一点 Zeabur 的界面上没有很直观的显示和管理操作,以至于我总是怀疑自己的配置是否生效。

zeabur_add_goatcounter_backup

研究了半天发现可以先在设置中暂停服务,然后在上面的备份模块新增一个备份,点击下载后可以在本地看到我们备份文件,目录层级如下:

data/
└── goatcounter-data
    └── goatcounter.sqlite3

这样则能表示我们的数据成功持久化了,希望 Zeabur 能在界面上有更直观的显示。

使用 fly.io 部署

纯免费的方案依然可以参照我提到的这篇「从零开始搭建你的免费博客评论系统(Remark42 + fly.io)」,仅在 fly.toml 配置部分不同,我也提供的我所使用的配置文件 —— 「fly.toml」供大家参考。

使用 Docker 与 docker-compose 部署

有意思的是,因为 goatcounter 的作者很有坚持,觉得这样单文件的应用容器化反而会增加更多维护成本,所以不提供官方镜像,不过自己在 vps 或者 serverless 平台部署有个镜像还是方便一些,所以我使用 Github Actions 做了一个构建镜像和上传 Docker Hub 的 CI,有需要的可以使用,对应的 Dockerfile 和 Docker Compose 文件也可以参照这个 Commit,或者直接使用 pseudoyu/goatcounterdocker-compose.yml 文件即可。

version: '3'

services:
  goatcounter:
    image: pseudoyu/goatcounter
    ports:
      - 8080:8080
    environment:
      - PORT=8080
      - GOATCOUNTER_DB=sqlite3://data/goatcounter.sqlite3
    volumes:
      - ./data:/data
    restart: unless-stopped

GoatCounter 配置说明

上文我们完成了 GoatCounter 服务的部署,现在就可以通过我们生成/自定义的域名访问到我们的统计系统服务了,如我是通过 https://goatcounter.pseudoyu.com 进行访问的。

goatcounter_create_user

第一次登录需要创建一个用户,填写邮箱、密码点击 Create 即可。

goatcounter_dashboard_success

登录成功后,当前还没有数据,会提示一个脚本,后续在我们博客使用的配置中会用到。

博客配置 GoatCounter

跟着上文我们完成了 GoatCounter 服务的部署和基础配置,现在则需要在我们的博文中加入统计组件,以我使用的 Hugo 博客为例。

<script data-goatcounter="https://goatcounter.pseudoyu.com/count"
        async src="//goatcounter.pseudoyu.com/count.js"></script>

add_goatcounter_script_in_hugo

将上述代码加到我 hugo 主题的 head 中即可,如我的 Hugo 主题在 layouts/partials/head.html 这一文件,不同主题或是不同 SSG 框架位置有所不同但大同小异。

有一点要注意的是, goatcounter 会忽略来自 localhost 的请求以避免在本地预览时造成太多脏数据,因此在本地调试时是看不到数据的,需要部署网页才能看到访问数据。

final_display_of_goatcounter

收集了数据后的效果大致如上图所示,还可以在 GoatCounter 界面中设置一些配置项、新增网页、查看详细数据等,包括还可以显示每个页面的访问计数等,可以自己根据文档进行探索。

总结

至此我们的博客统计系统就搭建完成了!本文是我的博客搭建部署系列教程之一,博客主题体部分都已经完成了,剩下只是一些例如博客内搜索等细节体验优化,希望能对大家有所参考。

周报 #67 - 使用 follow 重塑我的信息输入系统

《Photograph - Ed Sheeran》

前言

weekly_review_20240805

本篇是对 2024-07-312024-08-04 这周生活的记录与思考。

这一周最开心的是体验到了 follow,久违的一款让我有兴奋感的应用,对比了 Readwise,并决定退掉订阅;做了一套自部署的 Web Archive 方案,eat your own dog food 的感觉真好;继续和学姐一起做墙绘;还有很多有意思的事。

使用 follow 重塑我的信息输入系统

我的信息输入系统

很久之前自己其实是一个信息重度依赖者,遇到好的博客/资讯网站,迅速加到 RSS 订阅源中,看着分类/标签井然有序的列表傻乐;遇到好的 newsletter,也马上用邮箱订阅;每天早上第一件事就是把当时还在用的 Reeder 4 未读清空,再将 newsletter 中的邮件一条条浏览。

起初其实还行,似乎自己关心的一些资讯和文章都能第一时间读到,有一种满足感,但逐渐就有些过载了,每天早上花在上面的时间越来越多,即使并不感兴趣的文章也会花费一些时间去消化,与其说是获取信息,倒不如说是一种信息渴求和对信息焦虑的代偿,效果自然是有的,信息都在大脑中留下了痕迹,但消化效率并不高。

在阅读了「使用自动化工作流聚合信息摄入和输出」和「对 Newsletter 说不」这两篇文章后,我做出了很大的调整。

信息源方面,我退订了所有公众号和 newsletter,并将 RSS 订阅源缩减到 50 个左右,剩下的大部分输入都来自于 Twitter、他人的 Telegram 频道等,在把输入控制在一定量级的同时一定程度上避免信息茧房。

并且由于使用 n8n + telegram channel 构建了一个输入、输出源的自动同步系统,会把我所有筛选过的信息源自动同步到我的 Telegram 频道「Yu’s Life」中,方便自己查看和回顾,顺便也作为一个个人分享渠道了,而因为有了公开的压力,也反向推动我更认真地筛选信息源。

但这个方案依然存在两个问题:

  1. 依然没能解决我信息源分散的问题,我需要频繁在 Twitter 和各个 TG Channel 之间切换,很容易分心并且依然可能会错过一些消息
  2. 我常常把频道作为我某种程度上的收藏夹,有时候很多信息很个人化,随着频道的关注者越来越多,我也会有一些心理压力,担心成为他人的信息噪音

而 follow 的出现恰好填补上了我方案的这一环。

follow

介绍

Next generation information browser

这是 follow 的 slogon,发布之前我也仅仅是把它作为一个 RSS 阅读器的 Alternative,虽然我也很熟悉 RSSHub 且自己部署了实例重度使用,但依然很难想象基于这一古早的协议还能有多大的发挥空间,直到发布和几天高强度使用后,才逐渐理解这一理念。

在 RSS 早已式微的当下,除了独立博客这一处境差不多的古早形式几乎都还保留着完整的 RSS 支持外,大部分新闻、资讯和各种小众网站都已经不再提供了,RSSHub 则是完美的且几乎是唯一的解决方案了,可以将包括但不限于 Twitter、TG Channel、Bilibili 和网易云歌单的一些网页信息源转换为标准 RSS 格式,可以像订阅文章一样获取这些信息源的更新。

然而,RSSHub 终究还是更中间层一点的工具,即使有了标准的 RSS 数据,大部分阅读器依然只能处理文本显示,对于音视频图片的处理基本上只停留在当作一个 url 这一程度,因此我更多也是应用在自己的 n8n 同步工具流中作为通知,只保留其 title 与链接,依然是点击源链接跳转会对应的网页查看,使用起来常常有些割裂。

follow 最大的特点自然还是传承于 RSSHub 的「万物皆可 RSS」理念,在应用层对视频、图片、博客音频、文章、社交媒体等多种形式的内容都提供了呈现方式,确实有一种看久了 pure html 突然飞跃到加了现代化 css 效果的感觉。其实技术层面做到这一步算不上有太高的壁垒,不论是视频 iFrame、音频播放器或是图片预览都有比较成熟的组件可以使用,但 follow 几乎是唯一一个依然在针对这一协议做且做好这一步的产品。有时候,做好一点就足够了。

体验

follow_homepage

作为一个信息浏览器/阅读器,最直观且核心的就是界面和交互了,DIYGod + 拾一两位的组合早早把我的期待值拉满,但即使是内测的第一版,其完成度和体验也依然让我感到惊艳,在此之前最现代化的应该要数 Reeder 4 了,而 follow 即使是 Electron 而不是纯原生,也依然保持了极其精致的设计和交互。

我之前用过 NetNewsWire、Reeder 4、Miniflux 和 Readwise Reader 等多款阅读器,但由于阅读体验常常还不如原网页,我大多还是会选择跳转链接查看,而 follow 的页面和交互则本身就让我享受其中,还有一个很有意思的最近阅读记录显示,可以看到自己这篇文章有哪些访客,还可以点进主页去看他们的订阅源,兼具了社交属性和信息源的积累,我就通过这种方式发现了很多之前没关注到的个人博客。

另外,由于 follow 和 RSSHub 深度集成,可以实现输入 twitter handle,B 站 uid 以及 youtube channel name 之类的来直接订阅社交媒体,而不用自己去文档找 RSSHub 网站的对应路由,也不需要自己去搭建实例,非常友好。

follow_pic

follow_video

而针对视频和图片的直接显示也是一大亮点,还看到有一个使用者将一些设计师的 Twitter 作为自己的设计灵感源和审美积累,也是很有意义的应用场景。

而音频/播客则可以在 follow 中全局播放,例如前几张截图的左下角,我就是同步在播放「代码之外」的一期节目,这也解决了我需要在 Apple Podcast、Spotify 和小宇宙等多个播客应用之间反复横跳的问题。

另外也可以比较方便地分享自己的订阅:https://web.follow.is/profile/pseudoyu

其实还有不少设计,如 Action 模块、Power 打赏等,但本文并不是一篇软件测评而是个人体验向,所以就不过多展开了,等后续开放了大家可以自己去体验一下,保留一些惊喜感。下面想谈谈和我目前所在使用的 Readwise Reader 的对比,以及我为什么打算转换到 follow。

Readwise Reader -> follow

readwise_sub

我大概是去年 9 月订阅了 Readwise Full 会员,虽然为发展中国家提供了 50% 的 discount,但依然需要接近 50 刀一年的费用,它大而全,但我使用的核心功能其实只有三点:

  1. rss 阅读器
  2. 稍后读、 保存文章与划线标注
  3. Daily Digest

其中第一点是最高频的,作为一个很方便的阅读器来管理自己的文章等订阅,也有移动端 app 可以随时看,但在使用中发现有时候显示样式和图片加载比较一般,而分类、快捷键又有点太繁复,且主要支持的还是文章,显而易见可以被 follow 完全替代(蹲一个移动端)。

划线标注之前用得比较多,会使用插件在一些文章做一些笔记,并保存到 Readwise 中,再通过 n8n 将我的文章同步到 Telegram Channel 中,但其实有些过于依赖平台了,在我真正想要消化那些划线笔记整理成一些成型的想法或是文章时则需要回到 Readwise 中去查看,即使同步到 Logseq 或是 Heptabase 中整理依然不算方便,尤其是现在转向 Apple Notes 作为自己的主力且唯一笔记工具后,发现有一些想法直接摘录/记录下来才是效率最高也更容易产生价值的,因此划词这一点渐渐淡出了我的笔记流。

save_website

众所周知,稍后读通常都会演变为稍后再也不读,所以我现在的策略是几乎不用稍后读,尽量当下就读完,只有极少数比较长的会暂存一下,也尽量在当天清空 list。我现在则是在 follow 中以未读为默认显示模式,时常会浏览一下,遇到感兴趣且通读了的文章会使用 star 功能,保存在收藏夹中,读完有所收获的时候则会通过一个自己做的浏览器插件 + Cloudflare Worker api + n8n 将文章链接及源 html 文件保存到 D1 数据库,实现 Web Archive 并自动同步到我的 Telegram Channel 中。

而第三点 Daily Digest 则是会帮助我回顾一些自己的笔记或是文章,这一点有用但并不高频,还没细研究 follow Action module 能不能针对多篇文章做一些操作。

由于我的核心需求都可以转移到 follow 中,于是果断退订了 Readwise。其实能明显地感受到这几天我的信息摄入量和质量也显著提高了,一个好的软件其实并不仅仅是辅助工具,是会对思维与习惯产生更深远的影响。

个人生活剪影

Electron Bug

talk_with_innei

刚发现 follow 客户端更新有个问题,点击「Click to restart」窗口 hide 了而不是 quit,熟悉的 bug,之前写 EpubKit 我写过一模一样的 🤣 报给了拾一,属于 electron 病情交流了。

macOS 桌面装修

macos_widgets

第一次尝试 macOS 系统的桌面小组件,还挺新鲜的,不过我基本都是 Raycast 快捷键切换应用,几乎看不到桌面…

车库墙绘

car_painting_week2

本周总体进度:20%,已经初具雏形了。

本周我的进度:画了五六块砖 🤣

有趣的事与物

输入

虽然大部分有意思的输入会在 「Yu’s Life」 Telegram 频道里自动同步,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。并且把 Telegram Channel 消息作为内容源搭建了一个微博客 —— 「daily.pseudoyu.com」,可以更方便浏览了。

收藏

播客

文章

视频

电影

  • 走走停停,很喜欢最后高速堵车那段的镜头语言,人生不过走走停停。

周报 #66 - 10x 工程师、技术热情与个人工具箱

《Photograph - Ed Sheeran》

前言

weekly_review_20240730

本篇是对 2024-07-222024-07-30 这周生活的记录与思考。

经过了异常丰富的 Adventure X 一周活动,算是回归了沉下心写代码的日常。忙于一些工作需求;使用 Cloudflare Worker 继续开发 EpubKit 的 api 部分功能;使用 Go 重构了一年多前就启动但是一直没成型的 side project 后端部分,并开始尝试用 rust 写一个 api server;为自己一个个人工具箱项目「GitHub - yu-tools」写了一个 Astro 网页项目「tools.pseudoyu.com」;写了 Remark42 部署的教程博客,并经过了一位在搭建博客系统的读者的可行性验证;全家去千岛湖一个水上乐园玩,感觉自己太现充了;尝试水彩画,并启动了车库墙绘项目;还有很多有意思的事。

10x 工程师

randy_10x

Randy 最近上线了一个「Ask Hackers」项目,是一个基于 Hacker News Comments 的搜索工具,感觉从想法萌生到上线推广大概也就一两天,想到了一个叫「10x 工程师」的概念,能够快速将自己的一个想法开发实现,很羡慕。

自己其实前前后后也做了不少工作和个人项目,惭愧地说技术栈接触了不少,都能写一点但也都不深,快速实现和迭代一个产品的能力还是很差,似乎从想法到 Demo/产品之间依然差了一环,也跟 Randy 聊过这个话题,他觉得还是工程经验的问题,他看到某个网站或者 App 的某个效果,基本上能大致猜到实现的方式并复现,而我可能还是得靠去看源码或者咨询 AI 才能勉强做到。

技术热情

除此之外,我发现热情和动力也左右着我的行为,可能是由于依然没有找到自己的产品 Idea 和方向,总是感觉自己之前做 side projects 的时候仅仅是在“实现”或是技术练习,吸引我的并不是产品成型本身而是在实现过程中的了解学习和技术能力的提升,对于个人来说无可厚非,但对于一个产品来说似乎是缺少了灵魂,就像第一次见 Randy 时我好奇地问他为什么不再更新 Cusdis 了,有不少 Star,也有包括我在内的很多自部署用户,印象里他说除了经济因素外,更多是由于自己没有动力去做了,没办法为一个自己都不会去用/为之付费的产品付出更多的热情。

其实自己的症结也在于此,似乎依然没有找到会让自己半夜兴奋到睡不着的想法,反倒是在一起开发 EpubKit 时,由于自己也是电子书的多年用户,从自己作为用户的角度出发,能够对产品的迭代有更多想法和热情,也会更有成就感。

自己一定要是产品的第一个用户。

个人工具箱项目

yu_tools_website

自己一直是一个各种软硬件的重度折腾爱好者,几乎每一个自己很小众的需求都会花大量的时间挑选出最合适的工具,哪怕检索的时间远远超过了使用工具本身,依然乐在其中。从大学到现在,身边也有无数人会问我类似“有什么推荐的相机/键盘/麦克风/xxx 么”、“我想在手机上做 xxx 有什么推荐的软件么”这类的问题,于是两年多前萌生了自己做一个个人工具箱列表的想法 —— 「GitHub - yu-tools」。

最开始只是一个简单的 GitHub 项目和一个 README.md 文件,后来慢慢添加了一些分类,并为每个条目增加了一条简短的描述,两年里阶段性更新了几次,没想到竟成为了我 star 最多的一个 repo 了。

之前有看到过自己很喜欢的开发者「devaslife/Takuya Matsuyama」做的一个工具箱网站 —— 「A curated list of the tech I use」,为每一个工具拍照并附上使用体验,觉得很有价值,于是也花了一晚上参照他的模板使用 Astro 做了一个网站 —— 「tools.pseudoyu.com」,只是会更多地偏向软件和服务,而随着条目增加,也想添加类似「Ask Hackers」的对话搜索功能。

软硬件的拍摄、截图和介绍是个大工程,持续更新中,有需要的朋友可以关注一下。

个人生活剪影

水彩

rust_painting

某次饭后家人一起尝试在扇子上画水彩,也是全新的体验,挑选了 Rust 小螃蟹,在学姐的亿点指导下完成了这幅作品,很开心!!!

车库墙绘

wall_painting

既上次使用 DALL-E 生成了想要在车间墙绘的图之后,这种终于得空开工,进度 30%,但是由于周一晚刚好组会,是学姐和我妹妹画的,带了相机也没来得及用相机记录下完整过程,有些遗憾,下次会多拍一些流程和细节,期待最终效果。

捏捏

nienie_on_desktop

最近或许是察觉了我的忙碌,两只小猫都变得更加黏人,每次写代码时捏捏也都静静趴在桌上,时不时伸个懒腰或者发个嗲,松弛而治愈。

有趣的事与物

输入

虽然大部分有意思的输入会在 「Yu’s Life」 Telegram 频道里自动同步,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。

收藏

书籍

  • Shape Up,可汗学院创始人写的关于 GPT 与教育未来的思考与实践,对日常使用 LLMs 有挺多启发的,除了成为搜索引擎一样的工具向外还有很多想象空间。

文章

视频

剧集

从零开始搭建你的免费博客评论系统(Remark42 + fly.io)

前言

在「2024 年了,我的博客有了什么变化」一文中,我介绍了自己使用 Serverless 平台和一些开源项目搭建的博客系统,也开启了这个系列教程来记录搭建和部署全过程。

本篇是关于评论系统的解决方案。

评论系统迭代

remark42_comments

我常常觉得评论不仅仅是读者与作者之间的沟通互动,其内容本身也是文章的一部分,甚至常常有些评论的思考与观点讨论会比文章本身更有价值,所以对于评论系统一直很重视,并不愿意信任一些第三方托管的服务,不希望有什么审查,也想风格尽可能简约,并与自己的博客风格相符。

在博客发展过程中,评论系统方案也经历过几次迭代,关于评论系统的类型和选择,我很喜欢的开发者 reorx 在「更换博客评论系统」中有详细的介绍了,我不作更多引申了,本文更重个人体验与详细的搭建过程。

Disqus

我最早使用的博客评论系统是万恶的 Disqus,一个笨重且会收集用户隐私的知名评论系统,因为加载比较慢,且免费版本经常会附带一些广告,实在难以忍受,再加上当时其实也基本上没什么评论,并没有什么迁移负担,用了没多久就直接弃用了。

Utterances

于是换成了另一个基于 GitHub issues 的评论系统 utterances,它会为每篇文章生成一个 issue,用户通过授权 GitHub 登录来对 issue 发表评论。这种方式的好处是只需要授权一个 utterances-bot 来进行管理,无需自己部署服务,维护数据库等。但是用了一段时间后,觉得有几点不足:

  • 基于 GitHub API 进行评论管理,如之后接口变动或对这类利用 issue 进行评论的方式进行限制,会不太稳定
  • 读者必须要授权 GitHub 登录,非技术人员或使用移动端阅读的读者使用起来很不方便
  • 会污染 GitHub 仓库的 Issues 记录,也不方便后续迁移到其他系统

Cusdis + Supabase + Vercel

Cusdis 是 Randy 做的一个注重数据隐私的开源的评论系统,十分轻量,经过 gzipped 后大约只有 5kb,从名字来看也知道是难以忍受 Disqus,自己做了一个替代版,因此它也是支持 Disqus 历史数据导入的,很贴心。

从 2021 年中就开始使用了,到现在整整三年了,除了最开始的时候因为 Heroku、Railway 相继收费而折腾了一下部署平台外,一直都稳稳地运行着,不过我在使用中也有遇到一些问题:

  • 大概是由于微信内置浏览器做了一些魔改,在博客从微信聊天/对话打开是看不到评论组件的
  • 尽管可以输入邮箱,但并不支持订阅评论回复
  • 需要管理员手动审核评论,但评论提醒的 TG Bot 时常失效而错过评论

不过整体来说时至今日依然是十分值得推荐的方案,轻量,方便自部署,风格也简约好看,搭建教程参看「轻量级开源免费博客评论系统解决方案 (Cusdis + Railway)」。

鉴于 Railway 从去年 8 月起已经取消了 Free Plan,如果依然想完全免费使用,可以使用 Vercel/Netlify/Zeabur 免费部署主项目,并在 Supabase 上部署一个免费的 PostgreSQL 数据库实例,把链接作为环境变量传入 Cusdis 服务中即可,其他流程大同小异。

另外因为其核心功能已经许久没有什么更新,比起其他较为成熟的评论系统也显得有些简陋,不过由于我也秉持着够用即可的原则,一直没动迁移/更新的念头,只有在其中一阵子在学前端时还参与了一些 Cusdis V2 版本的开发,不过也没做多久。

由于四月时 Vercel 部署升级的时候一直失败,导致接近几周的时间没收到评论,再加上确实有了一些功能需求,所以下定决心进行迁移,探究起了新的方案。

Remark42 + fly.io

调研了一圈后选择了 reorx 在「更换博客评论系统」一文中最后选定的 Remark42

单纯就配置选项来说比起 Cusdis 还是丰富了不少,目前配置了常用的几种社交账号登录(GitHub、Twitter、Telegram、邮箱)、可以匿名评论、支持邮件订阅回复提醒并且也设置了 TG bot 提醒,并且部署在 fly.io,go 单二进制 + 数据库单文件,很舒服的解决方案,更详细的 Remark42 的介绍和优势可以参看上面那篇文章。

虽然 Remark42 提供了一些迁移方案,但本身并不支持我使用的 Cusdis,但好在它是用 Golang 写的,我自己添加了迁移逻辑,将这些年沉淀下来的 438 条评论数据都无缝迁移过来了。

Remark42 + fly.io 部署说明

Remark42 + fly.io 的方案仅牵扯到单个服务,数据库使用的是 boltdb 挂载于 volume 中,但所有操作都在 fly.io 的 Free Plan 中。

下面将从零开始介绍如何搭建这个免费评论系统。

Remark42 本身代码开源 —— 「GitHub - umputun/remark42」,并提供了官方维护的镜像,文档清晰易读,可以根据自己的实际需求进行配置。

安装 flyctl 命令行工具

fly.io 与我之前使用的 Railway、Zeabur 等很大的一个不同点是它大部分操作基于命令行与配置文件,而不是在网页端管理后台进行操作,所以首先需要根据文档安装 flyctl 命令行工具。

以 macOS 为例,我使用 brew 进行安装:

brew install flyctl

授权登录

打开终端工具,使用以下命令进行授权登录:

flyctl auth login

fly_auth_login

fly_auth_web

在 Web 端进行账户登录或新建账号,完成后点击 Continue as xxx 即完成 flyctl 命令行的授权登录。

创建应用目录

create_fly_config

由于我通常会手动进行进行配置管理,而不是用它官方的模板,所以我会新建一个类似 remark42-on-fly 的目录,并将所有的配置文件、环境变量等放在这个路径下。

并使用 VS Code 进行编辑(也可以使用 vim 或者其他编辑器/IDE)。

配置文件

fly.io 主要是使用 .toml 格式的配置文件进行服务管理,以下是我部署的服务对应的配置文件:

app = 'yu-remark42-01'
primary_region = 'hkg'

[build]
  image = 'umputun/remark42:latest'

[[mounts]]
  source = 'remark42_data_01'
  destination = '/srv/var'

[http_service]
  internal_port = 8080
  force_https = true
  auto_stop_machines = false
  auto_start_machines = true
  min_machines_running = 1
  processes = ['app']

[env]
  REMARK_URL = 'https://yu-remark42-01.fly.dev/'
  SECRET = 'remark42-secret'
  SITE= 'remark42-demo'
  ADMIN_SHARED_ID= ''

[[vm]]
  cpu_kind = 'shared'
  cpus = 1
  memory_mb = 256

这是详细的配置说明:

  • app:应用名称,这里我使用了 yu-remark42-01,可以根据自己的实际情况进行修改
  • primary_region:部署区域,可以从这个列表中选择自己想部署的区域,我选择了香港
  • [Build],这个部分主要是服务镜像相关的配置
    • image:服务镜像,使用了官方提供的 umputun/remark42:latest,如有需要可以指定 tag 版本
  • [[mounts]],这个部分主要是挂载数据卷的配置,由于 Remark42 使用 boltdb 数据库,需要持久化存储
    • source:数据卷名称,这里我使用了 remark42_data_01
    • destination:挂载目录,这里我挂载到了 /srv/var,这个目录是 Remark42 默认的数据存储目录
  • [http_service],这个部分主要是服务相关的配置
    • internal_port:服务内部端口,使用 8080
    • force_https:强制使用 HTTPS
    • auto_stop_machines:设置为 false
    • auto_start_machines:设置为 true,即自动启动
    • min_machines_running:最小运行机器数,设置为 1
    • processes:服务进程,设置为 app
  • [env],配置环境变量
    • REMARK_URL:Remark42 服务的 URL,这里我使用了 https://yu-remark42-demo.fly.dev/,这是 fly.io 自动生成的,后续如果有了自定义域名则需要更改
    • SITE:站点名称,这里我使用了 remark42-demo
    • SECRET:自定义的 JWT Token,这里我使用了 remark42-secret
    • ADMIN_SHARED_ID:管理员 ID,这里我使用了空字符串,即没有管理员,后续可以补充
  • [[vm]],这个部分主要是机器相关的配置
    • cpu_kind:CPU 类型,设置为 shared
    • cpus:CPU 数量,设置为 1
    • memory_mb:内存,设置为 256MB

创建服务

完成并检查配置后,运行以下命令进行服务创建:

flyctl launch

fly_launch_remark42

环境变量配置

目前只是部署了服务,并没有设置环境变量,因此服务启动会有问题,接下来我们设置环境变量,放在prod.env 文件中:

AUTH_GITHUB_CID=<your_github_cid>
AUTH_GITHUB_CSEC=<your_github_csec>
AUTH_TWITTER_CID=<your_twitter_cid>
AUTH_TWITTER_CSEC=<your_twitter_csec>
AUTH_ANON=true
AUTH_TELEGRAM=true
TELEGRAM_TOKEN=<your_telegram_token>
NOTIFY_ADMINS=telegram
NOTIFY_TELEGRAM_CHAN=<your_telegram_group>
NOTIFY_USERS=email
AUTH_EMAIL_ENABLE=true
SMTP_HOST=smtp.gmail.com
SMTP_PORT=465
SMTP_TLS=true
SMTP_USERNAME=xxx@gmail.com
SMTP_PASSWORD=<your_password>
AUTH_EMAIL_FROM=xxx@gmail.com
NOTIFY_EMAIL_FROM=xxx@gmail.com

环境变量的部分相对比较复杂,具体参数参看文档

登录/授权配置

我配置了匿名评论、GitHub、Twitter 与 Telegram 几种方式,可以根据自己的情况配置其他登录方式。

  • 匿名登录
    • AUTH_ANON:是否允许匿名评论,我选择了允许,即用户可以不登录评论
  • GitHub 登录
    • AUTH_GITHUB_CIDAUTH_GITHUB_CSEC:GitHub OAuth App 的 Client ID 与 Client Secret
  • Twitter 登录
    • AUTH_TWITTER_CIDAUTH_TWITTER_CSEC:Twitter OAuth App 的 Client ID 与 Client Secret
  • Telegram 登录
    • AUTH_TELEGRAM:是否允许 Telegram 登录
    • TELEGRAM_TOKEN:Telegram Bot Token,通过 botfather 创建
  • 邮箱登录
    • AUTH_EMAIL_ENABLE:是否允许邮箱登录
    • AUTH_EMAIL_FROM:邮箱登录的发送邮箱

通知配置

  • Telegram 通知管理员,参看文档这部分进行 Telegram Bot 的创建和配置
    • NOTIFY_ADMINS:通知管理员的方式,选择 telegram
    • NOTIFY_TELEGRAM_CHAN:如启用 telegram 通知管理员,需要配置对应 Channel id,只需要填写 t.me/xxx 后面的 id 部分即可,如 pseudoyuchat
  • Email 通知用户,参看文档这部分进行邮箱 SMTP 等配置
    • NOTIFY_USERS:通知用户的方式,我选择了了 email, 即邮件通知,则需要配置下文的 SMTP
    • NOTIFY_EMAIL_FROM:邮箱通知的发送地址

邮件 SMTP 配置

上文的邮箱登录与邮箱通知都需要配置 SMTP 服务器,这部分也可以根据自己的邮箱服务商参照文档进行配置。

  • SMTP_HOST:SMTP 服务器地址
  • SMTP_PORT:SMTP 服务器端口
  • SMTP_TLS:是否启用 TLS
  • SMTP_USERNAME:SMTP 用户名
  • SMTP_PASSWORD:SMTP 密码

导入环境变量到服务

根据以上说明完成环境变量配置后,在配置文件和环境变量文件所在目录运行以下命令导入环境变量:

fly secrets import < prod.env

fly_secret_import

deploy_status_remark42

执行完成后到 fly.io 控制台查看服务状态即可,如为 Deployed 状态即表示部署成功。

配置自定义域名(可选)

如果你不想使用 fly.io 提供的默认域名,可以配置自定义域名。

custom_domain_flyio

进入 fly.io 控制台,选择刚部署的 yu-remark42-01 服务,点击左侧的 Certificates 选项,然后点击右上角 Add a Certificate,按照提示添加自定义域名即可。

custom_domain_dns_in_fly

点击 Create Certificate 后,会有一个页面显示你所需要添加的 DNS 记录,按照提示添加即可。

cloudflare_dns_remark42

flyio_certificate_success

例如我的域名托管在 Cloudflare,我按照提示添加了两条 DNS 记录,返回页面后点击 Check again 或等待一段时间后刷新查看,都显示绿色即为配置成功。

change_remark_url

此时,我们可以在 fly.toml 中修改 REMARK_URL 为自定义域名,然后执行以下命令重新部署服务即可,之后对配置文件进行任何改动都可以使用该命令进行更新:

fly deploy

博客配置 Remark42

上文我们完成的 Remark42 服务的部署,现在则需要在我们的博文中加入 Remark42 评论组件,以我使用的 Hugo 博客为例。

定义 Hugo 主题 Comments 组件

我在 Hugo 博客的 layouts/partials 目录下新建了一个 comments.html 文件,用于定义 Remark42 评论组件:

<div class="comments">
  <div class="title">
    <span>Comments</span>
    <span class="counter"><span class="remark42__counter" data-url="{{ .Permalink }}"></span></span>
  </div>
  <div id="remark42">
  </div>
</div>

<script>
  var remark_config = {
    host: 'https://comments.pseudoyu.com',
    site_id: 'pseudoyu.com',
    components: ['embed', 'counter'],
    max_shown_comments: 20,
    simple_view: true,
    theme: 'light',
  }
</script>

<script>
    (function () {
      // init or reset remark42
      const remark42 = window.REMARK42
      if (remark42) {
        remark42.destroy()
        remark42.createInstance(remark_config)
      } else {
        for (const component of remark_config.components) {
          var d = document, s = d.createElement('script');
          s.src = `${remark_config.host}/web/${component}.mjs`;
          s.type = 'module';
          s.defer = true;
          // prevent the <script> from loading mutiple times by InstantClick
          s.setAttribute('data-no-instant', '')
          d.head.appendChild(s);
        }
      }
    })();
</script>

remark_config 中的 hostsite_id 需要根据自己的实际配置进行修改,其他部分配置可以保持不变,或根据文档进行调整。

配置好 commnets 组件后,在 layouts/posts/single.html 中文章底部引入:

{{ partial "comments.html" . }}

add_comments_code_in_hugo

大体位置如图所示,如使用的是其他主题或博客系统,则需要找到自己文章对应的模板文件进行修改。

本地预览/部署网站

test_remark42_embedded

此时可以在本地预览或部署网站以查看评论系统是否正常显示,至此我们的服务部署完成。

获取 User ID 并配置 Admin

get_user_id_remark42

登录授权完成后并测试评论后,可在 Remark42 中点击头像打开管理页面,双击后 CMD/Ctrl+C 可以获取以 github_ 或其他平台开头的 User ID,可以将其配置到 ADMIN_SHARED_ID 中(更改 fly.toml 配置文件并运行 fly deploy 重新部署,即可成为管理员,管理员有权限对其他用户的评论进行删除等管理操作。

其他

我把之前 Cusdis 中的评论数据按照一定条件导出 json 格式的数据,并通过 go 程序进行格式转换与迁移,因此保留了之前所有的评论。

因为 Cusdis 本身不提供导出功能且迁移的需求太过小众,我并没有直接向上游贡献代码,也没有写成完善的脚本,有类似需求的朋友可以参考这个 PR 进行处理 —— 「feat: add cusdis to remark42 migrator support by pseudoyu · Pull Request #1 · pseudoyu/remark42」。

总结

以上就是我的博客评论系统的搭建过程,评论系统的搭建与配置相对繁复,且本文的配置方式或许会随时时间而过时,遇到问题可多参照官方文档

这是我的博客搭建部署系列教程之一,如对数据统计系统、博客内搜索等搭建感兴趣,请持续关注,希望能对大家有所参考。

周报 #65 - Adventure X 体验、Apple Notes 笔记实践与 EpubKit

《Photograph - Ed Sheeran》

前言

weekly_review_20240721

本篇是对 2024-07-102024-07-21 这周生活的记录与思考。

这一周多很丰富,工作有些忙碌,参加 Adventure X 的活动,很好玩;尝试了 Remix 框架,筹备一个 Workshop;和 Randy 见面,一起计划了 EpubKit 的 Redesign 和后续开发安排,算是给我们无法参赛的“中年嬉皮士”举办了自己的黑客松;从 Obsidian 转向 Apple Notes,实践 P.A.R.A;打算给车库的墙进行喷绘;去 Apple Store 体验了 Apple Vision Pro;还有很多有意思的事。

Adventure X

这是一个面向 26 岁及以下的年轻开发者的一个黑客松活动,早早有听到宣发,刚好超龄而遗憾没法报名参加,不过受邀作为 OpenBuild 赞助的「互联网 3.0 开发工具」赛道的评委及 Workshop 的讲师来到现场,也算是全程观望了。

活动大概有接近两百个开发者参赛,确实能看到他们的活力和激情(可能限制 26 岁也是有道理的);以及有不少在 Twitter 和疯狂星期四上熟识的朋友们都来到了现场,跟其中不少新老朋友聊了一些有意思的事。

Workshop

adventurex_workshop

这次主要的任务是作为 Mentor 和 Workshop 的讲师,主题为「使用 Solidity 与 Remix 构建全栈 AdventureX Badge ÐApp」。

其实前前后后在不少场合讲了不少次课和 Workshop,一开始其实只是给 ian 的 OpenBuild 社区帮忙,自己也是乐于写教程和分享的,但随着这样的机会越来越多,自己也有了一些变化,并不会每次都用一样的课件重复着类似的内容,而是都当作一个自己学习的新机会,也让自己在有限的时间内完成一些好玩的东西,再把它教授出去,也是费曼学习法的一种实践。

这次 Workshop 则是想要学习 Remix 前端框架,写了一个简单的活动徽章领取的 ÐApp,体验地址是 —— 「adventure-x.pseudoyu.com」,PPT 课件是 —— 「AdventureX_Workshop_20240716.pdf」。

虽然大概一个月前就知道这个 Workshop,但毫无意外地拖到了前两天,花了一晚上学习了 Randy 的「Remix 入门实战」小册子,写完了 UI 部分,然后又花了一晚上写 Solidity 合约部分,并且完成了前端和合约的交互逻辑,并且用 Zeabur 部署上线了,拖延症真的要命。

但是 Remix 确实好用,实现 0 useEffect, 0 useState 写完应用成就,后面看看能不能在各种场景上都彻底替代 Next.js。

现场来的人比想象得多,比起原定的 45 分钟也拖堂了一倍,接近 10 点才结束,不过是很有意思的体验,Workshop 效果也不错。

“中年嬉皮士”黑客松

code_with_randy_hackathon

这次 Randy 也作为嘉宾评委从广东过来了,都觉得黑客松氛围都到这了,我们只是观光有些太无趣了,所以干脆一起做起了 EpubKit 的 Redesign。

讨论了整个 EpubKit 现有的操作逻辑和 UI 风格变动,很开心,晚上一起开发了几个小时,也是找找作为“中年嬉皮士”的参与感了;也讨论了后续关于产品的很多想法和分工,很期待。

也欢迎大家下载体验 EpubKit,制作自己的电子书。

yu_with_randy

作为不爱拍照的人,刚好被工作人员拍到了和 Randy 一起在看项目展览时候的合影,也很有纪念意义了。

基于 Apple Notes 的 P.A.R.A 实践

上个月从用了两年的 Logseq 转成了 Obsidian,实践了大概一个月,比起 Logseq 的时候多了好些记录的习惯,虽然已经不用再关心文件夹层级这些,但依然需要克服,「脑子里记录下想法」 -> 「等在电脑前新建文件并取标题」 -> 「整理想法并打 Tag」 -> 「写下内容」这一链路所带来的心智负担。

apple_notes_folders_20240721

Randy 跟我讲了他使用 Apple Notes 记录所有想法和笔记的方式,并通过 P.A.R.A 的层级进行分类,发现当不需要有整理的负担,而是随时打开手机/电脑记录下想法,也不用考虑什么格式或是 markdown 语法,会更有记录的欲望,而能记下来、take action 才是笔记的核心要义。

在 Mac 上可以使用右下角的 Quick Notes 快速记录,iOS 上则是通过快捷指令将一些闪现想法快速保存到 Drafts 目录中,后续有更多想法的时候再挪动到各个目录中,很简单却有效的实践,也不需要再指定各种 tag 和分类,需要的时候直接全文搜索就可以了。

其他

墙绘

car_painting_wall

上次学了油画画了头像后觉得很有意思,最近打算再挑战一下好玩的,和学姐一起给我爸的汽修车间的一整面水泥墙用丙烯颜料墙绘(我打打下手)。

把我爸的想法和我们在 Ins 上找的参考图发给 DALL-E 后生成的效果很不错,希望 8 月能有成品效果 🤩。

Apple Vision Pro

apple_vision_pro_experience

这周四去 Apple 西湖体验了 Vision Pro,其实之前非常早就关注了,也看了大量测评,一度有些心动,但是其实有过 Quest2 的吃灰经历,一直还在观望。

刚好国行也上架了,预约了一次半小时的体验,从配镜片、讲解配件到体验各种功能和应用,体验的感觉比想象得好,20 分钟左右的时间倒也没有感受到什么眩晕感或是重量带来的压力。

实际体验下来,交互比想象得流畅自然和准确;但画面还是有比较明显的噪点,分辨率并不足以有沉浸式的体验,但已经是比较惊艳的了;应用支持还是太少了,所以更多也就是尝鲜,没有什么应用场景,打字体验很差,还是得外接键盘;总体来说,这一代不太值得买,或许等待之后不论价格还是系统应用层完善了再考虑了。

ChatGPT Plus -> Claude Pro

claude_pro_sub

上个月由于用得比较高频,重新订阅了 ChatGPT Plus,同时用着免费额度下的 Claude 3.5 Sonnet,发现在代码上 Claude 的上下文理解能力和生成结果的可用性都明显强于 GPT4,于是在这周到期的时候决定改为 Claude Pro 的订阅,在价格相同的前提下再体验一个月试试。

Guii 体验

guii

Guii 是这次 Adventure X 黑客松看到的最有意思的项目了,能够直接通过自然语言对话的方式跟前端页面交互,并直接会更改源码实现有趣的效果。

我通过选中元素简单对话的方式做了一个很简易的数字货币小网站,还有些 bug 但是可玩性很高。

把 OpenBuild Sponsor 赛道的奖项颁给她们了,实至名归,希望能早点上线 🔥。

有趣的事与物

输入

虽然大部分有意思的输入会在 「Yu’s Life」 Telegram 频道里自动同步,不过还是挑选一部分在这里列举一下,感觉更像一个 newsletter 了。

收藏

书籍

  • Brave New Words,可汗学院创始人写的关于 GPT 与教育未来的思考与实践,对日常使用 LLMs 有挺多启发的,除了成为搜索引擎一样的工具向外还有很多想象空间。
  • 履单,从萝卜快跑引起的议论想到的这本书,探讨科技加速引起的社会分化,不过更多是从劳动者视角,下午看了一会儿,叙事方式也很舒服。

文章

视频

音乐

❌