R 语言 stats 包中的函数

Summary: 我们将学习如何使用 R 语言 stats 包中提供的统计函数。

我们将学习如何使用 R 语言 stats 包中提供的统计函数。

![](/data/attachment/album/202306/22/113510g55tccfi5uihcuta.jpg)

我们已经学习了 R 语言的基础知识，包括其语法以及语法所对应的语义，现在准备使用 R 向统计学领域进发。本文是 R 系列的第十一篇文章，我们将学习如何使用 R 语言 stats 包中提供的统计函数。

与此系列之前的文章一样，我们将使用安装在 Parabola GNU/Linux-libre（x86-64）上的 R 4.1.2 版本来运行文中的代码。

```
$ R --version
R version 4.1.2 (2021-11-01) -- "Bird Hippie"
Copyright (C) 2021 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under the terms of the
GNU General Public License versions 2 or 3.
For more information about these matters see https://www.gnu.org/licenses/

```

### mean 函数

在 R 中 `mean` 函数用来计算算术平均值。该函数接受一个 R 对象 `x` 作为参数，以及一个 `trim` 选项来在计算均值之前剔除任意比例的数据（LCTT 译注：比如对于一个含有 7 个元素的向量 `x`，设置 `trim` 为 0.2 表示分别去掉 `x` 中最大和最小的前 20% —— 即 1.4 个 —— 的元素，所去掉的元素的个数会向下取整，所以最终会去掉 1 个最大值和 1 个最小值；`trim` 取值范围为 `[0, 0.5]`，默认为 0）。<ruby> 逻辑参数 <rt>  logical argument </rt></ruby>（`TRUE` 或 `FALSE`）`na.rm` 可以设置是否忽略空值（`NA`）。该函数的语法如下：

```
mean(x, trim = 0, na.rm = FALSE, ...)

```

该函数支持数值、逻辑值、日期和 <ruby> 时间区间 <rt>  time intervals </rt></ruby>。下面是使用 `mean` 函数的一些例子：

```
> mean(c(1, 2, 3))
2

> mean(c(1:5, 10, 20))
6.428571

> mean(c(FALSE, TRUE, FALSE))
0.3333333

> mean(c(TRUE, TRUE, TRUE))
1

```

我们使用 UCI 机器学习库提供的一个采集自葡萄牙银行机构的“银行营销数据集”作为样本数据。该数据可用于公共研究，包含 4 个 csv 文件，我们使用 `read.csv()` 函数导入其中的 `bank.csv` 文件。

```
> bank <- read.csv(file="bank.csv", sep=";")

> bank[1:3,]
  age        job marital education default balance housing loan  contact day
1  30 unemployed married   primary      no    1787      no   no cellular  19
2  33   services married secondary      no    4789     yes  yes cellular  11
3  35 management  single  tertiary      no    1350     yes   no cellular  16
  month duration campaign pdays previous poutcome  y
1   oct       79        1    -1        0  unknown no
2   may      220        1   339        4  failure no
3   apr      185        1   330        1  failure no

```

下面是计算 `age` 列均值的示例：

```
> mean(bank$age)
41.1701

```

### median 函数

R 语言 `stats` 包中的 `median` 函数用来计算样本的中位数。该函数接受一个数值向量 `x`，以及一个逻辑值 `na.rm` 用来设置在计算中位数之前是否去除 `NA` 值。该函数的语法如下：

```
median(x, na.rm = FALSE, ...)

```

下面是使用该函数的两个例子：

```
> median(3:5)
4
> median(c(3:5, 50, 150))
[1] 5

```

现在我们可以计算银行数据中 `age` 列的中位数：

```
> median(bank$age)
39

```

### pair 函数

`pair` 函数用来合并两个向量，接受向量 `x` 和向量 `y` 两个参数。`x` 和 `y` 的长度必须相等。

```
Pair(x, y)

```

该函数返回一个 `Pair` 类的列数为 2 的矩阵，示例如下：

```
> Pair(c(1,2,3), c(4,5,6))
     x y
[1,] 1 4
[2,] 2 5
[3,] 3 6
attr(,"class")
[1] "Pair"

```

该函数常用于像 T 检验和 Wilcox 检验等的 <ruby> 配对检验 <rt>  paired test </rt></ruby>。

### dist 函数

`dist` 函数用来计算数据矩阵中各行之间的距离矩阵，接受以下参数：

| 参数 | 描述 |
| --- | --- |
| `x` | 数值矩阵 |
| `method` | 距离测量方法 |
| `diag` | 若为 TRUE，则打印距离矩阵的对角线 |
| `upper` | 若为 TRUE，则打印距离矩阵的上三角 |
| `p` | 闵可夫斯基距离的幂次（见下文 LCTT 译注） |

该函数提供的距离测量方法包括：<ruby> 欧式距离 <rt>  euclidean </rt></ruby>、<ruby> 最大距离 <rt>  maximum </rt></ruby>、<ruby> 曼哈顿距离 <rt>  manhattan </rt></ruby>、<ruby> 堪培拉距离 <rt>  canberra </rt></ruby>、<ruby> 二进制距离 <rt>  binary </rt></ruby> 和 <ruby> 闵可夫斯基距离 <rt>  minkowski </rt></ruby>，默认为欧式距离。

>
> LCTT 译注：
>
>
> * **欧式距离**指两点之间线段的长度，比如二维空间中 A 点 ![](/data/attachment/album/202306/22/113853y2muxveo4z33ymzx.png)和 B 点 ![](/data/attachment/album/202306/22/113912sxsnynb2zydzsxoi.png)的欧式距离是 ![](/data/attachment/album/202306/22/113951e56gbk0smjsb3tsm.png) ；
> * **最大距离**指 n 维向量空间中两点在各维度上的距离的最大值，比如 A 点 (3,6,8,9) 和 B 点 (1,8,9,10) 之间的最大距离是 ![](/data/attachment/album/202306/22/114115x3xyehmszytm69xy.png)，等于 2；
> * **曼哈顿距离**指 n 维向量空间中两点在各维度上的距离之和，比如二维空间中 A 点 ![](/data/attachment/album/202306/22/114140atlbv2h28kuezeku.png)和 B 点 ![](/data/attachment/album/202306/22/114152io5zgkioqkzonvl8.png)之间的曼哈顿距离是 ![](/data/attachment/album/202306/22/114236xlxlc999kr9z8z7b.png)；
> * **堪培拉距离**的公式是 ![](/data/attachment/album/202306/22/114306s9jg7pjrw3hx8hjc.png) ；
> * **二进制距离**首先将两个向量中的各元素看作其二进制形式，然后剔除在两个向量中对应值均为 0 的维度，最后计算在剩下的维度上两个向量间的对应值不相同的比例，比如 V1=(1,3,0,5,0) 和 V2=(11,13,0,15,10) 的二进制形式分别是 (1,1,0,1,0) 和 (1,1,0,1,1)，其中第 3 个维度的对应值均为 0，剔除该维度之后为 (1,1,1,0) 和 (1,1,1,1)，在剩余的 4 个维度中只有最后一个维度在两个向量之间的值不同，最终结果为 0.25；
> * **闵可夫斯基距离**是欧式距离和曼哈顿距离的推广，公式是 ![](/data/attachment/album/202306/22/114431wnjlfj2xfczzjujl.png)，当 p = 1 时相当于曼哈顿距离，当 p = 2 时相当于欧式距离。
>
>
>

下面是使用欧式距离计算 `age` 列距离矩阵的示例：

```
> dist(bank$age, method="euclidean", diag=FALSE, upper=FALSE, p=2)
      1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
2     3
3     5  2
4     0  3  5
5    29 26 24 29
6     5  2  0  5 24
7     6  3  1  6 23  1
8     9  6  4  9 20  4  3
9    11  8  6 11 18  6  5  2
10   13 10  8 13 16  8  7  4  2
11    9  6  4  9 20  4  3  0  2  4
12   13 10  8 13 16  8  7  4  2  0  4
13    6  3  1  6 23  1  0  3  5  7  3  7
14   10 13 15 10 39 15 16 19 21 23 19 23 16
15    1  2  4  1 28  4  5  8 10 12  8 12  5 11
16   10  7  5 10 19  5  4  1  1  3  1  3  4 20  9
17   26 23 21 26  3 21 20 17 15 13 17 13 20 36 25 16
18    7  4  2  7 22  2  1  2  4  6  2  6  1 17  6  3 19
19    5  8 10  5 34 10 11 14 16 18 14 18 11  5  6 15 31 12
20    1  2  4  1 28  4  5  8 10 12  8 12  5 11  0  9 25  6  6
21    8  5  3  8 21  3  2  1  3  5  1  5  2 18  7  2 18  1 13  7
22   12  9  7 12 17  7  6  3  1  1  3  1  6 22 11  2 14  5 17 11  4
23   14 11  9 14 15  9  8  5  3  1  5  1  8 24 13  4 12  7 19 13  6  2
     26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
...

```

改用二进制距离的计算结果如下：

```
> dist(bank$age, method="binary", diag=FALSE, upper=FALSE, p=2)
     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
2    0
3    0 0
4    0 0 0
5    0 0 0 0
6    0 0 0 0 0
7    0 0 0 0 0 0
8    0 0 0 0 0 0 0
9    0 0 0 0 0 0 0 0
10   0 0 0 0 0 0 0 0 0
11   0 0 0 0 0 0 0 0 0  0
12   0 0 0 0 0 0 0 0 0  0  0
13   0 0 0 0 0 0 0 0 0  0  0  0
14   0 0 0 0 0 0 0 0 0  0  0  0  0
15   0 0 0 0 0 0 0 0 0  0  0  0  0  0
16   0 0 0 0 0 0 0 0 0  0  0  0  0  0  0
17   0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0
18   0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0
19   0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0
20   0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0
21   0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0
22   0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0
23   0 0 0 0 0 0 0 0 0  0  0  0  0  0  0  0  0  0  0  0  0  0
     29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

```

### quantile 函数

`quantile` 函数用于计算数值向量 `x` 的分位数及其对应的概率。当设置 `na.rm` 为 `TRUE` 时，该函数将忽略向量中的 `NA` 和 `NaN` 值。概率 0 对应最小观测值，概率 1 对应最大观测值。该函数的语法如下:

```
quantile(x, ...)

```

`quantile` 函数接受以下参数：

| 参数 | 描述 |
| --- | --- |
| `x` | 数值向量 |
| `probs` | 概率向量，取值为 `[0, 1]`（LCTT 译注：默认为 `(0, 0.25, 0.5, 0.75, 1)`） |
| `na.rm` | 若为 `TRUE`，忽略向量中的 `NA` 和 `NaN` 值 |
| `names` | 若为 `TRUE`，在结果中包含命名属性 |
| `type` | 整数类型，用于选择任意一个九种分位数算法（LCTT 译注：默认为 7） |
| `digits` | 小数精度 |
| … | 传递给其他方法的额外参数 |

`rnorm` 函数可用于生成正态分布的随机数。它可以接受要生成的观测值的数量 `n`，一个均值向量以及一个标准差向量。下面是一个计算 `rnorm` 函数生成的随机数的四分位数的示例：

```
> quantile(x <- rnorm(100))
    0%          25%          50%          75%         100%
-1.978171612 -0.746829079 -0.009440368  0.698271134  1.897942805

```

下面是生成银行年龄数据对应概率下的分位数的示例：

```
> quantile(bank$age, probs = c(0.1, 0.5, 1, 2, 5, 10, 50)/100)
0.1% 0.5%   1%   2%   5%  10%  50%
20.0 22.6 24.0 25.0 27.0 29.0 39.0

```

### IQR 函数

`IQR` 函数用于计算向量中数值的 <ruby> 四分位距 <rt>  interquartile range </rt></ruby>。其语法如下：

```
IQR(x, na.rm = FALSE, type = 7)

```

参数 `type` 指定了一个整数以选择分位数算法，该算法在 [Hyndman and Fan (1996)](https://www.amherst.edu/media/view/129116/.../Sample+Quantiles.pdf) 中进行了讨论。下面是计算银行年龄四分位距的示例：

```
> IQR(bank$age, na.rm = FALSE, type=7)
16

```

### sd 函数

`sd` 函数用来计算一组数值中的标准差。该函数接受一个 <ruby> 数值向量 <rt>  numeric vector </rt></ruby> `x` 和一个逻辑值 `na.rm`。`na.rm` 用来设置在计算时是否忽略缺失值。该函数的语法如下：

```
sd(x, na.rm = FALSE)

```

对于长度为 0 或 1 的向量，该函数返回 `NA`。下面是两个例子：

```
> sd(1:10)
3.02765

> sd(1)
NA

```

下面是计算 `age` 列标准差的示例：

```
> sd(bank$age)
10.57621

```

R 语言 stats 包中还有很多其他函数，鼓励你自行探索。

*（题图：MJ/ee6b533d-69fc-4baa-a985-cc4e499b5029）*

---

via: <https://www.opensourceforu.com/2022/08/the-functions-in-the-r-stats-package/>

作者：[Shakthi Kannan](https://www.opensourceforu.com/author/shakthi-kannan/) 选题：[lkxed](https://github.com/lkxed) 译者：[tanloong](https://github.com/tanloong) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #1040 RHEL 源代码将只放在 CentOS Stream 上

Summary:
? RHEL 源代码将只放在 CentOS Stream 上
? Reddit 用户涌入 Lemmy
? C++ 26 标准正在制定中
»
»

开源开放的联邦宇宙将会打破封闭的社交平台的垄断，并逐渐取代它们。下一个可能是youtube

来自广东广州的 Chrome Mobile 108.0|Android 12 用户

![](/data/attachment/album/202306/22/224022kzs1s5552almxccp.jpg)

![](/data/attachment/album/202306/22/224035d42eeb4u3b4664bk.jpg)

### RHEL 源代码将只放在 CentOS Stream 上

在没有宣布废弃 CentOS 之前，RHEL 的源代码会发布在 [git.centos.org](http://git.centos.org/) 上，那时候 CentOS 还是 RHEL 的下游。之后，在 CentOS Stream 成为 RHEL 的上游后，该仓库得以保留。红帽宣布，“CentOS Stream 将成为公开发布 RHEL 相关源代码的唯一仓库。对于红帽的客户和合作伙伴，源代码将继续通过红帽客户门户网站提供。”并进一步澄清，“这一变化并不意味着CentOS 项目、CentOS Stream 或 CentOS SIG 的源代码可用性有任何变化。”但这一举动引来了社区的一些人的担心，“Alma Linux，Rocky Linux，Oracle Linux 等将更难提供与 RHEL 版本 1:1 的二进制兼容的构建。”

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Red-Hat-CentOS-Stream-Sources)**
>
>
>

>
> 老王点评：我认为，从目前的声明上看，这种担心或许是多余的，我们只需要观察之后的 RHEL 和 CentOS Stream 之间差异有多大就好了。但从对这个事情的反应可以看出，社区对红帽的信任在降低。
>
>
>

![](/data/attachment/album/202306/22/224047foymkdg606ss0irv.jpg)

### Reddit 用户涌入 Lemmy

类似马斯克收购 Twitter 后 Twitter 难民涌入 Mastodon，大量 Reddit 难民涌入了 Lemmy 实例。其中，lemmy.world 实例的总用户数达到了 3.8 万。突然间，Lemmy 已经成为最大的联邦宇宙项目之一。在 Reddit 社区重新开放之后，部分用户可能会离开，但也许有更多用户会留下。

>
> **[消息来源：Lemmy](https://join-lemmy.org/news/2023-06-17_-_Update_from_Lemmy_after_the_Reddit_blackout)**
>
>
>

>
> 老王点评：这些联邦宇宙社区会得到更多用户，但 Twitter、Reddit 失血更多。
>
>
>

![](/data/attachment/album/202306/22/224105bgfgii31yfn6j42n.jpg)

### C++ 26 标准正在制定中

C++ 版本以其发布的年份命名，并遵循三年的周期。国际标准化组织 C++ 标准委员会发布了 C++ 26 的进展情况。根据其时间表，新语言功能的截止日期是 2024 年第三季度，功能冻结将在 2025 年第一季度。委员会已经通过了 40 份 “修改文件”，增加了 `_` 字符通配符，基本字符集添加了 `@`、`$` 和 ```。此外，在 C++ 26 中还支持了危险指针。危险指针是指 “只有其所有者可以设置其值，而任何数量的线程都可以读取其值” 的指针，它很难导致非常常见的内存安全问题。

>
> **[消息来源：Dev Class](https://devclass.com/2023/06/19/c-26-is-already-taking-shape-says-herb-sutter/)**
>
>
>

>
> 老王点评：在我看来，C++ 标准的演进有一定的意义，但是这并不能阻止其传统的领域被 Rust、Carbon 等新底层语言的侵蚀。
>
>
>


包含 Openbox 的 7 个极简 Linux 发行版

Summary: 在本文中，我列出了一些能够让你轻松体验 Openbox 的发行版。

在本文中，我列出了一些能够让你轻松体验 Openbox 的发行版。

![](/data/attachment/album/202306/23/093305fnn7pxxywryez6yc.jpg)

[Openbox](http://openbox.org/wiki/Main_Page) 是一款适用于 Linux 的轻量级、可配置的窗口堆叠式管理器。它支持许多标准，适用于任何桌面环境。

可能让你惊讶的是，**LXDE 和 LXQT 桌面环境都是基于 Openbox 构建的**。你甚至可以用它替换桌面环境的窗口管理器。

当然，你几乎可以在任何 Linux 发行版上安装 Openbox。不过，配置它需要时间和精力。

一个更简单的方法是使用提供 Openbox 变种的发行版。在本文中，我列出了一些能够让你轻松体验 Openbox 的发行版。

**注意：** 列表按字母顺序排列，不代表排名。

### 1、Archcraft

![archcraft live media with neofetch open in terminal](/data/attachment/album/202306/23/093358f0z08b0c8apgkksk.png)

如果你想体验 Openbox 窗口管理器，Archcraft 是一个不错的选择。不像其他发行版，Openbox 是这个发行版的默认桌面环境，所以你可以期待它的表现优秀。

它提供了一个精简且轻量的环境，只需不到 500MB 的内存即可运行，而且外观上也没有降级。其界面元素风格统一。

你可以通过简单点击来切换主题，如果你喜欢，它还提供了类似 Windows 的用户界面。

对于资深用户来说，它内置了对 AUR 和 Chaotic-AUR 的支持。与其他发行版不同的是，它提供了最佳的开箱即用体验。

>
> **[Archcraft](https://archcraft.io/)**
>
>
>

### 2、ArcolinuxB Openbox

![arcolinuxb openbox live media with neofetch open in terminal](/data/attachment/album/202306/23/093358cylo7ys5lrsnjkmr.png)

如果你想学习 Arch（Arcolinux 项目的主要目标），ArcolinuxB Openbox 是一个非常优秀的 Linux 桌面发行版。

它是 ArcolinuxB 项目的众多变种之一。你可能会遇到一些学习曲线和不完善的地方。

与 Archcraft 不同，你在这里不会看到完全统一的界面元素，可能需要进行一些调整来获得良好的体验。

>
> **[ArcolinuxB](https://arcolinuxb.com/)**
>
>
>

### 3、AV Linux MX Edition

![av linux live media with neofetch open in terminal](/data/attachment/album/202306/23/093359lwbpk08g3lgux8l0.png)

AV Linux MX Edition 是基于 MX Linux 的一个版本，使用 Openbox 作为窗口管理器。

它使用高性能的 [Liquorix 内核](https://liquorix.net/#features)，提供了音频方面爱好者所需要的低延迟。它还通过 Wine-staging 支持 Windows 音频。

如果你是一位音频专业人士并且使用 Linux，你可能想尝试一下这个发行版。对于一些用户来说，它可能显得臃肿，因为预装了许多应用程序。

>
> **[AV Linux](http://www.bandshed.net/avlinux/)**
>
>
>

### 4、Bunsenlabs Linux

![bunsenlabs live media with neofetch open in terminal](/data/attachment/album/202306/23/093359qxupx57td944p3x6.png)

BunsenLabs Linux 是一个基于 Debian 的发行版，提供了一个轻量且易于定制的 Openbox 桌面环境。该项目是 [CrunchBang Linux](https://en.wikipedia.org/wiki/CrunchBang_Linux) 的分支。

它仍然基于 Debian 10，所以在软件仓库中你将获取到较旧版本的应用程序。然而，由于包含了硬件和多媒体支持，它具有相当好的开箱即用体验，与 Debian 不同。

它的界面与 Archcraft 类似，还提供了丰富的 Conky 配置选项。

>
> **[BunsenLabs Linux](https://www.bunsenlabs.org/)**
>
>
>

### 5、Crunchbang++

![crunchbangplusplus live media with neofetch open in terminal](/data/attachment/album/202306/23/093400dijwfizuc9wpew29.png)

正如其名字所示，Crunchbang++ 是 Crunchbang 的一个分支，并尽量保持与原版接近。

对于不了解的人来说，Crunchbang 是一个几乎在十年前停止开发的流行 Openbox 发行版。

Crunchbang++ 是一个极简且轻量级的发行版。它可能会让一些用户怀旧。它基于 Debian 11，相比 Bunsenlabs 可以提供更新的软件包。

>
> **[Crunchbang++](https://crunchbangplusplus.org/)**
>
>
>

### 6、Mabox Linux

![mabox linux live media with neofetch open in terminal](/data/attachment/album/202306/23/093400cekshe0aesb3qkek.png)

Mabox Linux 是一个基于 Manjaro 的现代发行版，专注于定制化或 <ruby> 美化 <rt>  ricing </rt></ruby>。

由于使用了轻量级组件，它是一个极简且快速的系统。由于采用滚动更新机制，你还可以获得更新的软件版本。

该发行版的一些独特功能包括 Colorizer（根据壁纸更改强调颜色）、Quicktiling（用于轻松进行窗口平铺）和可定制的菜单/面板。这么多的定制化功能可能让一些极简主义者感到有些害怕。

>
> **[Mabox Linux](https://maboxlinux.org/)**
>
>
>

### 7、Sparky Linux Openbox

![sparky linux openbox live media with neofetch open in terminal](/data/attachment/album/202306/23/093401agmc5xmx08880666.png)

Sparky Linux 是一个基于 Debian 的 Linux 发行版，也提供 Openbox 作为另一种桌面环境选择。

它有一个基于 Debian Testing 的版本，对于需要更新应用程序的用户来说非常有用。它致力于为 Debian 提供开箱即用的体验，并将定制化留给用户。因此，在这里你可能不会看到太多花哨的界面效果。

>
> **[Sparky Linux](https://sparkylinux.org/)**
>
>
>

### 总结

还有其他几个 Linux 发行版可以安装 Openbox。

但在这个列表中，我列出了那些在 <ruby> 立付 <rt>  Live </rt></ruby> 介质中提供 Openbox ，其中一些还将 Openbox 作为默认桌面环境。

你最喜欢的 Openbox 发行版是哪个？你喜欢它预先定制好还是更喜欢自己进行定制？欢迎你提出建议。

*（题图：MJ/19d5a524-8229-4c14-89d1-f8287c34eeae）*

---

via: <https://itsfoss.com/openbox-distros/>

作者：[Anuj Sharma](https://itsfoss.com/author/anuj/) 选题：[lkxed](https://github.com/lkxed) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

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


Rust 基础系列 #8：编写里程碑 Rust 程序

Summary: 在 Rust 基础系列的最后一章里，让我们现在用 Rust 编写一个程序

clear and concise

在 Rust 基础系列的最后一章里，让我们现在用 Rust 编写一个程序

![](/data/attachment/album/202306/23/114333ni9fkzpykmz37zpu.jpg)

到目前为止，我们已经讲解了包括 [变量、可变性、常量](/article-15771-1.html)、[数据类型](/article-15811-1.html)、[函数](/article-15855-1.html)、[if-else 语句](/article-15896-1.html) 和 [循环](/article-15908-1.html) 在内的一些关于 Rust 编程的基础知识。

在 Rust 基础系列的最后一章里，让我们现在用 Rust 编写一个程序，使用这些主题，以便更好地理解它们在现实世界中的用途。让我们来编写一个相对简单的程序，用来从水果市场订购水果。

### 我们程序的基本结构

来让我们首先向用户问好，并告诉他们如何与程序交互。

```
fn main() {
    println!("欢迎来到水果市场！");
    println!("请选择要购买的水果。\n");

    println!("\n可以购买的水果：苹果、香蕉、橘子、芒果、葡萄");
    println!("购买完成后，请输入“quit”或“q”。\n");
}

```

### 获取用户输入

上面的代码非常简单。目前，你不知道接下来该做什么，因为你不知道用户接下来想做什么。

所以让我们添加一些代码，接受用户输入并将其存储在某个地方以便稍后解析，然后根据用户输入采取适当的操作。

```
use std::io;

fn main() {
    println!("欢迎来到水果市场！");
    println!("请选择要购买的水果。\n");

    println!("\n可以购买的水果：苹果、香蕉、橘子、芒果、葡萄");
    println!("购买完成后，请输入“quit”或“q”。\n");

    // 获取用户输入
    let mut user_input = String::new();
    io::stdin()
        .read_line(&mut user_input)
        .expect("无法读取用户输入。");
}

```

有三个新元素需要告诉你。所以让我们对这些新元素进行浅层次的探索。

#### 1. 理解 use 关键字

在这个程序的第一行，你可能已经注意到我们“使用”（哈哈！）了一个叫做 `use` 的新关键字。Rust 中的 `use` 关键字类似于 C/C++ 中的 `#include` 指令和 Python 中的 `import` 关键字。使用 `use` 关键字，我们从 Rust 标准库 `std` 中“导入”了 `io`（输入输出）模块。

>
> LCTT 译注：“使用”在原文中为“use”，与新介绍的关键字一样。
>
>
>

你可能会想知道为什么我们在可以使用 `println` 宏来将某些内容输出到标准输出时，导入 `io` 模块是必要的。Rust 的标准库有一个叫做 `prelude` 的模块，它会自动被包含。该模块包含了 Rust 程序员可能需要使用的所有常用函数，比如 `println` 宏。（你可以在 [这里](https://doc.rust-lang.org/std/prelude/index.html) 阅读更多关于 `std::prelude` 模块的内容。）

Rust 标准库 `std` 中的 `io` 模块是接受用户输入所必需的。因此，我们在程序的第一行添加了一个 `use` 语句。

#### 2. 理解 Rust 中的 String 类型

在第 11 行，我创建了一个新的可变变量 `user_input`，正如它的名字所表示的那样，它将被用来存储用户输入。但是在同一行，你可能已经注意到了一些“新的”东西（哈哈，又来了！）。

>
> LCTT 译注：“新的”在原文中为“new”，在第 11 行的代码中，原作者使用了 `String::new()` 函数，所以此处的梗与“使用”一样，原作者使用了一个在代码中用到的单词。
>
>
>

我没有使用双引号（`""`）声明一个空字符串，而是使用 `String::new()` 函数来创建一个新的空字符串。

`""` 与 `String::new()` 的区别是你将在 Rust 系列的后续文章中学习到的。现在，只需要知道，使用 `String::new()` 函数，你可以创建一个**可变**的，**位于堆上**的字符串。

如果我使用 `""` 创建了一个字符串，我将得到一个叫做“字符串切片”的东西。字符串切片的内容也位于堆上，但是字符串本身是**不可变**的。所以，即使变量本身是可变的，作为字符串存储的实际数据是不可变的，需要被**覆盖**而不是修改。

#### 3. 接受用户输入

在第 12 行，我调用了 `std::io` 的 `stdin()` 函数。如果我在程序的开头没有导入 `std::io` 模块，那么这一行将是 `std::io::stdin()` 而不是 `io::stdin()`。

`sdtin()` 函数返回一个终端的输入句柄。`read_line()` 函数抓住这个输入句柄，然后，正如它的名字所暗示的那样，读取一行输入。这个函数接受一个可变字符串的引用。所以，我传入了 `user_input` 变量，通过在它前面加上 `&mut`，使它成为一个可变引用。

>
> ⚠ `read_line()` 函数有一个 *怪癖*。这个函数在用户按下回车键之后 **停止** 读取输入。因此，这个函数也会记录换行符（`\n`），并将一个换行符存储在你传入的可变字符串变量的结尾处。
>
>
>

所以，请在处理它时要么考虑到这个换行符，要么将它删除。

### Rust 中的错误处理入门

最后，在这个链的末尾有一个 `expect()` 函数。让我们稍微偏题一下，来理解为什么要调用这个函数。

`read_line()` 函数返回一个叫做 `Result` 的枚举。我会在后面的文章中讲解 Rust 中的枚举，但是现在只需要知道，枚举在 Rust 中是非常强大的。这个 `Result` 枚举返回一个值，告诉程序员在读取用户输入时是否发生了错误。

`expect()` 函数接受这个 `Result` 枚举，并检查结果是否正常。如果没有发生错误，什么都不会发生。但是如果发生了错误，我传入的消息（`无法读取用户输入。`）将会被打印到 STDERR，*程序将会退出*。

>
> ? **所有我简要提及的新概念将会在后续的新 Rust 系列文章中讲解。**
>
>
>

现在我希望你应该已经理解了这些新概念，让我们添加更多的代码来增加程序的功能。

### 验证用户输入

我接受了用户的输入，但是我没有对其进行验证。在当前的上下文中，验证意味着用户输入了一些“命令”，我们希望能够处理这些命令。目前，这些命令有两个“类别”。

第一类用户可以输入的命令是用户希望购买的水果的名称。第二个命令表示用户想要退出程序。

我们的任务现在是确保用户输入不会偏离 *可接受的命令*。

```
use std::io;

fn main() {
    println!("欢迎来到水果市场！");
    println!("请选择要购买的水果。\n");

    println!("\n可以购买的水果：苹果、香蕉、橘子、芒果、葡萄");
    println!("购买完成后，请输入“quit”或“q”。\n");

    // 获取用户输入
    let mut user_input = String::new();
    io::stdin()
        .read_line(&mut user_input)
        .expect("无法读取用户输入。");

    // 验证用户输入
    let valid_inputs = ["苹果", "香蕉", "橘子", "芒果", "葡萄", "quit", "q"];
    user_input = user_input.trim().to_lowercase();
    let mut input_error = true;
    for input in valid_inputs {
        if input == user_input {
            input_error = false;
            break;
        }
    }
}

```

要使验证更容易，我创建了一个叫做 `valid_inputs` 的字符串切片数组（第 17 行）。这个数组包含了所有可以购买的水果的名称，以及字符串切片 `q` 和 `quit`，让用户可以传达他们是否希望退出。

用户可能不知道我们希望输入是什么样的。用户可能会输入“Apple”、“apple”或 “APPLE” 来表示他们想要购买苹果。我们的工作是正确处理这些输入。

在第 18 行，我通过调用 `trim()` 函数从 `user_input` 字符串中删除了尾部的换行符。为了处理上面提到的问题，我使用 `to_lowercase()` 函数将所有字符转换为小写，这样 “Apple”、“apple” 和 “APPLE” 都会变成 “apple”。

现在，来看第 19 行，我创建了一个名为 `input_error` 的可变布尔变量，初始值为 `true`。稍后在第 20 行，我创建了一个 `for` 循环，它遍历了 `valid_inputs` 数组的所有元素（字符串切片），并将迭代的模式存储在 `input` 变量中。

在循环内部，我检查用户输入是否等于其中一个有效字符串，如果是，我将 `input_error` 布尔值的值设置为 `false`，并跳出 `for` 循环。

### 处理无效输入

现在是时候处理无效输入了。这可以通过将一些代码移动到无限循环中来完成，如果用户给出无效输入，则 *继续* 该无限循环。

```
use std::io;

fn main() {
    println!("欢迎来到水果市场！");
    println!("请选择要购买的水果。\n");

    let valid_inputs = ["苹果", "香蕉", "橘子", "芒果", "葡萄", "quit", "q"];

    'mart: loop {
        let mut user_input = String::new();

        println!("\n可以购买的水果：苹果、香蕉、橘子、芒果、葡萄");
        println!("购买完成后，请输入“quit”或“q”。\n");

        // 读取用户输入
        io::stdin()
            .read_line(&mut user_input)
            .expect("无法读取用户输入。");
        user_input = user_input.trim().to_lowercase();

        // 验证用户输入
        let mut input_error = true;
        for input in valid_inputs {
            if input == user_input {
                input_error = false;
                break;
            }
        }

        // 处理无效输入
        if input_error {
            println!("错误: 请输入有效的输入");
            continue 'mart;
        }
    }
}

```

这里，我将一些代码移动到了循环内部，并重新组织了一下代码，以便更好地处理循环的引入。在循环内部，第 31 行，如果用户输入了一个无效的字符串，我将 `continue` `mart` 循环。

### 对用户输入做出反应

现在，所有其他的状况都已经处理好了，是时候写一些代码来让用户从水果市场购买水果了，当用户希望退出时，程序也会退出。

因为你也知道用户选择了哪种水果，所以让我们问一下他们打算购买多少，并告诉他们输入数量的格式。

```
use std::io;

fn main() {
    println!("欢迎来到水果市场！");
    println!("请选择要购买的水果。\n");

    let valid_inputs = ["苹果", "香蕉", "橘子", "芒果", "葡萄", "quit", "q"];

    'mart: loop {
        let mut user_input = String::new();
        let mut quantity = String::new();

        println!("\n可以购买的水果：苹果、香蕉、橘子、芒果、葡萄");
        println!("购买完成后，请输入“quit”或“q”。\n");

        // 读取用户输入
        io::stdin()
            .read_line(&mut user_input)
            .expect("无法读取用户输入。");
        user_input = user_input.trim().to_lowercase();

        // 验证用户输入
        let mut input_error = true;
        for input in valid_inputs {
            if input == user_input {
                input_error = false;
                break;
            }
        }

        // 处理无效输入
        if input_error {
            println!("错误: 请输入有效的输入");
            continue 'mart;
        }

        // 如果用户想要退出，就退出
        if user_input == "q" || user_input == "quit" {
            break 'mart;
        }

        // 获取数量
        println!(
            "\n你选择购买的水果是 \"{}\"。请输入以千克为单位的数量。
（1 千克 500 克的数量应该输入为 '1.5'。）",
            user_input
        );
        io::stdin()
            .read_line(&mut quantity)
            .expect("无法读取用户输入。");
    }
}

```

在第 11 行，我声明了另一个可变变量，它的值是一个空字符串，在第 48 行，我接受了用户的输入，但是这次是用户打算购买的水果的数量。

#### 解析数量

我刚刚增加了一些代码，以已知的格式接受数量，但是这些数据被存储为字符串。我需要从中提取出浮点数。幸运的是，这可以通过 `parse()` 方法来完成。

就像 `read_line()` 方法一样，`parse()` 方法返回一个 `Result` 枚举。`parse()` 方法返回 `Result` 枚举的原因可以通过我们试图实现的内容来轻松理解。

我正在接受用户的字符串，并尝试将其转换为浮点数。浮点数有两个可能的值。一个是浮点数本身，另一个是小数。

字符串可以包含字母，但是浮点数不行。所以，如果用户输入的不是浮点数和小数，`parse()` 函数将会返回一个错误。

因此，这个错误也需要处理。我们将使用 `expect()` 函数来处理这个错误。

```
use std::io;

fn main() {
    println!("欢迎来到水果市场！");
    println!("请选择要购买的水果。\n");

    let valid_inputs = ["苹果", "香蕉", "橘子", "芒果", "葡萄", "quit", "q"];

    'mart: loop {
        let mut user_input = String::new();
        let mut quantity = String::new();

        println!("\n可以购买的水果：苹果、香蕉、橘子、芒果、葡萄");
        println!("购买完成后，请输入“quit”或“q”。\n");

        // 读取用户输入
        io::stdin()
            .read_line(&mut user_input)
            .expect("无法读取用户输入。");
        user_input = user_input.trim().to_lowercase();

        // 验证用户输入
        let mut input_error = true;
        for input in valid_inputs {
            if input == user_input {
                input_error = false;
                break;
            }
        }

        // 处理无效输入
        if input_error {
            println!("错误: 请输入有效的输入");
            continue 'mart;
        }

        // 如果用户想要退出，就退出
        if user_input == "q" || user_input == "quit" {
            break 'mart;
        }

        // 获取数量
        println!(
            "\n你选择购买的水果是 \"{}\"。请输入以千克为单位的数量。
（1 千克 500 克的数量应该输入为 '1.5'。）",
            user_input
        );
        io::stdin()
            .read_line(&mut quantity)
            .expect("无法读取用户输入。");

        let quantity: f64 = quantity
            .trim()
            .parse()
            .expect("请输入有效的数量。");

    }
}

```

如你所见，我通过变量遮蔽将解析后的浮点数存储在变量 `quantity` 中。为了告诉 `parse()` 函数，我的意图是将字符串解析为 `f64`，我手动将变量 `quantity` 的类型注释为 `f64`。

现在，`parse()` 函数将会解析字符串并返回一个 `f64` 或者一个错误，`expect()` 函数将会处理这个错误。

### 计算价格 + 最后的修饰

现在我们知道了用户想要购买的水果及其数量，现在是时候进行计算了，并让用户知道结果/总价了。

为了真实起见，我将为每种水果设置两个价格。第一个价格是零售价，我们在购买少量水果时向水果供应商支付的价格。水果的第二个价格是当有人批量购买水果时支付的批发价。

批发价将会在订单数量大于被认为是批发购买的最低订单数量时确定。这个最低订单数量对于每种水果都是不同的。每种水果的价格都是每千克多少卢比。

想好了逻辑，下面是最终的程序。

```
use std::io;

const APPLE_RETAIL_PER_KG: f64 = 60.0;
const APPLE_WHOLESALE_PER_KG: f64 = 45.0;

const BANANA_RETAIL_PER_KG: f64 = 20.0;
const BANANA_WHOLESALE_PER_KG: f64 = 15.0;

const ORANGE_RETAIL_PER_KG: f64 = 100.0;
const ORANGE_WHOLESALE_PER_KG: f64 = 80.0;

const MANGO_RETAIL_PER_KG: f64 = 60.0;
const MANGO_WHOLESALE_PER_KG: f64 = 55.0;

const GRAPES_RETAIL_PER_KG: f64 = 120.0;
const GRAPES_WHOLESALE_PER_KG: f64 = 100.0;

fn main() {
    println!("欢迎来到水果市场！");
    println!("请选择要购买的水果。\n");

    let valid_inputs = ["苹果", "香蕉", "橘子", "芒果", "葡萄", "quit", "q"];

    'mart: loop {
        let mut user_input = String::new();
        let mut quantity = String::new();

        println!("\n可以购买的水果：苹果、香蕉、橘子、芒果、葡萄");
        println!("购买完成后，请输入“quit”或“q”。\n");

        // 读取用户输入
        io::stdin()
            .read_line(&mut user_input)
            .expect("无法读取用户输入。");
        user_input = user_input.trim().to_lowercase();

        // 验证用户输入
        let mut input_error = true;
        for input in valid_inputs {
            if input == user_input {
                input_error = false;
                break;
            }
        }

        // 处理无效输入
        if input_error {
            println!("错误: 请输入有效的输入");
            continue 'mart;
        }

        // 如果用户想要退出，就退出
        if user_input == "q" || user_input == "quit" {
            break 'mart;
        }

        // 获取数量
        println!(
            "\n你选择购买的水果是 \"{}\"。请输入以千克为单位的数量。
（1 千克 500 克的数量应该输入为 '1.5'。）",
            user_input
        );
        io::stdin()
            .read_line(&mut quantity)
            .expect("无法读取用户输入。");

        let quantity: f64 = quantity
            .trim()
            .parse()
            .expect("请输入有效的数量。");

        total += calc_price(quantity, user_input);
    }

    println!("\n\n总价是 {} 卢比。", total);
}

fn calc_price(quantity: f64, fruit: String) -> f64 {
    if fruit == "apple" {
        price_apple(quantity)
    } else if fruit == "banana" {
        price_banana(quantity)
    } else if fruit == "orange" {
        price_orange(quantity)
    } else if fruit == "mango" {
        price_mango(quantity)
    } else {
        price_grapes(quantity)
    }
}

fn price_apple(quantity: f64) -> f64 {
    if quantity > 7.0 {
        quantity * APPLE_WHOLESALE_PER_KG
    } else {
        quantity * APPLE_RETAIL_PER_KG
    }
}

fn price_banana(quantity: f64) -> f64 {
    if quantity > 4.0 {
        quantity * BANANA_WHOLESALE_PER_KG
    } else {
        quantity * BANANA_RETAIL_PER_KG
    }
}

fn price_orange(quantity: f64) -> f64 {
    if quantity > 3.5 {
        quantity * ORANGE_WHOLESALE_PER_KG
    } else {
        quantity * ORANGE_RETAIL_PER_KG
    }
}

fn price_mango(quantity: f64) -> f64 {
    if quantity > 5.0 {
        quantity * MANGO_WHOLESALE_PER_KG
    } else {
        quantity * MANGO_RETAIL_PER_KG
    }
}

fn price_grapes(quantity: f64) -> f64 {
    if quantity > 2.0 {
        quantity * GRAPES_WHOLESALE_PER_KG
    } else {
        quantity * GRAPES_RETAIL_PER_KG
    }
}

```

对比之前的版本，我做了一些改动……

水果的价格可能会波动，但是在我们程序的生命周期内，这些价格不会波动。所以我将每种水果的零售价和批发价存储在常量中。我将这些常量定义在 `main()` 函数之外（即全局常量），因为我不会在 `main()` 函数内计算每种水果的价格。这些常量被声明为 `f64`，因为它们将与 `quantity` 相乘，而 `quantity` 是 `f64`。记住，Rust 没有隐式类型转换 ?

当水果名称和用户想要购买的数量被存下来之后，`calc_price()` 函数被调用来计算用户指定数量的水果的价格。这个函数接受水果名称和数量作为参数，并将价格作为 `f64` 返回。

当你看到 `calc_price()` 函数的内部时，你会发现它是许多人所说的包装函数。它被称为包装函数，因为它调用其他函数来完成它的脏活。

因为每种水果都有不同的最低订单数量，才能被认为是批发购买，为了确保代码在未来可以轻松维护，每种水果都有单独的函数负责计算价格。

所以，`calc_price()` 函数所做的就是确定用户选择了哪种水果，并调用相应的函数来计算所选水果的价格。这些水果特定的函数只接受一个参数：数量。这些水果特定的函数将价格作为 `f64` 返回。

现在，`price_*()` 函数只做一件事。它们检查订单数量是否大于被认为是批发购买的最低订单数量。如果是这样，`quantity` 将会乘以水果的每千克批发价格。否则，`quantity` 将会乘以水果的每千克零售价格。

由于乘法行末尾没有分号，所以函数返回乘积。

如果你仔细看看 `calc_price()` 函数中水果特定函数的函数调用，这些函数调用在末尾没有分号。这意味着，`price_*()` 函数返回的值将会被 `calc_price()` 函数返回给它的调用者。

而且 `calc_price()` 函数只有一个调用者。这个调用者在 `mart` 循环的末尾，这个调用者使用这个函数返回的值来增加 `total` 的值。

最终，当 `mart` 循环结束（当用户输入 `q` 或 `quit` 时），存储在变量 `total` 中的值将会被打印到屏幕上，并且用户将会被告知他/她需要支付的价格。

### 总结

这篇文章中，我使用了之前讲解的 Rust 编程语言的所有主题来创建一个简单的程序，这个程序仍然在某种程度上展示了一个现实世界的问题。

现在，我写的代码肯定可以用一种更符合编程习惯的方式来写，这种方式最好地使用了 Rust 的喜爱特性，但是我还没有讲到它们！

所以，敬请关注后续的 **将 Rust 带入下一个层次** 系列，并学习更多 Rust 编程语言的内容！

Rust 基础系列到此结束。欢迎你的反馈。

*（题图：MJ/6d486f23-e6fe-4bef-a28d-df067ef2ec06）*

---

via: <https://itsfoss.com/milestone-rust-program/>

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

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


硬核观察 #1041 AlmaLinux 确认受到 RHEL 源代码发布变化影响

Summary:
? AlmaLinux 确认受到 RHEL 源代码发布变化影响
? 哈佛给计算机学生们配备了一位聊天机器人老师
? E3 或许再也不会举办
»
»

对于哈佛的那条新闻的评价有个句子是不是少一字

“老王点评：我认为哈佛大学走在了正确的道路，拥抱 AI，而不是让 AI 替代人类，让 AI 帮助学习，而是让学生抄袭 AI 的作业。”

是不是应该改成：

“老王点评：我认为哈佛大学走在了正确的道路，拥抱 AI，而不是让 AI 替代人类，让 AI 帮助学习，而不是让学生抄袭 AI 的作业。”

谢谢！

![](/data/attachment/album/202306/23/191852hglog9eegeeiht9e.jpg)

![](/data/attachment/album/202306/23/191905dmjamapx2ja4kxla.jpg)

### AlmaLinux 确认受到 RHEL 源代码发布变化影响

针对 [昨天](/article-15933-1.html) 红帽发布的改变 RHEL 源代码发布方式的公告，AlmaLinux 发布声明称，这将限制他们 1:1 复制 RHEL 构建的能力。因为 CentOS Stream 虽然是 RHEL 的上游，但并不总是包括 RHEL 软件包中的所有补丁和更新。想要做到完全复制，需要有 RHEL 构建版本时的源代码。而要获得该源代码，AlmaLinux 称，“不幸的是，按照我们今天的理解，红帽公司的用户界面协议表明，重新发布通过客户门户获得的资源将违反这些协议。”在短期内，他们将专注于通过跟踪 CentOS Stream 的变化和 Oracle Linux 等来为 AlmaLinux 提供安全更新。但从长远来看，他们将与其他 RHEL 下游产品和合作伙伴合作，寻找一条合适的发展道路。

>
> **[消息来源：AlmaLinux](https://almalinux.org/blog/impact-of-rhel-changes/)**
>
>
>

>
> 老王点评：对于这件事红帽背后的动机我们就不妄自揣测了，毕竟红帽和 AlmaLinux 曾经“建立了令人难以置信的工作关系”。但事实就是，社区构建的 AlmaLinux 想要跟上 RHEL 的构建会越来越麻烦和越来越慢。所以，你怎么看呢？
>
>
>

![](/data/attachment/album/202306/23/191918j8996hl2npnjlh27.jpg)

### 哈佛给计算机学生们配备了一位聊天机器人老师

哈佛大学将为今年秋季的计算机科学导论 CS50 课程的学生配置一位聊天机器人老师。这个聊天机器人将不使用 ChatGPT 或 GitHub Copilot，因为它们“太有帮助了”。相反，哈佛大学已经开发了自己的大型语言模型 “CS50 机器人”，它将 “具有类似的精神”，但将专注于 “引导学生找到答案，而不是将答案交给他们”。

>
> **[消息来源：PCMag](https://www.pcmag.com/news/harvards-new-computer-science-teacher-is-a-chatbot)**
>
>
>

>
> 老王点评：我认为哈佛大学走在了正确的道路，拥抱 AI，而不是让 AI 替代人类，让 AI 帮助学习，而不是让学生抄袭 AI 的作业。
>
>
>

![](/data/attachment/album/202306/23/191935g9yt34c11dycd99v.jpg)

### E3 或许再也不会举办

之前，我们 [报道](/article-15682-1.html) 过，今年的 E3 2023 已经取消，这本应是 2019 年后的第一次 E3 线下盛会。现在，E3 已经取消了 2024 年和 2025 年在洛杉矶的活动。这表明有些事情阻碍了 E3 的回归，或者其组织者正在考虑将其迁出洛杉矶。

>
> **[消息来源：The Verge](https://www.theverge.com/2023/6/22/23770393/e3-2024-2025-canceled-la-tourism)**
>
>
>

>
> 老王点评：一场大流行，改变了很多。很多事情再也回不到过去了。
>
>
>


Linux 中的模糊文件搜索

![](/data/attachment/album/202306/24/001013mc7chh224c7uls8h.jpg)

>
> 像 fzf 和 fzy 这样的现代工具将 Linux 终端中的文件搜索提升到了一个新的水平。
>
>
>

在 Linux 命令行中，如何 [搜索文件](https://learnubuntu.com:443/find-files/)？你可以使用 [find 命令](https://linuxhandbook.com:443/find-command-examples/)。这是标准答案，没有问题。

通常，你键入带有搜索参数的命令，按回车键，然后它会显示搜索结果。

你可以通过模糊搜索来提升终端中的文件搜索体验。

模糊搜索是一种近似搜索算法或技术。在这种搜索中，通过名称搜索指定位置的文件，并实时显示结果给用户。

模糊搜索在网络搜索引擎中很受欢迎，用户开始输入术语后，它会开始显示与该术语相关的结果。

在本文中，我将讨论两个命令行工具，它们可以让你在 Linux 中执行模糊搜索：

* `fzf`：模糊查找工具
* `fzy`：模糊选择工具

### fzf：Linux 中的模糊查找工具

`fzf` 是一款可用于 Linux 的模糊搜索工具，你可以通过它进行交互式文件搜索。

在 Ubuntu 中安装 `fzf`，打开终端并运行以下命令：

```
sudo apt install fzf

```

虽然 `fzf` 本身可以正常工作，但最好与其他工具配合使用，以充分发挥其功能。

#### 使用 fzf

打开终端并运行：

```
fzf

```

这将打开一个 `fzf` 提示符，在当前工作目录中搜索文件。

![在终端中运行 fzf 命令](/data/attachment/album/202306/24/001037rvc2cbw43v3k2v0z.svg)

##### 为 fzf 应用边框

你可以使用 `--border` 选项为 `fzf` 应用边框，有多种边框可用，如 `rounded`（圆角）、`sharp`（尖角）等。

```
fzf --border=rounded

```

![运行带有边框选项设置为 rounded 和 sharp 的 fzf 命令](/data/attachment/album/202306/24/001037ydpbezx92ovsoza9.svg)

##### 应用背景和前景颜色

使用颜色属性，你可以为 `fzf` 设置 ANSI 颜色，可以作为背景、前景或两者都设置。

![为 fzf 应用颜色，用户指定了颜色](/data/attachment/album/202306/24/001038r6ljuk7ho0dljo7o.svg)

```
fzf --color="bg:black,fg:yellow"

```

你可以串联这些选项，使 `fzf` 在视觉上更加美观。

现在，让我展示一些 `fzf` 模糊搜索的实际用法。

#### 使用 fzf 在 Bash 历史中进行搜索

当然，Bash 历史记录中有 `CTRL+R` 的反向搜索功能。但如果你想使用 `fzf` 来获得更好的外观，可以运行以下命令：

```
history | fzf

```

![使用 fzf 模糊搜索在 bash 历史中进行搜索](/data/attachment/album/202306/24/001038rd93qq30nrrqqg33.svg)

#### 使用 fzf 结合 tree 命令

[tree 命令](https://linuxhandbook.com:443/tree-command/) 会列出文件和目录，并显示它们的层级关系。

使用 `fzf` 结合 `tree` 命令可以帮助你找到特定文件的绝对路径。

```
tree -afR /home/$USER | fzf

```

![运行 Tree 命令并将输出传递给模糊搜索](/data/attachment/album/202306/24/001038dy2iktz02f4fob4u.svg)

>
> ? 上述命令会调用 `tree` 并以递归方式列出包括隐藏文件在内的所有文件（`-a`）。同时，`-f` 选项告诉 `tree` 列出完整路径。
>
>
>

#### 在 fzf 中预览文件

有时，如果你可以获得你搜索的文件的小型预览，那会很有帮助。

幸运的是，`fzf` 提供了一个预览选项。你可以使用 `--preview` 来访问它。我在这里使用 `find` 命令使其更加有用。

```
find /home/$USER -type f | fzf --preview 'less {}'

```

在这里，当你滚动浏览结果时，它将使用 `less` 显示文本文件。

>
> ? 如果你使用其他命令如 `ls` 等，请不要使用 `-l` 等选项，因为这将显示额外的详细信息（文件权限）。这些额外的详细信息会破坏 `fzf` 预览所需的格式。在使用预览功能时，输入到 `fzf` 的应该只是文件名。
>
>
>

如果你已安装了 `bat`，也可以使用它来预览文件。

```
find /home/$USER -type f | fzf --preview 'bat --color always {}'

```

![使用 bat 作为 FZF 预览功能的文本查看器](/data/attachment/album/202306/24/001039umt7rlkzctrt7k7z.png)

对于 Ubuntu 用户，可以使用 `batcat` 来调用 `bat`。因此运行：

```
find /home/$USER -type f | fzf --preview 'batcat --color always {}'

```

>
> ? [为这些命令创建别名](https://linuxhandbook.com:443/linux-alias-command/)，这样你就不需要反复输入它们。
>
>
>

#### 从任何地方使用 fzf 进入任何目录（高级技巧）

这比以前要复杂一些。在这里，你不能直接将 `fzf` 和 `cd` 连接在一起，因为它们是不同的进程。

你可以创建一个别名并使用以下命令：

```
cd $(find /home/$USER -type d | fzf)

```

或者，你可以按照下面解释的方法进行操作。

为此，你可能需要在 `bashrc` 中添加一个函数。让我将这个函数称为 `finder`。现在请添加以下行到你的 `bashrc` 中。

```
finder() {
  local dir
  dir=$(find required/location/to/search/and/enter -type d | fzf)
  if [[ -n "$dir" ]]; then
    cd "$dir" || return
  fi
}

```

现在，你应该 [输入路径](https://itsfoss.com/change-directories/)，其中包含你要搜索并进入的目录。

例如，我已经使用 `/home/$USER` 替换了该部分，表示我要从任何位置进入我的主目录中的任何目录。

保存你的 `bashrc` 文件后，要么重启终端，要么运行以下命令：

```
source ~/.bashrc

```

之后，你可以在终端上运行 `finder` 命令，一旦找到要进入的目录，按回车键即可。

![使用 fzf 命令结合 cd 命令进入任意目录](/data/attachment/album/202306/24/001039du11z11el1u1mv1v.svg)

#### 将选择内容复制到剪贴板

到目前为止，你已经了解了如何使用 `fzf`，它提供了搜索结果或预览。

现在，如果你想要复制某个项目的位置，你不必手动执行此操作。也有相应的解决方案。

首先，确保你已经安装了 `xclip`。

```
sudo apt install xclip

```

然后像这样将其传递给 `xclip`：

```
fzf | xclip -selection clipboard

```

这将复制你按下回车键的那些行到剪贴板上。

#### 其他用途

正如我之前所说，你可以使用任何涉及大量文本，并希望交互式搜索特定内容的命令。

* `cat ~/.bashrc | fzf` - 在 Bashrc 文件中搜索
* `lsblk | fzf` - 在锁定设备列表中搜索
* `ps -aux | fzf` - 在进程列表中搜索

### 另一个选择：Fzy，模糊选择器

与 `fzf` 不同，`fzy` 是一个模糊选择器，它会根据输入提供一个菜单供你选择。

例如，如果你将 `fzy` 与 `ls` 命令一起使用，它将给你提供一个类似菜单的界面。

![使用 ls 命令的 fzy 命令](/data/attachment/album/202306/24/001039qggrh9u9euohu9oc.svg)

默认情况下，它会显示十个条目。

#### 使用 fzy 进入目录

与 `fzf` 类似，你也可以使用 `fzy` 进入当前工作目录中的目录：

```
cd $(find -type d | fzy)

```

![](/data/attachment/album/202306/24/001039ljyrmq0z1708srsr.svg)

#### 使用任何编辑器打开文件

或者使用你喜欢的编辑器打开文件：

```
nano $(find -type f | fzy)

```

![](/data/attachment/album/202306/24/001039zwwyygp1qe8cw8y3.svg)

### 附加内容：自定义文件和图像预览

下面的命令将在 **Ubuntu** 中打开一个专门的自定义提示符，用于模糊搜索，你可以通过滚动来预览文本文件。

```
find /home/$USER -type f | fzf --color="bg:black,fg:yellow" --preview 'batcat --color always {}' --preview-window=bottom

```

为了方便访问，可以在你的 `bashrc` 文件中为此创建一个别名。

或者在使用 `timg` 命令行图像查看器时，在 `fzf` 中进行图像预览并滚动。使用以下命令进行安装：

```
sudo apt install timg

```

>
> ? 请注意，图像查看器无法正确显示图像，因为这不是 `fzf` 预览的主要目的。
>
>
>

```
fzf --preview 'timg -g 200x100 {}' --preview-window=right:90

```

对于那些喜欢折腾的人，可以尝试对此部分进行优化。

### 现代化的替代方案

大多数 Linux 命令都是从 UNIX 时代继承下来的。它们虽然老旧，但功能如预期。但这并不意味着它们不能改进。

我的意思是，你不需要重新发明轮子，但你总是可以努力改进轮子。

像 `fzf` 和 `fzy` 这样的现代化工具将 Linux 终端中的文件搜索提升到了一个新的水平。以下是一些其他有趣的命令行工具。

我尝试给出了这些模糊搜索工具的一些实际示例。希望你对它们感到足够有启发性。如果你打算使用它们，请在评论中告诉我。

*（题图：MJ/d25e71fa-f24e-49be-9579-e0520a8f6e18）*

---

via: <https://itsfoss.com/fuzzy-file-search-linux/>

作者：[Sreenath](https://itsfoss.com/author/sreenath/) 选题：[lkxed](https://github.com/lkxed/) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

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


在 Ubuntu、Linux Mint 和 Windows 中升级到最新的 LibreOffice

>
> 这篇初学者指南解释了在 Ubuntu、Linux Mint 和 Windows 中升级到最新 LibreOffice 所需的步骤。
>
>
>

![LibreOffice 7.3.x Community Edition in Ubuntu 22.04 LTS Jammy Jellyfish](/data/attachment/album/202306/24/093245lrv4zerv8evsgzgq.jpg)

[LibreOffice](https://www.libreoffice.org/) 被全球数百万用户使用，是当今最流行的免费办公套件。它由电子表格程序 （Calc）、文档处理器（Writer）、演示文稿（Impress）、绘图（Draw）和数学模块组成，可帮助你完成大部分办公、商务、学术和日常工作。

由于与 DOCX、PPTX 和 XLSX 等专有文件格式兼容，LibreOffice 可以作为付费的微软 Office 套件的出色替代品。它是 Apache OpenOffice 生产力套件的一个分支，由数以千计的全球贡献者积极开发。

![LibreOffice Logo](/data/attachment/album/202306/24/093252pp1b8b6f18bt6mv6.png)

### 升级到最新的 LibreOffice

LibreOffice 改变了它的版本命名方式，不再采用"Fresh"和"Still"的概念。现在，LibreOffice 有一个**社区**版和一个推荐的**企业**版。这是因为许多企业使用带有最新功能的最新 LibreOffice 版本，这对开发工作造成了阻碍。因此，团队建议企业用户从 LibreOffice 官方合作伙伴那里获得付费支持，以获得长期支持。你可以在 [此处](https://blog.documentfoundation.org/blog/2021/02/03/libreoffice-7-1-community/) 阅读博文。

以下是当前的版本：

#### 最新的 LibreOffice 版本

* 当前的 LibreOffice 社区版本系列是 **LibreOffice 7.4.x**。
* LibreOffice 稳定推荐的商业版本是 **LibreOffice 7.3.x**。

### 在 Ubuntu、Linux Mint 和其他基于 Ubuntu 的发行版中升级到最新的 LibreOffice

[Ubuntu 22.04 LTS Jammy Jellyfish](https://www.debugpoint.com/2022/01/ubuntu-22-04-lts/) 具有 LibreOffice 7.3.x。

**Ubuntu 20.04 LTS** 目前有 LibreOffice 6.4.7，很快就会得到下一次迭代的更新。

**Ubuntu 18.04 LTS** 支持到 [2023 年 4 月](https://www.debugpoint.com/ubuntu-release-dates-wiki/)，具有 LibreOffice 6.2 版本。Linux Mint 19.x 也提供了相同的版本。你仍然可以在 Ubuntu 18.04 或 Linux Mint 19.x 中下载并安装 LibreOffice 6.3.x 版本。

坚持使用发行版提供的 LibreOffice 版本是比较明智的。此外，除非你需要最新的功能，否则不应升级。如果你喜欢尝试，你可以继续：

#### 通过 PPA

你可以使用官方 LibreOffice PPA 安装和升级到最新的版本。打开终端并在 Ubuntu 或 Linux Mint 中运行以下命令。

```
sudo add-apt-repository ppa:libreoffice/ppa

```

```
sudo apt update && sudo apt install libreoffice

```

要**降级** LibreOffice 并删除 PPA，请从终端按顺序运行以下命令。

```
sudo add-apt-repository --remove ppa:libreoffice/ppa

```

```
sudo apt install ppa-purge && sudo ppa-purge ppa:libreoffice/ppa

```

#### 通过 Snap

你也可以选择通过下面的选项用 Snap 安装最新的LibreOffice。[Snap 包](https://www.debugpoint.com/2016/07/how-to-install-and-use-snap-packages-in-ubuntu/) 可以作为独立包在受支持的 Linux 发行版中使用。因此，你可以保留现有的 LibreOffice 安装并仍然运行最新的 Snap 版本。

请记住，从技术上讲，你可以使用一个 Snap 版本并行运行两个版本的 LibreOffice。但是，请确保可能存在轻微的文件关联问题和其他问题。这也适用于 Flatpak。

>
> **[用 Snap 下载 LibreOffice](https://snapcraft.io/libreoffice)**
>
>
>

#### 通过 Flatpak

Flatpak 是另一种方式，你可以通过它获得最新的 LibreOffice 以及发行版提供的版本。你可以[安装 Flatpak](https://www.debugpoint.com/2018/07/how-to-install-flatpak-apps-ubuntu-linux/) 并通过以下链接下载 LibreOffice。

>
> **[用 Flatpak 下载 LibreOffice](https://flathub.org/apps/details/org.libreoffice.LibreOffice)**
>
>
>

#### Windows 升级

对于 Windows，你不能直接从现有安装升级。你可以从 [本页](https://www.libreoffice.org/download/download/) 下载最新的 LibreOffice 并进行安装。在安装过程中，你现有的版本将被卸载。

### 升级故障排除

如果升级后遇到任何问题或系统不稳定，最好进行全新安装。因此，你可以从 [此链接](https://www.libreoffice.org/download/download/) 下载最新版本并进行安装。如果你使用的是 Ubuntu 或 Linux Mint，请不要忘记在安装最新版本之前先删除现有版本。

最后，如果你在 Ubuntu Linux 和其他操作系统中升级到最新的 LibreOffice 时遇到问题，请在下方发表评论。

---

via: <https://www.debugpoint.com/libreoffice-upgrade-update-latest/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #1042 人工智能工件需要新的开源许可证

Summary:
? 人工智能工件需要新的开源许可证
? 安卓的紧急呼叫打爆英国 999 紧急电话
? 新车质量因使用更多新技术而下降
»
»

还好中国有110 119 120三个号，按五下还得让你选

来自四川泸州的 Chrome Mobile 114.0|Android 13 用户

IOS很早就有这功能了。需要在“设置”-“SOS紧急联络”里设置紧急情况下联络人的号码。可能苹果的质量好点，至今没有误操作。

![](/data/attachment/album/202306/24/140136ggsjgrmjkwkhtndj.jpg)

![](/data/attachment/album/202306/24/140150b6aha2fzqx4vqh4n.jpg)

### 人工智能工件需要新的开源许可证

上世纪七八十年代，由于自由软件运动的兴起，从版权法中衍生出来了自由及开源软件许可证，护航了自由及开源软件的蓬勃发展。人工智能诞生于开源软件，像 TensorFlow、PyTorch 这样的人工智能程序在其开源许可下运行良好。但新的人工智能工件，如数据集、模型、权重等并不完全适用于传统的版权模式。就像对 GitHub Copilot 输出的代码建议的起诉案，相信对用于训练人工智能违例使用各种训练素材的起诉会越来越多。甚至，会有像专利巨魔一样的许可证巨魔出现。开源倡议（OSI）和许多开源和人工智能领导人正在努力将人工智能和开源许可证以对两者都有意义的方式结合起来。

>
> **[消息来源：The Register](https://www.theregister.com/2023/06/23/open_source_licenses_ai)**
>
>
>

>
> 老王点评：人工智能崛起的太快，一年前还没什么人谈论人工智能，以至于很多事情都来不及做好准备。所以，现在需要一个像当年的自由软件宣言一样的提纲挈领的倡议出现，以及在这个基础上建立的不同的许可证，才能真正为人工智能的发展铺平道路。
>
>
>

![](/data/attachment/album/202306/24/140205mr2dhls5xr31k256.jpg)

### 安卓的紧急呼叫打爆英国 999 紧急电话

安卓 12 系统为紧急服务增加了一个简单的功能：只要连按五次电源键，你的手机就会为你拨打紧急服务。当手机放在你的口袋里，或者你有一个不正常的电源按钮时，这显然很容易意外地做到。英国警方称，“所有紧急服务机构目前都在经历创纪录的 999 电话量”。有趣的是，带有这个功能的安卓 12 是在一年半前推出的，但直到现在才逐步普及到足够多的设备上。从那时起，就有源源不断的帖子提醒人们注意这个问题。在补丁出来之前，谷歌目前的建议是关闭该功能。

>
> **[消息来源：Ars Technica](https://arstechnica.com/gadgets/2023/06/uk-police-blame-android-for-record-number-of-false-emergency-calls/)**
>
>
>

>
> 老王点评：这又是一个产品经理想当然的功能。
>
>
>

![](/data/attachment/album/202306/24/140224smi14m4iikgmei6i.jpg)

### 新车质量因使用更多新技术而下降

据研究，在美国销售的新车的质量正在下降，因为越来越多地使用了新技术和某些零件的制造质量下降等因素使这些车型更有“问题”。报告说，在过去两年中，每 100 辆车的问题数（PP100）上升了 30。特斯拉的 PP100 质量评级，同比增加了 31，到 2023 年达到了 257。新车提供的电子触摸式设计的门把手也成为了一个问题，在 10 个问题最多的车型中，有 7 个是电池电动车。

>
> **[消息来源：路透社](https://www.reuters.com/business/autos-transportation/quality-new-vehicles-us-declining-more-tech-use-study-shows-2023-06-22/)**
>
>
>

>
> 老王点评：电动车是有很多先进的地方，但是堆砌不成熟的新技术往往是造成崩溃的原因。这有点像一个刚刚学会使用新框架的开发者，喜欢利用各种新功能来开发软件，但是往往出现一些问题。
>
>
>


10 个最好的 Xfce 桌面环境的 Linux 发行版

Summary: 一份新鲜的最佳 Linux 发行版清单，提供轻量级的 Xfce 桌面环境。

manjaro的图片搞错了？没有openSUSE？

没有搞错~

那么大的GNOME42.2 确定没有搞错？

Zorin呢？

一份新鲜的最佳 Linux 发行版清单，提供轻量级的 Xfce 桌面环境。

![](/data/attachment/album/202306/25/164510wrdmph4d8n6d0str.jpg)

>
> 一份新鲜的最佳 Linux 发行版清单，提供轻量级的 Xfce 桌面环境。
>
>
>

Xfce 是一个以速度、性能和资源效率为重点的轻量级桌面环境。它在不牺牲功能的情况下，提供了一个干净直观的用户界面。它采用了经过时间验证的、传统的图标和菜单驱动的用户界面，对提高生产力非常有效。此外，Xfce 还允许用户根据自己的偏好进行个性化设置。

许多 Linux 发行版都将 Xfce 作为其主打桌面环境，并进行了各种调整和定制。如果你喜欢 Xfce 并希望将其用于日常驱动程序，可以查看以下发行版的清单。

排名仅基于我们的推荐和各个发行版的新鲜度。

### 带有 Xfce 桌面环境的最佳 Linux 发行版

#### 默认带有 Xfce 的 Debian

Debian Linux 以其稳定性和可靠性而闻名，提供了 Xfce 作为默认的桌面环境。当你安装 Debian 桌面的 ISO 时，如果没有选择特定环境，它会安装 Xfce。

Debian 和 Xfce 的强大组合提供了稳定性、安全性和广泛的软件仓库，非常适合各类用户。无论你是寻找可靠的桌面操作系统还是稳定的服务器平台，Debian 和 Xfce 都提供了用户友好的体验，可以根据你的具体需求进行定制。

![Debian 12 Bookworm Desktop (Xfce)](/data/attachment/album/202306/25/164739f1wd6xdvydqliqqb.jpg)

如果你不喜欢 Ubuntu，但想要在 APT 生态系统中使用 Xfce，你可以考虑使用带有 Xfce 的 Debian Linux。这将是一个理想的组合，适用于高效的日常使用发行版。最后，你将能够通过此变体体验原始的 Xfce 桌面环境。

你可以从下面的页面下载 Debian Xfce ISO 文件。

>
> **[下载带有 Xfce 桌面环境的 Debian](https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/)**
>
>
>

#### Linux Mint Xfce 版本

如果你是 Linux Mint 的粉丝，希望使用 Xfce 桌面环境，那么你应该尝试它的 Xfce 版本。尽管 Mint 的主打的是 Cinnamon 桌面，但 Xfce 版也同样出色。

Linux Mint Xfce 版本引入了许多很酷的 Mint 应用程序（Xapps），使 Xfce 桌面对你来说更具生产力。内置的自定义和主题也让它在外观上优于默认的 Xfce 感觉。

![Linux Mint with Xfce desktop](/data/attachment/album/202306/25/164755wfbt1epuawkflzbb.jpg)

此外，你还可以轻松享受顺滑的系统更新、版本升级以及许多系统级操作，只需点击几下。Linux Mint Xfce 版本提供了一个顺滑且愉悦的计算体验，可能是最稳定且易于使用的 Xfce 发行版。

你可以通过以下链接下载 Linux Mint Xfce ISO。

>
> **[下载 Linux Mint Xfce Edition](https://linuxmint.com/download.php)**
>
>
>

#### MX Linux

MX Linux 是一款受欢迎且可能是最受关注的新兴发行版，因其多样性和简单性而受到许多用户的关注。它基于 Debian 的稳定版本，并配备了定制的 Xfce 桌面环境。

在其核心部分，MX Linux 是没有 systemd 的。因此，你可以轻松使用这个超快的发行版在旧硬件上运行。MX Linux 还提供了 “MX 工具”，简化了在桌面上执行各种任务的过程。这些工具涵盖了系统管理、硬件设置和软件包管理等多个功能，使用户能够轻松定制自己的体验。

![MX Linux 21.3 运行 Xfce 4.18](/data/attachment/album/202306/25/164810f5eb2glll7brtg99.jpg)

以下是 MX Linux 成为此列表中值得考虑的一个产品的一些关键原因：

* 基于 Debian 的稳定版本
* Xfce 桌面环境，并提供 Fluxbox 选项
* 无 systemd
* 出色的性能和稳定性
* 可访问广泛的软件仓库
* 方便定制的 MX 工具

>
> **[下载 MX Linux](https://mxlinux.org/download-links/)**
>
>
>

#### Fedora Xfce 版本

如果你想要基于 Fedora 的 Xfce 桌面环境，那么你的选择相对有限。其中一个选择是 Fedora Xfce 版本，它带来了最新的软件包和升级。Fedora Xfce 通常每年两次提供最新版本的 Xfce 桌面环境。此外，Fedora Linux 带来了最新的技术升级和软件包，使其成为基于 Xfce 的发行版的最佳选择。

![Fedora Linux 中的 Xfce](/data/attachment/album/202306/25/164823itq2gzjhqqu0jh55.jpg)

Fedora Linux 中的 Xfce 桌面环境是其原装版本，没有任何定制。因此，你可以根据自己的喜好和需求 [自定义 Xfce 桌面环境](https://www.debugpoint.com/customize-xfce-modern-look-2020-edition/)。此外，Fedora Linux 提供了一个广泛的软件仓库，提供各种应用程序、库和开发工具。

你可以从以下页面下载 Fedora Xfce 版本。

>
> **[下载 Fedora Xfce 版本（种子文件）](https://torrent.fedoraproject.org/)**
>
>
>

#### Xubuntu

Xubuntu 是将受欢迎的 Xfce 桌面环境与 Ubuntu 操作系统集成在一起的 Linux 发行版。它为用户提供了轻量级、高效的计算体验，并融入了熟悉的 Ubuntu 生态系统。Xubuntu 专注于 Xfce 桌面环境，能够实现快速响应的用户界面，并节省系统资源。

![Xubuntu 23.04 桌面](/data/attachment/album/202306/25/164843dz2ln2btlyac1v1j.jpg)

然而，Xubuntu 遵循 Ubuntu 的基础软件包，其中包括 Snap 和其他 Ubuntu 桌面应用程序。如果你能接受这些，那么 Xubuntu 是一个稳定的基于 Xfce 的发行版的绝佳选择。

你可以从以下页面下载 Xubuntu。

>
> **[下载 Xubuntu](https://xubuntu.org/download/)**
>
>
>

#### EndeavourOS

EndeavourOS 是这个列表中第一个基于 Arch Linux 的 Xfce 发行版。三年前，一个小团队的贡献者们开始了 EndeavourOS，以继承已停止的 Antergos 项目。从那时起，EndeavourOS 因其简便的安装、用户体验和功能而变得受欢迎。

尽管还有其他几个桌面环境可用，但 EndeavourOS 默认配备 Xfce 桌面环境。它的 Xfce 桌面环境经过了轻微的定制，这个基于 Arch Linux 的发行版提供了几乎原汁原味的 Xfce 桌面环境。

![EndeavourOS with Xfce desktop](/data/attachment/album/202306/25/164903ub09mjklmedc9vbb.jpg)

如果你曾经尝试过 EndeavourOS，你一定会“感受”到作为 Arch Linux 发行版，对于终端用户来说，执行任务有多么地“轻松”。这个发行版的座右铭是成为一款“面向大众”的 Arch Linux 通用目的发行版，摒弃了新用户对 Arch Linux 安装的恐惧和使用 Arch 的优越感。

EndeavourOS 是其他提供 Xfce 和 Arch Linux 的发行版中最好的选择。你可以从以下页面下载 EndeavourOS。

>
> **[下载 EndeavourOS](https://endeavouros.com/latest-release/)**
>
>
>

#### Linux Lite

Linux Lite 6.0，又名 Linux Lite 操作系统，基于 Ubuntu 并遵循其 LTS（长期支持）生命周期。这意味着在 Ubuntu Linux 发布后的五年内，你将获得类似的发布时间表和安全更新。轻量级桌面环境 Xfce 是其主要且唯一的桌面环境。Linux Lite 操作系统主要针对希望开始他们的 Linux 之旅的 Windows 用户。因此，你可以将其视为一个“桥梁” Linux 发行版。

![Linux Lite 6 Xfce 桌面](/data/attachment/album/202306/25/164930s85yvr5x15r59lxz.jpg)

它提供的 Xfce 桌面环境经过轻微的主题、壁纸和字体定制。不过，它是另一个基于 Ubuntu 的带有 Xfce 的发行版。你可以试试看。

你也可以阅读有关 [Linux Lite 评论](https://www.debugpoint.com:443/?s=linux+lite+review) 中有关其性能和其他方面的内容。

>
> **[下载 Linux Lite](https://www.linuxliteos.com/download.php)**
>
>
>

#### Manjaro Xfce

Manjaro Linux 是一款著名且经受时间考验的发行版，将 Arch Linux 带给了广大用户。它经过精心设计，旨在打破“Arch Linux 很难”的迷思。此外，一旦开始使用，你不会感觉到它是一个 Arch Linux 发行版。它可能感觉更像是基于 Debian 或 Fedora 的发行版。

尽管 Manjaro Linux 也提供了其他桌面环境，如 KDE Plasma，但它的 Xfce 变体也是以基于 Arch Linux 核心为基础设计的。如果你需要另一款基于 Arch Linux 的带有 Xfce 的发行版，可以尝试它。

你可以在我发布的 [多篇点评](https://www.debugpoint.com:443/?s=endeavouros) 中了解更多关于这个发行版的信息。

![Manjaro Linux 21.3 GNOME 桌面](/data/attachment/album/202306/25/164939meeuhr9ohh4ohu44.jpg)

>
> **[下载 Manjaro Linux](https://manjaro.org/download/)**
>
>
>

#### Peppermint OS

接下来是 Peppermint OS，这是一个基于 Debian 稳定版的发行版，非常适合日常使用。它包括预安装的应用程序，帮助你快速上手，并带有定制的 Xfce 桌面环境。之前，Peppermint OS 使用的是 LXDE，但最近切换到了 Xfce。

![Peppermint 2022-02-02 桌面](/data/attachment/album/202306/25/164947evm4lu38v448o8z6.jpg)

除了基于 Debian 之外，Peppermint OS 还具有两个关键应用程序：Peppermint Welcome 应用程序为新用户提供有关发行版的基本概述；另一个应用程序，Peppermint Hub，提供了一些快捷方式，用于管理你的系统，比如更改主题和从软件仓库下载软件。如果你是 Peppermint OS 的新用户，Peppermint Hub 可以从一个便捷位置处理大多数系统管理任务。

你可以尝试一下，但是 Xfce 桌面体验与本列表中的第一个发行版相同。

>
> **[下载 Peppermint OS](https://peppermintos.com/)**
>
>
>

#### Kali Linux

Kali Linux 是网络安全行业中广为人知的发行版，它基于 Debian 的测试分支，在这个列表中它是一个必不可少的选项。尽管它是针对某个特定领域的，但默认的 Xfce 桌面环境使它成为这个列表中的另一个候选项。

Kali Linux 配备了各种专门用于渗透测试、漏洞评估和数字取证的工具。这些工具包括密码破解、网络扫描和无线攻击，使其成为评估和保护系统的理想解决方案。

![Kali Linux with Xfce Desktop Environment](/data/attachment/album/202306/25/164956gk24535vbuztullz.jpg)

它的 Xfce 桌面环境经过大量定制，使其成为外观出色的发行版之一。但是，它面向的是专门的用例。因此，你应该只将 Kali 用于那些特定功能。

>
> **[下载 Kali Linux](https://www.kali.org/get-kali/)**
>
>
>

### 对于你来说哪个是最好的？

嗯，这要取决于你的个人喜好和使用场景。如果你不确定，我建议你尝试 Linux Mint Xfce 或 MX Linux。它们应适用于各种用途。

如果你需要 Fedora 或 Arch Linux 基础，可以尝试 Fedora Xfce 或 EndeavourOS。

其余的发行版可能适用于需要 Ubuntu 或 Debian 基础的特定用例。

### 结论

总之，我们介绍了几个针对 Xfce 桌面环境进行优化的优秀 Linux 发行版。无论你是初学者还是高级用户，这些发行版都为你的计算需求提供了轻量、高效和可定制的平台。每个发行版都具有独特的功能和优势。

希望你能找到适合你的喜爱的基于 Xfce 的发行版！

*（题图：MJ/a1b83f34-f5c2-43cd-aeb8-9f614c5dd1aa）*

---

via: <https://www.debugpoint.com/best-xfce-distributions/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed/) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

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


如何在 Kubernetes 集群上安装 Ansible AWX

![](/data/attachment/album/202306/25/172630f134fo6cg5gcodu4.jpg)

>
> 在本文中，我们将逐步向你展示如何在 Kubernetes（k8s）集群上安装 Ansible AWX。
>
>
>

Ansible AWX 是一个强大的开源工具，用于管理和自动化 IT 基础设施。AWX 为 Ansible 提供图形用户界面，使你可以轻松创建、安排和运行 Ansible <ruby> 剧本 <rt>  Playbook </rt></ruby>。

另一方面，Kubernetes 是一种流行的容器编排平台，广泛用于部署和管理容器化应用。

先决条件：

* Kubernetes 集群
* Kubectl
* 具有 sudo 权限和集群管理员权限的普通用户
* 互联网连接

### 步骤 1：安装 Helm

如果你的系统上安装了 Helm，则在命令下运行以进行安装，

```
$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod +x get_helm.sh
$ ./get_helm.sh
$ helm version

```

![Install-helm-linux-command-line](/data/attachment/album/202306/25/173004ydhfhw6he7f7y7c3.jpg)

### 步骤 2：安装 AWX chart

在 Kubernetes 上安装 AWX 的最简单方法是使用 AWX Helm “<ruby> 海图 <rt>  chart </rt></ruby>”。因此，要通过 “海图” 安装 AWX，首先使用以下 `helm` 命令添加仓库。（LCTT 译注：Kubernetes 生态中大量使用了和航海有关的比喻，因此本文在翻译时也采用了这些比喻）

```
$ helm repo add awx-operator https://ansible.github.io/awx-operator/
"awx-operator" has been added to your repositories
$

```

注意：如果你之前已经添加过此仓库，请在命令下运行以获取最新版本的软件包。

```
$ helm repo update

```

要通过 Helm 安装 awx-operator，请运行:

```
$ helm install ansible-awx-operator awx-operator/awx-operator -n awx --create-namespace

```

![helm-install-awx-operator-kubernetes](/data/attachment/album/202306/25/173022vo84mjx3imdjd84m.jpg)

这将下载 AWX 海图并将其安装在 `awx` 命名空间中的 Kubernetes 集群上。安装过程可能需要几分钟，请耐心等待。

### 步骤 3：验证 AWX 操作员安装

安装成功后，你可以通过运行以下命令来验证 AWX <ruby> 操作员 <rt>  operator </rt></ruby> 状态：

```
$ sudo kubectl get pods -n awx

```

你应该看到这样的东西：

![awx-operator-pod-status-kubectl](/data/attachment/album/202306/25/173034r44ipn354p2i43t5.jpg)

### 步骤 4： 创建 PV、PVC 并部署 AWX yaml 文件

AWX 需要 postgres <ruby> 容器荚 <rt>  pod </rt></ruby> 的持久卷。那么，让我们首先为本地卷创建一个存储类。

注意：在本文中，我使用本地文件系统作为持久卷。

```
$ vi local-storage-class.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
  namespace: awxprovisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

```

保存并关闭文件，然后运行：

```
$ kubectl create -f local-storage-class.yaml
$ kubectl get sc -n awx
NAME            PROVISIONER                    RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION
local-storage   kubernetes.io/no-provisioner   Delete          WaitForFirstConsumer   false
$

```

接下来使用以下 `pv.yaml` 文件创建持久卷（PV）：

```
$ vi pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgres-pv
  namespace: awx
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: local-storage
  local:
    path: /mnt/storage
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - k8s-worker

```

保存并退出文件。

![Postgres-pv-awx-kubernetes](/data/attachment/album/202306/25/173359dku85vqq8v1k4mxf.jpg)

重要说明：确保文件夹 `/mnt/storage` 存在于工作节点上，如果不存在，则在工作节点上使用 `mkdir` 命令创建它。在我们的例子中，工作节点是 `k8s-worker`。

执行下面的命令在 `awx` 命名空间中创建 `postgres-pv`。

```
$ kubectl create -f pv.yaml

```

成功创建 PV 后，使用 `pvc.yaml` 文件创建 PersistentVolumeClaim：

```
$ vi  pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-13-ansible-awx-postgres-13-0
  namespace: awx
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

```

![posgres-pvc-awx-kubernetes](/data/attachment/album/202306/25/173128aqq33bt6wp15vmm7.jpg)

要创建 PVC，请运行以下 `kubectl` 命令：

```
$ kubectl create -f pvc.yaml

```

使用下面的命令验证 PV 和 PVC 的状态：

```
$ kubectl get pv,pvc -n awx

```

现在，我们都准备好部署 AWX 实例了。创建一个包含以下内容的 `ansible-awx.yaml` 文件：

```
$ vi ansible-awx.yaml
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: ansible-awx
  namespace: awx
spec:
  service_type: nodeport
  postgres_storage_class: local-storage

```

![Ansible-awx-yaml-file](/data/attachment/album/202306/25/173144bk6wj8k3bbr8j6rb.jpg)

保存并关闭文件。

执行以下 `kubectl` 命令来部署 awx 实例：

```
$ kubectl create -f ansible-awx.yaml

```

等待几分钟，然后检查 `awx` 命名空间中的容器荚状态。

```
$ kubectl get pods -n awx

```

![Ansible-AWX-Pods-Status-Kubernetes](/data/attachment/album/202306/25/173159zxo7dr7d7xtux3r1.jpg)

### 步骤 5：访问 AWX Web 界面

要访问 AWX Web 界面，你需要创建一个公开 awx-web 部署的服务：

```
$ kubectl expose deployment ansible-awx-web --name ansible-awx-web-svc --type NodePort -n awx

```

此命令将创建一个 `NodePort` 服务，该服务将 AWX Web 容器的端口映射到 Kubernetes 节点上的端口。你可以通过运行以下命令找到端口号：

```
$ kubectl get svc ansible-awx-web-svc  -n awx

```

这将输出如下内容：

```
NAME                 TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
ansible-awx-web-svc   NodePort   10.99.83.248   <none>        8052:32254/TCP   82s

```

在此示例中，Web 服务在端口 32254 上可用。

![Expose-Ansible-AWX-Web-NodePort-Kubernetes](/data/attachment/album/202306/25/173214q4m2vwv4g22em2vs.jpg)

默认情况下，admin 用户是 Web 界面的 `admin`，密码在 `<resourcename>-admin-password` 机密信息中。要检索管理员密码，请运行：

```
$ kubectl get secrets -n awx | grep -i admin-password
ansible-awx-admin-password        Opaque               1      109m
$
$ kubectl get secret ansible-awx-admin-password -o jsonpath="{.data.password}" -n awx | base64 --decode ; echo
l9mWcIOXQhSKnzZQyQQ9LZf3awDV0YMJ
$

```

你现在可以打开 Web 浏览器并进入 `http://<node-ip>:<node-port>/` 来访问 AWX Web 界面。在上面的示例中，URL 是：

```
http://192.168.1.223:3225

```

![AWX-Login-URL-Kubernetes](/data/attachment/album/202306/25/173224juuvfqfhdlevebws.jpg)

输入凭据后单击登录。

![Ansible-AWX-Web-Dashboard](/data/attachment/album/202306/25/173233xqr98skyytr8md3r.jpg)

恭喜！ 你已在 Kubernetes 上成功安装 Ansible AWX。你现在可以使用 AWX 来自动化你的 IT 基础架构，并让你作为系统管理员的生活更轻松。

*（题图：MJ/bfd354aa-2ee5-4555-98b8-ac5207cbeabe）*

---

via: <https://www.linuxtechi.com/install-ansible-awx-on-kubernetes-cluster/>

作者：[Pradeep Kumar](https://www.linuxtechi.com/author/pradeep/) 选题：[lkxed](https://github.com/lkxed/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #1043 数百万 GitHub 项目易受依赖库劫持攻击

Summary:
? 数百万 GitHub 项目易受依赖库劫持攻击
? 美国新数据显示，在家工作成为新常态
? Firewalld 2.0 发布
»
»

因为它们干的活更高级，这里更多的是低级血汗工厂没法远程工作

![](/data/attachment/album/202306/25/200220ymn18891sxlq89as.jpg)

![](/data/attachment/album/202306/25/200234zba5p2ift1ggtg5t.jpg)

### 数百万 GitHub 项目易受依赖库劫持攻击

安全专家发现，数以百万计的 GitHub 项目易受依赖库劫持攻击，攻击者可以借此发动影响大量用户的供应链攻击。GitHub 上的用户名和项目或库的名字如果改变，为了避免破坏其它项目的依赖关系，GitHub 会创建一个重定向。但如果有人用旧的名字创建了账号，那么就会导致重定向无效。GitHub 可以防御部分此类攻击，但该防御方案可以被绕过。

>
> **[消息来源：Aqua Sec](https://blog.aquasec.com/github-dataset-research-reveals-millions-potentially-vulnerable-to-repojacking)**
>
>
>

>
> 老王点评：我觉得 GitHub 应该更认真的解决这个问题，毕竟 GitHub 已经不仅仅是一个代码仓库，而是一个供应链的重要组成部分了。但从另外一个角度看，软件项目依赖这种不确定的供应链是不是也过于宽松了？
>
>
>

![](/data/attachment/album/202306/25/200248uq1nsuxgkqckpnsp.jpg)

### 美国新数据显示，在家工作成为新常态

许多在大流行期间蜷缩在家里的白领工人已经回到办公室，但没有回到办公室的人特别多。对许多人来说，远程工作似乎是一种新常态。周四公布的美国经济数据显示，在家工作似乎已经成为一种趋势，特别是对女性和受过大学教育的人而言。2022 年的数据显示，34% 的 15 岁以上的人仍然在家里工作，54% 的人拥有学士或更高的学位。而美国旧金山市长已经 [提议](https://www.cnn.com/2023/06/23/business/sf-mayor-proposes-tearing-down-westfield-mall/index.html) 将市中心荒废的购物中心改造为足球场，因为越来越多人不再回到市中心上班，旧金山的办公室空置率已达到 30 年来的最高水平。

>
> **[消息来源：MSN](https://www.msn.com/en-us/money/careers/remote-work-appears-here-to-stay-especially-for-women/ar-AA1cTTWp)**
>
>
>

>
> 老王点评：不知道为什么美国人就不回去上班了，而我们似乎都赶紧回去了。
>
>
>

![](/data/attachment/album/202306/25/200303esmtrxn1slv8nwt3.jpg)

### Firewalld 2.0 发布

开源防火墙守护程序 Firewalld 自 2011 年以来一直在开发，而两年前才达到 Firewalld 1.0 的里程碑。因此，发现 Firewalld 2.0 在今天发布有点令人惊讶。2.0 中最重要的变化解决了区域漂移的问题，即防火墙策略可能最终违反了 “数据包只进入一个区域” 的规则。此外，还增加了对 NFTables Flowtable 的支持，可以显著提高转发性能，将网络转发的 iperf 性能提高了约 59%。

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

>
> 老王点评：看起来是 Firewalld 的开发在加速，不过我更觉得它是在飙版本号。看看 Firefox、Linux 内核等开源软件的版本号，看来开源软件对版本号的谦虚传统已经被丢弃了。
>
>
>


使用开源 API 网关实现可伸缩 API

Summary: 采用 Apache APISIX 的 API 主导架构。

![](/data/attachment/album/202306/26/170002ty8ygsys4ikr6yys.jpg)

>
> 采用 Apache APISIX 的 API 主导架构。
>
>
>

API 网关是一个单一节点，提供对 [API](https://www.redhat.com/en/topics/api/what-are-application-programming-interfaces) 调用入口。网关聚合了所请求的服务，并相应传回合适的响应信息。为了令你的 API 网关有效地工作，设计一个可靠、高效且简洁地 API 至关重要。本文介绍一种设计风格，但只要你理解其中的重点内容，它就能解决你的相关问题。

### 由 API 主导的方法

API 主导的方法是将 API 置于应用程序和它们需要访问的业务能力之间的通信核心，从而在所有数字通道上一致地交付无缝功能。API 主导的连接是指使用一种可重用、且设计得当的 API 来连接数据和应用程序的方法。

### API 主导的架构

API 主导的架构是一种架构方法，它着眼于实现重用 API 的最佳方式。它能解决以下问题：

* 保护 API，使外界无法在未授权情况下访问 API
* 确保应用程序能找到正确的 API 端点
* 限制对 API 的请求次数，从而确保持续的可用性
* 支持持续集成、测试、生命周期管理、监控、运维等等
* 防止错误在栈间传播
* 对 API 的实时监测和分析
* 实现可伸缩和灵活的业务能力（例如支持 [微服务](https://www.redhat.com/en/topics/microservices/what-are-microservices?intcmp=7013a000002qLH8AAM) 架构）

### API 资源路由

实现一个 API 网关，把它作为与所有服务通信的单一入口点，意味着使用者只需要知道 URL 就能使用 API。将请求路由到相应的服务端点，并执行相应的功能是 API 网关的职责。

![Image depicting the API routing traffic.](/data/attachment/album/202306/26/170036mqoh19imifimqqiz.png)

由于客户端应用程序不需要从多个 HTTP 端点调用功能，这个办法就减少了 API 使用者的操作复杂度。对每个服务来说，也不需实现一个单独的层级去实现认证、授权、节流和速度限制。大多数API 网关，如开源的 [Apache APISIX](https://apisix.apache.org/docs/apisix/terminology/api-gateway/)，已经包含了这些核心功能。

### API 基于内容的路由

基于内容的路由机制也使用 API 网关根据请求的内容进行路由调用。例如，一个请求可能是基于 HTTP 请求的头部内容或消息体被路由，而不只基于它的目标 URI。

考虑这样一个场景：为了将负载在多个数据库实例间均分，需要对数据库进行分区。当记录总数较大，单个数据库实例难以管理负载时，常常会用这个办法。

还有一个更好的办法，就是把记录在多个数据库实例间分散开来。然后你实现多个服务，每个不同的数据库都有一个服务，把一个 API 网关作为访问所有服务的唯一入口。然后，你可以配置你的 API 网关，根据从 HTTP 头或有效载荷中获得的密钥，将调用路由到相应的服务。

![Image of the API gateway exposing a single customer.](/data/attachment/album/202306/26/170036rhc5fmahim2h0073.png)

在上面的图表中，一个 API 网关向多个客户服务暴露一个单一的 `/customers` 资源，每个服务都有对应的不同数据库。

### API 地理路由

API 地理路由解决方案根据 API 调用的来源将其路由到最近的 API 网关。为了防止地理距离导致的延迟问题（例如一个位于亚洲的客户端调用了位于北美地区的 API），你可以在多个地区部署 API 网关。对于一个 API 网关，你可以在每个区域使用不同的子域名，让应用程序基于业务逻辑选择最近的网关。因此 API 网关就提供了内部负载均衡，确保进入的请求分布于可用的实例之间。

![Image of a DNS traffic management system.](/data/attachment/album/202306/26/170037r371vbadv13v7p3x.png)

通常使用 DNS 流量管理服务和 API 网关，针对该区域的负载均衡器解析子域名，定位到距离最近的网关。

### API 聚合器

这项技术对多个服务执行操作（例如查询），并向客户端服务以单个 HTTP 响应的形式返回结果。API 聚合器使用 API 网关在服务器端代表使用者来执行这项工作，而非让客户端程序多次调用 API。

假定你有一款移动端 APP，对不同的 API 发起多次调用。这增加了客户端代码的复杂性，导致网络资源的过度使用，而且由于延迟性，用户体验也不好。网关可以接收所有需要的信息，可以要求认证和验证，并理解来自每个 API 的数据结构。它也可以传递响应的有效载荷，因此它们也会作为一个用户需要的统一负载传回移动端。

![Image of an API gateway.](/data/attachment/album/202306/26/170037hjijlfmkjjfjh74s.png)

### API 集中认证

在这种设计中，API 网关就是一个集中式认证网关。作为一个认证者，API 网关在 HTTP 请求头中查找访问凭据（例如不记名的令牌）。然后它借助于身份验证提供方执行验证凭据的业务逻辑。

![Image of a tree showing API gateway's centralized authentication.](/data/attachment/album/202306/26/170037l5n6tmuncd65z35r.png)

使用 API 网关的集中式身份验证能解决很多问题。它完全取代了应用程序中的用户管理模块，通过对来自客户端应用程序的身份验证请求的快速响应来提高性能。Apache APISIX 提供了一系列插件，支持不同的 API 网关认证方法。

![Image showing Apache ASPISIS and various plugins.](/data/attachment/album/202306/26/170038y7p78j9lt8l7eupe.png)

### API 格式转换

API 格式转换是通过同一传输方式将有效载荷从一种格式转换为另一种格式的能力。例如，你可以通过 HTTPS 从 XML/SOAP 格式转换为 JSON 格式，反之亦然。API 网关提供了支持 [REST API](https://www.redhat.com/en/topics/api/what-is-a-rest-api?intcmp=7013a000002qLH8AAM) 的功能，可以有效地进行负载和传输的转换。例如，它可以把消息队列遥测传输（MQTT）转换为 JSON 格式。

![Image depicting APISIX transfers.](/data/attachment/album/202306/26/170038mxgldvbbiy5dsqgb.png)

Apache APISIX 能够接收 HTTP 请求，对其进行代码转换，然后将其转发给 gRPC 服务。它通过 [gRPC Transcode](https://apisix.apache.org/docs/apisix/plugins/grpc-transcode/) 插件获取响应并将其以 HTTP 格式返回给客户端。

### API 的可观察性

现在，你知道 API 网关为进入各种目的地的流量提供了一个中心控制点。但它也可以是一个中心观察点，因为就监控客户端和服务器端的流量来说，它有独特的资格。为了收集监测工具所需要的数据（结构化日志、度量和跟踪），你可以对 API 网关作出调整。

Apache APISIX 提供了 [预先构建的连接器](https://apisix.apache.org/docs/apisix/plugins/prometheus/)，因此你可以跟外部监测工具结合使用。你可以利用这些连接器从你的 API 网关收集日志数据，进一步获得有用的指标，并获取完整可见的服务使用情况。

### API 缓存

API 缓存通常在网关内部实现。它可以减少对端点的调用次数，同时通过缓存上游的响应，改进了请求延迟的情况。如果网关缓存对请求资源有一个新副本，它会直接使用这个副本来响应这个请求，而不必对端点发出请求。如果缓存数据不存在，就将请求传到目标上游服务。

![Image depicting how the API gateway cache functions.](/data/attachment/album/202306/26/170039a5z1ylxt33eemt0i.png)

### API 错误处理

由于各种原因，API 服务可能会出错。在这种情况下，API 服务需要有一定的弹性，来应对可预见的错误。你也希望确保弹性机制能正常工作。弹性机制包括错误处理代码、断路器、健康检查、回退、冗余等等。新式的 API 网关支持各种常见错误处理功能，包括自动重试和超时设置。

![Image depicting some of the many mechanisms that the modern API Gatway can support.](/data/attachment/album/202306/26/170039khxgrejahdbtexgl.png)

API 网关作为一个协调器，它会根据各方面情况来决定如何管理流量、将负载均衡发送到一个健康的节点，还能快速失败。当有异常状况，它也会向你发出警示。API 网关也保证路由和其他网络级组件能协同将请求传给 API 进程。它能帮助你在早期检测出问题，并修复问题。网关的错误注入机制（类似于 Apache APISIX 使用的那种）可用于测试应用程序或微服务 API 在各种错误发生时的弹性。

### API 版本管理

版本管理是指定义和运行多个并发的 API 版本的功能。这点也很重要，因为 API 是随着时间推移不断改进的。如果能对 API 的并发版本进行管理，那么 API 使用者就可以较快地切换到新的版本。这也意味着较老的版本可以被废弃并最终退役。API 也跟其他应用程序类似，无论是开发新功能还是进行错误修复，都存在演变的过程。

![Image of using the API Gateway to implement API versioning.](/data/attachment/album/202306/26/170039rr5oa5xexae75xzx.png)

你可以使用 API 网关来实现 API 版本管理。版本管理可以是请求头，查询参数或路径。

### APISIX 的网关

如果你需要令 API 服务可伸缩，就需要使用 API 网关。Apache APISIX 提供了必要的功能，可以实现健壮的入口，它的好处是显而易见的。它遵循 API 主导的架构，并且有可能改变客户端与托管服务交互的方式。

本文经作者许可，从 [Apache APISIX](https://apisix.apache.org/blog/2022/10/27/ten-use-cases-api-gateway/) 博客改编并转载。

*（题图：MJ/f1d05345-48f5-4e3e-9c65-a2ba9105614a）*

---

via: <https://opensource.com/article/23/1/api-gateway-apache-apisix>

作者：[Bobur Umurzokov](https://opensource.com/users/iambobur) 选题：[lkxed](https://github.com/lkxed) 译者：[cool-summer-021](https://github.com/cool-summer-021) 校对：[wxy](https://github.com/wxy)

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


5 种预防开源许可违规的方法

Summary: 你必须遵守适用于重新使用的开源代码的众多开源许可证之一。

你必须遵守适用于重新使用的开源代码的众多开源许可证之一。

![](/data/attachment/album/202306/26/182415zqdgqmmwlt2qn7zu.jpg)

开发人员可以通过将开源软件集成到其代码库中，节省时间并避免重复发明轮子。然而，这也带来了严重的许可侵权风险。你必须遵守适用于重新使用的开源代码的众多开源许可证之一。如果你不这样做，你（或你所在公司）有可能因违反开源许可证条款而被起诉。即使这种诉讼并不普遍发生，它们确实存在。实际上，考虑到现在许多开源项目由希望保护其在开源社区中的投资的企业运营，这种情况在未来可能更加频繁发生。

### 1、熟悉开源许可证

了解开源许可证是防止开源许可侵权问题中最重要的一步。很容易认为所有开源许可证都施加相同的条件，或者它们都基本要求源代码的持续可用性。实际上，有数十种不同的开源许可证，它们都有着非常不同的条款。简单地认为只要你从一个开源项目获取代码，你可以随意使用它并保持源代码可访问，这是一个严重的错误。几个开源许可证的一个典型但经常被忽视的条件可能是需要向原始作者提供致谢。

### 2、记录你使用的开源内容

建立一个标准化的方法来记录你使用开源代码的情况是一个优秀的做法。导入模块或从 GitHub 粘贴代码并不难。但如果你不追踪代码来自何处以及使用了何种许可证，你可能会忘记在代码库中如何以及在哪里集成开源内容。此外，如果你在借用代码时无法证明自己遵守了有效的许可条件，那么在开源许可证发生变化时可能会产生问题。考虑在文档维基（如果有的话）中添加一个页面，列出你使用的开源代码，以避免出现这个问题。每当你包含开源组件或依赖时，至少在你自己的源代码中添加注释。

### 3、避免使用未经授权的开源组件

有时，你可能会偶然发现一个隐藏的 GitHub 存储库或其他源代码托管位置，其中包含你希望使用的代码，但没有提到任何许可指南。你可能会认为代码的创建者希望让其成为开源代码，并且你可以根据自己的意愿使用它。但这是一个危险的假设。开发人员可能会后续对代码设置特定的许可条件，并要求你遵守这些条件，这可能导致未来产生许可侵权的指控。除非你有非常充分的理由，否则避免使用缺乏明确许可限制的模糊代码。

### 4、创建自己的开源代码

将你自己的软件完全开源是减少与开源许可相关风险的一种方法。这意味着你将自动遵守任何要求保留派生源代码的开源许可条件。然而，请记住，仅仅开放你自己的代码并不能确保完全遵守许可证。你仍然需要努力确保你遵守每个许可证的规定，因为适用于你借用的代码的许可证可能与你选择的开源许可证不同。然而，你无需担心与源代码共享相关的任何条款。

### 5、自动检测开源组件

虽然在代码库内手动跟踪你如何使用开源是很好的做法，但通过使用能够自动识别开源组件和依赖项的软件，你可以降低出错的可能性。在这里，我们应该考虑两种不同类型的工具。一种是源代码组成分析（SCA）软件，它会自动扫描源代码并识别从值得信任的外部来源获取的元素。另一种是软件供应链管理解决方案，除其他功能外，还支持查找和监控应用程序堆栈中的任何开源依赖项。

*（题图：MJ/2168d466-cfc3-47de-a8a5-fc7ebaaa445f）*

---

via: <https://www.opensourceforu.com/2022/08/5-ways-to-prevent-open-source-licensing-violations/>

作者：[Laveesh Kocher](https://www.opensourceforu.com/author/laveesh-kocher/) 选题：[lkxed](https://github.com/lkxed) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

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


硬核观察 #1044 中国论文贡献度首次超越美国

Summary:
? 中国论文贡献度首次超越美国
? 英伟达最新 GPU 黑市价格翻番
? NFC 将变得更强
»
»

![](/data/attachment/album/202306/26/195854blhsafo7b7ahlv5o.jpg)

![](/data/attachment/album/202306/26/195905cckasgcvtrscsia8.jpg)

### 中国论文贡献度首次超越美国

《自然》杂志分析了 2022 年全球知名科学期刊论文的各国贡献度，结果显示，中国首次超越美国登上榜首。该排行榜依据论文作者及所属机构的“自然指数”汇总进行排名。对于《自然》、《科学》等 82 种期刊的自然科学领域论文，计算作者所属机构所在国的比例，把总和作为贡献度进行比较，结果显示中国排名第一。美国、德国、英国、日本等分列第二到第五。而从包括大学在内的研究机构来看，前十有六家来自中国，中国科学院居首。

>
> **[消息来源：《自然》](https://www.nature.com/articles/d41586-023-01868-3)**
>
>
>

>
> 老王点评：看起来可喜可贺，但是我们的基础科学研究还不够强，还需要继续努力。
>
>
>

![](/data/attachment/album/202306/26/195933cdyyklguwzkqyzwl.jpg)

### 英伟达最新 GPU 黑市价格翻番

去年，美国商务部阻止了包括英伟达和 AMD 在内的美国顶级硬件公司向中国和俄罗斯出售其最先进的芯片。其中，英伟达的 A100 和 H100 GPU 属于出口管制的对象。这导致这些芯片在黑市的价格达到了 2 万美元，比正常价格高一倍，并且没有保修和支持。

>
> **[消息来源：The Register](https://www.theregister.com/2023/06/26/us_export_ban_of_nvidias/)**
>
>
>

>
> 老王点评：现在 AI 对 GPU 的需求非常迫切，这可比挖矿那时候对 GPU 的需求更紧迫。
>
>
>

![](/data/attachment/album/202306/26/195917figi1ds19gp9y1t9.jpg)

### NFC 将变得更强

负责制定近场通讯规范的 NFC 论坛公布了到 2028 年的主要计划和研究工作。主要的五个方面包括：NFC 无线充电的功率将从 1 瓦提升到 3 瓦；连接范围将从 5 毫米提升四到六倍；支持多用途轻触；使支持 NFC 手机具有 POS 功能；能够分享其成分和产品回收方式的数据。

>
> **[消息来源：The Register](https://www.theregister.com/2023/06/26/nfc_forum_innovation_roadmap/)**
>
>
>

>
> 老王点评：虽然要几年才能落地，但我总觉得 NFC 变强也带来更多风险，比如近场通讯的距离变得更远，盗刷风险就大了。
>
>
>


弃 Ubuntu 转 Manjaro 一周后的使用体验

Summary: 最近我决定在实体机上切换到 Arch Linux

新手的话还是别用arch的好，尤其是当你是一个很懒只想躺平的人的话

hold不住arch一样hold不住manjaro，能hold住arch的不需要manjaro。倒是装endeavour能省不少事，又能像用arch一样用linux。manjaro到底投了多少广宣费。

感觉manjaro还可以啊！我轻办公，已经manjaro单系统半年多了，没出过啥问题啊

来自河南郑州的 Chrome Mobile 111.0|Android 12 用户

manjaro比arch更容易挂. 软件库落后一个小版本.大问题可能碰的少一点 小问题非常多.<br />
安装的时候省时间 出问题找起来更麻烦.manjaro出问题好像还不能直接用arch-chroot

无聊，十年后继续争论那个linux发行版好用吧

总有人想装逼学不来 Arch 就用 Manjaro，还给自己洗脑自己用的是 Arch。

但是 Manjaro 不是 Arch，Manjaro 有自己的独立软件源，Manajro 中的软件版本也落后于 Arch 几周， 都与 Arch 不兼容了，很多问题的解决方案并不能套用。

还有 AUR = Arch User Repo，是为 Arch 服务的，Manjaro 虽然能用，但也容易出问题。

这倒不是 Arch 用户自认为高人一等。

Manjaro 這個分三個 channel 延遲兩週的做法，原因出於兩點他們處理打包方面非常存疑的做法

- 他們想要自己打包一部分非常核心的包，包括 glibc 內核 驅動 systemd

- 他們不想重新打整個發行版所有包，想直接從 Arch 拿二進制來用。

這兩個做法單獨只做一個沒啥事，放一起做就很容易導致他們自己打包的核心包破壞了二進制兼容，以至於他們從 Arch 拿的二進制包壞掉。所以他們延遲兩週，並不是在測試 Arch 包打包本身的質量，而是在測試他們拿來 Arch 的包和他們自己亂改的核心包之間的兼容性。Arch

Arch 本身有一套機制保證 Arch 打包放出來的時候是測試好相互兼容的，被他們替換掉幾個核心包之後就不一定兼容了，他們也沒有渠道涉足 Arch 內部打包機制，從 Arch 組織內部了解什麼時候放出包之類的信息。綜合這些情況，對他們來說合理的做法就是延遲一陣子讓他們自己的人測試一下。

所以作為證據你看他們的打包者開發者很少會向 Arch 上游反饋測試打包遇到的問題…因為 manjaro unstable 和 manjaro testing 會遇到的問題大部分都是他們自己造成的問題而不是 Arch 的問題。

要是他們誠實地把這個情況傳達給他們用戶的話我不責怪他們。Ar

Arch整個滾動發布的生態也不利於下游發行版。Debian 這種上游打包時可以約定版本兼容性的範圍，可以鎖 abi ，Arch 打包本身就不考慮這些，作為Arch下游就的確很難操作。我反感 manjaro 的點在於他們把這種難看的做法宣傳成他們的優勢，還為了這個看起來是優勢故意去抹黑 Arch 作為上游的打包質量…做法就很難看了。<br />
—— farseerfc

有manjaro-chroot

来自山东济南的 Chrome Mobile 114.0|Android 13 用户

看下小尾巴

对manjaro的反感主要来自于那个宣扬开源功利主义，把白嫖说的多高大上的lulinux。以及B乎。其实折腾折腾，Manjaro也不是不能用，但想不折腾是不存在的。对于我来说，Manjaro和Arch的一个区别是，用Manjaro我需要先去掉它那些画蛇添足的默认配置，然后像Arch一样使用。但Endeavour没这个问题。最近在用去年自己做的LFS，也挺稳定，没出问题，出问题也是我的问题。已经不怎么挑发行版，除非一些其他原因。

所以尾巴是Windows，其实Windows也不是不能用。感觉以前对Linux的情怀已经没有了。特别是近期RH事件，更是没情怀了。什么技术细节开放，真要研究，又不是不能IDA。已经不挑发行版了。

我能回复吗？

能~

最近我决定在实体机上切换到 Arch Linux

![](/data/attachment/album/202306/27/110506aou1bw5i6prwpm6m.jpg)

通常，我用的是基于 Ubuntu 的发行版进行工作，如 Pop!\_OS、Zorin OS、Linux Mint 或 Ubuntu 本身。

它们不会干扰我的工作，同时又提供了顺滑的软件更新。更不用说，它们与我使用的英特尔-英伟达系统相容性良好。

所有的一切（可能是主观的）都能开箱即用。

然而，最近我决定在实体机上切换到 Arch Linux（我大部分时间都是在虚拟机上使用它）。

结果，我最终选择使用了 **Manjaro Linux**（一款基于 Arch 的发行版）。

### 我选择 Manjaro Linux 的原因

令我惊讶的是，即使是使用 **Arch Linux 的立付 USB**，我甚至无法解决 “nouveau DRM: core notifier timeout” 错误，更别提继续安装了。是的，我知道有向导式的 Arch Linux 安装程序，但是不论怎么样，连接的显示器都会闪烁并突出显示这个错误。

解决这个问题的最好办法是不使用我的最近刚刚升级的英伟达显卡。

*很遗憾，我更喜欢英伟达的显卡……*

AMD 的 RX 6600 XT 的价格与 RTX 3060 Ti 相当；对于 1440p 来说，购买那款显卡是没有意义的。

因此，在我这个情况下，RTX 3060 Ti 可能是问题所在。

虽然我找到了一些解决问题的方法，但是我太懒了。我只是想看看能否在不用付出太多努力的情况下体验一下 Arch Linux。

**所以，我做了以下的事情：**

下一个最佳选择就是尝试任何一个专门简化了麻烦的 [最佳的基于 Arch 的发行版](https://itsfoss.com/arch-based-linux-distros/)，对吧？

这就是 **Manjaro Linux** 登场的地方。

Manjaro Linux 是一款流行的基于 Arch 的发行版，并且我注意到每次更新时都有各种改进（在虚拟机上使用时）。

此外，我喜欢 Manjaro 默认主题的强调色，很适合我的桌面体验。

所以，我决定试试看……

### Manjaro Linux: 起步有点困难

![](/data/attachment/album/202306/27/110639v2y45ci7hc4hf9f4.jpg)

使用专有的英伟达驱动程序安装 Manjaro 时我没有遇到任何问题。然而，最近的一个小版本更新，**Manjaro Linux 21.2.6，** 把我的系统弄乱了。

我无法访问登录界面和 [TTY](https://itsfoss.com/what-is-tty-in-linux/)（我只能看到主板制造商的标志）

因此，我只能使用最新的 ISO 重新安装 Manjaro Linux，到目前为止一切都还好（千万别出问题）。

在我使用 Manjaro Linux 的过程中，我注意到了一些事情，有好有坏。

在这里，我分享一些我的经历。如果你还没有尝试过，这些经验应该对你帮助很大，可以让你更多地了解它。

#### 1、简单的安装

基于 Arch 的发行版的主要亮点是使安装过程变得简单。对我来说，完全没有遇到任何问题。

在我的第二块硬盘上安装 Manjaro Linux 是一件轻而易举的事情。引导加载程序正确配置，显示了 Manjaro 主题的启动菜单，让我可以选择 Windows/Manjaro Linux 进行双启动。

#### 2、Manjaro 欢迎页

![](/data/attachment/album/202306/27/110640qc15bt0v01zstc6x.jpg)

当尝试新东西时，欢迎体验在用户体验中占据了一大部分重要性。在这方面，Manjaro Linux 没有让人失望。

如果你仔细关注欢迎屏幕上提供的信息，你可以获得所有必要的信息。

GNOME 布局管理器能让你选择一个合适的布局，使你更加舒适。

![](/data/attachment/album/202306/27/110640z7ws9g290s387k8g.png)

然而，当我尝试在这里启用“**窗口平铺**”功能时，它却无法正常工作：

![](/data/attachment/album/202306/27/110640nvmrwwxen9pd9wom.png)

#### 3、包管理器快速且功能丰富

![](/data/attachment/album/202306/27/110641cnxiy1ixxmkm8qak.png)

考虑到 GNOME 是我最喜欢的桌面环境，我在软件中心（甚至是像 Pop!\_Shop 这样特定于发行版的商店）上有过糟糕的经历。

虽然它们可以完成工作，但有时它们对我的期望反应不及预期。

在 Manjaro Linux 中，我发现安装了 [Pamac](https://wiki.manjaro.org/index.php/Pamac) 作为包管理器。这似乎是 [在 Manjaro Linux 上安装和卸载软件的最佳方式之一](https://itsfoss.com/install-remove-software-manjaro/)。

根据我的经验，它在安装和卸载软件时非常快速。在安装某些软件时，你还会收到关于软件包冲突或是否需要替换/删除某些软件包的提示。当你安装某些东西时，包管理器提供了关于可选/必需依赖项的大量信息。

总体来说，体验非常流畅，没有出现任何麻烦。为了提升体验，包管理器还可以通过调整 pamac 的偏好设置，快速启用对 **Flatpaks/Snaps/AUR** 的支持。

![](/data/attachment/album/202306/27/110641m06v6fa6q6dmpbp6.png)

所以，你不必使用终端或不同的软件商店。一切都可在一个统一的平台下获得，这大大节省了时间。

#### 4、尝试 ZSH Shell

![](/data/attachment/album/202306/27/110642cfwvffizawfd0id6.png)

我习惯于在基于 Ubuntu 的发行版上使用 Bash shell。然而，Manjaro Linux 默认使用 Zsh shell。我相信 Zsh 比 Bash 更好，不过我很快会在另一篇文章中介绍并深入比较。

换句话说，我可以直接尝试不同的东西。令我兴奋的是，终端提示符和遵循 Manjaro 品牌的Shell（或终端）的主题也采用了 Manjaro 的强调色，非常令人印象深刻！

![](/data/attachment/album/202306/27/110642wdov0z0vvc33jbdv.png)

因此，我没有必要在此处 [自定义终端的外观](https://itsfoss.com/customize-linux-terminal/)。

要了解更多信息，你可以查看一些关于 [Zsh 是什么](https://linuxhandbook.com/why-zsh/) 以及 [如何安装它](https://linuxhandbook.com/install-zsh/) 的信息。

#### 5、缺乏官方软件支持

![](/data/attachment/album/202306/27/110643cke44ebnebbrnabq.jpg)

我希望这个情况能够很快改善。但目前来说，许多软件/工具只提供对 Ubuntu 和 Fedora 的官方支持。

你可以在各种工具中找到官方的 DEB/RPM 包，但它们都不能直接在 Manjaro Linux 上使用。

你得依赖 Arch Linux 仓库或 [AUR](https://itsfoss.com/aur-arch-linux/) 中提供的软件包。

幸运的是，很有可能在 AUR 或社区或发行版开发者维护的仓库中找到所需的软件。就像我能够在 Manjaro Linux 上运行 [Insync](https://itsfoss.com/recommends/get-insync/)，并使用文件管理器的集成扩展。

然而，由于缺乏对该平台的官方支持，你可能会错过一些功能或快速更新。

当然，如果你依赖于 [Flatpak](https://itsfoss.com/what-is-flatpak/) 或 Snap 软件包，这对你来说应该不是个问题。此外，如果你是 Linux 的新手，你可以参考我们的 [Flatpak 指南](https://itsfoss.com/flatpak-guide/) 获取更多信息。

#### 6、缺少分数缩放

我有一个由 1080p 和 1440p 分辨率组成的双显示器。因此，分数缩放很有帮助，但我可以不用它来操作。

要在 Manjaro 上启用分数缩放，你需要安装支持 X11 缩放的 Mutter 和 GNOME 控制中心软件包。这些软件包包括：

* `mutter-x11-scaling`
* `gnome-control-center-x11-scaling`

这将替换你现有的 Mutter 和 GNOME 控制中心软件包。因此，你将失去桌面的默认主题/强调色设置。

你可能需要使用 GNOME “<ruby> 调整 <rt>  Tweaks </rt></ruby>”应用来将一切调整正确。但是，这可能会令人感觉麻烦。

### 总结

总体而言，我喜欢在 Manjaro Linux 上的桌面体验。如果那个更新没有搞坏我的系统，我认为我会继续使用 Manjaro Linux 作为我的新日常操作系统。

你认为 Manjaro Linux 的优点和缺点是什么？我在我的新体验中有遗漏了什么吗？作为一个有经验的 Arch Linux 用户，你有任何建议吗？

请在下方评论中告诉我你的想法。

*（题图：MJ/2726c4dd-5611-4ace-8c77-0db894ad6a23）*

---

via: <https://news.itsfoss.com/manjaro-linux-experience/>

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

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


使用 GNOME 在 Fedora 中启用分数缩放

Summary: 以下是在 GNOME 版本的 Fedora 工作站中启用分数缩放的步骤。

以下是在 GNOME 版本的 Fedora 工作站中启用分数缩放的步骤。

![](/data/attachment/album/202306/27/155914j288s2lh4ovkx6jk.jpg)

>
> 以下是在 GNOME 版本的 Fedora 工作站中启用分数缩放的步骤。
>
>
>

<ruby> <a href="https://wiki.gnome.org/Initiatives/FracionalScaling">  分数缩放 </a> <rt>  Fractional Scaling </rt></ruby> 是一项方便的功能，可让你最大程度地优化 HiDPI 显示器和高分辨率笔记本电脑。通过微调缩放比例，你可以创建平衡良好、既不太大也不太小且美观的桌面显示。虽然通过分辨率设置也可以，但由于操作系统的限制，它们通常符合你的实际情况。

此外，它还允许你增加显示屏上文本和其他 UI 元素的大小，而不会使所有内容显得模糊。如果你有高分辨率显示器并希望使文本更易于阅读，这将很有用。

Ubuntu 20.04 LTS 在 2020 年引入了 100%、125%、150%、175% 和 200% 的分数缩放。它可以在“<ruby> 显示 <rt>  Display </rt></ruby>”页面下的“<ruby> 设置 <rt>  Settings </rt></ruby>”中找到。

但在默认 GNOME 桌面的 Fedora 工作站中，只有 100% 和 200% 缩放可用。

![Fedora 中 GNOME 的默认缩放](/data/attachment/album/202306/27/160045b017gk0bbtbvtjjk.jpg)

### 如何使用 GNOME 在 Fedora 中启用分数缩放

打开终端窗口（`CTRL+ALT+T`）。

运行以下命令。此命令在带有 GNOME 的 Fedora 中启用 125%、150% 和 175% 缩放因子。

```
gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']"

```

重启 Fedora。

打开 “设置” 应用，你应该会看到新的缩放因子。

![在 GNOME Fedora 中进行分数缩放](/data/attachment/album/202306/27/160052pp35ve00z5eepm54.jpg)

但是，重要的是要注意分数缩放并不总是完美的。某些应用程序可能无法正确缩放。例如，如果应用程序设计不当，非 GTK 应用可能看起来很模糊。

此外，请务必注意，由于 GPU 的渲染工作量更大，分数缩放可能会增加笔记本电脑的功耗。

### 一些使用说明

根据我的测试，上述命令在 Wayland 中应该是有效的。

如果你不想使用上述命令，但仍想获得类似的体验，那么你可以按照以下步骤操作：

使用 `sudo dnf install gnome-tweaks` 安装 GNOME “<ruby> 调整 <rt>  Tweaks </rt></ruby>” 应用。

转到 “<ruby> 字体 <rt>  Fonts </rt></ruby>” 设置并更改比例因子。

示例：如果你想保持 100% 缩放比例但想要更大的字体，请尝试缩放比例设为 1.1 或 1.2。根据你的需要进行调整。

![字体缩放](/data/attachment/album/202306/27/160059fsfxa2x7372hhc76.jpg)

* 125%：这是分数缩放的典型值。它将文本大小和 UI 元素增加 25% 而不会使所有内容显得模糊。
* 150%：对于想要放大文本和其他 UI 元素但又不想增加显示分辨率的人来说，这是一个很好的值。
* 175%：对于想要使文本和其他 UI 元素变得非常大的人来说，这是一个很好的值。

尝试不同的缩放因子对于找到最适合你的缩放因子至关重要。最佳缩放因子将取决于你的显示器尺寸、视力和偏好。

我希望本指南有所帮助。

*（题图：MJ/4346b556-57ed-4c76-b2c9-e651e0d229f5）*

---

via: <https://www.debugpoint.com/fractional-scaling-fedora/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed/) 译者：[geekpi](https://github.com/geekpi) 校对：[校对者ID](https://github.com/%E6%A0%A1%E5%AF%B9%E8%80%85ID)

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


硬核观察 #1045 人工智能正在扼杀旧互联网

Summary:
? 人工智能正在扼杀旧互联网
? DeepMind 称其下一个人工智能系统将超过 ChatGPT
? 澳大利亚建议居民每晚重启手机
»
»

电没用完或手机出了问题才关机

果然是那样的，重启能解决90%以上的问题。

![](/data/attachment/album/202306/27/170607aasysttr30smfaz0.jpg)

![](/data/attachment/album/202306/27/170622w8k8k0mdmkiq28if.jpg)

### 人工智能正在扼杀旧互联网

互联网总是在消亡；多年来它一直在消亡，被那些从网站上转移流量的应用程序或奖励所谓缩短注意力的算法所杀死。但最近几个月，人工智能正在加速扼杀旧互联网。谷歌正试图改变其几十年一成不变的蓝色链接列表；领英使用人工智能来刺激疲劳的用户；Snapchat 和 Instagram 希望机器人能在你的朋友不在时与你交谈；Reddit 的版主们在抗议天价 API；Stack Overflow 的管理员们则在反对人工智能生成的内容；互联网档案馆正在对抗数据刮削者；维基百科正在被人工智能撕碎；聊天机器人们在反刍自己幻想出来的内容。

>
> **[消息来源：The Verge](https://www.theverge.com/2023/6/26/23773914/ai-large-language-models-data-scraping-generation-remaking-web)**
>
>
>

>
> 老王点评：感觉未来来的太快，这一年来因为 AI，发生了太多事情。
>
>
>

![](/data/attachment/album/202306/27/170636yvwwwinlzchivaxu.jpg)

### DeepMind 称其下一个人工智能系统将超过 ChatGPT

DeepMind 的 CEO 说，他们正在开发一个被称为 Gemini 的人工智能系统，该系统将比 OpenAI 的 ChatGPT 背后的系统更强大，Gemini 将结合 AlphaGo 中使用的技术，赋予该系统新的能力，如计划或解决问题的能力。AlphaGo 基于 DeepMind 的强化学习技术，通过反复尝试并接受关于其表现的反馈，学会处理需要选择采取何种行动的棘手问题。2016 年，AlphaGo 击败了人类棋手冠军，创造了历史。Gemini 仍在开发中，还将需要数月时间，它可能花费数千万乃至数亿美元。

>
> **[消息来源：Wired](https://www.wired.com/story/google-deepmind-demis-hassabis-chatgpt/)**
>
>
>

>
> 老王点评：在这件事上，谷歌暂时还没有说服力的产品。
>
>
>

![](/data/attachment/album/202306/27/170656xzare25wb4az52en.jpg)

### 澳大利亚建议居民每晚重启手机

澳大利亚政府告诉居民，作为一项网络安全措施，他们应该每天关闭和重新开启他们的智能手机。这个建议并不新鲜。2020 年，美国国家安全局发布了移动设备安全的最佳实践指南，其中包括每周重启一次智能手机以防止黑客攻击。网络安全专家称，定期重启手机可以将风险降到最低，因为它强行关闭了在后台运行的任何可能恶意监控用户或收集数据的应用程序和进程。

>
> **[消息来源：卫报](https://www.theguardian.com/technology/2023/jun/23/turn-your-phone-off-every-night-for-five-minutes-australian-pm-tells-residents)**
>
>
>

>
> 老王点评：我觉得这种做法聊胜于无吧。顺便做个调查，有多少人不是全天都开着手机，一般多久才重启一次手机呢？
>
>
>


“发行版快闪”的七个错误

![](/data/attachment/album/202306/28/000715m07zf8w9fttqiws0.jpg)

>
> 你在“发行版快闪”中做错了什么？你能做得更好吗？当然可以。在这里，我们告诉你如何做。
>
>
>

“<ruby> 发行版快闪 <rt>  Distro hopping </rt></ruby>” 是指经常尝试新的 Linux 发行版，以寻找乐趣或找到适合你的完美发行版的习惯。

毕竟，有着 [数百种 Linux 发行版](https://itsfoss.com/what-is-linux/)，而且时不时就有新的版本出现。你可能会担心错过它们，而去尝试 Linux 社区的最新潮流。

无论你为何这样做，不管你喜欢与否，人们会犯下一些错误，这让“发行版快闪”的体验变得糟糕。

这些错误是什么？让我带你一一了解：

### 1、不进行备份

![备份发行版](/data/attachment/album/202306/28/000750kkoqqmnxdoczoomr.png)

嗯，你想要更换发行版，由于过于兴奋，你毫不犹豫就切换了。

但是，如果你没有备份重要的、经常访问的数据，你可能需要重新配置系统和组织你需要的数据。

所以，如果你有备份，无论你做什么，你需要的数据始终可访问，并帮助你在发行版之间快速的跳来跳去。

### 2、不检查显卡的驱动支持

![显卡](/data/attachment/album/202306/28/000750ab2bypx4x8bw4bw2.png)

用户常常忽略发行版与其系统中的显卡的兼容性，而抱怨发行版有问题。

你必须确保你的发行版对你的显卡有开箱即用的支持。

如果你像我一样有一块英伟达显卡，你应该只选择提供带有英伟达支持的 ISO，或在启动菜单中内置了该支持的发行版。

例如，在 Linux Mint 上你需要 [安装英伟达驱动](https://itsfoss.com/nvidia-linux-mint/)。虽然大部分情况下这是一个简单且没什么麻烦的过程，但并不是每个人都愿意为之付出努力。你也可以选择 [Pop!\_OS](https://pop.system76.com/) 或 [Ubuntu](https://itsfoss.com/getting-started-with-ubuntu/)，它们默认情况下与英伟达显卡兼容良好。

### 3、抱有过高期望

![一个用户交叉手指，希望最好的结果](/data/attachment/album/202306/28/000750q0jb7zm7lbabvb4k.png)

没有谁能完美地挑选出你需要和你可能喜欢的东西。

所以，不要听从他人的建议。自己进行研究，选择你想尝试的下一个发行版。

即使你知道你想要什么，也不要期望新的发行版一定会比你当前的发行版更好。各个发行版在许多方面都有所不同。

**你的下一个发行版可能解决了你遇到的问题，但也可能会带来你没有预料到的新问题。** 最好假设你可能会遇到你没有预料到的困扰。

所以，如果你要进行“发行版快闪”，请先系好安全带。

### 4、在物理机上安装发行版

**不要安装新的发行版来替换你当前的发行版**。

如果你直接在你的计算机上更换发行版，可能会导致一些问题，你可能需要先花时间修复这些问题，甚至在了解或体验 Linux 发行版的最佳部分之前就要这样做。

相反，你应该使用 **<ruby> 立付 <rt>  Live </rt></ruby>环境** 或 **虚拟机** 来尝试发行版。

通常，你可以从启动菜单或“<ruby> 试用 <rt>  Try </rt></ruby>”选项中进入立付环境，以在安装 Linux 发行版之前测试一下。

另外，你可以尝试使用 [虚拟机来运行 Linux 发行版](https://itsfoss.com/why-linux-virtual-machine/)。通过使用虚拟机，你可以学习该发行版并进行各种测试，而无需麻烦地更改主机系统。

通过这个选项，你无需改变你的主机系统。你可以测试所有基本要素，如 **网络连接、应用程序可用性、预装工具** 等等，而无需放弃当前的发行版。

### 5、忽视你的使用场景

发行版太多反而让事情变得混乱。

一个发行版的某个部分或特性可能引起了你的注意，这让你认为其他部分也适合你。

你接下来想要尝试的任何发行版应该完全符合你的需求才行。如果它提供了更多或不同的功能，对你来说不一定是好处。

例如，一个发行版可能提供更多的可定制性，这一般是很好的。但如果你不需要那么多控制权，那些提供的选项可能会让你感到不知所措，或者很快对你来说就会像是无用软件。

你可以了解一下有哪些 [最佳 Linux 发行版](https://itsfoss.com/best-linux-distributions/)，并根据文章中提到的特点对它们进行分析。

一个例子是特定的使用场景，比如寻找一个在旧计算机上运行良好的 [轻量级发行版](https://itsfoss.com/lightweight-linux-beginners/)：

或者你正在寻找一些安全、可靠和未来可靠的系统？[不可变的 Linux 发行版](https://itsfoss.com/immutable-linux-distros/) 应该适合你。

或者...

你想要 [玩游戏](https://itsfoss.com/linux-gaming-distributions/) 吗？也有相应的选择！

简而言之，不要选择一个不适合你使用场景的发行版。

### 6、更换日常工具

![日常工具](/data/attachment/album/202306/28/000751whzf3fy35zlrzfyb.png)

除了发行版，一些用户还更换了他们每天使用的工具。

考虑到工具对你的用户体验有重大影响，它最终会改变你的工作流程。你可能这样做是为了尝试新东西，但你应该坚持那些始终适合你的工具。

也许你已经用上了 [最佳基本应用程序](https://itsfoss.com/essential-linux-applications/)，为什么要改变呢？

只有当工具在新的发行版上无法按预期工作时，你才应该寻找替代方案。

### 7、不选择桌面环境

有几件事可以帮助你缩小在系统上安装 Linux 发行版的选择。

其中之一就是 [桌面环境](https://itsfoss.com/what-is-desktop-environment/)。

当然，在选择一个桌面环境之前，你应该了解一下有哪些 [最佳桌面环境](https://itsfoss.com/best-linux-desktop-environments/)。一旦选择了一个，与你想要尝试带有任何桌面环境的发行版相比，你就不必频繁切换发行版。

### 你应该停止“发行版快闪”吗？

你想要探索不同的发行版，并找到最适合自己的一个，这并没有错。

然而，如何从一个发行版“快闪”到另一个发行版可能会让这个过程变得麻烦，并且你可能会抱怨。

你应该 **遵循本文中提到的上述要点**，在想要切换之前使用 **虚拟机** 尝试新的发行版。

现在，你应该能在“发行版快闪”的过程中获得顺滑的体验了。

? 请在下方评论中分享你的“发行版快闪”经历。你会这样做吗？

*（题图：MJ/5bdb860a-0505-476e-bb38-014ee8fe733e）*

---

via: <https://itsfoss.com/distrohopping-issues/>

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

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


如何安装和使用 GNOME Boxes 来创建虚拟机

![](/data/attachment/album/202306/28/151813xrp87wpccdclwc3c.jpg)

>
> 本快速教程解释了安装和使用 GNOME Boxes 以及创建虚拟机的步骤，以及一些提示和故障排除。
>
>
>

虚拟化是使用抽象硬件层运行虚拟实例（而不是实际实例）的过程。通俗地说，它允许你同时安装和运行多个操作系统（Linux、Windows）。

[虚拟机](https://www.redhat.com/en/topics/virtualization/what-is-a-virtual-machine) 是一个模拟操作系统，它运行在另一个操作系统之上，并使用与主机相同的硬件和存储空间。虽然，你可以控制可以分配给虚拟机的共享内存或空间量。

有多种软件可用于创建虚拟机，例如 [Virtual Box](https://www.debugpoint.com/tag/virtualbox/)、KVM、Hyper-V、VMWare player 和 GNOME Boxes。

但老实说，它们中的大多数使用起来都很复杂，有时还不够稳定。[GNOME Boxes](https://wiki.gnome.org/Apps/Boxes) 是另一个自由开源的软件，它非常易于使用，通过抽象出大量选项让你可以轻松创建和管理虚拟机。

### 安装 GNOME Boxes

如果你正在运行 Fedora 的 GNOME 定制版，你应该已经安装了它。但是，对于 Ubuntu、Linux Mint、Kubuntu 和其他发行版，你只需运行以下命令即可将其安装到你的系统中。

```
sudo apt install gnome-boxes

```

#### 通过 Flatpak

它也可以通过 Flatpak 包获得。我会推荐你使用这个版本。首先，使用 [本指南](https://www.debugpoint.com/how-to-install-flatpak-apps-ubuntu-linux/) 在系统中安装 Flatpak，然后从终端运行以下命令进行安装。

```
flatpak install flathub org.gnome.Boxes

```

### 使用 GNOME Boxes 创建虚拟机

从应用菜单启动 GNOME Boxes。

要创建虚拟机，你需要要虚拟化的操作系统的镜像（\*.ISO）。

你可以从发行版的官方下载页面下载任何操作系统 ISO 镜像。对于本指南，我使用的是 Pop!\_OS，这是一个优秀的 Linux 发行版。

启动后，单击顶部的 “+” 图标启动并选择“<ruby> 创建虚拟机 <rt>  Create a virtual machine </rt></ruby>”。

![Create Virtual Machine](/data/attachment/album/202306/28/151937rgzvcedf2fsc1acp.png)

在下一个窗口中，你可以选择已经可用的下载，或者你可以选择你的 ISO 文件作为操作系统源。单击“<ruby> 操作系统镜像文件 <rt>  Operating system image file </rt></ruby>”并选择你的 ISO 文件。

分配虚拟机的内存和存储空间。请记住，你的虚拟机将从主机系统获取内存和存储空间。所以尽量不要分配为最大值。

例如，在下图中，我从主机系统的 8GB 总内存中为虚拟机（客户机）分配了 2GB 内存。

同样，如果你只是想测试操作系统，也请选择最小存储空间。但是，如果你正在为服务器或严肃的工作创建虚拟机，请合理分配你要分配的空间或内存量。

另一件需要记住的重要事情是，除非你删除虚拟机，否则你允许的存储磁盘空间将被永久占用。因此，即使你的虚拟机没有使用整个分配的空间，你也不会获得那么多的可用磁盘空间。

![Allocate resources for your virtual machine](/data/attachment/album/202306/28/151943maocrt20yzi7v0rn.jpg)

继续安装。

在分区窗口中，你应该看到一个硬盘和一个分区，这就是虚拟机的磁盘空间。通常，它们被命名为 `/dev/vda` 或者 `/dev/sda`。

不用担心；你可以随意使用此分区，这不会影响你的物理磁盘分区或实际主机系统上的任何数据。安装 Linux 时遵循相同的 `/root` 分区，然后继续。

![Virtual machine partition](/data/attachment/album/202306/28/151951ykadonxnf3dukxoq.jpg)

完成安装后，你应该会在虚拟机中看到新的操作系统。在 GNOME Boxes 中，你应该会看到一个系统条目。你可以单击它启动虚拟机。

你可以使用虚拟机操作系统的内部关闭选项关闭虚拟机。

如果需要，你还可以通过选择上下文菜单选项来删除虚拟机。

![Context menu in installed virtual machine](/data/attachment/album/202306/28/151957vpozz599iok96v66.png)

你还可以从属性窗口检查你的虚拟机使用了多少内存和 CPU。

请注意，你可以使用属性调整现有虚拟机的内存和其他项目。

![System properties](/data/attachment/album/202306/28/152005q1ukktammhzofz6h.jpg)

### 故障排除

以下是你在使用 GNOME Boxes 时可能遇到的一些常见错误或问题。

#### 1、虚拟机中的分辨率问题

如果你的虚拟机分辨率很低，这与你的主机系统不兼容，那么你必须安装以下项目。在客户系统（而不是主机系统）中打开终端并运行以下命令。

对于基于 Ubuntu 的发行版：

```
sudo apt install spice-vdagent spice-webdavd

```

对于 Fedora 系统：

```
sudo dnf install spice-vdagent spice-webdavd

```

这两个包有助于确定合适的分辨率、在主机和客户之间复制/粘贴、通过公共文件夹共享文件等。

安装后，重新启动客户系统；或者你可以在重启后注销并重新登录一次，你应该会看到正确的分辨率。

#### 2、在 Ubuntu 18.04 中 GNOME Boxes 不能启动虚拟机

如果你在 Boxes 3.34 中创建虚拟机，那么你应该知道有一个错误导致你的虚拟机无法启动。要解决这个问题，你必须执行一些额外的步骤。请记住，最新的 Boxes 3.36 不需要这些。

打开终端窗口并运行以下命令来更改 qemu 配置文件：

```
sudo gedit /etc/modprobe.d/qemu-system-x86.conf

```

在上面的文件中添加以下行并保存：

```
group=kvm

```

现在，运行以下命令将你的用户名添加到 KVM 组。

```
sudo usermod -a -G kvm <你的帐户名称>

```

### 总结

在本文中，你了解了如何安装和使用 GNOME Boxes 来利用虚拟化。我希望它能帮助你。

? 如果你遇到任何错误或对 GNOME Boxes 的虚拟机有任何疑问，请使用下面的评论栏告诉我。

*（题图：MJ/b4d091cf-9585-468b-9ce6-ba0b0c69cce4）*

---

via: <https://www.debugpoint.com/install-use-gnome-boxes/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #1046 红帽认为 RHEL 克隆品是对开源公司的“真正威胁”

Summary:
? 红帽认为 RHEL 克隆品是对开源公司的“真正威胁”
? 微软考虑将 Windows 转移到云端
? 手机跟踪软件 LetMeSpy 称其被黑客窃取了大量信息
»
»

已将生产环境从centos/rocky 切换到了ubuntu

还是切换成openEuler好！

![](/data/attachment/album/202306/28/165428spqmkkkwoj9lsd2u.jpg)

![](/data/attachment/album/202306/28/165440o0k08yy4x85txziy.jpg)

### 红帽认为 RHEL 克隆品是对开源公司的“真正威胁”

前两天，红帽 [宣布](/article-15933-1.html) 其企业发行版 RHEL 的源代码将只公开发布在 CentOS Stream 上，其直接后果是社区将无法直接获得 RHEL 的精确源代码。这显然给 1:1 复制 RHEL 的下游发行版，如 AlmaLinux、Rocky Linux 等造成了 [阻碍](/article-15936-1.html)。面对社区批评，红帽高管最近撰文反驳，指出对他们愤怒的人“要么来自于那些不愿为生产 RHEL 需要付出的时间、精力和资源付费的人，要么来自那些因为自己的利益而想要重新打包它的人”。他认为 AlmaLinux 等“下游重新构建者没有价值”，“简单地重新打包，并进行原样转售，没有增加任何的价值，还让开源软件的生产变得不可持续”，并且表示，他们“没有义务让重新构建者的工作更加容易”。更严重的是，他还指控这是一种对开源的“威胁”，“如果是仅仅重新构建代码，而不对现有代码增加价值或进行任何修改，对于所有开源公司来说，这才是真正的威胁。这对开源来说是一个真正的威胁，有可能将开源重新变回到只适用于业余爱好者和黑客的活动。”

>
> **[消息来源：红帽](https://mp.weixin.qq.com/s/RELpVQ541cQgU7wkyhVjEQ)**
>
>
>

>
> 老王点评：一方面受限于 GPL 而不得不公开源代码，另外一方面又千方百计提高获得源代码的麻烦程度，并反过来指责那些依据 GPL 而获得源代码的人是“威胁” —— 说实话，“威胁”这个词我记得当年微软也这样说过。曾经红帽砍掉 CentOS 项目，而用滚动变化的 CentOS Stream 替代时，我认为这对 RHEL 的发展是有益的，面对很多“误解”，也曾出面帮他们做过一些澄清。但是现在红帽终于图穷匕见，认为从 RHEL 源代码构建的“克隆品”是一个“威胁”。我想说，你利用开源代码构建的 RHEL，没有资格说同样根据许可证获得源代码构建发行版的人是“威胁”！另外，卫 Sir 今天的 [撰文](https://mp.weixin.qq.com/s/njYYeeSMAebJRp5kUkYxKA) 对此做了更深入的剖析，值得一看。
>
>
>

![](/data/attachment/album/202306/28/165455t1b3bbnr8vrr63og.jpg)

### 微软考虑将 Windows 转移到云端

在 FTC 诉微软收购动视暴雪听证会上，一份被公开的微软 2022 年 6 月的内部演示文稿中，微软讨论了在 Windows 365 的基础上实现从云端到任何设备的完整 Windows 操作系统串流。Windows 365 是一项将完整版本的 Windows 串流到设备的服务，目前仅提供给商业客户，但微软已经将其深度整合到 Windows 11 中。未来的更新将包括 Windows 365 Boot，它将使 Windows 11 设备在启动时直接登录到云 PC 实例，而不是本地版本的 Windows。

>
> **[消息来源：The Verge](https://www.theverge.com/2023/6/27/23775117/microsoft-windows-11-cloud-consumer-strategy)**
>
>
>

>
> 老王点评：如果 Windows 都变成云端的了，那么是不是 Linux 桌面就有希望变成“第二大”桌面系统了？ ?
>
>
>

![](/data/attachment/album/202306/28/165510lgpicpnevpknnfav.jpg)

### 手机跟踪软件 LetMeSpy 称其被黑客窃取了大量信息

LetMeSpy 是一款手机监控应用程序，被用于家长控制或员工监控。这类手机监控应用程序也被称为跟踪软件或配偶软件，通常在未经本人同意或不知情的情况下对某人的手机进行物理访问而植入。一旦被植入，LetMeSpy 就会默默地将手机的短信、通话记录和精确的位置数据上传到其服务器，让植入该应用程序的人能够实时跟踪该人。该公司称，一名黑客窃取了 LetMeSpy 从电子邮件、电话号码和账户上截获的信息。入侵的黑客表示已经夺取了该公司域名的广泛访问权，并暗示他们删除了 LetMeSpy 存储在服务器上的数据库。同一天晚些时候，一份被黑的数据库的副本也出现在网上。

>
> **[消息来源：Tech Crunch](https://techcrunch.com/2023/06/27/letmespy-hacked-spyware-thousands/)**
>
>
>

>
> 老王点评：这算不算黑吃黑？
>
>
>


哞~ 我的 Linux 终端里有头牛

这是真会整活啊:D

![](/data/attachment/album/202306/28/225311tkxprbpbv44zpta9.jpg)

>
> cowsay 是一个有趣的小型 Linux 命令行实用程序，它有各种使用方式。以下是几个示例。
>
>
>

如果你想的话，Linux 终端可以是一个有趣的地方。

当然，终端一般用在严肃的场合，但你可以使用 [有趣的 Linux 命令](https://itsfoss.com/funny-linux-commands/) 来娱乐自己。

`cowsay` 就是其中之一。它可以在终端上显示一头牛。

![Linux 中的 cowsay 命令](/data/attachment/album/202306/28/225340xtm8dd70dt098mqf.png)

`cowsay` 的一个特点是，如果与其他命令组合使用，它可以用于一些 “严肃的场合”。比如，在共享的 Linux 服务器上使用它来显示 “每日消息”，以供多个用户查看。

听起来有趣吗？是时候~~喂养~~安装一个了。

### 安装 Cowsay

`cowsay` 是一个受欢迎的工具，它可以在大多数 Linux 发行版的软件仓库中找到。

要在 Debian 和 Ubuntu 系统上安装 `cowsay`，请打开终端并运行：

```
sudo apt install cowsay

```

对于 Fedora，请使用：

```
sudo dnf install cowsay

```

在基于 Arch Linux 的发行版中，请使用：

```
sudo pacman -S cowsay

```

### 使用 Cowsay

顾名思义，这是一头以 ASCII 艺术展示的牛，能输出输入的文本。默认情况下，`cowsay` 提供了几个选项来调整这头 ASCII 牛的外观和样式。

#### 普通的 cowsay

```
cowsay <文本>

```

这将在牛讲话的气泡中打印你提供的任何文本。

![默认的 cowsay 命令](/data/attachment/album/202306/28/225341v1111wrbvj17pd6r.svg)

或者，你可以使用管道重定向，将另一个命令（比如 `echo`）的输出作为 `cowsay` 的输入。

```
echo "Hello" | cowsay

```

#### 贪婪的牛

这里，牛的眼睛看起来有点贪婪，它是美元符号。

```
cowsay -g <消息>

```

![具有贪婪选项的 cowsay 命令](/data/attachment/album/202306/28/225341k9a7dktd3ld8jrj9.svg)

#### 使用特殊字符作为眼睛

你可以使用 `-e` 选项，然后提供你希望作为眼睛的两个字符。默认是 `OO`。

```
cowsay -e hh Hello

```

![具有自定义眼睛字符的 cowsay 命令](/data/attachment/album/202306/28/225341fm69cbb7y4dv1bmy.svg)

在上面的截图中，两个 `h` 将出现在眼睛的位置。

>
> ? 如果你输入的字符已被任何默认选项使用，比如 `$$`，那么它将被覆盖。
>
>
>

#### 使用其他字符代替牛

`cowsay` 还提供了许多其他 ASCII 图像，你可以通过 `-f` 选项使用它们。

使用 `-l` 选项列出它们：

```
cowsay -l

```

![使用 "ls /usr/share/cowsay/cows/" 和 "cowsay -l" 列出的各种默认 cowsay 图像](/data/attachment/album/202306/28/225341v98gj4biqem98j9o.png)

现在，要打印上述图像之一，请使用：

```
cowsay -f <牛文件名称> <消息>

```

![使用不同图像而不是默认的牛的 cowsay 命令](/data/attachment/album/202306/28/225342sao7ao8padhr5h7p.svg)

类似地，在更新的版本中，你可以使用 `-r` 选项随机打印上述图像之一。

```
cowsay -r Hello

```

#### 其他选项

| 选项 | 用途 |
| --- | --- |
| `-b` | 启用博格模式 |
| `-d` | 看起来死了的牛 |
| `-p` | 陷入偏执状态的牛 |
| `-s` | 看起来迷迷糊糊的牛 |
| `-t` | 一只疲倦的牛 |
| `-y` | 让牛年轻一些 |

### 使用 Cowthink

`cowthink` 是与 `cowsay` 一起提供的辅助程序。它显示的是思维泡泡而不是说话泡泡。如果你熟悉漫画书的标注，这将更有意义。

```
cowthink Hello

```

![默认的 Cowthink 命令](/data/attachment/album/202306/28/225342umbnamo0w1lo33sw.svg)

所有在 `cowsay` 中提到的选项在这里同样适用。

### 使用 Cowsay 和 Fortune

通过管道重定向，你可以将 `cowsay` 与另一个流行的有趣的 Linux 命令 `fortune` 结合使用。

>
> ? 在 Ubuntu 中可以使用 `sudo apt install fortune lolcat` 命令安装 `fortune` 和 `lolcat`。
>
>
>

对于那些不知道 `fortune` 是什么的人来说，它是一个小程序，在终端上打印名人名言。你可以像这样作为独立命令来运行它：

```
fortune

```

要使用 `cowsay` 打印 `fortune` 的内容，运行：

```
fortune | cowsay

```

![](/data/attachment/album/202306/28/225343biqozp6nnizippgi.svg)

你还可以添加 `cowsay` 的选项来使输出更好：

```
fortune | cowsay -f dragon

```

### 用 lolcat 把牛变成彩色的

许多人都熟悉 `lolcat` 给文本添加的彩虹效果。那么为什么不将其与上述程序一起使用呢？你只需要将 `cowsay` 命令连接到 `lolcat` 命令上即可。

```
cowsay Hello | lolcat

```

![运行 cowsay 和 lolcat](/data/attachment/album/202306/28/225343z965rg8ubufn8s9b.svg)

现在，如果你想同时添加 `fortune` 和各种 `cowsay` 选项，请使用所有这些选项，并将整个命令的输出都连接到 `lolcat`，就像这样：

```
fortune | cowsay -f tux | lolcat
fortune | cowthink -f tux | lolcat

```

![在一起运行 fortune、cowsay 和 lolcat](/data/attachment/album/202306/28/225343by7fry477k66o5z1.svg)

### 第三方牛文件（适用于高级用户）

对默认的 `cowsay` 牛文件不感兴趣吗？别担心，有许多不同的牛文件可供选择，由热心的开发者创建。我在这里介绍两个：<https://github.com/bkendzior/cowfiles> 和 <https://github.com/paulkaefer/cowsay-files>。

你可以按照它们的 `README` 所述从这些存储库安装牛文件，或者只需从存储库中下载所需的牛文件（.cow）并将它们粘贴到 `/usr/share/cowsay/site-cows/` 下。现在，你可以通过文件名访问该牛文件：

```
cowsay -f <新文件名> Hello

```

在屏幕截图中，你可以看到我使用了一个下载下来的牛文件，名为 `C3PO.cow`。

对于那些想要创建自己的图像的人，可以访问 [Charc0al 的 cowsay 文件](https://charc0al.github.io/cowsay-files/converter/)。

![第三方牛文件](/data/attachment/album/202306/28/225344kr3gj7gqkbr8vrgq.png)

在这里，你可以下载现有的文件，或者转换一些图像（建议不大于 50×50）以满足需求。

### 其他有趣的用法

#### 使用 cowsay 提示输入 sudo 命令的密码

```
sudo -p "$(cowsay '如果你知道密码，请在此输入。否则请离开：')" <command>

```

![Cowsay sudo 提示](/data/attachment/album/202306/28/225345qz2mrrvlmzxltk0x.svg)

#### 将 cowsay 作为 bash 配置的一部分，以便在每次打开终端时看到欢迎

对于像 Fedora 中的较新版本的 `cowsay`，可以将 `fortune | cowsay -r | lolcat` 添加到你的 `~/.bashrc` 中。现在，每次打开终端时，都会打印一个带有不同名言的新牛文件。

对于没有随机选项（`-r`）的较旧版本的 `cowsay`，你可以手动获取不同的文件，并使用 `fortune | cowsay -f <要使用的特定牛文件的名称> | lolcat`。

#### 使用 cowsay 显示其他命令的输出

你可以让 `lsblk` 等命令使用 `cowsay` 打印输出。只需将这些命令连接起来。

```
lsblk | cowsay

```

#### 在 Fedora 中使用 cowsay-beefymiracle

`beefymiracle` 是 Fedora 中提供的一个 cowsay 包。这里的牛变成了牛肉（我这颗素食主义者的心在哭泣 ?）。

使用下面的命令来安装它：

```
sudo dnf install cowsay-beefymiracle

```

现在，运行：

```
cowsay -f beefymiracle <消息>

```

![cowsay 的 beefymiracle 文件](/data/attachment/album/202306/28/225345c509znmnncntdm5v.png)

### 更多：XCowsay

`xcowsay` 是普通的 cowsay 的图形替代品。这里，牛不再是 ASCII 图形，而是一个真实的图像。你可以通过以下方式进行安装：

```
sudo apt install xcowsay

```

现在运行：

```
xcowsay <消息>

```

这将根据文本的长度，在一段特定的时间内显示图形化的牛，然后消失，**但你可以点击它立即隐藏。**

![xcowsay 命令](/data/attachment/album/202306/28/225346v0lccv0q1dd9l1cq.png)

更有趣的是，牛可以“梦见”图像而不是文本。甚至牛的图像可以更改为随机图像。

使用以下命令之一：

```
xcowsay --dream=file

```

或者

```
xcowsay --image=file --dream=file

```

![](/data/attachment/album/202306/28/225347qvqayvvrqnnscfvn.png)

![](/data/attachment/album/202306/28/225347ktzu3ri7opjto6yj.png)

你可以查看 `xcowsay` 的手册页面以了解更多选项。

### 更多终端中的 ASCII 乐趣

喜欢 ASCII 艺术吗？可以尝试用 [Neofetch](https://itsfoss.com/using-neofetch/) 以 ASCII 格式显示你所使用的发行版的徽标。

为什么只限于徽标呢？Linux 终端上还有很多 ASCII 工具。

不要停止在终端中寻找乐趣。

希望你喜欢这篇关于以各种格式使用 `cowsay` 的教程。惊人的是，这个小工具提供了如此多的选项，有这么多的使用方式。

你最喜欢哪个 cowsay 的例子？不要说牛肉的那个 ?

*（题图：MJ/bd304f28-2476-4496-93d2-50fdae0a8831）*

---

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

作者：[Sreenath](https://itsfoss.com/author/sreenath/) 选题：[lkxed](https://github.com/lkxed/) 译者：ChatGPT 校对：[wxy](https://github.com/wxy)

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


Linux 版 WhatsApp

![](/data/attachment/album/202306/29/152308bjkgagd8guq1qggj.jpg)

>
> 一款出色的 Flatpak 应用，可从 Linux 桌面访问 WhatsApp。
>
>
>

WhatsApp 是流行的手机通讯平台，在许多国家都很受欢迎。用户通常通过 Play 商店或 App Store 中的移动应用访问它。然而，WhatsApp 从未推出任何适用于 Linux 的官方桌面客户端。

尽管你可以使用浏览器访问 WhatsApp，这是从任何桌面（包括 Linux）访问消息的官方方式。

一个新的非官方 WhatsApp Flatpak 桌面应用出现了，你可以无缝地使用它进行通信。

那么，这个 GTK 应用有哪些功能？

### “Linux 版 WhatsApp” 的功能

![Linux 版 WhatsApp（图片来源开发者）](/data/attachment/album/202306/29/152413wbab6u58l58u4ssu.jpg)

借助这款新的桌面应用，Linux 桌面用户可以在他们最喜欢的桌面环境中享受 WhatsApp 的所有熟悉功能。现在，你可以在 Linux 发行版上轻松访问所有功能，例如发送消息、共享媒体文件以及进行语音和视频通话。

“Linux 版 WhatsApp” 应用还提供键盘快捷键，确保应用内的无缝导航和交互。使用此应用，你可以放大和缩小以仔细查看图像和文本，或切换到全屏模式以获得无干扰的聊天体验。该应用还包括一个系统托盘图标，即使在应用最小化时也可以快速访问和通知。

此外，你可以自定义应用以满足你的喜好。通过按 `Alt+H`，你可以轻松显示或隐藏标题栏，从而更好地控制工作区。该应用还支持系统语言的本地化，确保你可以轻松地与世界各地的朋友和家人进行交流。

![设置](/data/attachment/album/202306/29/152421fhqz4hbsww49ibyy.jpg)

Linux 版 WhatsApp 应用的一项值得注意的功能是支持系统语言的拼写检查。要启用此功能，你必须安装相应的词典，例如美国英语的 hunspell-en\_us 包。

### 技术细节

如果你想知道，它不是一个 Electron 应用。它是使用原生 C++ 编写的，确保了最佳的性能和安全性。它依赖于各种免费和开源库，例如 intltool、gtkmm-3.0、webkit2gtk-4.0、ayatana-appindicator3-0.1、libcanberra 以及用于拼写检查的 libhunspell（可选）。

你可以从 [GitHub 上的源码](https://github.com/eneshecan/whatsapp-for-linux)了解有关此应用的更多信息。

### 安装

首先，你必须为你的 Linux 发行版设置 Flatpak 和 Flathub。使用 [本指南](https://www.debugpoint.com/how-to-install-flatpak-apps-ubuntu-linux/) 来设置。

安装后，运行以下命令进行安装。

```
flatpak install com.github.eneshecan.WhatsAppForLinux

```

你可以在应用列表中找到该应用。

### 运行应用

打开应用后，设置与 WhatsApp 网页类似。打开手机的 WhatsApp 应用并扫描应用中的二维码。这样就完成了。

![Linux 版 WhatsApp](/data/attachment/album/202306/29/152432vu0qejzz1qzlz943.jpg)

请注意，这是一个非官方的应用。因此，请谨慎使用。你还可以查看 GitHub 以获取有关此应用的更多详细信息。

*（题图：MJ/de9d18fe-fb3f-4d88-8723-761ebbee5f38）*

---

via: <https://www.debugpoint.com/whatsapp-for-linux/>

作者：[Arindam](https://www.debugpoint.com/author/admin1/) 选题：[lkxed](https://github.com/lkxed/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #1047 ReactOS 项目冒泡表示还活着

Summary:
? ReactOS 项目冒泡表示还活着
? WhatsApp 关闭了基于 Electron 的桌面应用
? GitHub DDoS 攻击了一个重要的开源项目小网站
»
»

![](/data/attachment/album/202306/29/185323sgdljj7n0kukn7d7.jpg)

![](/data/attachment/album/202306/29/185335d66x7l438320ssds.jpg)

### ReactOS 项目冒泡表示还活着

ReactOS 是一个开源的操作系统，旨在复制微软的 Windows，可以不加修改地运行许多 Windows 应用程序。ReactOS 的上一次更新是在 2021 年 12 月。此前它的发布计划是每三个月释出一个新版本，但自从 0.4.14 之后就再无动静。面对用户的疑问，该项目发文称其还活着，只是之后的版本发布会根据质量而不是数量。新的发布规则是“一个新版本要达到 `发布’ 状态，需要有合理的低回归量（不超过 20个）”。但他们并没有给出下一个版本预计发布的时间，不过你可以随时尝试其每夜构建版本。

>
> **[消息来源：ReactOS](https://reactos.org/blogs/newsletter-102/)**
>
>
>

>
> 老王点评：其实，没事发个新版本表示活着，至少是给社区一些信心的做法。
>
>
>

![](/data/attachment/album/202306/29/185349byww3hkca33jwo7o.jpg)

### WhatsApp 关闭了基于 Electron 的桌面应用

当 WhatsApp 处于早期开发阶段时，开发者创建了一个基于 Electron JavaScript 框架的桌面应用程序，它在 Windows 和 macOS 上都能使用。大约四周前，这个桌面应用程序的主屏幕上出现了一个倒计时器，宣布其即将关闭。WhatsApp 让用户切换到其原生应用程序上，新的原生应用程序已经稳定运行了一年左右。

>
> **[消息来源：Android Police](https://www.androidpolice.com/whatsapp-desktop-electron-dead/)**
>
>
>

>
> 老王点评：有了原生应用，谁还用 Electron 的呀。
>
>
>

![](/data/attachment/album/202306/29/195102ez2r759z8atyyax5.jpg)

### GitHub DDoS 攻击了一个重要的开源项目小网站

一个 GCC 核心的开源算术库 GMP 项目所使用的服务器遭受到了大量的来自 GitHub 的 IP 的连接。无奈之下，该项目只能封禁了数百个微软的 IP 地址。微软发现这是一个被复刻了 700 多次的存储库上的 Actions 工作流导致的。一位 GitHub 用户更新了 FFmpeg-Builds 项目中的一个脚本，该脚本从 [gmplib.org](http://gmplib.org/) 提取内容。这种活动应该不是恶意的，但 GMP 有限的基础设施无法应对这个量级的并发请求。这并不是第一次有软件项目因为繁重的流量需求而喊出被 DDoS。

>
> **[消息来源：The Register](https://www.theregister.com/2023/06/28/microsofts_github_gmp_project/)**
>
>
>

>
> 老王点评：这个事情里面没有主动的恶意行为者，但是 GitHub 这么大体量，稍有不慎对其它微小的基础设施都是毁灭性打击，所以，微软应该对其基础设施和应用更加慎重一些。
>
>
>