各位老友们好,我是 Chlorine。水篇文章。

本期已经不能称作「周报」了,因为时间跨度长得我自己都不知道是多少。各位当个乐子看就好。

祝食用愉快。

Hello,Vaultwarden

开局咱们先甩一个 Hello 宇宙新成员。本来这个是打算单独水一篇文章的,但是实在是写不出什么新颖的东西了。

这个起因说来大部分还是我比较闲,当然,对外说的原因是 Chrome(实际上是 Arc)的密码管理机制实在是太聪明了,它……居然都不做个本地加密。行吧,小厂的产品这样我也就忍了,您 Arc,号称改变互联网的下一代浏览器,以及您,Chrome,Google 最得意的作品,世界市场占有率第一的浏览器,对于用户最隐私的部分……连个加密都不做?我知道您对您的产品沙盒的坚固程度很有自信,但是,我是说但是,有没有一种可能,有一些软件喜欢扫盘呢?

(冷知识:有一段时间我本地存放一些重要信息的 tokens.csv 也没加密,甚至没有沙盒。后来改用 GPG 加密了,当然现在找到了更聪明的存放方法。大家可以在评论区嘲笑小氯了。)

于是我想改用 iCloud 自带的钥匙串。这是个很不错的选择,但是由于最近我又开始使用我的安卓备用机了,这就变成了一个 sour point。而且,iCloud 密码管理器在接管 Chrome 等的自带密码的时候似乎总是有问题,不知道为什么。

所以我盯上了伟大的自托管密码管理器—— Bitwarden

雷蒙德·卡佛有本书:《当我们谈论爱情时我们在谈论什么》。小氯不懂谈论爱情时谈论的是什么,但是当我们谈论 Bitwarden 的时候,我们谈论的几乎都是 Vaultwarden(拜托……不要那么生硬地抖书袋可以吗?)。

Vaultwarden 是一个 Bitwarden 的分支——准确来说,是一个实现了 Bitwarden API 的第三方服务(因为 Vaultwarden 的代码实际上是自己写的),采用我们喜闻乐见的 Rust 编写。Vaultwarden 的内存占用极低(据说是 10M 左右,我实际测试下来大概是 30M),并且兼容几乎所有 Bitwarden 的 API,适合个人和小型组织使用。

为了省事,我们直接使用 1Panel 进行部署即可。在应用商店搜索 Bitwarden 就可以,安装的实际上就是 Vaultwarden。

安装后登录,创建一个主密码。这个东西很关键,不推荐使用日用的密码,可以通过命令行生成一个随机字符串,然后放在一个安全的地方存放好。

在登录后,回到 1Panel,修改一下我们的 docker-compose.yml,添加几个环境变量:

environment:
    - TZ=Asia/Shanghai # 时区,按自己的来
    - SIGNUPS_ALLOWED=false # 禁用注册
    - INVITATIONS_ALLOWED=false # 禁用邀请
    - ADMIN_TOKEN=你的管理员 token # 推荐用 openssl rand -base64 48 生成一个
    - LOG_FILE=/data/vaultwarden.log
    - LOG_LEVEL=warn
    - SHOW_PASSWORD_HINT=false # 禁用主密码提示
    - DOMAIN=你反代的域名

完事。此外,推荐开启 2FA 和 HTTP 鉴权,更安全。毕竟这玩意是最不能暴露的。

如果需要导入 Chrome 存储的密码,可以在 chrome://settings 页面的密码管理工具中导出 CSV 再导入;如果需要接管浏览器级别的密码存储,安装 Bitwarden 扩展即可。此外 Bitwarden 还提供了 iOS 和 Android 客户端,以及一个 Bitwarden Authenticator 验证器(不过 2FA 用 Bitwarden 自己也可以做)。

(小声吐槽一句:Bitwarden 的这个手机客户端实在是太难看了)

如果需要更多知识,可以参考这篇教程

Hello,Gitea

这是我部署的又一个比较大的服务。起因其实是我希望使用 Git 同步一下我的 Obsidian 笔记库,但是又不太放心把笔记交给 GitHub 和牢软(那你早干嘛去了),因此打算自己部署一个小 Git DevOps 玩玩。那么最合适的选择就是 Gitea 了,Git with a Cup of Tea,轻量美观的服务。

这里是 Gitea 的官网,可以参考官网的部署方式。由于我是个人使用,因此 SQLite 就足够了。另一个原因是 MySQL 占用资源太多了,另一个原因是 1Panel 陷害我,部署 Gitea 之后差点没把我机器干废。

version: '3'
services:
  gitea:
    image: gitea/gitea:latest
    container_name: gitea
    restart: always
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - DB_TYPE=sqlite3
      - RUN_MODE=prod
    ports:
      - "3000:3000"
      - "222:22"
    volumes:
      - ./data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro

登录后会出现注册页面,按照要求操作即可。如果是个人实例,为了安全,推荐在登录后把注册等等乱七八糟的功能全都关了。编辑 data/gitea/conf/app.ini 即可。总体而言,由于我的虚拟机在国内,速度还不错,不比 Gitee 慢多少 :)

关于 Gitea 更多的部署知识,可以参考杜老师的教程

顺便说一句,我的 Gitea 实例叫「小氯の鲜果茶」(๑˃ᴗ˂)ﻭ

折腾笔记软件

接着上面 Obsidian 的事情,说说最近折腾笔记软件的经过。

我是一个卡片笔记的爱好者。不过,我的思路和经典的 Zettelkasten 还不一样:卢曼教授会给卡片编写细致的索引,但是我不喜欢。我甚至都不希望有太明显的层级,这一方面是因为 Pseudoyu 说的「心智负担」,另一方面也与我的思考方式有关。

我是一个思维极其跳脱的人,平时就喜欢胡思乱想,从一个思维锚点出发可以通过一系列几乎是难以理解的联想迅速跳转到数个看起来八竿子打不着的话题(而且我的语速极快,使得和我闲聊的人很多时候难以跟上我的思路)。同时,我的学科背景算是比较广泛的,高中时以「九边形战士」(我们存在的九个学科——数语英物化生政史地。相对来说,我地理比较差)而闻名,分科后理科拿高分的同时也喜欢闲着没事去钻研人文社科相关的内容,尤其语文和历史可以说好于绝大部分的文科生。现在大学读的专业是计金,天然带着交叉属性。平时也爱折腾,了解各个领域奇奇怪怪的小知识。因此我的知识库(如果有)主打一个多且杂,注重在同一个问题中运用各种可能的知识进行胡乱的链接。所以,严格的分类和放置对我来说反而是桎梏。我最多是打 category(如果领域太多,加一个 subcategory)和 tags,有时候连 tags 和标题都懒得打。

回到笔记软件。我对笔记软件的理想要求如下:

  • 良好的编辑体验,支持 Markdown 和 GFM 标准(或者其他轻量级标记语言)
  • 开放格式,或者可以导出为开放格式
  • 高度卡片化和非线性
  • 支持随时随地闪念记录
  • 支持剪藏
  • 支持双向链接,关系图谱属于加分项,可有可无
  • 足够的写作性能、搜索性能等
  • 支持同步(移动端有简单的查看和闪念记录即可,主要要求可靠)
  • (optional)白板,可视化思维工具
  • 本地化,离线可用
  • 开源,或至少需要保证尊重用户隐私

不过,我找了很久,遗憾地发现,满足我全部要求的 silver bullet 目前是不存在的。

目前为止,Obsidian 应该是我用过编辑体验最好的笔记软件,Easy Typing、LaTeX Suite、Completr 等插件的加持使得 Obsidian 可以薄纱市面上几乎所有的编辑器,同时高度可扩展性的平台生态为其增加了几乎无限的可能;TiddlyWiki 是最符合我卡片笔记思维的一款,单文件 self-contained、开源免费也为其增加了最大限度的可靠性;思源笔记应该是所有类 Notion 软件中对 Markdown 支持最好的一款,同时支持和 Memos 以及 Web Clipper 的 100% 整合;Affine 的设计风格我非常喜欢,同时支持手写白板也非常诱人……

乱花渐欲迷人眼。我在「挑选一个最好的笔记软件」这件事上越陷越深,浪费了不知道多少时间。

直到我想起我和娘亲的一段对话:

——回去上学了会想家吗?

——会啊。

——那怎么办?

——想就想呗,也不耽误干活。

这款软件不完美,不等于它不能用。既然我还没到「能自己写一个完全满意的工具」的程度,那也只好先从现在能用的资源里挑个最好的。于是我暂时放下了追求完美的念头,继续用我的 Obsidian。我甚至都没完全使用其功能去构建什么工作流,只是用。Apple Notes 和 Memos 这些辅助工具也用,我也没想着去做什么大的整合,一方面做不到,另一方面没必要,「又不是不能用」。

We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%.
—— Donald Knuth

以及我很喜欢说的一句话:

PKM(个人知识管理)的前提,是你有知识。

接一个 Pre

我们的实践成果答辩马上就要开始了,需要做个 pre(presentation)。本来这事是支队长的责任,和我关系不大,但是我们经管的支队长临时有事,于是我接下了这个活(没错,我们同一支队答辩需要分院系,牢针就是这么抽象)。

说实话我比较懒,需要的资料又迟迟拿不到,因此我光明正大地摆烂了。但是老是这么摆也不是事,总不能到时候临场发挥。所幸,今天我们伟大的计金首相,也就是计算机系的支队长送来了我们的 PPT(我们用的 PPT 基本一样)。

面对又一次推掉这个活的机会(不细说了),我犹豫再三,还是选择了继续做。我简单阅读了 PPT,开始动手写讲稿。没写多久,大概一个小时就写完了。我扯皮写报告的能力大家还是可以相信的。

结果居然得到了老师的认可。

An image to describe post

然后我花了点时间和支队长讨论了下,修改了不少细节。前前后后加起来用了一上午。

我外婆喜欢说一句话:「眼是懒蛋子,手是好汉子。」话有点糙,但理不糙。

喝点什么

最近检查出了尿酸偏高和痛风性滑膜炎,算是我的人物特质了,每年夏天随机获得一个病症。因此最近在大规模喝水(这两个词是怎么连起来的?!)。但是喝多了会感觉嘴里没味道,因此想了一个办法,柠檬水。

不是蜜雪冰城的柠檬水,就是柠檬,水。

An image to describe post

好喝吗?不好喝,很酸,即使我对酸的耐受力很高,我也不会觉得这种东西好喝,但是就是莫名其妙喝了一杯又一杯。

我喜欢各种各样的饮料,尤其是奶茶和果茶。在园子里面,我最喜欢桃李园的元气莓莓,少糖的。可惜这次恐怕是要和它们说再见了。

我甚至还有过更加「大逆不道」的想法:我想尝一尝伏特加,战斗民族的饮料。据说斯米诺红牌味道比较好,尤其是兑果汁的时候。但是最终还是放弃了,身体健康之外,我不喜欢和任何烟酒沾边。

先说这么多吧。马上我就要开学了,下次写周报的时候,我应该已经回园子里了。