1
0
Fork 0

INIT (I swear I will never re-init this repo again)

This commit is contained in:
Chlorine 2025-05-10 14:02:07 +08:00
commit 3db85006cc
Signed by: chlorine
GPG key ID: 5ADFCC948BAA473A
105 changed files with 16927 additions and 0 deletions

View file

@ -0,0 +1,243 @@
---
slug: hello-aria2
summary: 下载!都可以下载!
tags:
- 下载
- 折腾
title: HelloAria2
date: 2024-08-12
description: 本文介绍了如何配置 Aria2 作为 macOS 下载工具,涉及安装、设置配置文件、开机自启与自动更新 BT tracker 的步骤,同时感谢了一些教程的贡献者。
categories: ["逍遥游"]
featuredImage:
draft: false
---
各位老友们好,我是 Chlorine。
本期讲讲下载神器 Aria2 的配置。网上关于 Aria2 的配置教程已经极为丰富,所以本文主要起一个备份的作用,其教学内容大多还是拾人牙慧。
感谢 GitHub 上的各路大佬,特别感谢博主[月青悠](https://vccv.cc)的教程 [macOS系统配置Aria2](https://vccv.cc/article/aria2-mac.html)。
## 前言
本段接近于自言自语,不想看的老友可以直接跳过。
小氯在用 Windows 时(那大概是半年前,但感觉似乎是很久很久以前了),使用~~开心版的~~IDM[INTERNET DOWNLOAD MANAGER](https://www.internetdownloadmanager.com/))作为下载器,用着还挺舒服的。不过换到 macOS 了就没那个好事了,于是我选择了 IDM 的有力竞争者 FDM。
美好的日子就这样一天天过去。FDM 整体虽然看起来有一点点古老,但是用着还可以。不过随着时间的推移,~~闲得发慌的~~我又开始挑毛病了:感觉 FDM 的下载速度不够快,而且没办法用 Firefox 版本的扩展(更正:这个扩展是存在的,但是我的备用浏览器是 基于 Firefox 的 LibreWolf似乎有适配性问题而且不是开源的。
于是我接触到了 Motrix。不过 Motrix 很久不更新了,我使用的是 Motrix 的衍生品 Imfile。
Imfile 总体而言还可以,虽然启动时会报出一个莫名其妙的错误提一提我的血压(~~开发者目前对此持摆烂态度~~)。不过最近用 Imfile 的时候,经常动弹不了一点,让我很头痛。而且这软件应该是个 Electron 的,我对这类软件没什么好感(~~但是你现在的主力软件 Obsidian 和 VSCodium 不就是 Electron 的吗~~)。
于是我盯上了据说很出色的~~狗屁下载器~~够快下载器Gopeed。具体体验不说了一言难尽。反正我是没找到正确的打开方式。
思前想后之下我还是决定用之前没搞明白的命令行版 Aria2反正我不怕耍命令行。经过折腾现在已经达到了比较良好的效果。
## Aria2 简介
不想看的老友依然可以跳过。
Aria2 是一个跨平台的命令行下载器具有轻量级、多线程、高速度、多协议支持HTTP、FTP、BT 等)和高度可定制性(命令行工具基本都这样:)等优点。
不过需要注意Aria2 并不是 Aria 的第二代。没有叫 Aria 的工具。
冷知识aria 的含义是「咏叹调」)
## 安装 Aria2
我们依然使用万能的 Homebrew。
```bash
brew install aria2
```
一般来说 M 芯片的默认下载位置是 `/opt/homebrew/bin/aria2c`,记好这个路径。如果不确定,请使用:
```bash
where aria2c
```
## 设置 `aria2.conf`
注意,以下所有配置,请将 `chlorine` 替换为你的用户名。
我们在你的用户根目录下创建一个配置文件夹 `.aria2`。注意,下面所有的 `<user>` 都需要替换为你的用户名,例如 `chlorine`
```bash
mkdir -p ~/.aria2 && cd $_
touch aria2.conf aria2.session aria2.log
nano aria2.conf # 或者你的编辑器
```
我的配置文件主要是照抄了博主月青悠的,只不过修改了几个地方:
- 修改端口为 7800之前这样是因为 6800 被占用了,有可能是因为 Imfile 的缘故。奇怪的是7800 下载比 6800 快很多。
- 配置了 `all-proxy`,适配某一只会科学技术的小猫的配置。
- 注释掉了通知 hook因为我们不需要。
为了文章不至于有太长的代码,请在[此处](https://gist.github.com/chlorine3545/b500eed051ca8d7f5977440bacd0aa1b)自取。
你需要做的:
- 将复制的配置粘到文件中。
- 修改 `rpc-secret` 为你自己的密钥。可以自己随便写,但是推荐生成一个长字符串,使用 `openssl rand -base64 32` 即可。
- 你其他的自定义。
## 配置开机自启
这里比较麻烦,所幸万能的开源社区已经替我们做好了一切。
```bash
touch ~/Library/LaunchAgents/aria2.plist
nano ~/Library/LaunchAgents/aria2.plist
```
把这段粘进去:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>aria2</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/bin/aria2c</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>/Users/chlorine/Downloads</string>
</dict>
</plist>
```
如果一切顺利,系统会提示你已经添加了一个开机启动项。
然后检查文件语法:
```bash
plutil ~/Library/LaunchAgents/aria2.plist
```
如果 OK修改文件权限
```bash
chmod 644 ~/Library/LaunchAgents/aria2.plist
```
然后加载启动项并启动服务:
```bash
launchctl load ~/Library/LaunchAgents/aria2.plist
launchctl start aria2
```
这样,系统会在后台替你料理好一切。
## 自动更新 BT tracker
这个事情我用不太到,但是还是写上吧。
```bash
touch ~/.aria2/trackers-list-aria2.sh
nano ~/.aria2/trackers-list-aria2.sh
```
写入:
```bash
#!/usr/bin/env zsh
# 如果你的电脑没有 Zsh请把 zsh 改为 bash但是我更推荐安装一个
# 文件名 trackers-list-aria2.sh
# aria2 设置文件路径
CONF=${HOME}/.aria2/aria2.conf
# 设置选择的 trackerlist (可选 all_aria2.txt, best_aria2.txt, http_aria2.txt
trackerfile=all_aria2.txt
# downloadfile=https://raw.githubusercontent.com/ngosang/trackerslist/master/${trackerfile}
downloadfile=https://trackerslist.com/${trackerfile}
list=$(curl -fsSL ${downloadfile})
if ! grep -q "bt-tracker" "${CONF}" ; then
echo -e "\033[34m==> 添加 bt-tracker 服务器信息......\033[0m"
echo -e "\nbt-tracker=${list}" >> "${CONF}"
else
echo -e "\033[34m==> 更新 bt-tracker 服务器信息.....\033[0m"
sed -i '' "s@bt-tracker.*@bt-tracker=${list}@g" "${CONF}"
fi
## 重启 aria2 服务
echo -e "\033[34m==> 停止 aria2 服务......\033[0m"
launchctl stop aria2
echo -e "\033[34m==> 启动 aria2 服务......\033[0m"
launchctl start aria2
```
然后添加定时任务:
```bash
(crontab -l 2&> /dev/null; echo "0 18 * * * ~/.aria2/trackers-list-aria2.sh") | crontab
```
这会在每天 18 点更新列表。如果希望频率不那么高,可以修改配置,比如每周日一次:
```bash
(crontab -l 2>&1 /dev/null; echo "0 18 * * 0 ~/.aria2/trackers-list-aria2.sh") | crontab
```
如果你希望就算是关机了还能在开机期间执行任务,那可以用 `launchd`。不过这个我没测试过,谨慎使用。
创建服务文件:
```bash
touch ~/Library/LaunchAgents/com.user.trackers-list.plist
nano ~/Library/LaunchAgents/com.user.trackers-list.plist
```
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.trackers-list</string>
<key>ProgramArguments</key>
<array>
<string>/bin/sh</string>
<string>/Users/chlorine/.aria2/trackers-list-aria2.sh</string>
</array>
<key>StartInterval</key>
<integer>86400</integer> <!-- 每24小时执行一次 -->
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
```
然后按照类似上面的方法加载服务。
## Chrome 扩展
每次都打开命令行下载无疑很痛苦,所幸我们可以通过 Chrome 扩展自动接管浏览器下载事件。
我们选择广受好评的 [Aria2 Explorer](https://chromewebstore.google.com/detail/aria2-explorer/mpkodccbngfoacfalldjimigbofkhgjn)。直接点击安装即可。
安装后需要进行一点配置,这是我的配置,大家可以参考。
![](https://img.viento.cc/IMG-20240812213211.avif "端口和密钥记得改成你填写的,比如 7800")
然后打开扩展页面。如果显示 Aria2 已连接,那么就大功告成了。
## 最终效果
我们家的宽带大概是百兆的,网络很一般,于是我测试速度的时候吓了一跳。我测试用的是飞书的 `.dmg`Obsidian 的那个(测试系统代理)只用了两秒钟。
![Aria2 下载飞书安装包时速度达到了 18 M / s|495](https://img.viento.cc/IMG-20240812213600.avif "你这速度疑似有点太城市化了")
再次感谢伟大的开源社区。祝各位老友资源获取愉快。

View file

@ -0,0 +1,234 @@
---
title: HelloForgejo
date: 2025-02-09
summary: Forgejo以及一点碎碎念
description: 本文讲述了自托管 Git 服务 Forgejo以及作者由此引发的对开源社区治理的思考。Forgejo 是 Gitea 成立商业公司后Codeberg 创立的坚守自由理念的分叉。作者首先梳理了从 Gogs 到 Gitea 再到 Forgejo 的演化过程,然后通过亲身部署,指出 Forgejo 与 Gitea 现阶段功能差异不大,但更契合理想主义者的精神诉求。文章后半部展开深度思辨,将开源运动与国际共运类比,剖析「分叉自由」背后的治理困境:去中心化理想与制度化需求的矛盾,理念纯洁性与现实可行性的冲突,以及技术乌托邦愿景在人类社会组织规律前的局限性。作者以乐观、充满希望的笔触收尾,坚信开源社区将不断进步,理想的「技术天国」也会越来越近。
categories: ["逍遥游", "沉思录"]
series:
tags:
- Forgejo
- 开源
- 哲学
slug: hello-forgejo
featuredImage: https://img.viento.cc/cover/hello-forgejo-cover.webp
---
各位老友,下午好。这里是 Chlorine。
说好考完试要爆更,结果既没爆也没更,除了一篇成何体统的开发日志之外什么都没憋出来,连年终总结都没写(悲)。
所以,水一篇小小的文章吧,讲讲最近拿到的一个新玩具,一个对小氯来说用处不大不小的 self-hosted service。
[Forgejo](https://forgejo.org)。
{{< codeberg repo="forgejo/forgejo" >}}
## 从 Gitea 说起
大家应该都知道 [Gitea](https://gitea.com)Git with a cup of tea。小氯很喜欢这个名字有趣且闲适的 Git 服务。当然,因为喜欢名字就去部署一个服务听着像个憨憨,所幸 Gitea 还是很争气的,给了我们更加充足的理由去用它:资源占用少——随便找一台树莓派就足够运行了,爱来自 Golang功能齐全——GitHub 和 GitLab 有的它基本都有,不管是基本的仓库,还是 issue、PR、Wiki、Project 抑或是 CI/CD。截至小氯写这篇文章Gitea 已经有了超过 40 万次安装数据来源Gitea 官网),堪称最受个人和小型团队欢迎的开源自托管 Git 服务之一。
当然,根据园子第一定律,既然小氯在写这篇文章了,就肯定是 Gitea 的某些地方让小氯不满意了。能是哪里?总不可能是小氯觉得应该用~~高贵的~~ Rust 把 Gitea 重写一遍吧?
这就要讲一讲 Gitea 的历史了。
> [!WARNING]
> 以下的内容为小氯从各方收集的资料总结而成,可能存在疏漏或者不准确,欢迎批评指正。同时,以下内容不代表对任何开发者或项目的任何看法。
### 从 Gogs 到 Gitea
要说 Gitea就不得不说说它的前身——GogsGo Git Service。Gogs 算是半个互联网古董了——诞生于 2014 年。它的创始人是著名的中国开发者——Unknwon或者可以称为「无闻先生」。
2014 年……大概是什么时候呢?小氯还在上小学,家里唯一能称得上「计算机」的物件是一台如今已经打不开了的东芝笔记本电脑,内存估计都没有一个 G。而当时的小氯对计算机知识的了解呢就和山顶洞人对量子力学的了解一样博大精深。据史料记载当时的 GitHub 已经是 Forge 平台代码托管平台的巨头了但是其不开源私有仓库要收费也没法自托管。GitLab 倒是有开源社区版可以自托管但是很重不适合喜欢「Keep things light and fun」的个人和小型团队。
所以……程序员说,要有光,于是有了 Gogs。
Gogs 的口号是「painless self-hosted Git service」目标是打造一个轻量化的、易用的、功能丰富的开源自托管 Git 服务。而它也确实做到了,在短短的几年内吸引了大批的忠实拥趸。
不过,当时间来到 2016 年事情开始出现了一些变化。作为个人主导的项目Gogs 的开发节奏受无闻先生的个人风格的影响相当大。而无闻先生的开发风格呢……比较求稳,讲究慢工出细活,所以对社区的 issue 和 PR 的响应也就没那么快。这个事情让很多热心的社区成员很着急。同时,可能是对自己的水平太有自信(虽然说他也确实有底气自信),无闻先生对社区的贡献和参与比较谨慎,更倾向于独自掌控 Gogs 的开发路线。这也引发了对 Gogs 项目皿煮问题的担忧。
所以……Gogs 的重要贡献者之一Lunny Xiao带领一群社区的开发者分叉了 Gogs于是世界上有了 Gitea。
Gitea 继承了 Gogs「painless self-hosted Git service」的口号并且积极接受社区的贡献和意见进行活跃的开发活动非常地皿煮。什么多语言CI/CD只要社区喜欢全都安排上。于是 Gitea 的热度很快超过了 Gogs成为了自托管 Git 服务中最受欢迎的明星之一。
### Codeberg 的担忧
时间在「饮茶Gitea先啦」的欢笑声中如流水般逝去。一转眼时间来到了 2022 年。
这一年的 Gitea 社区发生了一件大事:**Lunny Xiao、techknowlogick 等维护者成立了 Gitea Limited 公司**,并且把 Gitea 的商标、域名等资产转移到了公司的名下。
平心而论,虽说不和社区充分协商就成立公司接管资产有点不皿煮,但这倒也无可厚非,至少不算是什么大错。甚至如果处理得当,还可以促进 Gitea 的维护和开发,例如,可以雇佣全职的维护者,或者是通过商业服务获得资金支持。
不过,我们也能想象到,社区对这件事会有多大的反应,尤其是坚定的 FOSSist 们。我们先不谈意识形态的问题,成立公司,就意味着 Gitea 的发展有被商业利益影响的风险(注意我说的是风险),同时 Gitea Ltd. 也可能利用自己的商标的权利去限制社区对 Gitea 的使用。退一步说,即使说 Gitea Ltd. 的创始人们都是初心不改的谦谦君子,谁又能保证后继者们也能做到呢?上一个口口声声说「不作恶」的公司现在是什么样,也用不着小氯多说了吧。
在社区众多的反对声音中,有一个组织扮演了至关重要的角色——
**Codeberg e. V.**[Codeberg](https://codeberg.org) 的运营者。
Codeberg e. V.,为了简单我们就叫它 Codeberg 好了,是个大名鼎鼎的非营利组织,总部位于德国柏林。它运营着基于 Gitea 的代码托管服务——Codeberg。这个平台别的优点没有就是紫柚皿煮开放共享大家一起开开心心地用爱发电因此在开源社区名声极好。
听说了 Gitea Ltd. 的事Codeberg 可不高兴了。毕竟身为 Gitea 的重要使用者和贡献者,一大早起来发现自家的地基被人起了,能高兴才怪。于是 Codeberg 开始和 Gitea Ltd. 友好交流(口头),包括提议将 Gitea 的控制权交给非营利组织等。不幸的是,最后双方并没有达成一致。
众所周知惹日耳曼人的后果是很可怕的。于是Codeberg 有了一个邪恶的主意——闪击 Gitea开个玩笑
### 从 Gitea 到 Forgejo
2022 年 12 月 15 日为了延续自托管代码平台自由、社区治理的传统Codeberg 公布了 Forgejo 项目。
Codeberg 的原话是:
> Luckily Codeberg is in a unique position to reconnect the Gitea community in one place, independent and out of control of Gitea Ltd. And so we did.
有时候不得不感叹,历史不会重复,却永远押着同样的韵脚。
> 彼时彼刻,恰如此时此刻。
后面的故事我们就不详细说了Forgejo 当然延续了下来,并且开始积极地开发新功能、修复旧问题。如今的 Forgejo 虽然还没办法取代 Gitea 的地位,但是也已经有了一批忠实的追随者和热闹的社区,也凭借自己「永远自由」的承诺,成为了 FOSS Forge 的扛旗者之一。
## 关于 Forgejo
故事讲完了,我们来说说 Forgejo 本身吧。
Forgejo 的名字应该是来自「forĝejo」也就是世界语的名词「forge」。虽说世界语暂时来看不太世界但是用在这里似乎还蛮有兼济天下的情怀的。
## 安装 Forgejo
### 安装
当然还是使用 `docker-compose` 一把梭。理论上来说这里应该选择自由的 Podman但是奈何小氯实在是太习惯于 docker-compose 了,红豆泥私密马赛。
```yaml
services:
server:
image: codeberg.org/forgejo/forgejo:10
container_name: forgejo
environment:
- USER_UID=1000
- USER_GID=1000
restart: unless-stopped
volumes:
- ./forgejo:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- '3000:3000' # 也可以只映射到 127.0.0.1 或者别的地址,看你的习惯
- '2222:22' # 端口改一个你喜欢的就好
```
下面使用 `docker-compose up -d` 即可。这个镜像在 Codeberg国内的机器能连上但是会有亿点点慢还请耐心等待。
当然,用 `podman-compose up -d` 也完全跑得起来。不需要怀疑,小氯已经帮您试过啦 (\*≧ω≦\*)
### 反代
略去。
### 初始化
访问 `https://git.yourdomain.tld`,会看到一个初始化的界面,按照其指示来配置即可。
不过友情提示一下:如果选择关闭注册,并在初始化界面创建管理员的话,容易卡住,可以先开放注册,注册管理员后编辑 `your-dir/forgejo/gitea/conf/app.ini`,把 `service` 节的 `DISABLE_REGISTRATION` 改为 `true` 即可。~~所以为什么不用 TOML 呢?~~
此外,如果您托管的是一个私人实例,最好把联邦功能关掉,编辑上面的 `app.ini`,加入下面的配置即可——所以这好像也是默认选项来着:
```ini
[federation]
ENABLED = false
SHARE_USER_STATISTICS=false
```
……等会?联邦?!
嗯呐就是联邦Federation。Forgejo 正在积极开发联邦的功能,让各个实例的用户们能够跨实例进行协作,虽然说这个功能还没实装,但是确实很吸引人。
真是个天才的想法呢,~~小氯为什么没想到~~
### 后续
后续没后续了。Forgejo 的操作相当简明,大家开开心心地用即可。
不过小氯倒是遇见了个问题,就是在 GPG 密钥生成加强签名时出现了警告:
```txt
gpg: WARNING: server 'gpg-agent' is older than us (2.2.44 < 2.4.7)
gpg: Note: Outdated servers may lack important security fixes.
gpg: Note: Use the command "gpgconf --kill all" to restart them.
gpg: using "XXXXX" as default secret key for signing
gpg: problem with fast path key listing: IPC parameter error - ignored
```
这个问题有点莫名其妙的,小氯试过 `gpgconf --kill all` 和重装 GPG Agent最后好像也没解决。不过至少是不耽误用了。
## 我应该切换到 Forgejo 吗?
~~小氯每日入机中文~~
简而言之:
- 如果您还没有自己的 Forge 平台,那我推荐 Forgejo。
- 如果您不是原教旨 FOSSer并且用 Gitea 用得很习惯那继续用着就好——二者的功能在现阶段的差异其实可以忽略不计使用体验没有大的区别。甚至呢Gitea 的社区和生态还要更成熟一点。
- 如果您用的是 GitLab……嗯哼
## 后话,以及碎碎念
本来呢,是想水一篇半教程半笔记性质的小盆栽的,结果不知不觉变成了开源历史 + 技术笔记 + 乱七八糟碎碎念混合体。~~同时也鸽了好几天,你这只鸽子精啊喂~~
小氯知道 Gitea 的时间蛮久的了,大概从接触博客的远古时期就从[孙哥那里](https://blog.clf3.org/server-03/)听过了 Gitea一直认为这就是最好的自托管 Git 服务了(虽然这个评价也不算过誉),接触 Codeberg 之后更加重了这一印象(我真傻,真的。我单知道 Codeberg 的界面长得像 Gitea却没看到页脚写了个 Forgejo API。所以后来小氯试图自托管一个 Git 服务时,毫不犹豫地选择了 Gitea于是有了 GitCl中文名小氯の鲜果茶这个小小的可爱的实例。
后来呢,嗯,由于用得太少,就被降本增效了(捂脸)。
直到最近小氯重新部署了 GitCl 从头开始,然后……我在[这里](https://social.anoxinon.de/@Codeberg/113928732561160352)看到了 Codeberg 官方的一条帖文。
……所以什么是 Forgejo 呢?于是,就有了这篇文章。
一如上面所说的Forgejo 的功能和 Gitea 非常接近。小氯切换到 Forgejo 的理由不过是因为,反正都要重新开始了,那为什么不试试新东西呢——以及,虽然小氯并不完全赞同 Forgejo 项目的观点,但是还是愿意支持一下理想主义的朋友们。
按理来说这篇文章应该在这里结束了,但是小氯忍不住想多说几句……
> [!WARNING]
> 请谨慎阅读以下内容。
### 「开源无限可分」?
小氯在读开源运动的历史时,总会不自觉地将它与另一个事物联系在一起——**国际共运**。同样是「When the world was young」的激情燃烧的岁月同样是对天下大同的理想世界的追求。如果写一句「FOSSers of all lands, MERGE!」的口号,估计也有不少的 FOSSer 会喜欢。不过,他们的问题甚至也是一样的,不得不让人感叹现实的奇妙。
有一个经典的笑话——「左翼无限可分」。不同的革命者们为了各种路线问题争吵不休分裂为各种各样的派系往往细枝末节的差异就可能导致彻底的分裂互相指责对方是「修正主义者」而开源社区呢FSF 和 OSI 到现在也没吵出个一二三四Copyleft 和 Permissive 许可证的圣战打得比十字军东征还带劲。项目的决策应该有 BDFL 还是完全的 DAO要不要和大公司合作Web3 是真正的开源吗至于各种产品的开源路线之争嗯……XEmacs 和 EmacsNode 和 ioOpenOffice 和 LibreOfficeMySQL 和 MariaDB要不要 systemd……MongoDB 的 SSPL你觉得是大局观他觉得是脑血栓……以及上面说的Gitea 分叉了 GogsForgejo 又分叉了 Gitea下一步也不知道会不会再有个后继者把 Forgejo 分叉了(~~三回啊三回~~)……凡此种种,小氯已经不想细数了。
此外还有一句话——异端比异教更可恶,对「自己人」的指责和攻击,往往比「敌人」更激烈。国际共运的例子这里不举了,熟悉历史的朋友自有决断;开源运动嘛,看看开源社区把所谓「伪开源」或者是「不纯粹的开源」骂成什么样子了吧。不过这样吵来吵去,好像也没有获得与投入的时间和精力相匹配的结果,有时甚至出现了绝对亏损(负收益),吵也吵累了,名声也丢了,社区裂得像分布式数据库,至于代码?哦,代码还在上个 commit 里躺着,动都没动。不管怎么样,我们得庆幸开源社区没有自己的慈父和 NKVD要不然估计 V 神或者 Linus 都要被当成「反开源分子」享受赛博冰镐了。或许这也算个幸运的事:争吵无果,但至少还允许争吵。
……**所以,为什么呢**
### 世上没有乌托邦
开源运动的社区宣言的本质,就是以技术这种人类的通用语言为媒介,建立一座跨越文化边界的巴别塔,进而通过共同的思想观念统合成员们的开发行动,在人间建立起「地上天国」的技术乌托邦。然而,这种愿景能否在实践中至少不打太多折扣地落地,恐怕是一件值得探讨的事情。
GPL 和斯托曼强调伦理和社会责任OSI 和 MIT License 则侧重实用和开发价值;有人喜欢 Python 的实用,有人偏爱 Lisp 的纯粹;有人认为 Unix 哲学是不可侵犯的边界有人却表示「只要能跑起来就行」……这些理念虽然差异巨大但要说完全不可通约倒也是过于悲观。可惜涉及人类的地方总归逃不过马斯洛需求理论的制约。很多时候尤其是涉及到「方法论」或者「开发路线」这种能和伦理挂上边的东西时争论就往往不再是单纯的信念之争而是涉及自我身份认同和群体归属的建构需求。人类总喜欢把一件符合自己偏好的东西图腾化如「GPL 是自由软件和自由精神的圣杯」,那么所有可能违逆图腾的事物,都是对自我主体性的威胁。直观点说,这种行为就是图腾化某一事物或者价值后的「上纲上线」。
而在现实实践中开源运动也面临着理念与实践的永恒裂隙。「用爱发电」是件值得尊敬的事但是如果你强制要求所有的开源开发者都要用爱发电那多少有些道德绑架。从自己的辛勤劳动中获得或多或少的物质报酬无可非议一个开源社群本身往往也需要资金维持其运转。然而如何平衡理想主义的志愿者们心中「纯粹」的开源与更加「实际」的项目运转如何处理开源社区和商业公司的关系则又是个三个鸡蛋跳舞的难题。Apache 基金会与科技巨头的微妙关系MongoDB 被迫修改许可证的巨大争议,抑或是 Amazon 打包开源项目用于盈利,以及「自主研发」的 CEC-IDE……究竟是「不食嗟来之食」地坚持反商业化的原教旨主义抑或是冒着「堕落」的风险尝试某种形式的商业化面对商业公司的吸血究竟是宁折不弯还是起身还击……像是一道目标函数无下界的非凸优化问题你永远没办法让所有人满意甚至「不不满意」但是可以轻松做到让所有人都不满意。而更糟糕的恐怕是开源社区不是什么「超越政治的纯粹技术空间」。俄乌冲突的 NPM 包投毒事件Linus 对 Linux 内核的俄罗斯维护者「重拳出击」的操作,再理想再浪漫的人也无法视而不见。
### 去中心化与无政府
维特根斯坦早已揭示:「私有语言不存在。」任何协作都需要共同规则,虽然因为种种原因,分歧不但存在而且巨大,但是我们能否维系一个共同,甚至可以接受一定模糊的规则?
很遗憾,这点很难。这里我们考虑的并不是如何求同存异,而是谁来定这个规则。
小氯前面说过,开源运动某种意义上很像国际共运。很明显,国际共运中的重要一员——无政府主义,也和开源社区很合得来。「去中心化」这个词,估计在区块链这类大众眼中的 Web3 技术兴起前就被开源社区开开心心地用上了。分散权力、社区决策听起来确实很美好而且在实践中很多时候也确实令人振奋。但是和无政府主义的困境一样如果我们稍加计算就能发现完全的去中心化社会是不可能在任何一个稍大的规模长久维系的——它的熵实在太高了。体现在实践中就是去中心化自治组织的治理成本指数级增长争议解决机制的缺失导致「代码共产主义」在实践中退化为议而不决的松散联盟。所以一定程度的中心化不可避免无论是为了更高效的协作、更明确的规章还是更好的可持续性与传承。成功的开源实践大都会走向制度化Linux 基金会如此Mozilla 亦如此。而在项目初期起到决定性作用的主要开发者们,也常常被加冕为项目的 BDFL他们的话可以在实质上主导项目的走向。然而这种制度本身就是对开源式民主理想的巨大讽刺如同拿破仑加冕为「革命的皇帝」一般。而从实践的角度BDFL 也难以完全成为诺顿皇帝式的仁慈、放权的领袖Linus 的「暴君式管理」就是一个例证。一旦权威缺失或失误,社区将立即陷入权力真空。而将权力的中心移交给一个组织,也并没有好到哪去,如同历史上布尔什维克主义的先锋党一般。我们大可以拿上面的 Gogs 三代人举个例子Gitea 将权力从 Unknwon 手中交到了社区,核心开发者们又将这份权力移交给了 Gitea Ltd.Codeberg 愤而另起炉灶,于是有了 Forgejo。那么我们还可以问Codeberg 会不会成为下一个绝对话事人?毕竟,非营利组织确实容易给人以不错的印象,但是这并不就是促进社区共同进步或者至少是「不作恶」的绝对保障。
另一个「去中心化的诅咒」是 Fork 机制。Fork 被视作开源民主和自由的终极体现,但是分叉权也导致生态碎片化。当 Node 分裂出 io 时,短期内确实激发活力,但长期来看是宝贵的社区注意力资源的消耗,也就是我上面说的,精力都用在内斗上了。
### 后记
……大放厥词了这么久,按照所谓的「批判性思维」的要求,我们似乎也应该说一点讨喜的话了。事实上我们也确实值得这样说。
自计算机科学的青铜时代,从 ENIAC 的真空管到量子比特的辉光间,软件的甲骨文和硬件的青铜器的相互交织就将自由、开放和共享刻进了计算机科学的灵魂。而客观上来说,无论是 DeepSeek-R1 在人工智能界掀起的惊涛骇浪,或者是新一届的 FOSDEM 大会,抑或是灿烂阳光下的新大陆开发者们,都在告诉我们:开源社区的脚步永远不会停下,即便分歧、争论抑或难题。而且,历史无法重构,但代码可以 fork。或许这就是开源比革命更幸运的地方在这里没有哪一种失败是终结每一次「不可调和的分歧」都可能孕育下一个版本更新或者是「再次出发」的宣言。或许是握手言和、合并回主分支或许是就此别过、成为两个不同的产品。没人能彻底移除项目的 `.git`,若是我们再难携手,那便卷起我的 repo大路朝天各走一边。或许在我们的眼中这些 fork 记录是分歧与裂痕,但实则是技术演化的年轮。
开源运动的终极浪漫,或许本就不在于消除分歧,而在于将每次争论都转化为新的 commit hash。此时此刻从东京到洛杉矶从上海到开普敦从雷克雅未克到布宜诺斯艾利斯总有人在终端中写下
```bash
git push origin new-horizon --force-with-lease
```
这或许就是数字文明最动人的地方:即便世界洪水滔天,每个 repo 都是自己的世界中不沉的诺亚方舟。
总而言之,我们还是留下一个光明的尾巴吧。依然心有火炬的人们还会歌唱「英特纳雄耐尔,就一定要实现」,小氯也相信,即使我们永远也达到不了我们理想的彼岸,但是我们至少可以用自己的一生,让我们离我们梦中的技术天国越来越近。
「**Que la info fluya como el viento**.」

View file

@ -0,0 +1,244 @@
---
slug: hello-quail
summary: 赞美Quail
tags:
- Newsletter
- Quail
- 博客
- 周报
title: HelloQuail
date: 2024-07-01
description: Quail是一个免费且对大陆友好的Newsletter服务帮助作者与读者保持联系并筹集资金。它支持多种推送方式具有优秀的编辑器和后台并计划支持更多功能。作者对Quail表示满意并将在Quail上发布文章。
categories: ["逍遥游"]
featuredImage: https://img.viento.cc/cover/hello-quail-cover.webp
draft: false
---
> 《期末考试后的报复式更新》
芜湖,各位老友们好啊,我是 Chlorine。
有眼尖的老友应该已经发现了,在侧边栏的社交图标中,多出了一个订阅的图标……
没错,万众瞩目的 Newsletter 服务,它来力(喜)
## 什么是 Newsletter
伟大的数学家柯西Cauchy曾指出在研究积分或原函数的各种性质以前应先证明它们的存在。
在我们讨论哪家 Newsletter 服务更好时,我们也应该先明确,什么是 Newsletter。
### 定义
简单来说Newsletter新闻订阅/电子报)就是通过电子邮件形式推送新闻、文章等内容。对于个人博客来说,就是通过邮件,向你的订阅者们推送你的更新文章。这种推送可以是定时的(例如每一周推送本周文章合集,或者推送周报),也可以是不定时的(例如每更新一次都推送,以及不推荐的想起来就推一次)。
### 好处
Newsletter 的好处是很多的,以下内容使用 Claude 3.5 概括:
在个人博客中配置newsletter电子通讯有许多好处。以下是一些主要优势
1. 建立直接联系:
- 与读者建立直接的沟通渠道
- 增强与受众的互动和联系
2. 提高访问量:
- 定期提醒订阅者访问你的博客
- 分享新内容,吸引读者重复访问
3. 增加内容曝光:
- 将博客内容直接发送到订阅者的收件箱
- 扩大内容的传播范围
4. 培养忠实读者:
- 通过定期沟通建立长期关系
- 提供独家或额外内容,增加订阅者的价值感
5. 收集受众数据:
- 了解订阅者的兴趣和行为
- 通过分析数据改进内容策略
6. 潜在的收入来源:
- 可以通过newsletter投放广告
- 提供付费订阅选项
7. 提高品牌认知度:
- 定期出现在订阅者的收件箱中,增加品牌曝光
- 建立个人或博客的专业形象
8. 分享额外内容:
- 发布博客文章以外的独家内容
- 分享个人见解、行业动态等
9. 引导流量到其他平台:
- 推广社交媒体账号
- 宣传新项目或产品
10. 获取反馈:
- 直接从订阅者那里获得意见和建议
- 了解读者需求,改进内容质量
11. SEO优势
- 增加网站的回访率,可能对搜索引擎排名有积极影响
12. 建立社区:
- 通过newsletter培养一个围绕你的博客的社区
- 增强读者之间的联系和互动
通过配置newsletter你可以更好地管理和发展你的博客受众提高参与度并可能为未来的项目或机会打下基础。
其实呢,在我看来,(以我的地位看)最主要的好处就是三个:**让读者更方便,让作者更认真,让双方更有感觉**。
## 曾经考虑过?
像 WordPress、Ghost 这样的动态博客大部分有自己的 Newsletter 服务,但是像 Hugo 这样的静态博客就没这个福气了。
### Mailchimp
chimp 是黑猩猩的意思Mailchimp 的 logo 也是猩猩,不知道意思是不是「猩猩都会用」。
Mailchimp 是 NotionNext [官方推荐](https://docs.tangly1024.com/article/notion-next-mailchimp)的订阅服务,也是目前为止应用最广泛的邮件营销服务之一。不过,由于我当初没有配置成功(因为当初没有订阅者。我真傻,真的,我单知道订阅列表是空的时候需要等读者订阅,我不知道可以自己订阅自己)让我对这个平台印象不是太好,再加上这个平台的免费额度是越来越低,我直接放弃了。
### Tinyletter
我第一个接触的静态博客—— [夜猫日记](https://lillianwho.com/)采用的订阅服务,是 Mailchimp 家的。完全免费,大陆可以访问,可惜……没了。
### Substack
> [!IMPORTANT]
> 注意,从下面开始,就是另外一条赛道了。
Substack 实际上**并非是邮件营销平台,而是一个类似微信公众号的创作平台**。这个服务是免费的只有在你盈利如付费订阅的时候才收费。只不过Substack 在大陆的访问并不顺畅,而且当初我也并不是很想考虑这种平台式服务,所以,过。
### Revue
仅仅是在[这里](https://irithys.com/blog-newsletter/)听过名字。Twitter 家的,应该在大陆访问也不顺畅。
### 竹白
看名字就知道,是一个国内适配的平台。在国内的 Newsletter 中名声不小,不过听说并不是很好用(注:只是听说!各有所爱,请不要抬杠 qaq
### Listmonk
> 万物皆可开源。——小氯酱
没错,一个 Newsletter 服务,自托管,免费,开源。
听上去很好,不是吗?
但是我对着我那个不知道发什么癫部署什么都 502 的虚拟机的时候,我就戴高(乐不出来)了。
至于部署到 Railway 这类平台?算了吧。就那么点免费额度,还不知道什么时候就碰线了。
### 自己写
没错,在刚开始开发 Hugo Theme Efímero 的时候,我的第一想法真的就是自己写一个。
我当时的想法是GitHub Actions 可以执行自动化任务,那为什么不让其读取新的文章,根据特定模板生成邮件,然后发出去?
想法一点问题没有Python 和其他语言也早就有相应的邮件库了(我甚至实验成功了)。
问题是:**你有这本事吗?**
答案很显然:没有。于是,我遗憾地放弃了。如果有大佬能写出来,请一定要告诉我一声。
## Quail
好了,啰里八唆这么一堆,终于到了我们今天的主角了——**[Quail](https://quail.ink/)**。
什么是 Quail援引官网的 First Line
> 建立一个会员社区,与你的追随者保持连接,为你的创作筹集资金。
简单来说,和 Substack 有点像,但是对大陆友好,且对 Obsidian 兼容。
Quail 的优点如下:
- Chinese-mainland-friendly
- 免费,仅在有付费订阅时收费
- 支持电子邮件之外的推送方式(目前仅支持 Telegram 和 Discord计划支持 LINE、WhatsApp、Slack 和微信等)
- 完善的 Markdown 支持
- 优秀的编辑器和后台
- Obsidian native support通过 Quail 插件)
- 数据分析
- Atom feed
- 支持去中心化代币支付
- 数据导入和导出
- 简单易用
- 开源
- ……
缺点:反正我目前没发现,每天只能推送三篇文章算吗?
~~小声:什么肝帝一天更新这么多啊~~
当然Quail 目前还在开发中,一些功能还不完善,例如文档汉化不完全(应该是为了推广所以优先国际化了?),有一些文档中提到的功能(例如自定义邮件格式,订阅商黑名单等)都没找到。这也算是缺点吧。
## 流程
### 注册 Quail 并创建频道
略,太简单了。
### 生成 API
在[这里](https://quail.ink/dashboard/profile/apikeys)创建就行。记好,下面要用。
### 安装 Obsidian Quail
在 Obsidian 插件市场搜索 Quail 安装即可。这个是作者[歌词经理](https://blog.lyric.im/)分支出来的插件,放心安装。无法访问 Obsidian 的老友可以借助 PKMer。
安装启用后在插件设置界面填写自己的 API 密钥和 List ID 即可。
### 开写
然后,拿出你最爱的 Obsidian写就可以了。Quail 贴心地提供了 AI 摘要功能。不过尴尬的是,我习惯在 `summary` 字段写一些俏皮话,`description` 写正经的摘要(用来 SEO不知道怎么处理。
[这里](https://docs.quail.ink/zh/)是 Quail 的官方文档,有问题可以查一查。
### Efímero 主题适配
我本来想写一个漂亮的弹出式订阅窗口,可惜没那能耐,只能选一个最简陋的方式了。
直接在 `hugo.toml` 里加入配置:
```toml
[[params.social]]
name = "Newsletter"
url = "https://quail.ink/yoghurtlee"
icon = "i-mdi-email-newsletter"
enable = true
```
完事。就是吧……有那么亿点点不太显眼……
![](https://img.viento.cc/EMJ-lemmeexcuse.webp "镜座:你听我狡辩.webp")
## 总结
总体而言 Quail 还是很令我满意的,以后我的文章也会在 Quail 更新一份,兼具 Newsletter 和备份平台的作用。
最后,再放下我的订阅链接~
---
*下面的文字是在我用 Quail 发布后添加的*
Quail 的发布很省心,直接 publish 就行。不过不知道为什么没能 deliver有可能是因为列表是空的。
老友们快来订阅啊 qaq
总体而言 Quail 还是蛮不错的,甚至可以直接当博客用。
以及冷知识Quail 的本意是鹌鹑 🤣

View file

@ -0,0 +1,178 @@
---
title: HelloRime
date: 2024-04-10T20:34:00
description: 本文介绍了开源输入法Rime它是一个高度可定制的输入引擎。作者分享了从其他输入法转向Rime的原因并详细说明了在macOS上安装和配置Rime的过程包括键位调整、自定义短语、外观修改和自动中英文切换。文章还提供了相关资源链接和个性化配置示例。
summary: 世界第一开源中文输入法我来啦!
tags:
- 折腾
- Rime
categories: ["逍遥游"]
slug: hello-rime
featuredImage: "https://img.viento.cc/cover/hello-rime-cover.webp"
---
各位老友们好,我是 Chlorine。
今天咱们讲输入法。说起输入法大家会想到什么呢搜狗讯飞百度QQ还是系统原生
就我个人而言,我在 Windows + Android 的时候一直在用讯飞输入法,感觉尚可。后来换到苹果全家桶,就改 iOS + macOS 原生了。不过,这一对对中文的支持,你别说,你还真别说()。而且,无论上面的哪种输入法,都不可避免地面临着一些问题:广告,隐私,可定制性,等等。
于是,我需要一个自由的,安全的,高度可定制的输入法。众所周知,世界上满足这些条件的东西,几乎都是 open-source 的。而世界上的确有 open-source 的输入法,隆重请出我们今天的主角—— **Rime**
## What is Rime
Cambridge dictionary 对「rime」 的定义是:
> Frost (= the thin, white layer of ice that forms when the air temperature is below the freezing point of water, especially outside at night)
简单来说:霜。结合 Rime 后续一些组件的命名,我们可以称其为「清霜」。
> 腾蛟起凤,孟学士之词宗;紫电清霜,王将军之武库。
[Rime 的官方网站](https://rime.im/) 则自我介绍道:
> 聪明的输入法懂我心意
严格来说Rime 并不是输入法,而是「输入算法」或者说是「输入引擎」。它将输入法底层的配置提取出来,并编写为一系列的代码。我们可以通过修改 Rime 的资源库进行多种多样的自定义。这赋予了 Rime 极高的自由度,当然,还有极高的上手难度。
可能有老友和我一样,看到 Rime 的时候会吃一惊:这种东西也能开源?!
众所周知,开源社区是无所不能的,就算是操作系统,都有开源的(例如 Linux更别提一个输入法了 🤣
Rime 支持全平台Windows/macOS/Linux/iOS/Android在不同的平台上有不同的程序以桌面端为例
- Linux「中州韵」Rime[^1]
- Windows「小狼毫」Weasel
- macOS「鼠须管」Squirrel
这几个程序的名字还都挺好听的。
我们下面以 macOS 的「鼠须管」为例进行讲解。
## 安装「鼠须管」
在官网上直接下载即可,是一个 `.pkg` 包。
双击会显示无法打开,不要急,右键——打开方式——安装器,直接无视警告强行打开即可。
安装后,在状态栏的输入法中,找到「鼠须管」启用即可。
## 自定义配置
下面才是 Rime 的重头戏。我目前懂得不多,先说几个我弄的。
> 在任何调整过后,请点击状态栏-鼠须管图标-重新部署!
### 照抄
没错,第一步是当 CV 工程师(逃)
Rime 从头配置实在太复杂了,我们捡一个前人的配置魔改更好。
我用的是 [这个方案](https://github.com/Lucius-Wang/rime-config)。其中的词库似乎挺久没更新了,我们去词库作者 [雾凇拼音](https://github.com/iDvel/rime-ice) 掏最新版词库。具体方法可以参照方案作者的 README。
### 几个键位调整
键位的调整位于 Rime 资源库macOS 一般是在 `/User/<your-user-name>/Library/Rime`)中的 `default.yaml`,这是 Rime 最关键的配置文件。
我已经习惯使用 macOS 的中英键而非 shift 切换输入法了,我们找到键位部分,改掉 shift-L
```yaml
Shift_L: noop # commit_code | commit_text | inline_ascii | clear | noop
```
由于 Rime 自带进入特定程序切换输入法的功能,因此我们将右边的 shift 置为切换,以备不时之需,例如在 VS Code 中写中文注释。
> 注:对于 YAML 的修改Rime 官方推荐使用 patch具体见 [CustomizationGuide · rime/home Wiki (github.com)](https://github.com/rime/home/wiki/CustomizationGuide)。
### 自定义短语
本方案的自定义短语在 `custom_phrase.txt` 中,按照 `汉字<Tab>编码<Tab>权重` 添加即可。理论上应该会有自定义的 `dict.yaml` 的,但是我没找到。
### 外观
本方案自带了 macOS 风格的输入法,但是我觉得不够 mac。在 `squirrel.custom.yaml` 中,将 mac 主题的 `hilited_corner_radius` 改成 0 会比较接近 macOS Sonoma 的风格。
当然你也可以像我一样自己写。App Store 上有一个 Squirrel designer 软件,可以帮你设计皮肤。
我自己随便写了一个:
```yaml
Like:
name: Like
author: Chlorine
font_face: "LXGWWenKaiLite-Regular"
font_point: 18.0
label_font_face: "Bookerly-Bold"
label_font_point: 15.5
candidate_list_layout: linear
text_orientation: horizontal
inline_preedit: true
translucency: true
mutual_exclusive: true
corner_radius: 5.0
hilited_corner_radius: 5.0
line_spacing: 2.0
alpha: 10.0
color_space: display_p3
back_color: 0xF2F3F3
candidate_text_color: 0xD8000000
comment_text_color: 0x3F000000
label_color: 0x515151
hilited_candidate_back_color: 0xCDDC7944
hilited_candidate_text_color: 0xD8000000
hilited_comment_text_color: 0x000000
hilited_candidate_label_color: 0xEE492816
hilited_corner_radius: 0
text_color: 0x3F000000
hilited_text_color: 0xD8000000
composition_bar_height: 35.0
```
需要电脑上有霞鹜文楷便携版的字体,没有的话可以换或者自己安装。夜间模式需要在第 64 行的 `style` 下面添加一行:
```yaml
color_scheme_dark: <你的主题名称>
```
这是我的夜间模式代码。
```yaml
NightMode:
name: NightMode
author: Chlorine
font_face: "LXGWWenKaiLite-Regular"
font_point: 18.0
label_font_face: "Bookerly-Bold"
label_font_point: 15.5
candidate_list_layout: linear
text_orientation: horizontal
inline_preedit: true
translucency: true
mutual_exclusive: true
corner_radius: 5.0
hilited_corner_radius: 5.0
line_spacing: 2.0
alpha: 10.0
color_space: display_p3
back_color: 0x1E1E1E
candidate_text_color: 0xFFFFFFFF
comment_text_color: 0x7F7F7F
label_color: 0xFFD3D3D3
hilited_candidate_back_color: 0xCDDC7944
hilited_candidate_text_color: 0xFFFFFFFF
hilited_comment_text_color: 0x000000
hilited_candidate_label_color: 0xFFD3D3D3
hilited_text_color: 0xD8000000
composition_bar_height: 35.0
```
### 自动中英文切换
同样是在 `squirrel.custom.yaml` 中。第 6 行开始都是,按照上面的格式照抄即可。
---
今天先讲这么多吧,我写微积分去了。
[^1]: Rime 输入法本身也被称为「中州韵」。我们约定在提到中州韵的时候,都指的是其 Linux 版本。

View file

@ -0,0 +1,182 @@
---
slug: hello-searxng
summary: 闲着没事搭个搜索引擎
tags:
- hello
- 折腾
title: HelloSearXNG
date: 2024-08-16
description: 本文讨论如何在内地服务器上使用 1Panel 和 OpenResty 搭建开源的 SearXNG 私有搜索引擎。SearXNG 是一个元搜索引擎不收集用户数据并支持本地偏好设置。只需一台服务器、代理和基本配置便可顺利部署。一些设置包括修改访问密钥、环境变量和代理配置最终可以将其设置为默认搜索引擎。总体来说SearXNG 速度可接受,但搜索结果有时不够精准,建议与 DuckDuckGo 搭配使用。
categories: ["逍遥游"]
featuredImage: https://img.viento.cc/cover/hello-searxng-cover.webp
draft: false
---
各位老友们好,我是 Chlorine。今天继续水文。
其实本期正确的标题应该是:
《如何基于 1Panel 和 OpenResty 在内地服务器上搭建开源私有化的搜索引擎》
这样或许对 SEO 好点,但是小氯对于这件事一向是摆烂(~~你对什么事情不摆烂啊喂~~),所以直接加入 hello 宇宙就好了。
## 前言
众所周知,全球的搜索引擎巨头们都对用户隐私有着非常高的尊重,从不收集你的历史记录、搜索记录、位置、时间、联系信息、联系人、使用数据、财务信息、健康状况、诊断信息、购买项目、设备标识符、敏感信息等你不希望它们收集的东西,也不会使用你的数据去分析你的偏好或者产出内容农场。同时它们对于广告也有着非常好的管控,每一次的搜索结果都不会含有任何广告,尤其是在中国大陆拥有最大影响力的百度,确保了你良好的搜索体验。而且它们也尊重竞争对手的权利,不会对竞争对手的搜索结果 SEO 做任何的打压。这种负责任的做法获得了全球计算机爱好者和广大用户的一致好评。好的,请还在笑的老友收一收,茶都洒到衣服上了。
在隐私保护方面,可能也就是 DuckDuckGo 能做得好点。不过 DuckDuckGo 在大陆地区因为某些原因访问并不顺畅,而且这毕竟还是把数据交给第三方,肯定会有老友感觉不大舒服的。
不过没关系小氯曾经说开源社区是万能的。如果所有搜索引擎的巨头都做不好这一点那么我们自托管一个开源的就好了。那么有请今天的主角——SearXNG。
## SearXNG
我不大清楚 SearXNG 的名字是怎么来的,可能和 SearX 有关。
[SearXNG](https://docs.searxng.org) 是一个用 Python 写的**元搜索引擎**。That is它自己并不提供搜索引擎的职能而是通过分析和综合各大搜索引擎的结果来进行高效的查找当然用我们的小服务器去爬整个互联网也是不现实的。SearXNG 不收集任何用户数据,一切的偏好全部以 Cookie 的形式存在于本地,同时采用各种方式来避免任何在搜索过程中暴露个人信息的行为。
如果各位老友没有条件自部署,也可以去 [https://searx.space](https://searx.space) 找几个已经部署好的实例尝尝鲜。
## 前置说明
请注意,如果您的已有条件和需求不满足下面所述,那小氯推荐您还是先别看文章了,还是先去公共空间喝杯茶更能体现对您生命的尊重。
条件:
- 一台自己的服务器
- 一个能够顺利访问世界互联网的 endpoint
- 一台电脑
- 手,脑子
需求:
- 希望部署一个私有化的搜索引擎
- 不希望使用 SearXNG 原生的 Caddy 作为反代(本文使用 1Panel 面板和 OpenResty其他反代服务器应该可以类推但是这需要您自己来做
好的,我们开始。
## 拉取 Git 仓库
> [!TIP]
> 如果您有能够可视化上传的面板的话,在本地编辑也没问题。我就是这么干的。
首先随便选个目录,比如 `/usr/local`。按理说在哪应该都无所谓,但是我推荐就在这里,防止出现什么奇奇怪怪的问题。
官方的仓库有点问题,小氯给大家准备了一个修复版的,具体改动是:
- 删除了 Caddy 相关配置
- 创建了 `uwsgi.ini` 以避免 `# cp: can't create '/etc/searxng/uwsgi.ini': Permission denied` 报错(官方居然把这个文件加到 `.gitignore` 了,难绷)
- 直接增加了出站代理设置
- 默认关闭 limiter 限制(个人实例一般不用,如果希望打开,修改 `settings.yml``limiter` 键为 `true`
```bash
cd /usr/local # 或者你的目录
git clone https://github.com/chlorine3545/searxng-docker-fixed.git
```
如果访问不畅,可以使用 SSH 或者是我准备的国内镜像:
```bash
cd /usr/local
git clone https://gitee.com/chlorine3545/searxng-docker-fixed.git
```
完事之后,用你喜欢的编辑器打开仓库,进行一点小小的编辑。
### 设置访问密钥
执行命令:
```bash
sed -i "s|ultrasecretkey|$(openssl rand -hex 32)|g" searxng/settings.yml
```
如果出现报错就试一试:
```bash
sed -i"" -e "s|ultrasecretkey|$(openssl rand -hex 32)|g" searxng/settings.yml
```
Windows 用户可以使用(官方的,我没试过):
```ps
$randomBytes = New-Object byte[] 32
(New-Object Security.Cryptography.RNGCryptoServiceProvider).GetBytes($randomBytes)
$secretKey = -join ($randomBytes | ForEach-Object { "{0:x2}" -f $_ })
(Get-Content searxng/settings.yml) -replace 'ultrasecretkey', $secretKey | Set-Content searxng/settings.yml
```
然后打开 `settings.yml`,如果发现原本的 `ultrasecretkey` 变成了一串乱七八糟的字符,那么就成功了。
### 编辑环境变量
编辑 `.env` 文件,将 `# SEARXNG_HOSTNAME=<host` 那一行取消注释,`<host` 改为你希望绑定的域名。不需要带 HTTP 或者 HTTPS。
### 修改 `docker-compose.yml`
找到第 32 行,就是我写注释的那个位置。把左边的端口改成你喜欢的。
### 增加代理
由于某些原因,境内服务器能访问的搜索引擎比较有限。为了让我们的信息获取渠道更加多样,我们需要配置一下代理。别问我哪来的代理,问就是光荣而伟大的孙哥。
`settings.yml` 中的第 32 行,把两个 `http://ip:port` 改成你的 endpoint 即可。
这里我照抄了官方配置,更多信息请参考这里。
## 启!动!
编辑完文件后,就可以开始启动了。
在目录下以 `sudo` 模式执行:
```bash
docker-compose up -d
```
等待部署完成即可。友情提示,如果有代理推荐打开,可以避免一些问题,但是一般没事。
完成后打开你的部署地址,如果看到:
![|566](https://img.viento.cc/IMG-20240816105021.avif)
恭喜你,部署成功。现在试着搜索一下吧。可以在首选项那里进行各种配置。
不过有点难绷的一点是,我搜索我自己的站点没有任何结果,但是在 Google、Bing 和 DuckDuckGo 上页面的权重都是第一。而且我使用别的 SearXNG 实例搜索,结果是不一样的。我很难理解这一点。
## 设置反代
略。
## 设置密码
我们部署的是私人实例,为了防止被一些 unwanted visitor 使用,我们可以使用一个密码来进行保护。当然,不开也行。只要你不分享你的域名,同时禁止掉爬虫,基本上只可能通过 DNS 扫描来扫出来有这么个域名(还无法知道这个域名是干什么的)。
在 1Panel 上设置密码相当容易,在网站-网站设置-密码访问中设置就可以。
## 设置默认搜索引擎
这么好的引擎,不用起来怎么能行。这里我只讲 ArcChrome 系,比如 Chrome、Edge 等基本同理)和 LibreWolfFirefox 系基本同理)的方法。
### Arc
在地址栏键入 `arc://settings` 进入设置界面,点击「搜索引擎」选项卡。滑到「网站搜索」,按如下格式填写:
![](https://img.viento.cc/IMG-20240816105428.avif)
添加后右面三个点,选择设为默认即可。
### LibreWolf
快捷键 `⌘ + ,` 进入设置界面,在搜索选项卡配置。方法与 Arc 基本一样。
小氯温馨提示:这种注重隐私的搜索引擎,和 LibreWolf 这种注重隐私的浏览器更配哦。
## 总结
总体而言 SearXNG 还是相当不错的,我目前已经将它设置为全平台通用的默认引擎了。
大体响应速度是 2-3s还算可以接受。不过感觉有时候结果不是很准所以我现在把它和 DuckDuckGo 混用。
再次感谢伟大的开源社区。祝各位老友互联网之旅愉快。

View file

@ -0,0 +1,218 @@
---
slug: hello-shiki
summary: 这代码高亮,多是一件美事啊
tags:
- 博客
- 折腾
title: HelloShiki
date: 2024-08-18
description: 本文介绍了如何在Hugo中使用Shiki进行代码高亮Shiki在服务端执行提供了更好的性能和样式适合构建静态网站需满足特定前置条件和安装依赖步骤包括配置Hugo、创建rehyperc文件和修改CSS等。
categories: ["逍遥游"]
featuredImage: https://img.viento.cc/cover/hello-shiki-cover.webp
draft: false
showTableOfContents: true
---
各位老友们好,我是 Chlorine。继续高强度水文。
本期的主题是 Hugo 的代码高亮,主要参考了[蜗牛大神](https://www.eallion.com)的教程:[在 Hugo 中使用 Shiki](https://www.eallion.com/hugo-syntax-highlight-shiki/)。感谢前辈的付出。
## 前言
Hugo 的代码高亮基于 Chroma。这是个用 Go 语言写的库,好处是性能极高,坏处是不太聪明。比如我之前的文章 [HelloSearXNG]({{< relref "HelloSearXNG.md" >}}),里面有一段 PowerShell 脚本,结果:
![](https://img.viento.cc/IMG-20240818100304.avif)
嗯……这个效果不能说是尽善尽美吧,至少也可以说是聊胜于无。
其他的部分,像 `docker-compose``git` 之类的命令高亮不了,已经是一食堂的麻辣香锅——家常便饭了。
那怎么修复?无非两个招:自己写 Lexer[^1],或者引入第三方库。
不清楚哪位勇士有第一项所需的娴熟的专业技能、大把的闲暇时间和超人的折腾勇气,反正小氯自认为没有。
Hugo 的第三方代码高亮库很多,比方说 `Highlight.js``Prime.js`,其优缺点可谓各有千秋。但它们都有一个致命的缺点:**都需要在客户端执行大量的 JavaScript 代码**。这就势必会对性能造成可怕的影响。如果大家没有什么感知的话,请参考下面的 Twikoo 的加载需要多久。
那有没有办法在服务端执行代码,把压力放在网站构建过程中呢?
方法就是我们今天的主角——Shiki。
## Shiki 简介
Shiki 这个名字来自于日语的「式」しき意思就是「样式」。此外如果我记得没错Shiki 应该还有季节、四季的意思,当然这不重要。
[Shiki](https://shiki.style) 是一个基于 VS Code 语法高亮引擎(没错,就是那个 VS Code的代码高亮库。其基于 TextMate 语法定义文件和 WebAssembly 技术提供快速精确的代码高亮。
Shiki 很特别的一点在于:**它在执行时会扫描指定路径的 HTML 文件,并且将各种语法 token 附加上内联样式**。这使得 Shiki 非常适合用来为 Hugo 这样的静态网站构建工具添加高亮,无它,扫一遍 `public` 就行了。
顺便说一句Shiki 是 Pine Wu 和 Anthony Fu 等前端大神的力作 :)
## 前置要求
请注意,如果您的已有条件和需求不满足下面所述,那小氯推荐您还是先别看文章了,还是先去公寓的公共空间喝杯茶更能体现对您生命的尊重。~~没错我是直接从上一篇文章复制过来的~~
条件:
- 已经能用 Hugo 构建静态网站
- 对 GitHub Actions 和 Vercel 等自动构建的流程有一定了解
- 本地已经配置了一个 JavaScript 运行时及包管理器,例如 `Node.js` 或者 `Bun.js`。我们以下均使用 `Bun.js` 进行演示。
要求:
- 对 Chroma 的高亮表现不满
- 不希望使用 `Highlight.js` 等客户端高亮器
## 安装相关依赖
进入你的博客根目录,运行命令:
```bash
bun i shiki @shikijs/rehype rehype-cli
```
这应该会自动为你创建 `node_modules``bun.lockb``package.json`。记得把 `node_nodules` 文件夹加到 `.gitignore` 里面——如果没有自动添加的话。
## 配置 Hugo
修改 `hugo.toml` 或者你其他名字的配置文件,将 `codeFences` 改为 `false`。如果没有请自行创建,像这样:
```toml
[markup]
[markup.highlight]
codeFences = false
```
## 创建 `.rehyperc`
如果我没猜错的话,这应该是 rehype 的配置文件了。看起来跟个 `JSON` 似的。
```json
{
"plugins": [
[
"@shikijs/rehype",
{
"themes": {
"light": "你的日间主题",
"dark": "你的夜间主题"
}
}
]
]
}
```
主题列表在[这里](https://shiki.style/themes),挑个自己喜欢的吧。效果没必要像我一样每次都重新构建,在 VS Code 里面搜索同名主题看就行了。我比较选综,就用了 One Dark Pro 系列的。
rehype 这东西很神奇,可以对 HTML 各种爆改。当然,咱们这里用的就是其中一个插件,如果想进一步探索请看[这里](https://github.com/rehypejs/rehype/blob/main/doc/plugins.md),如果有什么好的创意也可以和我分享,小氯洗耳恭听。
## 修改 Hugo CSS
找到你主题的 CSS。我们要做一下样式适配。我原本的样式大概是
```css
code {
font-family: "Fira Code Light", "LXGW WenKai Lite", monospace;
}
code[class*="language-"],
pre[class*="language-"] {
white-space: pre-wrap;
/* 或 pre-line */
word-break: break-all;
}
```
现在改成:
```css
code {
font-family: "Fira Code Light", "LXGW WenKai Lite", monospace;
}
html .shiki,
html .shiki span {
white-space: pre-wrap;
word-break: break-all;
overflow-wrap: break-word;
font-family: "Fira Code Light", "LXGW WenKai Lite", monospace;
}
html.dark .shiki,
html.dark .shiki span {
color: var(--shiki-dark) !important;
white-space: pre-wrap;
word-break: break-all;
overflow-wrap: break-word;
font-family: "Fira Code Light", "LXGW WenKai Lite", monospace;
}
```
大家照猫画虎即可。
## 配置脚本命令
在根目录的 `package.json` 下面添加这样的脚本命令:
```json
"scripts": {
"shiki": "bunx rehype-cli public -o"
}
```
大体而言改完之后你的文件应该看起来像是:
```json
{
"dependencies": {
"@shikijs/rehype": "^1.13.0",
"rehype-cli": "^12.0.0",
"shiki": "^1.13.0"
},
"scripts": {
"shiki": "bunx rehype-cli public -o"
}
}
```
当然shiki 这个名字你可以随便起,然后就可以在根目录下运行 `bun run shiki` 对构建产物进行替换了。如果报错,大概率是因为你使用了不支持的语言或者错误的语言代码(比方说,`html` 写成 `HTML`)。可以在[这里](https://shiki.style/languages)查看标准化的代号表。
## Vercel 构建命令
GitHub Actions 版本的可以看上面蜗牛大神的教程。
```bash
cd themes/efimero && bun install && bun run build && cd ../.. && hugo --gc --minify && bun install && (bun run shiki || true)
```
这大概就是完整的构建命令了。最后的 `|| true` 是为了防止报错导致的构建失败。
## 自动化
大家知道,小氯是个被 C++ ~~荼毒~~熏陶过的带学生,因此习惯使用 Makefile 整合所有构建过程。
不过 Makefile 有个致命的缺点:**只能一步一步执行命令**。而 `bun run shiki` 应该在 `hugo server -D` **构建 public 文件夹完成,但是未结束(只有我们手动停止这个命令才能结束)** 时执行。使用后台运行的指令的话,又没办法准确把控时机。唯一的方法可能就是使用 `fswatch` 了,但是这样又会造成不必要的性能开销。
对于不经常折腾主题,只是发布内容的老友来说,这其实不是问题,主要对于小氯这样的喜欢折腾主题的人比较麻烦。现在只能是每次手动执行下,或者干脆只 `make`,缺点就是高亮没了。
## 去掉行号
在本地测试的时候我发现 Hugo 代码块的行号变得非常抽象具体来说10 居然会换行变成 1 和 0。改 `hugo.toml` 不管用于是采取最简单粗暴的方法CSS 隐藏。
```css
.custom-md code span.line:before {
display: none;
}
```
## 结语
又水了篇文章,内心毫无~~波兰~~波澜。
Shiki 的效果确实出挑,虽然会显著加长构建时间,但是也算可以接受。这样代码高亮看起来就好看多了。
以及一个新消息:我准备为主域名重新备案啦!这期间网站评论可能会关闭(看侧边栏的公告即可),但是其他功能不受影响。可以给我发邮件来互动~
[^1]: Lexer即词法分析器或扫描器是编译器的第一阶段。其任务是读取源代码文本并将其分解成一系列的标记tokens。每个标记代表了源代码中的一个有意义的片段比如关键字、标识符、字面量、运算符等。Lexer 的输出是源代码的抽象表示它为后续的语法分析parser提供了基础。

View file

@ -0,0 +1,104 @@
---
slug: hello-sink
summary: 我也不大知道这个有什么用,但是我认为它有用
tags:
- CloudFlare
title: HelloSink
date: 2024-07-29
description: 本文介绍了 Sink 项目的部署过程。Sink 是一个基于 CloudFlare 的短链接项目,支持数据分析和链接截止日期等功能。本文详细介绍了使用 CloudFlare 部署 Sink 的过程。
categories: ["逍遥游"]
featuredImage: https://img.viento.cc/cover/hello-sink-cover.webp
draft: false
---
各位老友们好,我是 Chlorine。
最近在重拾 TypeScript~~小氯你到底还要开多少个语言的坑啊~~),同时热衷于薅带善人 CloudFlare 的羊毛,于是盯上了 CloudFlare Workers&Pages然后找到了一个有趣的项目[Sink](https://sink.cool)。
## 简介
Sink 是一个完全基于 CloudFlare 的短链接shortURL项目支持数据分析和链接截止日期等多种功能。
啥是短链接?简单来说,如果你觉得小氯的文章[解决Swup导致的JavaScript加载失效问题](https://chlor.me/swup-modifying)写得不错(~~行了我知道你并不这么觉得~~),希望分享给朋友,你很可能会把这个链接直接粘贴给你的朋友:
```txt
https://chlor.me/swup-modifying
```
看着还行,不是吗?但是假如小氯的链接是:
```txt
https://ameaninglessprefix.averylongurlforchlorinechan.ameaninglesstldthatdoesntevenexist/ameaninglessdirthatstandsformyposts/anothermeaninglessprefix/2024/07/26/qwertyuiopasdfghjklzxcvbnm1234567890/swup-modifying
```
我敢打赌你的朋友看到这个链接就会汗流浃背。
但是如果现在你贴心地告诉朋友,这个链接也是一样的:
```txt
# 注:我瞎编的
https://cl.tld/swup
```
我相信你们之间的友谊会得到相当程度的强化。
概括一下,就是说有时候一个链接实在是太长了,不便于分享和发送,我们就想办法造出一个短链接来,使得这个短链接指向原本长链接一样的位置。
市面上的短链接服务有很多Sink 是其中能自部署的服务中比较出色的一个。
## What do I need?
- 一个 CloudFlare 账户
- 一个托管在 CloudFlare 的域名,短点最好
- 一个 GitHub 账户
- 一台能顺畅访问互联网的设备
- 手,脑子
## 准备工作
### 获取 CloudFlare Account ID
在 CloudFlare 仪表板中随便点击一个域名,进入概览页面,向下滑,在 API 一栏中就能看到【账户 ID】了。
![|426](https://img.viento.cc/202407292145948.avif)
### 创建 CloudFlare Account API
在仪表板的右上角点击账户图标-我的个人资料-API 令牌,然后点击创建 API 令牌。
滑动到最下方,选择【创建自定义令牌】,配置如下所示:
![|584](https://img.viento.cc/IMG-20240729215335.avif)
### 创建 CloudFlare KV
在侧边栏-Workers 和 Pages-KV 创建即可,名字随便起。
## 启动!
首先进入 GitHubfork [这个仓库](https://github.com/ccbikai/sink)(别忘记给作者点 star~)。然后进入 CloudFlare在侧边栏点击【Workers 和 Pages】新建一个 page选择【通过导入现有 Git 存储库创建】(如果还没绑定 CloudFlare Pages APP 到 GitHub按要求操作即可仓库选择刚刚克隆的仓库。
进入配置界面,项目名称随便起,框架预设选择 `Nuxt.js`,然后点击【环境变量(高级)】,增加如下几个环境变量:
- `NUXT_SITE_TOKEN`:这个随便起,但是**长度需要超过 8且不能是纯数字**
- `NUXT_CF_ACCOUNT_ID`:你的账户 ID
- `NUXT_CF_API_TOKEN`:你的 API token
然后点击部署,随即取消(~~CloudFlare你是真的苟~~)。进入项目管理界面-设置-函数,添加以下的绑定:
- KV键就是 `KV`,值是你刚才的 KV namespace。
- Workers AIOptional键为 `AI`,值会自动给你生成为 `Workers AI Catalog`
- Analytics Engine键为 `ANALYTICS` ,值为 `sink`(需要启动 CloudFlare 分析引擎,照做即可)。
> [!IMPORTANT]
> 注意这几个绑定的【生产】和【预览】选项卡是不同步的,需要分别创建!
然后重新部署即可。
## 绑定自定义域名
这个是可选的,但是 CloudFlare Pages 的域名很容易访问不畅,而且也太长了,违背了 short 的初衷。
绑定域名的步骤略过。剩下的时间,各位老友自由发挥吧。

View file

@ -0,0 +1,162 @@
---
title: HelloVSCodium
date: 2024-05-19T19:52:00
slug: hello-vscodium
summary: 一次简简单单的换编辑器之旅
categories: ["逍遥游"]
description: 本文介绍了 VSCodium这是一个完全开源且不包含数据收集的 VS Code 替代品。作者讨论了转向 VSCodium 的原因,包括对开源软件和隐私的关注,并提供了安装、设置迁移和扩展换源的指南。最后,作者指出 VSCodium 和 VS Code 在界面和使用上非常相似。
showTableOfContents: true
featuredImage: https://img.viento.cc/cover/hello-vscodium-cover.webp
---
各位老友们好,我是 Chlorine。
## 前言
从高考暑假接触 Python 开始,我就一直使用蟒蛇书推荐的 VS Code 作为我的代码编辑器,其美观和高度可扩展性深得我心。即使是换用 MacBook 后我也没有考虑过别的编辑器。
不过随着见识的增长我对自由开源软件FLOSS和隐私保护的渴求越来越强。这倒不是什么关乎软件方面的意识形态的问题也不是说非 FLOSS 就如何如何,只是单纯的个人感觉而已。
## VS Code——开源的代码编辑器……吗
可能有人会问VS Code 难道不是 FLOSS 吗VS Code 的全部源码都在[这个仓库](https://github.com/microsoft/vscode),并且遵循 MIT 许可证开源。
对此,我的答案是:确实,您说的大部分正确。
但是我们需要注意: **无论是从 VS Code 的官网还是从 GitHub release 进行下载,我们获取的都是一个二进制包,而不是 VS Code 的源码**
这有什么区别吗?
当然有。
我们看一下 VS Code 的官方网站:
![](https://img.viento.cc/IMG-20240519120024.webp)
注意到了吗VS Code 的说明中不是「open source」而是「build on open source」。
我们来复习一下 MIT 许可证的内容:
> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
如各位所见MIT 许可证允许任何人使用、复制、修改、合并、发布、分发、再授权和销售软件副本。**这里的「任何人」,自然也包括 Microsoft。**
那么 Microsoft 到底做了什么?简而言之,微软的工程师们将自家的源码进行了打包,构成了我们平时看到的 Visual Studio Code。但是**这份 Visual Studio Code 的成品包是在一个[非FLOSS的许可证](https://code.visualstudio.com/license)下发布的,并且包含了微软的遥测和数据收集**。
下面是微软的一位工程师 [Chris Dias](https://github.com/chrisdias) 在 VS Code 源码的 GitHub 仓库中 issue #60 的解释:
> Thanks for the interest in this topic and I apologize for not commenting sooner, Ive been on vacation and just getting through my backlog. Let me try to provide more details behind our thinking here.
>
> When we set out to open source our code base, we looked for common practices to emulate for our scenario. We wanted to deliver a Microsoft branded product, built on top of an open source code base that the community could explore and contribute to.
>
> We observed a number of branded products being released under a custom product license, while making the underlying source code available to the community under an open source license. For example, Chrome is built on Chromium, the Oracle JDK is built from OpenJDK, Xamarin Studio is built on MonoDevelop, and JetBrains products are built on top of the IntelliJ platform. Those branded products come with their own custom license terms, but are built on top of a code base thats been open sourced.
>
> We then follow a similar model for Visual Studio Code. We build on top of the `vscode` code base we just open sourced and we release it under a standard, pre-release Microsoft license.
>
> The cool thing about all of this is that you have the choice to use the Visual Studio Code branded product under our license *or* you can build a version of the tool straight from the `vscode` repository, under the MIT license.
>
> Here's how it works. When you [build](https://github.com/Microsoft/vscode/wiki/How-to-Contribute#build-and-run-from-source) from the `vscode` repository, you can configure the resulting tool by customizing the [`product.json`](https://github.com/Microsoft/vscode/blob/master/product.json) file. This file controls things like the Gallery endpoints, “Send-a-Smile” endpoints, telemetry endpoints, logos, names, and more.
>
> When we build Visual Studio Code, we do exactly this. We clone the `vscode` repository, we lay down a customized `product.json` that has Microsoft specific functionality (telemetry, gallery, logo, etc.), and then produce a build that we release under our license.
>
> When you clone and build from the `vscode` repo, none of these endpoints are configured in the default `product.json`. Therefore, you generate a "clean" build, without the Microsoft customizations, which is by default licensed under the MIT license (note, i made [this commit](https://github.com/Microsoft/vscode/commit/9dd095c27ea79f526b054f741bb52fa62fae80a9) to help make this more clear).
>
> I hope this helps explain why our Microsoft branded Visual Studio Code product has a custom product license while the `vscode` open source repository has an MIT license. Last, I apologize for the fact that the naming of “Visual Studio Code”, “VS Code” and the `vscode` repository are so similar, I think it contributed to the confusion.
这样做有问题吗?
完全没有。Microsoft 严格地遵循了他们自己制定的开源规则:他们使用自己开源的代码构建了一份属于 Microsoft 的发行版本。他们也没有欺骗用户,在显眼的位置写着 「build on open source」甚至还告诉你你可以通过一些方式关闭遥测。姑且不论这样做是否符合实质正义但是在我看来这已经足够坦荡。
但是,用户很可能不会愿意被收集数据,尤其是那些极其看重隐私的用户。虽然微软给出了关闭遥测的方法,但是他们也堂而皇之地说:
> The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products and services. **You may opt-out of many of these scenarios, but not all,** as described in the product documentation located at [https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting](https://code.visualstudio.com/docs/supporting/faq#_how-to-disable-telemetry-reporting).
那难道我们真要自己从头编译 VS Code 的源码吗毫无疑问99%的人是做不到这一点的。
**于是VSCodium 应运而生。**
## An Introduction to VSCodium
VSCodium 的官网上如是介绍自己:
> VSCodium is a community-driven, freely-licensed binary distribution of Microsofts editor VS Code.
好的,已经把事情说清楚了。
VSCodium 就是通过 VS Code 的源码构建出来的另一份发行版。其不同之处在于:它是一个完全的 FLOSS**不包含任何遥测和数据收集的部分**。
那如果我也没办法相信 VSCodium 呢?
对此我只能说:那您就自己编译一份发行版,然后比较 Hash 值吧。
## 我需要切换吗?
简而言之,你需要满足以下条件,否则请继续 VS Code
- 不能忍受 Microsoft 的数据收集/FLOSS 的信仰者
- 不是绝对需要 Microsoft 的专属插件
## 安装
在 macOS 上,可以使用 Homebrew 安装 VSCodium
```bash
brew install --cask vscodium
```
## 设置迁移
运行以下命令:
```bash
cp ~/Library/Application\ Support/Code/User/settings.json ~/vscode-settings.json
cp ~/Library/Application\ Support/Code/User/keybindings.json ~/vscode-keybindings.json
```
然后运行:
```bash
mv ~/vscode-settings.json ~/Library/Application\ Support/VSCodium/User/settings.json
mv ~/vscode-keybindings.json ~/Library/Application\ Support/VSCodium/User/keybindings.json
```
## 扩展换源
VSCodium 使用[https://open-vsx.org/](https://open-vsx.org/)作为扩展源,但是这个源的扩展不太全。我们可以使用微软市场作为扩展源。
在访达-应用程序中,双击 VSCodium ,显示包内容,然后进入 `/resources/app/product.json`,编辑 `extensionsGallery` 键:
```json
"extensionsGallery": {
"serviceUrl": "https://marketplace.visualstudio.com/_apis/public/gallery",
"itemUrl": "https://marketplace.visualstudio.com/items"
}
```
重启即可。
## 扩展迁移
个人觉得,最方便的方法就是直接复制所有扩展文件。
`~/.vscode` 中,复制整个 `extensions` 文件夹,粘贴到 `~/.vscode-oss` 即可。
下面是一些我测试之后有问题的扩展:
### Pylance
Pylance 是 Python 的一个语言服务器。这个服务器属于微软专有,不能在 VSCodium 上运行。可以改用 Jedi。
### GitHub Copilot
GitHub 是微软的一部分,所以 GitHub Copilot 在 VSCodium 上运行不了也不奇怪。
这里没有什么很好的方案,推荐的方法就是使用替代品,例如同样受欢迎的 Codeium以及国产的 Fitten code 等。
> 更新:是可以使用的,方法见[https://github.com/VSCodium/vscodium/discussions/1487](https://github.com/VSCodium/vscodium/discussions/1487)
## 结语
然后,基本上就可以无缝衔接到 VSCodium 进行开发了。祝愉快。
![|600](https://img.viento.cc/IMG-20240519124202.webp "二者的样式几乎一模一样")

View file

@ -0,0 +1,184 @@
---
title: "HelloiTerm2"
date: 2024-05-05T20:18:00
featuredImage: https://img.viento.cc/cover/hello-iterm2-cover.webp
slug: hello-iterm2
categories: ["逍遥游"]
summary: 找到了一个好用的终端啦
description: 本文介绍了作者使用 iTerm2 作为终端模拟器的过程及配置。作者最初因担心兼容性问题放弃了 Hyper尝试了多个终端包括默认终端、Warp、Wave、Wind 和 Tabby但各自都有不足最终选择了 iTerm2。文章详细介绍了通过 Homebrew 安装 iTerm2并推荐了 Oh-my-zsh、zsh 插件、tmux 等工具来提升使用体验。此外,作者分享了如何自定义 iTerm2 的配色、字体、状态栏及图标等美化步骤,推荐了 Starship 作为终端美化插件,并展示了最终配置效果。
tags:
- 折腾
- iTerm2
---
# Hello, iTerm2
各位老友们好,我是 Chlorine。
最近兜兜转转,换了许多个 Terminal emulator最终选择了 iTerm2。所以写点东西记一下。
## 前言
其实单纯是因为看到 Hyper 太久没放新的 release 了,害怕出什么兼容性问题。所以,折腾吧。
### 默认终端
这自然是最原生的选择。但是,默认终端浑身上下都散发着一个字:难看(通辽汉字 1/1. 而且,默认终端还换不了图标。这对别人来说可能不是什么事,但是对我来说,有点难绷。
### Warp
这个终端十分逆天。具体来说,这个终端是闭源的,还需要登录。
当然,这种设计招致了大量用户的不满。具体请看 [https://github.com/warpdotdev/Warp/discussions/400](https://github.com/warpdotdev/Warp/discussions/400) 。
不知道大家敢不敢用,反正我是不敢,尽管这个终端确实优秀。
### Wave
可以说是 Warp 的开源替代品。特色是自带一个有趣的文本编辑器 `codeedit`,能在终端中实现类似于 GUI 文本编辑器的功能。不过缺点是没有高亮,我已经[提 issue](https://github.com/wavetermdev/waveterm/issues/636) 了。
(小声:而且我也没有 GPT 的 API这个 AI 也就没什么大用)
### Wind
这个终端看起来很有特色,有点像 IDE。不过我用起来有点不顺手。
最难绷的是,它可以换图标,但是在启动的时候,图标就会换回去。
> 我去除了大部分的 Wind 的图标,但是我保留了一部分,我觉得保留了一部分 Wind 的图标才知道你用的是 Wind。
### Tabby
这个我用了一段时间。优点是超级好看,缺点是启动非常慢,这是我无法忍受的。而且,可能是 bug在显示命令的时候有时候会重叠。
### 其他
略略略略略。
## 瘟锌锑逝
- 本文不完全是教程,有许多步骤讲得不清晰。
- 大家各有各的需求,请根据自己的实际情况因地制宜。
- 后面会经常涉及 `.zshrc` 的编辑,新手推荐用 nano 而不是 Vim 作为编辑器。或者是在用户根目录点击 `⌘ + ⇧ + .` 显示隐藏文件,找到后用 VS Code 等编辑。
- 别问为什么封面是 Ubuntu问就是找不到图。
## 前置准备
- 一台电脑(对我来说就是 MacBook
- 作为默认终端的 Zsh
- Homebrew最好是有。可以搜索 Homebrew-CN 加速。)
- 脑子,眼睛,手
## iTerm2 简介
很多人说 iTerm2 是 macOS 上所有 Terminal emulator 的终点。这话有点夸张,但是也的确说明了这个终端的优秀和受欢迎。
iTerm2 是一个在 GPL-2.0 协议下开源的 macOS 终端模拟器,具有出色的性能和极高的可玩性。
- 官方网站:[https://iterm2.com](https://iterm2.com)
- GitHub 地址:[https://github.com/gnachman/iTerm2](https://github.com/gnachman/iTerm2)
## 安装 iTerm2
这里推荐使用 Homebrew 安装。在终端(没错,在安装终端之前,你需要一个终端 🤣)中输入:
```bash
brew install iterm2
```
等着安装完成,在启动台打开就可以了。
理论上说,这个时候已经可以开始用了。但是,我建议继续看,进行一点美化。
## Oh-my-zsh 及其插件
[Oh-my-zsh](https://github.com/ohmyzsh/ohmyzsh) 是一个 Zsh 插件,能够为 Zsh 提供许多的加持。
### Zsh-syntax-highlighting
这是一个能给命令带来高亮的插件。这个相当有用,例如,在你输入一个命令时,如果命令是红色的,那么就说明你这个命令有问题了。
### Zsh-auto-suggestion
这个插件可以使用你的命令历史记录进行自动补全建议。不过这东西比 GitHub Copilot 之类的肯定差多了,因为只能用你的历史记录进行推断。
### 其他
包括 autojump 和 z 等。大家可以在[https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins)看一看。
### 配置
我能不写了不 qaq好长啊。可以参考项目的官方文档和网上的教程搜索 oh my zsh 教程即可。
## tmux
又是一个项目,简单来说就是增添多标签页功能。
依然使用 Homebrew
```bash
brew install tmux
```
## 状态栏
在设置-Appearance-Theme 中改为 MinimalStatus bar location 可以调整到自己喜欢的位置,我选择底部。
然后在设置-Profiles-(选择某一个)-Session 中,底部选择 status bar enabledconfig 一下自己喜欢的元素即可。
![](https://img.viento.cc/IMG-20240505203843.webp)
## 导入配色方案
[iTerm2 的配色方案](https://github.com/mbadolato/iTerm2-Color-Schemes)非常多,这里我选择 [Catppuccin](https://github.com/catppuccin/catppuccin)。
在[这里](https://github.com/catppuccin/iterm/tree/main/colors)下载一个 `.itermcolors` 格式的文件,然后在设置-Profiles-(选择某一个)-Colors-Color Presets-Import 导入并启用即可。
## 自定义字体
设置-Profiles-(选择某一个)-Text-Font 改变字体即可。由于我们后面可能涉及特殊符号,所以建议选择一个 Nerd font例如 Fira code Nerd font。缺点就是没办法设置中文字体不过终端也很少出现中文吧。
## 换图标
没错,换图标不仅是一种行为,更是一种习惯。
依然是在 [macosicons.com](https://macosicons.com/#/) 搜索图标。由于换图标是给自己看的,因此也不需要拘泥于 iTerm2 的图标,搜索 iTerm2、Terminal 等关键词都可以。我用的是这个:
![](https://img.viento.cc/IMG-20240505203620.webp)
原本是 `>_`,加上一半之后瞬间可爱了。
直接把图标下载下来,在应用程序中选中 iTerm2`⌘ + I` 显示简介,然后将新图标拖拽到左上角的应用程序名称旁边的图标上就好。
## 背景图片
![](https://img.viento.cc/IMG-20240505204053.webp)
在这里的 Background Image 处修改就好,建议选成 Scale to Fill。
## 安装 Starship
[Starship](https://starship.rs) 是一个用 Rust 写的终端(我感觉更应该称为终端插件),非常好看。
我们依然选择 Homebrew 进行安装:
```bash
brew install starship
```
安装好之后,打开 `.zshrc` ,在最后添加一行:
```txt
eval "$(starship init zsh)"
```
也不需要什么额外配置。如果想玩一玩,可以参考其官方文档。
## 最终效果
![](https://img.viento.cc/IMG-20240505202811.webp)
我个人还是挺满意的。实际上我用的不是这张背景图,为了防止侵权,临时换的。
以及image auto upload 真是好样的,我图全没了。
并且,我鼠须管坏了,更新不了。大乐。

View file

@ -0,0 +1,98 @@
---
title: 我把Vaultwarden主密码搞丢了
date: 2025-03-12
slug: i-locked-myself-out-of-vaultwarden
featuredImage:
categories:
- 逍遥游
tags:
- Vaultwarden
- 灾备
- 自托管
series:
summary: 小氯你这个笨蛋笨蛋笨蛋笨蛋笨蛋!
description: 本文介绍了作者在修改Vaultwarden邮箱地址时因操作不当导致无法访问密码库的经历。作者将主密码存放在Vaultwarden内部又没有备份结果因Vaultwarden的端到端加密特性而无法恢复约400个密码。文章同时记录了作者重新部署Vaultwarden的过程以及按重要性分为三级的密码恢复策略。作者通过自嘲幽默的方式分享了这次事件并在结尾强调了备份的重要性和"人"是系统最大安全漏洞的观点。
wikilinks:
---
各位老友,晚上好。这里是 Chlorine。
本期给大家分享一下,这只笨蛋 zako 元素娘干过的迄今为止最蠢的事情。当事元素娘觉得世界上不可能还有人比自己还蠢了。
![i-am-the-biggest-idiot|319](https://img.viento.cc/20250314-i-am-the-biggest-idiot.avif)
## 改邮箱引发的惨剧
事情是这样的。
Vaultwarden 这个东西呢,有一个「虚假」的邮箱选项。之所以说是「虚假」的,是因为如果你没有配置 SMTP这个邮箱就只起一个用户标识符功能。如果你想更改邮箱那么那个验证码随便写就可以了。
小氯最初托管的 Vaultwarden 邮箱是过去的域名邮箱,最近一直希望换成现在的域名邮箱。而在搜索到了上面的信息后,小氯兴冲冲地去改了邮箱,还颇有恶趣味地把验证码写成了 114514。
然后自然是被踢出登录了。重新登录……咦?我的扩展也退出登录了?
坏了。
容我解释一二:由于我比较贪图方便,我采取了一个很离奇的策略:**把主密码也存放在 Vaultwarden 内**。这大概相当于,我把钥匙落在了家里。
那么找找备用钥匙?很遗憾,由于小氯使用的主密码堪称社工学噩梦,所以小氯并没有做什么备份(~~难道这种情况不是更应该备份吗~~)。找了一圈之后宣告失败。
那么能否换把锁呢或者说通过管理员权限重置主密码。小氯没有找到这样的方法Vaultwarden 官方也表示这并不可行。
那么只剩暴力开锁一条路了。
很遗憾,这做不到。由于 Vaultwarden 的端到端加密,目前地球上还没有方法能够解开加密的数据库。虽然说理论上由于我把 Bitwarden 浏览器扩展的过期时间设置为了「从不」,因此应该在某个位置存放了一份解密的密钥,但是这显然已经远远超出了小氯的能力范围。
于是,小氯就这么栽在了一次手贱上。
## 清点损失
如果按照一个条目一个密码来算的话,根据 SQLite 内部的情况,小氯大概丢失了四百个密码。不过有一些密码是回收站里面的,因此实际数目应该比这个数小。
## Build From Scratch
下面自然是备份好之前的遗产,然后重新部署 Vaultwarden。
不过这里出现了一个问题:即使我已经明确把环境变量设置为允许注册,还是出现了无法注册的问题,清除缓存也不行,不知道这台虚拟机中了什么邪。
不过,反正就虚拟机那个连个 SSH 都没病走两步的情况,小氯已经抓狂了不知道多久了。于是,小氯把自己的 Vaultwarden 迁移到了 VPS 上。这样连接起来就比较顺畅了。小氯倒是不担心密码被 VPS 服务商访问,先不说这样的情况极少见,就算是能,他们也只能看到管理员 token 这样的数据最多也只是能删除我的账户而已。毕竟Vaultwarden 已经向小氯证明了E2EE实在是太、安、全、了、啊咬牙切齿
当然,这也只是适用于小氯当前的密级要求。如果再高一些的话,最好使用独立服务器,或者是自有设备。
## 恢复密码
下面的任务自然是把每一个网站的密码都改掉或者找回来。由于这次的受灾面实在是太大,小氯制定了如下策略:
### 第一级:关键服务和身份
这些网站和服务的密码最为关键,涉及到小氯的整个数字生活和数字身份的问题。比如说:
- 代码托管GitHub、Codeberg 等
- 基础服务Google、Microsoft、Apple 等
- 社交账户Bluesky、Fediverse 等
- 域名和 VPS 服务商Spaceship、RackNerd 等
总体而言恢复工作还算顺利。Apple 在恢复密码时电脑的 Apple Account 会卡住需要等一段时间才能恢复Owu Social G 需要联系管理员通知帮忙重置密码Spaceship 由于用的是之前的临时域名邮箱,同时小氯好似不似地把这个域名从 Cloudflare 删了导致接不到邮件,都去联系客服了,结果又能收到了,属实是抽象到家了。
此外,小氯还把几个比较实名的账号都注销掉了,改成了更加匿名化的账户,同时把服务转移到了新的账户名下。
此外,唯一没有受到任何影响的,是小氯的校园网 ID。因为为了当牢助教讲课的时候登录教室的设备联网小氯把密码成了一个自己能记住的字符串笑哭
### 第二级:次重要服务
这些服务比较重要,但是也没那么重要。比如说发邮件的 Resend、不再使用的阿里邮箱、学信网、各个服务器的面板之类的。
### 第三级:可抛弃服务和无维护服务
像 ChatGPT、Grok 之类的服务,小氯完全不在乎,反正也是隔一段时间注销了再注册一个。丢了就丢了吧。
还有一些服务比较难以恢复,但是平时也不太需要登录,或者叫所谓的无维护服务。比如说 Algolia 不能在开启 2FA 的情况下恢复密码(难以理解),但小氯的 Algolia Docsearch 其实不需要任何形式的维护,除非小氯再换域名;再比如网易,小氯保留网易邮箱基本上只是为了兼容性,只要应用密码不失效就可以一直鸽。
## 后续
后续?没后续了。说是丢了四百多个,其实恢复出来到现在,也就用了几十个而已。后面的遇到了再慢慢搞吧。
最后是当事元素娘的一点感想:
> 系统最大的漏洞永远是人的漏洞,世界上最有效的攻击永远是社工学攻击。
> Self Host 不备份,崩溃两行泪。