被华为“嫁出去”的欧拉

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

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

# 被华为“嫁出去”的欧拉

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

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

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

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

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

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

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

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

让我们来看看。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

操作系统因其本身的复杂性，使得其开发成本、开发周期、开发人力资源的需求，都是其他项目难以比拟的。对于一个 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
> * ……
>
>
>

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

我敢打赌你使用过 [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` 替代 `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` 和 `ls` 命令的选项不尽相同。例如，虽然 `-l` 选项在 `exa` 和 `ls` 中都给出了长列表，但 `-h` 选项添加了一个列标题，而不是 `ls` 的人类可读选项。

```
exa -lh

```

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

```
exa --git -lh

```

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

```
exa -abghHliS

```

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

```
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 漏洞

验证码回来了

之前坏了没发现

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

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

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

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

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

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

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

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

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

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

### 一句话回音

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

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


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

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

Atom不是合适的工具。

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

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

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

<img src="content_image/album_202111_11_100737uebjijhwz0l4zhoo.jpg" alt="" title="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 用户

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

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

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 应用启动了！

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

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

命令是：

```
$ 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/) 制作的应用。

命令是：

```
$ 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 数字遗产 • 苹果说，想用侧载应用的用户可以使用安卓

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

### 看不见的 JavaScript 后门

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

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

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

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

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

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

在围绕 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 cowsay 命令制作丰富多彩的节日问候

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

你可能听说过这样一个小程序：它能接受输入信息（比如你通过键盘输入的消息），并输出一张引用了输入消息的牛的图像。这个小程序被称为 `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!"

```

*“甲壳虫汁”祝你亡灵节快乐 (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 虚拟机变得容易了

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

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

>
> 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 源码

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

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

不少用户反馈在升级到 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 文件系统将改变格式以解决一些严重问题

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

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

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

谷歌在 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 了吗？有可能你已经玩起来了

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

《极限竞速：地平线 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
>
>
> 正式发布后，你们今晚就能玩了
>
>
>
>
>
> -- 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>
>
>
>
>
>
> -- 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 文件系统的一个独特的高级功能。

# 如何更新 Linux 的符号链接

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

<img src="content_image/album_202111_13_185626ubb832pphjhlpmly.jpg" alt="" title="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，这些蜗牛爬似的竟也折腾出来了！

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

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

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

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

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

微软在 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 年中国将创造所有物联网价值的四分之一以上

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

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

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

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

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


扩展一个 GraphQL 网站

# 扩展一个 GraphQL 网站

我通常会抽象地总结我为他人所做的工作（出于显而易见的原因），但是我被允许公开谈论一个网站：[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

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

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 位。

曲线增长变慢是正常的，因为它需要越来越多的流量来赢得每个位置。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 的新架构：

基本上就是两个 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>   应用程序设计的十二个守则  <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 世界中很少见，但一些公司网络会有。

缓存查找键通常基于 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 请求中发送完整的查询，服务器会保存此次查询的散列值，以便下次识别。

#### 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 中缓存任何页面。

这些页面是由 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

# Motrix：一个漂亮的跨平台开源下载管理器

>
> 一个开源的下载管理器，提供了一个简洁的用户界面，同时提供了跨平台操作的所有基本功能。在这里了解关于它的更多信息。
>
>
>

Linux 下有大量的下载管理器。如果你想下载一些东西并可以管理它们，你可以选择任何一个可用的下载管理器。

然而，如果你想要一个好看的下载管理器，提供现代的用户体验，同时又不影响功能设置，我有个软件你可能会喜欢。

### 看看 Motrix：一个功能丰富的开源下载管理器

Motrix 是一个不折不扣的下载管理器，开箱即用，外观简洁。它是自由开源软件。

你可以选择在 Linux、Windows 和 macOS 中使用。

它也可以成为一些 [Linux 中的 torrent 客户端](https://itsfoss.com/best-torrent-ubuntu/) 的潜在替代品。

让我强调一些关键的功能以及安装说明。

### Motrix 的特点

你应该能找到所有你通常在下载管理器中期待的功能。下面是它们的列表：

* 跨平台支持
* 易于使用的界面
* BitTorrent 的选择性下载
* 自动更新 tracker 列表
* UPnP 及 NAT-PMP 端口映射
* 多个下载任务（最多 10 个）
* 在一个任务中最多支持 64 个线程
* 能够设置速度限制
* 可选择改变用户代理
* 支持系统托盘
* 黑暗模式
* 支持多国语言

总的来说，它在处理 torrent 文件时工作得很好，也能从剪贴板上检测到下载链接。在下载文件之前可以直接访问高级选项，所以这应该是很方便的。

在我短暂的测试中，我在 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/) 荣誉推出


Summary: 更多：• 智能电视厂商的主要收入是广告、订阅和数据 • 互联网档案馆庆祝 25 周年生日

# 硬核观察 #455 现代的 Zstd 被并入 Linux 5.16，大幅提升性能

### 现代的 Zstd 被并入 Linux 5.16，大幅提升性能

虽然 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 年才考虑合入。
>
>
>

### 智能电视厂商的主要收入是广告、订阅和数据

前段时间曾 [被 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 周年生日

位于一座前基督教科学派教堂内的<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 模块为应用程序设置命令行选项。

# Python 中使用 argparse 解析命令行参数

>
> 使用 argparse 模块为应用程序设置命令行选项。
>
>
>

<img src="content_image/album_202111_15_110139bakkfdt4zoadqiv0.jpg" alt="" title="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 中值得期待的 8 项新功能和改进

>
> 将带来重大改进的 GIMP 3.0 是最令人期待的版本之一。根据它最近的开发版本，这是一个预期的功能列表。
>
>
>

[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 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 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、绘画选择工具

前景选择工具不会消失。然而，他们正在开发一个新的实验性的“绘画选择”工具，它可以让你逐步选择和绘制使用画笔的区域。

绘画选择工具的目的还在于克服前景选择工具对大图像的限制，并解决内存/稳定性问题。

考虑到它被列为实验性工具，我们不能确定它是否能进入稳定版，但它已经有了新的图标，你可以找到这个工具。

### 6、Windows Ink 支持

当然，我们在这里讨论的都是 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/) 荣誉推出


硬核观察 #456 中国科学家否定谷歌的量子霸权

Summary: 更多：• IBM 称量子计算取得突破 • Windows 11 更新恢复蓝屏死机

# 硬核观察 #456 中国科学家否定谷歌的量子霸权

### 中国科学家否定谷歌的量子霸权

2019 年 10 月，Google 宣布它的悬铃木量子计算机第一个实现了量子霸权，它在 3 分 20 秒内完成了一项任务，同样的任务当时最强的经典超算 ——IBM 的 Summit 需要花 10000 年。但这个 10000 年的说法受到了质疑，中国科学家 [表示](https://www.scmp.com/news/china/science/article/3155902/chinese-teams-classical-computing-tackles-impossible-challenge) ，在经典计算机“使用了 512 个 GPU，在大约 15 个小时内”完成了对谷歌悬铃木量子电路的模拟，而且保真度高于它。而如果在最新的 exaFLOP 超算上实现，原则上整体模拟时间可以减少到几十秒。

>
> 老王点评：虽然对悬铃木的质疑来的有点晚，但是中国在超算和量子计算机方面的进步有目共睹。
>
>
>

### IBM 称量子计算取得突破

IBM 称它的新 Eagle 处理器能处理 [127 个量子比特](https://www.axios.com/ibm-quantum-computing-axios-hbo-bd9d50b7-3c11-4586-bdb1-8bbc9928ad1b.html)，突破 100 量子比特就使得量子计算超过了传统计算机的能力。IBM CEO 认为量子计算能在数年内展现实力，但其他人认为至少需要十年。他说，虽然不能解决所有问题，但“你无法在经典计算机上完成这台计算机能做的工作。这需要一台比这个星球还大的普通计算机才能做到。”

>
> 老王点评：真是进入了量子竞赛时代，到底谁能将量子计算机步入实用，必然取得压倒性的胜利。
>
>
>

### Windows 11 恢复蓝屏死机

微软最近向测试渠道推送了 Windows 11 的补丁。值得注意的变化是黑屏死机变回 [蓝屏死机](https://arstechnica.com/gadgets/2021/11/next-windows-11-update-makes-the-blue-screen-of-death-blue-again/)（BSOD）。蓝屏死机已成为 Windows 操作系统的一个标志性错误，但上个月发布的 Windows 11 将系统崩溃时的颜色从原来的蓝色变成了黑色，最新更新又改了回去。

>
> 老王点评：还是习惯蓝屏死机，毕竟黑着屏幕没那么刺眼。
>
>
>


如何用 JavaScript 构建命令行应用

# 如何用 JavaScript 构建命令行应用

>
> 为你的用户提供选项是任何应用的一个重要功能，而 Commander.js 使它变得容易做到。你最喜欢的 JavaScript 命令行构建器是什么？
>
>
>

<img src="content_image/album_202111_16_114501u11upndpphhu2uhh.jpg" alt="" title="Javascript code close-up with neon graphic overlay">

JavaScript 是一种为 Web 开发的语言，但它的用处已经远远超出了互联网的范畴。由于 Node.js 和 Electron 这样的项目，JavaScript 既是一种通用的脚本语言，也是一种浏览器组件。有专门设计的 JavaScript 库来构建命令行界面。是的，你可以在你的终端中运行 JavaScript。

现在，当你在终端中输入一个命令时，一般都有 [选项](https://opensource.com/article/21/8/linux-terminal)，也叫 *开关* 或 *标志*，你可以用来修改命令的运行方式。这是由 [POSIX 规范](https://opensource.com/article/19/7/what-posix-richard-stallman-explains) 定义的一个有用的惯例，所以作为一个程序员，知道如何检测和解析这些选项是很有帮助的。要从 JavaScript 获得此功能，使用旨在简化构建命令行界面的库很有用。我最喜欢的是 [Commander.js](https://github.com/tj/commander.js)。它很简单，很灵活，而且很直观。

### 安装 node

要使用 Commander.js 库，你必须安装 Node.js。在 Linux 上，你可以用你的包管理器安装 Node。例如，在 Fedora、CentOS、Mageia 和其他系统上：

```
$ sudo dnf install nodejs

```

在 Windows 和 macOS 上，你可以 [从 nodejs.org 网站下载安装程序](https://nodejs.org/en/download)。

### 安装 Commander.js

要安装 Commander.js，请使用 `npm` 命令：

```
$ npm install commander

```

### 在你的 JavaScript 代码中添加一个库

在 JavaScript 中，你可以使用 `require` 关键字在你的代码中包含（或者导入，如果你习惯于 Python）一个库。创建一个名为 `example.js` 的文件，并在你喜欢的文本编辑器中打开它。在顶部添加这一行，以包括 Commander.js 库：

```
const { program } = require('commander');

```

### JavaScript 中的选项解析

要解析选项，你必须做的第一件事是定义你的应用可以接受的有效选项。Commander.js 库可以让你定义短选项和长选项，同时还有一个有用的信息来澄清每个选项的目的。

```
program
  .description('A sample application to parse options')
  .option('-a, --alpha', 'Alpha')
  .option('-b, --beta <VALUE>', 'Specify a VALUE', 'Foo');

```

第一个选项，我称之为 `--alpha`（简写 `-a`），是一个布尔型开关：它要么存在，要么不存在。它不需要任何参数。第二个选项，我称之为 `--beta`（简写 `-b`），接受一个参数，甚至在你没有提供任何参数的情况下指定一个默认值。

### 访问命令行数据

当你定义了有效的选项，你就可以使用长的选项名称来引用这些值：

```
program.parse();

const options = program.opts();
console.log('Options detected:');

if (options.alpha) console.log('alpha');

const beta = !options.beta ? 'no' : options.beta;
console.log('beta is: %s', beta);

```

### 运行应用

试着用 `node` 命令来运行它，首先不使用选项：

```
$ node ./example.js
Options detected:
beta is: Foo

```

在用户没有覆盖的情况下，`beta` 的默认值被使用。

再次运行它，这次使用选项：

```
$ node ./example.js --beta hello --alpha
Options detected:
alpha
beta is: hello

```

这次，测试脚本成功检测到了选项 `--alpha`，以及用户提供的 `--beta` 选项的值。

### 选项解析

下面是完整的演示代码供你参考：

```
const { program } = require('commander');

program
  .description('A sample application to parse options')
  .option('-a, --alpha', 'Alpha')
    .option('-b, --beta <VALUE>', 'Specify a VALUE', 'Foo');

program.parse();

const options = program.opts();
console.log('Options detected:');

console.log(typeof options);

if (options.alpha) console.log(' * alpha');
const beta = !options.beta ? 'no' : options.beta;
console.log(' * beta is: %s', beta);

```

在该项目的 [Git 仓库](https://github.com/tj/commander.js) 中还有更多例子。

对任何应用来说，包括用户的选项都是一个重要的功能，而 Commander.js 使它很容易做到。除了 Commander.js，还有其他库，但我觉得这个库使用起来很方便快捷。你最喜欢的 JavaScript 命令行构建器是什么？

---

via: <https://opensource.com/article/21/11/javascript-command-line-apps>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[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/) 荣誉推出


7 个好玩的 Linux 命令

Summary: 这些好玩的 Linux 命令也有它的用处。

kubuntu的确比Ubuntu好用，Ubuntu合盖再打开就是黑屏，虽然可以让它合盖继续运行，但kubuntu，就没有这个问题

cat可不是catch

应该是concatenate，意思是 连接

你man cat一下就能看到解释

这些好玩的 Linux 命令也有它的用处。

# 7 个好玩的 Linux 命令

>
> 这些好玩的 Linux 命令也有它的用处。
>
>
>

Linux 的命令行可以说是资深用户和系统管理员的小窝。然而，Linux 不仅仅是大量的枯燥工作。Linux 是由爱玩的人开发的，他们还创造了一系列搞笑的命令。当你想轻松一下的时候，就可以自己试着这些。

### 蒸汽机车

随便什么时候，你可以使用 `sl` 命令使一辆<ruby> 蒸汽机车 <rt>  Steam Locomotive </rt></ruby>在你的终端上跑过。可以用你的软件包管理器安装这辆蒸汽机车。例如，在 Fedora 上可以这样：

```
$ sudo dnf install sl

```

#### 实际用途

据我所知，`sl` 命令确实只是为了好玩。你对 `sl` 有什么有趣的用途吗？请在评论中告诉我。

（LCTT 译注：`sl` 的实际用途就是提醒你 `ls` 打错了。?）

### 壁炉

点燃一座壁炉来温暖你的心和你的终端吧，`aafire` 命令会播放一段壁炉的动画。你可以用你的软件包管理器安装 `aafire`。在 Debian、Mint、 Elementary 之类的发行版上：

```
$ sudo apt install libaa-bin

```

在 Fedora、CentOS 之类的发行版：

```
$ sudo dnf install aalib

```

#### 实际用途

这个动画是向你的团队或老板传达一切即将化为乌有的微妙方式。

### 是的

你可以使用 `yes` 命令打印出一串文字，直到用 `Ctrl+C` 强行停止。例如，我是一个 Buffalo Bills 的球迷，所以我选择用 `yes` 命令打印出一串无尽的 “Buffalo Bills”：

```
$ yes Buffalo Bills

```

#### 实际用途

你可以用这个命令来向脚本输送确认信息，这样，当脚本停顿下来要求确认时，它就会自动收到 `yes`。例如，想象一下，你运行的一个脚本经常停下来问你确认：

```
$ foo
Are you sure you want to do this? Y/n  Y
Are you really sure? y/N  Y
But are you really? y/N

```

你可以通过向命令传递 `yes` 来自动接受这些信息：

```
$ yes | foo

```

另外，你也可以用 `yes` 来自动拒绝信息：

```
$ yes no | foo

```

### 命运

通过安装 `fortune` 命令，你可以就可以得到命运的指点。`fortune` 会打印出一段随机的、可能有意义的话语（LCTT 译注：来自命运的指点）。

用你的软件包管理器安装 `fortune`：

```
$ sudo apt install fortune

```

在 Fedora 上：

```
$ sudo dnf install fortune-mod

```

命运命令有许多数据集，它可以从中提取各种话语。例如，你可以从文学作品或科幻电视节目 《Firefly》中获得名人名言，或者从笑话、关于 Linux 的技巧等中选择。在你的资源库中搜索 `fortune`，看看你的发行版提供了哪些数据集。

```
$ fortune
Johnson's law:
  Systems resemble the organizations that create them.

```

#### 实际用途

你可以用命运来生成一个伪随机数。没有足够的熵来使它在密码学上安全，但当你需要一个意外的数字时，你可以用来计算字符或单词：

```
$ fortune | wc --chars
38
$ fortune | wc --words
8
$ fortune | wc --chars
169

```

### 彩虹猫

彩虹猫（`lolcat`）是一个将文件或标准输入连接到标准输出的程序（就像一般的 `cat` 命令），并在其中加入彩虹色。你可以用管道将其他命令的输出连接到 `lolcat`，这样就可以为结果加上彩虹色。

下面是 `lolcat -h` 的帮助输出的结果。

（LCTT 译注：我知道 `cat` 是 `catch`。）

### “FIG 来信”和横幅

“FIG 来信”（FIGlet）来源于 Frank、Ian 和 Glenn 信件中的签名艺术。这个命令（`figlet`）和横幅命令（`banner`）可以帮你创建简单的 ASCII 文本横幅。下面是一个 CentOS 系统的文本横幅：

```
$ figlet centos.com

```

将 `figlet` 连接到 `lolcat`，可以得到一个彩色的横幅：

```
$ figlet centos.com | lolcat

```

```
$ banner Hello World

```

#### 实际用途

`figlet` 和 `banner` 都是提醒用户他们正在登录的系统的简单方法。就像许多系统管理员、网页设计师和云开发人员一样，当你和几十台服务器一起工作时，这很有帮助。

### 电子语音

你可以通过安装电子语音（`espeak`）来为你的命令行添加语音功能。

一旦 `espeak` 安装完毕，调高你的电脑的音量，听你的机器和你说话，会有一些乐趣。电子语音是一个软件语音合成器，有几个不同的语音库可用：

```
$ espeak "Linux is the best operating system.”

```

### 有趣的命令

请查阅所有这些命令的手册，以探索所有的可能性和变化。你最喜欢哪些好玩的命令，它们在现实世界中是否也有用途？请在评论中分享你的最爱。

---

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

作者：[Don Watkins](https://opensource.com/users/don-watkins) 选题：[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/) 荣誉推出


硬核观察 #457 新的“行锤”攻击打破了 DDR4 内存保护

Summary: 更多：• 英特尔 4004 微处理器推出 50 周年 • 因文字太难输入，Facebook Messenger 五成语音流量来自柬埔寨

“行锤”肯定是DDR5搞的

# 硬核观察 #457 新的“行锤”攻击打破了 DDR4 内存保护

### 新的“行锤”攻击打破了 DDR4 内存保护

“<ruby> 行锤 <rt>  Rowhammer </rt></ruby>”攻击是通过每秒数百万次访问（或者说锤打）脆弱芯片内的物理行，导致相邻行的比特翻转，这意味着 1 变成 0，0 变成了 1。一个没有特权的应用程序可以通过每秒数百万次以特定模式访问 DDR 内存的“行锤”来破坏内存中的数据，从而 [获得系统特权](https://arstechnica.com/gadgets/2021/11/ddr4-memory-is-even-more-susceptible-to-rowhammer-attacks-than-anyone-thought/)。这个漏洞已经在 2015 年被发现，对 DDR3 造成了严重影响后，在 DDR4 中有所缓解。以前的“行锤”攻击都是以统一的模式锤击行，这些“攻击者”行被访问的次数相同。而 [新发表的研究](https://comsec.ethz.ch/research/dram/blacksmith/) 中使用了非均匀模式，以不同的频率访问两个或更多的攻击者行。结果是：在一个测试池中，所有 40 个随机选择的 DIMM 都经历了比特翻转。

>
> 老王点评：如果这个攻击技术被武器化，那所有使用 DDR 内存的计算机都处于被攻击的阴影笼罩之下。
>
>
>

### 英特尔 4004 微处理器推出 50 周年

[1971 年 11 月 15 日](https://www.wsj.com/articles/the-chip-that-changed-the-world-microprocessor-computing-transistor-breakthrough-intel-11636903999) 英特尔推出的 4004 微处理器仅使用了 2,300 个晶体管，一次可在芯片中运行四位数据。这种半英寸长的矩形集成电路的时钟速度为 750 kHz，每秒可进行约 92,000 次运算。英特尔于 1972 年推出有 3,500 个晶体管的八位的 8008；1978 年推出有 29,000 个晶体管的十六位的 8086，每秒可进行 710,000 次运算。IBM 将下一代的英特尔 8088 用于其首款 PC。而如今，苹果新的 M1 Max 处理器有 570 亿个晶体管，每秒可执行 10.4 万亿次浮点运算。这意味着计算机能力在 50 年内至少提高了 10 亿倍。

>
> 老王点评：50 年对于人类历史来说是短短一瞬间，但是这小小的芯片却整个改变了世界。
>
>
>

### 因文字太难输入，Facebook Messenger 五成语音流量来自柬埔寨

2018 年 Facebook 工程师注意到了一个令他们不解的现象：Messenger 近五成语音流量 [来自柬埔寨](https://www.indiatimes.com/technology/news/50-percent-voice-messaging-traffic-facebook-messenger-cambodia-554079.html)。高棉语有 74 个字符，比大部分文字都多。高棉语在每个键位都有两个字符，需要在两个按键层反复切换。因此在柬埔寨人们大量使用语音，虽然后来高棉语输入法也得到了改善。当然，语音沟通的不便之处就是没法快速搜索，只能根据语音条长短大致记忆。

>
> 老王点评：还好我们的中文输入法比较好，或者说拼音普及的好，要不中文输入更难。
>
>
>


入门：如何更改 Ubuntu 的终端的字体和大小

# 入门：如何更改 Ubuntu 的终端的字体和大小

如果你在 Ubuntu 上使用终端的时间很长，你可能会希望调整终端的字体和大小以获取一种良好的体验。

更改字体是一种最简单但最直观的 [Linux 的终端自定义](https://itsfoss.com/customize-linux-terminal/) 的方法。让我向你展示在 Ubuntu 中更改终端的字体的详细步骤，以及一些字体选择的提示和建议。

注意：这些步骤可能也对大多数的其它的 [Linux 的终端模拟器](https://itsfoss.com/linux-terminal-emulators/) 有效，但是你访问选项的方法可能会有所不同。

### 使用 GUI 更改 Ubuntu 的终端的字体和大小

**步骤 1.** [在 Ubuntu 中打开终端窗口](https://itsfoss.com/open-terminal-ubuntu/) ，方法是按 `Ctrl+Alt+T` 组合键。

**步骤 2.** 打开终端“<ruby> 首选项 <rt>  Preferences </rt></ruby>”。你可以单击菜单按钮来找到它。

你也可以右击终端屏幕的任意位置来访问首选项，如下图所示。

**步骤 3.** 现在，你应该能够访问针对终端的设置。在默认情况下，在这里将会有一个未命名的配置文件。这就是默认的配置文件。**我建议创建一个新的配置文件**，以便你的更改不会影响默认的设置。

**步骤 4.** 为了更改字体，你需要启用“<ruby> 自定义字体 <rt>  Custom font </rt></ruby>” 选项，接下来单击 “**Monospace Regular**” 。

它将显示针对这个选项的可用的一个字体列表。

在这里，你可以在字体列表的底部快速预览字体，也可以调整你的 Ubuntu 的终端的字体大小。

在默认情况下，字体的大小是 **12** ，字体的样式是 **Ubuntu mono** 。

**步骤 5.** 最后，你也可以搜索你喜欢的字体样式，并在查看预览和调整字体大小后，通过点击 “<ruby> 选择 <rt>  Select </rt></ruby>” 来完成更改字体。

这就是全部的步骤。你已经成功地更改字体。在下面的图像中查看更改。移动划款来查看不同点。

### 获取针对 Ubuntu 的终端的新字体的提示

你可以中从因特网上下载 TTF 格式的字体文件，右击这些 TTF 文件 [可以很容易在 Ubuntu 中安装这些新的字体](https://itsfoss.com/install-fonts-ubuntu/) 。

你可以打开一个新的终端窗口来加载新安装的字体。

不过，请记住，**Ubuntu 不会在终端中显示所有新安装的字体**。为什么？因为终端已经被分配使用 monospaced 字体。如果字体中字母间靠得很近的，那看起来就很诡异了。一些字体不能清晰区分字母 “o” 和数字 “0” 。同样，你也可能面临区分小写字母 “l” 和小写字母 “i” 的难题。

这就是为什么你会在终端中所看到的字体的名称中通常会带有 “mono” 的原因。

一般来说，在字体方面可能会有很多可读性难题，这可能会造成更加混乱的局面。因此，最好选择一种不会在终端上使人难易阅读的字体。

你还应该检查在你增大/减少字体大小期间该字体是否看起来良好/诡异，以确保在你自定义你的终端时没有问题。

### 针对终端自定义的字体建议

Free mono 和 Noto mono 是默认字体选择列表中可用的一些好字体，可应用于你的终端。

你可以尝试 [在 Linux 中安装新的字体](https://itsfoss.com/install-fonts-ubuntu/) ，像 **JetBrains Mono** 、**Robo Mono** 、Larabiefont 、Share Tech Mono 以及来自 Google 和其它来源的字体。

你喜欢在 Ubuntu 的终端上使用什么样的字体和大小？请在下面的评论区告诉我们！

---

via: <https://itsfoss.com/change-terminal-font-ubuntu/>

作者：[Ankush Das](https://itsfoss.com/author/ankush/) 选题：[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/) 荣誉推出


如何打包你的 Python 代码

Summary: 使用 setuptools 来向用户交付 Python 代码。

# 如何打包你的 Python 代码

>
> 使用 setuptools 来向用户交付 Python 代码。
>
>
>

<img src="content_image/album_202111_17_180249s8s1cnnn18gh3fsk.jpg" alt="" title="Python programming language logo with question marks">

你花了几周的时间来完善你的代码。你已经对它进行了测试，并把它发送给一些亲近的开发者朋友以保证质量。你已经将所有的源代码发布在 [你的个人 Git 服务器](https://opensource.com/life/16/8/how-construct-your-own-git-server-part-6) 上，并且从一些勇敢的早期使用者收到了一些有用的错误报告。现在你已经准备好将你的 Python 代码提供给全世界。

就在这时你遇到一个问题。你不知道如何交付产品。

将代码交付给它的目标用户是一件大事。这是软件开发的一个完整的分支，是 CI/CD 中的 “D”，但很多人都忘记了，至少到最后才知道。我写过关于 [Autotools](https://opensource.com/article/19/7/introduction-gnu-autotools) 和 [Cmake](https://opensource.com/article/21/5/cmake) 的文章，但有些语言有自己的方法来帮助你将你的代码提供给用户。对于 Python 来说，向用户提供代码的一个常见方法是使用 `setuptools`。

### 安装 setuptools

安装和更新 `setuptools` 的最简单方法是使用 `pip`：

```
$ sudo python -m pip install --upgrade setuptools

```

### 示例库

我创建了一个简单的 Python 库，名为 `myhellolib`，来作为需要打包的示例代码。这个库接受一个字符串，然后用大写字母打印出这个字符串。

它只有两行代码，但项目结构很重要，所以首先创建目录树：

```
$ mkdir -p myhellolib.git/myhellolib

```

为了确认这个项目是一个可导入的库（即 Python “模块”），在代码目录中创建一个空文件 `__init__.py`，同时创建一个包含代码的文件：

```
$ touch myhellolib.git/myhellolib/__init__.py
$ touch myhellolib.git/myhellolib/myhellolib.py

```

在 `myhellolib.py` 文件中，输入简单的 Python 代码：

```
def greeter(s):
    print(s.upper())

```

这就是写好的库。

### 测试它

在打包之前，测试一下你的库。创建一个 `myhellolib.git/test.py` 文件并输入以下代码：

```
import myhellolib.myhellolib as hello
hello.greeter("Hello Opensource.com.")

```

运行该脚本：

```
$ cd myhellolib.git
$ python ./test.py
HELLO OPENSOURCE.COM

```

它可以工作，所以现在你可以把它打包了。

### Setuptools

要用 `setuptools` 打包一个项目，你必须创建一个 `.toml` 文件，将 `setuptools` 作为构建系统。将这段文字放在项目目录下的 `myhellolib.toml` 文件中。

```
[build-system]
requires = ["setuptools", "wheel"]
build-backend = "setuptools.build_meta"

```

接下来，创建一个名为 `setup.py` 的文件，包含项目的元数据：

```
from setuptools import setup

setup(
   name='myhellolib',
   version='0.0.1',
   packages=['myhellolib'],
   install_requires=[
      'requests',
      'importlib; python_version == "3.8"',
   ],
)

```

不管你信不信，这就是 `setuptools` 需要的所有设置。你的项目已经可以进行打包。

### 打包 Python

要创建你的 Python 包，你需要一个构建器。一个常见的工具是 `build`，你可以用 `pip` 安装它：

```
$ python -m pip install build --user

```

构建你的项目：

```
$ python -m build

```

过了一会儿，构建完成了，在你的项目文件夹中出现了一个新的目录，叫做 `dist`。这个文件夹包含一个 `.tar.gz` 和一个 `.whl` 文件。

这是你的第一个 Python 包! 下面是包的内容：

```
$ tar --list --file dist/myhellolib-0.0.1.tar.gz
myhellolib-0.0.1/
myhellolib-0.0.1/PKG-INFO
myhellolib-0.0.1/myhellolib/
myhellolib-0.0.1/myhellolib/__init__.py
myhellolib-0.0.1/myhellolib/myhellolib.py
myhellolib-0.0.1/myhellolib.egg-info/
myhellolib-0.0.1/myhellolib.egg-info/PKG-INFO
myhellolib-0.0.1/myhellolib.egg-info/SOURCES.txt
myhellolib-0.0.1/myhellolib.egg-info/dependency_links.txt
myhellolib-0.0.1/myhellolib.egg-info/requires.txt
myhellolib-0.0.1/myhellolib.egg-info/top_level.txt
myhellolib-0.0.1/setup.cfg
myhellolib-0.0.1/setup.py

$ unzip -l dist/myhellolib-0.0.1-py3-none-any.whl
Archive:  dist/myhellolib-0.0.1-py3-none-any.whl
Name
----
myhellolib/__init__.py
myhellolib/myhellolib.py
myhellolib-0.0.1.dist-info/METADATA
myhellolib-0.0.1.dist-info/WHEEL
myhellolib-0.0.1.dist-info/top_level.txt
myhellolib-0.0.1.dist-info/RECORD
-------
6 files

```

### 让它可用

现在你知道了打包你的 Python 包是多么容易，你可以使用 Git 钩子、GitLab Web 钩子、Jenkins 或类似的自动化工具来自动完成这个过程。你甚至可以把你的项目上传到 PyPi，这个流行的 Python 模块仓库。一旦它在 PyPi 上，用户就可以用 `pip` 来安装它，就像你在这篇文章中安装 `setuptools` 和 `build` 一样！

当你坐下来开发一个应用或库时，打包并不是你首先想到的事情，但它是编程的一个重要方面。Python 开发者在程序员如何向世界提供他们的工作方面花了很多心思，没有比 `setuptools` 更容易的了。试用它，使用它，并继续用 Python 编码！

---

via: <https://opensource.com/article/21/11/packaging-python-setuptools>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[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/) 荣誉推出


硬核观察 #458 CentOS Linux 8 最后的绝响

Summary: 更多：• B 站加入了开放发明网络 • 付费版 Firefox Relay 提供无限量的电子邮件别名

# 硬核观察 #458 CentOS Linux 8 最后的绝响

### CentOS Linux 8 最后的绝响

RHEL 8.5 上周发布之后，CentOS Linux 8 2111 作为 RHEL 8.5 的重构版本于近日 [发布](https://blog.centos.org/2021/11/announcing-the-latest-release-of-centos-linux-8-2111/)。该版本同时也是基于上游 RHEL 8.5 的**最后一个版本**，在更新日志中再次重申了 **CentOS Linux 8 将在 2021 年 12 月 31 日结束使用**。RHEL 8.5 带来了各种容器的改进，Cockpit 网络管理的改进，以及其他各种更新和改进。此外，RHEL 8.5 还支持最近推出的 OpenJDK 17 和微软 .NET 6。那些寻找 CentOS Linux 8 替代品的人可以看看 Rocky Linux 和 AlmaLinux，它们都已经发布了基于 RHEL 8.5 的版本。当然，国内用户也可以看看欧拉和龙蜥。

>
> 老王点评：一代绝响，真正改变了企业级 Linux 市场格局，但是到底哪个替代品能真正接过 CentOS 的大旗呢？
>
>
>

### B 站加入了开放发明网络

开放发明网络（OIN）是世界上最大的专利互不侵犯联盟。它保护 Linux 和相关的开源软件及其背后的公司免受专利攻击和专利巨头的侵害。OIN 最近扩大了其范围，从核心的 Linux 程序和相邻的开源代码扩大到其他专利，如安卓开源项目（AOSP）和 exFAT 文件系统。加入 OIN 可以在免版税的基础上将其专利相互授权。之前，中国已经有很多公司加入了 OIN，而 [除了 B 站](https://www.zdnet.com/article/bilibili-chinas-youtube-joins-the-open-invention-network/)，不久前抖音母公司字节跳动和快手公司也都加入了 ION。

>
> 老王点评：OIN 的意义不用多说，让人欣喜的是，除了一些大公司，中国更多的较小规模的科技公司也开始加入 OIN。
>
>
>

### 付费版 Firefox Relay 提供无限量的电子邮件别名

Mozilla 推出的 Firefox Relay 是一个免费产品，它为你提供了五个 [电子邮件别名](https://www.engadget.com/firefox-relay-premium-service-140023689.html)，每次你需要在网上随机注册一个账户时都可以使用。现在，该服务推出了一个付费版，可以得到你自己的子域（[yourdomain.mozmail.com](http://yourdomain.mozmail.com/)）。你必须安装它的 Firefox 扩展，才能使用该功能。每当你访问一个要求提供电子邮件地址的网站时，浏览器上就会出现 Relay 图标，你可以点击它来生成一个随机的地址。

>
> 老王点评：这个服务不错，或许但是给 Mozilla 带来的收入应该不多。
>
>
>


在 FreeDOS 中设置和使用环境变量

Summary: 环境变量几乎在每种命令行环境中都是很有帮助的，自然包括 FreeDOS 。

环境变量几乎在每种命令行环境中都是很有帮助的，自然包括 FreeDOS 。

# 在 FreeDOS 中设置和使用环境变量

>
> 环境变量几乎在每种命令行环境中都是很有帮助的，自然包括 FreeDOS 。
>
>
>

几乎在每个命令行环境中的一个有用的功能是 *环境变量*。其中的一些变量允许你控制命令行的行为或功能，其它的变量仅允许你存储可能稍后需要的数据，在 FreeDOS 中也使用了环境变量。

### 在 Linux 上的变量

在 Linux 上，你可能已经熟悉其中的一些重要的环境变量。在 Linux 上的 [Bash](https://opensource.com/article/19/8/using-variables-bash) shell 中，`PATH` 变量标示着 shell 可以在哪里找到程序和命令。例如，在我的 Linux 系统上，我的 `PATH` 值如下：

```
bash$ echo $PATH
/home/jhall/bin:/usr/lib64/ccache:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin

```

这意味着，当我输入一个像 `cat` 这样的命令的名称时，Bash 将会按顺序检查我在 `PATH` 变量中所列出的每个目录：

1. `/home/jhall/bin`
2. `/usr/lib64/ccache`
3. `/usr/local/bin`
4. `/usr/local/sbin`
5. `/usr/bin`
6. `/usr/sbin`

在我的实例中，`cat` 命令位于 `/usr/bin` 目录，因此，完整的路径是 `/usr/bin/cat` 。

为在 Linux 上设置一个环境变量，你可以输入一个变量的名称，接着输入一个等于符号（`=`），接着输入一个要存储在变量中的值。为了随后使用 Bash 引用这个值，你需要在变量的名称前输入一个美元符号（`$`）。

```
bash$ var=Hello
bash$ echo $var
Hello

```

### 在 FreeDOS 上的变量

在 FreeDOS 上，环境变量提供一种类似的功能。一些变量控制 DOS 系统的行为，另一些变量用于存储一些临时值。

为在 FreeDOS 上设置一个环境变量，你需要使用 `SET` 关键字。FreeDOS 是 *不区分大小写的* ，因此你可以输入大写字母也可以使用小写字母。接下来，像你在 Linux 上一样设置变量，使用变量名称，一个等于符号（`=`），你想要存储的值。

不过，在 FreeDOS 中引用或 *扩展* 一个环境变量的值的方法，与你在 Linux 上所使用的方法是完全不同的。在 FreeDOS 中，你不能使用美元符号（`$`）来引用一个变量。你反而需要使用百分符号 （`%`）来包围变量的名称。

在名称前后使用百分符号是非常重要，因为这就是 FreeDOS 知悉变量名称在哪里开始和结束的方式。这是非常有用的，因为它会允许你引用一个变量的值，与此同时，它会立即附加（或预置）其它的文本到值中。让我通过设置一个新的名称为 `reply` 的值为 `yes` 的变量，然后在 “11” 之前和 “22” 之后引用这个值来演示这一点：

因为 FreeDOS 是不区分大小写的，所以你可以使用大写字母称或小写字母的变量名称以及 `SET` 关键字。不过，变量的值将使用你在命令行中所输入的字母。

最后，你可以看到当前在 FreeDOS 中定义的所有的环境变量。不使用任何参数的 `SET` 关键字将显示所有的变量，因此你可以一目了然：

环境变量是一个有用的基本的命令行环境，同样适用于 FreeDOS 。你可以设置你自己的变量以满足你自己的需要，但是要仔细地更改 FreeDOS 使用的一些变量。这些变量会更改你正在运行的 FreeDOS 系统的行为：

* `DOSDIR`：FreeDOS 安装目录的位置，通常是 `C:\FDOS`
* `COMSPEC`：FreeDOS 的 shell 的当前实例，通常是 `C:\COMMAND.COM` 或 `%DOSDIR%\BIN\COMMAND.COM`
* `LANG`：用户的首选语言
* `NLSPATH`：系统语言文件的位置，通常是 `%DOSDIR%\NLS`
* `TZ`：系统的时区
* `PATH`：一个目录列表，FreeDOS 可以在其中找到要运行的程序，例如 `%DOSDIR%\BIN`
* `HELPPATH`：系统文档文件的位置，通常是 `%DOSDIR%\HELP`
* `TEMP`：一个临时目录，FreeDOS 在其中存储来自每个命令的输出，如同它在命令行上的程序之间的 “管道” 数据
* `DIRCMD`：一个控制 `DIR` 命令如何显示文件和目录的变量，通常设置 `/OGNE` 来排序（`O`）内容，先通过分组（`G`）目录，接下来按照名称（`N`） 、扩展名（`E`）来排序条目

如果你偶然间更改了任意的 FreeDOS 的 “内部” 变量，你可能会阻碍 FreeDOS 的一些部分的正常工作。在这种情况下，只需要简单地重新启动你的计算机，FreeDOS 将会按照系统默认值重新设置变量。

---

via: <https://opensource.com/article/21/6/freedos-environment-variables>

作者：[Jim Hall](https://opensource.com/users/jim-hall) 选题：[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/) 荣誉推出


硬核观察 #459 百亿亿次超算尚未到来

Summary: 更多：• Canonical 将从根本上改善 Ubuntu 文档 • Discord 正在悄悄地建立一个机器人的应用帝国

# 硬核观察 #459 百亿亿次超算尚未到来

### 百亿亿次超算尚未到来

Top 500 超算项目公布了 [最新的榜单](https://www.top500.org/news/still-waiting-exascale-japans-fugaku-outperforms-all-competition-once-again/)，百亿亿次超算尚未到来，日本的 ARM 超算富岳第四次登顶。目前筹备中的百亿亿次（Exascale）超算美国有 [两台](https://www.hpcwire.com/2021/11/15/top500-no-exascale-fugaku-still-reigns-polaris-debuts-at-12/)，中国也有 [两台](/article-13930-1.html)。Top 10 中唯一的新人是第十的微软 Azure 超算。AMD 在榜单中取得了明显进步，Top 10 中有四台采用了 AMD 的 CPU，Top 500 中共有 73 台，而英特尔的比例从上半年的 86.4% 降至了 81.4%。

>
> 老王点评：这么说，我们之前在 [#438 期](/article-13930-1.html) 的报道有误，中国的百亿亿次超算还没正式上线。
>
>
>

### Canonical 将从根本上改善 Ubuntu 文档

在过去，Ubuntu 的 Wiki 是业内公认优质的 Linux 文档资源库，不过现在更多用户偏好于 Arch Linux Wiki，后者被视为开源文档的黄金标准。不过 Canonical 现在 [希望](https://ubuntu.com//blog/the-future-of-documentation-at-canonical) 从根本上改善 Ubuntu 及其他软件产品的 [文档](https://help.ubuntu.com/)。他们说，“我们希望它能成为最好的。我们所说的‘最好’是指文件首先要理解、尊重、反映并服务于其用户的需求。”

>
> 老王点评：这真是一个功德无量的工作，我只希望国内的发行版厂商也能看齐。
>
>
>

### Discord 正在悄悄地建立一个机器人的应用帝国

Discord 服务器所有者在服务器上安装机器人，以帮助管理，或为其社区提供小游戏或功能。现在超过 30% 的 Discord 服务器在 [使用机器人](https://www.theverge.com/2021/11/17/22787018/discord-bots-app-discovery-platform)，每周有 1.5 亿月度活跃用户在使用 43 万个机器人。目前共有约 12,000 个经过验证的应用程序和机器人。

>
> 老王点评：相比之下，看看微信只知道一力封杀第三方机器人，而自己的机器人又是个跛脚的。
>
>
>


树莓派 3 还是 4：你应该买哪一个？

Summary: 树莓派 3 仍然值得考虑吗？或者，你应该去买最新和更强大的树莓派 4？

有钱就直接上PI4 ，但是现在都缺货，微雪电子也都是限购

树莓派 3 仍然值得考虑吗？或者，你应该去买最新和更强大的树莓派 4？

# 树莓派 3 还是 4：你应该买哪一个？

树莓派是一种物美价廉的单板计算机，在很多场景都很有用。不过，在树莓派 4 之前，它作为快速的桌面替代品并不是一个特别合适的选择。

所以，树莓派 4 以其新的功能改变了游戏规则。但是，它与树莓派 3 相比如何？

树莓派 3 仍然值得考虑吗？或者，你应该去买最新和更强大的树莓派 4？

在这篇文章中，我们试图通过强调两者之间的一些关键差异来为你提供一些答案。

首先，让我们看一下两者提供的规格：

### 树莓派 3 的规格

树莓派 3 满足了一个基本入门 DIY 项目的所有要求。如果 [树莓派 Zero 或 树莓派 Zero W](https://itsfoss.com/raspberry-pi-zero-vs-zero-w/) 不符合你的要求，那么树莓派 3 是一个物美价廉的选择：

* 四核 1.2GHz 博通 BCM2837 64 位 CPU
* 1GB 内存
* 无线局域网和低功耗蓝牙（BLE）
* 以太网
* 40 针扩展 GPIO
* 4 个 USB 2 端口
* 4 极立体声输出和复合视频端口
* 全尺寸的 HDMI
* CSI 摄像机端口
* DSI 显示端口
* 用于操作系统和存储数据的微型 SD 端口
* 升级后的开关式微型 USB 电源，最高可达 2.5A 电流

### 树莓派 4 的规格

* 博通 BCM2711，四核 Cortex-A72（ARM v8）64 位 SoC @ 1.5GHz
* 2GB、4GB 或 8GB LPDDR4-3200
* 2.4 GHz 和 5.0 GHz IEEE 802.11ac 无线，蓝牙 5.0，BLE
* 千兆位以太网
* 2 个 USB 3.0 端口
* 2 个 USB 2.0 端口
* 40 针 GPIO 接头（向后兼容）
* 2 个微型 HDMI 端口（最多可支持 4kp60）
* 2 线 MIPI DSI 显示端口
* 2 线 MIPI CSI 摄像头端口
* 4 极立体声音频和复合视频端口
* H.265（4kp60 解码），H264（1080p60 解码，1080p30 编码）
* OpenGL ES 3.1，Vulkan 1.0
* 用于操作系统和存储数据的 MicroSD 卡插槽
* 通过 USB-C 接口的 5V 直流电
* 通过 GPIO 接头的 5V 直流电
* 通过以太网供电

### 内存（RAM）选项

对于树莓派机型，通常情况下，你会得到一个包括 1 或 2GB 内存的单一产品阵容。

树莓派 3B+ 就是这种情况。如果你不需要更多的内存，树莓派 3 可以就是一个不错的解决方案，可以满足所有常规 DIY 项目的需求。

然而，对于树莓派 4，你可以选择 2GB、4GB 和 8GB 的版本。所以，如果你想完成更多的事情，或者在你的树莓派板上实现多个任务，树莓派 4 应该是一个不错的选择。

### 性能差异

尽管这两块板子都采用了博通公司的芯片，但树莓派 4 的性能明显更快。

如果你想把它作为你的迷你桌面的替代品，或者想为你的任务获得更好的计算能力，树莓派 4 将是明显的选择。

说到树莓派 3，它配备了一个四核 1.2GHz 的博通 BCM2837 64 位 CPU。它是一个能够完成各种任务的芯片。

#### 连接能力

两块树莓派板都提供了一个 40 针的扩展 GPIO 接头。

然而，说到 USB 连接时，树莓派 4 提供了两个 USB 3.0 端口以及另外两个 USB 2 端口。而树莓派 3 只限于两个 USB 2 端口。

因此，如果你需要更快的数据传输速度，USB 3.0 端口应该会有帮助。例如，如果你要使用任何 [媒体服务器软件](https://itsfoss.com/best-linux-media-server/)，这可以派上用场。

除此之外，树莓派 4 上还有 USB-C 的存在，如果 USB 配件需要，它可以用来给电路板供电（5V DC）。

#### 双显示器与相机支持

虽然树莓派 3 提供了一个全尺寸的 HDMI 端口、DSI 端口和 CS 端口，但它并不具有双显示器支持。

有了树莓派 4，你可以得到两个微型 HDMI 端口，一个双通道 DSI 端口和一个双通道 CSI 摄像头端口。

### 你应该买哪一个？

| 规格 | 树莓派 3 | 树莓派 4 |
| --- | --- | --- |
| **处理器** | 四核 1.2GHz 博通 BCM2837 | 四核 1.5GHz 博通BCM2711 |
| **RAM** | 1 GB | 高达 8 GB |
| **蓝牙** | BLE | 蓝牙 5.0 |
| **USB端口** | 4 x USB 2.0 | 2 x USB 3.0，2 x USB 2.0 |
| **无线连接** | 是 | 是，2.4 GHz & 5 GHz 频段支持 |
| **显示端口** | 1 x HDMI，1 x DSI | 2 x micro-HDMI，1 个 DSI |
| **电源** | microUSB 和 GPIO，高达 2.5 A | 5V DC，通过 USB-C 和GPIO（3 A） |
| **MicroSD 插槽** | 是 | 是 |
| **价格** | 35 美元 | 35 美元（1 GB 内存）、45 美元（2 GB 内存）、55 美元（4 GB 内存）、75 美元（8 GB 内存） |

如果你想要更快的数据传输，支持双显示器，以及更好的性能，树莓派 4 是一个很好的选择。

考虑到 2GB 内存的树莓派 4 基本型号的价格约为 35 美元。以几乎相同的价格选择 1GB 的树莓派 3 型号，实在是毫无意义。

当然，除非你能得到一个更便宜的价格，并且有特定的要求。树莓派 4 总体上是一个明确的选择。

然而，有一些事情，如板子发热和其他潜在的问题，你可能想在决定之前探讨一下。树莓派 3 已被证明能在许多项目中发挥作用，而树莓派 4 是相当新的，可能还没有经过各种项目的测试。

一旦你确定了这一点，你就可以继续得到它们中的任何一个。

你喜欢用什么？你都试过了吗？请在下面的评论中告诉我们。

---

via: <https://itsfoss.com/raspberry-pi-3-vs-4/>

作者：[Ankush Das](https://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/) 荣誉推出


利用基于 QEMU 的 Quickgui 轻松创建虚拟机

我用Virt-Manager

我搞不懂，用virtualbox不香吗？简单易用，要是搞生产，我直接Xen，搞测试简单的不行？

寸有所长，尺有所短

“QEMU/KVM - 未连接” “错误: 没有活动连接可用于安装“<br />
这个怎么办？(qemu已安装）

# 利用基于 QEMU 的 Quickgui 轻松创建虚拟机

>
> Quickgui 旨在成为 VirtualBox 的一个更简单的替代品，帮助你快速创建虚拟机。让我们来看看它。
>
>
>

目前，借助 VirtualBox、VMware 和其他一些程序，创建虚拟机相当容易。

你当然可以 [在你的 Linux 系统中安装 VirtualBox](https://itsfoss.com/install-virtualbox-ubuntu/) 来创建虚拟机。但是，在这篇文章中，我把重点放在一个令人兴奋的工具上，即 Quickgui，它使用简单，运行速度快，能帮助你快速启动虚拟机。

### Quickgui：Quickemu 的图形用户界面前端

Quickemu 是一个基于终端的工具，可以让你创建优化的桌面虚拟机并轻松地管理它们。该工具专注于消除配置虚拟机的所有细微差别。相反，它根据虚拟机的可用系统资源选择最佳配置以使其正常工作。

不仅限于配置，它还会下载操作系统的镜像（使用 quickget 包）。

因此，你所要做的就是像通常那样安装操作系统，然后开始工作。

Quickemu 以 [QEMU](https://www.qemu.org/) 为核心，旨在用 Bash 和 QEMU 取代 VirtualBox。

QEMU 是一个开源的机器仿真器和虚拟化器。

Quickemu 是一个有趣的项目，由 [Martin Wimpress](https://twitter.com/m_wimpress)（Ubuntu MATE 负责人）在一些贡献者的帮助下完成。

作为对这个工具的补充，Quickgui 是一个使用 [Flutter](https://itsfoss.com/install-flutter-linux/) 开发的前端，由另一组开发人员开发，以帮助在没有终端的情况下使用 Quickemu。

在此，我们重点介绍使用 Quickemu 创建和管理虚拟机的前端 Quickgui。

### Quickgui 的特点

如上所述，Quickgui 作为一个前端，其核心利用的是 Quickemu。因此，你可以期待其具有同样的功能。

你可以用它做的一些事情包括：

* 搜索操作系统并下载它们以创建虚拟机。
* 管理你现有的虚拟机。
* 当你建立一个虚拟机时，创建默认配置。
* 提供黑暗模式。
* 开箱即用地创建 Windows 和 macOS 虚拟机。
* 支持各种 Linux 发行版，包括 elementaryOS、ZorinOS、Ubuntu 等。
* 支持 FreeBSD 和 OpenBSD。
* 支持 EFI 和传统的 BIOS。
* 不需要提升权限就能工作。
* 默认情况下，宿主机/访客机共享剪贴板。
* 可以选择镜像压缩方法。
* 能够禁用输入。
* 能够切换虚拟机中宿主机/访客机的可用 USB 设备。
* 包括对 [SPICE 连接](https://www.spice-space.org/index.html) 的支持。
* 网络端口转发。
* Samba 文件共享。
* VirGL 加速。
* 智能卡直通。

鉴于它是如此简单和容易使用，其功能集令人印象深刻。让我给你提供一些使用的技巧。

### Quickgui 入门

用户界面非常简单，你可以选择 “<ruby> 管理现有机器 <rt>  Manage existing machines </rt></ruby>” 和 “<ruby> 创建新机器 <rt>  Create new machines </rt></ruby>”。

你需要点击“<ruby> 创建 <rt>  Create </rt></ruby>”来开始制作虚拟机。

选择操作系统，你应该看到一个列表。如果你找不到目标操作系统，只需搜索一下，它应该会出现。

你会看到各种各样的操作系统。在接下来的选择中，选择所需的操作系统及其版本。然后，点击 “<ruby> 下载 <rt>  Download </rt></ruby>”。

它应该会下载恢复镜像或 ISO，这取决于你正在尝试的操作系统。下载将取决于你的互联网连接，但它工作得很完美。

如果你想自己下载 ISO，你将就得为它创建配置并进行设置。看看 [Quickemu 的 GitHub 页面](https://github.com/wimpysworld/quickemu)，了解一下它的说明。

你只需要在下载完成后点击 “<ruby> 去除 <rt>  Dismiss </rt></ruby>”。

在这篇文章中，我测试了启动一个 Linux 虚拟机（[elementary OS 6](https://news.itsfoss.com/elementary-os-6-features/)）、一个 macOS 实例，以及一个 Windows 虚拟机。

我成功地以虚拟机方式运行了 Linux 和 macOS 。然而，我在快速建立一个 Windows 虚拟机时遇到了一些问题。我在 Quickemu 的 GitHub 页面上找不到任何相关信息，所以我没有费心去排除故障。

如果你需要使用 Windows 虚拟机，可以自己试试，并在他们的 [Discord 服务器](https://discord.com/invite/sNmz3uw) 中联系他们寻求帮助。

你不一定需要改变虚拟机的配置来使其工作。因此，它变成了一个节省时间的工具。

### 在 Linux 中安装 Quickgui

要使用 Quickgui，你需要先安装 Quickemu。

对于基于 Ubuntu 的发行版，你可以使用 PPA 来安装它：

```
sudo apt-add-repository ppa:flexiondotorg/quickemu
sudo apt update
sudo apt install quickemu

```

它应该安装了你需要的所有东西（连同 quickget 包），使其发挥作用。

完成后，你可以使用另一个 PPA 继续安装 Quickgui：

```
sudo add-apt-repository ppa:yannick-mauray/quickgui
sudo apt update
sudo apt install quickgui

```

如果你使用的是其他 Linux 发行版，你可以参考 [Quickemu 的 GitHub 页面](https://github.com/wimpysworld/quickemu) 和查看 [Quickgui 的 GitHub 页面](https://github.com/quickgui/quickgui)，以获得更多说明。

### 总结

Quickgui 使人们能够方便地利用 Quickemu 的能力，快速创建和管理多个虚拟机，而不需要进行任何配置。

更有好的是，你不需要提升权限就能让它工作。

因此，如果你正在寻找 VirtualBox 的替代品，这可能就是答案。或者，你也可以试试 [GNOME Boxes](https://help.gnome.org/users/gnome-boxes/stable/) 作为一个更简单的替代品。

你对 Quickgui 有什么看法？请在下面的评论中告诉我你的想法。

---

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

作者：[Ankush Das](https://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/) 荣誉推出


使用 qrcp 在你的手机和 Linux 之间传输文件

# 使用 qrcp 在你的手机和 Linux 之间传输文件

>
> qrcp 项目提供了一种快速地从你的 iPhone 或 Android 设备中复制文件到你的 Linux 电脑的方法，反之也可。
>
>
>

你是否在寻找一种快速复制文件的方法，从你的 iPhone 或 Android 移动设备到你的 Linux 电脑，或者从你的 Linux 电脑到你的设备？我最近发现了一个开源的应用，它很容易安装，并且传输文件只需一个二维码。

`qrcp` 项目提供了一个命令，可以在你的终端生成一个二维码，让你通过网络向你的电脑发送或接收文件。

### 在 Linux、Windows 或 Mac 上安装 qrcp

开发者 Claudio d'Angelis 以 MIT 许可证发布了 `qrcp` 应用。我发现它很容易安装，也很容易使用。它适用于 Linux、Windows 和 macOS，可以作为 RPM、DEB 或 tarball 下载。它为几乎所有的平台做了构建，包括树莓派。

如果你想在 Linux 上安装它，下载 RPM 或 DEB，并使用你的包管理器进行本地安装。例如，在 Fedora、CentOS 或 Mageia，或类似的平台上：

```
$ sudo dnf install ./qrcp*rpm

```

如果你只是想试试，你可以下载 tar.gz 压缩包并在本地运行它：

```
$ tar --extract --file qrcp*tar.gz
$ ./qrcp version
qrcp 0.x.y

```

### 设置 qrcp

你可以通过使用 `--help` 选项查看所有可用的 `qrcp` 选项：

```
$ qrcp --help
$ ./qrcp --help
Usage:
 qrcp [flags]
 qrcp [command]

Available Commands:
 completion  Generate completion script
 config      Configure qrcp
 help        Help about any command
 receive     Receive one or more files
 send        Send a file(s) or directories from this host
 version     Print version number and build information.
[...]

```

默认配置文件位于 `~/.config/qrcp/config.json` ，你可以使用你喜欢的编辑器编辑，或从命令行调用配置向导来配置应用。

```
$ qrcp config

```

第一步是创建一个配置文件。`qrcp config` 命令将带你完成这个过程，但会问你几个问题。

第一个问题是要求你提供一个“完全限定域名”。如果你在一个不使用完全限定域名的本地网络上使用 `qrcp`（或者你不知道哪种方式），那么就把这个留空。`qrcp` 命令将使用你的本地 IP 地址代替。

下一个问题是提示你选择端口。大多数防火墙会阻止非标准的端口，但会将 8080 端口作为互联网流量的情况并不少见。如果你的防火墙屏蔽了 8080 端口，那么你还是要添加一个例外。假设你的系统使用 `firewalld`，你可以用这个命令允许 8080 端口的流量：

```
$ sudo firewall-cmd --add-port 8080/tcp --permanent

```

拒绝在“传输完成后保持网络连接”的选项，让 `qrcp` 生成一个随机路径。

假设你在一个可信的网络上，使用 HTTP（而不是 HTTPS）连接，那么你不必配置 TLS。

配置保存在 `~/.config/qrcp/config.json` 中，并且之后可以编辑，所以如果你想改变设置，它很容易更新。

更新后的配置看起来像这样：

```
{
  "fqdn": "",
  "interface": "wlp0s20f3",
  "port": 8080,
  "keepAlive": false,
  "path": "",
  "secure": false,
  "tls-key": "",
  "tls-cert": "",
  "output": "/home/don"
}

```

### 用 qrcp 传输文件

现在你已经准备好从你的 Linux 电脑向你的移动设备发送一个文件。在这个例子中，我使用了我的 iPhone，它完全不支持 Linux，这是臭名昭著的。这个过程在安卓设备上是完全一样的。

我是这样做的。首先，我在我的电脑上创建一个示例文件：

```
$ echo "Hello world"> ~/example.txt

```

接下来，我使用 `send` 子命令将文件从我的 Linux 电脑发送到我的手机：

```
Linux~$ qrcp send example.txt

```

*使用 `qrcp send example.txt` 发送文件的例子（CC BY-SA 4.0）*

我打开我的相机应用（在 Android 上，我使用一个保护隐私的专用二维码扫描器），iPhone 扫描二维码并在我的手机上启动 Safari 浏览器。最后，我点击“下载”按钮。

*下载示例 .txt 文件（CC BY-SA 4.0）*

### 用 qrcp 接收文件

接收文件也一样简单，只是命令略有不同：

```
$ qrcp receive

```

*使用 `qrcp receive` 命令接收一个文件（CC BY-SA 4.0）*

我扫描了二维码，它再次启动了我手机上的 Safari 浏览器，但这次出现了一些不同，因为我正在将文件从我的 iPhone 发送到 Linux 电脑上。

*选择一个要传输的文件（CC BY-SA 4.0）*

我点击“选择文件”，它让我选择想发送的文件。

*文件被下载到默认位置（CC BY-SA 4.0）*

发送文件后，是在我的配置中指定的默认位置找到了文件。

### 尝试 qrcp

项目文档很简短但已足够，除了最初提出这个想法的 Claudio d'Angelis 之外，它还有开发者社区的支持。社区欢迎你加入他们，该应用将改变你对移动设备之间文件传输的看法。试试吧！

---

via: <https://opensource.com/article/21/11/transfer-files-phone-linux>

作者：[Don Watkins](https://opensource.com/users/don-watkins) 选题：[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/) 荣誉推出


硬核观察 #460 哈希表理论突破提升数据存储效率

Summary: 更多：• 英特尔发布了检测漏洞的 AI • 英特尔开发下一代固件平台

更多：• 英特尔发布了检测漏洞的 AI • 英特尔开发下一代固件平台

# 硬核观察 #460 哈希表理论突破提升数据存储效率

### 哈希表理论突破提升数据存储效率

哈希表是最常用的组织和存储数据的方法之一。线性探测哈希表于 1954 年引入，是当今可用的最古老、最简单和最快的数据结构之一。在线性探测哈希表中，可存储信息的位置位于一个线性数组中。几乎每个使用线性探测哈希表的人都认为，如果你让它们变得太满，那么长长的、被占据的位置就会聚集在一起形成“集群”，结果找到一个空位所花费的时间会急剧增加。但是这个已有半个多世纪、一直不利于高负载率的原则已被 [三名研究人员的工作](https://news.mit.edu/2021/theoretical-breakthrough-hash-tables-could-boost-data-storage-1116) 彻底颠覆。他们发现，对于插入和删除数量大体相等的应用程序，线性探测哈希表可以在不牺牲速度的情况下以高存储容量运行。

>
> 老王点评：果然只有数学理论的突破才能真正突破硬件的升级幅度。
>
>
>

### 英特尔发布了检测漏洞的 AI

英特尔上个月开源了 ControlFlag，今天 [发布了 1.0](https://github.com/IntelLabs/control-flag/releases/tag/v1.0)。在该版本中，他们宣传说已经完全支持 C 语言编程，并特别针对 C 程序的 if 条件语句做了调整。ControlFlag 的方法是在 C/C++ 开源代码库中挖掘模式，然后在开发者的代码库中检测异常模式。他们在 6000 多个 GitHub 存储库的超过 10 亿行代码中进行了训练。英特尔表示，他们已经成功地在他们的软件中使用了它，包括应用程序和固件。

>
> 老王点评：以后看来不但写程序不用程序员，就连程序员的 bug 也不用程序员找了。
>
>
>

### 英特尔开发下一代固件平台

英特尔 [发布](https://www.phoronix.com/scan.php?page=news_item&px=Intel-USF-Firmware) 了 [通用可扩展固件（USF）](https://github.com/universalscalablefirmware) 的规范草案。USF 建立在现有的行业标准上，如 UEFI 和 ACPI。USF 在 SoC、平台和操作系统之间引入了新的抽象和领域界限。USF 打算将其范围扩大到不仅仅是系统固件，还计划让英特尔的独立图形处理器使用。USF 的目的是“开放”，但英特尔承认它由外部行业规范和他们的内部规范组成。据估计，英特尔或将使 USF 成为一个完全开源的固件堆栈。

>
> 老王点评：虽然已经有了一些开源固件解决方案，但是如果 USF 能真正开源，那对开放硬件应该是一件好事。
>
>
>


vifm：为铁杆 Vim 爱好者提供的终端文件浏览器

Summary: 让我们探索一个基于终端的文件浏览器，可以使用 Vim 风格的键绑定。

让我们探索一个基于终端的文件浏览器，可以使用 Vim 风格的键绑定。

# vifm：为铁杆 Vim 爱好者提供的终端文件浏览器

>
> 让我们探索一个基于终端的文件浏览器，可以使用 Vim 风格的键绑定。
>
>
>

当在命令行中浏览 [Linux 目录结构](https://linuxhandbook.com/linux-directory-structure/) 时，人们经常依赖 [cd 命令](https://linuxhandbook.com/cd-command-examples/)。

这也没什么不好，因为你登录到任何一个 Linux 系统上都有 `cd` 命令。

然而，如果系统是由你维护的，你想更直观地看到目录，那么文件管理器比 `cd` 或 `tree` 命令要好得多。

是的，你也可以在终端中找到文件管理器。它们可能不如 Nautilus 这样的图形界面应用，但仍然比普通的老命令好。

有几个 [TUI](https://itsfoss.com/gui-cli-tui/) 文件浏览器，我们已经介绍了其中的几个。今天，我们来看看 `vifm`。

### vifm 简介

[vifm](https://github.com/vifm/vifm) 是一个命令行工具，它是一个文件管理器，导航和操作文件系统对象的键绑定与 Vim 类似。如果你不清楚我所说的“文件系统对象”是什么意思，它们是文件、目录、符号链接、硬链接等。

除了非常直观的 Vim 交互键绑定外，下面是 `vifm` 为你提供的一系列功能：

* 一个就在你的终端中的快速文件管理器
* 从文件管理器内编辑文本文件
* `vifm` 使用 curses 界面
* `vifm` 是跨平台的（在 Cygwin 的帮助下甚至可以在 Windows 上工作；它应该可以，但我没有测试过）
* 支持 Vim 风格的键绑定输入，如 `dd`、`j`、`k`、`h`、`l` 等
* [vifm 插件](https://github.com/vifm/vifm.vim) 可以在 Vim 中使用，这样就可以通过 Vim 打开文件
* 支持 Vim 命令的自动补完
* 支持多个面板
* 可以使用 [或不使用] 正则表达式进行批量重命名

### 在 Linux 上安装 vifm

`vifm` 软件包并不算新，因此在默认情况下，即使是“稳定”发行版（如 Debian）的软件库中也很容易找到它。

在 Debian 和基于 Debian 的发行版（如 Ubuntu、Pop!\_OS、Mint 等）之上，你可以 [使用 apt 软件包管理器](https://itsfoss.com/apt-command-guide/) 来安装 `vifm`：

```
sudo apt install vifm

```

使用 [pacman 软件包管理器](https://itsfoss.com/pacman-command/) 在 [基于 Arch 的 Linux 发行版](https://itsfoss.com/arch-based-linux-distros/)上安装 `vifm`：

```
sudo pacman -S vifm

```

`vifm` 在 Fedora 和 RHEL 仓库中也有；用 DNF 软件包管理器安装它：

```
sudo dnf install vifm

```

安装好了 `vifm`，你可以简单地在终端输入 `vifm`，像下面这样，然后启动它：

```
vifm

```

### vifm 的用户界面

当你第一次启动 `vifm` 时，默认情况下，它启动时显示你当前所在的目录的概览。你还会注意到，`vifm` 默认使用两个窗格。

如果你对界面感到困惑，只需尝试按 `j` 键将光标向下移动一行，按 `k` 键将光标向上移动一行。你可以通过按 `h` 键向上移动一级目录。就像 Vim 中一样！

如果你的光标目前在一个文件上，按 `l` 键将在 Vim 中打开该文件（如果没有另外说明的话）。但如果你的光标在一个目录上，按 `l` 键将导航到该目录并显示其内容。

你也可以通过按 `Ctrl + g` 键绑定，从文件管理器中获得关于文件或目录的详细信息。

你可以按 `za` 键来显示被隐藏的文件和目录（开头有 `.` 的文件和目录默认是隐藏的）。如果这些特殊的文件和目录没有被隐藏，按 `za` 键将会隐藏它们。

你可以用 `zo` 键绑定一直显示隐藏的文件和目录，或用 `zm` 键绑定使这些项目一直不可见。

### 总结

由于它是基于 Vim 的，你可以用 vifmrc 文件来配置它。在 [vifm wiki](https://wiki.vifm.info/index.php/Main_Page) 上有最新的默认绑定键的速查表，在 [这里](https://vifm.info/cheatsheets.shtml)。这个项目的文档非常好。

`vifm` 是一个了不起的文件管理器，特别是对于 Vim 用户来说，因为它与 Vim 生态系统整合得非常好。它将许多 Vim 的功能和按键绑定整合到一个文件管理器中。默认的双窗格布局使其更具生产力。

不要犹豫，尝试一下 `vifm`。它真的是一个了不起的命令行工具。

---

via: <https://itsfoss.com/vifm-terminal-file-manger/>

作者：[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/) 荣誉推出


入门：如何在 Fedora Linux 中切换到深色模式

Gnome浅色模式不得不说的优点>>>就是看着想吐, 还特么是默认的

最好能全部显示浅色

# 入门：如何在 Fedora Linux 中切换到深色模式

与 Ubuntu 不同，Fedora 提供的是真正的、原生般的 GNOME 体验，而且体验很好，横向布局、三指滑动，一切都很好。

我不喜欢的一点是默认的标准主题，它是 Adwaita Light（默认）主题和深色的 GNOME Shell 的混合体。

因此，虽然通知和通知区是深色的，但系统和应用的其他部分是浅色主题。老实说，对我来说，这看起来很不协调。

另一方面，深色主题让它看起来更好。

让我告诉你如何在 Fedora 或其他任何使用 GNOME 桌面环境的发行版中开启深色模式。

### 在 Fedora 中切换到深色模式

好了！我将分享命令行的方法，因为它更快。打开一个终端，使用这个命令：

```
gsettings set org.gnome.desktop.interface gtk-theme Adwaita-dark

```

完成了。这很容易，对吗？但我也要展示一下 GUI 的方法。

因为我主要使用 Ubuntu，所以我始终参照 Ubuntu。Ubuntu 在系统设置中本身就提供了在浅色和深色主题之间切换的选项。

然而，在原生 GNOME 中却没有这样的设置。你必须先 [在 Fedora 上安装 GNOME Tweaks 工具](https://itsfoss.com/install-gnome-tweaks-fedora/)，然后用它来切换主题。

你可以在软件中心搜索它并点击“<ruby> 安装 <rt>  Install </rt></ruby>”按钮：

或者，你在终端输入以下命令：

```
sudo dnf install gnome-tweaks

```

安装完成后，按 `Super` 键（`Windows` 键）在系统菜单中搜索它：

点击左侧边栏的“<ruby> 外观 <rt>  Appearance </rt></ruby>”标签，点击主题部分下的应用。

你会看到这里有几个可用的主题。你应该在这里选择 “Adwaita-dark”。当你选择了它，应用就会切换到深色主题。

就是你在 Fedora 中切换到深色模式所需要做的一切。由于 GNOME Shell 已经在使用深色主题，你不需要明确地将它设置为深色模式。所有的通知、信息栏等都是在深色模式下的。

### 总结

你可以找到各种深色 GTK 主题并安装它们来给你的 Fedora 带来不同的深色外观。然而，我注意到，只有系统自己的深色主题才能被网页浏览器识别。

所以，如果你访问一个根据你的系统主题自动启用深色模式的网站，它将与 Adwaita-dark 兼容，但可能与其他深色 GTK 主题不兼容。

这就是使用系统提供的深色主题的一个优势。

如你所见，在 Fedora 中启用深色模式并不是什么火箭科学。它只是一个了解和发现的过程。

享受深色色彩吧！

---

via: <https://itsfoss.com/fedora-dark-mode/>

作者：[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/) 荣誉推出


硬核观察 #461 Winamp 准备重启

Summary: 更多：• 狗狗电话让宠物给它们的主人打电话 • Alphabet 将原型机器人用于清理谷歌的办公室

# 硬核观察 #461 Winamp 准备重启

### Winamp 准备重启

在我们用流媒体播放音乐之前，最受欢迎的播放 MP3 的媒体播放器之一是 Winamp。用户会翻录他们的专辑或下载 MP3，用媒体播放器在他们的电脑上收听。然而，Winamp 在 2007 年发布 5.5 版本后就再无下文。虽然 Winamp 的所有者 Radionomy 说他们对 Winamp 有很大的计划，但此后没有进一步的版本发布。2018 年 10 月，在 Winamp 5.8 版本在网上被泄露后，Winamp 社区的开发者决定在他们的网站 [Winamp.com](https://www.winamp.com/) 上 [发布泄露的版本](https://www.bleepingcomputer.com/news/software/winamp-prepares-a-relaunch-new-beta-version-almost-ready/)。我们所看到的唯一新的 Winamp 开发是由 [Winamp 社区更新项目（WACUP）](https://getwacup.com/) 发布的预览版。

>
> 老王点评：真是令人怀念的软件。
>
>
>

### 狗狗电话让宠物给它们的主人打电话

[英国卫报报道](https://www.theguardian.com/lifeandstyle/2021/nov/17/can-i-give-you-a-call-bark-dogphone-lets-pets-ring-their-owners)，研究人员为独自留在家中的犬类创造了一种高科技的选择：一个被称为“DogPhone”的软球可以让它们呼叫主人。当这个软球被移动时，会向一台笔记本电脑发送信号，启动视频通话，并发出电话铃声。主人可以选择是否接电话，以及何时挂断电话，同时他们也可以给他们的宠物打电话，尽管狗必须移动球才能接电话。这项研究 [发表](https://dl.acm.org/doi/10.1145/3488539) 在《计算机协会计算机与人类互动论文集》上。但记录表明，研究者的狗似乎并不总是知道自己在做什么，打出的许多电话似乎都是意外。但研究者认为“当狗用屁股触发系统时，这可能是故意的，是狗触发互动的独特方式。”

>
> 老王点评：要不是发表在了 ACM，我以为这是准备申报今年的搞笑诺贝尔奖的。
>
>
>

### Alphabet 将原型机器人用于清理谷歌的办公室

Alphabet 旗下的 X 实验室内致力于创造“通用学习机器人”的团队已经将其一些 [原型机器人](https://www.theverge.com/2021/11/19/22791267/alphabet-google-everyday-robot-project-cleaning-office-prototype) 放到谷歌的湾区园区。他们说，“我们现在正在运营一个由 100 多个机器人原型组成的车队，它们正在我们的办公室周围自主地执行一系列有用的任务。”这些机器人现在可以配备一个刮刀来擦桌子，也可以用抓手来开门。

>
> 老王点评：以后或许我们身边很多在做着各种活的机器人。
>
>
>


自由之狼：一个没有遥测的开源火狐复刻

# 自由之狼：一个没有遥测的开源火狐复刻

>
> LibreWolf 是一个火狐浏览器的复刻，它关注于隐私和安全，消除了遥测并增加了其他好处。让我们来了解一下它。
>
>
>

<ruby> 火狐 <rt>  Firefox </rt></ruby> 是 Linux 上最好的网页浏览器之一。然而，一些用户并不喜欢其中的遥测机制。

除此之外，有些人更喜欢一个开箱即用的、为最佳隐私和安全而调整过的浏览器，即使火狐浏览器是提供了最好的定制功能的浏览器之一。

如果你不想要火狐浏览器的干扰功能，想要一个无需你亲自调整的私密网络体验，LibreWolf（自由之狼）或许就是答案。

### LibreWolf：更好的火狐？

假设你想使用火狐，而不使用火狐的帐户同步的能力和其他一些火狐特有的功能，如 “添加到 Pocket” 按钮。在这种情况下，LibreWolf 可以是一个不错的选择。

不同于其他火狐浏览器的复刻（例如，[Basilisk 浏览器](https://itsfoss.com/basilisk-browser/)），它是定期更新的。而且，它只专注于提供私密的网页浏览体验，而不影响你在火狐中所希望得到的用户体验。

### LibreWolf 的特点

LibreWolf 为安全的网页浏览体验提供了一套相当有用的开箱即用的功能。让我强调其中的一些特点：

* 移除遥测功能
* 不使用火狐账户进行云同步
* 私密搜索供应商，如 Searx、Qwant（DuckDuckGo 被设置为默认）
* 包含 uBlock Origin 以阻止脚本/广告
* 没有 “添加到 Pocket” 按钮
* 主页上默认没有赞助/推荐的内容
* 从设置中删除火狐<ruby> 状态条 <rt>  snippets </rt></ruby>，它用于在新标签中添加新闻/提示
* 没有赞助的快捷提示
* 追踪保护默认设置为“严格”模式
* Cookies 和历史记录设置为关闭浏览器时删除
* 默认启用 HTTPS-only 模式

正如你所注意到的，LibreWolf 的目标是提供一个更清洁和有利于隐私的体验，而不需要调整任何东西。

如果你不想反复登录网络服务和浏览历史记录来回忆你的浏览活动，一些选项如退出时清除 cookies/历史记录可能会很不方便。

所以，如果你想从火狐切换到 LibreWolf，你可能想在决定之前测试一下网页浏览体验。

### 在 Linux 中安装 LibreWolf

对于任何 Linux 发行版，你可以使用 AppImage 文件或 Flathub 的 Flatpak 包。

如果你不知道，你可以参考我们关于 [使用 AppImage](https://itsfoss.com/use-appimage-linux/) 的指南和 [Flatpak 的资源](https://itsfoss.com/flatpak-guide/) 。

对于 Arch Linux 用户，它也可以在 [Arch 用户仓库（AUR）](https://itsfoss.com/aur-arch-linux/) 中找到。

也可以在他们的 [官方网站](https://librewolf-community.gitlab.io/install/) 或 [GitLab 页面](https://gitlab.com/librewolf-community) 中找到其他安装说明。

你试过 LibreWolf 吗？你喜欢用什么作为你的网页浏览器？请在下面的评论中分享你的想法！

---

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

作者：[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/) 荣誉推出


Kubernetes 网络策略基础

# Kubernetes 网络策略基础

>
> 在你通过 Kubernetes 部署一个应用之前，了解 Kubernetes 的网络策略是一个基本的要求。
>
>
>

随着越来越多的云原生应用程序通过 Kubernetes 部署到生产环境，安全性是你必须在早期就需要考虑的一个重要检查项。在设计云原生应用程序时，预先嵌入安全策略非常重要。不这样做会导致后续的安全问题，从而导致项目延迟，并最终给你带来不必要的压力和金钱投入。

这么多年来，人们总是把安全留到最后，直到他们的部署即将发布到生产环境时才考虑安全。这种做法会导致项目交付的延迟，因为每个组织都有要遵守的安全标准，这些规定被绕过或不遵守，并承受大量的风险才得以实现可交付成果。

对于刚开始学习 Kubernetes 实施的人来说，理解 Kubernetes <ruby> 网络策略 <rt>  NetworkPolicy </rt></ruby> 可能会令人生畏。但这是在将应用程序部署到 Kubernetes 集群之前必须了解的基本要求之一。在学习 Kubernetes 和云原生应用程序时，请把“不要把安全抛在脑后！”定为你的口号。

### NetworkPolicy 概念

<ruby>   网络策略  <rt>  NetworkPolicy </rt></ruby> 取代了你所知道的数据中心环境中的防火墙设备 —— 如<ruby> 吊舱 <rt>  Pod </rt></ruby>之于计算实例、网络插件之于路由器和交换机，以及卷之于存储区域网络（SAN）。

默认情况下，Kubernetes 网络策略允许 <ruby>   吊舱  <rt>  Pod </rt></ruby> 从任何地方接收流量。如果你不担心吊舱的安全性，那么这可能没问题。但是，如果你正在运行关键工作负载，则需要保护吊舱。控制集群内的流量（包括入口和出口流量），可以通过网络策略来实现。

要启用网络策略，你需要一个支持网络策略的网络插件。否则，你应用的任何规则都将变得毫无用处。

[Kubernetes.io](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) 上列出了不同的网络插件：

* CNI 插件：遵循 <ruby>   容器网络接口  <rt>  Container Network Interface </rt></ruby>（CNI）规范，旨在实现互操作性。
	+ Kubernetes 遵循 CNI 规范的 [v0.4.0](https://github.com/containernetworking/cni/blob/spec-v0.4.0/SPEC.md) 版本。
* Kubernetes 插件：使用桥接器和主机本地 CNI 插件实现基本的 `cbr0`。

### 应用网络策略

要应用网络策略，你需要一个工作中的 Kubernetes 集群，并有支持网络策略的网络插件。

但首先，你需要了解如何在 Kubernetes 的环境使用网络策略。Kubernetes 网络策略允许 [吊舱](https://kubernetes.io/docs/concepts/workloads/pods/) 从任何地方接收流量。这并不是理想情况。为了吊舱安全，你必须了解吊舱是可以在 Kubernetes 架构内进行通信的端点。

1、使用 `podSelector` 进行吊舱间的通信：

```
 - namespaceSelector:
    matchLabels:
      project: myproject

```

2、使用 `namespaceSelector` 和/或 `podSelector` 和 `namespaceSelector` 的组合进行命名空间之间的通信和命名空间到吊舱的通信。：

```
 - namespaceSelector:
    matchLabels:
      project: myproject
 - podSelector:
    matchLabels:
      role: frontend

```

3、对于吊舱的 IP 块通信，使用 `ipBlock` 定义哪些 IP CIDR 块决定源和目的。

```
 - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24

```

注意吊舱、命名空间和基于 IP 的策略之间的区别。对于基于吊舱和命名空间的网络策略，使用选择器来控制流量，而对基于 IP 的网络策略，使用 IP 块（CIDR 范围）来定义控制。

把它们放在一起，一个网络策略应如下所示：

```
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: test-network-policy
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 192.168.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

```

参考上面的网络策略，请注意 `spec` 部分。在此部分下，带有标签 `app=backend` 的 `podSelector` 是我们的网络策略的目标。简而言之，网络策略保护给定命名空间内称为 `backend` 的应用程序。

此部分也有 `policyTypes` 定义。此字段指示给定策略是否适用于选定吊舱的入口流量、选定吊舱的出口流量，或两者皆有。

```
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  - Egress

```

现在，请看 `Ingress`（入口）和 `Egress`（出口）部分。该定义规定了网络策略的控制。

首先，检查 `ingress from` 部分。

此实例中，网络策略允许从以下位置进行吊舱连接：

* `ipBlock`
	+ 允许 172.17.0.0/16
	+ 拒绝 192.168.1.0/24
* `namespaceSelector`
	+ `myproject`: 允许来自此命名空间并具有相同标签 project=myproject 的所有吊舱。
* `podSelector`
	+ `frontend`: 允许与标签 `role=frontend` 匹配的吊舱。

```
ingress:
 - from:
  - ipBlock:
      cidr: 172.17.0.0/16
      except:
      - 192.168.1.0/24
  - namespaceSelector:
      matchLabels:
        project: myproject
  - podSelector:
      matchLabels:
        role: frontend

```

现在，检查 `egress to` 部分。这决定了从吊舱出去的连接：

* `ipBlock`
	+ 10.0.0.0/24: 允许连接到此 CIDR
	+ Ports: 允许使用 TCP 和端口 5978 进行连接

```
egress:
 - to:
  - ipBlock:
      cidr: 10.0.0.0/24
  ports:
  - protocol: TCP
    port: 5978

```

### 网络策略的限制

仅靠网络策略无法完全保护你的 Kubernetes 集群。你可以使用操作系统组件或 7 层网络技术来克服已知限制。你需要记住，网络策略只能解决 IP 地址和端口级别的安全问题 —— 即开放系统互联（OSI）中的第 3 层或第 4 层。

为了解决网络策略无法处理的安全要求，你需要使用其它安全解决方案。以下是你需要知道的一些 [用例](https://kubernetes.io/docs/concepts/services-networking/network-policies/#what-you-can-t-do-with-network-policies-at-least-not-yet)，在这些用例中，网络策略需要其他技术的增强。

### 总结

了解 Kubernetes 的网络策略很重要，因为它是实现（但不是替代）你通常在数据中心设置中使用的防火墙角色的一种方式，但适用于 Kubernetes。将此视为容器安全的第一层，仅仅依靠网络策略并不是一个完整的安全解决方案。

网络策略使用选择器和标签在吊舱和命名空间上实现安全性。此外，网络策略还可以通过 IP 范围实施安全性。

充分理解网络策略是在 Kubernetes 环境中安全采用容器化的一项重要技能。

---

via: <https://opensource.com/article/21/10/kubernetes-networkpolicy>

作者：[Mike Calizo](https://opensource.com/users/mcalizo) 选题：[lujun9972](https://github.com/lujun9972) 译者：[perfiffer](https://github.com/perfiffer) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #462 Docker 贡献者数量远超 Linux

Summary: 更多：• GitHub 去年增加 1600 万新用户 • 美国计算机芯片繁荣的愿景让各城市趋之若鹜

# 硬核观察 #462 Docker 贡献者数量远超 Linux

### Docker 贡献者数量远超 Linux

根据 [ZDnet 报道](https://www.zdnet.com/article/remote-work-developers-arent-planning-to-go-back-to-the-office/)，Docker 的 49593 个包有来自 215 个国家的高达 63.2 万名贡献者。这比估计的 Linux 贡献者数量（2 万）大了不止一个数量级，这意味着现在 GitHub 上 7300 万开发者中每 117 个开发者，就有一个对 Docker 有贡献。

>
> 老王点评：虽然说给 Docker 中众多的软件包做贡献容易一些，但是这个数量也非常令人吃惊。
>
>
>

### GitHub 去年增加 1600 万新用户

据 [GitHub 年度报告](https://octoverse.github.com/)，GitHub 说它现在有 7300 万开发者用户，2021 年它获得了 1600 万新用户。用户创建了 6100 万个新存储库，有 1.7 亿个拉取请求被合并到项目中。以及在全球疫情前，有 41% 的开发者在办公室全职或兼职工作，但只有 10.7% 的人预计在疫情结束后会回到办公室。

>
> 老王点评：GitHub 一家独大的局面很难改变，就是不知道换帅之后会不会有变化。
>
>
>

### 美国计算机芯片繁荣的愿景让各城市趋之若鹜

计算机芯片的短缺已经耗尽了全球经济的能量，影响了许多行业，并导致了对高通胀的担忧。美国大幅提高芯片产量的努力，让各个城市争相争取芯片厂商的落地。比如德克萨斯州的泰勒市，该市约有 17000 人，就正全力以赴地争取三星公司计划从明年初开始在美国建造的 [价值 170 亿美元的工厂](https://www.nytimes.com/2021/11/17/technology/samsung-semiconductor-chip-production.html)。

>
> 老王点评：看来不只是我们对芯片工厂热衷，美国也一样，就是不知道等产能拉上来之后会怎么样。
>
>
>