Canonical 告诉你如何不通过 Snap 商店使用 Snap 包

Summary: 虽然你可能听到不同的看法，但实际上，它并未像一些批评者所想象的那样完全专有。

为什么要放弃各种Unix，难道去用Windows吗？经典的MacOS（8/9）没有终端，即使软件够用也不想用，还是X有吸引力。

虽然你可能听到不同的看法，但实际上，它并未像一些批评者所想象的那样完全专有。

# Canonical 告诉你如何不通过 Snap 商店使用 Snap 包

>
> 虽然你可能听到不同的看法，但实际上，它并未像一些批评者所想象的那样完全专有。
>
>
>

对 Ubuntu 的 Snap 打包格式最常见的误解之一是它是专有的 —— 但是深入研究其文档后，会发现这个说法并不对。

在上周末拉脱维亚的里加举行的 Ubuntu 峰会上，笔者有幸采访到 Ubuntu 的<ruby> 开发者大使 <rt>  developer advocate </rt></ruby>，Igor Ljubuncic。期间，他们详细探讨了关于 Snap 的各种误区，包括它被视为完全闭源的、受 Canonical 控制、必须使用 Canonical 的 Snap 商店等众多谬论。

如果说有什么比糟糕的软件更加厌恶的，那一定是谎言。正如我们在 [点评 Fedora 39](https://www.theregister.com/2023/11/09/fedora_39_released/) 时所注意到的，即使在 Linux 诞生之前，各种软件的拥趸们就经常爆发各种 [圣战](http://catb.org/jargon/html/H/holy-wars.html)。但我们至少希望能坚守事实的公道。毫无根据的恶意指责是没有必要的：生活本身已经足够糟糕。

笔者的立场很明确，我们并不特别偏爱任何 Linux 发行版或其打包工具。像许多资深电脑技术人员一样，在长期和各种软件打交道后，笔者已经对所有的软件厌烦至极。一句广为接受的说法就是：[没有一个软件不让人头疼](http://harmful.cat-v.org/software/)。

Linux 就是一个软件，因而它难免让人头疼。承此，所有的 Linux 发行版也都不尽如人意。包管理器也是一个软件，同样也不尽人意。但幸运的是，至少大多数 Linux 发行版都有一个包管理器。这比没有软件包管理器要好，或者更糟糕的是，有不止一个以上的包管理器，这一点 [XKCD 927](https://xkcd.com/927/) 漫画体现的淋漓尽致。

我们并不特别青睐 Snap，也不特别反对 Flatpak。笔者个人更偏好 [AppImage](https://appimage.org/) 格式，它不需要其他额外的框架。但虽然有个 [AppImageHub](https://www.appimagehub.com/)，但该格式却并没有提供软件更新的工具，这个问题就留给了应用本身来解决。

鉴于所有的软件都不完美，那唯一重要的区别就在于其问题严重的程度。一段时间以后，你最关注的就是它是否可运行，能否满足你的需要，以及它的可靠性。

我在早年的职业生涯中花了很多时间在技术支持上，修复其他人的软件。因此，我学到了一个经验，那就是降低软件让人厌烦程度的一个重要因素就是它工作的方式是否容易理解。

Btrfs 是复杂的，而修复它则更是如此。Git 属于*本质*复杂，其 [名称](https://dictionary.cambridge.org/dictionary/english/git) 就体现出这一点。（没错，“git” 是一个名词，而非缩写或代号，有实际的意思 —— “饭桶”。）OStree 可以说是针对二进制文件的 Git，这使得它比普通 Git 至少复杂两倍。而 Flatpak 则是 OStree 的封装。

这意味着增加了两层额外的复杂度：首先，对复杂事物的封装只能隐藏其复杂性，而不能消除其复杂性。其次，你不能使用 Flatpak 构建一个操作系统，因此你还需要 OStree。

因此，我们将来逐一揭穿关于 Snap 格式和工具的一些误解。这不是一篇入门指南，而是对那些不那么显而易见，并且对 Snap 有所误解的人的一份快速概览。

### 无需商店进行分发

Snap 包其实就是一个 [Squashfs](https://docs.kernel.org/filesystems/squashfs.html)，类似于大多数 Linux 安装介质上的系统镜像。Snap 包以两个文件传递：其中一个是命名为 `<name>_<revision>.snap`，该文件包含了软件本身；另一个则是一个伴随的 [声明文件](https://snapcraft.io/docs/assertions)，它为 Snap 提供了数字签名。然后，Canonical 还进一步 [详细阐明](https://snapcraft.io/docs/revisions) 了版本修订的工作原则。

使用 `snap download` 的指令（而非 `snap install`）可以容易获取这些基本文件：

```
# snap download firefox
Fetching snap "firefox"
Fetching assertions for "firefox"
Install the snap with:
  snap ack firefox_3252.assert
  snap install firefox_3252.snap

```

然后，这些文件便可以被复制到另一台设备上进行安装，这种操作不需要访问 Snap 商店，仅需使用输出中的指令即可。

如 Igor 所说：

>
> “这样，从 Snap 商店中，你可以选择你想要的 Snap 包（如 Firefox），将其放入你的内部仓库中，或是 FTP，或是 NFS 上。接着你可以使用它作为在内部安装 Snap 的来源，而这不需要去访问商店。此外，你还可以将这个操作与你所使用的任何调度或部署机制结合起来，就如配置管理那样。”
>
>
>

### 安装无需声明文件的 Snap 包

通常来说，`snap ack` 命令会首先读取并验证签名，但是你可以选择跳过这个步骤。

```
snap install "downloaded snap" --dangerous

```

上述指令会安装该 Snap 包，并不会验证其签名。请注意，这样做虽然操作简单，但也有一个重要的限制：使用 `--dangerous` 选项安装的 Snap 包不会自动从商店中更新。

所以，实际上，你可以在你的网络内部分发 Snap 包，避免它们试图连接到 Snap 商店，并自主管理更新。

### 管控 snapd 内置的更新机制

另一方面，你可以在不忽略验证机制的前提下，管理和控制操作系统何时以及如何更新 Snap 包。Igor 则曾撰写过关于如何使 Snap [更新暂停](https://snapcraft.io/blog/hold-your-horses-i-mean-snaps-new-feature-lets-you-stop-snap-updates-for-as-long-as-you-need) 的文章。

你可以设置暂停 Snap 的更新一段时间，或永久暂停，甚至只选择暂停特定的 Snap 包，同时也能简单取消此设置。例如：

```
snap refresh --hold
Auto-refresh of all snaps held indefinitely.

```

另外，你也可以通过以下方式设置防火墙拦截 Snap API：

```
sudo iptables -A OUTPUT -d api.snapcraft.io -j DROP

```

### 在无 snapd 环境下运行 snaps

`.snap` 文件实际上就是一个压缩的文件系统，它包含着程序文件（以及各种库等），这些都被存放在一个传统的目录结构中，而该目录结构对于打包在 Snap 应用程序内的应用来说，就是它的根目录。Snapd 负责为此设置挂载名空间，并通过 [Apparmor](https://apparmor.net/) 和 [seccomp](https://man7.org/linux/man-pages/man2/seccomp.2.html) 实现安全隔离。

你可以将其内容解压并直接运行：

```
unsquashfs firefox_3252.snap
Parallel unsquashfs: Using 20 processors
565 inodes (5428 blocks) to write
[=====================/] 5428/5428 100%
created 399 files
created 149 directories
created 166 symlinks
created 0 devices
created 0 fifos
created 0 sockets
ll squashfs-root/
total 80
drwxr-xr-x  7 igor igor  4096 lis  10 02:33 ./
drwxr-xr-x 10 igor igor  4096 lis  19 15:32 ../
drwxr-xr-x  5 igor igor  4096 lis  10 02:33 data-dir/
-rw-r--r--  1 igor igor 32441 lis  10 02:33 default256.png
-rw-r--r--  1 igor igor  9146 lis  10 02:33 firefox.desktop
-rwxr-xr-x  1 igor igor  2680 lis  10 02:33 firefox.launcher*
drwxr-xr-x  2 igor igor  4096 lis  10 02:33 gnome-platform/
drwxr-xr-x  4 igor igor  4096 lis  10 02:33 meta/
-rwxr-xr-x  1 igor igor  3716 lis  10 02:33 patch-default-profile.py*
drwxr-xr-x  4 igor igor  4096 lis  10 02:33 snap/
drwxr-xr-x  4 igor igor  4096 sij  19  2022 usr/

```

如果你查看 Snap 内 Firefox 二进制文件的动态依赖，你会注意到它希望从根文件系统中获取文件：

```
ldd usr/lib/firefox/firefox-bin
       linux-vdso.so.1 (0x00007fff33cc5000)
       libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6cf2c00000)
       libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6cf2e40000)
       libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6cf2be0000)
       libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6cf2800000)
       /lib64/ld-linux-x86-64.so.2 (0x00007f6cf300e000)

```

在 Snap 内部，这个“根”就是你的基础系统（比如 core18 或 core20 等）。但是一旦你解压了这个 Snap，没有 snapd 在安装和运行 Snap 时提供的安全隔离，Firefox 将会尝试直接访问你的根目录的库。这可能会导致执行时的不一致性。

举例来说，你的 Snap 内可能包含的是 GNOME 3.38 版的库，但是你的主机上运行的可能是 GNOME 3.32。如果你尝试解压并运行这个应用，它可能会试图从主机中加载库，这可能引起不一致 —— 更甚者，可能会让程序崩溃。

为了避免这种情况发生，你需要做的唯一事情就是设置 `LD_LIBRARY_PATH` 环境变量，以让程序知道其库在何处，确保它首选这些库，而不是使用可能导致其运行失败的操作系统中的库副本。

```
LD_LIBRARY_PATH: ${SNAP_LIBRARY_PATH}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}:$SNAP/usr/lib:$SNAP/usr/lib/x86_64-linux-gnu

```

通常，你会希望 `LD_LIBRARY_PATH` 开始于 `/snap/<snap name>/`，然后是 `/lib`、`/usr/lib` 和其他常用路径。至于其他内容，`firefox.launcher` 文件负责准备运行环境，剩余的，比如 `firefox.desktop`，都用于桌面集成：如图标、全名、文件关联等。这些内容虽然使应用看起来效果更好，但它们并非严格的必需品。

其实，你甚至不需要解压 Snap 的内容，你可以直接将 Snap 文件本身作为一个 [回环设备](https://tldp.org/HOWTO/archived/Loopback-Root-FS/Loopback-Root-FS-2.html) 挂载 —— 你甚至可以设置为只读 —— 但没有挂载命名空间隔离。并且，如果没有设置环境让 Snap 内部的应用在寻找它的库时首先从 Snap 内部开始，你仍然需要正确地设置库路径。

### 代理和缓存 Snap 包

正如 Igor 所说，如果客户并不打算自行运营一家具备完整品牌属性的 Snap 商店，他们可以选择手动设置一个 [Snap 代理](https://docs.ubuntu.com/snap-store-proxy/en/)。对此，Canonical 也提供了相应的 [文档](https://docs.ubuntu.com/snap-store-proxy/en/install)，并描述了所需的 [网络访问](https://forum.snapcraft.io/t/network-requirements/5147) 权限。

同时，你也可以 [配置](https://snapcraft.io/blog/how-to-cache-snap-downloads-and-save-bandwidth) 一个缓存 Snap 代理 —— 这项任务稍微简单一些，对于希望降低下载带宽的家庭网络来说，可能是个不错的选择。

### 搭建自己的 Snap 商店

就如我们之前所述，你完全可以忽略所有来自 Canonical 的基础设施，直接运行自己的 Snap 商店。去年，我们写过一篇关于 Ubuntu Unity 维护者 [Rudra Saraswat](https://www.theregister.com/2022/02/04/rudra_sarsawat_ubuntu_projects/) 的文章，他就 [做到了这一点](https://gitlab.com/lol-snap/lol)，这只是他的众多项目中之一。据悉，好几个在生产环境中使用 Ubuntu Core 的组织都采取了此种做法，而所有所需的工具都存放在 Ubuntu 仓库中。

Canonical 在这方面发布了大量的文档，包括怎样构建你的 [第一个 Snap 包](https://snapcraft.io/blog/how-to-make-your-first-snap)，以及如何用 [不同的编程语言](https://snapcraft.io/docs/creating-a-snap) 构建。今年的峰会上有多场关于如何构建 Snap 的演讲 － 包括 [在平板电脑上构建 Snap 包](https://events.canonical.com/event/31/contributions/222/)，以及如何 [自动化构建更新的 Snap 包](https://events.canonical.com/event/31/contributions/217/)，虽然这对笔者来说有点过于复杂。

学习一些新的术语是有必要的，同时也有 [官方文档](https://snapcraft.io/docs/interface-management) 提供帮助。这段解释我们特别喜欢：

* <ruby> 插槽 <rt>  slots </rt></ruby> 是指提供方（即 Snap 提供的资源）
* <ruby> 插口 <rt>  plugs </rt></ruby> 是指消费者（即使用 Snap 提供的资源的用户）
* <ruby> 接口 <rt>  interfaces </rt></ruby> 是交互的地方（负责将插口和插槽连接起来）

从我们与 Canonical 代表的对话中，他们似乎对 Snap 商店被误解，以及 Snap 被视为封闭、专有系统的争论显得尤为不满。

大约十五年前，有人曾声称 Canonical 的代码托管和项目管理平台 [Launchpad](https://www.theregister.com/2008/07/22/ubuntu_next_launchpad/) 是专有的，所以 Canonical 在整理代码后在 2009 年 [公开发布](https://canonical.com/blog/canonical-releases-source-code-for-launchpad) 了代码库。但如我们交谈的人所言：“没人在意。” 它是 Canonical 的内部工具，对其他人来说并没有太大的用处。他们表示，他们不希望再经历一次这样的情况。

我们还注意到，红帽正在朝反方向前进，即从开源的 Bugzilla [迁移](https://www.theregister.com/2023/09/29/red_hat_bugzilla_jira_migration/) 到封闭的、基于云的 Jira —— 这并未引起太大的争议。

[snapd](https://github.com/snapcore/snapd) 自身的代码已经托管在 GitHub 上，作为 Canonical 的 [snapcore](https://github.com/snapcore) 仓库的一部分。这个被大多数发行版使用的打包格式是一个已经存在、有文档记录的格式。用于进行隔离的工具，是已经存在并在其他发行版中使用的第三方工具，比如，Debian 和 SUSE 家族也使用了 AppArmor，这与 Arch 维基中的 [描述](https://wiki.archlinux.org/title/AppArmor) 相符，而它的主要竞品，[SELinux](https://selinuxproject.org/page/Main_Page)，则更复杂，主要在红帽及其衍生产品中使用。

尽管 Canonical 自家定制的 [Snap 商店](https://snapcraft.io/store) 的后端仍然 [闭源](https://askubuntu.com/a/1383685)，但 Snap 格式、snapcore 软件、[snapcraft.io 前端](https://github.com/canonical/snapcraft.io)，以及更多组件都是开放的。我们再次强调，你完全可以自行搭建 [自己的 Snap 商店](https://ubuntu.com/blog/howto-host-your-own-snap-store)。

请不要受到愤怒的论坛喷子们的误导。

### 最后再说一点...

实际上，撰写这篇文章的作者曾经就职于红帽和 SUSE，但他主要还是使用 Ubuntu，从 2004 年 Ubuntu 刚刚发布起就开始一直使用。Ubuntu 不但运行顺畅，使用起来也十分便捷。然而，早在多年前他就已经从他的主要工作电脑上删除了 snapd 和相关的一切工具，取而代之的是 [deb-get](https://trendoceans.com/nala-package-manager/) —— 最初这是 Ubuntu MATE 的创造者 [Martin Wimpress](https://ubuntu-mate.org/) 编写的。为了更加迅速，他还选择使用 [Nala 包管理器](https://github.com/volitank/nala) 而不是 Apt。

如果可以的话，笔者很希望可以放弃各种形式的 Unix，除了服务器，其他情况下更倾向于使用 RISC OS 或是经典的 MacOS。但是遗憾的是，这两个操作系统在网络浏览器、网络连接，还有多核支持和整体稳定性上有待改进。

笔者今年参加 Ubuntu 峰会的费用是由 Canonical 承担的，这一点他愿意公开。类似的，Linux 基金会曾资助他参加 [今年](https://www.theregister.com/2023/09/26/linux_kernel_report_2023/) 在 Bilbao 的开源峰会，而红帽则资助了他在 2016 年在 Kraków 参加 [Flock to Fedora](https://www.theregister.com/2016/10/19/fedora_facelift/) 峰会。这类赞助可以让我们将广告预算分配到其他地方，但并不会对我们的报道产生影响：我们总会积极追踪那些 IT 新闻。

*（题图：MJ/520ba58f-9e07-4acb-af4a-f4832762311f）*

---

via: <https://www.theregister.com/2023/11/10/snap_without_ubuntu_tools/>

作者：[Liam Proven](https://www.theregister.com/Author/Liam-Proven) 译者：[ChatGPT](https://linux.cn/lctt/ChatGPT) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


4 种超简单的自定义 Budgie 桌面的方式

# 4 种超简单的自定义 Budgie 桌面的方式

>
> Budgie 是一种现代的桌面体验方式。你可以根据自己的喜好，使用这些定制技巧进一步增强它的功能。
>
>
>

如果你要求我将 MATE 桌面现代化，并增加功能和 GTK 支持，我可能会想出像 Budgie 这样的东西！

Budgie，是一款令人惊艳的桌面环境（DE），为你提供熟悉的布局和独特的用户体验。

那么，如何自定义你的 Budgie 桌面才能提升个人体验呢？莫慌；我这里有几条妙计助你改善你的 Budgie 体验。

我们的目标大致如下：

* 修改壁纸
* 修改主题，图标以及光标（简易操作）
* 自定义面板
* 自定义停靠区

让我们开始吧！?

### 1、改变 Budgie 桌面环境壁纸

Budgie 桌面预装了一些好看的壁纸。

修改 Budgie 桌面壁纸，你们只需要做这两个小步骤：

1. 在主界面点击右键，选择 “<ruby> 改变桌面背景 <rt>  Change Desktop Background </rt></ruby>”
2. 选择图片，然后该图片就会应用在你的主屏幕中

要是你不太中意其中的可用壁纸，你也可以自网络下载相关壁纸。

下好后，打开文件管理器，导航至图片所在位置，右键点击该图片，选择 “<ruby> 设置为壁纸…… <rp>  （ </rp> <rt>  Set as Wallpaper... </rt> <rp>  ） </rp></ruby>”选项。

### 2、修改桌面主题、图标以及光标主题

通常情况下，我们从网络上下载了主题，提取下载的文件，然后就会将文件移动到相应目录以便 [应用于 Linux 主题](https://itsfoss.com/install-themes-ubuntu/)。

>
> **[如何在 Ubnutu 上安装主题](https://itsfoss.com/install-themes-ubuntu/)**
>
>
>

但要那么整的话，既需要花费些功夫，又不是最高效的方法。（如果你好奇去试试的话）

那么此处便是 **ocs-url** 工具发力的地方了。

**ocs-url** 是一款一键安装所有主题风格（比如说来自 [gnome-look.org](http://gnome-look.org) 门户网站内容）的工具。

>
> ? [Gnome-look.org](http://Gnome-look.org) 和 [pling.com](http://pling.com) 是 [Opendesktop.org](https://www.opendesktop.org/) 旗下的两个网络站点，可以帮助你一站式搜索主题风格，壁纸，图标，以及其它好物。
>
>
>

这个工具与任何桌面环境都没有官方隶属关系。

但令人遗憾的是，它没有被任何 Linux 发行版的软件包管理器包含，也就是说你得在你的系统里手动安装它。

那么首先，移动至 [ocs-url 的官方下载页面](https://www.opendesktop.org/p/1136805/)，转到 “<ruby> 文件 <rt>  Files </rt></ruby>” 选项卡，将软件包下载至你的系统中：

完成后，打开你的命令提示符，将文件地址改成文件下载的位置。对于大多数用户来说，便是下载（`Downloads`）文件夹：

```
cd Downloads

```

现在，使用你的 Linux 发行版对应的指令：

**适用于 Ubuntu：**

```
sudo dpkg -i ocs-url*.deb

```

**适用于 Fedora：**

```
sudo dnf install qt5-qtbase qt5-qtbase-gui qt5-qtsvg qt5-qtdeclarative qt5-qtquickcontrols && sudo rpm -i ocs-url*.rpm

```

**适用于 Arch：**

```
sudo pacman -S qt5-base qt5-svg qt5-declarative qt5-quickcontrols && sudo pacman -U ocs-url*.pkg.tar.xz

```

**适用于 openSUSE：**

```
sudo zypper install libQt5Svg5 libqt5-qtquickcontrols && sudo rpm -i ocs-url*.rpm

```

现在，让我们看看该如何安装主题风格，图标以及光标风格。

#### 修改系统主题风格

修改系统主题风格的第一步 —— 访问 [Gnome Look](https://www.gnome-look.org/browse?cat=135&ord=latest) 门户网站并选择你中意的主题风格（你可以在 GTK 3 和 GTK 4 之间选择）。

选择任意你最喜欢的主题风格；这里我选择 “Kripton” 风格,你可以看到有一个 “<ruby> 安装 <rt>  Install </rt></ruby>” 选项。

在这里，你需要遵循两个小步骤：

* 点击 “<ruby> 安装 <rt>  Install </rt></ruby>” 按钮之后，会呈现该主题风格的不同类型。选择其中一个。
* 然后会跳出一个提示符，你需要再点击一次 “<ruby> 安装 <rt>  Install </rt></ruby>” 按钮：

然后它会打开 ocs-url 工具询问你是否安装所选主题风格。

点击 “<ruby> 确定 <rt>  OK </rt></ruby>” 按钮安装该主题风格：

现在，进入 <ruby> Budgie 桌面设置 <rt>  Budgie Desktop Settings </rt></ruby> 界面，然后在“<ruby> 样式 <rt>  Style </rt></ruby>” 子菜单下的 “<ruby> 组件 <rt>  Widget </rt></ruby>” 选项中点击需要安装的主题风格。

#### 修改图标

要修改图标，先访问有关 [Gnome-look 门户网站中的图标区](https://www.gnome-look.org/browse?cat=132&ord=latest)，来搜索你中意的图标：

找到图标后，可以看到有两个按钮：“<ruby> 下载 <rt>  Download </rt></ruby>” 和 “<ruby> 安装 <rt>  Install </rt></ruby>”。点击 “<ruby> 安装 <rt>  Install </rt></ruby>” 按钮。

可以看到有多个图标，但大多数例子里只展现了一个。点击选项之一，弹出提示，再次点击“<ruby> 安装 <rt>  Install </rt></ruby>”按钮：

然后，可以看到来自 ocs-url 弹出的提示符询问你是否安装所选图标包，点击 “<ruby> 确定 <rt>  OK </rt></ruby>” 安装图标包：

下一步，打开 <ruby> Budgie 桌面设置 <rt>  Budgie Desktop Settings </rt></ruby> 的 “<ruby> 图标 <rt>  icons </rt></ruby>” 子菜单，你便可以使用最近安装过的图标风格（我用过 elementary-kde 风格）：

#### 修改光标主题风格

和之前步骤类似，访问 [Gnome Look 门户网站的光标区](https://www.gnome-look.org/browse?cat=107&ord=latest) 搜索最适合你的光标：

选好心仪的光标风格后，点击相应选项，然后你就可以安装相对应的光标风格了。

弹出提示，再次点击“<ruby> 安装 <rp>  （ </rp> <rt>  Install </rt> <rp>  ） </rp></ruby>”按钮：

弹出来自 ocs-url 工具的提示，点击安装光标主题风格。只需要点个 “<ruby> 确定 <rt>  OK </rt></ruby>” 然后开始安装：

完成后，打开 <ruby> Budgie 桌面设置 <rt>  Budgie Desktop Settings </rt></ruby> 界面，在对应子页面的 “<ruby> 光标 <rt>  Cursors </rt></ruby>” 面板中选择刚刚安装的光标主题风格：

### 3、自定义 Budgie 桌面面板

根据 Linux 发行版的不同，面板的位置也可能不同。例如，假设你用的是 Solus 的 Budgie 或者 Ubuntu 的 Budgie。

打开 <ruby> Budgie 桌面设置 <rt>  Budgie Desktop Settings </rt></ruby> ，在那里你可以寻找到对于面板的相关设置：

如你所见，它将启用的小程序分三个部分显示在面板上：

<ruby> 始端 <rt>  Start </rt></ruby>（最左侧）、<ruby> 中间 <rt>  Center </rt></ruby>，以及 <ruby> 末端 <rt>  End </rt></ruby>（最右侧）。

>
> ? 注意，每个小程序有自己不同的设置选项，所以还能单独设置它们。
>
>
>

你可以在它们之间做些调整。比如，在这个地方我将时钟工具挪到左边，以便它和我的工作流界面看起来更加融洽：

要想移动小程序，只需要选中该小程序然后点击上下箭头按钮（位于小程序列表上方）。

如果你想移除小程序，只需要选中该程序然后点击删除按钮即可：

这里有一个 “+” 图标样式的选项，可以添加更多小程序。点击它，会为你弹出所有可用的小程序。

找到一个有用的小程序，选中该程序并点击 “<ruby> 添加 <rt>  Add </rt></ruby>” 按钮：

要是你希望面板变透明、想1添加阴影，想增加或减少小程序之间的距离，那么就访问设置菜单中的这个页面（如下图）：

举个例子，这里，我将自己的面板设置了透明和阴影，让它看起来更舒服点：

### 4、定制 Budgie 桌面的停靠区

在本节，我会向你介绍如何将自己的停靠区设计得更好，功能性更强：

* 修改停靠区主题风格
* 添加更多工具应用以赋予停靠区更多特性

#### 修改停靠区主题风格

可惜啦，这次 ocs-url 工具可就帮不上什么忙了，设置的唯一方式就是手动操作！

首先，[访问 Gnome Look 的 Plank 主题区](https://www.gnome-look.org/browse?cat=273&ord=latest)，下载你心仪的 Plank 停靠区主题风格。

这里，我选了模仿 macOS 系统的 Monterey 主题风格（dark-inline 版）：

现在，打开命令提示符，找到该主题风格下载位置。

对大多数用户来说，即下载（`Downloads`）文件夹所在位置：

```
cd ~/Downloads

```

现在，[使用解压指令](https://itsfoss.com/unzip-linux/) 将文件释放到 `.local/share/plank/themes/`：

```
unzip <theme_name.zip> -d .local/share/plank/themes/

```

在我的环境下是这样：

```
unzip Monterey-Dark-inline.zip -d ~/.local/share/plank/themes/

```

然后，打开 “<ruby> Plank 偏好设置 <rt>  Plank preferences </rt></ruby>”，改成刚下载的主题。

我将我的风格改成 “Monterey -Dark inline”：

#### 添加 docklet 应用以增加更多特性

可以、把 docklet 应用当作 applet，但与它不同的是，没有太多选项。

想要添加或移除 docklet 应用，首先得需要打开 “<ruby> Plank 偏好设置 <rt>  Plank preferences </rt></ruby>”，然后访问 “Docklets” 菜单，列出可用选项：

现在，如果你想添加一些 docklet 应用，只需要把它们拖进停靠区即可：

但如果你想把添加的 docklet 应用移除出去呢？

简单，把它们从停靠区中拖拽出去就行了：

### 准备好使用 Budgie 了吗？

当然，为了方便起见，你可以安装已内置 Budgie 桌面环境的 Linux 发行版。

或者你还是可以选择在你现有的发行版（比如说 Ubuntu）中 [安装 Budgie](https://itsfoss.com/install-budgie-ubuntu/)：

>
> **[如何在 Ubuntu 上安装 Budgie](https://itsfoss.com/install-budgie-ubuntu/)**
>
>
>

在本教程中，我使用的是 Ubuntu 版本的 Budgie。无论你使用哪个发行版，这些步骤都适用于 Budgie 桌面。

? 你是怎么自定义你的 Budgie 桌面的呢？你想为这篇文章贡献更多内容吗？在下方评论区分享你的经验吧。

*（题图：MJ/44c073b0-b866-4eeb-b3e0-579d7afe0992）*

---

via: <https://itsfoss.com/budgie-customization/>

作者：[Sagar Sharma](https://itsfoss.com/author/sagar/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Drwhooooo](https://github.com/Drwhooooo) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1183 开发了四年的 NetBSD 10 接近发布

Summary:
? 开发了四年的 NetBSD 10 接近发布
? 好莱坞演员获得了人工智能保护措施
? 美议员提案禁止使用与中国有关的区块链技术
»
»

good

在BSD用户中，按数量排序是FreeBSD>OpenBSD>NetBSD>DragonflyBSD。最后一个是FreeBSD 4.x的fork，知名度相对较低。

来自广东广州的 Chrome Mobile 119.0|Android 10 用户

# 硬核观察 #1183 开发了四年的 NetBSD 10 接近发布

### 开发了四年的 NetBSD 10 接近发布

NetBSD 10 自 2019 年底开始开发，测试版已经发布了一年，而现在随着 NetBSD 10-RC1 的发布，它将在未来几个月内正式发布。NetBSD 10.0 增加了许多功能，包括对多核系统性能的显著提升、支持从 Apple M1 到树莓派 4 的多种 ARM 平台、支持 WireGuard、自动交换加密、Xen 虚拟机管理程序支持的重新设计，以及用于支持更新组件的无数其他硬件驱动程序改进。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/NetBSD-10-RC1)**
>
>
>

>
> 老王点评：虽然相比 Linux 来说用户不多，但是这几个 BSD 发行版总是给人更多选择和没那么商业化的感觉。
>
>
>

### 好莱坞演员获得了人工智能保护措施

在罢工近四个月后，这场好莱坞历史上持续时间最长的演员罢工以针对使用人工智能的 “突破性” 保护措施而告终。演员工会称，“我们在人工智能保护方面得到了我们想要的一切。”根据达成的协议，制片厂必须在知情同意的情况下，才能创建任何形式的演员或背景演员数字复制品，而背景演员的数字复制品也不会在未经其同意的情况下被 [使用](/article-16000-1.html)。

>
> **[消息来源：Rolling Stone](https://www.rollingstone.com/tv-movies/tv-movie-news/hollywood-actors-strike-sag-aftra-tentative-agreement-studios-1234838500/)**
>
>
>

>
> 老王点评：看起来演员们的职业生涯会获得延长了，但我觉得，不用多久，就会出现大量甚至全部演员都由 AI 演员出演的电影。
>
>
>

### 美议员提案禁止使用与中国有关的区块链技术

美国两党议员周三提出了一项新法案，旨在全面禁止美国政府使用任何与中国有关的区块链技术，甚至是加密货币。目前已经有许多与加密货币相关的法案正在讨论中，其中一些还包括对中国区块链技术的安全担忧。立法者称，该法案旨在“确保外国对手没有任何形式的后门访问权限，可以用来访问关键的国家安全情报和美国人的私人信息。”

>
> **[消息来源：Tom's Hardware](https://www.tomshardware.com/tech-industry/cryptocurrency/us-government-proposal-aims-to-outlaw-chinese-crypto-networks-blockchains)**
>
>
>

>
> 老王点评：无所谓嘛。在我看来，完全是过敏了。
>
>
>


你应该知道的主流开源数据库

中国也有很多开源数据库。翻译文章的时候，更加推广自己家的数据库！

来自江西南昌的 Chrome Mobile 118.0|Android 10 用户

# 你应该知道的主流开源数据库

<img src="content_image/album_202311_13_092356pzxmjf7xtfnqft5t.png" alt="" title="">

>
> 随着数据的飞速增长，数据的组织变得至关重要。本文将简要介绍当今软件开发中最流行的数据库。
>
>
>

在软件系统中，数据被格式化地组织和存储，通过数据库可以以电子方式访问它们。因为数据已经成为一种非常重要的资产，对我们来说，掌握当今使用的各种数据库的基本知识是非常重要的。

我们要看的第一个数据库是 MySQL。

### MySQL

[MySQL 官网](https://www.mysql.com/cn/)

MySQL 是使用最广泛的开源数据库管理系统之一。它由<ruby> 甲骨文公司 <rt>  Oracle Corporation </rt></ruby>所有。它可以在大多数主流操作系统上运行，如 Windows、MacOS、Linux 等。MySQL 既适用于小型应用，同时也能胜任大型应用。

#### 优点

* 适配各种操作系统
* 适配多种编程语言，如 PHP、C、C++、Perl 等
* 开源、免费
* 它支持高达 8 百万 Tb 的巨大数据量
* 可定制化
* 比其他数据库快得多

要在基于 Ubuntu 的计算机上安装并使用 MySQL，使用下面的命令：

```
$sudo apt update
$sudo apt install mysql-server
$sudo systemctl start mysql.service

```

### MariaDB

[MariaDB 官网](https://mariadb.org/)

MariaDB 是一款由 MySQL 的开发人员开发的开源关系型数据库，因其优秀的性能和与 MySQL 良好的兼容性而广受欢迎。它是当今大多数主要云产品的一部分，对其稳定性和性能起到重要作用。最近通过使用 Galera Cluster 技术，MariaDB 新增了集群功能。另外 MariaDB 还与 Oracle 数据库有（一定的）兼容性。

#### 优点

* 安装方便
* 支持大数据操作
* 高可扩展性
* 易于导入数据

要在基于 Ubuntu 的计算机上安装并使用 MariaDB，请使用以下命令:

```
$sudo apt update
$sudo apt install mariadb-server
$sudo systemctl start mariadb.service

```

### RethinkDB

[RethinkDB 官网](https://rethinkdb.com/)

RethinkDB 是一个开源、免费、分布式、基于文档的 NoSQL 数据库。它由 RethinkDB 公司开发。（LCTT 译注：RethinkDB 公司已于 2016 年倒闭。RethinkDB 数据库现作为开源项目继续维护。[消息来源](https://rethinkdb.com/blog/rethinkdb-shutdown/)）它可以存储具有动态模式的 JSON 文件。更重要的是，它可以将查询结果的实时更新推送给应用程序。由于它的分布式特性，它具有高度可扩展性。RethinkDB 提供了丰富的内置函数，使其成为一个高可用性的数据库。由于它是当今流行的数据库，学习如何使用它是很重要的。

#### 优点

* 适合于 Web 应用
* 易于扩展
* 内置函数多，可用性高
* 基于 JSON 动态文档

要在基于 Ubuntu 的计算机上使用 RethinkDB，下面的命令会有帮助：

```
# 添加软件仓库源
source /etc/lsb-release && echo "deb https://download.rethinkdb.com/repository/ubuntu-$DISTRIB_CODENAME $DISTRIB_CODENAME main" | sudo tee /etc/apt/sources.list.d/rethinkdb.list

# 下载并安装 RethinkDB 的 GPG 密钥
$wget -qO- https://download.rethinkdb.com/repository/raw/pubkey.gpg | sudo apt-key add -

$sudo apt update
$sudo apt-get install rethinkdb
$sudo systemctl start rethinkdb

```

### OrientDB

[OrientDB 官网](https://orientdb.org/)

OrientDB 是一个基于 Java 的开源 NoSQL 数据库管理系统。它支持多种数据模型，比如文档、字典、对象和图。它以图数据库的形式存储关系。下面的命令可以帮助你在 Ubuntu 机器上使用 OrientDB：

```
$sudo apt-get update
$wget -O orientdb-community-2.2.20.tar.gz http://orientdb.com/download.php?file=orientdb-community-2.2.20.tar.gz&os=linux
$tar -zxvf orientdb-community-2.2.20.tar.gz
$sudo mv ~/orientdb-community-2.2.20 /opt/orientdb

```

### CouchDB

[CouchDB 官网](https://couchdb.apache.org/)

CouchDB 是用 Erlang 开发的开源 NoSQL 数据库。它使用多种协议和格式来传输、处理和共享数据。它使用 JSON 格式存储数据，支持 MapReduce，并用 JavaScript 作为查询语言。

#### 优点

* 可以存储任何类型的数据
* 支持 MapReduce，可以高效地处理数据
* 整体结构非常简单
* 索引和检索速度快

下面的命令可以帮助你在 Ubuntu 机器上使用 CouchDB：

```
$echo "deb https://apache.bintray.com/couchdb-deb focal main" >> /etc/apt/sources.list
$sudo apt-get update
$sudo apt install apache2 couchdb -y

```

### Firebird

[Firebird 官网](https://firebirdsql.org/)

Firebird 是一个开源关系型数据库。它兼容所有操作系统，如 Linux、Windows 和 MacOS。它最初是从开源数据库 Interbase 派生而来的。

#### 优点

* 数据库功能不受限制
* 非常稳定，功能强大
* 配置和使用简单

以下命令可以帮助你在 Ubuntu 机器上使用 Firebird：

```
$sudo apt-get update
$sudo apt-get install firebird2.5-superclassic

```

### Cassandra

[Cassandra 官网](https://cassandra.apache.org/_/index.html)

Cassandra 是一个 Apache 基金会旗下的 NoSQL 数据库。它具有高度可扩展性、分布式、高性能的特点，可以很好地处理大量数据。其分布式的特性，使它没有单点故障。

#### 优点

* 高性能
* 高可扩展性
* 采用点对点架构

以下命令可以帮助你在 Ubuntu 机器上使用 Cassandra：

```
$curl https://www.apache.org/dist/cassandra/KEYS | sudo apt-key add -
$sudo apt-get update
$sudo apt-get install cassandra
$sudo systemctl enable cassandra
$sudo systemctl start cassandra

```

### PostgreSQL

[PostgreSQL 官网](https://www.postgresql.org/)

如今，PostgreSQL 是最流行的开源关系数据库管理系统之一。它易于扩展，同时还与 SQL 兼容。这个数据库管理系统经过了 30 多年的积极开发。

#### 优点

* 与 MySQL 相比，Postgres 可以存储更多种类的数据
* 支持几乎所有的 SQL 特性
* 高度可扩展

下面的命令可以帮助你在 Ubuntu 机器上使用 PostgreSQL：

```
$sudo apt-get update
$sudo apt-get install postgresql postgresql-contrib

```

### CockroachDB

[CockroachDB 官网](https://www.cockroachlabs.com/#)

CockroachDB 是一个为可靠性而生的数据库。它可以像<ruby> 蟑螂 <rt>  cockroach </rt></ruby>一样在灾难性的情况下顽强生存、蓬勃发展。它可以处理大量的数据。还可以构建多集群数据库。

#### 优点

* 很容易部署
* 高一致性
* 分布式事务
* 高可用性
* 兼容 SQL

### Redis

[Redis 官网](https://redis.io/)

Redis 是一个基于键值的开源 NoSQL 数据存储数据库。它支持各种类型的键，使用非常方便。

### 结语

我们已经浏览了最知名和最流行的开源数据库管理系统。了解这些不同的数据库非常有趣。尝试不同的选择，发现最适合你需求的数据库。另外，一定要查看这些数据库的官方文档。

*（题图：MJ/40ba9f14-5948-431a-a899-36c6b1ff4dfe）*

---

via: <https://www.opensourceforu.com/2022/09/are-you-familiar-with-these-popular-open-source-databases/>

作者：[Jishnu Saurav Mittapalli](https://www.opensourceforu.com/author/jishnu-saurav-mittapalli/) 选题：[lkxed](https://github.com/lkxed) 译者：[toknow-gh](https://github.com/toknow-gh) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


下一代 elementary OS 8 剧透

# 下一代 elementary OS 8 剧透

<img src="content_image/album_202311_13_154850fxab1f5lwnj5qwz5.png" alt="" title="">

>
> 你是否正在关注 elementary OS 8 的升级呢？接下来的信息你必须了解。
>
>
>

elementary OS 无疑是 [最美丽的 Linux 发行版](https://itsfoss.com/beautiful-linux-distributions/) 中的佼佼者。就在一个月之前，注重隐私保护的 [elementary OS 7.1](https://news.itsfoss.com/elementary-os-7-1/) 版本也发布了。

现在，通过最新的公告，我们对即将发布的 elementary OS 8 有了更全面的了解。

而且这一次，我们看起来可能会早一点体验到新的 elementary OS 版本。

让我们深入挖掘下吧！?

### elementary OS 8：一项雄心勃勃的尝试

**elementary OS 的开发者已经将目标转向** OS 8 系列，他们 **对此寄予了深厚的期待，看好其带来的大量结构性改变和升级**。

根据 elementary OS 8 的开发路线图，此次主要版本将以 **Ubuntu 24.04 的源代码库** 为基础构建，然而，目前的情况显示，我们至少需要 **等到 2024 年 4 月才能见到 OS 8 的发布**。

同时，他们也明确提到，他们设定了一些 **非常雄心勃勃的目标**，希望未来的 6 个月内就可以完成。不过，他们 **打算在 OS 8 完全准备就绪后再进行发布**。

那么，这些目标具体有哪些呢？

首先，他们计划默认实现对 [Wayland](https://wayland.freedesktop.org/) 的 **过渡**，这不算令人意外，因为我们已经看到许多主流发行版都在采用它。接下来便是 **延续 GTK 4 的过渡**，其中包含了一些目前处于开发最后阶段的核心应用。

此外，他们正处于 **设计新的快速设置菜单的初级阶段**，并且还明确表示，**此次发布会对他们的桌面环境 Pantheon 的设计进行重大改进**。

读到这里，你可能会产生一个问题；**那么，elementary OS 7 将会如何呢？**

开发者已经明确表示，**当前正在使用 OS 7 的用户从现在起可能会收到的更新会变少**，因为他们认为 OS 7 版本已经相当完善。

但是，所有以 Flatpak 包形式提供的应用还将继续定期接收更新，这当然也包括了许多 elementary OS 的核心应用。

想要了解更多信息，你可以参考 [官方公告](https://blog.elementary.io/lets-talk-os-8/)。如果你对 **elementary OS 8 的开发进度** 感兴趣，你可以在其 GitHub [项目看板](https://github.com/orgs/elementary/projects/128/views/1) 上进行关注。

**你是否想要尝试一下 elementary OS 8 的早期构建版本呢？**

好的，**基于 Ubuntu 24.04 源代码库的试验构建版** 现在就可以下载了！请记住，想要获取下载权限，**你需要成为 GitHub 上的赞助者**。

现在就可以前往官方的 [构建网站](https://builds.elementary.io/) 开始下载了。

>
> **[elementary OS 早期访问](https://builds.elementary.io/)**
>
>
>

? 你对此感到兴奋吗？欢迎在下方留言分享你的观点！

*（题图：MJ/e707c7c7-8d97-4f41-a955-cf455784493f）*

---

via: <https://news.itsfoss.com/elementary-os-8-dev/>

作者：[Sourav Rudra](https://news.itsfoss.com/author/sourav/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[译者ID](https://github.com/%E8%AF%91%E8%80%85ID) 校对：[校对者ID](https://github.com/%E6%A0%A1%E5%AF%B9%E8%80%85ID)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1184 等不及官方发布，创客制作了自己的树莓派 CM5

Summary:
? 等不及官方发布，创客制作了自己的树莓派 CM5
? 10 万块闲置的挖矿 GPU 被出租给人工智能负载
? 隐藏在 Python 混淆软件工具中的高入侵性后门
»
»

GPU就应该用来训练AI，挖矿不太环保，但是可以用其他形式来挖矿，甚至把AI和挖矿结合起来。比如贡献算力做成分布式AI训练，获得相应的token奖励。

刚看了freebuf的最新文章，这个pyobf*包是只能在Windows电脑执行恶意代码吗？Linux和Mac会中招吗？WSL会不会受到影响？

# 硬核观察 #1184 等不及官方发布，创客制作了自己的树莓派 CM5

### 等不及官方发布，创客制作了自己的树莓派 CM5

树莓派 5 已于上月发布，但创客们在等待有关 CM5 计算模块的消息。其中有一位创客决定不再等下去，而是从零开始制作了一块 “CM5”。这块定制的 PCB 板具有树莓派 CM4 的外形尺寸，但能够支持树莓派 5 的功率。这实际上不是 CM5，也不出售。事实上，它甚至不是一个 SBC，而更像是一个载板，能让树莓派 5 与 CM4 兼容的东西进行交互。

>
> **[消息来源：Tom's Hardware](https://www.tomshardware.com/raspberry-pi/raspberry-pi-projects/maker-creates-raspberry-pi-cm5-while-waiting-for-official-release)**
>
>
>

>
> 老王点评：创客们总是自己动手，丰衣足食。
>
>
>

### 10 万块闲置的挖矿 GPU 被出租给人工智能负载

加密货币热潮崩溃后，许多加密货币农场都留下了大量闲置的 GPU。一些公司设法为它们的 GPU 找到了其他用途，[Io.net](http://io.net/) 就开发了一个分布式网络，目前已经汇集了超过十万块 GPU，并将它们用于人工智能应用。该公司还使用 Solana 区块链技术管理其网络内的微交易，以便向 GPU 计算提供商付款。

>
> **[消息来源：Tom's Hardware](https://www.tomshardware.com/tech-industry/artificial-intelligence/107000-repurposed-crytpomining-gpus-up-for-rent-for-ai-workloads)**
>
>
>

>
> 老王点评：GPU 卡就是生产力，不能挖矿，还能挖 AI。
>
>
>

### 隐藏在 Python 混淆软件工具中的高入侵性后门

自今年 1 月以来，已有 8 个 Python 开发者工具包含了具有各种恶意功能的隐藏有效载荷。这几个恶意工具包的名字都以 “pyobf” 开头。它们都是混淆工具，开发人员可以用它来阻止逆向工程和篡改他们的代码。但是一旦被执行，这些恶意工具就会安装一个有效载荷，让攻击者几乎可以完全控制开发者的机器，包括窃取主机信息、浏览器密码、记录击键、加密勒索等操作。这些恶意工具已被 Python 程序员们安装了数千次。

>
> **[消息来源：Ars Technica](https://arstechnica.com/security/2023/11/developers-targeted-with-malware-that-monitors-their-every-move/)**
>
>
>

>
> 老王点评：想要保密代码反而中了招，反正你也看不懂加密混淆后的代码在做什么，真是十分切合场景。
>
>
>


看起来很不错

# 新款 Fedora Slimbook 14 加入 Fedora Slimbook 阵营

自从我们发布 Fedora Slimbook 笔记本电脑的公告到现在已经过去近一个月了。这只是我们和 Slimbook 之间的合作关系的开始，我们的目标是在更多的设备上预装 Fedora Linux 系统。目前我们已经收到了非常积极的反馈！剩下的，我们想要和大家分享更多来自我们硬件合作伙伴的新消息，我们希望你会觉得很兴奋。

### 介绍 Fedora Slimbook 14 英寸版

尽管 Fedora Slimbook 16 英寸版的性能很出色，但我们注意到许多消费者对于笔记本电脑的尺寸以及英伟达显卡的配置表示了担忧，他们希望有更小的选择。为了回应这些反馈，Slimbook 推出了更小尺寸的 Fedora Slimbook 14 英寸版，以满足这些消费者的需求。这款新型号的电脑仍然保持了 Fedora 品牌的标志，包括电脑后盖和超级键上的 Fedora 标志，并且预装了 Fedora Workstation 系统！

主要特性：

* 无英伟达 GPU：虽然将这一点作为特性有些奇怪，但对于那些希望享受 Fedora 完整体验、期望硬件全面兼容的消费者来说，这一点准没错。
* 英特尔 i7-12700H 处理器：能满足你所有的计算需求，性能出众。
* 99Wh 电池：超长电池寿命，让你在出门在外时也能保持高效。
* 轻便，只有 1.25 公斤：无论你去哪里，都可以轻松携带。
* 镁合金机身：外壳轻便且耐磨。
* 2880x1800 的屏幕分辨率：在高分辨率的显示屏上享受鲜明的视觉效果和细节。
* 99% 的 sRGB 色彩准确度：非常适合设计师，媒体和内容创作人员使用。

与 Fedora Slimbook 16 英寸版一样，每售出一台 Fedora Slimbook 14 英寸版，都会有 3% 的收益捐献给 GNOME 基金会。

我们希望 Fedora Slimbook 14 英寸版可以满足你对电源和便携性的需求，并且展示出你对 Fedora 的热爱！想了解更多信息，请访问 <https://fedora.slimbook.es/>。

### 折扣

Slimbook 针对 Fedora 社区推出了两种折扣！

为了庆祝 Fedora Linux 39 的发布，Slimbook 推出了针对两款 Fedora Slimbook 的 100 欧元折扣活动！当你选择结账的时候，你会发现这个折扣已经直接被应用上去了。这项优惠将在限定的时间中推出。

而且，如果你是 Fedora 项目的贡献者，还可以享受额外的 100 欧元折扣！关于如何获得这个折扣的更多信息，你可以点击 [这个社区博客文章](https://communityblog.fedoraproject.org/fedora-slimbook-contributor-discount/) 查阅。

在我们与 Slimbook 建立并发展这个伙伴关系的过程中，我们非常感谢他们的良好合作。我们致力于让 Linux 更广泛地应用于硬件设备上，我们希望这些新的公告能让你对 Fedora 的硬件合作伙伴计划感到兴奋！

---

via: <https://fedoramagazine.org/new-fedora-slimbook-14-joins-the-fedora-slimbook-16/>

作者：[Joseph Gayoso](https://fedoramagazine.org/author/joseph/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[译者ID](https://github.com/%E8%AF%91%E8%80%85ID) 校对：[校对者ID](https://github.com/%E6%A0%A1%E5%AF%B9%E8%80%85ID)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Git 的遴选和撤销操作是如何利用三路合并的

# Git 的遴选和撤销操作是如何利用三路合并的

<img src="content_image/album_202311_14_103134uddjt7ljl8dbbdj2.png" alt="" title="">

大家好！几天前，我尝试向其他人解释 Git 遴选（`git cherry-pick`）的工作原理，结果发现自己反而更混淆了。

我原先以为 Git 遴选是简单地应用一个补丁，但当我真正这样尝试时，却未能成功！

因此，接下来我们将谈论我原来以为的遴选操作（即应用一个补丁），这个理解为何不准确，以及实际上它是如何执行的（进行“三路合并”）。

尽管本文的内容有些深入，但你并不需要全部理解才能有效地使用 Git。不过，如果你（和我一样）对 Git 的内部运作感到好奇，那就跟我一起深入探讨一下吧！

### 遴选操作并不只是应用一个补丁

我先前理解的 `git cherry-pick COMMIT_ID` 的步骤如下：

* 首先是计算 `COMMIT_ID` 的差异，就如同执行 `git show COMMIT_ID --patch > out.patch` 这个命令
* 然后是将补丁应用到当前分支，就如同执行 `git apply out.patch` 这个命令

在我们详细讨论之前，我想指出的是，虽然大部分情况下这个模型是正确的，如果这是你的认知模型，那就没有问题。但是在一些细微的地方，它可能会错，我觉得这个疑惑挺有意思的，所以我们来看看它究竟是如何运作的。

如果我在存在合并冲突的情况下尝试进行“计算差异并应用补丁”的操作，下面我们就看看具体会发生什么情况：

```
$ git show 10e96e46 --patch > out.patch
$ git apply out.patch
error: patch failed: content/post/2023-07-28-why-is-dns-still-hard-to-learn-.markdown:17
error: content/post/2023-07-28-why-is-dns-still-hard-to-learn-.markdown: patch does not apply

```

这一过程无法成功完成，它并未提供任何解决冲突或处理问题的方案。

而真正运行 `git cherry-pick` 时的实际情况却大为不同，我遭遇到了一处合并冲突:

```
$ git cherry-pick 10e96e46
error: could not apply 10e96e46... wip
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git cherry-pick --continue".

```

因此，看起来 “Git 正在应用一个补丁”这样的理解方式并不十分准确。但这里的错误信息确实标明了 “无法**应用** 10e96e46”，这么看来，这种理解又不完全是错的。这到底是怎么回事呢？

### 那么，遴选到底是怎么执行的呢？

我深入研究了 Git 的源代码，主要是想了解 `cherry-pick` 是如何工作的，最终我找到了 [这一行代码](https://github.com/git/git/blob/dadef801b365989099a9929e995589e455c51fed/sequencer.c#L2353-L2358)：

```
res = do_recursive_merge(r, base, next, base_label, next_label, &head, &msgbuf, opts);

```

所以，遴选实际上就是一种……合并操作？这有些出乎意料。那具体都合并了什么内容？如何执行这个合并操作的呢？

我意识到我对 Git 的合并操作并不是特别理解，于是我上网搜索了一下。结果发现 Git 实际上采用了一种被称为 “三路合并” 的合并方式。那这到底是什么含义呢？

### Git 的合并策略：三路合并

假设我要合并下面两个文件，我们将其分别命名为 `v1.py` 和 `v2.py`。

```
def greet():
    greeting = "hello"
    name = "julia"
    return greeting + " " + name

```

```
def say_hello():
    greeting = "hello"
    name = "aanya"
    return greeting + " " + name

```

在这两个文件间，存在两处不同：

* `def greet()` 和 `def say_hello`
* `name = "julia"` 和 `name = "aanya"`

我们应该选择哪个呢？看起来好像不可能有答案！

不过，如果我告诉你，原始的函数（我们称之为 `base.py`）是这样的：

```
def say_hello():
    greeting = "hello"
    name = "julia"
    return greeting + " " + name

```

一切似乎变得清晰许多！在这个基础上，`v1` 将函数的名字更改为 `greet`，`v2` 将 `name = "aanya"`。因此，合并时，我们应该同时做出这两处改变：

```
def greet():
    greeting = "hello"
    name = "aanya"
    return greeting + " " + name

```

我们可以命令 Git 使用 `git merge-file` 来完成这次合并，结果正是我们预期的：它选择了 `def greet()` 和 `name = "aanya"`。

```
$ git merge-file v1.py base.py v2.py -p
def greet():
    greeting = "hello"
    name = "aanya"
    return greeting + " " + name⏎

```

这种将两个文件与其原始版本进行合并的方式，被称为 **三路合并**。

如果你想在线上试一试，我在 [jvns.ca/3-way-merge/](https://jvns.ca/3-way-merge/) 创建了一个小实验场。不过我只是草草制作，所以可能对移动端并不友好。

### Git 合并的是更改，而非文件

我对三路合并的理解是 —— Git 合并的是**更改**，而不是文件。我们对同一个文件做出两种不同的更改，Git 试图以合理的方式将这两种更改结合到一起。当两个更改都对同一行进行操作时，Git 可能会遇到困难，此时就会产生合并冲突。

Git 也可以合并超过两处的更改：你可以对同一文件有多达 8 处不同的更改，Git 会尝试将所有更改协调一致。这被称为八爪鱼合并，但除此之外我对其并不了解，因为我从未执行过这样的操作。

### Git 如何使用三路合并来应用补丁

接下来，让我们进入到一个有些出乎意料的情境！当我们讨论 Git “应用补丁”（如在变基 —— `rebase`、撤销 —— `revert` 或遴选 —— `cherry-pick` 中所做的）时，其实并非是生成一个补丁文件并应用它。相反，实际执行的是一次三路合并。

下面是如何将提交 `X` 作为补丁应用到你当前的提交，并与之前的 `v1`、`v2` 和 `base` 设置相对应：

1. **在你当前提交中**，文件的版本是 `v1`。
2. **在提交 X 之前**，文件的版本是 `base`。
3. **在提交 X 中**，文件的版本是 `v2`。
4. 执行 `git merge-file v1 base v2` 以合并它们（实际上，Git 并不直接执行 `git merge-file`，而是运行一个实现这个功能的 C 函数）。

总的来说，你可以将 `base` 和 `v2` 视为“补丁”，它们之间的差异就是你想要应用到 `v1` 上的更改。

### 遴选如何运作

假设我们有如下提交图，并且我们打算在 `main` 分支上遴选提交 `Y`：

```
A - B (main)
  \
   \
    X - Y - Z

```

那么，如何将此情景转化为我们前面提过的 `v1`、`v2` 和 `base` 组成的三路合并呢？

* `B` 是 `v1`
* `X` 是 `base`，而 `Y` 是 `v2`

所以，`X` 和 `Y` 共同构成了这个“补丁”。

其实，`git rebase` 无非就是重复多次执行 `git cherry-pick` 的过程。

### 撤销如何运作

现在，假如我们希望在如下的提交图上执行 `git revert Y`：

```
X - Y - Z - A - B

```

* `B` 是 `v1`
* `Y` 是 `base`，而 `X` 是 `v2`

这个过程反映的实际上就是遴选的情况，不过 `X` 和 `Y` 的位置颠倒了。我们需要这样做因为我们期望生成一个“反向补丁”。在 Git 中，撤销和遴选关系如此的紧密，它们甚至在同一个文件中实现：[revert.c](https://github.com/git/git/blob/dadef801b365989099a9929e995589e455c51fed/builtin/revert.c)。

### “三路补丁”是一个非常棒的技巧

使用三路合并将提交作为补丁应用的这个技巧非常巧妙且酷炫，我很惊讶之前从未听说过！我并未听过一个特定的名字来描述这种方法，但我更倾向于称之为“三路补丁”。

“三路补丁”的理念在于，你可以通过两个文件来定义补丁：在应用补丁前后的文件（在我们这篇文章中称之为 `base` 和 `v2`）。

因此，总体来看有三个文件被涉及到：一个是原文件，另外两个构成了补丁。

最重要的是，与普通补丁相比，三路补丁是一个更加高效的补丁方案，因为在有两个完整文件的情况下，你拥有更丰富的上下文信息来进行合并。

以下是我们例子中的常规补丁的大致情况：

```
@@ -1,1 +1,1 @@:
- def greet():
+ def say_hello():
    greeting = "hello"

```

而下面这就是一个三路补丁。不过，需要提醒的是这个“三路补丁”并不是一个真正的文件格式，这只是我自己提出的一种概念。

```
BEFORE: (the full file)
def greet():
    greeting = "hello"
    name = "julia"
    return greeting + " " + name
AFTER: (the full file)
def say_hello():
    greeting = "hello"
    name = "julia"
    return greeting + " " + name

```

### 《Building Git》 中提到了这点

James Coglan 的书籍 [《Building Git》](https://shop.jcoglan.com/building-git/) 是我在 Git 源码之外唯一找到的地方，他解释了 `git cherry-pick` 是如何在底层运用三路合并的（我原以为《Pro Git》可能会提及这个，但我并没能找到此话题的内容）。

我购买完这本书后发现，我早在 2019 年时就已经买过了，这对我来说真的是个很好的参考。

### Git 中的合并实际上比这更复杂

在 Git 中，合并不限于三路合并 —— 还有一种我不太理解的叫做“递归合并”，还有许多具体处理文件删除和移动的细节，同时也有多种合并算法。

如果想要了解更多相关知识，我最好的建议是阅读《Building Git》，尽管我还未完全阅读这本书。

### Git 应用到底做了什么？

我也参阅了 Git 的源代码，试图理解 `git apply` 的功能。它似乎（不出意外地）在 `apply.c` 中实现。这段代码解析了一个补丁文件，并通入目标文件来寻找应该在何处应用补丁。核心逻辑似乎在 [这里](https://github.com/git/git/blob/dadef801b365989099a9929e995589e455c51fed/apply.c#L2684)：思路好像是从补丁建议的行数开始，然后向前向后找寻。

```
	/*
	 * There's probably some smart way to do this, but I'll leave
	 * that to the smart and beautiful people. I'm simple and stupid.
	 */
	backwards = current;
	backwards_lno = line;
	forwards = current;
	forwards_lno = line;
	current_lno = line;
for (i = 0; ; i++) {
     ...

```

这个处理过程不禁让人觉得非常直白、与之前的期望相符。

### Git 三路应用的工作方式

`git apply` 命令中也有一个 `--3way` 参数，可以实现三路合并。因此，我们实际上可以通过如下方式，使用 `git apply` 来大体实现 `git cherry-pick` 的功能：

```
$ git show 10e96e46 --patch > out.patch
$ git apply out.patch --3way
Applied patch to 'content/post/2023-07-28-why-is-dns-still-hard-to-learn-.markdown' with conflicts.
U content/post/2023-07-28-why-is-dns-still-hard-to-learn-.markdown

```

但要注意，参数 `--3way` 并不只用到了补丁文件的内容！补丁文件开始的部分是:

```
index d63ade04..65778fc0 100644

```

`d63ade04` 和 `65778fc0` 是旧/新文件版本在 Git 对象数据库中的 ID，因此 Git 可以用这些 ID 来执行三路补丁操作。但如果有人将补丁文件通过邮件发送给你，而你并没有新/旧版本的文件，就无法执行这个操作：如果你缺少 blob，将会出现如下错误：

```
$ git apply out.patch
error: repository lacks the necessary blob to perform 3-way merge.

```

### 三路合并有点历史了

有一部分人指出，三路合并比 Git 的历史还要久远，它起源于 70 年代末期左右。有一篇 2007 年的 [论文](https://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf) 对此进行了讨论。

### 就说这么多！

我真的对于我对于 Git 内部应用补丁的核心方法其实理解得并不深入这一点感到非常吃惊——学习这一点真的很酷！

虽然我对 Git 用户界面存在 [诸多不满](https://jvns.ca/blog/2023/11/01/confusing-git-terminology/)，但是这个特定问题并不包含在内。三路合并似乎是统一解决一系列不同问题的优雅方式，它对于人们来说也很直观（“应用一个补丁”这个想法是许多编程者都习以为常的思考模式，而它底层实现为三路合并的细节，实际上没有人真正需要去思考）。

*我顺便快速推荐一下：我正在写一部有关 Git 的 [zine](https://wizardzines.com)，如果你对它的发布感兴趣，你可以注册我非常不频繁的 [公告邮件列表](https://wizardzines.com/zine-announcements/)。*

*（题图：MJ/321bc2c9-4363-4661-802a-c74fb6a721b2）*

---

via: <https://jvns.ca/blog/2023/11/10/how-cherry-pick-and-revert-work/>

作者：[Julia Evans](https://jvns.ca/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[ChatGPT](https://linux.cn/lctt/ChatGPT) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Linux 爱好者线下沙龙：LLUG 2023·西子湖畔相见

Summary: 走走停停，最终还是走到了西子湖畔。在这个冬日，LLUG 与你在杭州线下相见。

没有报名链接呀

老王啥时候来西安啊？

这只是预告，下次推送发报名表单，欢迎来玩~

目前还不知道呢~

走走停停，最终还是走到了西子湖畔。在这个冬日，LLUG 与你在杭州线下相见。

# Linux 爱好者线下沙龙：LLUG 2023·西子湖畔相见

>
> 走走停停，最终还是走到了西子湖畔。在这个冬日，LLUG 与你在杭州线下相见。
>
>
>

11 月 25 日，**LLUG 杭州场将在杭州未来科技城国际人才园（五常地铁站附近）**举办。

本次活动依然由 Linux 中国和龙蜥社区（OpenAnolis）联合主办，杭州 GDG 协办，杭州城西科创大走廊高层次人才联合会提供场地支持。

> 龙蜥社区（OpenAnolis）是国内的顶尖 Linux 发行版社区，我们希望在普及 Linux 知识的同时，也能让中国的 Linux 发行版，为更多人知晓，推动国产发行版的发展和进步。

> 杭州城西科创大走廊高层次人才联合会简称“高联会”，高联会是在杭州城西科创大走廊管委会指导下，旨在广泛吸纳与团结廊内高层次人才，助力人才在杭州城西科创大走廊的创新创业。

> 杭州 GDG（杭州谷歌开发者社区），谷歌官方赞助的杭州本地技术社区，每年定期举办免费开发者线下技术沙龙，聚焦谷歌相关开源技术，欢迎大家关注微信公众号“杭州GDG”，了解我们，参与技术交流。

*成都场现场照片*

*深圳场现场照片*

*上海场现场照片*

本次活动，我们将设常规的技术分享、动手实践和闪电演讲三种不同分享的形态。

* 技术分享会邀请来自 Linux 社区的开发者，分享自己在 Linux 中的技术实践，并配合 Q&A 的环节，帮助大家理解技术难点和实践，如果你有经验和实践想要分享给大家，欢迎报名分享
* 动手实践则会有来自各厂商的 Linux 大咖，带着大家用半个小时的时间来动手实践一个 Linux 主题，帮助大家动手体验 Linux 的种种新特性、特定的能力。
* 闪电演讲则不设定主题，每个人有 5 分钟时间来分享自己与 Linux、技术、开源有关的话题，共计 6 个闪电演讲名额，想要试试锻炼自己的演讲能力，不妨从闪电演讲开始。

欢迎大家扫码加入 LLUG 杭州分群，在群里为活动提出你的建议～

此外，如果你对分享感兴趣，欢迎填写下方问卷来提交你的议题，向开发者们分享你的研究、实践和经验：<https://jinshuju.net/f/VJkeMZ>

*（题图：MJ/8f5c79b3-5531-4e49-872d-ddb79266600a）*


硬核观察 #1185 宇宙射线可以导致 SSH 私钥被窃取

Summary:
? 宇宙射线可以导致 SSH 私钥被窃取
? 苹果公司拿走了 1/3 的 Safari 上的谷歌搜索广告收入
? 谷歌起诉涉嫌发布植入恶意软件的山寨版 Bard 的骗子
»
»

ed25519应该不会受到影响吧？我早就不用RSA了，就是因为认为不够安全。

# 硬核观察 #1185 宇宙射线可以导致 SSH 私钥被窃取

### 宇宙射线可以导致 SSH 私钥被窃取

研究人员发现，可以观察到 SSH 签名生成过程中意外或自然发生的计算错误，并利用这些错误来计算 SSH 服务器的本应保密的密钥私钥。所谓自然发生的错误，指的是宇宙射线和其他会翻转比特的小故障造成的错误；而所谓意外发生的错误，指的是 RSA 签名生成算法执行不力。如果你监控了足够多的到易受攻击的 SSH 服务器的连接，你最终会发现一个可以利用的漏洞。研究人员检查了过去七年扫描互联网收集的 10 亿个使用了 RSA 算法的签名。在这些签名中，有百万分之一的主机私钥会被暴露。

>
> **[消息来源：The Register](https://www.theregister.com/2023/11/14/passive_ssh_key_compromise/)**
>
>
>

>
> 老王点评：所以，加密算法还得防着宇宙射线的攻击。
>
>
>

### 苹果公司拿走了 1/3 的 Safari 上的谷歌搜索广告收入

谷歌和苹果公司早在 2002 年就建立了合作关系，谷歌成为苹果 Safari 浏览器的默认搜索引擎，过去几年谷歌每年为此向苹果支付了数十亿美元。在诉谷歌反垄断案审判中，谷歌的经济学家在法庭上意外披露了用户通过 Safari 浏览器使用谷歌搜索产生的广告收入，其中 36% 会支付给苹果公司。谷歌和苹果公司都曾反对公开披露双方协议的细节。

>
> **[消息来源：彭博社](https://www.bloomberg.com/news/articles/2023-11-13/apple-gets-36-of-google-revenue-from-search-deal-witness-says)**
>
>
>

>
> 老王点评：好家伙，浏览器可真是个摇钱树啊。
>
>
>

### 谷歌起诉涉嫌发布植入恶意软件的山寨版 Bard 的骗子

谷歌起诉称，越南的一些人一直在建立社交媒体页面并发布广告，鼓励用户下载一个 “Bard”，但这个版本的 “Bard” 并不能提供如何烹饪意大利烩饭之类的有用答案。一旦某个傻瓜下载了这个 “Bard”，它就会侵入系统并窃取密码和社交媒体凭证。诉讼指出，这些骗子特别将 Facebook 作为他们的首选传播方式。

>
> **[消息来源：Engadget](https://www.engadget.com/google-sues-scammers-that-allegedly-released-a-malware-filled-bard-knockoff-162222150.html)**
>
>
>

>
> 老王点评：这是把免费服务当成恶意软件的载体了，不过我觉得比起来今天圈内将开源 LLaMA “改成” 自己的开源大模型的大瓜，也算不了什么。
>
>
>


这儿几个字节，那里几个字节，我们说的是真正的内存

Summary: 今天的帖子来自于最近的 Go 语言的一次小测试

今天的帖子来自于最近的 Go 语言的一次小测试

# 这儿几个字节，那里几个字节，我们说的是真正的内存

今天的帖子来自于最近的 Go 语言的一次小测试，观察下面的测试基础片段    [1] ：

```
func BenchmarkSortStrings(b *testing.B) {
        s := []string{"heart", "lungs", "brain", "kidneys", "pancreas"}
        b.ReportAllocs()
        for i := 0; i < b.N; i++ {
                sort.Strings(s)
        }
}

```

`sort.Strings` 是 `sort.StringSlice(s)` 的便捷包装器，`sort.Strings` 在原地对输入进行排序，因此不会分配内存（或至少 43% 回答此问题的 Twitter 用户是这么认为的）。然而，至少在 Go 的最近版本中，基准测试的每次迭代都会导致一次堆分配。为什么会是这种情况？

正如所有 Go 程序员应该知道的那样，接口是以 [双词结构](https://research.swtch.com/interfaces) 实现的。每个接口值包含一个字段，其中保存接口内容的类型，以及指向接口内容的指针。   [2]

在 Go 语言伪代码中，一个接口可能是这样的：

```
type interface struct {
        // the ordinal number for the type of the value
        // assigned to the interface
        type uintptr

        // (usually) a pointer to the value assigned to
        // the interface
        data uintptr
}

```

`interface.data` 可以容纳一个机器字（在大多数情况下为 8 个字节），但一个 `[]string` 却需要 24 个字节：一个字用于指向切片的底层数组；一个字用于存储切片的长度；另一个字用于存储底层数组的剩余容量。那么，Go 是如何将 24 个字节装入个 8 个字节的呢？通过编程中最古老的技巧，即间接引用。一个 `[]string`，即 `s`，需要 24 个字节；但 `*[]string` —— 即指向字符串切片的指针，只需要 8 个字节。

### 逃逸到堆

为了让示例更加明确，以下是重新编写的基准测试，不使用 `sort.Strings` 辅助函数：

```
func BenchmarkSortStrings(b *testing.B) {
        s := []string{"heart", "lungs", "brain", "kidneys", "pancreas"}
        b.ReportAllocs()
        for i := 0; i < b.N; i++ {
                var ss sort.StringSlice = s
                var si sort.Interface = ss // allocation
                sort.Sort(si)
        }
}

```

为了让接口正常运行，编译器将赋值重写为 `var si sort.Interface = &ss`，即 `ss` 的地址分配给接口值。   [3]  我们现在有这么一种情况：出现一个持有指向 `ss` 的指针的接口值。它指向哪里？还有 `ss` 存储在哪个内存位置？

似乎 `ss` 被移动到了堆上，这也同时导致了基准测试报告中的分配：

```
Total:    296.01MB   296.01MB (flat, cum) 99.66%
      8            .          .           func BenchmarkSortStrings(b *testing.B) {
      9            .          .           	s := []string{"heart", "lungs", "brain", "kidneys", "pancreas"}
     10            .          .           	b.ReportAllocs()
     11            .          .           	for i := 0; i < b.N; i++ {
     12            .          .           		var ss sort.StringSlice = s
     13     296.01MB   296.01MB           		var si sort.Interface = ss // allocation
     14            .          .           		sort.Sort(si)
     15            .          .           	}
     16            .          .           }

```

发生这种分配是因为编译器当前无法确认 `ss` 比 `si` 生存期更长。Go 编译器开发人员对此的普遍态度是，觉得 [这个问题改进的余地](https://github.com/golang/go/issues/23676)，不过我们另找时间再议。事实上，`ss` 就是被分配到了堆上。因此，问题变成了：每次迭代会分配多少个字节？为什么不去询问 `testing` 包呢？

```
% go test -bench=. sort_test.go
goos: darwin
goarch: amd64
cpu: Intel(R) Core(TM) i7-5650U CPU @ 2.20GHz
BenchmarkSortStrings-4          12591951                91.36 ns/op           24 B/op          1 allocs/op
PASS
ok      command-line-arguments  1.260s

```

可以看到，在 amd 64 平台的 Go 1.16 beta1 版本上，每次操作会分配 24 字节。   [4]  然而，在同一平台先前的 Go 版本中，每次操作则消耗了 32 字节。

```
% go1.15 test -bench=. sort_test.go
goos: darwin
goarch: amd64
BenchmarkSortStrings-4          11453016                96.4 ns/op            32 B/op          1 allocs/op
PASS
ok      command-line-arguments  1.225s

```

这引出了本文的主题，即 Go 1.16 版本中即将推出的一项便利改进。不过在讨论这个内容之前，我需要聊聊 “<ruby> 尺寸类别 <rt>  size class </rt></ruby>”。

### 尺寸类别

在解释什么是 “<ruby> 尺寸类别 <rt>  size class </rt></ruby>” 之前，我们先考虑个问题，理论上的 Go 语言在运行时是如何在其堆上分配 24 字节的。有一个简单的方法：追踪目前为止已分配到的所有内存的动向——利用指向堆上最后分配的字节的指针。分配 24 字节，堆指针就会增加 24，然后将前一个值返回给调用函数。只要写入的请求 24 字节的代码不超出该标记的范围，这种机制就没有额外开销。不过，现实情况下，内存分配器不仅要分配内存，有时还得释放内存。

最终，Go 语言程序在运行时将释放这些 24 字节，但从运行的视角来看，它只知道它给调用者的开始地址。它不知道从该地址起始之后又分配了多少字节。为了允许释放内存，我们假设的 Go 语言程序运行时分配器必须记录堆上每个分配的长度值。那么这些长度值的分配存储在何处？当然是在堆上。

在我们的设想中，当程序运行需要分配内存的时候，它可以请求稍微多一点，并把它用来存储请求的数量。而对于我们的切片示例而言，当我们请求 24 字节时，实际上会消耗 24 字节加上存储数字 `24` 的一些开销。这些开销有多大？事实上，实际上的最小开销量是一个字。   [5]

用来记录 24 字节分配的开销将是 8 字节。25% 不是很大，但也不算糟糕，随着分配的大小增加，开销将变得微不足道。然而，如果我们只想在堆上存储一个字节，会发生什么？开销将是请求数据量的 8 倍！是否有一种更高效的方式在堆上分配少量内存？

与其在每个分配旁边存储长度，不如将相同大小的内容存储在一起，这个主意如何？如果所有的 24 字节的内容都存储在一起，那么运行时会自动获取它们的大小。运行时所需要的是一个单一的位，指示 24 字节区域是否在使用中。在 Go 语言中，这些区域被称为 Size Classes，因为相同大小的所有内容都会存储在一起（类似学校班级，所有学生都按同一年级分班，而不是 C++ 中的类）。当运行时需要分配少量内存时，它会使用能够容纳该分配的最小的尺寸类别。

### 无限制的尺寸类别

现在我们知道尺寸类别是如何工作的了，那么问题又来了，它们存储在哪里？和我们想的一样，尺寸类别的内存来自堆。为了最小化开销，运行时会从堆上分配较大的内存块（通常是系统页面大小的倍数），然后将该空间用于单个大小的分配。不过，这里存在一个问题————

将大块区域用于存储同一大小的事物的模式很好用    [6] ，如果分配大小的数量是固定的，最好是少数几个。那么在通用语言中，程序可以要求运行时以任何大小分配内存   [7] 。

例如，想象一下向运行时请求 9 字节。9 字节是一个不常见的大小，因此可能需要一个新的尺寸类别来存储 9 字节大小的物品。因为 9 字节大小的物品不常见，所以分配的其余部分（通常为 4KB 或更多）可能会被浪费。由于尺寸类别的集合是固定的，如果没有精确匹配的 size class 可用，分配将并入到下一个尺寸类别。在我们的示例中，9 字节可能会在 12 字节的尺寸类别中分配。未使用的 3 字节的开销要比几乎未使用的整个尺寸类别分配好。

### 总结一下

这是谜题的最后一块拼图。Go 1.15 版本没有 24 字节的尺寸类别，因此 `ss` 的堆分配是在 32 字节的尺寸类别中分配的。由于 Martin Möhrmann 的工作，Go 1.16 版本有一个 24 字节的尺寸类别，非常适合分配给接口的切片值。

### 相关文章

1. [我在 Devfest 2017年西伯利亚大会谈 Go 语言](https://dave.cheney.net/2017/08/23/im-talking-about-go-at-devfest-siberia-2017)
2. [如果对齐的内存写操作是原子性的，为什么我们还需要 sync/atomic 包呢？](https://dave.cheney.net/2018/01/06/if-aligned-memory-writes-are-atomic-why-do-we-need-the-sync-atomic-package)
3. [为你的树莓派创建一个真实的串行控制台](https://dave.cheney.net/2014/01/05/a-real-serial-console-for-your-raspberry-pi)
4. [为什么 Go 语言线程的栈是无限制的？](https://dave.cheney.net/2013/06/02/why-is-a-goroutines-stack-infinite)

*（题图：MJ/01d5fe46-778f-48fe-9481-162f4d0289dc）*

---

1. 这不是正确的对排序函数进行基准测试的方式，因为在第一次迭代之后，输入已经排序。但这又是另外一个话题了。 [↩](#fnref1)
2. 此语句的准确性取决于所使用的 Go 版本。例如，Go 1.15 版本添加了直接将一些 [整数存储在接口值](https://golang.org/doc/go1.15#runtime) 中的功能，从而节省了分配和间接性。然而，对于大多数值来说，如果它不是指针类型，它的地址将被取出并存储在接口值中。 [↩](#fnref2)
3. 编译器在接口值的类型字段中跟踪了这种手法，因此它记住了分配给 `si` 的类型是 `sort.StringSlice` 而不是 `*sort.StringSlice`。 [↩](#fnref3)
4. 在 32 位平台上，这个数字减半，[但我们不再关注它](https://www.tallengestore.com/products/i-never-look-back-darling-it-distracts-from-the-now-edna-mode-inspirational-quote-tallenge-motivational-poster-collection-large-art-prints)。 [↩](#fnref4)
5. 如果你准备限制分配为 4G 或者可能是 64KB，你可以使用较少内存来存储分配的尺寸，但实际上使用小于一个字来存储长度标头的节省会受到填充的影响。 [↩](#fnref5)
6. 将相同大小的物品存储在一起也是一种有效的对抗碎片化的策略。 [↩](#fnref6)
7. 这并不是一个不切实际的设想，字符串有各种形状和大小，生成以前未见过的大小的字符串可能就像附加空格一样简单。 [↩](#fnref7)

---

via: <https://dave.cheney.net/2021/01/05/a-few-bytes-here-a-few-there-pretty-soon-youre-talking-real-memory>

作者：[Dave Cheney](https://dave.cheney.net/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Drwhooooo](https://github.com/Drwhooooo) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Summary:
? 每月 5 美元的虚拟机性能超过了 30 年前的第三快的超算
? Canonical 发布快速部署全功能私有云的 MicroCloud
? DeepMind 能更快更准确地预测极端天气
»
»

首先，你得有40年的天气电子数据。

欧洲中期天气预报中心也使用了华为的盘古气象大模型进行预报实验，10天全球预测，官网公开发布

# 硬核观察 #1186 每月 5 美元的虚拟机性能超过了 30 年前的第三快的超算

### 每月 5 美元的虚拟机性能超过了 30 年前的第三快的超算

今年是全球公开的最快超级计算机 TOP500 排行榜发布 30 周年。1993 年，当时的超算榜首是位于日本国家航空航天实验室的富士通数值风洞，该系统拥有多达 140 个 CPU 内核，可实现 124 gigaFLOPS 的双精度性能。有人做了一个有趣的测试，结果表明，每月只需要 5 美元的单个 vCPU 线程的虚拟机可以与 1993 年排名第三的超级计算机明尼苏达超级计算中心相抗衡，而该系统拥有 544 个 SuperSPARC 处理器。如果升级到 4 个 vCPU 虚拟机，就可以击败当年的榜首，每个月仅需要花费 48 美元。

>
> **[消息来源：The Register](https://www.theregister.com/2023/11/14/five_dollar_supercomputer/)**
>
>
>

>
> 老王点评：不算意外，只是有些吃惊。不敢想象三十年后计算机能强大到什么程度，或许地球会爆炸吧。
>
>
>

### Canonical 发布快速部署全功能私有云的 MicroCloud

Canonical 公司今天发布了最新的软件产品 MicroCloud，它的目标是在 Ubuntu Linux 上轻松部署一个 “几分钟内就能实现全功能云” 的私有云。他们宣传自己的私有云部署就像使用 Snap 命令一样简单。其代码以 AGPL-3.0 许可托管在 GitHub 上。据介绍，MicroCloud 至少需要三台机器，目前可扩展到 50 台机器。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Canonical-Ubuntu-MicroCloud)**
>
>
>

>
> 老王点评：现在看起来，私有云有公有云不可比拟的好处，最起码重启起来比较快~
>
>
>

### DeepMind 能更快更准确地预测极端天气

根据一份研究，谷歌 DeepMind 的模型 GraphCast 能够提前 10 天预测天气状况，比目前的黄金标准更准确、更快速。在 1300 多个测试区域中，GraphCast 在 90% 以上的测试中都优于欧洲中期天气预报中心的模型。最重要的是，GraphCast 还能比标准模型更早地为气象学家提供有关极端气温和气旋路径等情况的准确预警。GraphCast 使用图神经网络，将地球表面映射成 100 多万个网格点。它不使用物理方程，而是根据四十年的历史天气数据进行预测，可以利用机器学习在一分钟内完成这些计算。

>
> **[消息来源：Technology Review](https://www.technologyreview.com/2023/11/14/1083366/google-deepminds-weather-ai-can-forecast-extreme-weather-quicker-and-more-accurately/)**
>
>
>

>
> 老王点评：没想到不是超算，而是人工智能拯救了天气预测难题。
>
>
>


每月 5 美元的虚拟机可以跻身 1993 年的超算前三

Summary: 当然，如果你真的关注性能，市面上自然有更出色的选择。

当然，如果你真的关注性能，市面上自然有更出色的选择。

# 每月 5 美元的虚拟机可以跻身 1993 年的超算前三

<img src="content_image/album_202311_16_000750tl6lelevnlxlxn8e.png" alt="" title="">

>
> 当然，如果你真的关注性能，市面上自然有更出色的选择。
>
>
>

今年是 TOP500 公开排名全球最快超级计算机 30 周年。

为纪念这个重要的里程碑，也因应科罗拉多州正在举行的年度超级计算大会，我们想弄个有趣但稍显愚蠢的实验：看看以今天技术，我们能以多低的成本重现 1993 年超级计算机十强的性能。于是，我们在云上运行了几台虚拟机，并对 HPLinpack 基准进行了编译测试。这里简单透露一下：我们这项实验的结果，你可能并不会太震惊。

到 1993 年年末，最快的超级计算机是日本国家航空实验室的富士通数值风洞。这台装备了 140 个 CPU 核心的系统，能够实现 124 GigaFLOPS 的双精度（FP64）计算能力。

如今，我们的系统已经 [突破](https://www.theregister.com/2022/05/30/us_frontier_supercomputer_ousts_japans/) 了 exaFLOPS 的难关，然而在 [1993 年 11 月](https://www.top500.org/lists/top500/1993/11/)，如何在功率最高的十个系统中占据一席之地呢？只要你的 FP64 性能超过了美国 [CM-5/544](https://www.top500.org/system/167021/) 机型的 15.1 GigaFLOPS。因此，我们设定的目标是让云虚拟机超过 15 GigaFLOPS 的性能。

在我们分析结果之前，有几点值得一提。如果我们选用了支持 GPU 的实例，我们知道我们能够达到更高的性能。不过，云端的 GPU 实例租赁并不便宜，并且在 2000 年年中至年底，GPU 才真正开始广泛出现在 TOP500 的超级计算机中。此外，在 CPU 上运行 Linpack 比在 GPU 上运行要容易得多。

这些测试只是为了纪念 30 周年，只是稍微有点新颖，决不具有科学严谨或详尽无遗的特征。

### 一台 5 美元的云虚拟机对比一部 30 年前的 TOP500 超级计算机

但在开始测试前，我们需要开启一对 VPC。在本次测试中，我们选择在 Vultr 上运行 Linpack，但其实在 AWS，Google Cloud，Azure，Digital Ocean 或者是你喜欢的任何云服务商上，这都同样适用。

首先，我们启动了一个月费 5 美元的虚拟机实例，它具备了一个共享的 vCPU，1GB 的内存和 25GB 的存储。准备就绪后，我们便启动了 Linpack 的编译。

在这，事情可能会有些复杂，因为我们实际上可以对系统进行一些调优，挤出一些额外的 FLOPS。然而，考虑到这只是一个测试，也为了尽可能保持简单，我们选择了依照 [这个指南](https://gist.github.com/Levi-Hope/27b9c32cc5c9ded78fff3f155fc7b5ea) 进行操作。此份操作手册是基于 Ubuntu 18.04 编写的，但是我们发现在 20.04 LTS 上运行也一切正常。

为了产生我们的 HPL.dat 文件，我们利用了一个巧妙的 [表单](https://www.advancedclustering.com/act_kb/tune-hpl-dat-file/)，它会自动产生一个优化版的 Linpack 运行配置。

我们对几种不同类型的虚拟机进行了三次基准测试，并从每次运行中挑选出最高的得分。以下就是我们的发现：

| 实例类型 | vCPU | RAM (MB) | 存储 (GB) | Rmax GFLOPS | 每月费用 (美元) |
| --- | --- | --- | --- | --- | --- |
| Regular shared | 1 | 1024 | 25 | 31.21 | 5 |
| Premium shared | 1 | 1024 | 25 | 51.85 | 6 |
| Premium shared | 2 | 2048 | 60 | 87.46 | 18 |
| Premium shared | 4 | 8192 | 180 | 133.42 | 48 |

从我们的测试结果可以看出，一个单一的共享 vCPU 在与 1993 年 11 月十大超级计算机的比较中表现出颇为出色的性能。

我们通过一个 CPU 线程就获得了 31.21 GigaFLOPS 的 FP64 性能，这使得我们的虚拟机与 1993 年排名第三的超级计算机 —— 明尼苏达超级计算中心的 30.4 GigaFLOPS [CM-5/554](https://www.top500.org/system/167059/) Thinking Machines 系统相提并论。这确实令人吃惊，因为那台系统拥有 544 个 SuperSPARC 处理器，而我们的系统只有一个 CPU 线程，虽然我们的系统运行在更高的时钟速度下。

如你从上面的图表中所见，每月多花 1 美元，我们的性能跃升至 51.85 GigaFLOPS，而选择一个价值 18 美元的“高级”共享 CPU 实例，双线程使我们进一步接近 87.46 GigaFLOPS 的性能。

然而，要超过 [富士通的数值风洞](https://www.top500.org/system/173279/)，我们需要升级到四个 vCPU 的虚拟机，由此我们抓取到了 133 GigaFLOPS 的 FP64 性能。然而不幸的是，升级到四个线程的费用跳到了每月 48 美元。达到这个价格，Vultr 实际上是在销售部分 GPU，我们预计如果采用 GPU，性能应会有显著提升，效率也会更高。

### 更好的选择

我们需要明确的是，这些都是我们选择的共享类型实例。一般来说，共享实例意味着在一定程度上进行了超额配置。

由于共享实例可能会受到其他租户的影响，这也使得性能有时难以预知，甚至每次运行的性能都可能略有不同，这主要取决于云区域中主机系统的载荷状态。

在我们的非常不科学的测试中，我们并未观察到太多的性能变化。我们想这可能是因为核心并未处在过高的负载下。在专有 CPU 实例上进行同样的测试，结果与我们每月 6 美元的共享实例相若，但成本高达五倍。

但是，除了这场小实验的新奇趣味之外，这没太多实际意义。如果你需要在短时间内获得大量 FLOPS，有许多已优化的 CPU 和 GPU 实例可供选择。它们的成本无法与每月 5 美元的实例相媲美，然而大多数实例是按小时账单的，因此实际成本将取决于你完成工作的迅速程度。

此外，让我们不要忘记，你的智能手机与这些存在已久的 30 年老计算系统相比，又会有怎样的对比呢？

*（题图：MJ/16cf957e-a4e4-43b1-99b2-df0574a064dc）*

---

via: <https://www.theregister.com/2023/11/14/five_dollar_supercomputer/>

作者：[Tobias Mann](https://www.theregister.com/Author/Tobias-Mann) 译者：[ChatGPT](https://linux.cn/lctt/ChatGPT) 校对：[wxy](https://github.com/wxy)


真的，宇宙射线会导致部分 SSH 服务器的私钥泄露

# 真的，宇宙射线会导致部分 SSH 服务器的私钥泄露

<img src="content_image/album_202311_16_115713c1i4nfkv3w1n1gb3.png" alt="" title="">

>
> 如果你是 OpenSSL、LibreSSL、OpenSSH 的用户，你可以坐下来看看了，因为这不会影响你。
>
>
>

最近一项学术研究展示了如下情况：对于某些特定设备，他人可以监听其 SSH 连接，然后借助一些运气在无声无息中破译出主机的私有 RSA 密钥，从而冒充该设备。

冒充这些设备后，通过使用推断出的主机密钥私钥实施的中间人攻击，间谍可以安静地记录用户的登录信息，同时，通过将这些连接转发给真正的设备，他们还可以监控用户在远程 SSH 服务器上的活动。尽管 SSH 还有其他功能，但其主要应用场景仍然是用户登录到设备并通过命令行接口进行控制。

据悉，可以通过被动监视从客户端到易受攻击设备的 SSH 服务器的连接，获得主机的 RSA 密钥私钥：无论是在签名生成过程中的偶发运算错误，还是因宇宙射线等微小故障产生的自然错误，都可以被观察和利用来推算 SSH 服务器的主机密钥私钥，这本应是保密的。

虽然可能认为自然错误发生的概率很小，偶发错误可能已为众所周知，但实际上只要你连续观察足够多的到有漏洞的 SSH 服务器的 SSH 连接，你就有可能发现一个你可以利用的。

重要的一点是，软件库 OpenSSL 和 LibreSSL，以及 OpenSSH，都未发现存在上述密钥推导问题的漏洞。由此，我们认为，网上的大部分设备、服务器和其他设备都不会受到影响，只有特定的物联网设备和类似的嵌入式设备可能会对此种攻击敏感。此外，这种问题也仅影响 RSA 密钥。

### 细节

由加利福尼亚大学圣地亚哥分校的 Keegan Ryan、Kaiwen He（他同时也在麻省理工学院任职）、George Arnold Sullivan 以及 Nadia Heninger 基于早期的一些研究，完成并撰写了这项研究。他们采用的技术，旨在揭示 RSA 密钥私钥，该技术源于 Florian Weimer 在 2015 年对 TLS 的突破性研究，以及 2022 年圣地亚哥论文的几位作者以及其他研究者的一些工作，这些工作可追溯到 1990 年代。

信息安全专家 Thomas Ptacek 曾高度赞扬了 2023 年研究的合著者 Nadia Heninger，并在此分享了 RSA 密钥分析论文的摘要，以便于理解这个问题。我们同时也要感谢曾在 Register vulture 工作的 Dan Goodin，他在周一通过 Ars Technica 向我们报告了 UC 圣地亚哥论文的消息。

基本上，当客户端尝试连接到一个容易受到攻击的 SSH 服务器时，它们在协商建立全面安全加密通信的过程中，服务器将会生成一个数字签名以供客户端检查，以确保其正在与预期的服务器通信。

如我们之前所述，这个签名的计算过程可能会随机或意外地产生错误，聪明的算法可以从错误的签名中推导出服务器的私有 RSA 密钥，此密钥用于签名生成。对此的一种防范措施是在将签名发送给客户端前确保其计算正确；OpenSSL 和 LibreSSL 已经在实施这种防范。

正如论文作者在他们的摘要中提到的：

>
> “我们证明了一种可能性：若 SSH 服务器在进行签名计算过程中出现自然故障，一名被动的网络攻击者便有机会获得其私有 RSA 主机密钥。
>
>
> 在之前的研究中，我们通常认为这对于 SSH 协议是不可行的，因为签名中包含了一些信息，比如 Diffie-Hellman 共享密钥，这些信息对于被动的网络观察者来说无法获得。
>
>
> 然而，我们证明了，在 SSH 中经常使用的签名参数下，如果出现了签名错误，我们便能有效地使用 <ruby> 格攻击 <rt>  lattice attack </rt></ruby> 来恢复私钥。
>
>
> 我们对 SSH、IKEv1、IKEv2 协议进行了安全分析，在此场景下，我们利用我们的攻击方法在现实环境中挖掘出几个存在漏洞的独立实现中的数百个被攻破的密钥。
>
>
>

“一个被动的对手可以安静地监控合法的连接，不用冒被检测的风险，直到他们观察到一个包含私钥的错误签名。”研究团队做出了这样的结论：“然后，攻击者可以主动且不会被检测地冒充被攻破的主机，从而截取敏感数据。”

研究人员表示，他们已经扫描了整个互联网，并翻查了以前收集的 SSH 扫描数据，以测量易受攻击的签名的流行程度。他们声称，他们的数据集涵盖了 52 亿条 SSH 记录和超过七年的观察，其中包含了超过 59 万个无效的 RSA 签名。

通过他们的格密钥恢复技术，学者们表示，其中超过 4900 个错误的签名揭示了对应 RSA 公钥的因子分解。他们利用这些信息，推导出了 189 个公钥的私有 RSA 密钥。

在他们的研究中，作者们发现，思科、Zyxel、山石网科和 Mocana 这四个制造商的产品都可能受到这种密钥侦测攻击。研究者已经向思科和 Zyxel 报告了这个问题，观察到两家供应商都迅速进行了调查行动。

思科判定其 ASA 和 FTD 软件在 2022 年已经解决了此问题，且在这篇论文发布之前，公司正在对其 IOS 和 IOS XE 软件进行调查，看看如何应对此问题。

同一时间，Zyxel 发现这个缺陷只影响到了它那些已停止服务的固件，并且它已经开始使用不受此问题影响的 OpenSSL。研究人员表示，他们没有成功地与山石网科和 Mocana 取得联系，所以决定把这个问题提交给了 CERT 协调中心。

据称，自诩为 “SSH-2.0-SSHD” 的 SSH 服务器实现也可能受到攻击，这可能会影响到一些企业级的 Java 应用。有鉴于这个密钥推导技术的关键在于 PKCSv1.5，使用 PKCSv1.5-RSA 签名的 DNSSEC 可能也在风险之中。

他们还指出，他们在 IPsec 连接中收集到的签名数据集不大，所以无法确定此协议是否也可能受到类似的密钥泄漏攻击。他们表示：“鉴于易受攻击的签名故障很罕见，根据我们的数据，我们无法对 IPsec 实现得出多少结论，我们认为这个问题值得进一步研究。”

>
> 更新：已经与山石网科取得联系，官方确认该问题已在 2015 年发布的相关版本中修复，之后的版本也不存在相关问题。
>
>
> 具体详情可以咨询山石网科客服或查看如下链接：
>
>
> [https://www.hillstonenet.com.cn/security-notification/2015/07/28/dsfyj/](https://www.hillstonenet.com.cn/security-notification/2015/07/28/dsfyj/ )
>
>
>

*（题图：MJ/f94093f0-9ffe-4cf1-82fb-cdac1427e923）*

---

via: <https://www.theregister.com/2023/11/14/passive_ssh_key_compromise/>

作者：[Jessica Lyons Hardcastle](https://www.theregister.com/Author/Jessica-Lyons-Hardcastle) 译者：[ChatGPT](https://linux.cn/lctt/ChatGPT) 校对：[wxy](https://github.com/wxy)


12-Factor 应用方法论的开源开发者指南

Summary: 这 12 项基本原则能够帮助团队快速高效地构建高度可扩展的应用程序

这 12 项基本原则能够帮助团队快速高效地构建高度可扩展的应用程序

# 12-Factor 应用方法论的开源开发者指南

>
> 这 12 项基本原则能够帮助团队快速高效地构建高度可扩展的应用程序
>
>
>

[12-Factor 应用方法论](https://www.redhat.com/architect/12-factor-app) 为在短时间内构建应用程序并使其具有可扩展性提供了指导。它由 Heroku 的开发人员创建，用于软件即服务（SaaS）应用程序、网络应用程序以及可能的通信平台即服务（CPaaS）。在有效组织项目和管理可扩展应用程序方面，12 要素应用程序方法论对开源开发具有强大的优势。

### 12-Factor 应用方法论的原则

12-Factor 应用方法论的规则非常严格，也是开发和部署 SaaS 应用程序的基石，并且不受任何编程语言或数据库的限制。

#### 1：一份基准代码，多份部署

每个应用程序都应该有一个具有多个不同环境/部署的代码库。

开发人员不应仅仅为了在不同环境中设置而开发另一个代码库。不同的环境代表不同的状态，但这些不同的环境应该共享同一个代码库。

在许多开源项目都存储在 GitLab 这样的版本控制系统中的情况下，一个环境可以被视为一个分支。例如，你可以在任何中央版本控制系统中为名为 VoIP-app 的云 VoIP 应用程序创建一个单独的存储库，然后创建两个分支：开发分支（`development`）和暂存分支（`staging`），并将主分支（`master`）作为发布分支。

#### 2：明确声明和隔离依赖关系

应声明所有依赖关系。你的应用程序可能会依赖外部系统工具或库，但不应对系统工具或库有任何 *隐含的* 依赖。你的应用程序必须始终明确声明所有依赖关系及其正确版本。

在代码库中包含依赖关系可能会产生问题，特别是在开源项目中，外部库的更改可能会将错误引入代码库。例如，代码库可能会使用一个外部库，但没有明确声明该依赖关系或版本。如果外部库更新到更新的、未经测试的版本，这可能会与你的代码产生兼容性问题。如果明确声明了依赖关系及其正确版本，你的代码库就不会出现这种问题。

根据技术栈的不同，最好使用软件包管理器，通过读取代表依赖库名称和版本的依赖库声明清单，在各自的系统上下载依赖库。

#### 3：在环境中存储配置

当需要支持多个环境或客户端时，配置就成了应用程序的重要组成部分。不同部署之间的配置应存储在环境变量中。这样就可以在部署之间轻松更改配置，而无需更改代码。

对于闭源应用程序来说，这一原则是有益的，因为你不会希望数据库连接信息或其他秘密数据等敏感信息被公开。然而，在开放源代码开发中，这些细节都是公开的。在这种情况下，好处是你不需要反复修改代码。你只需这样设置变量，只需改变环境，就能让代码完美运行。

#### 4：把后端服务当作附加资源

所有后备服务（如数据库、外部存储或消息队列）都被视为附加资源，由执行环境附加或分离。根据这一原则，如果这些服务的位置或连接细节发生变化，仍无需更改代码。这些细节可以在配置中找到。

备份服务可以从部署中快速附加或分离。例如，如果基于云的电子表格的数据库无法正常工作，开发人员应该能够创建一个从最近备份恢复的新数据库服务器，而无需对代码库进行任何更改。

#### 5：严格分离构建和运行

12-Factor 应用方法论要求严格区分构建、发布和运行阶段。

* 第一阶段是 *构建* 阶段。在这一阶段，源代码被组装或编译成可执行文件，同时加载依赖关系并创建资产。每次需要部署新代码时，构建阶段就会开始。
* 第二阶段是 *发布* 阶段。在此阶段，构建阶段生成的代码与部署的当前配置相结合。最终发布的版本包含构建和配置，可在执行环境中立即执行。
* 第三个阶段是 *运行* 阶段，也是最后阶段：应用程序在执行环境中运行。该阶段不应被其他任何阶段打断。

通过严格区分这些阶段，我们可以避免代码中断，使系统维护更加易于管理。

#### 6：以一个或多个无状态进程运行应用

应用程序作为一个或多个进程的集合在执行环境中执行。这些进程是无状态的，其持久化数据存储在数据库等后台服务中。

这对开源非常有用，因为使用某版本应用程序的开发人员可以在其云平台上创建多节点部署，以实现可扩展性。数据不会在其中持久化，因为如果其中任何一个节点崩溃，数据就会丢失。

#### 7：通过端口绑定提供服务

你的应用程序应作为独立的服务，独立于其他应用程序。它它应该能通过URL供其他服务访问，以服务形式存在。这样，你的应用程序就可以在需要时作为其他应用程序的资源。利用这一概念，你可以构建 [REST API](https://opensource.com/article/21/9/ansible-rest-apis)。

#### 8：通过进程模型进行扩展

该原则也称为并发原则，它表明应用程序中的每个进程都应能够自我扩展、重启或克隆。

开发人员可以创建多个进程，并将应用程序的负载分配给这些进程，而不是将一个进程变大。通过这种方法，你可以将每种工作负载分配给一个进程类型，从而构建能处理不同工作负载的应用程序。

#### 9：快速启动和优雅终止以增强健壮性

你的应用应当基于简单的进程构建，因此开发者可以放大进程的同时还能在发生问题时重启它们。这使得应用的进程易于丢弃。

根据这一原则构建应用程序意味着代码的快速部署、快速弹性扩展、更灵活的发布流程以及稳健的生产部署。所有这些在开源开发环境中都非常有用。

#### 10：尽可能的保持开发、预发布、生产环境相同

同一项目的团队应使用相同的操作系统、支持服务和依赖关系。这样可以降低出现错误的可能性，减少开发所需的时间。

由于开源项目的开发人员分散在各地，他们可能无法就所使用的系统、服务和依赖关系进行 [沟通](https://opensource.com/article/21/10/global-communication-open-source) ，因此将这一原则付诸实践对于开源项目来说可能是一个挑战。减少这些差异的一种可能性是制定开发指南，建议使用何种操作系统、服务和依赖关系。

#### 11：把日志当作事件流

日志对于排除生产问题或了解用户行为至关重要。但是，12-Factor 应用方法论并不适合处理日志的管理。

相反，应将日志条目作为事件流，写入标准输出，并将其发送到单独的服务进行分析和存档。机器人流程自动化（RPA）技术可作为处理和分析日志的第三方服务。执行环境将决定如何处理该数据流。这为反省应用程序的行为提供了更大的灵活性和能力。

#### 12：后台管理任务当作一次性进程运行

这一原则实际上与开发无关，而是与应用程序管理有关。管理进程应在与应用程序常规长期运行进程相同的环境中运行。在本地部署中，开发人员可以直接使用应用程序签出目录内的 Shell 命令来执行一次性管理进程。

### 结论

使用 12-Factor 应用方法论开发应用程序，可以提高效率，加快发布速度。在开源开发中，偏离某些指导原则可能是有意义的，但最好还是尽可能严格遵守这些指导原则。

开源的 12-Factor 应用是可能的。一个很好的例子是 [Jitsi](https://jitsi.org/)[, （一个开源视频会议平台）](http://jitsi.org), 在疫情期间扩展了 100 倍的规模，取得了巨大成功，它就是采用 12-Factor 应用方法论构建的。

*（题图：MJ/4bc8b463-49d0-4702-8ad3-6a07a718d5d9）*

---

via: <https://opensource.com/article/21/11/open-source-12-factor-app-methodology>

作者：[Richard Conn](https://opensource.com/users/richardaconn-0) 选题：[lujun9972](https://github.com/lujun9972) 译者：[trisbestever](https://github.com/trisbestever) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


OBS Studio 30.0 发布，增加 AV1 支持

Summary: OBS Studio 30.0 对于 Linux 用户来说是一个重要的版本。

什么时候能使用 AVS3？

# OBS Studio 30.0 发布，增加 AV1 支持

>
> OBS Studio 30.0 对于 Linux 用户来说是一个重要的版本。
>
>
>

OBS Studio 无疑是 [Linux 上最佳的录屏软件](https://itsfoss.com/best-linux-screen-recorders/) 之一，它深受众多内容创作者的喜爱，他们使用它进行视频录制和流媒体直播。

近日的公告发布了一个**全新的主要版本** —— **OBS Studio 30**，距离今年一月份的 [上一次主要版本](https://news.itsfoss.com/obs-studio-29-release/) 已经近 11 个月。

接下来就让我来一一为你介绍。

### ? OBS Studio 30：新特性有哪些？

作为一个主要版本，OBS Studio 30 带来了一系列引人期待的改进，但是，也有一项变化可能**令部分用户感到不满**。

这个版本的一些**重要亮点**包括：

* 停止对 Ubuntu 20.04 的支持
* 用户界面/体验的提升
* 视频编码能力的提升

#### 停止对 Ubuntu 20.04 的支持

随着 OBS Studio 30 的发布，对 Ubuntu 20.04 的支持不复存在。

做出这个决定的主要原因在于，开发者发现维护 Qt 5 越来越困难，这也相应影响了他们在改进 OBS 用户界面/用户体验方面的工作。

实际上，**Ubuntu 20.04 是唯一一个使用 Qt 5 运行 OBS 的第一方发行版**，开发者表示，相比其他版本，这个发行版的**用户基数已经在逐渐减少**。

这**并非一夜之间的改变**，早在六月份，OBS Studio 就在其 GitHub 仓库中公布了这项改动。

目前，**Ubuntu 20.04 的用户**有两个选择，他们可以选择 [升级到 Ubuntu 22.04](https://itsfoss.com/upgrade-ubuntu-version/) 或更高版本，或者转用 OBS Studio 的 [Flatpak 版本](https://flathub.org/apps/com.obsproject.Studio)。

开发人员还**提到了他们可能会在 2025 年 4 月左右停止对 Qt 6.2 和 Ubuntu 22.04 的支持**。但是，你目前无需对此感到担忧。你可以阅读 [官方公告](https://github.com/obsproject/obs-studio/discussions/9055) 了解详细的计划。

#### 用户界面/体验的提升

“<ruby> 停靠区 <rt>  Docks </rt></ruby>”菜单中新增了一项“<ruby> 全高窗口 <rt>  Full-Height docks </rt></ruby>”选项，这将方便集成 Twitch 和 YouTube 上直播时所见的长聊天窗口。

同时，**状态栏也进行了重新设计**，以更结构化、有条理的形式展示同样的信息，我个人非常喜欢这种改变。

**老状态栏有些棘手**，在我直播或录制期间，我经常会忘记它的存在 ?

在 OBS Studio 30 中也新增了一个“<ruby> 安全模式 <rt>  Safe Mode </rt></ruby>”，这种模式下，应用程序将在不加载任何第三方插件、脚本或 web sockets 的情况下启动，以便**对故障进行排除**。

你可以通过两种方式访问到这个模式，一是当 OBS Studio 断电意外关闭，另一种是在下图所示的“<ruby> 帮助 <rt>  Help </rt></ruby>”菜单中手动启动。

#### 视频编码能力的提升

OBS Studio 30 新增了对**三种主要视频编码技术**的支持，分别是 [Intel QSV](https://en.wikipedia.org/wiki/Intel_Quick_Sync_Video) H264，高效视频编码（[HEVC](https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding)），以及 [AV1](https://en.wikipedia.org/wiki/AV1)。

许多使用 Linux 的内容创作者会赞赏 OBS 做出的这些改进。

#### ? 更多的改变和改进

除上述提及的点外，还有一些其他值得注意的改动：

* 引入了**WHIP/WebRTC 输出**。
* 可通过拖拽**调整过滤器顺序**。
* 提供**YouTube Live 控制室面板**的支持。
* 修复了在记录高帧率视频设备时**出现日志问题**的错误。
* 为 [Decklink](https://www.blackmagicdesign.com/in/products/decklink) 增加了**10 位捕获和 HDR 回放**的支持。

要获得更多关于 OBS Studio 30 的详细信息，你可以查看 [官方发布备注](https://github.com/obsproject/obs-studio/releases/tag/30.0.0)。

### ? 下载 OBS Studio 30

你可以前往 [官方网站](https://obsproject.com/) 下载 OBS Studio 的最新版本，其支持**Linux**，**Windows** 以及 **macOS** 平台。

>
> **[OBS Studio](https://obsproject.com/)**
>
>
>

? 你是否打算试运行一下 OBS Studio 30 然后告诉我们你的体验呢？

---

via: <https://news.itsfoss.com/obs-studio-30/>

作者：[Sourav Rudra](https://news.itsfoss.com/author/sourav/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[ChatGPT](https://linux.cn/lctt/ChatGPT) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Blender 4.0 版本发布，引领了渲染升级的新趋势

Summary: Blender 4.0 的发布使其成为图形设计从业者和艺术家们极度期待的工具。

Blender 4.0 的发布使其成为图形设计从业者和艺术家们极度期待的工具。

# Blender 4.0 版本发布，引领了渲染升级的新趋势

>
> Blender 4.0 的发布使其成为图形设计从业者和艺术家们极度期待的工具。
>
>
>

Blender 是**一款极受欢迎的开源 3D 计算机图形软件套件**，它广泛应用于动画电影制作、动态图形、视觉特效等多个领域。

最近，Blender 基金会公布了**Blender 4.0 的发布**，这一版本“为渲染、创建工具以及更多内容打开了新的可能性，让你的创造自由提升到新的水平。”

接下来，让我们一起探索一下此版本带来的新视野。

### ? Blender 4.0：有哪些新特性？

作为一个重要的版本更新，Blender 4.0 提供了丰富的新功能。然而，我们只针对一些核心的亮点进行介绍：

* 用户界面改进
* 光线与阴影链接
* 改良的 Principled BSDF
* 更优化的人物绑定

在我们详述一些细节之际，下面是一则官方视频，总结了主要的变更事项：

#### 用户界面改进

在 Blender 中，最重要且直接面向用户的部分无疑就是它的界面。界面的字体已经改变为 [Inter](https://rsms.me/inter/)，**此举旨在改进应用内的文字可读性**，使它不受显示器大小影响。

此外，用户还可以通过在常规下拉菜单或者右键菜单上按空格键，使用**新增的搜索功能**。同时，一份调整过的启动画面，使得用户在旧版 Blender 中**迁移保存的设置**变得更为简单。

我们在文件菜单中添加了一项新的 “<ruby> 增量保存 <rt>  Save Incremental </rt></ruby>”选项。这个选项可以保存当前的 `.blender` 文件，并给文件名添加一个递增的数字。

#### 光线与阴影链接

它被开发团队称为最受期待的功能，Blender 4.0 新增了光线与阴影链接功能。这些功能使设计师可以**设置灯光以影响场景中特定的物体**，甚至可**控制哪些物体可以挡住光源**，充当阴影的遮挡体。

关于这些功能的更多详情，可以参考 [官方文档](https://docs.blender.org/manual/en/4.0/render/cycles/object_settings/light_linking.html)。

#### 改良的 Principled BSDF

Blender 的 [Principled BSDF](https://docs.blender.org/manual/en/4.0/render/shader_nodes/shader/principled.html) 系统在本次更新中进行了大规模的改良，现在此系统提供了**支持更广泛的材料类型，并且工作更加高效**。

改良亮点包括：

* <ruby> 涂层 <rt>  Coat </rt></ruby>，这个特性可以模拟例如手机显示屏后的玻璃表面等效果，它被放置在所有的基层之上。
* <ruby> 光泽感 <rt>  Sheen </rt></ruby>，现在它使用新的微纤维渲染模型，成为排列在发射和涂层之上的最高层，从而控制表面反光。
* 实现了多散射 GGX 策略，以在 Cycles 渲染器中提高渲染效率，使得**渲染过程中消耗的电力更少**。
* **金属表面的边缘着色**，这项新特性提供了一种装饰金属表面的艺术友好方式。它可以渲染基于 F82 着色模型的复杂折射系数。

以下的插图更好地展示了 Principled BSDF 的改善状况：

#### 绑定优化

Blender 4.0 的特性之一就是为 [Armature](https://docs.blender.org/manual/en/latest/animation/armatures/introduction.html) 骨骼添加了 <ruby> 骨骼集合 <rt>  Bone Collections </rt></ruby>。此设定继承了现有对象物体的实现方式。

它**替代了传统的编号层和骨骼组特性**，以吸取组合选择操作符来按骨骼颜色/集合来选择分组，设定 Armature 骨骼的颜色等等。

同时，**姿势库也得到了更新**，新引入的资产架使得姿势资产在 3D 视口中可见。

#### ? 更多改进和优化

一些其他值得注意的变化还包括：

* **停止支持英特尔 HD4000 系列的 GPU**。
* 实施了新的 [blendfile 兼容性政策](https://wiki.blender.org/wiki/Process/Compatibility_Handling)。
* **吸附功能得到改善**，变得更快，定位更精准。
* 对于 Linux 和 Windows 用户，现在 **OpenGL 的最小版本要求** 是 4.3。
* **Filmic 已被 AgX 视图转换所替代**，以更好地处理过度曝光区域的颜色。

你还可以参考 [官方发布说明](https://wiki.blender.org/wiki/Reference/Release_Notes/4.0) 来获取更多的更新详情。

### ? 下载 Blender 4.0

你可以从 [官方网站](https://www.blender.org/download/) 下载 Blender 的最新 tar 包，支持 **Linux**、 **Windows**， 和 **macOS**等平台。

当然如果你有特殊需求，你也可以在 [Snap 商店](https://snapcraft.io/blender) 或是 [Steam](https://store.steampowered.com/app/365670/Blender/) 中下载。

>
> **[Blender](https://www.blender.org/download/)**
>
>
>

? 准备好使用 Blender 4.0 开启你的创造之旅了吗？还是你有其他的首选项？欢迎在评论区分享你的想法！

---

via: <https://news.itsfoss.com/blender-4-0-release/>

作者：[Sourav Rudra](https://news.itsfoss.com/author/sourav/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[ChatGPT](https://linux.cn/lctt/ChatGPT) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Summary:
? 2023 年，GCC 仍然在为 COBOL 编译器开发新的功能
? 生成式 AI 的兴起引发了翻译技术的井喷式增长
? Google 支付 80 亿美元成为三星手机的默认应用程序
»
»

DeepL本来就是基于AI的，所以它才会在ChatGPT出现之前成为Google翻译的一个替代品。我还向GPT问过它和DeepL哪个翻译更准确。

# 硬核观察 #1187 2023 年，GCC 仍然在为 COBOL 编译器开发新的功能

### #1 2023 年，GCC 仍然在为 COBOL 编译器开发新的功能

虽然现在不像 Rust 或其他语言那么流行，但对于 COBOL 爱好者和那些继续使用这种上世纪 50 年代编程语言维护代码库的人来说，GCC COBOL 编译器的树外支持在 2023 年底仍在继续。而且，ISO 发布了 COBOL 2023 规范，带来了异步消息传递、XOR 逻辑运算符、DELETE FILE 语句、布尔移位运算符、事务处理工具等功能。开发人员一直在努力支持该规范，并让他们的编译器支持通过越来越多的 COBOL 测试用例。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/GCC-COBOL-2023)**
>
>
>

>
> 老王点评：现在学 COBOL 还来得及去银行找份工作吗？
>
>
>

### #2 生成式 AI 的兴起引发了翻译技术的井喷式增长

数据提供商 Statista 预测，AI 翻译的全球市场将从 2023 年的约 50 亿美元增长到 2030 年的约 120 亿美元。在这一波 AI 翻译浪潮中，德国公司 DeepL 在 Google 和 Facebook 等强大竞争对手中间脱颖而出。DeepL 自 2017 年创办以来成长迅速，可能是过去 15 年翻译领域最成功的科技公司，今年 1 月它的估值达到了 10 亿美元。他们推出的 DeepL 是一个基于神经网络的在线翻译器。人工智能的进步为节省金钱和时间提供了可能，人工翻译只在需要时才介入。Gartner 预测，到 2025 年人类翻译者四分之一的工作量将是审阅和编辑机器翻译文本。

>
> **[消息来源：《金融时报》](https://www.ft.com/content/a4f7f5b6-6c42-4df0-8529-a82b526869ac)**
>
>
>

>
> 老王点评：我就说为什么 GPT 还没把 DeepL 打败，原来 DeepL 也是基于人工智能的，而且是专门针对场景优化过的。万能的 GPT 也不是每件事都能干到最好。
>
>
>

### #3 Google 支付 80 亿美元成为三星手机的默认应用程序

根据 Epic 在法庭上提供的信息，Google 同意在四年内向三星支付 80 亿美元，以使其应用程序在三星手机上成为默认设置。Google Play 收入的一半或更多来自三星设备，Google 和三星将分享应用商店的收入，以确保安卓移动设备预装 Google Play。

>
> **[消息来源：The Hill](https://thehill.com/policy/technology/4309219-google-paid-8-billion-to-make-its-apps-default-on-samsung-phones/)**
>
>
>

>
> 老王点评：随着对 Google 的各个诉讼案的审理，它和各大厂商的交易合作也随之被曝光。
>
>
>


硬核观察 #1188 科学家利用树莓派“胶囊”保护气球望远镜数据

Summary:
? 科学家利用树莓派“胶囊”保护气球望远镜数据
? 微软将人工智能产品统一到 Copilot 品牌下
? 程序员们仍然忍不住在代码中留下密钥和凭证
»
»

这大概是老王发的最早的一次

# 硬核观察 #1188 科学家利用树莓派“胶囊”保护气球望远镜数据

### #1 科学家利用树莓派“胶囊”保护气球望远镜数据

NASA 在四月份升空了一架超压气球成像望远镜，在 33 千米的高度，用了一个多月的时间环绕地球，获取天体观测数据。但由于通讯故障，5 月底临时决定降落，望远镜本身在着陆过程中被毁坏，它的固态硬盘被完好无损地找了回来，不过这不重要。因为它带有 4 个数据恢复系统（DRS）胶囊。每个胶囊包括一个树莓派 3B 和 5TB 固态存储，以及一个降落伞、一个全球导航卫星系统。在降落前，望远镜在阿根廷上空投放了两个 DRS 胶囊。并在报告的地点找到了它们。一只好奇的美洲狮显然在其中一个胶囊周围嗅了嗅，但没有造成损坏，而且数据完好无损。

>
> **[消息来源：The Register](https://www.theregister.com/2023/11/16/scientists_use_raspberry_pi_tech/)**
>
>
>

>
> 老王点评：简单地将数据复制到 SD 卡，然后从天上扔下来，听起来不靠谱，但是其实效果还不错。
>
>
>

### #2 微软将人工智能产品统一到 Copilot 品牌下

微软将其必应聊天工具更名为 Microsoft Copilot，与微软其他多款人工智能产品共享相同的品牌名称。该公司还宣布将推出 Copilot Studio，以支持 OpenAI 最近发布的代理型人工智能模型 GPT，这是为其 ChatGPT AI 助手定制的角色。微软的 Copilot 被用于多个应用程序，包括 Microsoft 365、Edge、Windows 等，有些是免费的，有些则不是。这一命名方案的历史始于 2021 年的 GitHub Copilot。微软称自己是“是一家 Copilot 公司。不久的将来，每个人、每件事都会有一个 Copilot”。

>
> **[消息来源：Ars Technica](https://arstechnica.com/information-technology/2023/11/bing-chat-is-now-microsoft-copilot-in-potentially-confusing-rebranding-move/)**
>
>
>

>
> 老王点评：不知道微软公司会不会和谷歌、Facebook 一样也改名，叫 Copilot 或 MicroPilot ？?
>
>
>

### #3 程序员们仍然忍不住在代码中留下密钥和凭证

根据一项研究，在 Python 的官方代码库 PyPI 上提交的总共 45 万个项目中，发现了近 4000 个唯一的机密信息。近 3000 个项目至少包含一个独一无二的机密。许多机密被泄露了不止一次，使被曝光的机密总数达到近 57,000 个。这些泄露的凭证提供了对一系列资源的访问权限，如微软活动目录服务器、允许单点登录的 OAuth 服务器、SSH 服务器等。以及，还包括了与云服务交互的 API 密钥、数据库凭据以及各种令牌等。而 PyPI 只是众多开源代码库中的一个。

>
> **[消息来源：Ars Technica](https://arstechnica.com/security/2023/11/developers-cant-seem-to-stop-exposing-credentials-in-publicly-accessible-code/)**
>
>
>

>
> 老王点评：再好的机制和最佳实践，也架不住程序员偷懒。
>
>
>


使用 dialog 和 jq 在 Linux 上编写高效终端 TUI

Summary: 许多人每日都在使用终端，因此，文字用户界面（TUI）逐渐显示出其价值。

许多人每日都在使用终端，因此，文字用户界面（TUI）逐渐显示出其价值。

# 使用 dialog 和 jq 在 Linux 上编写高效终端 TUI

### 为何选择文字用户界面（TUI）？

许多人每日都在使用终端，因此，<ruby> 文字用户界面 <rt>  Text User Interface </rt></ruby>（TUI）逐渐显示出其价值。它能减少用户输入命令时的误差，让终端操作更高效，提高生产力。

以我的个人使用情况为例：我每日会通过家用电脑远程连接到我使用 Linux 系统的实体 PC。所有的远程网络连接都通过私有 VPN 加密保护。然而，当我需要频繁重复输入命令进行连接时，这种经历实在令人烦躁。

于是，我创建了下面这个 Bash 函数，从而有所改进：

```
export REMOTE_RDP_USER="myremoteuser"
function remote_machine() {
  /usr/bin/xfreerdp /cert-ignore /sound:sys:alsa /f /u:$REMOTE_RDP_USER /v:$1 /p:$2
}

```

但后来，我发现自己还是频繁地执行下面这条命令（在一行中）：

```
remote_pass=(/bin/cat/.mypassfile) remote_machine $remote_machine $remote_pass

```

这太烦了。更糟糕的是，我的密码被明文存储在我的电脑上（我虽然使用了加密驱动器，但这点依然令人不安）。

因此，我决定投入一些时间，编写一个实用的脚本，从而更好地满足我的基本需求。

#### 我需要哪些信息才能连接到远程桌面？

实际上，要连接到远程桌面，你只需提供少量信息。这些信息需要进行结构化处理，所以一个简单的 JSON 文件就能够满足要求：

```
{"machines": [
  {
  "name": "machine1.domain.com",
  "description": "Personal-PC"
  },
  {
  "name": "machine2.domain.com",
  "description": "Virtual-Machine"
  }
  ],
"remote_user": "MYUSER@DOMAIN",
"title" : "MY COMPANY RDP connection"
}

```

尽管在各种配置文件格式中，JSON 并非最佳选择（例如，它不支持注解），但是 Linux 提供了许多工具通过命令行方式解析 JSON 内容。其中，特别值得一提的工具就是 [jq](https://stedolan.github.io/jq/)。下面我要向你展示如何利用它来提取机器列表：

```
/usr/bin/jq --compact-output --raw-output '.machines[]| .name' \
  $HOME/.config/scripts/kodegeek_rdp.json) \
  "machine1.domain.com" "machine2.domain.com"

```

`jq` 的文档可以在 [这里](https://jqlang.github.io/jq/manual/) 找到。另外，你也可以直接将你的 JSON 文件复制粘贴到 [jq play](https://jqplay.org/)，试用你的表达式，然后在你的脚本中使用这些表达式。

既然已经准备好了连接远程计算机所需的所有信息，那现在就让我们来创建一个美观实用的 TUI 吧。

#### Dialog 的帮助

[Dialog](https://invisible-island.net/dialog/) 是那些你可能希望早些认识的、被低评估的 Linux 工具之一。你可以利用它构建出一个井然有序、简介易懂，并且完美适用于你终端的用户界面。

比如，我可以创建一个包含我喜欢的编程语言的简单的复选框列表，且默认选择 Python：

```
dialog --clear --checklist "Favorite programming languages:" 10 30 7\
  1 Python on 2 Java off 3 Bash off 4 Perl off 5 Ruby off

```

我们通过这条命令向 `dialog` 下达了几个指令：

* 清除屏幕（所有选项都以 `--` 开头）
* 创建一个带有标题的复选框（第一个位置参数）
* 决定窗口尺寸（高度、宽度和列表高度，共 3 个参数）
* 列表中的每条选项都由一个标签和一个值组成。

惊人的是，仅仅一行代码，就带来了简洁直观和视觉友好的选择列表。

关于 `dialog` 的详细文档，你可以在 [这里](https://invisible-island.net/dialog/#documentation) 阅读。

#### 整合所有元素：使用 Dialog 和 JQ 编写 TUI

我编写了一个 TUI，它使用 `jq` 从我的 JSON 文件中提取配置详细信息，并且使用 `dialog` 来组织流程。每次运行，我都会要求输入密码，并将其保存在一个临时文件中，脚本使用后便会删除这个临时文件。

这个脚本非常基础，但它更安全，也使我能够专注于更重要的任务 ?

那么 [脚本](https://raw.githubusercontent.com/josevnz/scripts/main/kodegeek_rdp.sh) 看起来是怎样的呢？下面是代码：

```
#!/bin/bash
# Author Jose Vicente Nunez
# Do not use this script on a public computer. It is not secure...
# https://invisible-island.net/dialog/
# Below some constants to make it easier to handle Dialog
# return codes
: ${DIALOG_OK=0}
: ${DIALOG_CANCEL=1}
: ${DIALOG_HELP=2}
: ${DIALOG_EXTRA=3}
: ${DIALOG_ITEM_HELP=4}
: ${DIALOG_ESC=255}
# Temporary file to store sensitive data. Use a 'trap' to remove
# at the end of the script or if it gets interrupted
declare tmp_file=$(/usr/bin/mktemp 2>/dev/null) || declare tmp_file=/tmp/test$$
trap "/bin/rm -f $tmp_file" QUIT EXIT INT
/bin/chmod go-wrx ${tmp_file} > /dev/null 2>&1
:<<DOC
Extract details like title, remote user and machines using jq from the JSON file
Use a subshell for the machine list
DOC
declare TITLE=$(/usr/bin/jq --compact-output --raw-output '.title' $HOME/.config/scripts/kodegeek_rdp.json)|| exit 100
declare REMOTE_USER=$(/usr/bin/jq --compact-output --raw-output '.remote_user' $HOME/.config/scripts/kodegeek_rdp.json)|| exit 100
declare MACHINES=$(
    declare tmp_file2=$(/usr/bin/mktemp 2>/dev/null) || declare tmp_file2=/tmp/test$$
    # trap "/bin/rm -f $tmp_file2" 0 1 2 5 15 EXIT INT
    declare -a MACHINE_INFO=$(/usr/bin/jq --compact-output --raw-output '.machines[]| join(",")' $HOME/.config/scripts/kodegeek_rdp.json > $tmp_file2)
    declare -i i=0
    while read line; do
        declare machine=$(echo $line| /usr/bin/cut -d',' -f1)
        declare desc=$(echo $line| /usr/bin/cut -d',' -f2)
        declare toggle=off
        if [ $i -eq 0 ]; then
            toggle=on
            ((i=i+1))
        fi
        echo $machine $desc $toggle
    done < $tmp_file2
    /bin/cp /dev/null $tmp_file2
) || exit 100
# Create a dialog with a radio list and let the user select the
# remote machine
/usr/bin/dialog \
    --clear \
    --title "$TITLE" \
    --radiolist "Which machine do you want to use?" 20 61 2 \
    $MACHINES 2> ${tmp_file}
return_value=$?
# Handle the return codes from the machine selection in the
# previous step
export remote_machine=""
case $return_value in
  $DIALOG_OK)
    export remote_machine=$(/bin/cat ${tmp_file})
    ;;
  $DIALOG_CANCEL)
    echo "Cancel pressed.";;
  $DIALOG_HELP)
    echo "Help pressed.";;
  $DIALOG_EXTRA)
    echo "Extra button pressed.";;
  $DIALOG_ITEM_HELP)
    echo "Item-help button pressed.";;
  $DIALOG_ESC)
    if test -s $tmp_file ; then
      /bin/rm -f $tmp_file
    else
      echo "ESC pressed."
    fi
    ;;
esac

# No machine selected? No service ...
if [ -z "${remote_machine}" ]; then
  /usr/bin/dialog \
        --clear  \
        --title "Error, no machine selected?" --clear "$@" \
        --msgbox "No machine was selected!. Will exit now..." 15 30
  exit 100
fi

# Send 4 packets to the remote machine. I assume your network
# administration allows ICMP packets
# If there is an error show  message box
/bin/ping -c 4 ${remote_machine} >/dev/null 2>&1
if [ $? -ne 0 ]; then
  /usr/bin/dialog \
        --clear  \
        --title "VPN issues or machine is off?" --clear "$@" \
        --msgbox "Could not ping ${remote_machine}. Time to troubleshoot..." 15 50
  exit 100
fi

# Remote machine is visible, ask for credentials and handle user
# choices (like password with a password box)
/bin/rm -f ${tmp_file}
/usr/bin/dialog \
  --title "$TITLE" \
  --clear  \
  --insecure \
  --passwordbox "Please enter your Windows password for ${remote_machine}\n" 16 51 2> $tmp_file
return_value=$?
case $return_value in
  $DIALOG_OK)
    # We have all the information, try to connect using RDP protocol
    /usr/bin/mkdir -p -v $HOME/logs
    /usr/bin/xfreerdp /cert-ignore /sound:sys:alsa /f /u:$REMOTE_USER /v:${remote_machine} /p:$(/bin/cat ${tmp_file})| \
    /usr/bin/tee $HOME/logs/$(/usr/bin/basename $0)-$remote_machine.log
    ;;
  $DIALOG_CANCEL)
    echo "Cancel pressed.";;
  $DIALOG_HELP)
    echo "Help pressed.";;
  $DIALOG_EXTRA)
    echo "Extra button pressed.";;
  $DIALOG_ITEM_HELP)
    echo "Item-help button pressed.";;
  $DIALOG_ESC)
    if test -s $tmp_file ; then
      /bin/rm -f $tmp_file
    else
      echo "ESC pressed."
    fi
    ;;
esac

```

你从代码中可以看出，`dialog` 预期的是位置参数，并且允许你在变量中捕获用户的回应。这实际上使其成为编写文本用户界面的 Bash 扩展。

上述的小例子只涵盖了一些部件的使用，其实还有更多的文档在 [官方 dialog 网站](https://invisible-island.net/dialog/)上。

### Dialog 和 JQ 是最好的选择吗？

实现这个功能可以有很多方法（如 [Textual](https://textual.textualize.io/)，Gnome 的 [Zenity](https://gitlab.gnome.org/GNOME/zenity/commits/master?ofs=1900)，Python 的 [TKinker](https://docs.python.org/3/library/tkinter.html)等）。我只是想向你展示一种高效的方式——仅用 100 行代码就完成了这项任务。

*确实，它并不完美*。更具体地讲，它与 Bash 的深度集成使得代码有些冗长，但仍然保持了易于调试和维护的特性。相比于反复复制粘贴长长的命令，这无疑是一个更好的选择。

最后，如果你喜欢在 Bash 中使用 `jq` 处理 JSON，那么你会对这个 [jq 配方的精彩集合](https://nntrn.github.io/jq-recipes/) 感兴趣的。

*（题图：MJ/a9b7f60a-02ec-4d3f-88ae-2321f49ac0e1）*

---

via: <https://fedoramagazine.org/writing-useful-terminal-tui-on-linux-with-dialog-and-jq/>

作者：[Jose Nunez](https://fedoramagazine.org/author/josevnz/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[ChatGPT](https://linux.cn/lctt/ChatGPT) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1189 苹果宣布将在明年支持谷歌力推的 RCS 标准

Summary:
? 苹果宣布将在明年支持谷歌力推的 RCS 标准
? 勒索软件组织向 SEC 投诉受害者未及时披露数据泄露
? 谷歌推迟发布旨在与 OpenAI 竞争的 Gemini 人工智能
»
»

# 硬核观察 #1189 苹果宣布将在明年支持谷歌力推的 RCS 标准

### #1 苹果宣布将在明年支持谷歌力推的 RCS 标准

在被谷歌用广告、公开喊话等方式施压了多年后，苹果公司终于宣布，明年 iPhone 将支持 RCS 消息标准。RCS 比短信或彩信支持更多功能，如已读回执、打字提示、高质量图片和视频等。与此同时，iMessage 也不会消失，它将继续作为 iPhone 用户之间所有通信的信息平台。RCS 将取代 SMS 和 MMS，并在可用时与 iMessage 分开。苹果还重申，iMessage 比 RCS 更安全、更隐私。相比之下，谷歌实现的端到端加密是安卓上的信息应用的一部分，而不是 RCS 标准本身。

>
> **[消息来源：9to5mac](https://9to5mac.com/2023/11/16/apple-rcs-coming-to-iphone/)**
>
>
>

>
> 老王点评：我是真没想到苹果会在被谷歌“骂”了这么多年之后，还是采纳了 RCS。
>
>
>

### #2 勒索软件组织向 SEC 投诉受害者未及时披露数据泄露

名为 Alphv/BlackCat 的勒索软件组织向 SEC 投诉受害者未按照规定在四个工作日内披露数据被窃取事件。该勒索软件组织声称它入侵了加州金融软件公司 MeridianLink，窃取了其客户数据，要求支付赎金否则将泄露窃取的数据。为了增加获得赎金的几率，该组织称已经向 SEC 投诉，指控该公司未按 7 月公布的规定及时披露数据泄露。

>
> **[消息来源：The Record](https://therecord.media/meridianlink-confirms-cyberattack-after-sec-threat)**
>
>
>

>
> 老王点评：这操作实在是骚。
>
>
>

### #3 谷歌推迟发布旨在与 OpenAI 竞争的 Gemini 人工智能

今年早些时候，谷歌代表告诉一些云客户和业务合作伙伴，他们将在 11 月之前获得该公司新的对话式人工智能 Gemini。但据两位直接知情人士透露，该公司最近告诉他们，要等到明年第一季度才能使用。谷歌的云计算销售增长已经放缓，而其更大的竞争对手微软却在加速增长。微软的部分成功来自于向客户销售 OpenAI 的技术。

>
> **[消息来源：The Information](https://www.theinformation.com/articles/google-delays-cloud-release-of-gemini-ai-that-aims-to-compete-with-openai)**
>
>
>

>
> 老王点评：大家应该都知道了 OpenAI 的 CEO 刚刚被开除了，所以，谷歌不用着急，说不定 OpenAI 自己就败下来了。
>
>
>

### 回音

* 再一次，Chrome 官方博客 [宣布](https://developer.chrome.com/blog/resuming-the-transition-to-mv3/) 将从 2024 年 6 月起自动禁用 Manifest V2 扩展。


全新的 Linux 电子书阅读器 Foliate 3.0 发布

Summary: 引入了 GTK 4 ，并优化了 UI。

NB

现在是秒开了。<br />
以前什么CPU都得转圈圈。

好评

引入了 GTK 4 ，并优化了 UI。

# 全新的 Linux 电子书阅读器 Foliate 3.0 发布

>
> 引入了 GTK 4 ，并优化了 UI。
>
>
>

Foliate 作为 [Linux 上最佳的电子书阅读器](https://itsfoss.com/best-ebook-readers-linux/) 之一，在过去几年中发展得相当不错，按时接收更新和错误修复。

然而，因为它的底层技术有些过时，使其近来显得有些老旧。但随着 **Foliate 3.0** 的发布，情况已经有所改变。

让我们详细了解一下这些改进。

### ? Foliate 3.0：新增了什么？

在 3.0 版本中，**Foliate 进行了彻底的重构**，采用了 [GTK 4](https://blog.gtk.org/2020/12/16/gtk-4-0/)、[Adwaita](https://gnome.pages.gitlab.gnome.org/libadwaita/) 等现代平台库。开发者预示，我们可以期待一个焕然一新的界面和比以前更出色的性能。

现在，Foliate 开始**使用自己的电子书解析器/渲染器**，并抛弃了 [Epub.js](https://github.com/futurepress/epub.js) 和 [KindleUnpack](https://github.com/kevinhendricks/KindleUnpack)。遗憾的是，他们在 3.0 发布时**并未及时移植某些功能**，因此这个版本**并未支持 [OPDS](https://en.wikipedia.org/wiki/Open_Publication_Distribution_System) 目录和离线字典**。

说到这次发布的一些亮点，其中包括：

* 用户界面全新升级
* 更佳的渲染质量
* 优化的用户体验

#### 用户界面全新升级

如你所见，Foliate 的主要变化在于其用户界面。它现在采用了**全新的布局**，把图书库和电子书阅读器都整合到一个窗口中。

还有一个**新的侧边栏**，在这里你可以找到一些重要的功能，如目录、注释和书签。

在顶部，你可以看到**一个方便的搜索栏**，让你可以在书中搜索特定的词或句子，同时有一个“<ruby> 图书库 <rt>  Library </rt></ruby>”按钮可以帮助你回到你的电子书库。

>
> ? 你可以用标题栏中的选项来切换侧边栏的可见性。
>
>
>

此外，分页模式也进行了重大的改进。

它们增加了**动画和 1:1 触屏/触摸板滑动手势的支持**，**支持超过两列**，优化了调整性能，此外，你还可以**配置最大的宽度和高度**等等。

#### 更佳的渲染

在书籍渲染方面，也进行了许多改进，其中一些重要的包括：

* 如果一个网页不是有效的 XHTML，那它会被当作 HTML 处理。
* Mobipocket 文件现在被优化为多个部分以显著提升性能。
* 当一个文件被重新加载时，它现在会正确的重新加载，而不只是重新渲染。
* 不再直接将整个文件加载至内存，因此启动时间和内存使用得以优化。

#### 优化的用户体验

除了用户界面的优化，Foliate 3.0 还引入了一些**非常酷的用户体验改进**。

比如书签系统，添加书签的按钮被移至标题栏，并且被添加书签的页面会在顶部显示特殊的标记。

图像查看器也有所更新，如今当图片被复制时，它们将以其原始格式进行保存。此外，只需双击图片就能打开，其它选项已被删除。

进度滑块同样得到了优化，现在可以支持键盘和鼠标滚轮操作。在那里你还能找到更新了的配音功能，现在使用 [Speech Dispatcher](https://wiki.archlinux.org/title/Speech_dispatcher) 作为其后端。

#### ? 其他的改动和优化

这次改进还包含了一些其他方面，值得注意的包括：

* 现在你可以打印特定的章节和文本选段。
* 把实验性质的传统标题栏选项移除了。
* 注解现在会随着各自的时间戳保存下来。
* 一个安全修复，禁用了对 Flatpak 的沙盒逃逸权限。

你可以浏览 [官方发布公告](https://github.com/johnfactotum/foliate/releases/tag/3.0.0) 获取更多信息。

### ? 如何获取 Foliate

这个全新的 Foliate 版本已经在 [Flathub 商店](https://flathub.org/apps/com.github.johnfactotum.Foliate) 和 [Snap 商店](https://snapcraft.io/foliate)（目前只提供开发者版本）上架。

>
> **[Foliate (Flathub)](https://flathub.org/apps/com.github.johnfactotum.Foliate)**
>
>
>

你还可以通过访问 [官方网站](https://johnfactotum.github.io/foliate/) 或 [GitHub 仓库](https://github.com/johnfactotum/foliate) 来获取源代码。

### 故障排除提示

如果 **Foliate 不能正常加载 EPUB 文件**，而你**正在使用英伟达显卡**，那么你可以设置以下任一环境变量来启动应用：

```
WEBKIT_DISABLE_COMPOSITING_MODE=1

```

```
WEBKIT_DISABLE_DMABUF_RENDERER=1

```

如果你已经安装了 **Foliate 的 Flatpak 版本**，只需使用 [Flatseal](https://itsfoss.com/flatseal/) 添加相同的环境变量即可。对我来说，第二个命令奏效了。

你可以查阅相关的 [GitHub 议题](https://github.com/johnfactotum/foliate/issues/1093) 进行进一步的故障排除。

*（题图：MJ/647e01ba-def8-43f3-b21a-94b2a54ee5c6）*

---

via: <https://news.itsfoss.com/foliate-3-0/>

作者：[Sourav Rudra](https://news.itsfoss.com/author/sourav/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[ChatGPT](https://linux.cn/lctt/ChatGPT) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


在 Ubuntu 上安装最新版的 Calibre

# 在 Ubuntu 上安装最新版的 Calibre

>
> Calibre 是一款自由开源的电子书软件。下面介绍如何在 Ubuntu Linux 上安装它。
>
>
>

作为电子书管理的瑞士军刀，Calibre 一直备受书籍爱好者和数字书虫们的喜爱。

虽然存在更好（更轻量级）的 [电子书阅读器](https://itsfoss.com/best-ebook-readers-linux/)，但 Calibre 在创建电子书、转换格式以及管理你的电子书库方面做得更出色。简言之，它是满足你所有电子书需求的全套解决方案。

在本教程中，我将会涉及：

* 从 Ubuntu 的仓库安装 Calibre（简单易行，但可能不是最新版本）
* 使用官方二进制文件安装 Calibre（稍微复杂些，但能获取最新版本）

### 方法1：从 Ubuntu 的仓库安装 Calibre

该方法简单易用，但可能无法获得最新的 Calibre 版本。但大多数情况下，这并不会造成问题。

Ubuntu 的 universe 仓库中提供了 Calibre 的稳定版本。此仓库在大多数系统中默认已启用，因此你只需在软件中心搜索即可，或者使用以下命令进行安装：

```
sudo apt install calibre

```

安装完成后，在系统菜单中找到它，然后启动。

#### 卸载 Calibre

如果你不再需要它，可以使用下面的命令卸载 Calibre：

```
sudo apt remove calibre

```

### 方法2：获取最新版本的 Calibre

[Calibre 官方](https://calibre-ebook.com/download_linux) 推荐安装提供的官方二进制文件。目的是防止用户使用存在错误或已过时的软件包。该二进制文件包含了所有私有版本的依赖项，支持 32 位和 64 位的机器。

首先，我们需要检查系统上是否已经安装了必要的依赖项：

```
apt -qq list xdg-utils wget xz-utils python3

```

如果上述包出现缺失的情况，就将它们安装上。

然后，复制并粘贴下列命令到终端里，按回车键以进行安装或升级：

```
sudo -v && wget -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdin

```

**可能的问题处理** ：如果你看到一个关于证书不受信任的错误，这表示你的电脑没有安装任何根证书，所以不能安全地下载安装程序。如果你仍然想要继续，向 `wget` 输入命令 `--no-check-certificate`，就像下面的命令一样：

```
sudo -v && wget --no-check-certificate -nv -O- https://download.calibre-ebook.com/linux-installer.sh | sudo sh /dev/stdin

```

#### 卸载 Calibre

如果你按照上述二进制安装法安装了 Calibre，你可以通过运行 `sudo calibre-uninstall` 来卸载 Calibre。或者，直接删除安装文件夹，这样就可以删除 99% 的安装文件。

### 结语

在一个数字阅读日渐普及的世界，这款开源软件证明了由社区驱动创新的强大影响。无论你是一名资深的电子书爱好者，还是正在初探数字阅读的世界，Calibre 都有你需要的东西。

尽管有 [详细的文档资源](https://calibre-ebook.com/help)，我们还提供了一个简单教程 [指导你在 Calibre 中创建电子书](/article-7977-1.html)。

>
> **[完整指南：在 Linux 上使用 Calibre 创建电子书](/article-7977-1.html)**
>
>
>

*在 Ubuntu 中体验 Calibre 吧。*

*（题图：MJ/b63e15a1-1a1c-4ae3-b6c7-40b4537cb567）*

---

via: <https://itsfoss.com/install-calibre-ubuntu/>

作者：[Ishaan Bhimwal](https://itsfoss.com/author/community/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[ChatGPT](https://linux.cn/lctt/ChatGPT) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1190 “Windows” 现在是一个 iOS 应用

Summary:
? “Windows” 现在是一个 iOS 应用
? Linux 6.6 正式成为今年的 LTS 内核
? 微软为 WSL 添加企业安全功能
»
»

进一步加强windows极致兼容战略

# 硬核观察 #1190 “Windows” 现在是一个 iOS 应用

### #1 “Windows” 现在是一个 iOS 应用

微软为 iOS、iPadOS、macOS、Windows 和 Web 浏览器创建了一个新的 “Windows 应用”，用于在各种设备上访问其操作系统。该应用基本上沿用了之前的 Windows 365 应用，并将其变成了一个中心枢纽，用于从远程 PC、Azure 虚拟桌面、Windows 365、Microsoft Dev Box 和微软远程桌面服务流式传输 Windows 副本。目前，该应用还不支持安卓，以及仅限于企业用户。之前，微软的类似应用叫做“远程桌面连接”。

>
> **[消息来源：The Verge](https://www.theverge.com/2023/11/16/23963568/microsoft-windows-app-ios-ipados-macos-web)**
>
>
>

>
> 老王点评：这是除了把 Linux 变成 Windows 应用外，Windows 也变成了一个应用。
>
>
>

### #2 Linux 6.6 正式成为今年的 LTS 内核

每年的 LTS 内核往往是该日历年的最后一个稳定内核版本。Linux 6.6 于十月底发布。与此同时，Linux 6.7 应该在 2023 年的最后几天或 2024 年的最初几天达到稳定。所以今年的 LTS 版本的内核被选为 Linux 6.6，它将一直被维护到 2026 年 12 月的生命周期结束。与此同时，Linux 6.1、5.15 和 5.10 也将达到生命周期结束。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Linux-6.6-Goes-LTS)**
>
>
>

>
> 老王点评：每年一个 LTS 内核，确实支持不过来。
>
>
>

### #3 微软为 WSL 添加企业安全功能

为了帮助企业管理 WSL，微软为 WSL 推出了新的企业安全选项。新功能包括通过微软的 Defender for Endpoint 监控 WSL 分发，通过 Intune 管理 WSL 及其关键安全设置，高级网络控制，以及 Windows 应用程序现在通过 WSL 插件与 WSL 集成，此功能用来提供了 Defender for Endpoint 的集成。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Microsoft-Security-WSL)**
>
>
>

>
> 老王点评：真是把 WSL 当成企业组件来看待了，而不是最初只是迎合很少的 Linux 程序员群体的想法了。
>
>
>


以太网已经 50 岁了，斩获 IEEE 里程碑称号

Summary: 这项技术已经成为全球标准的局域网。

以太网都50年，再往后几十年，所有人都是电子土著，人类社会深度绑定计算机和互联网

“电缆电视” 有个通俗名称： 有线电视。

最早的同轴电缆网线就是现在老式的有线电视线（粗线）。后来才发展出细线。

谢谢，受教了~

这项技术已经成为全球标准的局域网。

# 以太网已经 50 岁了，斩获 IEEE 里程碑称号

>
> 这项技术已经成为全球标准的局域网。
>
>
>

美国加利福尼亚州的[施乐](https://www.xerox.com/en-us)<ruby>   帕洛阿尔托研究中心  <rt>  Palo Alto Research Center </rt></ruby>（PARC）创新无数，诞生了诸如 <ruby>   阿尔托计算机  <rt>  Alto Computer </rt></ruby>（最早采用图形用户界面的个人电脑）及首台激光打印机等多项开创性计算机技术。

同时，PARC 也因发明 <ruby>   以太网  <rt>  Ethernet </rt></ruby> 技术而闻名，这项技术允许高速数据通过同轴电缆进行传输。以太网已经成为全球标准的有线局域网，并在企业和家庭中得到广泛应用。值得一提的是，以太网在诞生五十年后的今年，它被授予了 <ruby>   IEEE 里程碑  <rt>  IEEE Milestone </rt></ruby> 称号。

### 连接 PARC 的 Alto 计算机

以太网的开发始于 1973 年。当时，[Charles P. Thacker](https://amturing.acm.org/award_winners/thacker_1336106.cfm) 在设计阿尔托计算机，他设想了一个网络，能让阿尔托计算机与激光打印机、PARC 的 [ARPANET](https://ethw.org/ARPANET) 网关，以及其他阿尔托计算机进行通信。于是，PARC 的研究员、IEEE 会士 [Robert M. Metcalfe](https://ethw.org/Robert_M._Metcalfe) 接下了这项技术挑战。不久后，计算机科学家 [David Boggs](https://ethw.org/David_Boggs) 也加入到了 Metcalfe 的团队中。

对 Metcalfe 和 Boggs 来说，他们有两个目标：一是网络必须足够快，以支持他们的激光打印机；二是网络必须能在同一栋建筑内连接数百台计算机。

以太网的设计灵感来源于 [夏威夷大学](https://www.hawaii.edu/) 的 <ruby>   加入链路在线夏威夷地区网络  <rt>  Additive Links On-line Hawaii Area network </rt></ruby>（ALOHAnet），这是一种基于无线电的系统。计算机一旦有信息需要发送，就会立即通过一个共享通道进行传输，这个数据包的前栏会注明接收者的地址。若两个信息包发生冲突，发送的计算机会暂停一段随机的时间间隔后重试。

Metcalfe 在一封现在已 [广为人知的备忘录](https://ieeemilestones.ethw.org/w/images/a/af/Ref1_PARC_Ethernet_Memo_1973.pdf) 中，向同事们提出了他的提案，早期的时候它被称为“<ruby> 阿尔托 Aloha 网络 <rt>  Alto Aloha Network </rt></ruby>”。他提出，使用同轴电缆而不是无线电波可以让数据传输更快，并减少干扰。电缆的使用也意味着，用户可以在不关闭整个系统的情况下，随时加入或退出网络。Metcalfe 在 2004 年接受 <ruby>   IEEE 历史中心  <rt>  IEEE History Center </rt></ruby> 的 [口述历史](https://ethw.org/Oral-History:Robert_Metcalfe) 访谈时如是说。

Metcalfe 说:“有一种名为有线电视 <ruby> 压接器 <rt>  tap </rt></ruby> 的设备，可以在不割断同轴电缆的情况下，接入电缆信号。因此，[Boggs 和我]选择了同轴电缆作为我们的通信手段。在这封备忘录之中，我描述了以太网的运作原理——它是非常分布式的，没有中心控制，只是一个单一的‘<ruby> 以太 <rt>  Ether </rt></ruby>’片段。”

1973 年，Metcalfe 和 Boggs 设计了今日我们所说的以太网的最初版本。它最初的传输速率达到了 2.94 Mbps，“速度足够快，可以供给激光打印机，而且容易通过同轴电缆发送，”Metcalfe 对 IEEE 历史中心说。

一根粗细为 9.5 毫米、质地坚硬的同轴电缆被铺设在 PARC 大楼的走廊中央。这条长达 500 米的电缆上，通过所谓的 “<ruby> 吸血鬼压接 <rt>  Vampire Tap </rt></ruby>”（即 <ruby> N 连接器 <rt>  N connector </rt></ruby>）连接了 100 个收发信节点。这些压接有一个坚硬外壳，它们通过两个类似探针的器件“咬”穿电缆的外绝缘体，接触到了电缆的铜芯。这么一来，在不影响现有连接活跃状态的情况下，就可以增加新的节点。

每个 “吸血鬼压接” 内部都装配了一个 D 型连接器插口，由配对的九个插脚和九个插槽的插头插座组成。这些插座使得阿尔托算机、打印机以及文件服务器能连接到网络上。

为了让这些设备进行交流，Metcalfe 和 Boggs 创建了最早的高速<ruby> 网络接口卡 <rt>  network interface card </rt></ruby>（NIC） —— 这是一块插在计算机主板上的电路板。它包含了现在我们所说的以太网端口。

为了让人们更加清楚地理解，这个系统可以支持任何电脑，研究人员将最初的名字，“<ruby> 阿尔托 Aloha 网络 <rt>  Alto Aloha Network </rt></ruby>”，更改为了 “<ruby> 以太网 <rt>  Ethernet </rt></ruby>”。这个新名字反映了 Thacker 早期的一种观点，他说，同轴电缆其实就是“被困的以太”。PARC 的研究员 [Alan Kay](https://amturing.acm.org/award_winners/kay_3972189.cfm) 曾 [回忆](https://spectrum.ieee.org/xerox-parc) 起这一点。

Metcalfe、Boggs、Thacker 以及 [Butler W. Lampson](https://amturing.acm.org/award_winners/lampson_1142421.cfm) 在 1978 年因他们的发明获得了美国专利。

他们继续完善这项技术，并终于在 1980 年，PARC 推出了速度为 10 Mb/s 的以太网。根据这份 IEEE 里程碑奖项的描述，这一更新是与英特尔和 <ruby>   数字设备公司  <rt>  Digital Equipment Corp. </rt></ruby>（DEC）的研究员共同进行的，旨在为全行业创造出一种通用的以太网版本。

### 接纳为 IEEE 标准

以太网自 1980 年开始商业化后，其快速地演化成为整个行业的局域网标准。为了向计算机公司提供相关技术的框架，[IEEE 802 局域网标准委员会](https://grouper.ieee.org/groups/802/es-ecsg/) 在 1983 年 6 月将以太网正式定为标准。

目前，[IEEE 802](https://www.ieee802.org/#:~:text=The%20IEEE%20802%20LAN%2FMAN,them%20on%20a%20global%20basis.) 系列已经包含了 67 项已发布的标准，并且还有 49 个项目正在进行中。该委员会和全球各地的标准机构合作，将部分 IEEE 802 标准发布为国际指导准则。

在 PARC 设施外，有一块表彰这项技术的铭牌。其内容如下：

>
> 以太网有线局域网起源于 1973 年的施乐帕洛阿尔托研究中心 （PARC），其灵感源自于 ALOHAnet 数据包无线电网络和 ARPANET。施乐、DEC 和英特尔在 1980 年一起发布了一项针对通过同轴电缆的 10 Mbps 以太网的规范，这就成为了 IEEE 802.3-1985 标准。随后该标准进行了增强，提供了更高的速度，支持双绞线、光纤和无线媒介后，以太网在全球的家庭、商业、工业和学术环境中几乎无处不在。
>
>
>

由 IEEE 历史中心管理并得到 [捐赠者支持](https://www.ieeefoundation.org/donate_history) 的 IEEE 里程碑项目，专门表彰全球各地的杰出技术进步。

[IEEE 圣塔克拉拉谷分部](https://ieeescv.org/) 赞助了这项提名。该捐赠仪式将于 5 月 18 日在 PARC 设施举行。

*（题图：MJ/55dfc9c2-7aaa-447b-9897-8dbb49cdfbcf）*

---

via: <https://spectrum.ieee.org/ethernet-ieee-milestone>

作者：[JOANNA GOODRICH](https://spectrum.ieee.org/u/joanna-goodrich) 译者：[ChatGPT](https://linux.cn/lctt/ChatGPT) 校对：[wxy](https://github.com/wxy)


Vojtux：针对视力障碍用户改造 Linux

# Vojtux：针对视力障碍用户改造 Linux

>
> Vojtux 是 Fedora 项目的一部分，它是一款专门为视力障碍者打造的非官方 Linux 发行版。
>
>
>

我五岁时，父亲给我们带来了第一台电脑。那一刻，我就明确了自己的职业追求：计算机领域。从那时起，我就一直和电脑打交道。在高中阶段，我开始尝试黑客活动，以决定自己专注于何种领域，最终我选择了安全工程师作为我的职业。

如今，我已经在红帽的安全合规团队任职软件工程师两年多了，我在捷克进行远程工作。我已经使用 Linux 12 年了，主要是 Arch Linux 和 Fedora，然而我过去也管理过 Debian、Gentoo 和 Ubuntu。

*图片说明：这是一张黑白的笑脸 Vojtech 图片，图中有一个红色边框，背景是一架纸飞机。*

工作之余，我玩盲人足球，我还参与了许多项目，这些项目都是为了帮助视力障碍者和视力正常人群建立联系。包括我还在一个为视力障碍者举办活动的小型非政府组织（NGO）工作。我还在开发一个叫做 [Vojtux](https://github.com/vojtapolasek/Fegora) 的 Fedora 项目，这也是一个专门为视力障碍者打造的非官方 Linux 发行版。

### 辅助技术栈

我在使用智能设备时，需要依赖多种辅助技术，其中最主要的一款叫做屏幕阅读器。它是一款能将屏幕上的内容通过语音或盲文传达给视力障碍者的软件（简单来说，它就像我们的眼睛）。它能读并通知我当前正在关注的按钮或页面元素是什么，使得我能够与图形用户界面进行互动。

屏幕阅读器使用语音合成技术，将屏幕上的内容声音化。市面上有众多的语音合成器，有些听起来比别的更自然。我使用的是 Espeak，它听起来没有那么自然，但是它很轻便，运行也很快。此外，它几乎支持所有的语言，包括我正在使用的捷克语。

最后，我使用了一台能以盲文显示一行文字的盲文显示器，尤其在我写代码或者做代码审查的时候，我离不开它。通过触觉自由地从一个代码元素转移到另一个元素，使我能更轻松地把握代码的结构。我还可以使用它的按钮将光标移至我感兴趣的字符或屏幕区域，如果我想的话，我还能使用上面的盲文键盘输入。

### 我在日常生活中如何应用辅助技术

作为一个视障人士在使用电脑时，有许多事情其实可以借助上述技术轻松完成。以下是我日常经常做的一些事情：

* 我十分喜欢使用文本控制台。一般来说，只要是文字信息，盲人就可以借助屏幕阅读器进行阅读（虽然并非所有情况都适用，但在大多数情况下是可行的）。我通常用控制台进行系统管理、文本编辑以及查阅指导手册和文档。
* 我喜欢浏览网络并与网页进行互动。
* 我使用 VSCode 和 [Eclipse](https://opensource.com/article/20/12/eclipse) 进行代码编写以及代码审查工作。
* 我会发送电子邮件以及进行即时通讯。
* 我可以使用诸如谷歌文档（虽非开源，但在现代办公环境中广为使用）和 [LibreOffice](https://opensource.com/article/22/2/libreoffice-accessibility) 这样的文本处理软件。谷歌文档的开发团队加入了许多键盘快捷键，我可以利用它们在文档中浏览、跳转到标题或者注释里等等。
* 通常来说，我能够播放多媒体内容，但这也取决于应用程序的开发方式，有些媒体播放器在这方面做得更好。

### 可行，但困扰重重

随着技术的进步，一些任务尽管是可行的，但完成起来却相当困难，我称这类任务为“可行，但困扰重重”。

处理 PDF 文件非常艰难。有时，我不得不采用光学字符识别（OCR）软件将图像转换为文本。例如，我最近需要阅读一份餐厅菜单，他们在他们的网站上提供 PDF 菜单，但它已经被压平，丧失了文字层。在我这里，这显示为一片空白屏幕。我只能通过在智能手机上使用 OCR 应用程序来帮我提取文本。这不仅需要额外的步骤，而且提取的文本翻译并不总是完全准确。

查看和创建演示文稿也可能困难重重。为了解决这个问题，我采用像 [Pandoc](https://opensource.com/article/18/9/intro-pandoc) 这样的软件用 HTML 创建幻灯片，它可以处理 [Markdown](https://opensource.com/article/19/9/introduction-markdown) 并将其转换成幻灯片。我已经使用这种方法好几年了，效果很好。它允许我完全掌控生成的幻灯片，因为 Markdown 就是简单的文本。

通过将其基于声音或文字，可以使视频游戏更易于接入。然而，在 Linux 上玩游戏可以是一大挑战，不仅需要找到能够进行无障碍访问的游戏，而且由于大多数 PC 游戏原生支持 Windows，因此还需要处理一些兼容性问题。

有些网站和界面比其他的难以导航。往往只需要通过正确设置一些属性，这些问题就可以很容易地得到解决。一般来说，大量的网页内容都以图像的形式存在。提高网页内容可访问性的一个快速有效的方法就是确保图像都添加了替代文本，使得屏幕阅读器可以读出来，让无法辨识图像的人们也能了解图像内容。还有另一种经常遇到的情况是遇到没有标签的控件：你知道那里有一个按钮或复选框，但你无法确定它具体的功能。

### Vojtux 项目：为了更好的 Linux 可访问性

开发者并不是特意设计出无障碍访问困难的应用程序，问题在于他们通常不清楚如何测试可访问性。由于视障 Linux 用户数量有限，可访问性的测试和反馈往往不足。因此，开发者往往不能生产易于访问的应用，用户也相应较少。这样形成了一个恶性循环。

Vojtux 项目就是希望能处理这个问题。我们希望能建立一个对视障用户更友好的 Fedora 改造版本。我们的目标是吸引更多用户，并鼓励他们发现并报告问题，以便开源社区的开发者可以解决这些问题。

你可能会问为什么要做这个项目？我们需要明确的是，Fedora 在设计上并非就没有可访问性，实际上，它有许多作为包的形式存在的辅助工具。但这些工具不是从一开始就存在，且需要许多细小的配置才能顺利使用，这可能会让初次使用 Fedora 的用户感到困惑。

我们期望 Vojtux 对视障用户而言尽可能友好和可预知。当用户启动立付镜像时，只需出现图形用户界面，屏幕阅读就会立即开始。所有必要的可访问性 [环境变量](https://opensource.com/article/19/8/what-are-environment-variables) 将会被正确地加载和配置。

Vojtux 还实现了以下功能，例如：

* 配置开机就能使用的辅助性环境变量。
* 图形界面一加载，Orca 屏幕阅读器就会启动。
* 添加了自定义库，该库包含额外的语音合成和打包软件。
* 添加了许多替代键盘快捷键。
* 还有一个特别的脚本可以控制显示器的开关。很多用户根本不需要显示器，关闭它则是一种极好的节能方式！

### 想要帮忙？这就需要你了

首先，如果你希望为 Vojtux 做贡献（或只是帮助传播），可以在我们的 [项目库](https://github.com/vojtapolasek/Fegora) 查找更多信息。

此外，在团队中与视障人士协作时，可能需要考虑应用哪些无障碍技术。例如，因为我们都是通过声音获取信息，所以我们很难同时进行听说和阅读，除非有人非常熟练于使用盲文显示器。

最后，要记住，无论是演示幻灯片、网站还是 PDF，盲人和视障用户都与你使用相同的最终产品。当你开发产品或创作内容时，你的选择对我们能否有效地进行互动和访问有着巨大的影响。知道我们在这里，我们热爱使用计算机和科技，并且我们经常愿意帮助你进行测试。

*图片说明：手持足球的 Vojtech，他身穿足球服，戴着防护眼镜。*

本文作者最初于 2022 年 9 月发布文章，并在后续将项目的官方名称更新为 Vojtux。

*（题图：MJ/06477e84-6119-45d0-8085-5936a607ee68）*

---

via: <https://opensource.com/article/22/9/linux-visually-impaired-users>

作者：[Vojtech Polasek](https://opensource.com/users/vpolasek) 选题：[lkxed](https://github.com/lkxed) 译者：[ChatGPT](https://linux.cn/lctt/ChatGPT) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


硬核观察 #1191 Linux 中的 Rust 支持继续成熟

Summary:
? Linux 中的 Rust 支持继续成熟
? 微软庆祝 “补丁星期二” 20 周年
? 亚马逊宣布推出 Olympus LLM
»
»

现在还没有公开自己的大模型的顶级IT公司只有苹果了。

rust for linux合并进主线的速度超级慢，到现在也就进去了很小一部分。

这个是主线的文档 https://rust-for-linux.github.io/docs/v6.6-rc2/kernel/

这个是全部的文档 https://rust-for-linux.github.io/docs/rust/kernel/

# 硬核观察 #1191 Linux 中的 Rust 支持继续成熟

### #1 Linux 中的 Rust 支持继续成熟

Linux 中的 Rust 支持正在不断走向成熟，并得到了思科、三星和 Canonical 等开发商和供应商的大力支持。Rust 不可能取代 C 语言在 Linux 内核中的地位，但 Rust 绝对会成为 Linux 开发的重要语言。当然，前进的道路并不平坦，比如，死锁在 Rust 中是安全的，但在 Linux 内核中却不安全，程序员们正在解决这些问题。此外，越来越多的人开始关注将 Rust 支持反向移植到 Linux 的长期支持（LTS）版本中。Rust 开发者也会打破一个禁止重复驱动的通用规则，因为没有人愿意重复造轮子，但一些维护者希望从自己已经熟悉的驱动程序开始简单的尝试。

>
> **[消息来源：ZDnet](https://www.zdnet.com/article/rust-in-linux-where-we-are-and-where-were-going-next/)**
>
>
>

>
> 老王点评：一旦 Rust 支持进一步成熟，饱受各种安全漏洞影响的内核的很多部分都会逐渐用 Rust 改写。
>
>
>

### #2 微软庆祝 “补丁星期二” 20 周年

每个月的第二个周二，微软都会对其产品发布安全补丁。这一传统始于比尔·盖茨在 2002 年发表的 “<ruby> 可信计算 <rt>  Trustworthy Computing </rt></ruby>” 备忘录。在采用这种统一方法之前，微软的安全更新时断时续，给 IT 专业人员和组织及时部署关键补丁带来了巨大挑战。微软安全响应中心（MSRC）率先提出了为补丁发布制定可预测时间表的想法，从 “准备就绪即发布” 的模式转变为每周定期发布，最终转变为每月发布。

>
> **[消息来源：微软](https://msrc.microsoft.com/blog/2023/11/reflecting-on-20-years-of-patch-tuesday)**
>
>
>

>
> 老王点评：不得不说，补丁星期二为安全实践带来了很好的示范，但是似乎这种实践在开源领域并不太适用，仍然采用的是“准备就绪即发布”模式。
>
>
>

### #3 亚马逊宣布推出 Olympus LLM

这个代号为 Olympus 的模型有 2 万亿个参数，可以使其成为目前正在训练的最大模型之一。OpenAI 的 GPT-4 模型据说有 1 万亿个参数。Amazon CEO 说，“客户希望把模型带到他们的数据中，而不是相反。而这些数据中的大部分都在 AWS 中。”

>
> **[消息来源：路透社](https://www.reuters.com/technology/amazon-sets-new-team-trains-ambitious-ai-model-codenamed-olympus-sources-2023-11-08/)**
>
>
>

>
> 老王点评：现在没有个自己的大模型，你都不好意思说自己是个顶级 IT 公司。
>
>
>


人工智能教程（二）：人工智能的历史以及再探矩阵

> （LCTT 译注：本文发表于 2022 年 6 月，半年后，ChatGTP 才推出）

GTP是打错了吗？还是故意讽刺的什么

来自四川成都的 Chrome Mobile 116.0|Android 10 用户

抱歉，是笔误。

A.nidm 这个写错了， 应该是A.ndim

谢谢！

# 人工智能教程（二）：人工智能的历史以及再探矩阵

*在本系列的 [第一篇文章](/article-16326-1.html) 中，我们讨论了人工智能、机器学习、深度学习、数据科学等领域的关联和区别。我们还就整个系列将使用的编程语言、工具等做出了一些艰难的选择。最后，我们还介绍了一点矩阵的知识。在本文中，我们将深入地讨论人工智能的核心——矩阵。不过在此之前，我们先来了解一下人工智能的历史。*

我们为什么需要了解人工智能的历史呢？历史上曾出现过多次人工智能热潮，但在很多情况下，对人工智能潜力的巨大期望都未能达成。了解人工智能的历史，有助于让我们看清这次人工智浪潮是会创造奇迹，抑或只是另一个即将破灭的泡沫。

我们对人工智能的最寻起源于何时呢？是在发明数字计算机之后吗？还是更早呢？我相信对一个无所不知的存在的追求可以追溯到文明之初。比如古希腊神话中的 <ruby> 德尔菲 <rt>  Delphi </rt></ruby> 就是这样一位能回答任何问题的先知。从远古时代起，对于超越人类智慧的创造性机器的探索同样吸引着我们 。历史上有过几次制造国际象棋机器的失败的尝试。其中就有臭名昭著的<ruby> 机械特克 <rt>  Mechanical Turk </rt></ruby>，它并不是真正的机器人，而是由一位藏在内部的棋手操控的。<ruby> 约翰·纳皮尔 <rt>  John Napier </rt></ruby> 发明的对数、<ruby> 布莱斯·帕斯卡 <rt>  Blaise Pascal </rt></ruby> 的计算器、<ruby> 查尔斯·巴贝奇 <rt>  Charles Babbage </rt></ruby> 的差分机等，这些都是人工智能研究的前身。回顾人类历史，你会发现更多真实或虚构的时刻，人们想要获得超越人脑的智能。如果不考虑以上这些历史成就，对真正人工智能的探索起始于数字计算机的发明。

那么，人工智能发展至今有哪些里程碑呢？前面已经提到，数字计算机的发明是人工智能研究历程中最重要的事件。与可扩展性依赖于功率需求的机电设备不同，数字设备受益于技术进步，比如从真空管到晶体管到集成电路再到如今的超大规模集成技术。

人工智能发展的另一个里程碑是 <ruby> 阿兰·图灵 <rt>  Alan Turing </rt></ruby> 首次对人工智能的理论分析。他提出的 <ruby> 图灵测试 <rt>  Turing test </rt></ruby> 是最早的人工智能测试方法之一。现在图灵测试可能已经不太适用了，但它是定义人工智能的最初尝试之一。图灵测试可以简单描述如下：假设有一台能够与人类对话的机器，如果它能在对话中让人无法分辨它是人还是机器，那么就可以认为这台机器具有智能。如今的聊天机器人非常强大，使我们很容易看出图灵测试无法识别出真正的人工智能。但在 20 世纪 50 年代初，这确实为理解人工智能提供了一个理论框架。

20 世纪 50 年代末，<ruby> 约翰·麦卡锡 <rt>  John McCarthy </rt></ruby> 发明了 Lisp 编程语言。它是最早的高级编程语言之一。在此之前，计算机编程用的是机器语言和汇编语言（众所周知地难用）。有了强大的机器和编程语言，计算机科学家中的乐观主义和梦想家顺理成章地开始用它们来创造人工智能。20 世纪 60 年代初，对人工智能机器的期望达到了顶峰。当然计算机科学领域取得了很大发展，但人工智能的奇迹发生了吗？很遗憾，并没有。20 世纪 60 年代见证了第一次人工智能热潮的兴起和破灭。然而计算机科学以无与伦比的速度继续发展着。

到了 70 年代和 80 年代，算法在这一时期发挥了主要作用。在这段时间，许多新的高效算法被提出。20 世纪 60 年代末<ruby> 高德纳·克努特 <rt>  Donald Knuth </rt></ruby>（我强烈建议你了解一下他，在计算机科学界，他相当于数学界的高斯或欧拉）著名的《<ruby> 计算机程序设计艺术 <rt>  The Art of Computer Programming </rt></ruby>》第一卷的出版标志着算法时代的开始。在这些年中，开发了许多通用算法和图算法。此外，基于人工神经网络的编程也在此时兴起。尽管早在 20 世纪 40 年代，<ruby> 沃伦·S.·麦卡洛克 <rt>  Warren S. McCulloch </rt></ruby>和<ruby> 沃尔特·皮茨 <rt>  Walter Pitts </rt></ruby> 就率先提出了人工神经网络，但直到几十年后它才成为主流技术。今天，深度学习几乎完全是基于人工神经网络的。算法领域的这种发展导致了 20 世纪 80 年代人工智能研究的复苏。然而，这一次，通信和算力的限制阻碍了人工智能的发展，使其未能达到人们野心勃勃的预期。然后是 90 年代、千禧年，直到今天。又一次，我们对人工智能的积极影响充满了热情和希望。

我你们可以看到，在数字时代，人工智能至少有两次前景光明的机会。但这两次人工智能都没有达到它的预期。现在的人工智能浪潮也与此类似吗？当然这个问题很难回答。但我个人认为，这一次人工智能将产生巨大的影响（LCTT 译注：本文发表于 2022 年 6 月，半年后，ChatGPT 才推出）。是什么让我做出这样的预测呢？第一，现在的高性能计算设备价格低廉且容易获得。在 20 世纪 60 年代或 80 年代，只有几台如此强大的计算设备，而现在我们有数百万甚至数十亿台这样的机器。第二，现在有大量数据可用来训练人工智能和机器学习程序。想象一下，90 年代从事数字图像处理的人工智能工程师，能有多少数字图像来训练算法呢？也许是几千或者几万张吧。现在单单数据科学平台 Kaggle（谷歌的子公司）就拥有超过 1 万个数据集。互联网上每天产生的大量数据使训练算法变得容易得多。第三，高速的互联网连接使得与大型机构协作变得更加容易。21 世纪的头 10 年，计算机科学家之间的合作还很困难。如今互联网的速度已经使谷歌 Colab、Kaggle、Project jupiter 等人工智能项目的协作成为现实。由于这三个因素，我相信这一次人工智能将永远存在，并会出现许多优秀的应用。

### 更多矩阵的知识

在大致了解了人工智能的历史后，现在是时候回到矩阵与向量这一主题上了。在上一篇文章中，我已经对它们做了简要介绍。这一次，我们将更深入矩阵的世界。首先看图 1 和 图 2，其中显示了从 A 到 H 共 8 个矩阵。为什么人工智能和机器学习教程中需要这么多矩阵呢？首先，正如前一篇文章中提到的，矩阵是线性代数的核心，而线性代数即使不是机器学习的大脑，也是机器学习的核心。其次，在接下来的讨论中，它们每一个都有特定的用途。

让我们看看矩阵是如何表示的，以及如何获取它们的详细信息。图 3 展示了怎么用 NumPy 表示矩阵 A。虽然矩阵和数组并不完全等价，但实践中我们经常将它们作为同义词来使用。

我强烈建议你仔细学习如何使用 NumPy 的 `array` 函数创建矩阵。虽然 NumPy 也提供了 `matrix` 函数来创建二维数组和矩阵。但是它将在未来被废弃，所以不再建议使用了。在图 3 还显示了矩阵 A 的一些详细信息。`A.size` 告诉我们数组中元素的个数。在我们的例子中，它是 9。代码 `A.ndim` 表示数组的 <ruby> 维数 <rt>  dimension </rt></ruby>。很容易看出矩阵 A 是二维的。`A.shape` 表示矩阵 A 的<ruby> 阶数 <rt>  order </rt></ruby>，矩阵的阶数是矩阵的行数和列数。虽然我不会进一步解释，但使用 NumPy 库时需要注意矩阵的大小、维度和阶数。图 4 显示了为什么应该仔细识别矩阵的大小、维数和阶数。定义数组时的微小差异可能导致其大小、维数和阶数的不同。因此，程序员在定义矩阵时应该格外注意这些细节。

现在我们来做一些基本的矩阵运算。图 5 显示了如何将矩阵 A 和 B 相加。NumPy 提供了两种方法将矩阵相加，`add` 函数和 `+` 运算符。请注意，只有阶数相同的矩阵才能相加。例如，两个 4 × 3 矩阵可以相加，而一个 3 × 4 矩阵和一个 2 × 3 矩阵不能相加。然而，由于编程不同于数学，NumPy 在实际上并不遵循这一规则。图 5 还展示了将矩阵 A 和 D 相加。记住，这种矩阵加法在数学上是非法的。一种叫做 <ruby> 广播 <rt>  broadcasting </rt></ruby> 的机制决定了不同阶数的矩阵应该如何相加。我们现在不会讨论广播的细节，但如果你熟悉 C 或 C++，可以暂时将其理解为变量的类型转换。因此，如果你想确保执行正真数学意义上的矩阵加法，需要保证以下测试为真:

```
A.shape == B.shape

```

广播机制也不是万能的，如果你尝试把矩阵 D 和 H 相加，会产生一个运算错误。

当然除了矩阵加法外还有其它矩阵运算。图 6 展示了矩阵减法和矩阵乘法。它们同样有两种形式，矩阵减法可以由 `subtract` 函数或减法运算符 `-` 来实现，矩阵乘法可以由 `matmul` 函数或矩阵乘法运算符 `@` 来实现。图 6 还展示了 <ruby> 逐元素乘法 <rt>  element-wise multiplication </rt></ruby> 运算符 `*` 的使用。请注意，只有 NumPy 的 `matmul` 函数和 `@` 运算符执行的是数学意义上的矩阵乘法。在处理矩阵时要小心使用 `*` 运算符。

对于一个 m x n 阶和一个 p x q 阶的矩阵，当且仅当 n 等于 p 时它们才可以相乘，相乘的结果是一个 m x q 阶矩的阵。图 7 显示了更多矩阵相乘的示例。注意 `E@A` 是可行的，而 `A@E` 会导致错误。请仔细阅读对比 `D@G` 和 `G@D` 的示例。使用 `shape` 属性，确定这 8 个矩阵中哪些可以相乘。虽然根据严格的数学定义，矩阵是二维的，但我们将要处理更高维的数组。作为例子，下面的代码创建一个名为 T 的三维数组。

```
T = np.array([[[11,22], [33,44]], [[55,66], [77,88]]])

```

### Pandas

到目前为止，我们都是通过键盘输入矩阵的。如果我们需要从文件或数据集中读取大型矩阵并处理，那该怎么办呢？这时我们就要用到另一个强大的 Python 库了——Pandas。我们以读取一个小的 CSV （<ruby> 逗号分隔值 <rt>  comma-separated value </rt></ruby>）文件为例。图 8 展示了如何读取 `cricket.csv` 文件，并将其中的前三行打印到终端上。在本系列的后续文章中将会介绍 Pandas 的更多特性。

### 矩阵的秩

矩阵的 <ruby> 秩 <rt>  Rank </rt></ruby> 是由它的行（列）张成的向量空间的维数。如果你还记得大学线性代数的内容的话，你一定对维数、向量空间和张成还有印象，那么你也应该能理解矩阵的秩的含义了。但如果你不熟悉这些术语，那么可以简单地将矩阵的秩理解为矩阵中包含的信息量。当然，这又是一种未来方便理解而过度简化的说法。图 9 显示了如何用 NumPy 求矩阵的秩。矩阵 A 的秩为 3，因为它的任何一行都不能从其它行中得到。矩阵 B 的秩为 1，因为第二行和第三行可以由第一行分别乘以 2 和 3 得到。矩阵 C 只有一个非零行，因此秩为 1。同样的，其它矩阵的秩也不难理解。矩阵的秩与我们的主题关系密切，我们会在后续文章中再提到它。

本次的内容就到此结束了。在下一篇文章中，我们将扩充工具库，以便它们可用于开发人工智能和机器学习程序。我们还将更详细地讨论 <ruby> 神经网络 <rt>  neural network </rt></ruby>、<ruby> 监督学习 <rt>  supervised learning </rt></ruby>、<ruby> 无监督学习 <rt>  unsupervised learning </rt></ruby> 等术语。此外，从下一篇文章开始，我们将使用 JupyterLab 代替 Linux 终端。

*（题图：MJ/ce77d714-3651-44e4-96b0-ffbf7ae4269c）*

---

via: <https://www.opensourceforu.com/2022/06/ai-some-history-and-a-lot-more-about-matrices/>

作者：[Deepu Benson](https://www.opensourceforu.com/author/deepu-benson/) 选题：[lkxed](https://github.com/lkxed) 译者：[toknow-gh](https://github.com/toknow-gh) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Linux 爱好者线下沙龙：LLUG 2023·杭州八方城见

Summary: 就在这个周末， LLUG（Linux 爱好者沙龙）来到杭州。

就在这个周末， LLUG（Linux 爱好者沙龙）来到杭州。

# Linux 爱好者线下沙龙：LLUG 2023·杭州八方城见

> 就在这个周末， LLUG（Linux 爱好者沙龙）来到杭州。

2023 年 11 月 25 日下午，我们将在杭州市杭州未来科技城国际人才园（五常地铁站附近）举行 **LLUG 2023 · 杭州场**，欢迎广大的 Linux 爱好者来到现场，与我们一同交流技术，分享自己工作过程中的所思所想。

本次活动依然由 Linux 中国和龙蜥社区（OpenAnolis）联合主办，杭州 GDG 协办，杭州城西科创大走廊高层次人才联合会提供场地支持。

> 龙蜥社区（OpenAnolis）是国内的顶尖 Linux 发行版社区，我们希望在普及 Linux 知识的同时，也能让中国的 Linux 发行版，为更多人知晓，推动国产发行版的发展和进步。

> 杭州城西科创大走廊高层次人才联合会简称“高联会”，高联会是在杭州城西科创大走廊管委会指导下，旨在广泛吸纳与团结廊内高层次人才，助力人才在杭州城西科创大走廊的创新创业。

> 杭州GDG（杭州谷歌开发者社区），谷歌官方赞助的杭州本地技术社区，每年定期举办免费开发者线下技术沙龙，聚焦谷歌相关开源技术，欢迎大家关注微信公众号“杭州GDG”，了解我们，参与技术交流。

活动议程

| 时间 | 议题 | 分享简介 | 分享者 |
| --- | --- | --- | --- |
| 14:00~14:20 | 签到 |
| 14:20~14:30 | LLUG 活动介绍 |  | 白宦成 |
| 14:30~15:00 | deepin v23 内核成果分享与技术前瞻 | 在deepin v23的研发过程中，我们在系统内核方面获得了相当多的技术成果，希望与各位开发者们共同讨论deepin根社区内核未来的发展方向。 | 王昱力
deepin社区 内核研发工程师 |
| 15:00~15:45 | 开源实用指南（个人篇+企业篇） | 老王的经典分享，本次追加了企业篇，帮助大家更好的理解如何参与开源。 | 硬核老王
Linux 中国开源社区创始人 |
| 15:50~16:20 | multipush v0.0.1 发布 | LLUG 自己的多平台 RTMP 推流软件 multipush，帮助大家一次直播，多平台推流。欢迎大家参与贡献 & 体验～ | 白宦成
Linux 中国技术组组长  |
| 16:20~17:00 | 闪电演讲（短分享） |
| 17:00 ~ 18:00 | 线下交流 |

#### deepin V23 内核成功分享与技术前瞻

*王昱力，deepin社区 内核研发工程师*

在deepin v23的研发过程中，我们在系统内核方面获得了相当多的技术成果，包括电源管理与可移动设备功耗优化、安全子系统升级和飞腾、国产CPU的兼容适配。我们希望提高deepin内核的可定制性和可玩度，与各位开发者们共同讨论deepin根社区内核未来的发展方向。

#### 《开源实用指南（个人篇+企业篇）》

*硬核老王（wxy），Linux 中国开源社区创始人*

老王的经典分享，聊聊作为一个社区新人，应该如何参与到开源社区当中，并逐步成长为社区的中坚力量的。以及，企业如何才能正确参与开源和培养开源文化。

#### 《multipush v0.0.1 发布》

*白宦成，Linux 中国技术组组长*

LLUG 作为一个线下活动，经常遭遇到需要多平台推流的问题。过去我们使用 OBS 的软件推流，但会受限于插件方和操作系统环境，因此，我们希望提供一套开源的、服务端部署的多平台推流软件，帮助各运营同学能够更简单的完成多平台推流。

#### 闪电演讲

本次线下活动依旧保留闪电演讲环节，作为最受欢迎的线下活动，本次活动依旧继续举办闪电演讲。每位演讲者有 5 分钟时间参与现场活动，可以提前报名，也可即兴上台演讲。时间一满，马上结束～强制大家控制自己的分享时间，用最短的时间，向大家发出你的声音～

上海场闪电演讲照片：

*胡张治分享自己从 GNU/Linux 小白到 ArchLinuxCN 贡献者的旅程*

*李伟光现场介绍 neovim 的使用*

### 活动地点及到达信息

活动地点：余杭区荆长路601号未来科技城国际人才园五楼506室（五常地铁站附近）

活动报名地址：

>
> **<https://jinshuju.net/f/u8xtD3>**
>
>
>

并在活动前收到我们的提醒～此外，也可以在问卷中反馈你想听的内容，我们将竭尽所能，邀请行业专家，针对大家感兴趣的话题进行分享。

如果你因为有事，没办法来到线下，那也没问题，我们的活动也会在 Linux 中国视频号、Linux 中国 B 站、龙蜥 B 站、龙蜥钉钉群等开启同步直播。

当然，我们更希望你能亲自来到线下，和我们一起聊聊开源，聊聊技术～

*扫码报名*