﻿[Script Info]
; Script generated by Aegisub 3.2.2
; http://www.aegisub.org/
Title: Default Aegisub file
ScriptType: v4.00+
WrapStyle: 0
ScaledBorderAndShadow: yes
YCbCr Matrix: TV.601
PlayResX: 1280
PlayResY: 720

[Aegisub Project Garbage]
Last Style Storage: Default
Audio File: ../Videos/lp2023-saturn-saturday-1555.webm
Video File: ../Videos/lp2023-saturn-saturday-1555.webm
Video AR Mode: 4
Video AR Value: 1.777778
Video Zoom Percent: 0.500000
Scroll Position: 293
Active Line: 306
Video Position: 87873

[V4+ Styles]
Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding
Style: Default,Noto Sans CJK SC,72,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1
Style: Attribution,Noto Sans CJK SC,48,&H0000C5DD,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,7,10,10,10,1
Style: Q&A,Noto Sans CJK SC,50,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,3,1,0,7,10,60,10,1

[Events]
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Dialogue: 0,0:00:00.00,0:00:09.29,Attribution,,0,0,0,,讲者: Anthony Wang\N译者: Hayden\N许可证: CC BY-SA 4.0
Dialogue: 0,0:00:00.82,0:00:05.52,Default,,0,0,0,,大家好 今天我来谈一谈"联邦"式的软件 forge
Dialogue: 0,0:00:05.52,0:00:11.32,Default,,0,0,0,,首先 我会讲解 forge 是什么
Dialogue: 0,0:00:11.32,0:00:13.68,Default,,0,0,0,,然后再讲"联邦" (federation) 是什么
Dialogue: 0,0:00:13.68,0:00:20.16,Default,,0,0,0,,forge 就是用来进行代码托管以及协作的网站
Dialogue: 0,0:00:20.16,0:00:24.96,Default,,0,0,0,,比如说 GitHub 就是个好例子 它就是一个 forge
Dialogue: 0,0:00:24.96,0:00:32.02,Default,,0,0,0,,它是个专有的中心化 forge\N但也常常拿来托管自由软件项目
Dialogue: 0,0:00:32.02,0:00:37.45,Default,,0,0,0,,现在大约 95% 以上的自由软件都托管在了 GitHub
Dialogue: 0,0:00:37.45,0:00:43.08,Default,,0,0,0,,当然 也有许多替代品\N比如说 GitLab, Gitea, Forgejo 等等
Dialogue: 0,0:00:43.08,0:00:50.42,Default,,0,0,0,,刚刚说的所有这些 都是 forge 软件
Dialogue: 0,0:00:50.42,0:00:57.32,Default,,0,0,0,,它们本身不是网站 而是可以下载的服务器软件
Dialogue: 0,0:00:57.32,0:01:03.05,Default,,0,0,0,,把它装上服务器运行 你就有了一个 forge 网站
Dialogue: 0,0:01:03.05,0:01:09.97,Default,,0,0,0,,当然 并非人人都想自己运行 forge 服务器
Dialogue: 0,0:01:09.97,0:01:17.22,Default,,0,0,0,,所以就有了许多网站\N比如 Codeberg, Framagit, 以及 KDE 的 GitLab 实例
Dialogue: 0,0:01:17.22,0:01:23.85,Default,,0,0,0,,这些 forge 和 forge 平台有很多
Dialogue: 0,0:01:23.85,0:01:31.95,Default,,0,0,0,,有的是自由软件 比如 Gitea 和 Forgejo\N有的则是 GitHub
Dialogue: 0,0:01:31.95,0:01:35.85,Default,,0,0,0,,目前的情况是 它们都成了孤岛
Dialogue: 0,0:01:35.85,0:01:44.92,Default,,0,0,0,,如果我 Forgejo 实例上有个项目,\N而别人 GitLab 实例上有个项目
Dialogue: 0,0:01:44.92,0:01:49.97,Default,,0,0,0,,于是 如果我要向别人的项目提交贡献
Dialogue: 0,0:01:49.97,0:01:54.85,Default,,0,0,0,,那我就得在别人的实例上创一个号 走一遍流程
Dialogue: 0,0:01:54.85,0:02:00.07,Default,,0,0,0,,然后才能在他们的 forge 上提交贡献
Dialogue: 0,0:02:00.07,0:02:09.60,Default,,0,0,0,,所以 目前任何这些 forge 之间都没有互通
Dialogue: 0,0:02:09.60,0:02:17.30,Default,,0,0,0,,我也简单说一下为什么用 forge
Dialogue: 0,0:02:17.30,0:02:30.32,Default,,0,0,0,,forge 好处有很多 比如使用简单\N工作流基于邮件 访问更加方便等
Dialogue: 0,0:02:30.32,0:02:39.37,Default,,0,0,0,,你应该也知道 Git 本身已经是去中心化的了
Dialogue: 0,0:02:39.37,0:02:48.27,Default,,0,0,0,,但是 Git 只是为了一个目的专门设计的:\N那就是充当追踪代码和文件的工具
Dialogue: 0,0:02:48.27,0:02:51.35,Default,,0,0,0,,Git 在那方面做得很好
Dialogue: 0,0:02:51.35,0:03:02.92,Default,,0,0,0,,但它本身不能用来追踪 bug, 提交 PR, 管理 projects 等
Dialogue: 0,0:03:02.92,0:03:11.12,Default,,0,0,0,,比如说 Git 原本开发出来 是为了管理 Linux 内核的源代码
Dialogue: 0,0:03:11.12,0:03:17.47,Default,,0,0,0,,而内核开发者还开了邮件列表用来接收补丁
Dialogue: 0,0:03:17.47,0:03:21.00,Default,,0,0,0,,他们还有 bug 追踪器等工具
Dialogue: 0,0:03:21.00,0:03:29.15,Default,,0,0,0,,所以 单独用 Git 不足以来开发软件
Dialogue: 0,0:03:29.15,0:03:36.57,Default,,0,0,0,,还需要其他工具来实现 bug 追踪 管理补丁 PR 等
Dialogue: 0,0:03:36.57,0:03:41.32,Default,,0,0,0,,而 forge 就提供了这些功能
Dialogue: 0,0:03:41.32,0:03:49.22,Default,,0,0,0,,最后还要提一下 SourceHut 这个 forge 越来越流行了
Dialogue: 0,0:03:49.22,0:03:55.70,Default,,0,0,0,,它也确实在试图处理这个孤岛问题
Dialogue: 0,0:03:55.70,0:04:04.07,Default,,0,0,0,,于是便允许人们通过 SMTP 协议发邮件\N来与 SourceHut 上的项目交互
Dialogue: 0,0:04:04.07,0:04:07.82,Default,,0,0,0,,那种方法也有问题 我之后会解释
Dialogue: 0,0:04:11.82,0:04:17.45,Default,,0,0,0,,这个幻灯片的标题可能有点误导...
Dialogue: 0,0:04:17.45,0:04:24.00,Default,,0,0,0,,如果你想和别人分享你的仓库或者代码项目
Dialogue: 0,0:04:24.00,0:04:27.65,Default,,0,0,0,,那你就要通过...
Dialogue: 0,0:04:27.65,0:04:36.45,Default,,0,0,0,,即使 Git 本身是分布式的源代码管理系统
Dialogue: 0,0:04:36.45,0:04:45.12,Default,,0,0,0,,它并不能提供访问权管理能力 你也不能拿它来分享仓库
Dialogue: 0,0:04:45.12,0:04:51.50,Default,,0,0,0,,你要把它放在一个公开的服务器或者网站
Dialogue: 0,0:04:51.50,0:04:56.10,Default,,0,0,0,,其他人才能 clone 你的仓库
Dialogue: 0,0:04:56.10,0:05:04.70,Default,,0,0,0,,而这里列出的项目能做的 就是托管你的 Git 仓库
Dialogue: 0,0:05:04.70,0:05:09.10,Default,,0,0,0,,但和一般的网站不一样 而是基于 P2P 网络之类的
Dialogue: 0,0:05:09.10,0:05:14.10,Default,,0,0,0,,这些项目很有意思 但不是今天谈论的主题
Dialogue: 0,0:05:14.10,0:05:22.42,Default,,0,0,0,,因为它们更多是让你能够用 P2P 的方式来托管 Git 仓库
Dialogue: 0,0:05:22.42,0:05:29.27,Default,,0,0,0,,但并没有 bug 追踪或者 PR 功能 所以它们不是 forge
Dialogue: 0,0:05:31.27,0:05:38.32,Default,,0,0,0,,接下来讲一讲 目前的情况下有什么问题
Dialogue: 0,0:05:38.32,0:05:45.12,Default,,0,0,0,,你可能听过几年前 GitHub 的公告
Dialogue: 0,0:05:45.12,0:05:54.92,Default,,0,0,0,,为了遵守美国法律\NGitHub 决定禁止伊朗等国家的开发者的访问
Dialogue: 0,0:05:54.92,0:06:03.05,Default,,0,0,0,,当然 它作为一个专有平台 还有其他许多问题
Dialogue: 0,0:06:03.05,0:06:14.62,Default,,0,0,0,,其他就不谈论了\N你可以自己上网搜索 了解为什么 GitHub 不好
Dialogue: 0,0:06:14.62,0:06:18.20,Default,,0,0,0,,今天来谈点更加有趣的
Dialogue: 0,0:06:23.82,0:06:30.27,Default,,0,0,0,,想想自由软件的开发是怎样进行的
Dialogue: 0,0:06:30.27,0:06:34.92,Default,,0,0,0,,这是全球化的大规模开发过程
Dialogue: 0,0:06:34.92,0:06:39.17,Default,,0,0,0,,全球各地的人都在为这些项目做贡献
Dialogue: 0,0:06:39.17,0:06:42.87,Default,,0,0,0,,这个过程是十分去中心化的
Dialogue: 0,0:06:44.87,0:06:53.47,Default,,0,0,0,,这时 没道理强迫大家用一个中心化的平台
Dialogue: 0,0:06:53.47,0:06:59.62,Default,,0,0,0,,相反 我们想给大家更多选择 避免限制在单一服务商
Dialogue: 0,0:06:59.62,0:07:03.92,Default,,0,0,0,,允许大家用自己想用的 forge
Dialogue: 0,0:07:03.92,0:07:08.75,Default,,0,0,0,,而这些 forge 将能够相互通讯
Dialogue: 0,0:07:08.75,0:07:14.02,Default,,0,0,0,,这样我们就能形成一个\N全球的去中心化网络来托管代码
Dialogue: 0,0:07:16.02,0:07:21.15,Default,,0,0,0,,要实现这一目标 就需要 "联邦"(federation)
Dialogue: 0,0:07:21.15,0:07:26.67,Default,,0,0,0,,也就是不同服务器之间的通讯
Dialogue: 0,0:07:28.67,0:07:34.22,Default,,0,0,0,,最近你应该听过 Mastodon
Dialogue: 0,0:07:34.22,0:07:44.35,Default,,0,0,0,,它就是一个用 ActivityPub 协议\N实现去中心化的社交媒体/微博平台
Dialogue: 0,0:07:44.35,0:07:51.42,Default,,0,0,0,,ActivityPub 是一个非常通用的协议 它基于参与者 (actor) 模型这种理论概念构建
Dialogue: 0,0:07:51.42,0:07:59.12,Default,,0,0,0,,这种模型 由许多的 actor 组成\N它们可以是人或者机器人之类的
Dialogue: 0,0:07:59.12,0:08:08.17,Default,,0,0,0,,所有这些人都可以相互发送信息\N有收件箱和发件箱 就像邮箱一样
Dialogue: 0,0:08:08.17,0:08:13.92,Default,,0,0,0,,ActivityPub 提供了一些指南
Dialogue: 0,0:08:13.92,0:08:24.82,Default,,0,0,0,,说明了 actor 之间发送什么特定消息\N以及 actor 要如何处理这些消息和转发消息等
Dialogue: 0,0:08:24.82,0:08:28.90,Default,,0,0,0,,但总之 这个协议是十分通用的
Dialogue: 0,0:08:28.90,0:08:33.72,Default,,0,0,0,,它设计出来 非常灵活和通用
Dialogue: 0,0:08:33.72,0:08:40.60,Default,,0,0,0,,所以 你用它并不足以构建一个应用程序
Dialogue: 0,0:08:40.60,0:08:42.55,Default,,0,0,0,,你还要自己填补很多东西
Dialogue: 0,0:08:42.55,0:08:48.37,Default,,0,0,0,,比如说 Mastodon 有很多 ActivityPub 扩展
Dialogue: 0,0:08:48.37,0:08:59.27,Default,,0,0,0,,在 ActivityPub 之上进行了很多开发\N才实现了一个微博应用
Dialogue: 0,0:08:59.27,0:09:03.07,Default,,0,0,0,,所以 ActivityPub 是十分通用的
Dialogue: 0,0:09:03.07,0:09:10.22,Default,,0,0,0,,需要做很多工作才能实现有用的东西
Dialogue: 0,0:09:10.22,0:09:15.97,Default,,0,0,0,,而我们开发了一个叫 ForgeFed 的项目
Dialogue: 0,0:09:15.97,0:09:19.97,Default,,0,0,0,,它是一个 ActivityPub 协议的扩展
Dialogue: 0,0:09:19.97,0:09:24.50,Default,,0,0,0,,它由两大部分组成
Dialogue: 0,0:09:24.50,0:09:28.55,Default,,0,0,0,,我给你们看看...
Dialogue: 0,0:09:28.55,0:09:35.65,Default,,0,0,0,,有两个部分: vocabulary 和 behavior
Dialogue: 0,0:09:35.65,0:09:39.75,Default,,0,0,0,,这个网站上有 modeling vocabulary\N但它们是十分相似的
Dialogue: 0,0:09:39.75,0:09:43.15,Default,,0,0,0,,vocabulary 就像...
Dialogue: 0,0:09:49.62,0:09:58.45,Default,,0,0,0,,比如说这里有一个仓库
Dialogue: 0,0:09:58.45,0:10:03.92,Default,,0,0,0,,我们想让这种通用的数据格式来代表各种 forge 的数据
Dialogue: 0,0:10:03.92,0:10:08.75,Default,,0,0,0,,比如说仓库, issues, 补丁等
Dialogue: 0,0:10:08.75,0:10:13.85,Default,,0,0,0,,如果不同的  forge 都实现 ForgeFed
Dialogue: 0,0:10:13.85,0:10:23.85,Default,,0,0,0,,那我们就需要他们发送的数据 都遵循这种数据格式
Dialogue: 0,0:10:23.85,0:10:27.27,Default,,0,0,0,,比如说 对仓库而言 就有特定的表达方式
Dialogue: 0,0:10:27.27,0:10:33.20,Default,,0,0,0,,它是基于一种标准的 有很多例子可以参考
Dialogue: 0,0:10:38.42,0:10:45.75,Default,,0,0,0,,behavior 的话\N就像我们互发了消息 得到了这种通用消息格式
Dialogue: 0,0:10:45.75,0:10:51.95,Default,,0,0,0,,比如说我的 forge 收到了补丁或者 PR 消息
Dialogue: 0,0:10:51.95,0:10:56.92,Default,,0,0,0,,那我的 forge 该干些什么\N以及它应该产生什么连带效果
Dialogue: 0,0:10:56.92,0:11:01.27,Default,,0,0,0,,这就是这个协议的 behavior 部分规定的
Dialogue: 0,0:11:01.27,0:11:11.27,Default,,0,0,0,,而我们之所以需要这个协议\N是因为 ActivityPub 协议过于通用
Dialogue: 0,0:11:11.27,0:11:14.10,Default,,0,0,0,,我们得规定这些扩展
Dialogue: 0,0:11:14.10,0:11:24.60,Default,,0,0,0,,这样的话 forge 联邦的各种实现\N才能相互兼容 相互操作
Dialogue: 0,0:11:24.60,0:11:32.60,Default,,0,0,0,,我还得说说用 SMTP 实现联邦的一些问题
Dialogue: 0,0:11:32.60,0:11:40.00,Default,,0,0,0,,因为这个协议也广泛用来实现联邦
Dialogue: 0,0:11:40.00,0:11:44.55,Default,,0,0,0,,SMTP 有这几大问题
Dialogue: 0,0:11:44.55,0:11:59.55,Default,,0,0,0,,一是 SMTP 邮件受到了几家大公司的独占\N比如说 Gmail 和 Microsoft Outlook 等
Dialogue: 0,0:11:59.55,0:12:11.77,Default,,0,0,0,,这是一种寡头垄断 或者说掌控邮件的只有几家公司
Dialogue: 0,0:12:11.77,0:12:16.22,Default,,0,0,0,,而且 自托管邮箱也不容易
Dialogue: 0,0:12:16.22,0:12:27.60,Default,,0,0,0,,我没法在家里的电脑上建一个邮箱服务器\N然后用就它来收发邮件
Dialogue: 0,0:12:27.60,0:12:35.77,Default,,0,0,0,,因为邮件一直以来都面临 spam 问题
Dialogue: 0,0:12:35.77,0:12:47.05,Default,,0,0,0,,许多大型的邮箱服务提供商\N采取了排斥性极强的反 spam 政策
Dialogue: 0,0:12:47.05,0:12:58.97,Default,,0,0,0,,这导致根本不可能在家里搭建邮箱服务器
Dialogue: 0,0:13:04.15,0:13:11.15,Default,,0,0,0,,而 ForgeFed 实现了服务器之间的透明协作
Dialogue: 0,0:13:11.15,0:13:15.25,Default,,0,0,0,,即使这些服务器运行了不同的 forge 软件
Dialogue: 0,0:13:15.25,0:13:25.97,Default,,0,0,0,,我们要实现的目标就是\N如果你要贡献到一个其他网站其他 forge 上的项目
Dialogue: 0,0:13:25.97,0:13:32.72,Default,,0,0,0,,你就应该感觉像在本地 forge 上贡献一样
Dialogue: 0,0:13:32.72,0:13:37.15,Default,,0,0,0,,这里我也有一个小 demo
Dialogue: 0,0:13:37.15,0:13:46.72,Default,,0,0,0,,你可以提 issue, project\N开 PR 或者发送补丁
Dialogue: 0,0:13:46.72,0:14:01.05,Default,,0,0,0,,你可以给 issue 等发评论\N和不同 forge 上的人创建组织或团队
Dialogue: 0,0:14:01.05,0:14:08.30,Default,,0,0,0,,这些都是可能需要的功能
Dialogue: 0,0:14:08.30,0:14:12.85,Default,,0,0,0,,而最后两点就更加有意思了
Dialogue: 0,0:14:12.85,0:14:21.95,Default,,0,0,0,,值得一提的是 Mastodon 并没有跨站搜索功能
Dialogue: 0,0:14:21.95,0:14:33.42,Default,,0,0,0,,Mastodon 早期设计就是这样的\N你不能在你的实例上搜索 然后获得跨站搜索结果
Dialogue: 0,0:14:33.42,0:14:47.30,Default,,0,0,0,,最近有许多人尝试为\NMastodon / 微博平台 / Fediverse 开发跨站搜索
Dialogue: 0,0:14:47.30,0:14:52.17,Default,,0,0,0,,但遭到了人们的反对
Dialogue: 0,0:14:52.17,0:15:02.62,Default,,0,0,0,,因为许多这些全局搜索项目\N都无差异地将无数帖子收录了进去
Dialogue: 0,0:15:02.62,0:15:08.32,Default,,0,0,0,,它们并没有筛选 所以很多人都不满意
Dialogue: 0,0:15:08.32,0:15:17.80,Default,,0,0,0,,我们有一个简单的项目 叫 StarChart
Dialogue: 0,0:15:22.06,0:15:28.45,Default,,0,0,0,,不过我们最近没在开发这个项目\N因为我们想先把前三项弄好
Dialogue: 0,0:15:28.45,0:15:35.06,Default,,0,0,0,,但是最终我们会开发出一个选择性加入的全局搜索
Dialogue: 0,0:15:35.06,0:15:45.23,Default,,0,0,0,,因为 如果你问许多自由软件开发者\N即使 GitHub 是专有的 为什么还要用它
Dialogue: 0,0:15:45.23,0:15:55.96,Default,,0,0,0,,他们常常会说 因为每个人都在用它\N我把我项目放上去 其他人就会发现它
Dialogue: 0,0:15:55.96,0:16:00.56,Default,,0,0,0,,毕竟 GitHub 有这种全局搜索功能
Dialogue: 0,0:16:00.56,0:16:13.23,Default,,0,0,0,,你可以输入搜索词 然后它就会返回许多项目 十分有用
Dialogue: 0,0:16:13.23,0:16:23.40,Default,,0,0,0,,人们就会想\N如果转用这些联邦的 forge 就会错过这样的机会
Dialogue: 0,0:16:23.40,0:16:28.50,Default,,0,0,0,,但有了跨站搜索 我们应该就能提供这样的机会
Dialogue: 0,0:16:28.50,0:16:41.66,Default,,0,0,0,,最后 我们想实现的是 能够尽可能简单地\N把帐号和仓库等 从一个服务器无缝迁移到另一个
Dialogue: 0,0:16:41.66,0:16:52.26,Default,,0,0,0,,因为可能有很多原因让你想迁移
Dialogue: 0,0:16:55.33,0:17:01.10,Default,,0,0,0,,可能你现处的  forge 服务器改动了政策 你不喜欢了
Dialogue: 0,0:17:01.10,0:17:04.60,Default,,0,0,0,,可能是服务器有资金问题
Dialogue: 0,0:17:04.60,0:17:10.30,Default,,0,0,0,,可能他们不想你的身份和这个 forge 有关联
Dialogue: 0,0:17:10.30,0:17:17.70,Default,,0,0,0,,或者可能他们硬件出了问题 服务器不稳定 要关闭了
Dialogue: 0,0:17:20.76,0:17:40.40,Default,,0,0,0,,而 ForgeFed 的一个目的 就是扩展 ActivityPub\N让你能够轻松将项目迁移到其他服务器
Dialogue: 0,0:17:43.65,0:17:48.02,Default,,0,0,0,,这仅仅是个开始
Dialogue: 0,0:17:48.02,0:17:55.31,Default,,0,0,0,,我们还有更远大的理想 就是从此发展一整个生态
Dialogue: 0,0:17:55.31,0:18:01.74,Default,,0,0,0,,大家经常用 GitHub 还有另一个原因
Dialogue: 0,0:18:01.74,0:18:13.51,Default,,0,0,0,,那就是 GitHub 拥有巨大的生态\N所有网站, app, 工具都与 GitHub 兼容并集成
Dialogue: 0,0:18:13.51,0:18:20.68,Default,,0,0,0,,比如说 如果你想用 GitHub 的 CI 或构建系统
Dialogue: 0,0:18:20.68,0:18:32.14,Default,,0,0,0,,大家已经写了数千个插件\N让你能够更轻松地用他们的 CI
Dialogue: 0,0:18:32.14,0:18:42.31,Default,,0,0,0,,而且许多网站都有 GitHub 集成\N比如从 GitHub 导入
Dialogue: 0,0:18:42.31,0:18:52.42,Default,,0,0,0,,也有一些东西 制作出来只能与 GitHub 及其 API 兼容
Dialogue: 0,0:18:52.42,0:19:00.71,Default,,0,0,0,,所以他们给自己围上了高墙\N多亏了这些只兼容 GitHub 生态的应用
Dialogue: 0,0:19:00.71,0:19:07.51,Default,,0,0,0,,我们相信 有了 ForgeFed\N我们可以做出类似的替代品 但是做得更好
Dialogue: 0,0:19:11.91,0:19:15.40,Default,,0,0,0,,由于我们有 ForgeFed 这个开放的协议
Dialogue: 0,0:19:15.40,0:19:24.20,Default,,0,0,0,,任何人或者任何代码协作工具或网站\N都可以读 ForgeFed 的 spec, 然后实现它
Dialogue: 0,0:19:24.20,0:19:31.97,Default,,0,0,0,,接着他们的网站或者工具也能添加 ForgeFed 支持
Dialogue: 0,0:19:31.97,0:19:39.74,Default,,0,0,0,,由于他们的工具使用了\N这个可以相互操作的 ForgeFed 协议
Dialogue: 0,0:19:39.74,0:19:47.51,Default,,0,0,0,,就不会像 GitHub 一样\N你只能受限于那一个 API 下的 forge
Dialogue: 0,0:19:47.51,0:19:54.02,Default,,0,0,0,,在未来 我们会有很多不同的 forge\N很多不同的工具 它们都在 ForgeFed 之上
Dialogue: 0,0:19:54.02,0:20:00.34,Default,,0,0,0,,它们都有这种通用的数据格式和协议
Dialogue: 0,0:20:00.34,0:20:06.28,Default,,0,0,0,,所以他们都能够互相通讯和操作
Dialogue: 0,0:20:06.28,0:20:10.71,Default,,0,0,0,,这就是我们总的图景
Dialogue: 0,0:20:13.25,0:20:21.71,Default,,0,0,0,,我想现在可以讲一讲实现
Dialogue: 0,0:20:21.71,0:20:26.77,Default,,0,0,0,,目前 我们在做 ForgeFed 的两个实现
Dialogue: 0,0:20:26.77,0:20:33.62,Default,,0,0,0,,有一个实现是 Vervis 但并不是适合普通用户使用的
Dialogue: 0,0:20:33.62,0:20:41.80,Default,,0,0,0,,它更多是 ForgeFed 开发者测试和实验用的
Dialogue: 0,0:20:41.80,0:20:53.17,Default,,0,0,0,,不过 我们还有第二个实现\N就是一个叫 Forgejo 的 forge 软件
Dialogue: 0,0:20:53.17,0:20:56.71,Default,,0,0,0,,这背后的故事可能有点复杂
Dialogue: 0,0:20:56.71,0:21:03.25,Default,,0,0,0,,原本我们是要在 Gitea 实现的 它是一个很流行的自托管式自由软件 forge
Dialogue: 0,0:21:03.25,0:21:10.17,Default,,0,0,0,,但不幸的是 Gitea 被一家盈利性公司收购了
Dialogue: 0,0:21:10.17,0:21:12.82,Default,,0,0,0,,接着一切都乱了套
Dialogue: 0,0:21:12.82,0:21:22.08,Default,,0,0,0,,最后 许多人就一起开了个新的分支 叫 Forgejo
Dialogue: 0,0:21:22.08,0:21:28.02,Default,,0,0,0,,许多... 应该是所有联邦化开发者都去了 Forgejo
Dialogue: 0,0:21:28.02,0:21:37.25,Default,,0,0,0,,要做的事也很多 实现这个有 100 多项任务
Dialogue: 0,0:21:37.25,0:21:44.45,Default,,0,0,0,,任务很重 要在架构上做出很多改变
Dialogue: 0,0:21:50.14,0:21:54.94,Default,,0,0,0,,现在我建立了两个 Forgejo 实例
Dialogue: 0,0:21:54.94,0:22:00.17,Default,,0,0,0,,这里有一个 还有第二个
Dialogue: 0,0:22:03.74,0:22:05.88,Default,,0,0,0,,第二个实例有一个仓库
Dialogue: 0,0:22:05.88,0:22:12.80,Default,,0,0,0,,这两个很容易区分 这个是亮色的 另一个是暗色的
Dialogue: 0,0:22:12.80,0:22:15.68,Default,,0,0,0,,这里有一个 那里也有一个
Dialogue: 0,0:22:15.68,0:22:19.45,Default,,0,0,0,,这个亮色的有一个仓库
Dialogue: 0,0:22:19.45,0:22:30.25,Default,,0,0,0,,而我想做的就是\N在这个实例 向另一个实例的仓库提交贡献
Dialogue: 0,0:22:30.25,0:22:34.00,Default,,0,0,0,,我们会让两个 forge 互相通讯
Dialogue: 0,0:22:34.00,0:22:36.85,Default,,0,0,0,,先在这里登录
Dialogue: 0,0:22:43.51,0:22:51.28,Default,,0,0,0,,这个 forge 是完全空白的 我建起来当 demo 的
Dialogue: 0,0:22:54.25,0:23:01.46,Default,,0,0,0,,目前这个联邦功能还没有 UI\N因为我们想先把后端写好
Dialogue: 0,0:23:01.46,0:23:06.71,Default,,0,0,0,,不然没有后端 联邦也不能用
Dialogue: 0,0:23:10.88,0:23:17.82,Default,,0,0,0,,它最终的工作方式就是\N把要贡献或搜索的项目地址复制一下
Dialogue: 0,0:23:17.82,0:23:21.68,Default,,0,0,0,,这里会有一个输入框 用于全局搜索
Dialogue: 0,0:23:21.68,0:23:26.44,Default,,0,0,0,,位置就在这里 但是还没实现
Dialogue: 0,0:23:26.44,0:23:35.42,Default,,0,0,0,,所以 我先手动进入 URI... API endpoint
Dialogue: 0,0:23:35.42,0:23:42.57,Default,,0,0,0,,现在我们想在自己的实例上查看另一个项目
Dialogue: 0,0:23:42.57,0:23:47.20,Default,,0,0,0,,这是贡献的第一步
Dialogue: 0,0:23:47.20,0:23:51.68,Default,,0,0,0,,这 API endpoint 有一点复杂
Dialogue: 0,0:23:51.68,0:23:54.75,Default,,0,0,0,,我看看还记不记得
Dialogue: 0,0:23:54.75,0:23:58.75,Default,,0,0,0,,当然 这是因为我们还没做好前端
Dialogue: 0,0:23:58.75,0:24:04.84,Default,,0,0,0,,先用一下这个麻烦的方法
Dialogue: 0,0:24:04.84,0:24:08.22,Default,,0,0,0,,但有了 UI 就可以自动完成了
Dialogue: 0,0:24:13.15,0:24:15.60,Default,,0,0,0,,应该没打错吧
Dialogue: 0,0:24:17.15,0:24:20.53,Default,,0,0,0,,好了 可以了
Dialogue: 0,0:24:20.53,0:24:26.08,Default,,0,0,0,,可以看见 我这个帐号的用户名就是 "a"
Dialogue: 0,0:24:26.08,0:24:34.66,Default,,0,0,0,,现在我在我自己的实例上看那个帐号的仓库
Dialogue: 0,0:24:34.66,0:24:39.91,Default,,0,0,0,,我想发个 PR 提交贡献
Dialogue: 0,0:24:39.91,0:24:45.68,Default,,0,0,0,,就像平常一样 我们 fork 它
Dialogue: 0,0:25:05.42,0:25:12.04,Default,,0,0,0,,现在我们发个 PR 过去
Dialogue: 0,0:25:12.04,0:25:19.73,Default,,0,0,0,,看 现在我要发到另一个实例去
Dialogue: 0,0:25:34.22,0:25:36.71,Default,,0,0,0,,点击 Create Pull Request
Dialogue: 0,0:25:36.71,0:25:41.55,Default,,0,0,0,,如果正常的话 就可以在这里看到这个 PR
Dialogue: 0,0:25:43.55,0:25:48.84,Default,,0,0,0,,然后再看看这里 也有了
Dialogue: 0,0:25:48.84,0:25:54.13,Default,,0,0,0,,可以看到改动的文件
Dialogue: 0,0:25:54.13,0:26:00.57,Default,,0,0,0,,成了 这就是这个 demo 实际工作的样子
Dialogue: 0,0:26:00.57,0:26:05.82,Default,,0,0,0,,亮色和暗色的两个 forge 能够互相通讯
Dialogue: 0,0:26:05.82,0:26:11.42,Default,,0,0,0,,所以我就能在这里贡献另一个 forge 的 Hello World
Dialogue: 0,0:26:11.42,0:26:17.28,Default,,0,0,0,,这就是一个简单的 demo\N演示了我们能做的许多事情之一
Dialogue: 0,0:26:19.15,0:26:26.08,Default,,0,0,0,,现在我们完成了整个任务列表的 40%
Dialogue: 0,0:26:26.08,0:26:33.64,Default,,0,0,0,,但并不是 100% 完成了才能开始联邦化
Dialogue: 0,0:26:33.64,0:26:45.86,Default,,0,0,0,,但愿 Forgejo 项目能在两个多月之后实现能用的联邦
Dialogue: 0,0:26:48.40,0:26:56.71,Default,,0,0,0,, ForgeFed 协议本身 已经开发大概 5 年了
Dialogue: 0,0:26:56.71,0:27:02.71,Default,,0,0,0,, 而这个一个特定的实现 迄今开发了1 年多了
Dialogue: 0,0:27:03.91,0:27:12.22,Default,,0,0,0,,不过尽管 ForgeFed 协议 我们已经开发了很久
Dialogue: 0,0:27:12.22,0:27:13.68,Default,,0,0,0,,但它还不是很完整
Dialogue: 0,0:27:13.68,0:27:19.11,Default,,0,0,0,,这两个项目的 vocabulary 都还没涵盖\N现在 forge 能做的所有事情
Dialogue: 0,0:27:19.11,0:27:24.44,Default,,0,0,0,,很多不同的东西都还没做完
Dialogue: 0,0:27:24.44,0:27:34.44,Default,,0,0,0,,而且 还有很多问题是我们要应对或者注意的
Dialogue: 0,0:27:34.44,0:27:38.00,Default,,0,0,0,,第一个问题就是 spam 和管理
Dialogue: 0,0:27:38.00,0:27:47.73,Default,,0,0,0,,因为任何去中心化的网络 都会有许多社会问题
Dialogue: 0,0:27:49.73,0:27:54.44,Default,,0,0,0,,幸运的是 有应对这些问题的范例
Dialogue: 0,0:27:54.44,0:28:02.08,Default,,0,0,0,,而不幸的是\N没有一个最好的解决方案能解决 spam 和管理问题
Dialogue: 0,0:28:02.08,0:28:05.52,Default,,0,0,0,,我们也一直在思考这个问题
Dialogue: 0,0:28:05.52,0:28:16.60,Default,,0,0,0,,因为我们得消灭 spam 并建立一套良好的管理系统
Dialogue: 0,0:28:16.60,0:28:23.60,Default,,0,0,0,,这样才能让它更加易用 更加友好
Dialogue: 0,0:28:23.60,0:28:33.82,Default,,0,0,0,,另一个经常出现在联邦系统 (比如说 Mastodon) 的问题是
Dialogue: 0,0:28:33.82,0:28:45.10,Default,,0,0,0,,会有少数几个大型实例 或者协议的一个实现 出现独占的情况
Dialogue: 0,0:28:45.10,0:28:55.67,Default,,0,0,0,,比如对微博平台而言 那就是 Mastodon\NFediverse 里的大多数人用的都是它
Dialogue: 0,0:28:55.67,0:29:03.92,Default,,0,0,0,,它会对 spec 的发展方向有主导作用
Dialogue: 0,0:29:03.92,0:29:11.65,Default,,0,0,0,,有意思的是 ActivityPub 的 spec 基本上已经处于休眠期
Dialogue: 0,0:29:11.65,0:29:17.07,Default,,0,0,0,,但如果想建立一个微博应用\N你实际上得遵循 Mastodon 的所有扩展
Dialogue: 0,0:29:17.07,0:29:28.42,Default,,0,0,0,,所以 Mastodon 很大程度上影响着社区的发展方向
Dialogue: 0,0:29:28.42,0:29:32.22,Default,,0,0,0,,这可能有很大的问题
Dialogue: 0,0:29:32.22,0:29:40.87,Default,,0,0,0,,而且 Mastodon 也有三四个超大实例
Dialogue: 0,0:29:40.87,0:29:46.15,Default,,0,0,0,,大多数人都在那几个大型实例上
Dialogue: 0,0:29:46.15,0:29:53.87,Default,,0,0,0,,也有可能面临这样的情况\N这些实例对整个网络有着很大的权利和影响
Dialogue: 0,0:29:53.87,0:29:58.00,Default,,0,0,0,,并且控制着整个网络的演进方向等
Dialogue: 0,0:29:58.00,0:30:07.02,Default,,0,0,0,,这种情况没有最优解法
Dialogue: 0,0:30:07.02,0:30:19.02,Default,,0,0,0,,但我们相信的是 通过迁移\N将一个 forge 上的数据导入另一个 forge
Dialogue: 0,0:30:19.02,0:30:23.65,Default,,0,0,0,,应该能缓解问题的严重性
Dialogue: 0,0:30:23.65,0:30:27.72,Default,,0,0,0,,因为 如果许多人都在一个巨型 forge 实例上
Dialogue: 0,0:30:27.72,0:30:35.20,Default,,0,0,0,,而这个 forge 立下了颇受争议的政策
Dialogue: 0,0:30:35.20,0:30:49.50,Default,,0,0,0,,那如果人们可以轻松迁移数据 就能解决一部分问题
Dialogue: 0,0:30:49.50,0:30:59.30,Default,,0,0,0,,下一点 就是自托管服务器时 一般都会有的问题
Dialogue: 0,0:30:59.30,0:31:05.12,Default,,0,0,0,,大多数人都会感觉不方便
Dialogue: 0,0:31:05.12,0:31:10.67,Default,,0,0,0,,如果你想自托管 Forgejo 那有很多步骤要走
Dialogue: 0,0:31:10.67,0:31:21.05,Default,,0,0,0,,比如说买域名 买服务器 要么是买 VPS 或者用家里的电脑
Dialogue: 0,0:31:21.05,0:31:28.10,Default,,0,0,0,,但如果你要用家里的电脑的话\N你就得进入路由器设置 配置端口转发等
Dialogue: 0,0:31:28.10,0:31:34.12,Default,,0,0,0,,做这些很复杂 一点都不简单
Dialogue: 0,0:31:35.10,0:31:38.90,Default,,0,0,0,,不过因为这是个一般性的问题
Dialogue: 0,0:31:38.90,0:31:45.92,Default,,0,0,0,,所以我们 ForgeFed 没有直接强调它
Dialogue: 0,0:31:45.92,0:31:48.40,Default,,0,0,0,,许多项目已经在着手解决了
Dialogue: 0,0:31:48.40,0:32:00.67,Default,,0,0,0,,比如说 有一些项目 能帮用户安装和运行服务器
Dialogue: 0,0:32:00.67,0:32:07.52,Default,,0,0,0,,而不用关心各种细节和项目维护
Dialogue: 0,0:32:07.52,0:32:26.17,Default,,0,0,0,,它们用打隧道的方法 这样的话\N就算没公网 IP 也能在自己的设备上轻松托管
Dialogue: 0,0:32:28.77,0:32:37.35,Default,,0,0,0,,另一点值得考虑的问题是
Dialogue: 0,0:32:38.31,0:32:43.37,Default,,0,0,0,,性能以及网络的伸缩性
Dialogue: 0,0:32:43.37,0:32:48.82,Default,,0,0,0,,因为许多自由软件项目的规模都十分庞大
Dialogue: 0,0:32:48.82,0:32:55.55,Default,,0,0,0,,比如说 Gitea 它有成千上万的 issue
Dialogue: 0,0:32:55.55,0:32:58.80,Default,,0,0,0,,好在大多数 issue 最后都关闭了
Dialogue: 0,0:32:58.80,0:33:05.26,Default,,0,0,0,,而且它还有几百位贡献者 几百个 PR
Dialogue: 0,0:33:05.26,0:33:13.37,Default,,0,0,0,,总之 这些项目十分庞大 需要非常注重伸缩性和性能
Dialogue: 0,0:33:13.37,0:33:21.13,Default,,0,0,0,,举例来说 Mastodon 就容易出现问题
Dialogue: 0,0:33:21.13,0:33:27.86,Default,,0,0,0,,我一直举这个类比 是因为它也有相似的情况\N它也用 ActivityPub 并且还进行了扩展
Dialogue: 0,0:33:27.86,0:33:39.35,Default,,0,0,0,,假如你在 Mastodon 上发布了一条带链接的嘟文\N那这条嘟文就会传播到全世界各地的服务器
Dialogue: 0,0:33:39.35,0:33:48.53,Default,,0,0,0,,然后 为了生成链接预览\N所有这些服务器都会去访问这个链接
Dialogue: 0,0:33:48.53,0:33:55.75,Default,,0,0,0,,这样 数千个服务器都会同时向这个网站发送请求
Dialogue: 0,0:33:55.75,0:33:58.95,Default,,0,0,0,,可能这个网站的网络连接不好
Dialogue: 0,0:33:58.95,0:34:08.93,Default,,0,0,0,,于是 这一获取链接预览的行为\N就对网站造成了 DDoS 攻击
Dialogue: 0,0:34:08.93,0:34:16.60,Default,,0,0,0,,所以这一点也是需要注意的
Dialogue: 0,0:34:22.60,0:34:26.26,Default,,0,0,0,,我还想指出的是
Dialogue: 0,0:34:26.26,0:34:32.88,Default,,0,0,0,,Forgejo 实现以及 ForgeFed 协议本身
Dialogue: 0,0:34:32.88,0:34:36.66,Default,,0,0,0,,这两个项目都是 NLNet 资助的
Dialogue: 0,0:34:36.66,0:34:42.95,Default,,0,0,0,,NLNet 是一个荷兰的非盈利性组织 为这些自由软件项目提供了资助
Dialogue: 0,0:34:42.95,0:34:49.24,Default,,0,0,0,,所以我们有充足的资金支持 很不错
Dialogue: 0,0:34:50.37,0:34:56.04,Default,,0,0,0,,我想说的就这么多了
Dialogue: 0,0:34:56.04,0:34:59.66,Default,,0,0,0,,现在欢迎大家提问
Dialogue: 0,0:35:11.93,0:35:59.15,Q&A,,0,0,0,,Q：我对 Fediverse 很感兴趣，关注你的项目也有一段时间了。\N我想问的问题，也是 Fediverse 仍然存在的一个问题。\N就拿 ForgeFed 或者 Forgejo 当例子。假如我从联邦网络中\N众多的实例中，选了一个实例来托管我的项目，怎么才能保证\N它的可靠性呢？显然，我在 GitHub 上注册，一个原因就是，\N能保证我存的代码能一直在那里。所以，有没有计划能实现，\N如果一个实例不可靠了，能够简单地迁移实例，或者有没有\N解决这个问题的方法？当涉及到实例的时候，可靠性确实是个\N重要的问题。
Dialogue: 0,0:35:59.15,0:37:06.20,Q&A,,0,0,0,,A：好问题。这就关联到了我刚刚说的，要尽可能简单地迁移。\N我们想做的就是，让你能将帐号下的所有仓库，从一个服务器\N迁移到另一个服务器。并且，有了这种通用的数据格式，也能\N十分轻松地建立镜像。比如说，现在 Forgejo 可以将一个仓库\N镜像到另一个仓库。不过，因为镜像是使用 Git 实现的，所以\N这只建立了代码的镜像，因为 Git 没有管理 bug 追踪或者 PR。\N有了 ForgeFed，它就延伸了 Git 的镜像，从而能够将项目所有\Nissue 等，同样地镜像过去。所以，有了镜像功能，希望也能够\N提高 Forgejo 实例可靠性，就像备份一样。这样，数据就存在\N了多个实例上。
Dialogue: 0,0:37:11.04,0:37:42.80,Q&A,,0,0,0,,Q：这个项目十分不错，意义非凡。我想知道，你有没有联系\NSocial Web Working Group，告诉他们这个项目？我之所以会\N这么问，是因为过去几周，有很多的讨论，除了把 ActivityPub\N用在微博平台，还能用在什么地方，以及是要更新 ActivityPub，\N还是把它归入 ActivityStreams 里。 所以我想知道，你有没有\N联系他们。如果没有的话，推荐你联系一下。
Dialogue: 0,0:37:42.80,0:37:52.40,Q&A,,0,0,0,,A：我个人还没联系他们。不过我肯定会考虑的。
Dialogue: 0,0:37:59.60,0:38:09.46,Q&A,,0,0,0,,Q：比起自由软件用例的那个问题，这个问题应该没那么有趣。\N总之，所谓“访问控制”，就是说只允许网络中特定的人访问\N某些仓库吗？
Dialogue: 0,0:38:09.46,0:38:36.97,Q&A,,0,0,0,,A：这个问题其实很有意思。在 ForgeFed 协议里，我们尝试用\N对象能力（object capability）模型来实现权限管理和访问控制。\N我想在 Forgejo 实现里，不会用到这些花样的对象能力等东西。\N不过，在协议方面，我们确实在这么做。
Dialogue: 0,0:38:49.64,0:39:03.20,Q&A,,0,0,0,,Q：你刚刚谈到了跨站搜索。我不知道能不能实现，搜索的时候\N也使用到这个基于对象的东西。还是说，我理解错了？
Dialogue: 0,0:39:06.48,0:39:37.76,Q&A,,0,0,0,,A：跨站搜索实际上是 ForgeFed 之外的独立的项目。我所说的\N对象能力模型，就是另一种管理权限等的方法。所以我想这两个\N东西应该没什么关联。
Dialogue: 0,0:39:37.76,0:40:39.00,Q&A,,0,0,0,,Q：也许我完全搞错了，如果我有什么地方弄错了，还请纠正。\N你刚刚谈到了，跨站搜索有一个问题，而大家都想要 Mastodon\N把它加上去。现在潜在的问题是，只有允许和禁止两个选项。\N所以，能不能给对象分配一些属性，这样我就能选择，只有\N在搜索这类型的东西的时候，才能看到我的东西？刚刚谈论的\N话题，让我感觉和这个问题有点关联。
Dialogue: 0,0:40:39.00,0:40:52.93,Q&A,,0,0,0,,A：我想我理解了。我其实并没有在开发这个跨站搜索，不过\N我觉得这是一个很有意思的探索方向。
Dialogue: 0,0:41:25.66,0:41:58.20,Q&A,,0,0,0,,Q：似乎 ForgeFed 建立的标准，同时也能用于 Git-SSB 或者\NRadicle，从而建立一个能与其他系统同时工作的 P2P 项目；\N两者都使用相同的系统、相同的 spec，并且联邦节点上的 forge\N能互动，相互操作。你有没有考虑过让它和另一个协议工作？
Dialogue: 0,0:41:58.20,0:42:29.13,Q&A,,0,0,0,,A：我认为完全是可以的。不过我们主要的关注点是传统的 forge，\N也就是服务器上的，而不是 P2P 网络上的。但我认为 ForgeFed\N完全有潜力用在 P2P 网络上。
Dialogue: 0,0:42:31.80,0:42:49.40,Q&A,,0,0,0,,Q：SourceHut 那个基于 SMTP 的标准，是否和 ForgeFed 项目\N有任何关联？还是说那只是给一个特定的 forge，用来借 SMTP\N自己做各种事情的？
Dialogue: 0,0:42:49.40,0:43:19.37,Q&A,,0,0,0,,A：我实际上并没有仔细研究过 SourceHut，不过我觉得它应该\N确实在实现类似的东西。我想 SourceHut 参与了 ForgeFed 的\N早期开发，但那是好几年前了。我并不清楚，因为我是在大约\N一年前加入这个项目的。
Dialogue: 0,0:43:48.05,0:44:15.74,Q&A,,0,0,0,,Q：有一些 forge 软件，比如说 Gerrit，工作方式有些不一样。\N相比 fork 并提交 PR，你可以提交补丁然后 cherry-pick。这种\N工作流有些不一样。你认为这要怎么和 ForgeFed 工作？
Dialogue: 0,0:44:15.74,0:45:09.60,Q&A,,0,0,0,,A：这有些复杂。ForgeFed 尽量保持通用，尽量支持所有不同的\N工作流。实际上，它并不在乎你用的是什么版本管理系统。\N我们的一位 ForgeFed 开发者对 Darcs 版本管理系统很感兴趣。\N所以，我认为理论上，所有这些工作流都会受到支持，并且能够\N相互操作。但实际上，不同的 forge 都有许多差异。所以，\Nforge 之间的通讯，可能无法像预期一样工作，毕竟不同的 forge\N都有不同之处。
Dialogue: 0,0:45:12.54,0:45:40.57,Q&A,,0,0,0,,Q：我不太熟悉 ActivityPub 之类的东西。你认为能不能这样：\N假如有一个联邦化的 forge，你想给它发一个 PR 什么的。\N能不能单纯在本地的客户端这么做，向那个 forge 发送请求？
Dialogue: 0,0:45:40.57,0:46:03.40,Q&A,,0,0,0,,A：我认为理论上可行。但考虑到 ActivityPub 通常的实现方式，\N这可能更加困难一些。你应该还需要在其他实现了 ForgeFed 的\Nforge 上有一个帐号，才能这么做。
Dialogue: 0,0:46:07.90,0:46:34.55,Q&A,,0,0,0,,Q：你能在 Mastodon 上看 Pixelfed 帖子，也能在 Mastodon 上\N看 PeerTube 视频。有没有计划，或者能不能在 Mastodon 上\N看 PR，而不对 Mastodon 进行修改？还是说 Mastodon 有一个\N类型白名单，导致 PR 这类信息不能在上面显示？
Dialogue: 0,0:46:34.55,0:47:55.30,Q&A,,0,0,0,,A：我有研究过这个问题。我们想的是，不止是 forge 之间相互\N操作，还要 Forgejo 和 Mastodon 之类的相互操作。然而，\NMastodon 的源代码里确实有一个类型白名单。ActivityPub 里\N有一个 type array 支持，可能会有些用。有了这个，就可以给\N这个 activity 指定多个 type。可惜 Mastodon 也不支持 type\Narray。而且，Forgejo 在实现 ForgeFed 时用到的库也不支持\Ntype array。如果能实现，那应该很有帮助，但我不知道有没有\N解决方案。所以，我们也得给 Mastodon 贡献一个补丁，这样\N才能实现在 Mastodon 上对一个 issue 进行评论，或者看 PR。\N不过这是以后的事了。
Dialogue: 0,0:47:55.30,0:48:11.50,Q&A,,0,0,0,,Q （续）：这个 type array 是这样没错。我在写一个通用的\NActivityPub 只读客户端。它确实不支持 type array，只支持\Nstring 类型的 type。
Dialogue: 0,0:48:25.80,0:48:47.95,Q&A,,0,0,0,,Q：这个协议是否支持数字签名，来检查某些行为是否为用户所为？
Dialogue: 0,0:48:47.95,0:49:21.65,Q&A,,0,0,0,,A：基本所有 ActivityPub 实现都有签名机制。ActivityPub 标准\N本身是没有签名机制的。是 Mastodon 先有，然后其他的为了\N兼容性才加上去的。所以，我们会增加签名机制，从而给 PR 等\N签名。
Dialogue: 0,0:49:25.00,0:49:32.00,Default,,0,0,0,,我的演讲到此结束 谢谢大家
Dialogue: 0,0:49:32.00,0:49:39.50,Attribution,,0,0,0,,Towards Federated Software Forges\N讲者: Anthony Wang   译者: Hayden\N源视频与中文翻译均以 CC BY-SA 4.0 发布
