一个深色模式的简单 CSS 技巧

Summary: 让你的网站根据用户选择的主题进行调整的能力是一个很棒的辅助功能。

让你的网站根据用户选择的主题进行调整的能力是一个很棒的辅助功能。

>
> 让你的网站根据用户选择的主题进行调整的能力是一个很棒的辅助功能。
>
>
>

![](/data/attachment/album/202111/04/101203a19wb2ptlcmwmmnl.jpg "Text editor on a browser, in blue")

你可能已经熟悉<ruby> 媒体查询 <rt>  media query </rt></ruby>了。它们被广泛地用于使网站具有响应性。`width` 和 `height` 属性包含视区的尺寸。然后，你可以使用 CSS 在不同的尺寸下呈现不同的布局。

[prefers-color-scheme 媒体查询](https://drafts.csswg.org/mediaqueries-5/#prefers-color-scheme) 的工作方式与此相同。用户可以将他们的操作系统配置为使用浅色或深色主题。`prefers-color-scheme` 包含这个值。该值是 `light` 或 `dark` ，尽管 W3C 规范指出它可能支持未来的值，如 `sepia`。我为这两种模式指定不同的 CSS 变量值，让用户的操作系统来决定。

### prefers-color-scheme 媒体查询

`prefers-color-scheme` 媒体查询的两种变化是:

```
/* Light mode */
@media (prefers-color-scheme: light) {
   :root {
       --body-bg: #FFFFFF;
       --body-color: #000000;
   }
}

/* Dark mode */
@media (prefers-color-scheme: dark) {
   :root {
       --body-bg: #000000;
       --body-color: #FFFFFF;
   }
}

```

在上面的 CSS 中，`--body-bg` 和 `--body-color` 是 [CSS 变量](https://www.w3.org/TR/css-variables-1/)。正如你所看到的，它们对两种模式都包含不同的值。在浅色主题中，我设置了一个白色背景和黑色文本。在深色主题中，我设置了黑色背景和白色文本。

因为[规范](https://drafts.csswg.org/mediaqueries-5/#prefers-color-scheme)说 W3C 可能会引入未来的值，所以把这个 CSS 转换为默认值是有意义的。

```
/* Light mode */
:root {
   --body-bg: #FFFFFF;
   --body-color: #000000;
}

/* Dark mode */
@media (prefers-color-scheme: dark) {
   :root {
       --body-bg: #000000;
       --body-color: #FFFFFF;
   }
}

```

在上面的代码中，我默认定义了一个浅色主题，如果媒体查询是 `dark`，则将其转换为深色主题。这样一来，以后任何添加到媒体查询的值都会默认设置为浅色主题。

### 使用 CSS 变量

现在我为不同的主题设置了不同的值，我需要实际使用它们来设计页面。

```
body {
   background: var(--body-bg);
   color: var(--body-color);
}

```

[var() 语法](https://www.w3.org/TR/css-variables-1/) 是 CSS 使用变量的方式。在上面的代码中，我是说把 `background` 设置为 `--body-bg` 的值，把 `color` 设置为 `--body-color` 的值。注意，这些变量的值来自媒体查询。这意味着背景和前景的颜色是根据操作系统的设置而改变的！

这就是媒体查询的真正能力。提供一个从操作系统到网页的一致的用户体验。

如果你进入 [findmymastodon.com](https://findmymastodon.com/)，并切换你的操作系统的主题，你会看到从一个主题到另一个主题的过渡。

[CSS 工作组](https://drafts.csswg.org/mediaqueries-5/#prefers-color-scheme) 网站也使用同样的媒体查询。改变你的操作系统主题，网站就会切换主题来进行调整。

### 结论

请注意，使用 `prefers-color-scheme` 与使用普通的编程语言没有什么不同。我定义了一些变量，这些变量的值根据一些逻辑而改变。而这些变量然后被用于进一步的操作。

让你的网站根据用户选择的主题进行调整的能力是一个很棒的辅助功能。而且，为了用户的利益，它进一步模糊了桌面和网络之间的界限。最新的浏览器版本 [支持 prefers-color-scheme](https://caniuse.com/prefers-color-scheme)，所以你今天就可以开始实验了。

编码愉快。

这篇文章最初发表在 [作者的网站](https://ayushsharma.in/2021/10/creating-light-and-dark-themes-for-websites-correctly-using-prefers-color-scheme) 上，经许可后重新发表。

---

via: <https://opensource.com/article/21/10/dark-themes-websites>

作者：[Ayush Sharma](https://opensource.com/users/ayushsharma) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #445 在元宇宙中做 PPT 和 Excel

Summary: 更多：• 用超级计算机应对人类抗生素耐药性 • 小偷机器人正在窃取你的 2FA 代码

![](/data/attachment/album/202111/04/122542x3l290u94ll09cu3.jpg)

### 在元宇宙中做 PPT 和 Excel

![](/data/attachment/album/202111/04/122555gdlwodft37msssiz.jpg)

目前最热的流行词某过于“元宇宙”了。除了连名字都改成 “Meta” 的 Facebook 之外，微软也在积极 [拥抱元宇宙](https://www.bloomberg.com/news/articles/2021-11-02/microsoft-s-own-metaverse-is-coming-and-it-will-have-powerpoint)，它正在调整其标志性的软件产品，以创建一个更加企业化的元宇宙版本。第一个产品是具有数字化身功能的聊天和会议程序 Teams，该版本正在进行测试，将于 2022 年上半年推出。用户也能在这个空间中使用 PowerPoint 和 Excel。当然，除了这些企业级需求外，微软也会将其游戏产品搬到元宇宙里面。

>
> 老王点评：哪怕是在虚拟世界，你也得工作。
>
>
>

### 用超级计算机应对人类抗生素耐药性

![](/data/attachment/album/202111/04/122624lc7skvdvdcvkd7dq.jpg)

像红霉素这样的抗生素曾经起到了巨大作用，但是随着抗生素的滥用，很多细菌都对抗生素产生了耐药性。据估计，每年约有 70 万人死于抗生素耐药细菌，而这一数字预计将上升至数百万。朴茨茅斯大学研究团队的 [一项研究](https://www.news-medical.net/news/20211103/Scientists-tackle-antibiotic-resistance-by-using-supercomputers.aspx) 通过重新设计现有抗生素来克服细菌耐药性机制，利用超级计算机来对抗细菌的进化能力，最终解决耐药性问题。该团队已经证明，他们的最佳候选药物（尚未进行临床试验）对测试菌株的活性是红霉素和克拉霉素的 56 倍。其候选药物对世卫清单上排名前三的细菌依然有效，而这三种细菌已经对红霉素和克拉霉素产生耐药性。

>
> 老王点评：有人曾经问超级计算机有什么用？这就是超级计算机的用处之一。
>
>
>

### 小偷机器人正在窃取你的 2FA 代码

![](/data/attachment/album/202111/04/122639zoxtoaoxdvrnzo0o.jpg)

诈骗者使用了一种机器人，[通过电话](https://www.vice.com/en/article/y3vz5k/booming-underground-market-bots-2fa-otp-paypal-amazon-bank-apple-venmo) 冒充苹果支付、贝宝、亚马逊、Coinbase 和各种银行的来电，欺骗受害者输入其 2FA 代码。电话中说，“有人试图使用你的账户消费。需要验证你的身份以阻止转账”。并说：“为了保护你的账户，请输入我们现在发给你的移动设备的代码。”在输入一串六位数字后，该声音说："谢谢你，你的账户已经得到保护……。你现在可以挂断了。”以前往往需要黑客直接与受害者对话，在电话中假装是银行或相关支付机构，而这些机器人大大降低了绕过多因素认证的门槛。

>
> 老王点评：真是科技助长坏人。无论如何，你的多因素认证代码不要给任何人，除非是你主动进行的操作。
>
>
>


构建基础包的基础知识

![](/data/attachment/album/202111/05/113250t7q20dqqzdgges05.png)

>
> 这是一篇快速提示，旨在给 Ubuntu 的新用户解释构建基础包是什么、它的用处和安装步骤。
>
>
>

在 Ubuntu 中安装构建基础包（`build-essential`），只需要在终端中简单输入这个命令：

```
sudo apt update && sudo apt install build-essential

```

但围绕它有几个问题，你可能想知道答案：

* 什么是构建基础包？
* 它包含什么内容？
* 为什么要安装它（如果安装的话）？
* 如何安装它？
* 如何删除它？

### 什么是 Ubuntu 中的构建基础包？

构建基础包（`build-essential`）实际上是属于 Debian 的。在它里面其实并不是一个软件。它包含了创建一个 Debian 包（`.deb`）所需的软件包列表。这些软件包包括 `libc`、`gcc`、`g++`、`make`、`dpkg-dev` 等。构建基础包包含这些所需的软件包作为依赖，所以当你安装它时，你只需一个命令就能安装所有这些软件包。

请不要认为构建基础包是一个可以在一个命令中神奇地安装从 Ruby 到 Go 的所有开发工具的超级软件包。它包含一些开发工具，但不是全部。

#### 你为什么要安装构建基础包？

它用来从应用的源代码创建 DEB 包。一个普通用户不会每天都去创建 DEB 包，对吗？

然而，有些用户可能会使用他们的 Ubuntu Linux 系统进行软件开发。如果你想 [在 Ubuntu 中运行 c 程序](https://itsfoss.com/run-c-program-linux/)，你需要 gcc 编译器。如果你想 [在 Ubuntu 中运行 C++ 程序](https://itsfoss.com/c-plus-plus-ubuntu/)，你需要 g++ 编译器。如果你要使用一个不寻常的、只能从源代码中获得的软件，你的系统会抛出 “[make 命令未找到的错误](https://itsfoss.com/make-command-not-found-ubuntu/)”，因为你需要先安装 `make` 工具。

当然，所有这些都可以单独安装。然而，利用构建基础包的优势，一次性安装所有这些开发工具要容易得多。这就是你得到的好处。

这就像 [ubuntu-restricted-extras 包允许你一次安装几个媒体编解码器](https://itsfoss.com/install-media-codecs-ubuntu/)。

现在你知道了这个包的好处，让我们看看如何安装它。

### 在 Ubuntu Linux 中安装构建基础包

在 Ubuntu 中按 `Ctrl+Alt+T` 快捷键打开终端，输入以下命令：

```
sudo apt update

```

使用 `sudo` 命令，你会被要求输入你的账户密码。当你输入时，屏幕上没有任何显示。这没问题。这在大多数 Linux 系统中都是这样的。盲打输入你的密码，然后按回车键。

![](/data/attachment/album/202111/05/113252lrl36w1z6p1zowoz.png)

`apt update` 命令刷新了本地软件包的缓存。这对于一个新安装的 Ubuntu 来说是必不可少的。

之后，运行下面的命令来安装构建基础包：

```
sudo apt install build-essential

```

它应该显示所有要安装的软件包。当要求确认时按 `Y`：

![](/data/attachment/album/202111/05/113253nnns3nwvpvp3wy03.png)

等待安装完成。就好了。

### 从 Ubuntu 中删除构建基础包

保留这些开发工具不会损害你的系统。但如果你的磁盘空间不足，你可以考虑删除它。

在 Ubuntu 中，由于有 `apt remove` 命令，删除软件很容易：

```
sudo apt remove build-essential

```

运行 `autoremove` 命令来删除剩余的依赖包也是一个好主意：

```
sudo apt autoremove

```

你现在知道了所有关于构建基础包的基础（双关语）。请享受它吧~

---

via: <https://itsfoss.com/build-essential-ubuntu/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


如何在 Ubuntu Linux 中正确地设置 JAVA_HOME 变量

Summary: 在这篇初学者教程中，我将向你展示在 Ubuntu 上正确地设置 JAVA_HOME 变量的步骤。

![](/data/attachment/album/202111/05/122020qr5pys4p851sf1zs.jpg)

如果你 [在 Ubuntu 上运行 Java 程序](https://itsfoss.com/run-java-program-ubuntu/) ，使用 Eclipse、[Maven](https://maven.apache.org/) 或 Netbeans 等等，你将需要将 `JAVA_HOME` 环境变量设置为正确的路径。否则，你的系统将会向你控诉 “java\_home 环境变量没有设置”。

在这篇初学者教程中，我将向你展示在 Ubuntu 上正确地设置 `JAVA_HOME` 变量的步骤。这些步骤应该也适用于大多数的其它的 Linux 发行版。

设置过程包含这些步骤：

* 确保已安装 Java 开发工具包（JDK）。
* 查找 JDK 可执行文件的正确的位置。
* 设置 `JAVA_HOME` 环境变量，并永久更改它。

### 步骤 1: 核查 JDK 是否已经安装

核查 Java 开发工具包（JDK）是否已经安装在你的 Linux 系统上的最简单的方法是运行这个命令：

```
javac --version

```

上面的命令将核查 Java 编译器的版本。如果已经安装了 Java 编译器，它将显示 Java 版本：

![Java Compiler is installed](/data/attachment/album/202111/05/122030h1rrrrgu1e1iwwyu.png)

如果上面的命令显示像这样未找到 `javac` 命令的错误信息，你得先安装 JDK ：

![Java Compiler is not installed](/data/attachment/album/202111/05/122032eml7apli9zfh0sbh.png)

如果在你的系统上并没有安装 Java 编译器，使用这条命令来安装 Java 开发工具包 （JDK）：

```
sudo apt install default-jdk

```

这将在你当前的 Ubuntu 版本中安装默认的 Java 版本。如果你需要一些其它版本的 Java 版本，那么你必须 [在 Ubuntu 中安装 Java 时](https://itsfoss.com/install-java-ubuntu/) 具体指出它的版本。

在你确保 Java 编译器存在于你的系统之中后，接下来就到了查找其位置的时候了。

### 步骤 2: 获取 JDK 可执行文件（Java 编译器）的位置

可执行文件通常位于 `/usr/lib/jvm` 目录之中。但我不会让你来玩一个猜谜游戏，让我们来找出 Java 可执行文件的路径。

[使用 which 命令](https://linuxhandbook.com/which-command/) 来获取 Java 编译器可执行文件的位置：

```
which javac

```

在这里的问题是，它给出的位置实际上是一个 [符号链接](https://linuxhandbook.com/symbolic-link-linux/) 。你将需要按照下图执行几次：

![](/data/attachment/album/202111/05/122033acijqffqnqdz70j8.png)

最简单的方法是直接使用下面这条命令跟随符号链接来以获取实际的可执行文件：

```
readlink -f `which java`

```

`readlink` 命令会跟随一个符号链接。我在 `which java` 的外侧使用 `readlink` 将会使用 `which java` 的输出来替换要检查的符号链接，这被称之为命令替换。因此，在这个实例中，上面的命令大体上相当于 `readlink -f /usr/bin/java` 。

在我的示例中，可执行文件的位置是 `/usr/lib/jvm/java-11-openjdk-amd64/bin/java` 。对你来说可能会不一样。在你的系统中，复制上述命令所获取的正确的路径。你知道，你可以 [在 Ubuntu 的终端中复制和粘贴](https://itsfoss.com/copy-paste-linux-terminal/) 。

### 步骤 3: 设置 JAVA\_HOME 变量

现在，你已经获取了位置，使用它来设置 `JAVA_HOME` 环境变量：

```
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/bin/java

```

核查 `JAVA_HOME` 目录的值：

```
echo $JAVA_HOME

```

![](/data/attachment/album/202111/05/122035biq3fdoffdafzo6r.png)

尝试在同一个终端中运行你的 Java 程序或工程，并查看它是否工作。

这尚未结束。你刚刚声明的 `JAVA_HOME` 环境变量是临时的。如果你关闭这个终端或开始一个新的会话，它将会再次变成空的。

为了“永久地”设置 `JAVA_HOME` 变量，你应该将其添加到你的家目录中的 `.bashrc` 文件中。

你可以 [在 Linux 终端中使用 Nano 编辑器来编辑文件](https://itsfoss.com/nano-editor-guide/)。 如果你不想使用它，并想采取一种简单的复制和粘贴的方法，使用下面的命令：

首先备份你的 `.bashrc` 文件（以防万一你把它弄坏了，你还可以将其再恢复回来）：

```
cp ~/.bashrc ~/.bashrc.bak

```

接下来，[使用 echo 命令来追加](https://linuxhandbook.com/echo-command/) 在这一节开头使用的 `export` 命令。**你应该适当地更改下面的命令，以便其正确地使用你的系统所显示的路径**。

```
echo "export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64/bin/java" >> ~/.bashrc

```

验证它已经被正确地添加到文件的结尾处：

```
tail -3 ~/.bashrc

```

上面的 [tail 命令](https://linuxhandbook.com/tail-command/) 将显示所具体指定文件的最后 3 行。

这里是上面的三个命令的全部的输出：

![](/data/attachment/album/202111/05/122036bfook1kj4zkj6848.png)

现在，即使你退出会话或重新启动系统，`JAVA_HOME` 环境变量都仍将设置为你所具体指定的值。这就是你所想要的，对吧？

注意，如果你将来更改默认的 Java 版本，你将需要更改 `JAVA_HOME` 环境变量的值并将其指向正确的可执行文件的路径。

我希望这篇教程不仅会帮助你设置 `JAVA_HOME` 环境变量，也会教会你如何完成这项工作。

如果你仍然面临难题或者有一些疑问或建议，请在评论区告诉我。

---

via: <https://itsfoss.com/set-java-home-ubuntu/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[robsean](https://github.com/robsean) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #446 CentOS Stream 结出了第一个果实：RHEL 9 Beta

Summary: 更多：• 自托管的 GitLab 服务器被利用发动 DDoS 攻击 • 微软为 Excel 增加新的自定义数据类型支持

![](/data/attachment/album/202111/05/150214kfateu3u03ufliie.jpg)

### CentOS Stream 结出了第一个果实：RHEL 9 Beta

![](/data/attachment/album/202111/05/150223tr6ce5zp88c8psxw.jpg)

虽然许多 CentOS 用户对 CentOS 成为 RHEL 的上游感到不满，但 RHEL 9 表明新的 CentOS 模式已经实现了红帽公司对它的期望。[RHEL 9 发布了第一个测试版](https://www.zdnet.com/article/the-first-fruits-of-centos-stream-red-hat-enterprise-linux-9-beta/)，它基于 Linux 5.14 内核，支持四种架构：英特尔/AMD 64 位、ARM 64 位等等。红帽公司最近取消了注册 RHEL 测试版的要求。如果你有任何种类的红帽账户（包括免费的红帽开发者计划），你就可以无限制地获得红帽测试订阅。当然，以前的 CentOS 用户现在有 RHEL 克隆的 Rocky Linux 和 AlmaLinux，或者也可以转向 CloudLinux 来支持 CentOS 8。

>
> 老王点评：虽然 CentOS 落幕，CentOS Stream 成了 RHEL 的上游，这给了许多类 CentOS 发行版一个新机会，但是 CentOS Stream/RHEL 的这个新模式也许也能获得成功。
>
>
>

### 自托管的 GitLab 服务器被利用发动 DDoS 攻击

![](/data/attachment/album/202111/05/150240mpr3rcff7wnnnp1f.jpg)

Google 安全工程师发现了 [这次 DDoS 攻击](https://therecord.media/gitlab-servers-are-being-exploited-in-ddos-attacks-in-excess-of-1-tbps/)，攻击流量一度超过 1 Tbps。该漏洞位于 ExifTool 库内，它被用于移除上传到 Web 服务器中的图像元数据。GitLab 已在今年 4 月将其修复，但不是所有自托管服务器打上了补丁。有大约 6 万 GitLab 自托管服务器联网，而其中一半的服务器没有打上该补丁。利用该漏洞的概念验证代码在今年 6 月公布，而攻击也是始于 6 月。

>
> 老王点评：漏洞披露机制虽然推动厂商会加速解决安全问题，但是也给存在潜在缺陷的产品带来了更大的攻击面。
>
>
>

### 微软为 Excel 增加新的自定义数据类型支持

![](/data/attachment/album/202111/05/150255yzvv8jji56jbbrwq.jpg)

Excel 在历史上一直是用来组织文本和数字的，但几年来，微软一直在努力提高 Excel 支持的数据类型。去年，它推出了动态数组和数组公式，并通过链接数据类型支持股票、地理和 Wolfram 等数据。为此，微软推出了几个新的 JavaScript API，允许开发者使用 [更多的数据类型](https://www.zdnet.com/article/microsoft-wants-to-take-excel-beyond-numbers-and-text/)。

>
> 老王点评：作为世界上使用最多的“编程语言”，Excel 能进一步支持各种丰富的数据类型，这应该是微软在无代码产品方面的重要动作。
>
>
>


多达 5 万美元，谷歌将奖励利用 Linux 内核提权的安全专家

>
> 成功利用内核漏洞以实现提权的安全研究人员将获得 31,337 美元至 50,337 美元的奖金。
>
>
>

![](/data/attachment/album/202111/06/170203tai0bxn0f6d4xvtv.jpg)

谷歌的平台大量使用了 Linux，尤其是在安卓及其庞大的服务器方面。多年来，谷歌一直青睐开源项目和计划。

最近，这家科技巨头赞助了 100 万美元，用于资助 Linux 基金会开展的一个以安全为重点的开源项目，更多细节参见我们 [原来的报道](https://news.itsfoss.com/google-sos-sponsor/)。

而现在，谷歌将在未来三个月内将赏金奖励增加两倍，以奖励那些致力于寻找有助于实现提权（即，当攻击者利用一个错误/缺陷获得管理员权限）的内核漏洞的安全研究人员。

毫无疑问，总会有某种形式的错误和缺陷困扰着内核的安全和开发。幸运的是，来自各个组织和个人的数百名安全研究人员致力于改善其安全状态，这就是为什么这些漏洞不一定会在野外被利用。

谷歌在奖励安全研究人员方面有着良好的记录，但它在接下来的三个月里加大了力度，宣布了 \*\*31,377 美元的基本奖励，最高可达 50,377 美元。

### 计划细节和奖励

这些漏洞利用可以针对目前已修补的漏洞和未修补的新漏洞，以及采用新的技术。

**31,337 美元** 的基本奖励用于利用已公开了补丁的漏洞进行提权的技术。如果发现未修补的漏洞或新的利用技术，奖励可高达 **50,337 美元**。

此外，该计划还可以与 Android VRP 和“补丁奖励”计划一起使用。这意味着，如果该漏洞在安卓系统上发挥作用，除了这个计划之外，你还可以获得高达 25 万美元的奖励。

如果你希望了解更多关于安卓系统的信息，你可以在他们的 [官方门户网站](https://bughunters.google.com/about/rules/6171833274204160) 上了解。

增加的奖励将在未来三个月内开放，也就是说，直到 2022 年 1 月 31 日。

安全研究人员可以通过他们的 [官方博文](https://security.googleblog.com/2021/11/trick-treat-paying-leets-and-sweets-for.html) 来设置实验室环境，并在他们的 [GitHub 官方网页](https://google.github.io/kctf/vrp) 上阅读更多关于要求的内容。

### 总结

这项计划是谷歌的一项出色的举措。毫无疑问，它将吸引并惠及许多安全专家和研究人员。

不要忘记，Linux 内核的安全状况将最终受益。

---

via: <https://news.itsfoss.com/google-linux-kernel-bounty/>

作者：[Rishabh Moharir](https://news.itsfoss.com/author/rishabh/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


如何动态生成 Jekyll 配置文件

>
> 使用 Python 或 Bash 将动态数据插入 Jekyll 静态网站中，并且避免创建一个 API 后端。
>
>
>

![](/data/attachment/album/202111/06/172709dqcv65spvl363fav.jpg "Digital creative of a browser on the internet")

静态网站生成器 [Jekyll](https://opensource.com/article/21/9/build-website-jekyll) 使用 `_config.yml` 进行配置。这些配置都是 Jekyll 特有的。但你也可以在这些文件中 [用我们自己的内容定义变量](https://ayushsharma.in/2021/08/using-variables-in-jekyll-to-define-custom-content)，并在整个网站中使用它们。在本文中，我将重点介绍动态创建 Jekyll 配置文件的一些优势。

在我的本地笔记本电脑上，我使用以下命令来服务我的 Jekyll 网站进行测试：

```
bundle exec jekyll serve --incremental --config _config.yml

```

### 结合多个配置文件

在本地测试中，有时需要覆盖配置选项。我的网站的 [当前 \_config.yml](https://gitlab.com/ayush-sharma/ayushsharma-in/-/blob/2.0/_config.yml) 有以下设置：

```
# Jekyll Configuration

# Site Settings
url: "https://notes.ayushsharma.in"
website_url: "https://notes.ayushsharma.in/"
title: ayush sharma's notes ☕ + ? + ?
email: ayush@ayushsharma.in
images-path: /static/images/
videos-path: /static/videos/
js-path: /static/js/
baseurl: "" # the subpath of your site, e.g. /blog

```

由于本地的 `jekyll serve` URL 是 `http://localhost:4000`，上面定义的 URL 就不能用了。我可以创建一个 `_config.yml` 的副本 `_config-local.yml` 并替换所有的值。但还有一个更简单的选择。

Jekyll 允许[指定多个配置文件](https://jekyllrb.com/docs/configuration/options/#build-command-options)，后面的声明覆盖前面的声明。这意味着我可以用以下代码定义一个新的 `_config-local.yml`：

```
url:""

```

然后我可以把上述文件和我的主 `_config.yml` 结合起来，像这样：

```
bundle exec jekyll serve --incremental --config _config.yml,_config-local.yml

```

通过合并这两个文件，这个 `jekyll serve` 的 `url` 的最终值将是空白。这就把我网站中定义的所有 URL 变成了相对的 URL，并使它们在我的本地笔记本电脑上工作。

### C结合动态配置文件

一个简单的例子，假设你想在你的网站上显示当前日期。它的 bash 命令是：

```
> date '+%A, %d %B %Y'
Saturday, 16 October 2021

```

我知道我也可以 [使用 Jekyll 的 \_config.yml 的自定义内容](https://ayushsharma.in/2021/08/using-variables-in-jekyll-to-define-custom-content)。我将上述日期输出到一个新的 Jekyll 配置文件中。

```
my_date=`date '+%A, %d %B %Y'`; echo 'my_date: "'$my_date'"' > _config-data.yml

```

现在 `_config-data.yml` 包含：

```
my_date: "Saturday, 16 October 2021"

```

我可以把我的新配置文件和其他文件结合起来，在我的网站上使用 `my_date` 变量。

```
bundle exec jekyll serve --incremental --config _config.yml,_config-local.yml,_config-data.yml

```

在运行上述命令时，`{{ site.my_date }}` 输出其配置的值。

### 结论

上面的例子很简单，但可能性是无穷的。Bash、Python 和其他编程语言可以动态地生成 Jekyll 配置文件。然后我可以在 `build` 或 `serve` 过程中结合这些文件。

对于 [findmymastodon.com](https://findmymastodon.com/)，[我使用 Python 来获取 Mastodon 的用户统计数据](https://gitlab.com/ayush-sharma/find-my-mastodon/-/blob/1.0/src/fetch-instance-data/fetch_data.py#L252)。然后我把这些写进一个新的 [\_config-data.yml 文件](https://gitlab.com/ayush-sharma/find-my-mastodon/-/blob/1.0/_config-data.yml)（目前是手动）。最后，[主页和其他页面从配置文件中显示这些](https://gitlab.com/ayush-sharma/find-my-mastodon/-/blob/1.0/index.md#L16)。这样，我就可以利用一个动态的后台，并且仍然保持我所喜欢的所有静态网站的优点。

我希望这能为你自己的静态网站激发一些想法。Jamstack 对于静态网站是很好的，但你可以避免为动态内容创建整个 API 后台。为什么不使用一个构建作业来创建带有更新内容的配置文件呢？这可能不适合每一种情况，但少一个 API 意味着更少的基础设施移动部件。

我希望这能在你的下一个静态网站项目中给你一些帮助。继续阅读，并祝你编码愉快。

这篇文章最初发布在 [作者的网站](https://ayushsharma.in/2021/10/inserting-dynamic-data-into-jekyll-static-sites-using-python-or-bash) 上，并经授权转载。

---

via: <https://opensource.com/article/21/11/jekyll-config-files>

作者：[Ayush Sharma](https://opensource.com/users/ayushsharma) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #447 黑客正在窃取加密数据，留待量子计算机日后破解

Summary: 更多：• 消费类无人机被用来攻击美国电网 • LXQt 桌面发布 1.0

更多：• 消费类无人机被用来攻击美国电网 • LXQt 桌面发布 1.0

![](/data/attachment/album/202111/06/184451o7gu8unu277hhnz7.jpg)

### 黑客正在窃取加密数据，留待量子计算机日后破解

![](/data/attachment/album/202111/06/184502ggpc8g6m7kogcqq8.jpg)

现在很多重要数据是采用加密保护的，黑客窃取之后，利用现有的计算能力很难破解。但是仍有黑客在积极行动窃取这些加密数据，以留待将来的 [量子计算机进行破解](https://www.technologyreview.com/2021/11/03/1039171/hackers-quantum-computers-us-homeland-security-cryptography/)，而这个时间可能只需要 10 年。量子计算机的工作方式与我们今天使用的经典计算机非常不同，使它们能够解决现代计算机几乎不可能解决的问题。虽然现在量子计算机仍处于起步阶段，极其昂贵和充满问题。包括美国国土安全部在内的美国政府部门自 2016 年以来一直在举行竞赛，目的是在 2024 年之前产生第一批抗量子计算机的算法，并提出了一份过渡路线图来应对未来的量子计算机。

>
> 老王点评：随着量子计算机变得实用，一定会出现抗量子加密算法。但是现有加密数据可能在十年后依旧很有价值，因此，部署抗量子的加密算法需要提前。
>
>
>

### 消费类无人机被用来攻击美国电网

![](/data/attachment/album/202111/06/184519q1c50or9p5u778m0.jpg)

根据美国政府部门的 [一份报告](https://www.newscientist.com/article/2296480-drone-used-in-attack-on-us-electrical-grid-last-year-report-reveals/)，去年美国的一个变电站遭到一架改装的消费类无人机的攻击。这是美国第一次已知的使用无人机攻击能源基础设施的事件，它发生在美国宾夕法尼亚州的一个变电站。但该无人机坠毁时没有造成损害，它加装了一个拖曳的系绳，牵引着一段铜线。如果电线接触到高压设备，可能会造成短路、设备故障，甚至可能引起火灾。

>
> 老王点评：新的科技进步带来了各种前所未有的攻击可能。
>
>
>

### LXQt 桌面发布 1.0

![](/data/attachment/album/202111/06/184532vlmg5y5gw4ogv5vq.jpg)

经过八年的发展，由 LXDE 和 Razor-qt 开源桌面项目合并而成的 [LXQt 桌面](https://lxqt-project.org/) 正在庆祝其 [V1.0 版本](https://github.com/lxqt/lxqt/releases/tag/1.0.0) 的发布。哦对了，1.0 的上一个版本是半年前发布的 0.17.0。LXQt 1.0 使用的是 Qt 5.15 LTS 工具包，还没有移植到 Qt 6。LXQt 1.0 带来了文件管理器和图像查看器的改进、桌面通知的免打扰模式、两个新的桌面主题、更新的翻译等。

>
> 老王点评：新的里程碑值得庆贺，就是这个飙版本号的风潮什么时候能停一停。
>
>
>


从 FreeBSD 转到 Void Linux 后，Trident 项目终于结束了

Summary: Trident 项目为我们提供了与操作系统无关的 Lumina 桌面。

Trident 项目为我们提供了与操作系统无关的 Lumina 桌面。

>
> Trident 项目为我们提供了与操作系统无关的 Lumina 桌面。
>
>
>

![](/data/attachment/album/202111/07/162742xrpinzp8r15trcns.png)

令人遗憾，[Trident 项目](https://project-trident.org/) 团队宣布将结束他们的 Linux 发行版的开发。

### 那段故事

你或许没有听说过 Trident 项目，让我来讲点关于它的一点回忆。那是在 2005 年，Kris Moore 推出了 [PC-BSD](https://en.wikipedia.org/wiki/TrueOS)，提供了一种用桌面界面来设置 FreeBSD 的简单方法。次年，它被 [iXsystems](http://ixsystems.com/) 收购。十年后，2016 年 9 月，这个项目被改名为 TrueOS。这个项目也变成了基于 FreeBSD Current 分支的滚动发行版。两年后，TrueOS [宣布](https://itsfoss.com/trueos-plan-change/) 他们将取消其操作系统的桌面版本，而专注于商业和服务器市场。其桌面元素被 [剥离](https://itsfoss.com/project-trident-interview/) 到一个新项目：Trident。

有一段时间，Trident 开发团队尽力在 FreeBSD 之上打造良好的桌面体验。可是，由于 [FreeBSD 的问题](https://project-trident.org/post/os_migration/)，包括 “硬件兼容性、通信标准，或软件包的可用性一直限制着 Trident 项目的用户”，他们决定将其建立在其他基础之上。他们的解决方案是在 2019 年将其项目重新构建在 [Void Linux](https://voidlinux.org/) 之上。有那么一段时间，看起来 Trident 项目似乎有了未来。然后，2020 年来了。

![Trident 桌面](/data/attachment/album/202111/07/162742wqiueexebuobuczu.png)

### 项目的终止

10 月 29 号，Trident 项目团队发布了以下 [公告](https://project-trident.org/post/2021-10-29_sunset/)：

>
> 我们非常悲伤地宣布，Trident 项目将从 2021 年 11 月 1 号起进入“夕阳”阶段，并将于 2022 年 3 月关掉商店。项目的核心团队共同做出了这个决定。随着过去两年中，生活、工件和家庭等方面的事情和变故；我们个人的优先事项也发生了改变。
>
>
> 我们将保持 Trident 项目的软件包存储库和网站的运行，直到 2022 年 3 月 1 日的终止期，但是我们强烈推荐用户在即将到来的新年假期中开始寻找其他桌面系统替代。
>
>
> 感谢大家的支持和鼓励！过去几年中，该项目得以良好运转，我们也非常高兴在这些年里结识了你们中的许多人。
>
>
>

### Lumina 项目继续

贯穿 PC-BSD/TrueOS/Trident 项目传奇故事的一个永恒主题是桌面环境。2012 年，[Ken Moore](https://github.com/beanpole135)（Kris 的弟弟）开始开发一个基于 Qt 的桌面环境 [Lumina](https://lumina-desktop.org/)。2014 年，它成为 PC-BSD 的默认桌面环境，并一直保持到 Trident 项目出现。Lumina 不同于其他桌面环境，因为它的设计与操作系统无关。其他桌面系统像 KDE 和 GNOME 都具有 Linux 特定代码，这使得它们难以移植到 BSD。

![Lumina 桌面环境](/data/attachment/album/202111/07/162743a5a0m3sr8bs5omk7.png)

今年 6 月，Ken 把 [Lumina 的领导权](https://lumina-desktop.org/post/2021-06-23/) 交给了 Trident 的开发者 [JT Pennington](https://github.com/q5sys)（也因 [BSDNow](https://www.bsdnow.tv/) 知名）。

[公告](https://lumina-desktop.org/post/2021-06-23/) 中说：

>
> 经过长达 7 年的工作，我决定是时候让其他人接手 Lumina 桌面项目的开发了。这是个难以置信的任务，推动我进入之前从未考虑过的开发领域。可是，由于工作和生活的变化，我几乎没有为 Lumina 开发新功能的时间了，特别是即将在明年或者晚些时候到来的 Qt5->Qt6 升级。通过把火炬传递给 JT （GitHub 昵称是 q5sys），我希望这个项目能获得更及时的更新，以造福每个人。
>
>
> 感谢大家，我希望 Lumina 桌面项目能继续成功！！
>
>
>

### 总结

我一直对 Trident 项目抱有很高的期望。与我们介绍的许多发行版相比，它很小巧。它不是只增加了一两个新工具的、对 Arch 或 Ubuntu 的翻版。不仅如此，他们还努力改进一个与他们理念相同的发行版 Void Linux。可是，生活会发生变故，即使是我们中最好的人也难以避免遇到变故。我祝愿 Ken、JT 和其他人一切顺利，他们已经在这个项目上花费了很多时间。希望，我们未来能看到他们的更多作品。

---

via: <https://news.itsfoss.com/project-trident-discontinues/>

作者：[John Paul](https://news.itsfoss.com/author/john/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[zd200572](https://github.com/zd200572) 校对：[wxy](https://github.com/wxy)

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


只有 4MB？如何修复 Etcher 和 Rufus 创建 Linux USB 后“破坏”的 USB

![](/data/attachment/album/202111/07/165254zlhgz6an6vgpv2qd.jpg)

情况是这样的。你用 Etcher 或者 Rufus 工具在 Windows 或者 Linux 中创建了一个可启动的、Live Linux USB。

你用它来安装 Linux，USB 的目的已经达到了。现在你想格式化这个 USB，用它来进行常规的数据传输或存储。

你把它插入你的 Windows 系统，令你吃惊的是，这个 USB 的磁盘容量只有 4MB。

![](/data/attachment/album/202111/07/165622zmsd1hzhhci1d7v1.jpg)

你试图格式化它，但它可能不会让你这么做。即使你设法格式化它，USB 的大小现在也从通常的 8GB、16GB 或 32GB 缩减到只有 4MB。

你失去了你的 USB 吗？并非如此。你的 USB 并没有完全被破坏。你仍然可以用一个小技巧来格式化它，并舒适地使用它。

让我告诉你如何在 Windows 和 Linux 中把可启动的 USB 恢复到可用的状态。

### 格式化由 Rufus 或 Etcher 创建的 Live Linux USB （在 Windows 下）

你在 Windows 中看到只有 4MB 的磁盘空间。你知道为什么吗？因为在创建 Live Linux USB 时，该工具在 FAT32 文件系统中创建了一个 4MB 的 EFI 分区。其他的分区是在 Linux 的 Ext4 文件系统中，而这是不被 Windows 识别的。

这就是为什么你的 Windows 系统只看到 4MB 的 EFI 分区，并显示 USB 大小为 4MB。

![Windows only see the EFI partition on the USB](/data/attachment/album/202111/07/165622g7933v93xo07pj7p.jpg)

总而言之，你需要做的是删除 USB 盘上的所有分区，用删除现有分区后得到的空闲空间创建一个新的 NTFS 或 FAT32 分区。这就行了。

让我展示一下详细的步骤。

#### 步骤 1：

进入 Windows 菜单，寻找“磁盘管理”工具。

![Start disk management tool](/data/attachment/album/202111/07/165622a2k50tz3c0075c5y.jpg)

启动这个工具，它将显示你电脑上存在的所有磁盘。当然，这包括插入的 USB。

**选择正确的磁盘是非常重要的**。从 U 盘的大小或“可移动”的标签中辨别出它是哪一个。

![](/data/attachment/album/202111/07/165623mi6f9gfgxgggf7ti.jpg)

#### 步骤 2：

我们的想法是删除 U 盘上的任何现有分区。未分配的空间不能被删除，但这也没关系。

在该分区上点击右键，然后点击“<ruby> 删除卷 <rt>  Delete Volume </rt></ruby>”。

![Delete partitions on the USB disk](/data/attachment/album/202111/07/165623vwnel0jjaa18xdyv.jpg)

当要求你确认时，按“<ruby> 是 <rt>  Yes </rt></ruby>”。

![Confirm deletion of partition](/data/attachment/album/202111/07/165623r2fyws70zizseg81.jpg)

你的目标是只有一个未分配的空间块。当你看到它时，右击它并点击“<ruby> 新建简单卷…… <rt>  New Simple Volume... </rt></ruby>”来创建一个分区。

![Create New Simple Volume ](/data/attachment/album/202111/07/165624d7cbzlbjuv9ljgul.jpg)

接下来的步骤很简单。点击“<ruby> 下一步 <rt>  Next > </rt></ruby>”，选择整个可用空间，给它分配一个字母，选择文件系统（FAT32 或 NTFS），并将其格式化。

![Click Next](/data/attachment/album/202111/07/165624gr1hg1rywrtu23cz.png)

![Use entire available space](/data/attachment/album/202111/07/165625lkyx55k3br4eek1k.png)

![Give it a drive letter](/data/attachment/album/202111/07/165625w18ut2svl3v2gzzv.png)

![Use FAT 32 or NTFS, Name the USB if you want](/data/attachment/album/202111/07/165626v29vu9xcn9u9v0te.png)

![Revise all the changes](/data/attachment/album/202111/07/165626n4gg32xx34ggepxi.png)

完成后，你会看到 USB 已经恢复到正常状态，你可以开始向它复制粘贴数据。

![USB is back to normal state](/data/attachment/album/202111/07/165627wp48gu04ttt0dwdy.jpg)

你现在可以像以前一样使用你的 USB 了。

这些步骤是针对 Windows 的。如果你使用 Linux 呢？

### 在 Linux 上格式化 Live USB

我注意到，由 Etcher 和这类工具创建的 Live USB 经常拒绝被文件管理器中的右键格式化选项正确格式化。

除此之外，你可以像在 Windows 中那样做：删除现有的分区，用整个可用空间创建一个新的分区。

这里使用 GNOME “磁盘” 工具。它已经安装在 Ubuntu 和许多其他 Linux 发行版上。

![Start disk app](/data/attachment/album/202111/07/165627x4k5dkr7ox0digc5.jpg)

**同样，确保你在这里选择了外部 USB 盘。**

你会看到 U 盘上的各种分区。试着从上面的菜单中格式化该磁盘。

![Format disk](/data/attachment/album/202111/07/165627izcrrumkbrcrw0w7.jpg)

**如果这不起作用，逐个删除分区**，然后把整个 USB 作为自由空间。

当你创建了整个自由空间后，点击 “+” 号，在上面创建一个 NTFS 或 FAT32 文件系统的分区。

![](/data/attachment/album/202111/07/165627li257zom2mcpmm17.jpg)

用 NTFS（或 FAT32）创建分区，给它起个合适的名字，然后你就可以像以前一样使用这个 USB 了。

### 总结

像 Rufus 和 Etcher 这样的工具并没有真正破坏你的 USB。这就是它们的功能，通过在磁盘上创建一个不同的文件系统。但这样一来，Windows 操作系统就不能正确理解它。

好在只需付出一点努力就可以修复。我希望你也能够修复它。如果没有，请与我分享你的问题，我将尽力帮助你。

---

via: <https://itsfoss.com/format-live-linux-usb/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #448 虽然挣了大部分的钱，但红帽只能雇用更便宜、更低级的工程师

Summary: 更多：• Arm 公司 CEO 称为应对芯片危机，行业每周花费 20 亿美元 • 未来的苹果的硅芯片将使用 3 纳米工艺，最多可有 40 个核

芯片之重

![](/data/attachment/album/202111/07/181609js9k9f8kupuspkxp.jpg)

### 虽然挣了大部分的钱，但红帽只能雇用更便宜、更低级的工程师

![](/data/attachment/album/202111/07/181623cyud55diqkodkokz.jpg)

明年，为了控制成本，IBM 的红帽公司 [计划削减高级工程师的招聘](https://www.theregister.com/2021/11/05/red_hat_jobs/)。该公司向经理们发送了一封内部邮件，要求招聘资历比平时低的员工，“所有目前的申请和未来的回补都将默认降低一个级别（例如，高级软件工程师到软件工程师）”。红帽公司表示，“红帽今年已经增加了 2200 多名新员工，以帮助我们满足混合云技术的需求”。明年这个数字目前定在 200 人左右。而据另外的消息称，红帽在三季度预订了近 10 亿美元的业务，这约为 IBM 增长目标的 90%。

>
> 老王点评：这是又让马儿跑，又不给马儿吃草。
>
>
>

### Arm 公司 CEO 称为应对芯片危机，行业每周花费 20 亿美元

![](/data/attachment/album/202111/07/181646o7otip4wkkckk14d.jpg)

Arm 公司 CEO 在里斯本举行的 Web 峰会上说，这次芯片供应危机是 [他见过的最严重的一次](https://www.eetimes.com/is-the-chip-shortage-here-to-stay/)。他说，“在接下来的几年里，每周将花费大约 20 亿美元来增加产能和建设新设施。而这将在未来五年内增加约 50% 的额外产能....”但他也对期望持谨慎态度，由于涉及到许多不同的化学品，所以很难扩大晶圆生产，“制造半导体几乎用到整个周期表……你需要的不仅仅是一个芯片工厂来解决这些供应链问题。"

>
> 老王点评：这个世界已经运行在各种大大小小的芯片之上，疫情这种黑天鹅事件第一次让公众普遍认识到芯片的重要性。
>
>
>

### 未来的苹果的硅芯片将使用 3 纳米工艺，最多可有 40 个核

![](/data/attachment/album/202111/07/181703ztuucc9dcf77u92r.jpg)

苹果和台积电计划使用台积电 5 纳米工艺的增强版来制造第二代苹果硅芯片，将接替第一代 M1、M1 Pro 和 M1 Max 芯片。这些芯片可能用于下一代 MacBook Pro 和其他 Mac 台式机。[苹果正计划](https://www.theinformation.com/articles/apples-road-map-for-mac-chips-shows-likely-advantage-over-intel) 在第三代芯片上实现更大的飞跃，其中一些芯片将采用台积电的 3 纳米工艺制造，并拥有多达四个模具，这可能让芯片拥有多达 40 个计算核。作为对比，M1 芯片有一个 8 核 CPU，M1 Pro 和 M1 Max 芯片有 10 核CPU，而苹果的高端 Mac Pro 塔式机可以配置多达 28 核的英特尔至强 W 处理器。

>
> 老王点评：苹果硅芯片本来就快得不像话，再升级的话不能想象会怎么改变 Mac 电脑。
>
>
>


Linux 内核的发布时间表是什么？它的支持时间是多久？

Summary: Linux 内核很复杂。我说的甚至不是代码的问题。

linux对新硬件的支持，是通过更新内核实现的？还是添加驱动实现的？

来自江西南昌的 Chrome Mobile 65.0|Android 8.1 用户

我觉得，都可以。

之前手动通过 modprobe 加载自己编译的驱动。

也见到过把驱动直接编译到 kernel 里的。

Linux 内核很复杂。我说的甚至不是代码的问题。

![](/data/attachment/album/202111/08/104610egbqhs8lbldgd6ad.png)

Linux 内核很复杂。我说的甚至不是代码的问题。

Linux 内核的代码本身很复杂，但你不需要为这个问题而烦恼。我说的是 Linux 内核的发布时间表。

一年内多久发布一个新的内核版本？内核被支持多长时间？还有一些 LTS（长期支持）内核，LTS Linux 内核的支持时间有多长？

问题是，虽然这些问题看起来很简单，但答案却不简单。

这些问题没有一个直接明了的答案，需要做一些解释，这就是我在这篇文章中要做的。

### Linux 内核发布时间表：有吗？

![](/data/attachment/album/202111/08/104701jnwsqvunkhskqbvl.jpg)

短的回答是，每两到三个月就有一个新的内核版本发布。长的回答是，这不是一个硬性规定。

这个意思是，你经常会看到每两到三个月就有一个新的内核版本发布。这是内核维护者团队的目标，但并没有规定新版本必须在前一个版本的 8 周后准时发布的期限。

新的内核版本（通常）是由 Linus Torvalds 在它准备好的时候发布的。通常是每 2 到 3 个月发布一次。该版本被宣布为“稳定”，一般以 X.Y 的格式编号。

但这并不是 X.Y 开发的结束。稳定版会有更多的小版本以进行错误的修复。这些小版本在稳定版的内核上又增加了一个点，就像是 X.Y.Z。

虽然 X.Y（通常）是由 Linux 创造者 Linus Torvalds 发布的，但是维护稳定的 X.Y 内核、合并错误修复和发布 X.Y.Z 版本的责任是由另外的内核开发者负责的。

### 一个内核版本支持多长时间？

![](/data/attachment/album/202111/08/104702trkzqlvzidcv6di2.png)

和发布一样，一个内核版本支持多长时间也没有固定的日期和时间表。

一个普通的稳定内核版本通常会被支持两个半月到三个月，这取决于下一个稳定内核版本的发布时间。

例如，稳定版内核 5.14 会在稳定版内核 5.15 发布后的几周内达到 [生命末期](https://itsfoss.com/end-of-life-ubuntu/)。结束支持是由该稳定内核版本的维护者在 Linux 内核邮件列表中宣布的。用户和贡献者会被要求切换到新发布的稳定版本。

但这只适用于正常的稳定内核版本，还有 LTS（长期支持）内核版本，它们的支持期要比 3 个月长得多。

### LTS 内核：它支持多长时间？

LTS 内核也没有固定的发布时间表。通常，每年都有一个 LTS 内核版本，一般是当年的最后一个版本，它至少会被支持两年。但同样，这里也没有固定的规则。

LTS 内核的维护者可以同意某个 LTS 内核的维护时间超过通常的两年。这个协议是根据必要性和参与的人员来达成的。

这种情况经常发生在 Android 项目中。由于两年的时间不足以让制造商结束对他们的硬件和软件功能的支持，你经常会发现一些 LTS 内核会被支持六年之久。

![Linux LTS 内核计划支持日期](/data/attachment/album/202111/08/104702q7swhiybninishib.png)

你可以 [在 Linux 内核网站上](https://www.kernel.org/category/releases.html) 找到这个信息。

### 你的发行版可能没有跟随通常的 Linux 内核版本

如果你检查你的 Linux 内核版本，你可能会发现 [你的发行版使用了一个旧的内核](https://itsfoss.com/why-distros-use-old-kernel/)。也有可能该发行版提供的内核已经在内核网站上被标记为到达了生命末期。

不要惊慌。你的发行版会负责修补内核的错误和漏洞。除非你真的在使用一个不知名的 Linux 发行版，否则你可以相信你的发行版会保持它的安全和健全。

如果你有足够的理由，比如为了支持更新的硬件，你可以自由地在你使用的任何发行版或 [Ubuntu 中安装最新的 Linux 内核](https://itsfoss.com/upgrade-linux-kernel-ubuntu/) 。

如果你想了解更多细节，我已经 [在这里解释了为什么你的发行版使用过时的 Linux 内核](https://itsfoss.com/why-distros-use-old-kernel/)。

![](/data/attachment/album/202111/08/104702chpqrm8mm0k00psk.png)

### 没有直接明了的答案

正如你所看到的，对于 Linux 内核发布时间表的问题，没有直接明了的答案。一切都是暂定的。

在我看来，好的方面是，如果你使用一个常规的 Linux 发行版，你不需要为 Linux 内核版本的发布或终止而烦恼。那是由你的发行版处理的事情。

我希望你对 Linux 内核的发布周期有了更多的了解，或者是我把你搞糊涂了。无论是哪种情况，请在评论区告诉我你的观点。

---

via: <https://itsfoss.com/linux-kernel-release-support/>

作者：[Abhishek Prakash](https://itsfoss.com/author/abhishek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


在 Linux 命令行上编辑照片的 4 种方法

![](/data/attachment/album/202111/08/114427mq12hqvqiixv1j1b.jpg)

>
> 这里有一些我最喜欢的 ImageMagick 技巧，以及如何在没有 GUI 的情况下使用它们。
>
>
>

Linux 对摄影师和图形艺术家很有用。它提供了许多工具来编辑包括照片在内的不同类型的图像文件和格式。这表明你甚至不需要一个图形界面来处理你的照片。这里有四种你可以在命令行中编辑图像的方法。

### 给你的图片应用效果

几年前，Seth Kenlon 写过一篇文章，[4 个有趣的（半无用的）Linux 玩具](https://opensource.com/life/16/6/fun-and-semi-useless-toys-linux)，其中包括对 ImageMagick 编辑工具套件的介绍。在 2021 年的今天，ImageMagick 甚至更有意义。

这篇文章让我们了解了 Fred 的 ImageMagick 脚本，这些脚本真的很有用。Fred Weinhaus 维护着 200 多个脚本，用于对你的图像文件应用各种效果。Seth 向我们展示了 Fred 的 `vintage3` 脚本的一个例子，该脚本使图像变得怀旧。

### 创建照片拼贴画

今年，Jim Hall 用他的文章 [从 Linux 命令行创建照片拼贴](https://opensource.com/article/21/9/photo-montage-imagemagick) 向我们展示了如何从照片中创建拼贴画。

拼贴画在小册子和手册中使用得很多。它们是一种在一张照片中展示几张图片的有趣方式。可以应用效果来将它们进一步融合在一起。事实上，我以他的文章为指导，创造了上面的图片拼贴。这是我小时候的样子。以下是我使用的命令：

```
$ montage Screenshot-20211021114012.png \
  Screenshot-20211021114220.png \
  Screenshot-20211021114257.png \
  Screenshot-20211021114530.png \
  Screenshot-20211021114639.png \
  Screenshot-20211021120156.png \
  -tile 3x2 -background black \
  screenshot-montage.png

```

### 调整图像大小

Jim 发表了另一篇文章，[从 Linux 终端调整图像的大小](https://opensource.com/article/21/9/resize-image-linux)。这个教程演示了如何使用 ImageMagick 改变一个图像文件的尺寸并将其保存为一个新的文件。例如，上面的 `montage` 命令所产生的拼贴画没有达到要求的尺寸。学习如何调整尺寸，使我能够调整宽度和高度，从而使它能够被包括在内。这是我用来调整这张图片大小的命令。

![Montage of Alan as a Kid](/data/attachment/album/202111/08/114459k47octy41om41so4.png "Montage of Alan as a Kid")

```
$ convert screenshot-montage.png -resize 520x292\! alanfd-kid-montage.png

```

### 自动化图像处理

最近，我决定自己看一下 ImageMagick 套件。这一次，我把它的工具组合成一个 Bash 脚本。文章的题目是 [用这个 bash 脚本自动处理图像](https://opensource.com/article/21/10/image-processing-bash-script)。这个例子是一个简单的脚本，可以自动为我的文章制作图片。它是根据 [Opensource.com](http://Opensource.com) 上的要求定制的。如果你想使用这个脚本，我在文章中提供了一个 Git 仓库连接。它很容易修改和扩展，可以满足任何人的需要。

### 总结

我希望你喜欢这些文章并在你的艺术创作中使用 Linux。如果你想看看更多的 Linux 图像软件，可以看看 Fedora [Design Suite](https://labs.fedoraproject.org/en/design-suite/) Spin。它是一个完整的操作系统，包括许多不同的开源多媒体制作和发布工具，例如：

* GIMP
* Inkscape
* Blender
* Darktable
* Krita
* Scribus
* 等等

---

via: <https://opensource.com/article/21/11/edit-photos-linux-command-line>

作者：[Alan Formy-Duval](https://opensource.com/users/alanfdoss) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[校对者ID](https://github.com/%E6%A0%A1%E5%AF%B9%E8%80%85ID)

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


硬核观察 #449 System76 准备另起炉灶，用 Rust 开发全新桌面

Summary: 更多：• 只有 3% 的企业在使用单一的云服务商 • 微软宣布为其 Azure 云上的 Linux 添加更多安全保护

![](/data/attachment/album/202111/08/141712yufhe0kk9sq7nkl9.jpg)

### System76 准备另起炉灶，用 Rust 开发全新桌面

![](/data/attachment/album/202111/08/141723s5q2nqk4r3kz5po4.jpg)

System76 的 Pop!\_OS Linux 发行版的 COSMIC 桌面是基于 GNOME 的，但他们正在 [用 Rust 开发自己的桌面](https://www.phoronix.com/scan.php?page=news_item&px=Pop-OS-New-Rust-Desktop)，而不基于 GNOME 或任何现有桌面环境。System76 回应称，开发自己的桌面环境确实是因最近 Pop!\_OS 和 GNOME 开发者之间在主题化和定制化的方法上发生了一些摩擦。Pop!\_OS 维护者 [在评论中说](https://old.reddit.com/r/pop_os/comments/qnvrou/will_pop_os_ever_do_an_officially_kde_flavor_or/hjqpj7y/) “我们的桌面环境是 GNOME Shell 扩展的集合，而这些扩展在每个 GNOME Shell 版本中都会被破坏。要么我们转向维护数以万计的猴子补丁，要么我们用正确的方式，成为与 GNOME Shell 一样的成熟的桌面环境。” 他们的新桌面会 “使用已经存在的工具（mutter、kwin、wlroots 等等），但是会从头开始用 Rust 实现周围的 shell...并尽力遵循 freedesktop 规范。”

>
> 老王点评：虽然自由和开源世界向以轮子众多而著称，也屡屡有人批评贡献者们只知道造轮子，而好用的轮子没几个，但是我觉得，能自由造轮子才是自由和开源世界的基础，不好的轮子自然会进化淘汰。
>
>
>

### 只有 3% 的企业在使用单一的云服务商

![](/data/attachment/album/202111/08/141745tlzq793189e1l1vu.jpg)

[一项研究](https://www.ibm.com/thought-leadership/institute-business-value/report/cloud-transformation) 对 29 个行业的七千余名高管进行了关于他们的云结构的调查。调查发现，只有 3% 的人报告在 2021 年使用单一的私有云或公共云，而在 2019 年这一数据为 29%。至少有 79% 的受访者表示，工作负载完全可移植，没有供应商锁定。

>
> 老王点评：真正摆脱了供应商锁定的云计算才叫云计算，从目前的发展来看，云计算产业已经逐渐达成了其最初的愿景之一。
>
>
>

### 微软宣布为其 Azure 云上的 Linux 添加更多安全保护

![](/data/attachment/album/202111/08/141807zrxvxe2lz303360t.jpg)

几个月前，Linux 服务器上的 Defender for Endpoint 获得了端点检测和响应（EDR）能力，Linux 上的 Defender 可以通用地拦截全新类别的威胁，如赎金勒索、敏感数据收集、加密货币挖掘等等。现在微软为 Azure Defender 客户 [提供了更多的能力](https://www.zdnet.com/article/microsoft-just-expanded-its-malware-protection-for-linux-servers/)，Linux EDR 现在已经进入公开预览阶段，其提供的实时响应允许深入调查和快速遏制威胁，为安全团队提供取证数据、运行脚本的能力、分享可疑实体和猎取可能的威胁。

>
> 老王点评：鉴于 Linux 发行版在 Azure 云的虚拟机操作系统中占主导地位，这并不足为奇。但是我仍然对此感觉有些不安。
>
>
>


openSUSE Leap 与 Tumbleweed，我该选择哪一个

Summary: 如果你是 openSUSE 的新手，很容易把 Tumbleweed 和 Leap 搞混。

![](/data/attachment/album/202111/09/102806oc65ntea3ner8q55.png)

[openSUSE 是一个非常受欢迎的 Linux 发行版](https://itsfoss.com/why-use-opensuse/)，尤其是在企业界。[SUSE](https://en.wikipedia.org/wiki/SUSE_Linux) 从 1996 年起就以这样或那样的形式出现了。很久以来，他们只有一个分支版本。

然后，在 2015 年，他们改变了现状，决定提供两个分支：Leap 和 Tumbleweed。

如果你是 [openSUSE](https://www.opensuse.org/) 的新手，很容易把 Tumbleweed 和 Leap 搞混。最近有位读者要求我们解释这两者之间的异同，这正是我们今天要做的。

### Leap 和 Tumbleweed 之间有什么区别？

两者之间最重要的区别是发布时间表。openSUSE Leap （LCTT 译注：leap => “飞跃”）每隔几年就会按照固定的时间表发布一个新版本，类似于 Ubuntu 和 Fedora。另一方面，Tumbleweed （LCTT 译注：tumbleweed => “风滚草”）是一个紧密跟随 openSUSE 开发时间表的滚动发布，就像 Arch 或 Void。

![openSUSE Tumbleweed vs Leap](/data/attachment/album/202111/09/102806i8huubpu59e3k1kh.jpg)

你知道 [滚动发行版](https://itsfoss.com/rolling-release/) 的优势吧？它为你提供了最新的软件版本，你不需要为一个重大版本发布而升级你的系统，因为你的系统会定期得到更新。

所以，在 openSUSE Tumbleweed 中，你会得到更新的桌面环境版本、内核版本等等，你会得到一个最先进的、新鲜的系统。

另一方面，openSUSE Leap 坚持使用较早的、LTS 版本的桌面环境和 Linux 内核，给你一个可靠的系统。当然也会有系统和安全的补丁，并且每隔几年会有一个重大版本，为你的系统提供更新的软件和内核。

#### 快速回顾一下 openSUSE 发布模式的变化历史

![OpenSUSELeap 安装程序](/data/attachment/album/202111/09/102806gjvv3azv5isaa1fv.png)

从提供一个发行版分支到两个似乎是一个很大的飞跃，所以让我给你介绍一下历史背景。Tumblewee 项目是由 [Greg Kroah-Hartman](https://en.wikipedia.org/wiki/Greg_Kroah-Hartman) 在 2010 年 11 月宣布的。其目的是创建一个 “滚动更新版本的 openSUSE 存储库，包含供人们使用的最新‘稳定’版软件包”。这个项目并不是一个新的发行版，而是对现有 openSUSE 系统的附加部分。

这在 2014 年发生了变化，当时 openSUSE 背后的团队决定将下一个版本基于 SUSE Linux Enterprise Server（SLES）开发。他们将这个新版本命名为 “Leap 42”（解释一下，“42” 这个数字来自《<ruby> 银河系漫游指南 <rt>  Hitchhiker’s Guide to the Galaxy </rt></ruby>》，其中 “42” 被认为是生命、宇宙和一切的答案）。（ LCTT 译注：在瞎飙了版本后之后，它们又回到了 15.x 这种按部就班的版本号）目前 openSUSE Leap 的版本是 15.2。

随着这一变化，Tumbleweed 成为 openSUSE 的官方发行版。有趣的是，根据 openSUSE 2020 年底的 [社区调查](https://en.opensuse.org/End-of-year-surveys/2020/Data#Uses_Tumbleweed_as_Desktop_on_a_regular_basis)，越来越多的人选择使用 Tumbleweed。

### 你应该使用 Leap 还是 Tumbleweed？

下一个问题是，“如果底层技术基本相同，那么应该使用这两个中的哪一个？”让我为你分析一下。

openSUSE Leap 是稳定的，经过高度测试的。它应该用于较旧的系统和需要长期无问题运行的计算机。这是因为所提供的软件不是最新和最好的，而是最稳定的。因为新的版本每 3 年才会发布一次，所以你安排的任何工作流程都是相对安全的。（一定要记得备份。）Leap 在其整个发布周期中坚持使用同一个 Linux 内核。

![OpenSUSE Leap 桌面](/data/attachment/album/202111/09/102807uzbcaraa5gr15ocz.png)

使用 Leap，你不会收到最新版本的软件。你也将以较慢的速度获得硬件支持。你将需要每年至少更新一次你的系统以继续获得更新。Leap 就像 Ubuntu LTS 一样。

另一方面，openSUSE Tumbleweed 拥有所有软件的最新版本，包括内核、驱动程序和桌面环境。由于它是一个滚动发行版，所以你所使用的版本基本上没有寿命结束的可能。

Tumbleweed 不断接受更新的事实也会导致一些问题，比如工作流程或工具的损坏，一般来说，它打磨得比较粗糙。如果发生这种情况，Tumbleweed 确实有工具可以回滚到以前的状态，以避免这些问题。Tumbleweed 非常紧跟 Linux 内核的发布。

![openSUSE Tumbleweed 桌面](/data/attachment/album/202111/09/102808zy600rbjii1b00b7.png)

让我为你总结一下，以帮助你做出决定。

如果：

* 稳定性对你来说很重要
* 你是 openSUSE 的新手
* 你的硬件较旧
* 你在运行一个生产服务器
* 如果你正在为一个不懂技术的朋友或家人建立一个系统

那么你应该使用 Leap。

如果：

* 你想尝试最新、最棒的软件
* 你的硬件较新
* 你对 Linux 比较有经验
* 你是一个软件开发者
* 你需要专有的硬件驱动，比如 Nvidia 或 Radeon 显卡，或者 Broadcom 的 Wi-Fi 适配器
* 你想要最新的内核版本

那么你应该使用 Tumbleweed。

我希望能为你解开疑惑。如果你已经在使用 Leap 或 Tumbleweed，请在评论区告诉我们你的偏好和建议。

---

via: <https://itsfoss.com/opensuse-leap-vs-tumbleweed/>

作者：[John Paul](https://itsfoss.com/author/john/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #450 SCO 诉 IBM 案在近 20 年后终于尘埃落定

Summary: 更多：• REvil 勒索团伙大量成员被捕 • 因域名过期，无法运行受反盗版保护的游戏

![](/data/attachment/album/202111/09/132743dertsiemmszrseq2.jpg)

### SCO 诉 IBM 案在近 20 年后终于尘埃落定

![](/data/attachment/album/202111/09/132753lvexcppzo0m0a1ml.jpg)

[早些时候](https://www.zdnet.com/article/last-of-original-sco-v-ibm-linux-lawsuit-settled/)，一直监督 SCO 破产的美国特拉华地区破产法院曾宣布，代表 SCO 债务人的受托方与 IBM 达成和解，IBM 支付 1425 万美元以彻底终结该诉讼，债务人放弃对 IBM 和红帽的所有未决或未来可能提出的 [诉讼](https://practical-tech.com/2003/03/31/cyber-cynic-bye-bye-sco/) 要求的所有权利和利益，以及任何关于 Linux 侵犯 SCO 的 Unix 知识产权的指控。法院接受了这一和解，[裁决](https://www.scribd.com/document/538148598/IBM-1182)“本案中的所有索赔和反索赔，无论是否被指控，是否被申辩，都已经全部解决、妥协和解决，并且有充分的理由。”

>
> 老王点评：终于结束了……或许吧？这个诉讼已经久到很多人都忘记了，SCO 及其“遗产”被收购后，一次次疯狂的版权诉讼，一次次的出尔反尔，曾经有可能将 Linux 扼杀在摇篮中。
>
>
>

### REvil 勒索团伙大量成员被捕

![](/data/attachment/album/202111/09/132816otymmgttvm0ygygb.jpg)

罗马尼亚警方、美国司法部和欧洲刑警组织于周一宣布了针对 REvil 团伙的 [联合行动](https://www.bbc.com/news/technology-59215167)。这次突袭行动抓捕了三名被指控的网络犯罪分子。欧洲刑警组织的行动被命名为 GoldDust，是专门为对付该团伙而设立的。自 2 月以来，该行动在罗马尼亚、乌克兰、韩国和科威特共逮捕了 7 名勒索团伙成员。REvil 影响最大的活动是成功入侵了软件公司 Kaseya，随后感染了全球多达 1500 家企业，支付的赎金超过 2 亿美元。最近几周，REvil 的负责人宣布，来自当局的压力迫使他们关闭了运营。FBI 局长说，“法律的长臂比他们想象的要长很多。”

>
> 老王点评：看来这是打疼了美国了啊。但是我们的企业也要小心被勒索团伙盯上。
>
>
>

### 因域名过期，无法运行受反盗版保护的游戏

![](/data/attachment/album/202111/09/132853udli0pnp6xdff67o.jpg)

昨晚，一个 DRM 反盗版技术使用的一个 [关键域名过期](https://torrentfreak.com/denuvo-protected-games-rendered-unplayable-after-domain-expires-211108/)，导致采用该技术的游戏也无法运行。在续费失败后，该域名进入了宽限期，但当宽限期也过后，它就被从 DNS 记录中删除了，因此整个反盗版系统就停止了工作。Steam 上的一些用户发布了一些教程，让玩家修改他们的 Windows HOSTS 文件来临时规避该问题。

>
> 老王点评：虽然我不喜欢 DRM 系统，但是这个 DRM 系统的 IT 运维也太烂了。
>
>
>


在 FreeDOS 上使用 BAT 文件自动执行任务

Summary: FreeDOS 下批处理文件的实用指南。

FreeDOS 下批处理文件的实用指南。

>
> FreeDOS 下批处理文件的实用指南。
>
>
>

![](/data/attachment/album/202111/10/104345whfjagaahm9nb2j3.jpg "Tips and gears turning")

即使你以前没有使用过 DOS，你也可能知道它的命令行 shell，即 `COMMAND.COM`。它已经成为 DOS 的同义词，FreeDOS 为此也实现了一个类似的 shell，称为 “FreeCOM”，但也命名为 `COMMAND.COM`，就像在其他 DOS 系统上一样。

但是 FreeCOM shell 可以做的不仅仅是为你提供一个命令行提示符让你在其中运行命令，如果你需要在 FreeDOS 上自动执行任务，你可以使用 *批处理文件*，也称为 “BAT 文件”，因为这些脚本使用 `.BAT` 扩展名。

批处理文件可能比你在 Linux 编写的脚本要简单得多。因为在很久以前，这个功能最初被添加到 DOS 时，它是为了让 DOS 用户“批量处理”某些命令。它的条件分支没有太大的灵活性，也不支持更高级的功能，例如算术扩展、标准输出和错误消息的重定向、后台进程、测试、循环（这项支持）和 Linux 脚本中常见的其他结构。

本文是 FreeDOS 下批处理文件的实用指南。记住通过用百分号（`%`）包裹变量名称来引用环境变量，例如 `%PATH%`。但是，请注意，由于历史原因，`FOR` 循环的构造略有不同。

### 打印输出

批处理文件可能需要向用户打印消息，让用户知道发生了什么。使用 `ECHO` 语句打印消息。例如，一个批处理文件可能使用以下语句表明它已完成了任务：

```
ECHO Done

```

`ECHO` 语句不需要引号。FreeCOM `ECHO` 语句不会以任何特殊方式处理引号，它会像普通文本一样打印它们。

通常，FreeDOS 在执行批处理文件时会打印每一行。这在一个非常短的批处理文件中通常不是问题，它只为用户定义了几个环境变量。但是对于执行更多工作的较长批处理文件而言，批处理行的这种一直显示可能会变得很麻烦。要阻止此输出，在 `ECHO` 语句中使用 `OFF` 关键字，如下所示：

```
ECHO OFF

```

使用 `ON` 关键字在 FreeDOS 运行时恢复显示批处理行。

```
ECHO ON

```

大多数批处理文件在第一行包含一个 `ECHO OFF` 语句，以阻止消息，但是 shell 在执行语句时仍然会在屏幕上打印 `ECHO OFF`。为了隐藏该语句，批处理文件通常在前面使用 `@` 符号。这样，任何以这个特殊字符开头的行都不会打印，即使打开了 `ECHO`。

```
@ECHO OFF

```

### 注释

编写较长批处理文件时，大多数程序员都喜欢使用 *注释* 来提醒自己这个批处理文件的用途。在批处理文件中注释，使用 `REM`（remark）关键字。`REM` 之后的任何内容都会被 FreeCOM shell 忽略。

```
@ECHO OFF
REM This is a comment

```

### 执行“辅助”批处理文件

通常，FreeCOM 一次只运行一个批处理文件。但是，你可能需要使用另一个批处理文件来执行其他操作，例如为多个批处理文件设置公共环境变量。

如果你从"正在运行"的批处理文件中直接调用第二个批处理文件，FreeCOM 将完全切换到第二个批处理文件，并停止处理第一个。要改为在第一个批处理文件“内部”运行第二个批处理文件，你需要告诉 FreeDOS shell 使用 `CALL` 关键字去 *调用* 第二个批处理文件。

```
@ECHO OFF
CALL SETENV.BAT

```

### 条件分支

批处理文件确实支持使用 `IF` 语句的简单条件分支。它有三种基本形式：

1. 测试上一条命令的返回状态
2. 测试一个变量是否等于一个值
3. 测试文件是否存在

`IF` 语句的一个常见用途是测试程序是否成功返回。如果它们正常运行，大多数程序将返回零值，或者在出现错误时返回一些其他值。在 DOS 中，这称为 *错误级别*，这是 `IF` 测试的特例。

测试名为 `MYPROG` 的程序是否成功退出，实际上是检查程序是否返回“零”。使用 `ERRORLEVEL` 关键字来测试特定值。例如：

```
@ECHO OFF
MYPROG
IF ERRORLEVEL 0 ECHO Success

```

使用 `ERRORLEVEL` 测试错误级别是检查程序退出状态的笨拙方法。检查 DOS 程序的不同返回值，更有用的方法是使用 FreeDOS 为你定义的特殊变量，称为 `ERRORLEVEL`。它存储了最近执行程序的错误级别，然后你可以使用 `==` 测试不同的值。

你可以使用 `==` 和 `IF` 语句来测试变量是否等于某个值。就像一些编程语言，你可以使用 `==` 直接比较两个值。通常，在一侧引用一个环境变量，在另一侧引用一个值，但你也可以比较两个变量的值以查看它们是否相同。例如，你可以使用此批处理文件重写上面的 `ERRORLEVEL` 代码：

```
@ECHO OFF
MYPROG
IF %ERRORLEVEL%==0 ECHO Success

```

`IF` 语句的另一个常见用途是测试文件是否存在，如果存在则采取操作。你可以使用 `EXIST` 关键字来测试。例如，要删除名为 `TEMP.DAT` 的临时文件，你可以在批处理文件中使用以下行：

```
@ECHO OFF
IF EXIST TEMP.DAT DEL TEMP.DAT

```

对于任何 `IF` 语句，你都可以使用 `NOT` 关键字来 *否定* 测试。在文件 *不* 存在时打印消息，你可以这样写：

```
@ECHO OFF
IF NOT EXIST TEMP.DAT ECHO No file

```

### 分支执行

利用 `IF` 测试的一种方法是跳转到批处理文件中完全不同的部分，这取决于 `IF` 测试的结果。在最简单的情况下，如果一个关键命令失败，你可能希望跳到批处理文件的末尾。或者，如果某些环境变量设置不正确，你可能想要执行其他语句。

你可以使用 `GOTO` 指令跳转到批处理文件的其他部分。它会跳转到批处理文件中称为 *标签* 的特定行。注意，这是一个严格的 “go-to” 跳转：批处理文件执行将在新标签处启动。

假设程序需要一个现有的空文件来存储临时数据，如果文件不存在，则需要在运行程序之前创建一个文件。你可以将这些动作添加到批处理文件中，这样你的程序始终有一个临时文件可供使用：

```
@ECHO OFF
IF EXIST temp.dat GOTO prog
ECHO Creating temp file...
TOUCH temp.dat
:prog
ECHO Running the program...
MYPROG

```

当然，这是一个非常简单的例子。对于这种情况，你可以重写批处理文件，将创建临时文件作为 `IF` 语句的一部分：

```
@ECHO OFF
IF NOT EXIST temp.dat TOUCH temp.dat
ECHO Running the program...
MYPROG

```

### 迭代

如果你需要对一组文件执行相同的任务怎么办？你可以使用 `FOR` 循环 *迭代* 一组文件。这是一个单行循环，每次使用不同的文件运行单个命令。

`FOR` 循环对迭代变量使用一种特殊的语法，它的用法与其他 DOS 环境变量不同。要循环编辑一组文本文件，可以使用以下语句：（LCTT 译注：原文此处写错了，少写了一个 `%`）

```
@ECHO OFF
FOR %%F IN (*.TXT) DO EDIT %%F

```

注意，如果在命令行中运行此循环，而不是在批处理文件中，那么迭代变量仅需要指定一个百分号（`%`）：

```
C:\> FOR %F IN (*.TXT) DO EDIT %F

```

### 命令行处理

在运行批处理文件时，FreeDOS 提供了一种简单的方法来检测用户可能提供的命令行选项。FreeDOS 解析命令行输入，并将前九个选项存储在特殊变量 `%1`、`%2` ..... 等中，直到 `%9`。注意，无法通过这种方式直接访问第十一个（及之后）选项。特殊变量 `%0` 存储批处理文件的名称。

如果你的批处理文件需要处理 9 个以上的选项，你可以使用 `SHIFT` 语句移除第一个选项，并将每个选项向下 *移动* 一个值。所以第二个选项变成了 `%1`，第十个选项变成了 `%9`。

大多数批处理文件只需要移动一个值。但是，如果你需要以其他增量进行移位，可以将参数提供给 `SHIFT` 语句。例如：

```
SHIFT 2

```

下面是一个简单的批处理文件，演示了移位操作：

```
@ECHO OFF
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9
ECHO Shift by one ..
SHIFT 1
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9

```

执行带有十个选项的批处理文件显示了 `SHIFT` 语句如何重新排列命令行选项，因此批处理文件现在可以用 `%9` 访问第十个参数：

```
C:\SRC>args 1 2 3 4 5 6 7 8 9 10
1 2 3 4 5 6 7 8 9
Shift by one ..
2 3 4 5 6 7 8 9 10
C:\SRC>

```

---

via: <https://opensource.com/article/21/6/automate-tasks-bat-files-freedos>

作者：[Jim Hall](https://opensource.com/users/jim-hall) 选题：[lujun9972](https://github.com/lujun9972) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

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


被华为“嫁出去”的欧拉

Summary: 华为和开放原子开源基金会共同宣布：将欧拉开源项目及相关资产捐赠给开放原子开源基金会。

看看这个开源是不是能被世界上的自由软件爱好者们接受。

![](/data/attachment/album/202111/10/141958c44iwlkk4nkwzlow.jpg)

昨天，在北京举办的操作系统产业峰会上，华为和开放原子开源基金会共同宣布：**将欧拉开源项目及相关资产捐赠给开放原子开源基金会。**

什么？作为国内近两年发展最迅猛的开源项目和开源社区的欧拉，居然被捐了？是华为不够有钱，还是华为放弃了欧拉开源项目？

初听到这个消息时，我颇感意外，但是细思之下，又觉得在情理之中。

### 开源项目的捐赠传统

![](/data/attachment/album/202111/10/142543gthn387x8kdkwtdj.jpg)

开源界向来有将开源项目捐赠给开源基金会的传统。开源项目往往发轫于某个开源贡献者或商业企业的个人或私有的成果，在项目发展初期，他们为项目的诞生、成长提供了不可或缺的第一推动力。但是随着开源项目的壮大，建立了围绕开源项目的开源社区，这时候就面临着一个选择：开源项目应该听谁的？是最初的创始人或企业么？还是所有参与贡献的贡献者的？作为一个久经验证的实践，人们发现将开源项目捐赠给一个成熟的开源基金会，对项目的发展是最有利的。在国际上有几个著名的开源基金会，如 <ruby> Linux 基金会 <rp>  （ </rp> <rt>  The Linux Foundation </rt> <rp>  ） </rp></ruby>（LF）、<ruby> Apache 软件基金会 <rp>  （ </rp> <rt>  The Apache Software Foundation </rt> <rp>  ） </rp></ruby>（ASF）等，都颇受开源界信赖，旗下也拥有大量成熟卓越的开源项目。

通过捐赠给开源基金会，开源项目摆脱了对最初的创始人或企业的依赖，也避开了其对商业利益的考虑，从而形成一种社区治理、分层决策的机制，让项目变得更具备中立性和生命力。而捐赠给开源基金会的开源项目，按照基金会的管理规范，得到基金会的人、财、物的支持，拥有了独立成长的空间，其用户也不用担心控制开源项目的企业收回承诺，贡献者也对自己参与贡献的开源项目有了合理的发言权。

既然如此，那我为什么对欧拉开源项目被捐献给开放原子开源基金会感到意外呢？

因为，欧拉开源项目这两年的发展太快了，以至于我以为它会一直这样一路狂飙下去，但是细看发现，在迅猛发展之下，也到了进一步助推的时机。

让我们来看看。

### 欧拉开源项目与开放原子开源基金会

![](/data/attachment/album/202111/10/144246q1tessm817cj9eae.jpg)

作为背景信息，我们先对欧拉开源项目和开放原子开源基金会做个简单的介绍。

欧拉操作系统最初来自于华为内部的 EulerOS，自 2019 年它以 [openEuler](https://www.openeuler.org/) 的名字开源以来，迅速成为了中国发展最迅速的开源社区。从 2019 年底至今仅仅两年间，据其披露信息，它就“**拥有了 7 千余名社区贡献者、8 千余个社区软件包、93 个不同方向的特别兴趣组（SIG）、十多个商业和自用发行版、超过了 300 家的企业合作伙伴**”，汇聚了从处理器、整机、操作系统发行版厂商、到行业应用等全产业链。

而[开放原子开源基金会](https://www.openatom.org/)，是中国首家、目前也是独家在民政部注册的开源基金会。据其网站，其“服务范围包括开源软件、开源硬件、开源芯片及开源内容等，为各类开源项目提供中立的知识产权托管，保证项目的持续发展不受第三方影响，通过开放治理寻求更丰富的社区资源的支持与帮助，包括**募集并管理资金，提供法律、财务等专业支持**。”开放原子开源基金会从第一天起，就得到了广泛的关注。虽然开放原子开源基金会成立时间不久，但是旗下已经拥有了来个各个国内大型 IT 企业的捐赠的数个大型开源项目，这包括来自阿里巴巴的 Alios Things、腾讯的 TencentOS Tiny、来自华为的 OpenHarmony、来自百度的XuperChain 等等。可以说，被中国开源界寄予众望的开放原子开源基金会，其阵容也相当可观。

那么，这二者为何走到了一起？

### 繁华之下的抉择与远瞻

![](/data/attachment/album/202111/10/142609b266irri1cs8r85c.jpg)

让我们先来看看欧拉开源项目在盛景之下所面临的抉择。

欧拉操作系统其实并不是一夜之间出现的，其最初来自于因华为内部需求而诞生的 EulerOS，是由红帽的 CentOS 分叉衍生的一个内部 Linux 发行版。类似的，包括微软、谷歌、Meta（Facebook）、阿里、腾讯等很多科技企业都有这种基于开源操作系统进行裁剪定制的内部发行版，甚至这些内部发行版也有对外公开发布的。

而欧拉操作系统真正走到聚光灯下，是在几个因素的促进之下发生的。欧拉操作系统在诞生之初，就承担了众望。而它也没有令人失望，**在两年间结出了累累硕果**，已经成为一个中国乃至国际开源领域的有力声音。

但是，随着欧拉开源项目和社区的发展壮大，它已经不再是一株可以种植在苗圃中的小树，它需要更广阔的空间和经历风雨。欧拉开源项目发源于华为，也有很多开源生态企业加入了其中，华为也极力淡化其属于华为控制的印象，但是，提及到欧拉操作系统，你的第一感觉是不是还是那个“**华为的欧拉**”？

没错，这种**固有的印象**很难打破，这也是华为和欧拉的主要成员为什么要将欧拉交给一个**第三方的中立基金会来管理**的原因。因为，如果不改变这种一家一地的格局和观感，欧拉的发展最终也不过是“华为的又一个操作系统”而已，只能做到代码开源，而生态并不能真正开放。

可以说，如果没有华为的大力投入，欧拉没有如今的发展，但是，如果欧拉能在脱离华为的一力支持而**独立发展**，才叫真正的壮大。

但是，这个决定其实并不是那么容易下。做过开源软件的开发者知道，如果是给别人的开源软件做些贡献，这个还好；但是如果将自己辛苦一手打造的软件完全交付出去，就像嫁女儿一样舍不得，又怕她没吃没喝，又怕她被人冷落，但又期望她能自己独立生活，成为一个可以栉风沐雨的大孩子。

所以，华为和诸多欧拉的成员能在当前看起来一切还都不错的前景下，做出将正在绽开鲜花的“欧拉之树”送出去的决定，确实不容易，也确实有远瞻。

### 做操作系统难，做好开源操作系统更难

![](/data/attachment/album/202111/10/143422ch2ff6ff3gv7tftf.jpg)

操作系统因其本身的复杂性，使得其开发成本、开发周期、开发人力资源的需求，都是其他项目难以比拟的。对于一个 Linux 操作系统而言，将 Linux 内核、文件系统、进程调度等组件组合成一个完整的系统仅仅只是开始，而如何打磨和调校整个系统，形成坚如磐石的系统底座才是见功夫的地方。

但这还只是故事的开始，对于任何一个操作系统而言，都会面临相同的问题，即需要有建筑于该操作系统上的繁荣的应用生态和为之开发应用的开发者群体/社群。

对于商业操作系统来说，其背后的企业需要花费大量的资金来让开发者为其开发应用，不但需要付出大量的成本，而且这是一个需要日积月累和不断迭代的过程，这使得商业操作系统领域的后来者很难加入到操作系统之中的竞争之中，这也是我们在目前商业操作系统领域只能见到寥寥几家的原因。

但开源软件的崛起，使得构筑了整个信息时代基础的计算机操作系统不再仅仅是被商业操作系统所笼罩的大玩家俱乐部。因为 BSD、因为 Linux、因为自由和开源软件，才有了我们如今繁荣的开源操作系统生态。

操作系统开源项目虽然并不像普通的开源项目那么多，但也有很多耳熟能详的项目，像 Ubuntu、RedHat、FreeBSD、Debian 等等。似乎做一个操作系统开源项目，尤其是 Linux 发行版很简单，以至于你在专门关注发行版动态的 [DistroWatch](https://distrowatch.com/) 网站上可以找到有几百款不同的 Linux 发行版。但是做一个发行版开源项目又很难，因为克隆、复刻或者说“套壳”很容易，但是**真正做出一款有想法、能投入实际的生产实践中的操作系统发行版，就需要有更高的要求和投入。**

可以说，基于 Linux 内核开发一个发行版很容易，但是能把这具精巧的机器调校好，加入各种精心设计的机件，并且具有相当的健壮性，还要为其提供长期的、全方面的支持和升级换代，使其能适用于各种不同环境、不同情境的需求，**这着实不容易**。

我们知道，在欧拉操作系统中，欧拉社区的贡献者们贡献了许多匠心独运的开源组件，因此，欧拉操作系统已经不是那个曾经继承自 CentOS 的 EulerOS 了，不是一辆涂装的 CentOS 牌汽车，而是一辆进行过专业改装的“猛禽”了。

>
> 欧拉操作系统中的独有组件：
>
>
> * 智能化性能调优引擎 A-Tune
> * 毕昇 JDK
> * iSula 容器技术
> * secGear 机密计算安全应用开发套件
> * 企业级虚拟化底座 StratoVirt
> * 开放式测试服务平台 Compass CI
> * ……
>
>
>

### “嫁出去”的欧拉的新变化

![](/data/attachment/album/202111/10/143608oaqere6v62rhaxxv.jpg)

如果欧拉不再是庇护在华为和诸多核心创始企业羽翼下的小树，那么欧拉将迎来什么？这其实是“谁负责、谁管理？”、“钱从哪来？受益属于谁？”、“谁来提供支持保证和质量担保？”等问题。

#### 谁负责、谁管理？

在发布会中和会后的沟通会中，开放原子开源基金会理事长杨涛表示，“欧拉开源项目捐赠给开放原子开源基金会是为了帮助欧拉项目可以更好地持续运行下去，当前项目本身的内部决策依然由欧拉社区完成，基金会不会过多干涉开源项目的内部细节。”开放原子开源基金会在开源项目有需要的时候，会提供更多的协助，帮助开源项目进一步深层次、广范围发展，但不会过多地影响开源项目的内部决策细节。据杨涛说，“开放原子开源基金会的管理模式介乎于 Linux 基金会和 Apache 软件基金会之间。”开放原子开源基金会对项目会进行引导与监管，但暂时不会制定“原子之路”来约束开源项目的发展；对项目会进行扶持，但不仅仅给予资金支持，更重要的是提供法律、知识产权、教育培训、传播宣传和开放治理方面的协助。

#### 项目运行的运营营收的变化

开源项目捐赠给基金会可以解决开源社区营收问题。在这个问题上，欧拉社区也是面临同样的问题。在捐赠给开放原子开源基金会以后，开放原子开源基金会将会为欧拉社区开设专门的账户，用于接受社区和企业的捐款，并将相应的款项进行合规管理，用于欧拉社区的进一步推广和发展。

#### 项目支持的承诺的变化

在支持方面，由于欧拉本身是社区性项目，则不直接为终端用户提供支持和保障。而更多的保障，则由欧拉社区的贡献开发者和贡献企业根据自己的需要和场景，开发下游发行版，并进行相应的承诺和保障。欧拉操作系统本身将会持续按照开源项目的方式进行发展。

#### “嫁出去”后的新生活

开放原子开源基金会作为一个在民政部注册的基金会，超脱于企业之外。欧拉通过捐赠给开放原子开源基金会，让欧拉的所有权从众多企业，转变为了开放原子开源基金会。企业从过去的所有者，变成了**共建者、参与者**。所有权从企业转移到了基金会，开发者们和用户可以不再担心因为企业运行策略的变化而导致开源项目无疾而终。

不仅如此，开放原子开源基金会作为一个中立的基金会存在，还可以接受来自开发者、企业、社区的捐赠，从而获得更多的项目运行资金，从而让整个项目可以持续的运转下去，对于欧拉社区，乃至整个操作系统产业而言，都无疑是一件好事。

### 欧拉捐赠给开放原子开源基金会，是一步好棋

![](/data/attachment/album/202111/10/143826iz9gl1wyelylwz1o.jpg)

欧拉操作系统作为一款开源操作系统，捐赠给开放原子开源基金会可以说是一步好棋。通过将欧拉开源项目放到一个中立的第三方的开源基金会，让开源治理真正推动开源项目的发展，并能依托于来自中国和全球的开源贡献者、开源生态企业，为欧拉开源项目的发展打开了一片新天地。让我们期待欧拉开源项目的新篇章。


exa：一个 ls 命令的现代替代品

Summary: 这个简单的 ls 命令列出目录的内容十分方便，但是直到我发现 exa 之前从来没想过会有命令能替代它。

![](/data/attachment/album/202111/10/155648vf7iwcwsetitqfuw.jpg)

我敢打赌你使用过 [Linux 上的 ls 命令](https://linuxhandbook.com/ls-command/)，它是你 [学习 Linux](https://itsfoss.com/free-linux-training-courses/) 时首次接触到的命令之一。

这个简单的 `ls` 命令列出目录的内容十分方便，但是直到我发现 `exa` 之前从来没想过会有命令能替代它。

### exa 命令简介

[exa](https://the.exa.website/) 是一个命令行工具，可以列出指定路径（如未指定则是当前目录）的目录和文件。这也许听起来很熟悉，因为这就是 `ls` 命令所做的事情。

`exa` 被视作从 UNIX 旧时代延续至今的古老的 `ls` 命令的一个现代替代品。如其所声称的那样，它有比 `ls` 命令更多的功能、更好的默认行为。

![exa 功能](/data/attachment/album/202111/10/155702mm72rrjvmpz9kprh.png)

以下是一些你应该使用 `exa` 替代 `ls` 的原因：

* `exa` 像 `ls` 一样可移植（在所有主流 Linux 发行版、\*BSD 和 macOS 上可用）
* 默认彩色输出
* `exa` 不同格式化的“详细”输出也许会吸引 Linux/BSD 新手
* 文件查询是并行进行的，这使得 `exa` 与 `ls` 的性能相当
* 显示单个文件的 git 暂存或未暂存状态

`exa` 的另外一个不同的地方是它是用 Rust 编写的。顺便说一句，Rust 与 C 语言的执行速度相近，但在编译时减少了内存错误，使你的软件可以快速而安全地执行。

### 在 Linux 系统上安装 exa

`exa` 最近很流行，因为许多发行版开始将其包括在其官方软件库中。也就是说，你应该可以使用你的 [发行版的包管理器] 来安装它。

从 Ubuntu 20.10 开始，你可以使用 `apt` 命令来安装它：

```
sudo apt install exa

```

Arch Linux 已经有了它，你只需要 [使用 pacman 命令](https://itsfoss.com/pacman-command/) 即可：

```
sudo pacman -S exa

```

如果它无法通过你的包管理器安装，请不要担心。毕竟它是一个 Rust 包，你可以很容易地用 Cargo 安装它。请确保在你使用的任何发行版 [或 Ubuntu 上安装了 Rust 和 Cargo](https://itsfoss.com/install-rust-cargo-ubuntu-linux/)。

安装 Rust 和 Cargo 后，使用此命令安装 `exa`：

```
cargo install exa

```

### 使用 exa

`exa` 有很多命令选项，主要是为了更好的格式化输出和一些提高舒适度的改进，比如文件的 git 暂存或未暂存状态等等。

下面是一些屏幕截图，展示了 `exa` 是如何在你的系统上工作的。

简单地使用 `exa` 命令将产生类似于 `ls` 但带有颜色的输出。这种彩色的东西可能没有那么吸引人，因为像 Ubuntu 这样的发行版至少在桌面版本中已经提供了彩色的 `ls` 输出。不过，`ls` 命令本身默认没有彩色输出。

```
exa

```

![exa 命令的输出截图，没有任何额外的标志](/data/attachment/album/202111/10/155702nwcizcfc5c1q1ug9.jpg)

请注意，`exa` 和 `ls` 命令的选项不尽相同。例如，虽然 `-l` 选项在 `exa` 和 `ls` 中都给出了长列表，但 `-h` 选项添加了一个列标题，而不是 `ls` 的人类可读选项。

```
exa -lh

```

![正如我之前提到的，exa 有列标题以获得更好的“详细”输出](/data/attachment/album/202111/10/155702k8226p6c3ra2fafn.jpg)

我前面说过，`exa` 已经内置了 Git 集成。下面的屏幕截图给出了 `–git` 标志的演示。请注意 `test_file` 在 `git` 的 `tracked` 列中显示 `-N` ，因为它尚未添加到存储库中。

```
exa --git -lh

```

![演示 git 标志如何与 exa 一起工作](/data/attachment/album/202111/10/155703wdr02s72rex3b29q.jpg)

下面的例子不是我的猫键入的。它是各种选项的组合。`exa` 有可供你尝试和探索的很多选项。

```
exa -abghHliS

```

![一个非常丰富多彩和详细的输出，具有用户友好的详细输出](/data/attachment/album/202111/10/155703j81475lb746bbrb8.jpg)

你可以通过在终端中运行以下命令来获取完整的选项列表：

```
exa --help

```

但是，如果你想了解 `exa` 所提供的功能，可以查看其 [Git 存储库](https://github.com/ogham/exa) 上的 [官方文档](https://github.com/ogham/exa#command-line-options)。

### 值得从 ls 切换到 exa 吗？

对于类 UNIX 操作系统的新手来说，`exa` 可能是用户友好的，它牺牲了在脚本中容易使用的能力，以换取“易用性”和外观。其中，显示得更清楚并不是一件坏事。

无论如何，`ls` 就像通用命令。你可以将 `exa` 用于个人用途，但在编写脚本时，请坚持使用 `ls`。当预期输出与任一命令中的实际输出不匹配时，`ls` 和 `exa` 之间一个 [或多个] 标志的差异可能会让你发疯。

我想知道你对 `exa` 的看法。你已经尝试过了吗？你对它的体验如何？

---

via: <https://itsfoss.com/exa/>

作者：[Pratham Patel](https://itsfoss.com/author/pratham/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #451 Firefox 现已上架微软商店

Summary: 更多：• 微软宣布推出 Windows 11 SE • 研究人员公开了影响无数蓝牙设备的 BrakTooth 漏洞

验证码回来了

之前坏了没发现

![](/data/attachment/album/202111/10/175655utbm0syk0pzskssm.jpg)

### Firefox 现已上架微软商店

![](/data/attachment/album/202111/10/175159i3yo3c88qz3o1gdx.jpg)

之前我们 [在 417 期报道](/article-13859-1.html) 过，微软重构了其应用商店，允许第三方浏览器在微软商店上架，并且可以使用浏览器自己的引擎。Opera 和 Yandex 浏览器已经在 9 月份进入 Windows 11 的微软商店。今天，Mozilla 宣布它把 Firefox 上架到了 Windows 11 微软商店。Mozilla 宣称，Firefox 是第一个进入微软商店的“主要”浏览器，也是唯一一个使用自己的引擎（Gecko）的独立浏览器，而不是依赖 Chromium，现在商店里的所有其他竞争对手都在使用 Chromium。由于可以使用自己的浏览器引擎，因此在微软商店下载的 Firefox 和在 Mozilla 下载的功能一致。

>
> 老王点评：只是稍微方便了一点点，但是火狐的主要问题还是如何拉回来用户的心，而不是对拥有自己的引擎沾沾自喜。
>
>
>

### 微软宣布推出 Windows 11 SE

![](/data/attachment/album/202111/10/175206yz0rod4tdttr0o8p.jpg)

微软为学生和学校设计了一个新版的 Windows 11 SE，它将专门搭载在为 K-8 教室打造的低成本笔记本电脑上，这是微软又一次尝试与 Google 的 Chromebooks 争夺市场。和之前失败的 Windows 10 S 模式不同的是，Windows 11 SE 虽然同样只适用于低成本设备，而且只针对学校和教育客户，但是不限制第三方应用程序，如 Zoom 和 Chrome。

>
> 老王点评：虽然微软特别喜欢用 “SE” 这个缩写，但是这次应该指的是“学生和教育工作者”，希望这次能名副其实。
>
>
>

### 研究人员公开了影响无数蓝牙设备的 BrakTooth 漏洞

![](/data/attachment/album/202111/10/175225i42r2cnwc6arh96c.jpg)

[该漏洞](https://threatpost.com/braktooth-bluetooth-bugs-exploit-poc/176036/) 影响了数以十亿计的设备使用的 1400 多种芯片组的商用蓝牙栈，包括依赖蓝牙通信的智能手机、PC、物联网设备和工业设备。利用该漏洞的 PoC 代码已经公开发布。美国网络安全和基础设施安全局督促制造商、供应商和开发商给蓝牙设备部署补丁或采用缓解漏洞利用的方法。

>
> 老王点评：啧，这种硬件漏洞最难全量更新，就这样公开真的负责吗？
>
>
>

### 一句话回音

我们对很多事件的观察会有一些后继的发展，不算重要，但是应该做个有始有终的观察者告诉大家下文。

* 回应 450 期，因域名失效引发游戏防盗版系统停止工作的 Denuvo 官方回应问题已经修复
* 回应 422 期，法官拒绝苹果中止动议，要求期限前提供额外支付选项，但苹果表示要到上级法庭上诉
* 回应 435、436 期，韩国电信的网络故障由是更换路由器引发的


成为为开源做贡献的技术写手的四个建议

Summary: 你的开源贡献将会向潜在雇主表明，你会主动寻求学习、成长和挑战自我的机会。

Atom不是合适的工具。

你的开源贡献将会向潜在雇主表明，你会主动寻求学习、成长和挑战自我的机会。

>
> 你的开源贡献将会向潜在雇主表明，你会主动寻求学习、成长和挑战自我的机会。
>
>
>

![](/data/attachment/album/202111/11/100737uebjijhwz0l4zhoo.jpg "A person writing.")

不管你是一个对技术写作有所涉足的技术爱好者，还是一个想要转职为职业技术写手的成熟技术专家，你都可以构建你的技术写作作品集，并将你的开源贡献作为作品集的一部分。为开源项目写作是一件有趣、灵活且低风险的事情。按照自己的时间安排来为你感兴趣的项目做贡献，你将会为社区是多么热情或你对社区产生影响的速度而感到惊喜。

你的开源贡献将会向潜在雇主表明，你会主动寻求学习、成长和挑战自我的机会。和任何事情一样，你需要从某个地方开始。为开源项目做贡献可以让你在展示你的才华的同时学到新技巧、新技术。另外，为开源项目写作能让你接触到新的社区、跨越时区与新鲜面孔合作，并建立你的社交网络。当你挖掘到新的开源机会后，你的简历将更抢眼，让你在其他候选人中脱颖而出。以下是为开源做出贡献的四个建议，这可以让你走向技术写作的职业生涯。

### 学习行业工具

作为开始，我建议先熟悉 [Git](https://git-scm.com/)，并建立 [GitLab](https://about.gitlab.com/) 和 [GitHub](https://github.com/) 帐号，然后寻找一个趁手的文本编辑器。我个人喜欢使用开源工具 [Atom](https://atom.io/)。关于 Git，它能从网络上获取到丰富的免费学习资源，包括一些优秀的互动教程。你不需要成为一个 Git 高手才能深入开源世界。我建议先学习一些基本操作，然后让你的技能随着你的贡献逐渐成长。

### 找到一个项目

为开源做贡献最难的部分大概是找到一个项目来做贡献。你可以查看 [Up For Grabs](https://up-for-grabs.net/#/) 并找一些感兴趣的项目。[First Timers Only](https://www.firsttimersonly.com/) 有更多的起步资源。别犹豫，联系项目维护者来了解更多有关于项目的东西，并了解他们在何处需要帮助。请坚持下去。找到一个适合你的项目可能会花费一些时间。

### 告别“冒充者综合症”

一个常见的误区是你必须是一个程序员才能为开源项目做贡献。作为一个没有工程或计算机科学领域有关证书的、自学成材的贡献者，我能保证事实并非如此。文档往往开发项目中最价值但最被忽视的部分。这些项目经常缺少人手和资源来建立完善的、高质量的文档。这给你展现了一个绝佳机会来参与提交拉取请求或归档该项目的议题。你可以做到的！

（LCTT 译注：<ruby> 冒充者综合症 <rt>  Impostor Syndrome </rt></ruby>，又称自我能力否定倾向，指个体按照客观标准评价为已经获得了成功或取得成就，但是其本人却认为这是不可能的，他们没有能力取得成功，感觉是在欺骗他人，并且害怕被他人发现此欺骗行为的一种现象。）

### 从小处开始

查看你感兴趣的项目的仓库，找到可能存在的贡献指南并遵循。然后，寻找更新 README 文档或提交修改错别字的机会。没有什么贡献是微不足道的。项目维护者可能会为这些帮助感到高兴，而你也将会因把你提交的第一个的拉取请求收录进你的技术写作作品集而感到愉悦。

---

via: <https://opensource.com/article/21/11/technical-writing-open-source>

作者：[Ashley Hardin](https://opensource.com/users/ashleyhardin) 选题：[lujun9972](https://github.com/lujun9972) 译者：[yingmanwumen](https://github.com/yingmanwumen) 校对：[wxy](https://github.com/wxy)

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


用开源工具将任何网站变成 Linux 桌面应用

Summary: 使用 Nativefier 和 Electron 从任何网站创建桌面应用。

把Linux中国网站也做成一个应用吧

来自海南海口的 Chrome Mobile iOS 95.0|iOS 15.1 用户

>
> 使用 Nativefier 和 Electron 从任何网站创建桌面应用。
>
>
>

![](/data/attachment/album/202111/11/115302e25o5laz8sex5ea6.jpg "Text editor on a browser, in blue")

Mastodon 是一个很好的开源、去中心化的社交网络。我每天都在使用 Mastodon，通过它的网页界面使用 Mastodon 可能是最常见的方式（尽管因为开源，它有许多不同的交互方式，包括基于终端的应用和移动应用），但我更喜欢专门的应用窗口。

最近，我发现了 [Nativefier](https://github.com/nativefier/nativefier)，现在我可以在我的 Linux 桌面上把 Mastodon 或其他任何网页应用作为桌面应用来使用。Nativefier 将一个 URL 用 Electron 框架包装起来，它将开源的 Chromium 浏览器作为后端，但使用自己的可执行程序运行。Nativefier 采用 MIT 许可证，可用于 Linux、Windows 和 MacOS。

### 安装 Nativefier

Nativefier 需要 Node.js。

安装 Nativefier 只需运行：

```
$ sudo npm install -g nativefier

```

在我的 Ubuntu 桌面上，我必须先升级 NodeJS，所以当你安装 Nativefier 时，一定要检查需要哪个 Node 版本。

安装完毕后，你可以检查你的 Nativefier 的版本，以验证它是否已经安装：

```
$ nativefier --version
45.0.4

```

运行 `nativefier --help` 列出了应用支持的所有选项。

### 设置

我建议你在开始用 Nativefier 创建应用之前，创建一个名为 `~/NativeApps` 的新文件夹。这有助于保持你的应用有序。

```
$ mkdir ~/NativeApps
cd ~/NativeApps

```

### 为 Mastodon 创建一个应用程序

我将首先为 [mastodon.technology](https://mastodon.technology/) 创建一个应用。

使用以下命令：

```
$ nativefier --name Mastodon \
  --platform linux --arch x64 \
  --width 1024 --height 768 \
  --tray --disable-dev-tools \
  --single-instance https://mastodon.technology

```

这个例子中的选项做了以下工作：

* `--name`：设置应用的名称为 Mastodon
* `--platform`：设置应用程序的平台为 Linux
* `--arch x64`：设置架构为 x64
* `--width 1024 --height 768`：设置应用启动时的大小
* `--tray`：为应用创建一个托盘图标
* `--disable-dev-tools`：禁用 Chrome 开发工具
* `--single-instance`：只允许应用有一个实例

运行这条命令会显示以下输出：

```
Preparing Electron app...

Converting icons...
Packaging... This will take a few seconds, maybe minutes if the requested Electron isn't cached yet...
Packaging app for platform linux x64 using electron v13.4.0 Finalizing build...

App built to /home/tux/NativeApps/Mastodon-linux-x64, move to wherever it makes sense for you and run the contained executable file (prefixing with ./ if necessary)

Menu/desktop shortcuts are up to you, because Nativefier cannot know where you're going to move the app. Search for "linux .desktop file" for help, or see https://wiki.archlinux.org/index.php/Desktop_entries

```

输出显示，文件被放置在 `/home/tux/NativeApps/Mastodon-linux-x64`。当你 `cd` 进入这个文件夹，你会看到一个名为 `Mastodon` 的文件。这是启动该应用的主要可执行文件。在你启动它之前，你必须给它适当的权限。

```
$ cd Mastodon-linux-x64
chmod +x Mastodon

```

现在，执行 `./Mastodon` 就可以看到你的 Linux 应用启动了！

![Mastodon app launched](/data/attachment/album/202111/11/115312j6cfxlx9fl90tbje.png "Mastodon app launched")

### 为我的博客创建一个应用

为了好玩，我也要为我的博客创建一个应用。如果没有 Linux 应用，拥有一个技术博客有什么用？

![Ayush Sharma blog](/data/attachment/album/202111/11/115313r07k5ll6d2gmsm5l.png "Ayush Sharma blog")

命令是：

```
$ nativefier -n ayushsharma \
  -p linux -a x64 \
  --width 1024 --height 768 \
  --tray --disable-dev-tools \
  --single-instance https://ayushsharma.in

$ cd ayushsharma-linux-x64
chmod +x ayushsharma

```

### 为 [findmymastodon.com](http://findmymastodon.com) 创建一个应用

最后，这是为我的宠物项目 [findmymastodon.com](https://findmymastodon.com/) 制作的应用。

![Find my mastodon website](/data/attachment/album/202111/11/115313vdggkfxsk2wiyfb7.png "Find my mastodon website")

命令是：

```
$ nativefier -n findmymastodon \
  -p linux -a x64 \
  --width 1024 --height 768 \
  --tray --disable-dev-tools \
  --single-instance https://findmymastodon.com

$ cd findmymastodon-linux-x64
chmod +x findmymastodon

```

### 创建 Linux 桌面图标

应用已经创建并可以执行了，现在是创建桌面图标的时候了。

作为示范，以下是如何为 Mastodon 启动器创建一个桌面图标。首先，下载一个 [Mastodon](https://icons8.com/icons/set/mastodon) 的图标。将该图标放在其 Nativefier 应用目录下，名为 `icon.png`。

然后创建一个名为 `Mastodon.desktop` 的文件并输入以下文本：

```
[Desktop Entry]
Type=Application
Name=Mastodon
Path=/home/tux/NativeApps/Mastodon-linux-x64
Exec=/home/tux/NativeApps/Mastodon-linux-x64/Mastodon
Icon=/home/tux/NativeApps/Mastodon-linux-x64/icon.png

```

你可以把 `.desktop` 文件移到你的 Linux 桌面上，把它作为一个桌面启动器。你也可以把它复制到 `~/.local/share/applications` 中，这样它就会出现在你的应用菜单或活动启动器中。

### 总结

我喜欢为我经常使用的工具配备专门的应用。我最喜欢的一个 Mastodon 应用特点是，当我登录到 Mastodon 之后，我就不必再次登录了! Nativefier 在底层运行 Chromium。所以它能够像其他浏览器一样记住你的会话。我想特别感谢 Nativefier 团队，他们让 Linux 桌面离完美更近了一步。

本文最初发表在 [作者的网站](https://ayushsharma.in/2021/10/make-linux-apps-for-notion-mastodon-webapps-using-nativefier) 上，并经授权转载。

---

via: <https://opensource.com/article/21/11/linux-apps-nativefier>

作者：[Ayush Sharma](https://opensource.com/users/ayushsharma) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #452 看不见的 JavaScript 后门

Summary: 更多：• 苹果将很快允许指定用户继承 iCloud 数字遗产 • 苹果说，想用侧载应用的用户可以使用安卓

![](/data/attachment/album/202111/11/172709ptpp26w2j65h6pza.jpg)

### 看不见的 JavaScript 后门

![](/data/attachment/album/202111/11/172723rh4nn74axubkch73.jpg)

我们之前在 [443 期报道](/article-13945-1.html) 过，剑桥大学的研究人员披露了在源代码中隐藏人眼看不见的漏洞的攻击方法，它利用了 Unicode 中的特殊字符，通过方向覆盖、同形异义等方法创造出对编译器和人类视觉上存在差异的源代码。现在，安全研究人员披露了在 [JavaScript](https://certitude.consulting/blog/en/invisible-backdoor/) 中发动类似攻击的方法。在 JavaScript 中创造看不见的后门首先需要寻找能被 JS 解释为标识符/变量的不可见的 Unicode 字符，然后寻找使用不可见字符不被注意到的方法。这种方法无法通过语法高亮检测出来。

>
> 老王点评：看来以后审计后门光凭眼睛看还不行，还需要一个能识别这种隐藏字符的工具。
>
>
>

### 苹果将很快允许指定用户继承 iCloud 数字遗产

![](/data/attachment/album/202111/11/172749n77c79dxmcsm9sqy.jpg)

此前遇到家人离世的时候，苹果一直没能提供一个简单访问其 iCloud 账户的方法，更别提在不知道密码的情况下解锁设备了。此外，即使提交了死亡证明，这些用户的数据也无法向继承人交付。在近日的 iOS 15.2 更新中，该公司已允许用户指定五个 [继承人账号](https://www.theverge.com/2021/11/10/22774873/apple-digital-legacy-program-comes-to-ios15-iphones-macs)。要激活继承，继承人仍需向苹果官方提交死亡证明、以及可能需要法院确认其继承权。在苹果之前，以 Google 和 Facebook 为代表的许多科技企业，也都设立了允许指定用户访问他人账户的访问机制。

>
> 老王点评：确实，数字遗产已经是现代社会不可或缺的一部分，科技产品需要有完善的机制来处理它。
>
>
>

### 苹果 CEO 说，想用侧载应用的用户可以使用安卓

![](/data/attachment/album/202111/11/172811mh8habk388hf08zr.jpg)

在围绕 App Store 的审查和用户如何在 iPhone 上下载和安装应用程序方面，苹果公司 CEO [在 DealBook 峰会上说](https://www.macrumors.com/2021/11/09/tim-cook-users-sideloading-use-an-android/)，“如果这对你很重要，那么你应该买一部安卓手机。从我们的角度来看，这就好比我是一个汽车制造商，告诉客户不要在车里装安全气囊和安全带。”他表示，如果不能最大限度地保证安全和隐私，它就不是 iPhone 了。

>
> 老王点评：其实我是支持苹果这种“封闭”的态度的，但是这种封闭需要更透明的信息公开。
>
>
>


使用 Linux cowsay 命令制作丰富多彩的节日问候

Summary: 用这个有趣的 Linux 命令行工具来庆祝节日吧。

用这个有趣的 Linux 命令行工具来庆祝节日吧。

>
> 用这个有趣的 Linux 命令行工具来庆祝节日吧。
>
>
>

![](/data/attachment/album/202111/12/101540nq1nut3gzkzz1qus.jpg "Pumpkins painted for Day of the Dead")

你可能听说过这样一个小程序：它能接受输入信息（比如你通过键盘输入的消息），并输出一张引用了输入消息的牛的图像。这个小程序被称为 `cowsay`，之前我们已经 [介绍](https://opensource.com/article/18/12/linux-toy-cowsay) 过了。

所以，为了搞点有趣的事，我想用它来庆祝 <ruby> 亡灵节 <rt>  Día de los Muertos </rt></ruby>（LCTT 译注：墨西哥传统的鬼节，著名动画电影《<ruby> 寻梦环游记 <rt>  Coco </rt></ruby>》即以此为背景）。

除了牛之外，其实还有一些其他的可用图像。当安装 `cowsay` 时，程序会自动安装其他几个图像，并存储在 `/user/share/cowsay` 目录中。你可以用 `-l` 参数来获取图像列表。

```
$ sudo dnf install cowsay
$ cowsay -l

```

实际上还有很多与 `cowsay` 或类似程序相关的开发活动。你可以创建自己的图像文件，也可以下载其他人制作的图像。例如，GitHub 上就有 [Charc0al 的 cowsay 文件转换器](https://charc0al.github.io/cowsay-files/converter/)。你可以用这一工具将自己的图片转换为 `cowsay` 所需的特殊 ASCII 格式文件。根据 Linux 或 FreeBSD 终端设置不同，你可能会启用颜色支持，而 `cowsay` 也可以显示彩色图像。Charc0al 的转换器也提供了许多现成的颜色文件。

我选择了“<ruby> 甲壳虫汁 <rt>  Beetlejuice </rt></ruby>”（LCTT 译注：同名美国奇幻喜剧电影中的主角大法师）文件来开展我的“庆祝活动”。首先，我将 [beetlejuice.cow](https://raw.githubusercontent.com/charc0al/cowsay-files/master/cows/beetlejuice.cow) 文件保存到了 `/usr/share/cowsay` 目录。这个目录权限属于 root 用户，你可以先将该文件保存到家目录，然后再复制过去。此外我们还需要将该文件的读取权限赋予所有用户。

```
$ sudo cp beetlejuice.cow /usr/share/cowsay
$ sudo chmod o+r /usr/share/cowsay/beetlejuice.cow

```

关注一下图像是如何生成的（过程很有趣）。首先将各种 ASCII 颜色控制代码设置为变量，然后用这些变量，以传统的 ASCII 艺术风格绘制图像。生成的图像几乎是全身的，并且在不滚动屏幕的情况下，不适配我的终端的高度，所以我编辑了一下该文件，删除了最后 15 行以降低高度。

这个图像也可以被 `cowsay` 程序检测到，并展示在列表中。

```
$ cowsay -l
Cow files in /usr/share/cowsay:
beavis.zen beetlejuice blowfish bud-frogs bunny cheese cower default dragon
...

```

现在，只要运行程序，并使用 `-f` 选项指定该图像就可以了。别忘了提供要输出的信息。

```
$ cowsay -f beetlejuice "Happy Day of the Dead!"

```

![ASCII display of Beetlejuice via cowsay](/data/attachment/album/202111/12/101550f36433zeeaq757qe.png)

*“甲壳虫汁”祝你亡灵节快乐 (CC BY-SA 4.0)*

`cowsay` 是 Linux 中一个有趣的搞怪小玩意。发挥你的创意，探索一下 `cowsay` 以及 ASCII 的艺术吧。

---

via: <https://opensource.com/article/21/11/linux-cowsay>

作者：[Alan Formy-Duval](https://opensource.com/users/alanfdoss) 选题：[lujun9972](https://github.com/lujun9972) 译者：[unigeorge](https://github.com/unigeorge) 校对：[wxy](https://github.com/wxy)

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


在苹果 M1 上运行 Linux 虚拟机变得容易了

![](/data/attachment/album/202111/12/155528mimf4ts44rpiiqdf.png)

>
> Canonical 使用户可以借助 Multipass（一个免费的虚拟机程序）在苹果 M1 上运行 Linux 虚拟机。
>
>
>

自从苹果推出 M1 芯片以来，人们为在其上运行 Linux 做出了许多努力。

尽管这项工作仍在进行中，但 Canonical 似乎已经实现了在苹果 M1 上以虚拟机（VM）形式运行 Linux（Ubuntu）。

### 苹果 M1 上的 Linux 虚拟机

对大多数开发者来说，启动一个 Linux 虚拟机实例，并继续在他们的系统上工作是很方便的，这样不会中断任何工作。

不幸的是，在 M1 设备上启动和运行 Linux 实例不是一项轻松的任务。

虽然你可以用像 VMware 和 VirtualBox 这样的工具来创建虚拟机，但它们并不能在基于 ARM 的苹果 M1 芯片上工作。

截至目前，VMware 正在慢慢增加对其产品的支持，使其能够在苹果 M1 上工作。然而，这仍处于封闭测试阶段，对用户来说并不可行。

而 VirtualBox 还不支持 ARM 平台，也没有这方面的计划。

因此，你运行虚拟机的最佳选择是在 macOS 上使用 parallels 或 [UTM](https://github.com/utmapp/UTM)（免费）。因此，跨平台支持的选择相当有限。

此外，要使用 parallels 你需要购买许可证，这可能很昂贵。

### Canonical 的 Multipass 1.8 是一个支持 M1 的免费虚拟机程序

[Multipass](https://multipass.run/) 是一个免费的虚拟机软件，旨在帮助你在苹果 M1 上创建 Linux 实例，而没有任何麻烦。

Canonical [宣布](https://ubuntu.com/blog/canonical-transforms-linux-on-mac) 发布了他们最新的 Multipass 1.8，终于增加了对苹果 M1 的支持，使其成为唯一可行的选择。它作为一个跨平台的虚拟机软件，可以帮助你运行 Ubuntu Linux。

在公告中，Canonical 产品经理 Nathan Hart 提到。

>
> “Canonical 希望比市场上的其他选择更快地让开发者运行起来 Linux，而 Multipass 团队帮助实现了这一点。”
>
>
>

在增加支持的同时，Multipass 1.8 还带来了一些有用的功能，包括。

* 别名，可以将虚拟机上的命令与主机操作系统关联起来。换句话说，你可以在虚拟机中无缝地直接从主机操作系统中运行一个软件。
* 统一的跨平台体验，支持 Windows、Linux、Mac OS（Intel/AMD 和 ARM 平台）。

Multipass 应该可以处理好配置问题，让你轻松地在苹果 M1 上创建/维护虚拟机。因此，你不需要任何人工干预，就可以让 Linux 在搭载 M1 的 macOS 机器内工作。

你可以在他们的 [官方网站](https://multipass.run/) 上了解到更多信息。

### 总结

既然现在你可以使用 Canonical 的 Multipass 在苹果 M1 上启动一个 Linux 实例，你会考虑买一台苹果 M1 系统用于你的开发工作吗？

或者，还是你更喜欢使用 parallels 来在 M1 上运行 Linux？请在下面的评论中告诉我你的想法。

---

via: <https://news.itsfoss.com/canonical-multipass-linux-m1/>

作者：[Ankush Das](https://news.itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #453 微软 Edge 浏览器变成了广告软件

Summary: 更多：• Btrfs 文件系统将改变格式以解决一些严重问题 • Chrome 推送企业策略补丁，以阻止查看网页 HTML 源码

![](/data/attachment/album/202111/12/184035mrry8lozmfdm62y6.jpg)

### 微软 Edge 浏览器变成了广告软件

![](/data/attachment/album/202111/12/184047loz6xat454oozot8.jpg)

不少用户反馈在升级到 Edge 新版本中出现了 [更多的提醒和广告](https://www.windowslatest.com/2021/11/12/microsoft-edge-is-getting-office-integration-and-more-ads-alerts/)，例如推荐用户使用 Microsoft Start（此前叫做 MSN feed）的服务。微软正在试验更多的广告/推荐，这些广告将出现在浏览器的新标签页中。此外，微软的弹出广告也显示，它正在利用浏览器的新协助功能，从你执行的搜索中收集结果改进其必应搜索引擎。

>
> 老王点评：这种情况特别像早些年流行的一种软件 AD-Ware。
>
>
>

### Btrfs 文件系统将改变格式以解决一些严重问题

![](/data/attachment/album/202111/12/184105cg4g9ggg0j0l4hzl.jpg)

Btrfs 文件系统开发者正在开发一个重磅更新，以解决文件系统设计中的一些“[糟糕的部分](https://www.phoronix.com/scan.php?page=news_item&px=Btrfs-Improving-Painful-Parts)”，如全局根文件系统中的锁争夺，以及块组项在整个范围树上的传播问题。但这个更新会导致其磁盘格式发生变化，之前的 Btrfs 文件系统需要转换才行。这项工作预计持续 6~12 个月。

>
> 老王点评：虽然这种开发的初衷是好的，但是引入不兼容性还是要慎重，可以考虑叫 Btrfs2。
>
>
>

### Chrome 推送企业策略补丁，以阻止查看网页 HTML 源码

![](/data/attachment/album/202111/12/184119z6lhiwlibwqzxq8i.jpg)

谷歌在 Chrome 98 中提供了一个 Chrome 企业策略补丁，允许学校 IT 管理员设置 [禁止查看 HTML 源代码](https://9to5google.com/2021/11/11/chrome-edge-admin-policy-block-page-source-code-edu/)。开发团队声称这项功能旨在解决学校中某些持续存在的问题，尤其是涉及学生通过查看 HTML 源码来偷看线上测验的答案、或通过技术手段绕过屏蔽站点。这个更新补丁的推出时机，正值前段时间美国密苏里州州长声称“查看 HTML 源码等同于黑客攻击”，因而引发了不少争议。

>
> 老王点评：其实他们就是想把互联网变成一个不透明的黑盒。
>
>
>


《极限竞速：地平线 5》登陆 Linux 了吗？有可能你已经玩起来了

666, 以后linux系统也可以玩3A游戏

>
> 《极限竞速：地平线 5》是一款非常受欢迎的赛车游戏。虽然它还没有发布 Linux 版，但看起来 Valve 的 Proton 可能就是让它跑起来的答案！
>
>
>

![](/data/attachment/album/202111/13/115411d3gqygmk202f9wyy.jpg)

《极限竞速：地平线 5》是一款新的赛车电子游戏，由 Playground Games 开发，Xbox 游戏工作室发行。

在正式发布之前，已经有大约 100 万玩家通过高级版提前进入了游戏。

虽然该游戏的视觉效果和对旧硬件的优化令人叹为观止，但它是又一款只在 Windows 平台上运行的游戏。

幸运的是，它也可以在 Steam 上玩。因此，有可能在 Linux 上使用 Proton 兼容层来尝试它。

### Linux 上的《极限竞速：地平线 5》似乎成为现实

最初，在 Linux 上运行的《极限竞速：地平线 4》的状态很差。根据 ProtonDB 上的报告，它是不可玩的。

随着 Proton（或 [SteamPlay for Linux](https://itsfoss.com/steam-play/)）的改进，现在有了一个银色评价。仍然不令人满意，但总比没有好。

而且，到了《极限竞速：地平线 5》并没有变得更好，它在 [ProtonDB](https://www.protondb.com/app/1551360) 上有一个不可玩的评价。

不过，我注意到有几个人在尝试运行《极限竞速：地平线 5》时获得了成功。

Jeremy Soller（System76 的工程师）分享了一条推特，可以看到他在 Pop!\_OS 21.10 Beta 上玩《极限竞速：地平线 5》：

>
> 炸裂了！
>
>
> 《极限竞速：地平线 5》
>
>
> Proton 前沿实验版
>
>
> Pop!\_OS 21.10 Beta
>
>
> 正式发布后，你们今晚就能玩了
>
>
> ![](/data/attachment/album/202111/13/115447spm01um079t1j6dg.jpg)
>
>
> -- Jeremy Soller（@jeremy\_soller）[2021 年 11 月 10 日](https://twitter.com/jeremy_soller/status/1458568707798536200?ref_src=twsrc%5Etfw)
>
>
>

而且，并不是只是他一个人，Win-staging 维护者和 Proton-GE 开发者 Tom（又名 GloriousEggroll）也分享了一条在 Linux 上玩《极限竞速：地平线 5》的推特：

>
> 对于一个 5 天前发布的游戏来说，Linux 的表现还不错 \o/ < 插入它运行的样子 gif>
>
>
> ![](/data/attachment/album/202111/13/115454xojhllgyy30j4hhp.jpg)
>
>
> -- GloriousEggroll（@GloriousEggroll）[2021 年 11 月 11 日](https://twitter.com/GloriousEggroll/status/1458590821075361794?ref_src=twsrc%5Etfw)
>
>
>

此外，GloriousEggroll 在推特上提到：

>
> Paul（wine 的开发者之一）向 Proton 实验版推送了修正，此外还有 vkd3d 中需要的修正。我已经把它们移植到了 proton-ge 上（还有 battleye 补丁和 CEG drm 补丁）。
>
>
>

所以，看起来你可以使用 Proton 的最新的前沿实验版玩《地平线5》了。

当然，这对每个人来说都不是一个理想的解决方案。但是，很高兴知道，最新的 Proton 前沿实验版使（在 Steam 上）玩《极限竞速：地平线 5》成为可能。

### 你应该在 Steam 上为 Linux 购买《极限竞速：地平线 5》吗？

如果你的目标是专门在 Linux 上玩这个游戏，你或许应该等一等。

根据 Proton 上的 [GitHub 议题讨论](https://github.com/ValveSoftware/Proton/issues/5285)，该游戏似乎存在一些问题，即使你使用 Proton 的前沿实验版。

但是，如果你想帮助提交 bug 报告并进行测试，那么请尝试一下。

当然，如果你配置了 Windows 的双启动，或者有另一个 Windows 系统，如果你喜欢，你可以购买这个游戏。

希望随着下一个 Proton 实验版或稳定版的发布，我们可能会得到对 Forza Horizon 5 的必要支持。

你对 Linux 上的《极限竞速：地平线 5》有什么看法？自己测试过吗？

---

via: <https://news.itsfoss.com/forza-horizon-5-linux/>

作者：[Ankush Das](https://news.itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


如何更新 Linux 的符号链接

Summary: 链接一直是 UNIX 文件系统的一个独特的高级功能。

读到最后才知道，符号链接就是软连接

链接一直是 UNIX 文件系统的一个独特的高级功能。

>
> 链接一直是 UNIX 文件系统的一个独特的高级功能。
>
>
>

![](/data/attachment/album/202111/13/185626ubb832pphjhlpmly.jpg "Links")

UNIX 和 Linux 用户发现链接有很多用途，特别是符号链接。我喜欢使用符号链接的一种方式是管理各种 IT 设备的配置备份。

我有一个目录结构，用来存放我的文档、更新及网络上其他和计算机和设备有关的文件。设备可以包括路由器、接入点、NAS 服务器和笔记本电脑，通常有不同的品牌和版本。配置备份本身可能在目录树的深处，例如 `/home/alan/Documents/network/device/NetgearRL5000/config`。

为了简化备份过程，我在主目录中有一个名为 `Configuration` 的目录。我使用这个目录的符号链接来指向特定的设备目录：

```
:~/Configuration/ $ ls -F1
Router@
Accesspoint@
NAS@

```

**注意**：`ls` 命令的 `-F` 选项在每个文件名上附加特殊字符以表示其类型。如上所示，`@` 符号表示这些是链接。

### 创建一个链接

符号链接 `Router` 指向我的 Netgear RL5000 的 `config` 目录。创建它的命令是 `ln -s`：

```
$ ln -s /home/alan/Documents/network/device/NetgearRL5000/config Router

```

然后，用 `ls -l` 看一下并确认：

```
:~/Configuration/ $ ls -l
Router -> /home/alan/Documents/network/device/NetgearRL5000/config
NAS -> /home/alan/Documents/network/device/NFSBox/config
...

```

这样做的好处是，当对这个设备进行维护时，我只需进入 `~/Configuration/Router`。

如果我决定用一个新的型号替换这个路由器，使用符号链接的第二个好处就很明显了。我可能会把旧的路由器改成一个接入点。因此，它的目录并没有被删除。相反，我有一个新的目录，对应于新的路由器，也许是华硕 DF-3760。我创建这个目录并确认它的存在：

```
$ mkdir -p ~/Documents/network/device/ASUSDF-3760/config

```

```
:~/Documents/network/device/ $ ls
NetgearRL5000
ASUSDF-3760
NFSBox
...

```

另一个例子是，如果你的办公室里有几个接入点。你可以使用符号链接在逻辑上代表每一个，用一个通用的名字，如 `ap1`，`ap2`，等等，或者你可以使用描述性的词语，如 `ap_floor2`，`ap_floor3`，等等。这样，当物理设备随时间变化时，你不必持续更新任何可能管理它们的进程，因为它们是在处理链接而不是实际的设备目录。

### 更新一个链接

由于我的主路由器已经改变，我想让路由器的符号链接指向它的目录。我可以使用 `rm` 和 `ln` 命令来删除和创建一个新的符号链接，但是有一种方法可以只用 `ln` 命令和几个选项就可以一步完成：

```
:~/Configuration/ $ ln -vfns ~/Documents/network/device/ASUSDF-3760/config/ Router
'Router' -> '/home/alan/Documents/network/device/ASUSDF-3760/config/'
:~/Configuration/ $ ls -l
Router -> /home/alan/Documents/network/device/ASUSDF-3760/config
NAS -> /home/alan/Documents/network/device/NFSBox/config

```

根据手册页，这些选项如下：

* `-v`、`--verbose`：打印每个链接文件的名称
* `-f`、`--force`：删除目标文件（有必要，因为已经存在一个链接）
* `-n`、`--no-dereference`：如果链接名是一个目录的符号链接，就把它当作一个正常的文件
* `-s`、`--symbolic`：制作符号链接而不是硬链接

### 总结

链接是 UNIX 和 Linux 文件系统中最强大的功能之一。其他操作系统也曾试图模仿这种能力，但由于他们的文件系统缺乏基本的链接设计，这些系统从来没有工作得那么好，也没有那么可用。

上面的演示只是利用链接在生活生产环境中无缝浏览不断变化的目录结构的众多可能性中的一种。链接提供了一个永远不会长期静态的组织所需的灵活性。

---

via: <https://opensource.com/article/21/11/update-linux-file-system-link>

作者：[Alan Formy-Duval](https://opensource.com/users/alanfdoss) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #454 微软阻止了所有绕过 Edge 浏览器的方法

Summary: 更多：• 预计到 2030 年中国将创造所有物联网价值的四分之一以上 • 美国雇用机器人的数量创造了新纪录

Linux太费了，之前用Ubuntu，把我头都搞大了，据说kubuntu更好用一点，真的吗？

目前在用elementary，简洁、精致、硬件需求不高，符合我的口味。边学边练，通过命令升级系统，安装卸载软件，编译源码安装程序，使用htop、nano、tar、rm，这些蜗牛爬似的竟也折腾出来了！

假的, 都一样, 不建议麻瓜使用linux呢亲

我一直觉得KDE比Gnome难用。<br />
不过目前是WSL2

![](/data/attachment/album/202111/13/200228hjzbh9jz9oh6cwh6.jpg)

### 微软阻止了所有绕过 Edge 浏览器的方法

![](/data/attachment/album/202111/13/200241v2a2a3737xig2d2g.jpg)

微软在 Windows 11 发布会上告诉媒体，它知道它使改变应用程序默认值变得毫无意义的困难，但它不是恶意这样做的，并将修复该问题。[但事实恰恰相反](https://www.thurrott.com/windows/windows-11/259208/windows-11-to-block-windows-11-browser-workarounds)，在最近的 Windows 11 Insider 版本中，不再能使用 EdgeDeflector 等应用程序绕过微软的默认浏览器设置。即使你已经通过令人难以置信的、深思熟虑的步骤，使非 Edge 浏览器成为 Windows 11 的默认浏览器，微软仍然通过系统层面的 URL 请求迫使你使用 Edge。EdgeDeflector 以及 Firefox 等第三方浏览器通过拦截系统级的 URL 请求来使自己服务这些 URL 请求。但在最新的 Insider 版本中，微软正在改变这些 URL 请求的工作方式，导致这些 URL 不能再被拦截。微软会忽略所有这些方法，而默默打开 Edge，即便你野蛮清除了 Edge 浏览器，它也只是报错而坚持不使用你的默认浏览器。

>
> 老王点评：微软这是要掀起默认浏览器大战么？我觉得微软是忘记了当年是如何因为 IE 而被起诉的了。
>
>
>

### 预计到 2030 年中国将创造所有物联网价值的四分之一以上

![](/data/attachment/album/202111/13/200320c9xvy7eps1h6wy68.jpg)

[麦肯锡全球研究院估计](https://www.axios.com/internet-of-things-mckinsey-study-1b11baae-8521-4a5d-8f44-14ad136bc3da.html)，到 2030 年，物联网可以在全球范围内实现 5.5 万亿美元至 12.6 万亿美元的价值。其中约 65% 的价值预计将在商业应用中创造，如智能工厂或办公室，而不是像联网的吸尘器这样的消费应用。他们预计到 2030 年，中国将创造所有物联网价值的四分之一以上。并且指出，对未来物联网价值的高端估计有四分之三取决于建立互操作性，而网络安全问题仍将是一个挥之不去的问题。

>
> 老王点评：在基础设施进一步发展的形势下，到时候我们身边会遍布物联网设备和机器人。
>
>
>

### 美国雇用机器人的数量创造了新纪录

![](/data/attachment/album/202111/13/200301xc8115aa8m1g8u8a.jpg)

根据 [行业组织 A3 汇编的数据](https://edition.cnn.com/2021/11/12/tech/robot-automation/index.html)，美国的工厂和其他工业用户订购了价值 14.8 亿美元的 2.9 万台机器人，比去年同期多 37%。长期以来，汽车公司已经购买了大部分工业机器人。但在 2020 年，其他类型企业的销售总额首次超过了汽车行业，而且这一趋势在今年继续。根据 A3 的数据，今年前 9 个月，与汽车相关的机器人订单增长了 20%，而非汽车公司的订单扩大了 53%。

>
> 老王点评：别说身边的机器人了，以后很多工作都是机器人的了。
>
>
>


扩展一个 GraphQL 网站

![](/data/attachment/album/202111/14/113411shrp6jpp3a8x1cjq.jpg)

我通常会抽象地总结我为他人所做的工作（出于显而易见的原因），但是我被允许公开谈论一个网站：[Vocal](https://vocal.media) 。我去年为它做了一些 SRE 工作。实际上早在 2 月份，我就在 [GraphQL 悉尼会议上做过一次演讲](https://www.meetup.com/en-AU/GraphQL-Sydney/events/267681845/)，不过这篇博客推迟了一点才发表。

Vocal 是一个基于 GraphQL 的网站，它获得了人们的关注，然后就遇到了可扩展性问题，而我是来解决这个问题的。这篇文章会讲述我的工作。显然，如果你正在扩展一个 GraphQL 站点，你会发现这篇文章很有用，但其中大部分内容讲的都是当一个站点获得了足够的流量而出现的必须解决的技术问题。如果你对站点可扩展性有兴趣，你可能想先阅读 [最近我发表的一系列关于可扩展性的文章](https://theartofmachinery.com/2020/04/21/what_is_high_traffic.html)。

### Vocal

![](/data/attachment/album/202111/14/113422w9hzcf9iwus149qe.png)

Vocal 是一个博客平台，内容包括日记、电影评论、文章评论、食谱、专业或业余摄影、美容和生活小贴士以及诗歌，当然，还有可爱的猫猫和狗狗照片。

![](/data/attachment/album/202111/14/113423a9cagfxz9okaz70z.png)

Vocal 的不同之处在于，它允许人们制作观众感兴趣的作品而获得报酬。作者的页面每次被浏览都可以获得一小笔钱，还能获得其他用户的捐赠。有很多专业人士在这个平台上展示他们的工作，但对于大多数普通用户来说，他们只是把 Vocal 当作一个兴趣爱好，碰巧还能赚些零花钱作为奖励。

Vocal 是新泽西初创公司 ~~[Jerrick Media](https://jerrick.media)~~ 的产品，更新：Jerrick Media 已经更名为 Creatd，在纳斯达克上市。2015 年，他们与 [Thinkmill](https://www.thinkmill.com.au/) 合作一起开发，Thinkmill 是一家悉尼中型软件开发咨询公司，擅长 JavaScript、React 和 GraphQL 开发。

### 剧透

不幸的是，有人告诉我，由于法律原因，我不能提供具体的流量数字，但公开的信息可以说明。Alexa 对所有网站按照流量进行排名。这是我演讲中展示的 Alexa 排名图，从 2019 年 11 月到今年 2 月，Vocal 流量增长到全球排名第 5567 位。

![去年 11 月到今年 2 月 Vocal 的全球排名从 9574 名增长到 5567 名](/data/attachment/album/202111/14/113423fmzgl6g665y2bedl.png)

曲线增长变慢是正常的，因为它需要越来越多的流量来赢得每个位置。Vocal 现在排名 4900 名左右，显然还有很长的路要走，但对于一家初创公司来说，这一点也不寒酸。大多数初创公司都很乐意与 Vocal 互换排名。

在网站升级后不久，Creatd 开展了一项营销活动，使流量翻了一番。在技术方面，我们要做的就是观察仪表盘上的上升的数字。自发布以来的 9 个月里，只有两个平台问题需要员工干预：[3 月份每五年一次的 AWS RDS 证书轮换](https://aws.amazon.com/blogs/database/amazon-rds-customers-update-your-ssl-tls-certificates-by-february-5-2020/)，以及一款应用推出时遇到的 Terraform 错误。作为一名 SRE，我很高兴看到 Vocal 不需要太多的平台工作来保持运行。更新：该系统也抗过了 2020 年的美国大选，没有任何意外。

以下是本文技术内容的概述：

* 技术和历史背景
* 从 MongoDB 迁移到 Postgres
* 部署基础设施的改造
* 使应用程序兼容扩展措施
* 让 HTTP 缓存发挥作用
* 其他一些性能调整

### 一些背景信息

Thinkmill 使用 [Next.js](https://github.com/vercel/next.js)（一个基于 React 的 Web 框架）构建了一个网站，和 [Keystone](https://www.keystonejs.com/) 在 MongoDB 前面提供的 GraphQL API 进行交互。Keystone 是一个基于 GraphQL 的无头 CMS 库：在 JavaScripy 中定义一个模式，将它与一些数据存储挂钩，并获得一个自动生成的 GraphQL API 用于数据访问。这是一个自由开源软件项目，由 Thinkmill 提供商业支持。

#### Vocal V2

Vocal 的第一版就受到了关注，它找到了一个喜欢它的用户群，并不断壮大，最终 Creatd 请求 Thinkmill 帮助开发 V2，并于去年 9 月成功推出。Creatd 员工避免了 [第二个系统效应](https://wiki.c2.com/?SecondSystemEffect)，他们一般都是根据用户的反馈进行改变，所以他们 [主要是 UI 和功能更改，我就不赘述了](https://vocal.media/resources/vocal-2-0)。相反，我将讨论下我的工作内容：使新站点更加健壮和可扩展。

声明：我很感谢能与 Creatd 以及 Thinkmill 在 Vocal 上的合作，并且他们允许我发表这个故事，但 [我仍然是一名独立顾问](https://theartofmachinery.com/about.html)，我写这篇文章没有报酬，甚至没有被要求写它，这仍然是我自己的个人博客。

### 迁移数据库

Thinkmill 在使用 MongoDB 时遇到了几个可扩展性问题，因此决定升级到 Keystone 5 以利用其新的 Postgres 支持。

如果你从事技术工作的时间足够长，那你可能还记得 00 年代末的 “NOSQL” 营销，这可能听起来很有趣。NoSQL 的一个重要特点是，像 Postgres 这样的关系数据库（SQL）不像 MongoDB 这样“网站级规模”的 NoSQL 数据库那样具有可扩展性。从技术上将，这种说法是正确的，但 NoSQL 数据库的可扩展性来自它可以有效处理各种查询的折衷。简单的非关系数据库（如文档数据库和键值数据库）有其一席之地，但当它们用作应用的通用后端时，应用程序通常会在超出关系数据库的理论扩展限制之前，就超出了数据库的查询限制。Vocal 的原本的大多数数据库查询在 MongoDB 上运行良好，但随着时间推移，越来越多的查询需要特殊技巧才能工作。

在技术要求方面，Vocal 与维基百科非常相似。维基百科是世界上最大的网站之一，它运行在 MySQL（或者说它的分支 MariaDB）上。当然，这需要一些重要的工程来实现，但在可预见的未来，我认为关系数据库不会对 Vocal 的扩展构成严重威胁。

我做过一个比较，托管的 AWS RDS Postgres 实例的成本不到旧 MongoDB 实例的五分之一，但 Postgres 实例的 CPU 使用率仍然低于 10%，尽管它提供的流量比旧站点多。这主要是因为一些重要的查询在文档数据库架构下一直效率很低。

迁移的过程可以新写一篇博客文章来讲述，但基本上是 Thinkmill 开发人员构建了一个 [ETL 管道](https://en.wikipedia.org/wiki/Extract,_transform,_load)，使用 [MoSQL](https://github.com/stripe/mosql) 来完成这项繁重的工作。由于 Keystone 对于 Postgres 支持仍然比较基础，但它是一个 FOSS 项目，所以我能够解决在 SQL 生成性能方面遇到的问题。对于这类事情，我总是推荐 Markys Winand 的 SQL 博文：[使用 Luke 索引](https://use-the-index-luke.com/) 和 [现代 SQL](https://modern-sql.com/)。他的文章很友好，甚至对那些暂时不太关注 SQL 人来说也是容易理解的，但他拥有你大多数需要的理论知识。如果你仍然有问题，一本好的、专注于即可性能的书可以帮助你。

### 平台

#### 架构

V1 是几个 Node.js 应用，运行在 Cloudflare（作为 CDN）背后的单个虚拟专用服务器（VPS）上。我喜欢把避免过度工程化作为一个高度优先事项，所以我对这一架构竖起了大拇指。然而，在 V2 开始开发时，很明显，Vocal 已经超越了这个简单的架构。在处理巨大峰值流量时，它没有给 Thinkmill 开发人员提供很多选择，而且它很难在不停机情况下安全部署更新。

这是 V2 的新架构：

![Vocal V2 的技术架构，请求从 CDN 进入，然后经过 AWS 的负载均衡。负载均衡将流量分配到两个应用程序 “Platform” 和 “Website”。“Platform” 是一款 Keystone 应用程序，将数据存储在 Redis 和 Postgres 中。](/data/attachment/album/202111/14/113424grhvqzqr1kprjytr.svg)

基本上就是两个 Node.js 应用程序复制放在负载均衡器后面，非常简单。有些人认为可扩展架构要比这复杂得多，但是我曾经在一些比 Vocal 规模大几个数量级的网站工作过，它们仍然只是在负载均衡器后面复制服务，带有 DB 后端。你仔细想想，如果平台架构需要随着站点的增长而变得越来越复杂，那么它就不是真正“可扩展的”。网站可扩展性主要是解决那些破坏可扩展的实现细节。

如果流量增长得足够多，Vocal 的架构可能需要一些补充，但它变得更加复杂的主要原因是新功能。例如，如果（出于某种原因）Vocal 将来需要处理实时地理空间数据，那将是一个与博客文章截然不同的技术，所以我预期它会进行架构上的更改。大型网站架构的复杂性主要来自于复杂的功能。

不知道未来的架构应该是什么样子很正常，所以我总是建议你尽可能从简单开始。修复一个简单架构要比复杂架构更容易，成本也更低。此外，不必要的复杂架构更有可能出现错误，而这些错误将更难调试。

顺便说一下，Vocal 分成了两个应用程序，但这并不重要。一个常见的扩展错误是，以可扩展的名义过早地将应用分割成更小的服务，但将应用分割在错误的位置，从而导致更多的可扩展性问题。作为一个单体应用，Vocal 可以扩展的很好，但它的分割做的也很好。

#### 基础设施

Thinkmill 有一些人有使用 AWS 经验，但它主要是一个开发车间，需要一些比之前的 Vocal 部署更容易上手的东西。我最终在 AWS Fargate 上部署了新的 Vocal，这是弹性容器服务（ECS）的一个相对较新的后端。在过去，许多人希望 ECS 作为一个“托管服务运行 Docker 容器”的简单产品，但人们仍然必须构建和管理自己的服务器集群，这让人感到失望。使用 ECS Fargate，AWS 就可以管理集群了。它支持运行带有复制、健康检查、滚动更新、自动缩放和简单警报等基本功能的 Docker 容器。

一个好的替代方案是平台即服务（PaaS），比如 App Engine 或 Heroku。Thinkmill 已经在简单的项目中使用它们，但通常在其他项目中需要更大的灵活性。在 PaaS 上运行的网站规模要大得多，但 Vocal 的规模决定了使用自定义云部署是有经济意义的。

另一个明显的替代方案是 Kubernetes。Kubernetes 比 ECS Fargate 拥有更多的功能，但它的成本要高得多 —— 无论是资源开销还是维护（例如定期节点升级）所需的人员。一般来说，我不向任何没有专门 DevOps 员工的地方推荐 Kubernetes。Fargate 具有 Vocal 需要的功能，使得 Thinkmill 和 Creatd 能专心于网站改进，而不是忙碌于搭建基础设施。

另一种选择是“无服务器”功能产品，例如 AWS Lambda 或 Google 云。它们非常适合处理流量很低或很不规则的服务，但是 ECS Fargate 的自动伸缩功能足以满足 Vocal 的后端。这些产品的另一个优点是，它们允许开发人员在云环境中部署东西，但无需了解很多关于云环境的知识。权衡的结果是，无服务器产品与开发过程、测试以及调试过程紧密耦合。Thinkmill 内部已经有足够的 AWS 专业知识来管理 Fargate 的部署，任何知道如何开发 Node.js 简单的 Hello World 应用程序的开发人员都可以在 Vocal 上工作，而无需了解无服务器功能或 Fargate 的知识。

ECS Fargate 的一个明显缺点是供应商锁定。但是，避免供应商锁定是一种权衡，就像避免停机一样。如果你担心迁移，那么在平台独立性花费比迁移上更多的钱是没有意义的。在 Vocal 中，依赖于 Fargate 的代码总量小于 500 行 [Terraform](https://theartofmachinery.com/2019/02/16/talks.html)。最重要的是 Vocal 应用程序代码本身与平台无关，它可以在普通开发人员的机器上运行，然后打包成一个 Docker 容器，几乎可以运行在任何可以运行 Docker 容器的地方，包括 ECS Fargate。

Fargate 的另一个缺点是设置复杂。与 AWS 中的大多数东西一样，它处于一个 VPC、子网、IAM 策略世界中。幸运的是，这类东西是相对静态的（不像服务器集群一样需要维护）。

### 制作一个可扩展的应用程序

如果你想轻松地运行一个大规模的应用程序，需要做一大堆正确的事情。如果你遵循 <ruby> <a href="https://12factor.net/">  应用程序设计的十二个守则 </a> <rt>  the Twelve-Factor App design </rt></ruby>，事情会变得容易，所以我不会在这里赘述。

如果员工无法规模化操作，那么构建一个“可扩展”系统就毫无意义 —— 就像在独轮车上安装喷气式发动机一样。使 Vocal 可扩展的一个重要部分是建立 CI/CD 和 [基础设施即代码](https://theartofmachinery.com/2019/02/16/talks.html) 之类的东西。同样，有些部署的思路也不值得考虑，因为它们使生产与开发环境相差太大（参阅 [应用程序设计守则第十守则](https://12factor.net/dev-prod-parity)）。生产和开发之间的任何差异都会降低应用程序的开发速度，并且（在实践中）最终可能会导致错误。

### 缓存

缓存是一个很大的话题 —— 我曾经做过 [一个关于 HTTP 缓存的演讲](https://www.meetup.com/en-AU/Port80-Sydney/events/lwcdjlyvjblb/)，相对比较基础。我将在这里谈论缓存对于 GraphQL 的重要性。

首先，一个重要的警告：每当遇到性能问题时，你可能会想：“我可以将这个值放入缓存中吗，以便再次使用时速度更快？”**微基准测试 *总是* 告诉你：是的。** 然而，由于缓存一致性等问题，随处设置缓存往往会使整个系统 **变慢**。以下是我对于缓存的检查表：

1. 是否需要通过缓存解决性能问题
2. 再仔细想想（非缓存的性能往往更加健壮）
3. 是否可以通过改进现有的缓存来解决问题
4. 如果所有都失败了，那么可以考虑添加新的缓存

在 Web 系统中，你经常使用的一个缓存是 HTTP 缓存系统，因此，在添加额外缓存之前，试着使用 HTTP 缓存是一个好主意。我将在这篇文章中重点讨论这一点。

另一个常见的陷阱是使用哈希映射或应用程序内部其他东西进行缓存。[它在本地开发中效果很好，但在扩展时表现糟糕](https://theartofmachinery.com/2016/07/30/server_caching_architectures.html)。最好的办法是使用支持显式缓存库，支持 Redis 或 Memcached 这样的可插拔后端。

#### 基础知识

HTTP 规范中有两种类型缓存：私有和公共。私有缓存不会和多个用户共享数据 —— 实际上就是用户的浏览器缓存。其余的就是公共缓存。它们包括受你控制的（例如 CDN、Varnish 或 Nginx 等服务器）和不受你控制的（代理）。代理缓存在当今的 HTTPS 世界中很少见，但一些公司网络会有。

![](/data/attachment/album/202111/14/113424b3d67sz63f86lbxf.svg)

缓存查找键通常基于 URL，因此如果你遵循“相同的内容，相同的 URL；不同的内容，不同的 URL” 规则，即，给每个页面一个规范的 URL，避免从同一个 URL 返回不同的内容这样“聪明”的技巧，缓存就会强壮一点。显然，这对 GraphQL API 端点有影响（我将在后面讨论）。

你的服务器可以采用自定义配置，但配置 HTTP 缓存的主要方法是在 Web 响应上设置 HTTP 头。最重要的标头是 `cache-control`。下面这一行说明所有缓存都可以缓存页面长达 3600 秒（一小时）：

```
cache-control: max-age=3600, public

```

对于针对用户的页面（例如用户设置页面），重要的是使用 `private` 而不是 `public` 来告诉公共缓存不要存储响应，防止其提供给其他用户。

另一个常见的标头是 `vary`，它告诉缓存，响应是基于 URL 之外的一些内容而变化。（实际上，它将 HTTP 头和 URL 一起添加到缓存键中。）这是一个非常生硬的工具，这就是为什么尽可能使用良好 URL 结构的原因，但一个重要的用例是告诉浏览器响应取决于登录的 cookie，以便在登录或注销时更新页面。

```
vary: cookie

```

如果页面根据登录状态而变化，你需要 `cache-control:private`（和 `vary:cookie`），即使是在公开的、已登出的页面版本上，以确保响应不会混淆。

其他有用的标头包括 `etag` 和 `last-modified`，但我不会在这里介绍它们。你可能仍然会看到一些诸如 `expires` 和 `pragma:cache` 这种老旧的 HTTP 标头。它们早在 1997 年就被 HTTP/1.1 淘汰了，所以我只在我想禁用缓存或者我感到偏执时才使用它们。

#### 客户端标头

鲜为人知的是，HTTP 规范允许在客户端请求中使用 `cache-control` 标头以减少缓存时间并获得最新响应。不幸的是，似乎大多数浏览器都不支持大于 0 的 `max-age` ，但如果你有时在更新后需要一个最新响应，`no-cache` 会很有用。

#### HTTP 缓存和 GraphQL

如上，正常的缓存键是 URL。但是 GraphQL API 通常只使用一个端点（比如说 `/api/`）。如果你希望 GraphQL 查询可以缓存，你需要查询参数出现在 URL 路径中，例如 `/api/?query={user{id}}&variables={"x":99}`（忽略了 URL 转义）。诀窍是将 GraphQL 客户端配置为使用 HTTP GET 请求进行查询（例如，[将 `apollo-link-http` 设置为 `useGETForQueries`](https://www.apollographql.com/docs/link/links/http/#options) ）。

Mutation 不能缓存，所以它们仍然需要使用 HTTP POST 请求。对于 POST 请求，缓存只会看到 `/api/` 作为 URL 路径，但缓存会直接拒绝缓存 POST 请求。请记住，GET 用于非 Mutation 查询（即幂等），POST 用于 Mutation（即非幂等）。在一种情况下，你可能希望避免使用 GET 查询：如果查询变量包含敏感信息。URL 经常出现在日志文件、浏览器历史记录和聊天中，因此 URL 中包含敏感信息通常是一个坏主意。无论如何，像身份验证这种事情应该作为不可缓存的 Mutation 来完成，这是一个特殊的情况，值得记住。

不幸的是，有一个问题：GraphQL 查询往往比 REST API URL 大得多。如果你简单地切换到基于 GET 的查询，你会得到一些非常长的 URL，很容易超过 2000 字节的限制，目前一些流行的浏览器和服务器还不会接受它们。一种解决方案是发送某种查询 ID，而不是发送整个查询，即类似于 `/api/?queryId=42&variables={"x":99}`。Apollo GraphQL 服务器对此支持两种方式：

一种方法是 [从代码中提取所有 GraphQL 查询，并构建一个服务器端和客户端共享的查询表](https://www.apollographql.com/blog/persisted-graphql-queries-with-apollo-client-119fd7e6bba5)。缺点之一是这会使构建过程更加复杂，另一个缺点是它将客户端项目与服务器项目耦合，这与 GraphQL 的一个主要卖点背道而驰。还有一个缺点是 X 版本和 Y 版本的代码可能识别一组不同的查询，这会成为一个问题，因为 1：复制的应用程序将在更新推出或回滚期间提供多个版本，2：客户端可能会使用缓存的 JavaScript，即使你升级或降级服务器。

另一种方式是 Apollo GraphQL 所宣称的 [自动持久查询（APQ）](https://www.apollographql.com/blog/improve-graphql-performance-with-automatic-persisted-queries-c31d27b8e6ea)。对于 APQ 而言，查询 ID 是查询的哈希值。客户端向服务器发出请求，通过哈希查询。如果服务器无法识别该查询，则客户端会在 POST 请求中发送完整的查询，服务器会保存此次查询的散列值，以便下次识别。

![](/data/attachment/album/202111/14/113424e8rono4j00ra8uwh.png)

#### HTTP 缓存和 Keystone 5

如上所述，Vocal 使用 Keystone 5 生成 GraphQL API，而 Keystone 5 和 Apollo GraphQL 服务器配合一起工作。那么我们是如何设置缓存标头的呢？

Apollo 支持 GraphQL 模式的<ruby> 缓存提示 <rt>  cache hint </rt></ruby>。巧妙地是，Apollo 会收集查询涉及的所有内容的所有缓存提示，然后它会自动计算适当的缓存标头值。例如，以这个查询为例：

```
query userAvatarUrl {
    authenticatedUser {
        name
        avatar_url
    }
}

```

如果 `name` 的最长期限为 1 天，而 `avatar_url` 的最长期限为 1 小时，则整体缓存最长期限将是最小值，即 1 小时。`authenticatedUser` 取决于登录 cookie，因此它需要一个 `private` 提示，它会覆盖其他字段的 `public`，因此生成的 HTTP 头将是 `cache-control:max-age=3600,private`。

我 [对 Keystone 列表和字段添加了缓存提示支持](https://www.keystonejs.com/api/create-list/#cachehint)。以下是一个简单例子，在文档的待办列表演示中给一个字段添加缓存提示：

```
const keystone = new Keystone({
  name: 'Keystone To-Do List',
  adapter: new MongooseAdapter(),
});

keystone.createList('Todo', {
  schemaDoc: 'A list of things which need to be done',
  fields: {
    name: {
      type: Text,
      schemaDoc: 'This is the thing you need to do',
      isRequired: true,
      cacheHint: {
        scope: 'PUBLIC',
        maxAge: 3600,
      },
    },
  },
});

```

#### 另一个问题：CORS

令人沮丧的是，<ruby> 跨域资源共享 <rt>  Cross-Origin Resource Sharing </rt></ruby>（CORS）规则会与基于 API 网站中的缓存产生冲突。

在深入问题细节之前，让我们跳到最简单的解决方案：将主站点和 API 放在一个域名上。如果你的站点和 API 位于同一个域名上，就不必担心 CORS 规则（但你可能需要考虑 [限制 cookie](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#Define_where_cookies_are_sent)）。如果你的 API 专门用于网站，这是最简单的解决方案，你可以愉快地跳过这一节。

在 Vocal V1 中，网站（Next.js）和平台（Keystone GraphQL）应用程序处于不同域（`vocal.media` 和 `api.vocal.media`）。为了保护用户免受恶意网站的侵害，现代浏览器不会随便让一个网站与另一个网站进行交互。因此，在允许 `vocal.media` 向 `api.vocal.media` 发出请求之前，浏览器会对 `api.vocal.media` 进行“预检”。这是一个使用 `OPTIONS` 方法的 HTTP 请求，主要是询问跨域资源共享是否允许。预检通过后，浏览器会发出最初的正常请求。

令人沮丧的是，预检是针对每个 URL 的。浏览器为每个 URL 发出一个新的 `OPTIONS` 请求，服务器每次都会响应。[服务器没法说 `vocal.media` 是所有 `api.vocal.media` 请求的可信来源](https://lists.w3.org/Archives/Public/public-webapps/2012AprJun/0236.html) 。当所有内容都是对一个 API 端点的 POST 请求时，这个问题并不严重，但是在为每个查询提供 GET 式 URL 后，每个查询都因预检而延迟。更令人沮丧的是，HTTP 规范说 `OPTIONS` 请求不能被缓存，所以你会发现你所有的 GraphQL 数据都被完美地缓存在用户身旁的 CDN 中，但浏览器仍然必须向源服务器发出所有的预检请求。

如果你不能只使用一个共享的域，有几种解决方案。

如果你的 API 足够简单，你或许可以利用 [CORS 规则的例外](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests)。

某些缓存服务器可以配置为忽略 HTTP 规范，任何情况都会缓存 `OPTIONS` 请求。例如，基于 Varnish 的缓存和 AWS CloudFrone。这不如完全避免预检那么有效，但比默认的要好。

另一个很魔改的选项是 [JSONP](https://en.wikipedia.org/wiki/JSONP)。当心：如果做错了，那么可能会创建安全漏洞。

#### 让 Vocal 更好地利用缓存

让 HTTP 缓存在底层工作之后，我需要让应用程序更好地利用它。

HTTP 缓存的一个限制是它在响应级别上要么是全有要么是全无的。大多数响应都可以缓存，但如果一个字节不能缓存，那整个页面就无法缓存。作为一个博客平台，大多数 Vocal 数据都是可缓存的，但在旧网站上，由于右上角的菜单栏，几乎没有页面可以缓存。对于匿名用户，菜单栏将显示邀请用户登录或创建账号的链接。对于已登录用户，它会变成用户头像和用户个人资料菜单，因为页面会根据用户登录状态而变化，所以无法在 CDN 中缓存任何页面。

![Vocal 的一个典型页面。该页面的大部分内容都是高度可缓存的内容，但在旧网站中，由于右上角有一个小菜单，实际上没有一个内容是可缓存的。](/data/attachment/album/202111/14/113424jvrh45z5eqaprh3a.png)

这些页面是由 React 组件的服务器端渲染（SSR）的。解决方法是将所有依赖于登录 cookie 的 React 组件，强制它们 [只在客户端进行延迟呈现](https://nextjs.org/docs/advanced-features/dynamic-import#with-no-ssr)。现在，服务器会返回完全通用的页面，其中包含用于个性化组件（如登录菜单栏）的占位符。当页面在浏览器中加载时，这些占位符将通过调用 GraphQL API 在客户端填充。通用页面可以安全地缓存到 CDN 中。

这一技巧不仅提高了缓存命中率，还帮助改善了人们感知的页面加载时间。空白屏幕和旋转动画让我们不耐烦，但一旦第一个内容出现，它会分散我们几百毫秒的注意力。如果人们在社交媒体上点击一个 Vocal 帖子的链接，主要内容就会立即从 CDN 中出现，很少有人会注意到，有些组件直到几百毫秒后才会完全出现。

顺便说一下，另一个让用户更快地看到第一个内容的技巧是 [流式渲染](https://medium.com/the-thinkmill/progressive-rendering-the-key-to-faster-web-ebfbbece41a4)，而不是等待整个页面渲染完成后再发送。不幸的是，[Node.js 还不支持这个功能](https://github.com/vercel/next.js/issues/1209)。

拆分响应来提高可缓存性也适用于 GraphQL。通过一个请求查询多个数据片段的能力通常是 GraphQL 的一个优势，但如果响应的不同部分具有差别很大的缓存，那么最好将它们分开。举个简单的例子，Vocal 的分页组件需要知道当前页面的页数和内容。最初，组件在一个查询中同时获取两个页面，但由于页面的总数是所有页面的一个常量，所有我将其设置为一个单独的查询，以便缓存它。

#### 缓存的好处

缓存的明显好处是它减轻了 Vocal 后端服务器的负载。这很好。但是依赖缓存来获得容量是危险的，你仍然需要一个备份计划，以便当有一天你不可避免地放弃缓存。

提高页面响应速度是使用缓存是一个更好的理由。

其他一些好处可能不那么明显。峰值流量往往是高度本地化的。如果一个有很多社交媒体粉丝的人分享了一个页面的链接，那么 Vocal 的流量就会大幅上升，但主要是指向分享的那个页面及其元素。这就是为什么缓存擅长吸收最糟糕的流量峰值，它使后端流量模式相对更平滑，更容易被自动伸缩处理。

另一个好处是<ruby> 优雅的退化 <rt>  graceful degradation </rt></ruby>。即使后端由于某些原因出现了严重的问题，站点最受欢迎的部分仍然可以通过 CDN 缓存来提供服务。

### 其他的性能调整

正如我常说的，可扩展的秘诀不是让事情变得更复杂。它只是让事情变得不比需要的更复杂，然后彻底解决所有阻碍扩展的东西。扩展 Vocal 的规模涉及到许多小事，在这篇文章中无法一一说明。

一个经验：对于分布式系统中难以调试的问题，最困难的部分通常是获取正确的数据，从而了解发生的原因。我能想到很多时候，我被困住了，只能靠猜测来“即兴发挥”，而不是想办法找到正确的数据。有时这行得通，但对复杂的问题却不行。

一个相关技巧是，你可以通过获取系统中每个组件的实时数据（甚至只是 `tail -F` 的日志），在不同的窗口中显示，然后在另一个窗口中单击网站来了解很多信息。比如：“为什么切换这个复选框会在后台产生这么多的 DB 查询？”

这里有个修复的例子。有些页面需要几秒钟以上的时间来呈现，但这个情况只会在部署环境中使用 SSR 时会出现。监控仪表盘没有显示任何 CPU 使用量峰值，应用程序也没有使用磁盘，所以这表明应用程序可能正在等待网络请求，可能是对后端的请求。在开发环境中，我可以使用 [sysstat 工具](https://github.com/sysstat/sysstat/)来记录 CPU、RAM、磁盘使用情况，以及 Postgres 语句日志和正常的应用日志来观察应用程序是如何工作的。[Node.js 支持探测跟踪 HTTP 请求](https://github.com/sysstat/sysstat/)，比如使用 [bpftrace](https://theartofmachinery.com/2019/04/26/bpftrace_d_gc.html)，但处于某些无聊的原因，它们不能在开发环境中工作，所以我在源代码中找到了探针，并创建了一个带有请求日志的 Node.js 版本。我使用 [tcpdump](https://danielmiessler.com/study/tcpdump/) 记录网络数据，这让我找到了问题所在：对于网站发出的每一个 API 请求，都要创建一个新的网络连接到 “Platform”。（如果这都不起作用，我想我会在应用程序中添加请求跟踪功能。）

网络连接在本地机器上速度很快，但在现实网络上却不可忽略。建立加密连接（比在生产环境中）需要更长时间。如果你向一个服务器（比如一个 API）发出大量请求，保持连接打开并重用它是很重要的。浏览器会自动这么做，但 Node.js 默认不会，因为它不知道你是否发出了很多请求，所以这个问题只出现在 SSR 上。与许多漫长的调试过程一样，修复却非常简单：只需将 SSR 配置为 [保持连接存活](https://www.npmjs.com/package/agentkeepalive)，这样会使页面的呈现时间大幅下降。

如果你想了解更多这方面的知识，我强烈建议你阅读《[高性能浏览器网络](https://hpbn.co/)》这本书（可免费在线阅读），并跟进 [Brendan Gregg 发表的指南](http://www.brendangregg.com/)。

### 你的站点呢？

实际上，我们还可以做很多事情来提升 Vocal 的速度，但我们没有全做。这是因为在初创公司和在大公司身为一个固定员工做 SRE 工作还是有很大区别的。我们的目标、预算和发布日期都很紧张，但最终我们的网站得到了很大改善，给了用户他们想要的东西。

同样的，你的站点有它自己的目标，并且可能与 Vocal 有很大的不同。然而，我希望这篇文章和它的链接至少能给你一些有用的思路，为用户创造更好的东西。

---

via: <https://theartofmachinery.com/2020/06/29/scaling_a_graphql_site.html>

作者：[Simon Arneaud](https://theartofmachinery.com) 选题：[lujun9972](https://github.com/lujun9972) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

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


Motrix：一个漂亮的跨平台开源下载管理器

一般都是命令行 wget axel

![](/data/attachment/album/202111/14/114909gwv5jbe0055tc6b6.jpg)

>
> 一个开源的下载管理器，提供了一个简洁的用户界面，同时提供了跨平台操作的所有基本功能。在这里了解关于它的更多信息。
>
>
>

Linux 下有大量的下载管理器。如果你想下载一些东西并可以管理它们，你可以选择任何一个可用的下载管理器。

然而，如果你想要一个好看的下载管理器，提供现代的用户体验，同时又不影响功能设置，我有个软件你可能会喜欢。

### 看看 Motrix：一个功能丰富的开源下载管理器

![](/data/attachment/album/202111/14/114957fy784p9p56wdc7m7.png)

Motrix 是一个不折不扣的下载管理器，开箱即用，外观简洁。它是自由开源软件。

你可以选择在 Linux、Windows 和 macOS 中使用。

它也可以成为一些 [Linux 中的 torrent 客户端](https://itsfoss.com/best-torrent-ubuntu/) 的潜在替代品。

让我强调一些关键的功能以及安装说明。

### Motrix 的特点

![](/data/attachment/album/202111/14/114958ccw1zyww402bbwuw.png)

你应该能找到所有你通常在下载管理器中期待的功能。下面是它们的列表：

* 跨平台支持
* 易于使用的界面
* BitTorrent 的选择性下载
* 自动更新 tracker 列表
* UPnP 及 NAT-PMP 端口映射
* 多个下载任务（最多 10 个）
* 在一个任务中最多支持 64 个线程
* 能够设置速度限制
* 可选择改变用户代理
* 支持系统托盘
* 黑暗模式
* 支持多国语言

![](/data/attachment/album/202111/14/114958phdr8zxrhrl2iyli.png)

总的来说，它在处理 torrent 文件时工作得很好，也能从剪贴板上检测到下载链接。在下载文件之前可以直接访问高级选项，所以这应该是很方便的。

![](/data/attachment/album/202111/14/114959hwnnn0nntucj59nw.png)

在我短暂的测试中，我在 Ubuntu 上以 Snap 包使用它时没有发现任何问题。

### 在 Linux 中安装 Motrix

你有多种安装 Motrix 的选项。因此，你应该能够在你选择的任何 Linux 发行版上安装它。

它主要提供了一个 AppImage 供下载。但是，它还有 [Flatpak 包](https://itsfoss.com/what-is-flatpak/)，并可在 [Snap 商店](https://itsfoss.com/enable-snap-support-linux-mint/)找到它。

如果你使用的是 Ubuntu，你可以通过软件中心找到它。

除了这些，它也在 [AUR](https://itsfoss.com/aur-arch-linux/) 中提供给 Arch Linux 用户。在任何一种情况下，你都可以从他们的 [GitHub 发布栏](https://github.com/agalwood/Motrix/releases) 获得 DEB/RPM 包。

你可以在他们的[官方网站](https://motrix.app/)和 [GitHub 页面](https://github.com/agalwood/Motrix)上找到下载链接和更多安装的信息。

* [Motrix](https://motrix.app/)

### 总结

Motrix 提供了所有你想要的下载管理器中的好东西，额外还有一个现代的用户体验。

我建议你试试把它作为你的下载管理器，看看它是否能取代你目前的工具。我很想知道你的 Linux 系统上常用的下载管理器。请在下面的评论中告诉我更多关于它的信息。

---

via: <https://itsfoss.com/motrix/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #455 现代的 Zstd 被并入 Linux 5.16，大幅提升性能

Summary: 更多：• 智能电视厂商的主要收入是广告、订阅和数据 • 互联网档案馆庆祝 25 周年生日

![](/data/attachment/album/202111/14/152921m5mmzl5ubzta0637.jpg)

### 现代的 Zstd 被并入 Linux 5.16，大幅提升性能

![](/data/attachment/album/202111/14/152933y6z7evkvmkd2v2vv.jpg)

虽然 Zstd 被用于 Linux 内核的各个领域，从 Btrfs 透明文件系统压缩到允许内核模块用 Zstd 算法压缩，但内核内的 Zstd 代码已经过时多年了。内核中现有的 Zstd 代码已经有四年的历史了，而在这段时间里，Zstd 的上游已经有了许多错误的修正和性能的优化。本周六晚上合并到 Linux 5.16 的 Zstd 代码，经过了 [全面的修改](https://www.phoronix.com/scan.php?page=news_item&px=Zstd-Updated-For-Linux-5.16)。使用 Linux 5.16 的新 Zstd 代码，Btrfs 和 SquasFS 中的 Zstd 的解压速度可以提高 15%，F2FS 和 zRAM 的解压速度可以提高 20% 到 30% 不等，内核 Zstd 镜像的解压速度可以提高 35%。因为它的影响巨大，Linus Torvalds 表示有意推迟 [合并它](https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=c8c109546a19613d323a319d0c921cb1f317e629)，以便有时间自己亲自审查代码。

>
> 老王点评：这么重要的部分，居然内核等了 4 年才考虑合入。
>
>
>

### 智能电视厂商的主要收入是广告、订阅和数据

![](/data/attachment/album/202111/14/152951gkcmbra7n7cr4c47.jpg)

前段时间曾 [被 FSF 起诉](/article-13903-1.html) 的智能电视厂商 Vizio 透露在过去的三个月里，其广告和观众数据部门的毛利润为 5730 万美元。这是其销售电视等设备所获利润的 [两倍多](https://www.theverge.com/2021/11/10/22773073/vizio-acr-advertising-inscape-data-privacy-q3-2021)，尽管这些设备销售的收入要多得多。虽然其 2021 年电视的出货量下降到 140 万，下降了 36%。但其广告收入激增了 136%，该公司 77% 的收入直接来自广告。

>
> 老王点评：看来智能家电都是载体，真正挣钱的都是其上的订阅和广告，这就难怪前段时间有人买冰箱结果买了一台关不掉的家庭广告大屏，我有点担心哪天我家的扫地机器人也给我播放广告。
>
>
>

### 互联网档案馆庆祝 25 周年生日

![](/data/attachment/album/202111/14/153006vcg696eavcz1ovaa.jpg)

位于一座前基督教科学派教堂内的<ruby> 互联网档案馆 <rt>  Internet Archive </rt></ruby>是保存互联网、电视和广播历史的最大数字图书馆。它目前储存了 4750 亿个网页，2800 万份书籍和文本的扫描件，以及 1400 万份录音，加起来有 30PB 的数据。[他们呼吁](https://archive.org/donate/?origin=iawww-25thannvrsry)，“我们比以往任何时候都更需要你的帮助”。互联网档案馆已经收集了 1 亿多人的作品，目标是达到 10 亿人。他们目前正在与来自四家大型出版商的法律挑战作斗争，而电子前沿基金会正在帮助他们进行法律辩护。

>
> 老王点评：互联网档案馆非常有意义，我尤其喜欢它的时光机，在上面还能找到我 20 多年前的第一个个人网站。
>
>
>


Python 中使用 argparse 解析命令行参数

Summary: 使用 argparse 模块为应用程序设置命令行选项。

测试

使用 argparse 模块为应用程序设置命令行选项。

>
> 使用 argparse 模块为应用程序设置命令行选项。
>
>
>

![](/data/attachment/album/202111/15/110139bakkfdt4zoadqiv0.jpg "Python options")

有一些第三方库用于命令行解析，但标准库 `argparse` 与之相比也毫不逊色。

无需添加很多依赖，你就可以编写带有实用参数解析功能的漂亮命令行工具。

### Python 中的参数解析

使用 `argparse` 解析命令行参数时，第一步是配置一个 `ArgumentParser` 对象。这通常在全局模块内完成，因为单单\_配置\_一个解析器没有副作用。

```
import argparse

PARSER = argparse.ArgumentParser()

```

`ArgumentParser` 中最重要的方法是 `.add_argument()`，它有几个变体。默认情况下，它会添加一个参数，并期望一个值。

```
PARSER.add_argument("--value")

```

查看实际效果，调用 `.parse_args()`：

```
PARSER.parse_args(["--value", "some-value"])

```

```
Namespace(value='some-value')

```

也可以使用 `=` 语法：

```
PARSER.parse_args(["--value=some-value"])

```

```
Namespace(value='some-value')

```

为了缩短在命令行输入的命令，你还可以为选项指定一个短“别名”：

```
PARSER.add_argument("--thing", "-t")

```

可以传入短选项：

```
PARSER.parse_args("-t some-thing".split())

```

```
Namespace(value=None, thing='some-thing')

```

或者长选项：

```
PARSER.parse_args("--thing some-thing".split())

```

```
Namespace(value=None, thing='some-thing')

```

### 类型

有很多类型的参数可供你使用。除了默认类型，最流行的两个是布尔类型和计数器。布尔类型有一个默认为 `True` 的变体和一个默认为 `False` 的变体。

```
PARSER.add_argument("--active", action="store_true")
PARSER.add_argument("--no-dry-run", action="store_false", dest="dry_run")
PARSER.add_argument("--verbose", "-v", action="count")

```

除非显式传入 `--active`，否则 `active` 就是 `False`。`dry-run` 默认是 `True`，除非传入 `--no-dry-run`。无值的短选项可以并列。

传递所有参数会导致非默认状态：

```
PARSER.parse_args("--active --no-dry-run -vvvv".split())

```

```
Namespace(value=None, thing=None, active=True, dry_run=False, verbose=4)

```

默认值则比较单一：

```
PARSER.parse_args("".split())

```

```
Namespace(value=None, thing=None, active=False, dry_run=True, verbose=None)

```

### 子命令

经典的 Unix 命令秉承了“一次只做一件事，并做到极致”，但现代的趋势把“几个密切相关的操作”放在一起。

`git`、`podman` 和 `kubectl` 充分说明了这种范式的流行。`argparse` 库也可以做到：

```
MULTI_PARSER = argparse.ArgumentParser()
subparsers = MULTI_PARSER.add_subparsers()
get = subparsers.add_parser("get")
get.add_argument("--name")
get.set_defaults(command="get")
search = subparsers.add_parser("search")
search.add_argument("--query")
search.set_defaults(command="search")

```

```
MULTI_PARSER.parse_args("get --name awesome-name".split())

```

```
Namespace(name='awesome-name', command='get')

```

```
MULTI_PARSER.parse_args("search --query name~awesome".split())

```

```
Namespace(query='name~awesome', command='search')`

```

### 程序架构

使用 `argparse` 的一种方法是使用下面的结构：

```
## my_package/__main__.py
import argparse
import sys

from my_package import toplevel

parsed_arguments = toplevel.PARSER.parse_args(sys.argv[1:])
toplevel.main(parsed_arguments)

```

```
## my_package/toplevel.py

PARSER = argparse.ArgumentParser()
## .add_argument, etc.

def main(parsed_args):

    ...

    # do stuff with parsed_args

```

在这种情况下，使用 `python -m my_package` 运行。或者，你可以在包安装时使用 [console\_scprits](https://python-packaging.readthedocs.io/en/latest/command-line-scripts.html#the-console-scripts-entry-point) 入口点。

### 总结

`argparse` 模块是一个强大的命令行参数解析器，还有很多功能没能在这里介绍。它能实现你想象的一切。

---

via: <https://opensource.com/article/21/8/python-argparse>

作者：[Moshe Zadka](https://opensource.com/users/moshez) 选题：[lujun9972](https://github.com/lujun9972) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

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


GIMP 3.0 中值得期待的 8 项新功能和改进

什么把Blender2.9.3的UI搬过去，我就什么时候卸载Photoshop装回GIMP.

来自120.230.61.23的 Chrome Mobile 80.0|Android 10 用户

>
> 将带来重大改进的 GIMP 3.0 是最令人期待的版本之一。根据它最近的开发版本，这是一个预期的功能列表。
>
>
>

![](/data/attachment/album/202111/15/181326g97bbdzapwnsqudz.jpg)

[GIMP](https://www.gimp.org/) 是可在 Linux 上使用的 [最佳免费图像编辑器](https://itsfoss.com/image-applications-ubuntu-linux/) 之一。不仅仅适用于那些想要 Adobe 套件的免费替代品的用户，许多专业人士也使用 GIMP 进行艺术创作、设计和照片编辑。

尽管 GIMP 提供了许多必要的功能和选项，但在各种平台上已经出现了许多现代替代品，其中在一些方面已经超过了 GIMP。

不过，GIMP 3.0 可能是一个扭转局面的版本，它将使 GIMP 成为最好的现代产品之一，可与现有的商业对手相竞争。

本文将讨论预期出现在 GIMP 3.0 版本的功能。

### GIMP 3.0 值得期待的顶级功能

随着 GIMP 3.0 的版本发布，其开发版本增加了很多改进。

你或许想看到早期开发版本中的所有功能/变化，但我们将在本文中只能介绍其中重要的亮点。

### 1、基于 GTK3 的用户界面

![来源：GIMP 博客](/data/attachment/album/202111/15/181327r3u32nfk03nbdzfn.png)

GIMP 3.0 将带来基于 GTK3 的用户界面的重新打造的视觉享受。除了改进的外观和感受，你还可以看到一些新的小工具。

别忘了，[爱德华•斯诺登也认为 GIMP 需要进行 UI 大修](https://news.itsfoss.com/gimp-ui-edward-snowden/)。所以，GIMP 3.0 即使最终没有成为一种视觉享受，也应该在某种形式上有所改善。

在以前的 GIMP 版本中，它并不支持高像素密度的显示器。虽然可以使用，但如果你有一个更高分辨率的屏幕，GIMP 看起来就不够好。

现在，随着 GTK3 的加入，它增加了对高像素密度显示器的支持。你所要做的就是设置你的操作系统的首选缩放/分辨率，GIMP 应该可以支持它了。

### 2、Wayland 支持

向 GTK3 的过渡应该能提供更好的 Wayland 支持。因此，如果你开始使用 Wayland 桌面会话，GIMP 3.0 应该可以让你毫无问题地使用该应用程序。

### 3、多层选择

![来源：GIMP 博客](/data/attachment/album/202111/15/181328y61jbjlwlbjb2ytw.png)

最关键的新增功能之一是可以选择多个图层。

虽然这是一个需要很长时间才能完成的功能，但它终于在 GIMP 3.0 版本中实现了。

有了这个功能，人们可以轻松地管理和组织他们的工程中的几个图层。

根据现有的信息，他们正式提到了这个变化：

>
> 可停靠的图层现在完全可以进行多选，使用通常的交互方式进行多项目选择（“`Shift` + 点击”用于选择一系列图层，“`Ctrl` + 点击”用于选择或取消选择不相邻的层）。组织操作现在可以对所有选定的图层起作用，即你可以一次性移动、重新排序、删除、复制、合并（以及更多...）所有选定的图层。
>
>
>

换句话说，你可以选择多个图层，并同时对它们进行批量操作。

例如，你可以裁剪、移动、使用合并的图层中的颜色选择工具，并使用这个功能执行更多操作。

在发表这篇文章时，我注意到，根据他们的开发博客，这是一个正在进行的工作，有一些限制。希望在稳定版中，多层选择可以完美地工作。

### 4、新的插件 API

插件 API 保留了所有的基本功能，但也引入了一些新的改进。

因此，新的插件 API 应该不会对开发者造成任何破坏，而应该可以让他们把插件轻松地移植到 GIMP 3.0 应用程序上。

他们的开发版本中提到了一些改进：

* 摆脱了对象 ID，转而使用真实的对象。特别是在 GIMP 3 中，`GimpImage`、`GimpItem`、`GimpDrawable`、`GimpLayer`、`GimpVectors`、`GimpChannel` 和 `GimpPDB` 都是对象（其他类别的对象已经存在或以后可能加入）。
* 路径现在被当作 `GFile` 来处理，这意味着使用 GLib/GIO API。
* GIMP API 应该可以完全支持各种语言（Python 3、JavaScript、Lua、Vala 等）。

### 5、绘画选择工具

![来源：GIMP 博客](/data/attachment/album/202111/15/181329rz05v777euxvd0ei.png)

前景选择工具不会消失。然而，他们正在开发一个新的实验性的“绘画选择”工具，它可以让你逐步选择和绘制使用画笔的区域。

绘画选择工具的目的还在于克服前景选择工具对大图像的限制，并解决内存/稳定性问题。

考虑到它被列为实验性工具，我们不能确定它是否能进入稳定版，但它已经有了新的图标，你可以找到这个工具。

### 6、Windows Ink 支持

![来源：GIMP 博客](/data/attachment/album/202111/15/181330qtwz8475bbwwtwc8.png)

当然，我们在这里讨论的都是 Linux。但是，GIMP 是一个流行的跨平台工具。

所以，为了吸引更多的用户，最好为专业人士或设计师使用的工具提供硬件支持。

GIMP 3.0 现在支持 Windows Ink 开箱即用，这要归功于它引入的 GTK3。你会从管理输入设备的设置中找到使用 Windows Ink API 的选项。

### 7、改进手势支持

GIMP 并不是笔记本电脑用户的最佳选择，或者更准确地说，不是触摸板/触摸屏用户的最佳选择。

然而，随着 GIMP 3.0 增加了手势支持，可以捏住画布放大/缩小，这种情况可能会有所改善。

我们还可能在最终版本中看到更多的手势支持，但截至 2.99.8 版本，也就是最新的开发版本，还没有新的手势。

### 8、改进的文件格式支持

GIMP 3.0 现在支持 JPEG-XL 文件格式，能够加载/导出带有灰度和 RGB 颜色配置文件的 .jxl 文件。

对 Adobe Photoshop 工程文件的支持也得到了改进。它现在可以处理大于 4GB 的 PSD 文件，同时加载多达 99 个通道。

除此以外，对 WebP 和 16 位 SGI 图像的支持也得到了改进。

### 总结

看看 [GIMP 的开发博客](https://www.gimp.org/news/2021/10/20/gimp-2-99-8-released/)，看起来他们几乎已经完成了最终版本。然而，他们并没有透露任何特定的发布日期时间表。

所以，一旦他们解决了错误并完成了改进，它就会到来。

你期待 GIMP 3.0 吗？它看起来是一个有希望的下一代版本吗？

---

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

作者：[Ankush Das](https://news.itsfoss.com/author/ankush/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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