Posts for: #Tech

什么是贡献者许可协议(CLA)

最近我让 AI 给 Slax Reader 加了书签导入功能。代码提交成 PR 后,CLA Assistant 要求我先签一份协议,检查才会通过。我自己也签了一次,顺便弄清楚了 CLA 是什么。

CLA 的全称是 Contributor License Agreement,中文一般叫“贡献者许可协议”。它是代码贡献者和开源项目之间的一份协议,约定项目可以怎样使用贡献者提交的代码、文档和其他内容。

开源许可证规定别人可以怎样使用已经发布的项目。CLA 规定项目可以怎样使用别人提交进来的内容。

签 CLA 代表什么

具体权利要看协议文本。常见的 CLA 会要求贡献者确认几件事:

  • 这份代码是自己写的,或者自己有权提交。
  • 项目可以长期使用、修改和发布这份代码。
  • 与这份代码有关的部分专利,也一并授权给项目使用。
  • 如果代码受到雇主或第三方协议限制,需要提前说明。

贡献者一般仍然保留自己代码的版权,只是把一组明确的使用权授予项目。Apache 基金会对 CLA 的解释也是这样:贡献者保留原有权利,同时允许项目发布和继续开发这些贡献。

这份记录可以减少以后的争议。比如贡献者离职后,公司声称代码属于公司;或者项目几年后调整许可证,却发现没有权利处理早期贡献。CLA 会事先把这些问题写清楚。

有些 CLA 还允许项目把贡献放进采用其他许可证的产品,包括商业或闭源产品。这类权利适合双重许可的项目,也意味着贡献者给出的授权超过了普通开源许可证。

每次提 PR 都要签吗

使用 CLA Assistant 这类工具时,每个 PR 都会检查签署状态。贡献者签过当前版本后,后面的 PR 通常不用重复签。协议内容发生变化时,工具会要求重新签署。

这个步骤仍然会增加贡献门槛。修一个错字或改几行代码,也要先阅读一份法律文件。有些人看到这里就会放弃提交。

另一个轻量做法是 DCO。贡献者在每次提交里加一行 Signed-off-by,确认自己有权提交这份代码。DCO 主要确认代码来源,不额外授予项目广泛的再许可权。

Slax Reader 怎么用

Slax Reader 采用 Apache 2.0。它的第 5 条已经规定,提交给项目的贡献默认使用同一份许可证,除非双方另有协议。GitHub 服务条款也写了同样的规则。

Slax Reader 目前更需要降低参与门槛,让更多人愿意提交小改动。我的建议是先停用所有 PR 强制签 CLA 的规则。普通贡献使用 Apache 2.0 和 GitHub 的默认条款;如果想多留一份代码来源记录,可以使用 DCO。

[阅读全文]

从 Omarchy 截图,贴进远程 Mac 上的 herdr

问题

我的日常是:坐在 Linux(Omarchy)前面,ssh 到 Mac,在 Mac 上跑 herdr,里面开 Claude Code / Codex。

在 Linux 上截图,想贴给 agent 看,贴不过去。没有报错,没有 [Image #1],什么都没发生。

原因

SSH 只传文字。截图在 Linux 的剪贴板里,Mac 根本看不到。

ssh mac 之后再运行 herdr,herdr 整个跑在 Mac 上。它读的是 Mac 的剪贴板,不是我面前这台机器的。

这不是 Omarchy 的问题,也不是 herdr 的 bug。是架构决定的。

解法:反过来跑

在 Linux 上也装一个 herdr,用它作为客户端去连 Mac:

herdr --remote username@host

这样 herdr 客户端在 Linux 上运行,UI 从 Mac 那边流过来。剪贴板在本地,所以图片可以桥接过去:按 Ctrl+V,herdr 把 PNG 通过 SSH 传到 Mac,再把 Mac 上的文件路径贴进 agent 的输入框。agent 读路径就行。

谁跑在哪

这样做以后 herdr 两边都有,但分工不一样:

[阅读全文]

Omarchy 触摸板滚动加速

在 ThinkPad 上跑 Omarchy,触摸板滚动一直比 Mac 慢而平:手指快慢不同,页面走的距离都差不多。今天让 AI 查了一下,原因和改法都很短。

原因

Hyprland 把触摸板交给 libinput 处理。libinput 默认只给鼠标指针做加速,双指滚动是线性的,手指走多少页面走多少。Omarchy 在这之上还乘了一个 0.4 的系数(input.touchpad.scroll_factor),所以整体又慢了一截。Mac 的手感来自两样东西:一条按手速变化的加速曲线,加上抬手后的惯性滑动。

改法

libinput 有一个“custom”配置,可以给滚动单独画一条曲线。Hyprland 通过 accel_profilescroll_points 两个选项把它暴露出来,Omarchy 的 Lua 配置里用 hl.device 可以只对触摸板生效,不影响小红点和外接鼠标。

~/.config/hypr/input.lua 末尾加了这一段:

hl.device({
  name = "elan06b6:00-04f3:335a-touchpad",
  accel_profile = "custom 0.5 0 0.5 1.05 1.7 2.5 3.4 4.4 5.5",
  scroll_points = "0.5 0 0.4 0.9 1.5 2.3 3.3 4.5 6.0 7.8 10",
})

两行曲线的格式一样:第一个数是步长,后面是各个采样点的输出值。横轴是手指速度,纵轴是页面速度。慢慢滑的时候接近一比一,甩得快的时候往上翘。

设备名用 hyprctl devices 查。保存后 Hyprland 自动重载,hyprctl configerrors 为空就是生效了。

两个注意点

  • 换成 custom 之后,触摸板的指针加速也一起换掉了,所以 accel_profile 后面必须同时给一条指针曲线,不然指针会变成没有加速。
  • 曲线上的数字是起点,要靠手感调。想让快甩更猛就调大 scroll_points 后面几个数;想让慢滑更细就调小前面几个。整体都嫌慢的话,第二个旋钮是 Omarchy 默认的 scroll_factor = 0.4,改到 0.6 试试。

惯性滑动改不了。那是每个应用自己决定的,GTK 应用和 Chromium 有,其他不一定有,合成器这层没有开关。

[阅读全文]

我理解的 Omarchy

今天下决心,把日常工作的电脑从 Mac 切换到了 Linux。

想这么做其实已经有些日子了,手边也有几台设备分别装着 Debian(喜欢了很多年)、NixOS(去年接触到之后,非常喜欢这个发行版的理念),但始终觉得还是有些许不方便。这次的“临门一脚”,是 Omarchy 推动的。

我大概半年多前第一次用 Omarchy,那时觉得这个发行版带着作者 DHH 非常强烈的观点——他喜欢的软件、习惯的配置,而我也有些偏执的喜好,于是只是浅尝辄止。

我也想了想,为什么最近两周 Omarchy 会在 X 上爆火,我觉得的几个原因有:

  • DHH 的个人魅力——他有着极强的感染力,而且几十年持续创造输出,Ruby on Rails、Basecamp、Hey 等作品背后都是他。在 Omarchy 发布后,他极高强度地开发、宣传。最近更是组建了基金会,十几天时间里,募集了超过 1300 万美金——包括我在 Caoz 群里认识了几十年的 xdanger 也捐了 100 万美金。
  • Omarchy 的尝试成本很低——找一台旧笔记本电脑,插上启动 U 盘,几分钟时间就能装好,所有东西都按照 DHH 的品味,所谓“大厨精选”帮你装好了,可以快速开箱即用——这里其实解决了 Linux 桌面一直以来的大问题:选择过多导致普通用户无从下手。
  • AI first 的操作系统这样的说法,现阶段还是挺占便宜的,很多用户好奇心起就会试试。而且确实,AI 时代,每个人应该都能有一台真正顺手的,适合自己的电脑,这时的 AI first 很合理。
  • AI 极大降低了开发、支持、使用、改进的成本。例如:内置了 Omarchy Skill,你可以通过问 AI 直接得到如何修改配置等问题的准确做法。例如:当系统里有软件出错时,调用分析 skill,直接分析日志和代码,最后提交 PR 给开发者——挺好的闭环,也极大鼓励了用户的参与。
  • 很好的插件机制,用户几句话就能做出自己需要的小插件,成就感很强,容易激发参与感和传播。
  • 审美在线。很漂亮的系统,截图在社交媒体被广泛传播。

而且,据说后续 Omarchy 会改用 nix 来做包管理——那就真是我心目中完美的桌面系统了——我本来昨天想让 AI 往这个方向做的,听说之后,停下了任务,省 token 了。

Quickshell 是什么

Linux 上做桌面部件的工具箱,官网 quickshell.org。状态栏、通知弹窗、锁屏、音量面板、壁纸切换器,这些东西用它来写。

它解决什么

上一篇讲 Hyprland 时提过,那种窗口管理器只管窗口怎么摆,状态栏、通知、锁屏都要另外找程序拼。常见的拼法是 Waybar 加 mako 加 hyprlock,各是各的程序,各有各的配置格式,样式对不齐,之间也不通消息。

Quickshell 换一个思路:这些部件全都自己写,用同一种语言,跑在同一个进程里。状态栏上的音量图标和按音量键弹出的那个提示,可以共用一份状态。

用什么写

QML,Qt 的界面语言。长这样:

import Quickshell
import QtQuick

PanelWindow {
  anchors {
    top: true
    left: true
    right: true
  }
  implicitHeight: 30
  Text {
    anchors.centerIn: parent
    text: "hello world"
  }
}

这段就是屏幕顶部一条 30 像素高的栏,中间写着一行字。anchors 指定贴哪几条边,贴住之后 Quickshell 会自动向窗口管理器申请这块空间,其他窗口不会被它盖住。

QML 是声明式的:你写界面长什么样、数据变了界面怎么跟着变,不用自己写"收到消息 → 找到那个控件 → 改它的文字"这种流程。

存盘就生效

配置放在 ~/.config/quickshell/,每个子目录里有一个 shell.qml 就算一套配置。跑起来之后编辑文件,存盘界面立刻变,不用重启。改一个像素挪一下位置,改完扭头就能看见。

自带的接口

写桌面部件要拿系统数据。Quickshell 内置了这些:

  • PipeWire:音量、当前播放设备
  • MPRIS:正在放什么歌,暂停下一首
  • 系统托盘:那些图标
  • PAM:验证密码,锁屏要用
  • 蓝牙
  • Hyprland 和 i3/Sway:当前工作区、窗口标题这类窗口管理器内部状态

官方只内置了 Hyprland 和 i3 两家的接口。用别的窗口管理器,得自己通过 socket 或者调命令去拿。

代价

  • 得会写代码。Waybar 改个配置文件就能用,Quickshell 是让你自己写一个状态栏出来
  • 从空白开始。它是工具箱不是成品,装完什么都没有
  • API 还在变。官方明说后续版本会有破坏性改动,升级时要照迁移指南改配置

现状

LGPL 3 开源,主力开发者 outfoxxed。源码在 GitHub,文档在 quickshell.org/docs。Wayland 和 X11 都支持。

[阅读全文]