一些命令行小技巧：wc、sort、sed 和 tr

# 一些命令行小技巧：wc、sort、sed 和 tr

<img src="content_image/album_202108_10_085720hyd795y1wrmd5rx9.jpg" alt="" title="">

Linux 发行版十分好用，而且它们有一些用户可能不知道的技巧。让我们来看看一些命令行实用工具，当你热衷于终端而不是 GUI 时，它们可能更顺手。

我们都知道在一个系统上使用终端会更高效。当你编辑和排版一个文本文件时，终端会让你确切的感受到，生活如此简单。

本文将向你介绍 `wc`、`sort`、`tr` 和 `sed` 命令。

### wc

`wc` 是一个实用工具，全称是 “word count”。顾名思义，它可以用来统计任何文件的行数、单词数和字节数。

让我们来看看它是如何工作的：

```
$ wc filename
lines words characters filename

```

输出的是文件的行数、单词数、字符数和文件名。

想获得特定的输出，我们必须使用选项：

* `-c` 打印字节总数
* `-l` 打印行数
* `-w` 打印单词总数
* `-m` 打印字符总数

#### wc 示例

让我们来看看它的运行结果。

让我们从一个文本文件 `lormipsm.txt` 开始。首先，我们通过 `cat` 查看文件内容，然后使用 `wc`：

```
$ cat loremipsm.txt
Linux is the best-known and most-used open source operating system.
As an operating system, Linux is software that sits underneath all of the other software on a computer,
receiving requests from those programs and replaying these requests to the computer's hardware.

$ wc loremipsm.txt
3 41 268 loremipsm.txt

```

假设我只想查看文件的字节数：

```
$ wc -c loremipsm.txt
268 loremipsm.txt

```

查看文件的行数：

```
$ wc -l loremipsm.txt
3 loremipsm.txt

```

查看文件的单词数：

```
$ wc -w loremipsm.txt
41 loremipsm.txt

```

现在只查看文件的字符数：

```
$ wc -m loremipsm.txt
268 loremipsm.txt

```

### sort

`sort` 命令是最有用的工具之一。它会对文件的数据进行排序。可以根据字符或数字进行升序或降序排列。它也可以用来对文件中的行进行排序和随机化。

使用 `sort` 非常简单。我们需要做的仅仅是提供一个文件名：

```
$ sort filename

```

默认的是按照字母顺序对数据进行排序。需要注意的是 `sort` 命令仅仅是对数据进行排序展示。它并不会改写文件。

使用 `sort` 命令的一些有用的选项：

* `-r` 将文件中的行按倒序进行排序
* `-R` 将文件中的行打乱为随机顺序
* `-o` 将输出保存到另一个文件中
* `-k` 按照特定列进行排序
* `-t` 使用指定的分隔符，而不使用空格
* `-n` 根据数值对数据进行排序

#### sort 示例

让我们看看 `sort` 的几个简单示例。

我们有一个 `list.txt` 的文件，包含逗号分隔的名称和数值。

首先让我们打印出文件内容并简单排序：

```
$ cat list.txt
Cieran Wilks, 9
Adelina Rowland, 4
Hayden Mcfarlnd, 1
Ananya Lamb, 5
Shyam Head, 2
Lauryn Fuents, 8
Kristian Felix, 10
Ruden Dyer, 3
Greyson Meyers, 6
Luther Cooke, 7

$ sort list.txt
Adelina Rowland, 4
Ananya Lamb, 5
Cieran Wilks, 9
Greyson Meyers, 6
Hayden Mcfarlnd, 1
Kristian Felix, 10
Lauryn Fuents, 8
Luther Cooke, 7
Ruden Dyer, 3
Shyam Head, 2

```

现在对数据进行倒序排序：

```
$ sort -r list.txt
Shyam Head, 2
Ruden Dyer, 3
Luther Cooke, 7
Lauryn Fuents, 8
Kristian Felix, 10
Hayden Mcfarlnd, 1
Greyson Meyers, 6
Cieran Wilks, 9
Ananya Lamb, 5
Adelina Rowland, 4

```

让我们打乱数据：

```
$ sort -R list.txt
Cieran Wilks, 9
Greyson Meyers, 6
Adelina Rowland, 4
Kristian Felix, 10
Luther Cooke, 7
Ruden Dyer, 3
Lauryn Fuents, 8
Hayden Mcfarlnd, 1
Ananya Lamb, 5
Shyam Head, 2

```

来看一点更复杂的。这次我们根据第二个字段，也就是数值对数据进行排序，并使用 `-o` 选项将输出保存到另一个文件中：

```
$ sort -n -k2 -t ',' -o sorted_list.txt list.txt
$ ls
   sorted_list.txt    list.txt
$ cat sorted_list.txt
Hayden Mcfarlnd, 1
Shyam Head, 2
Ruden Dyer, 3
Adelina Rowland, 4
Ananya Lamb, 5
Greyson Meyers, 6
Luther Cooke, 7
Lauryn Fuents, 8
Cieran Wilks, 9
Kristian Felix, 10

```

这里我们使用 `-n` 选项按数字顺序进行排序，`-k` 选项用来指定要排序的字段（在本例中为第 2 个字段），`-t` 选项指定分隔符或字段分隔符（逗号），`-o` 选项将输出保存到 `sorted_list.txt` 文件中。

### sed

`sed` 是一个流编辑器，用于过滤和转换输出中的文本。这意味着我们不需要对原文件进行修改，只需要对输出进行修改。如果需要，我们可以将更改保存到一个新的文件中。`sed` 提供了很多有用的选项用于过滤和编辑数据。

`sed` 的语法格式如下：

```
$ sed [OPTION] ‘PATTERN’ filename

```

sed 常用的一些选项：

* `-n` 取消默认输出
* `p` 打印指定的数据
* `d` 删除指定行
* `q` 退出 `sed` 脚本

#### sed 示例

我们来看看 `sed` 是如何运作的。我们从 `data` 文件开始，其中的字段表示编号、名称、年龄和操作系统。

如果行出现在特定的行范围内，该行将打印 2 次：

```
$ cat data
1    Vicky Grant      20   linux
2    Nora Burton    19   Mac
3    Willis Castillo   21  Windows
4    Gilberto Mack 30   Windows
5    Aubrey Hayes  17   windows
6    Allan Snyder    21   mac
7    Freddie Dean   25   linux
8    Ralph Martin    19   linux
9    Mindy Howard  20   Mac

$ sed '3,7 p' data
1    Vicky Grant      20   linux
2    Nora Burton    19   Mac
3    Willis Castillo   21  Windows
3    Willis Castillo   21  Windows
4    Gilberto Mack 30   Windows
4    Gilberto Mack 30   Windows
5    Aubrey Hayes  17   windows
5    Aubrey Hayes  17   windows
6    Allan Snyder    21   mac
6    Allan Snyder    21   mac
7    Freddie Dean   25   linux
7    Freddie Dean   25   linux
8    Ralph Martin    19   linux
9    Mindy Howard 20   Mac

```

这里的操作用单引号括起来，表示第 3 行和第 7 行，并且使用了 `p` 打印出符合匹配规则的数据。sed 的默认行为是在解析后打印每一行。这意味着由于使用了 `p` ，第 3 行到第 7 行打印了两次。

如何打印文件中特定的行？使用 `-n` 选项来消除在输出中不匹配的行：

```
$ sed -n '3,7 p' data
3    Willis Castillo     21    Windows
4    Gilberto Mack    30   Windows
5    Aubrey Hayes     17   windows
6    Allan Snyder       21   mac
7    Freddie Dean      25  linux

```

使用 ‘-n’ 仅仅只有第 3 行到第 7 行会被打印。

省略文件中的特定行。使用 `d` 从输出中删除行：

```
$ sed '3 d' data
1    Vicky Grant      20    linux
2   Nora Burton     19    Mac
4   Gilberto Mack  30    Windows
5   Aubrey Hayes   17    windows
6   Allan Snyder     21    mac
7   Freddie Dean    25   linux
8   Ralph Martin    19    linux
9   Mindy Howard  20   Mac

$ sed '5,9 d' data
1    Vicky Grant     20   linux
2   Nora Burton    19   Mac
3   Willis Castillo   21   Windows
4   Gilberto Mack 30   Windows

```

从文件中搜索特定的关键字：

```
$ sed -n '/linux/ p' data
7    Freddie Dean   25  linux
8    Ralph Martin   19   linux

$ sed -n '/linux/I p' data
1     Vicky Grant      20  Linux
7     Freddie Dean  25  linux
8     Ralph Martin   19  linux

```

在这些例子中，我们在 `/ /` 中使用了一个正则表达式。如果文件中有类似的单词，但大小写不一致，可以使用 `I` 使得搜索不区分大小写。回想一下，`-n` 删除了输出中不匹配的行。

替换文件中的单词：

```
$ sed 's/linux/linus/' data
1   Vicky Grant      20   Linux
2   Nora Burton    19   Mac
3   Willis Castillo   21   Windows
4   Gilberto Mack  30  Windows
5   Aubrey Hayes   17  windows
6   Allan Snyder     21  mac
7   Freddie Dean    25 linus
8   Ralph Martin    19  linus
9   Mindy Howard 20  Mac

```

这里 `s/ / /` 表示它是一个正则表达式。在两个 `/` 之间的就是定位的单词和需要替换的新单词。

### tr

`tr` 命令可以用来转换或删除字符。它可以将小写字母转换为大写字母，也可以将大写字母转换为小写字母，可以消除重复字符，也可以删除特定字符。

`tr` 的奇怪之处在于，它不同于 `wc`、`sort`、`sed` 那样接受文件作为输入。我们使用 `|` （管道符）为 `tr` 命令提供输入。

```
$ cat filename | tr [OPTION]

```

`tr` 命令使用的一些选项：

* `-d` 删除给定输入第一个集合中的指定字符，不做转换
* `-s` 将重复出现的字符替换为单个

#### tr 示例

现在让我们使用 `tr` 命令将 `letter` 文件中的所有小写字符转换为大写字符：

```
$ cat letter
Linux is too easy to learn,
And you should try it too.

$ cat letter | tr 'a-z' 'A-Z'
LINUX IS TOO EASY TO LEARN,
AND YOU SHOULD TRY IT TOO.

```

这里的 `a-z`、`A-Z` 表示我们想要将 `a` 到 `z` 范围内的小写字符转换为大写字符。

删除文件中的 `o` 字符：

```
$ cat letter | tr -d 'o'
Linux is t easy t learn,
And yu shuld try it t.

```

从文件中压缩字符 `o` 意味着如果 `o` 在文件中重复出现，那么它将会被删除并且只打印一次：

```
$ cat letter | tr -s 'o'
Linux is to easy to learn,
And you should try it to.

```

### 总结

这是使用 `wc`、`sort`、`sed`、`tr` 命令的快速演示。这些命令可以方便快捷的操作终端上的文本文件。你可以使用 `man` 命令来了解这些命令的更多信息。

---

via: <https://fedoramagazine.org/command-line-quick-tips-wc-sort-sed-and-tr/>

作者：[mahesh1b](https://fedoramagazine.org/author/mahesh1b/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[perfiffer](https://github.com/perfiffer) 校对：[wxy](https://github.com/wxy)

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


如何安装 elementary 优化工具

目前 Pantheon 优化工具已提供简体中文版本，由我提供翻译，更新到 1.0.1 版本即可

# 如何安装 elementary 优化工具

>
> 这篇快速教程演示了如何安装 elementary / Pantheon 优化工具。
>
>
>

<ruby> elementary 优化工具 <rt>  elementary Tweaks Tool </rt></ruby>是专为 [elementary OS](https://www.debugpoint.com/tag/elementary) 设计的实用工具。它提供了一些用于修改 elementary 设置的选项。虽然 elementary 已经提供了绝大多数选项，但还有一小部分的 Pantheon 桌面优化是不能直接通过普通设置修改的，因此这个工具才得以诞生。这个工具与 GNOME 中的 [GNOME Tweaks](https://www.debugpoint.com/2018/05/customize-your-ubuntu-desktop-using-gnome-tweak/) 有些相似。

也就是说，安装这个工具其实十分简单，只是 [elementary OS 6 Odin](https://www.debugpoint.com/2020/09/elementary-os-6-odin-new-features-release-date/) 与早期版本（例如 elementary OS 5 Juno）存在一些区别。从 elementary OS 6 Odin 开始，这个工具已经重命名为 <ruby> Pantheon 优化工具 <rt>  Pantheon Tweaks Tool </rt></ruby>。下面是安装步骤。

### 安装 elementary 优化工具

elementary OS 并没有内置用于添加 PPA 的 `software-properties-common` 软件包。如果你还没有安装此软件包，请使用如下命令安装：

```
sudo apt install software-properties-common

```

#### elementary OS 6 Odin

该版本的优化工具已经改名，并且独立于原版开发。它的名称是 [Pantheon Tweaks](https://github.com/pantheon-tweaks/pantheon-tweaks)。你可以使用如下命令安装它。

```
sudo add-apt-repository -y ppa:philip.scott/pantheon-tweaks
sudo apt install -y pantheon-tweaks

```

#### elementary OS 5 Juno 及更旧版本

如果你正在使用 elementary OS 5 Juno 或者更旧的版本，你可以使用同一 PPA 安装早期版本的 [elementary-tweaks](https://github.com/elementary-tweaks/elementary-tweaks)。在终端输入以下命令即可安装。

```
sudo add-apt-repository -y ppa:philip.scott/elementary-tweaks
sudo apt install -y elementary-tweaks

```

### 使用方法

安装完成后，你可以在 “应用程序菜单 > 系统设置 > 优化” 中使用此工具。

在“优化”窗口，你可以修改一些选项，配置你的 elementary 桌面。

顺便提示一下，这款工具仅仅是 elementary 桌面设置的前端。如果你知道准确的名称或属性，你可以直接在终端中修改配置。你在这款优化工具中获得的选项也可以在 `dconf` 编辑器中查找 `io.elementary` 路径以修改。

如果你在安装或使用优化工具时遇到了一些问题，你可以在评论区留言。

---

via: <https://www.debugpoint.com/2021/07/elementary-tweaks-install/>

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

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


是时候让 Ubuntu 选择混合滚动发布模式了

滚动发布的感觉不太好...

滚动更新看上去很美好，但是要面对一个很大的问题，那就是兼容性。最早的时候用nv的闭源驱动下载安装配置好xorg.conf就行；后来有了kernel mode set后还得在xorg.conf中加入intel modesetting驱动的支持，为此掉了不少头发；现在又tm改了，内核里面已经没有CONFIG_DRM_I915_KMS了，开启的又是unstable，除了配置问题还得面临其他隐藏bug，我已经不知道怎么配了。<br />
其他的诸如：桌面环境更新，输入法没更新导致输入法无法切换；xorg更新后导致唤醒黑屏等等

# 是时候让 Ubuntu 选择混合滚动发布模式了

>
> 在两个 LTS 版本之间有三个短期版本。Ubuntu 应该用滚动发布模式来取代它们。
>
>
>

<img src="content_image/album_202108_10_101519m9v6hm5m6op5l4j6.jpg" alt="" title="">

即使你不是 Ubuntu 的用户，你可能也知道它的发布模式。

有一个 [长期支持（LTS）版本](https://itsfoss.com/long-term-support-lts/)，每两年发布一次，并有五年的支持。在这两个 LTS 版本之间，我们可以看到三个非 LTS 版本，它们的发布时间间隔为 6 个月。

LTS 版本会保持内核不会变化（除非你选择 [HWE 内核](https://itsfoss.com/ubuntu-hwe-kernel/)），它还维持了各种软件组件不变以提供稳定的生产环境。

介于两者之间的非 LTS 版 Ubuntu 具有 Ubuntu 的新功能、更新一些的内核、新的桌面环境以及 Ubuntu 软件库中的各种软件的新版本。

这些非 LTS 版本作为“试验场”，为最终在 LTS 版本中出现的功能提供测试，这已不是什么秘密。

这就是为什么我建议摆脱这些中间版本，在 LTS 版本之间选择 [滚动发布](https://itsfoss.com/rolling-release/) 模式。个中原因，请听我说。

### 在 LTS 发布之间进行滚动开发

六个月一次的发布计划给 Ubuntu 开发者制定了一个紧凑的工作时间表。这是一个好的方法，它可以使他们的目标集中在一个适当的路线图上。

但是，这也为在每个版本中提供“更多”新功能带来了额外的压力。如果时间很短，这不可能总是做到。还记得 [Ubuntu 不得不从 21.04 版本中删除 GNOME 40](https://news.itsfoss.com/no-gnome-40-in-ubuntu-21-04/) 吗？因为开发者没有足够的时间来完成它。

另外，最终用户（比如你和我）想选择留在非 LTS 版本中也是不可行的。其支持在九个月后结束，这意味着即使你没有立即升级到下一个非 LTS 的 Ubuntu 版本，最终你也不得不这样做。如果你在 6 个月内没升级，那你可能就得在 9 个月内升级。

我知道你会说，升级 Ubuntu 版本很简单。点击几下，良好的网速和一个潜在的备份就可以让你在新的 Ubuntu 版本上没有什么麻烦。

我的问题是，为什么要这么麻烦。滚动发布会更简单。让升级在 LTS 版本之间进行。

开发人员在新功能准备好的时候发布。用户随着系统更新不断得到升级，而不是每 6 个月或 9 个月做一次“重大升级”。

你看，那些选择非 LTS 版本的人是那些想要新功能的人，让他们通过滚动发布获得新功能。LTS 的发布时间表保持不变，每两年来一次。

### Bug 测试？像其他滚动发布的版本一样做个测试分支好了

当我说滚动发布时，我并不是指像 Arch Linux 那样的滚动。它应该是像 Manjaro 那样的滚动。换句话说，在测试后推出升级版，而不是直接在野外发布。

目前，新的 Ubuntu 版本有测试版，以便早期采用者可以测试它并向开发者提供反馈。这可以通过保留测试和稳定分支来实现，就像许多其他滚动发布的版本一样。

### 你对滚动发布怎么看？

我知道 Ubuntu 的铁杆用户期待着每一次的发布。代号、吉祥物、艺术品和墙纸，这些都是 Ubuntu 的传统的一部分。我们应该打破这种传统吗？

这只是我的看法，我很想听听你的看法。Ubuntu 应该选择这种混合滚动模式还是坚持目前的模式？你怎么看呢？

---

via: <https://news.itsfoss.com/ubuntu-hybrid-release-model/>

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

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


硬核观察 #359 Firefox 版本号到了 100 会发生什么

Summary: 更多：• Google 正计划为 Fuchsia OS 安装完整的 Chrome • 英特尔 C/C++ 编译器全面采用 LLVM 技术

看来以后amd的u最好不要用chrome了

我是怎么把“Intel的编译器全面采用LLVM”看成“chrome将采用英特尔编译器”的。。。

# 硬核观察 #359 Firefox 版本号到了 100 会发生什么

### Firefox 版本号到了 100 会发生什么

根据 Chrome 和 Firefox 的官方时间表，Chrome 100 稳定版将于 2022 年 3 月正式发布 ；Firefox 100 将于 2022 年 3 月进入 Nightly 版本。Mozilla 担心浏览器的 User-Agent 字符串带有三位数的 Firefox 版本号可能会破坏许多网站的功能。为此他们在 Firefox Nightly 92 版本更新中进行了实验，在该字符串中使用 100 这个数字进行测试：Mozilla/5.0 (Windows NT 10.0; rv:100.0) Gecko/20100101 Firfox 100.0。开发人员需要检查他们的网站代码，以确保 Firefox 100 不被当成 Firefox 10 或 Firefox 00。

>
> 开源软件的“谦逊”传统被抛弃了，不知道从谁开始，一年不换几个大版本号就感觉没做什么似的。
>
>
>

### Google 正计划为 Fuchsia OS 安装完整的 Chrome

Fuchsia 项目和 Chromium 项目有很多重叠之处，并与 Chrome OS 共享代码和硬件。时至今日，Fuchsia 项目依然利用 Chromium 引擎。根据 Chromium BUG 追踪器，自今年 5 月开始，Google 就开始为 Fuchsia OS “创建 Chrome 浏览器安装包”，也就是说 Fuchsia OS 将会获得完整的“Google Chrome”浏览器体验，支持包括同步等关键功能。

>
> 这样折腾，不如两个系统合并起来好了。
>
>
>

### 英特尔 C/C++ 编译器全面采用 LLVM 技术

英特尔的下一代 C/C++ 编译器正在[全面采用](https://software.intel.com/content/www/us/en/develop/blogs/adoption-of-llvm-complete-icx.html) LLVM 编译器堆栈，以取代他们以前的专有编译器代码库。英特尔的编译器专家称，最新的英特尔 C/C++ 编译器使用 LLVM 可以提供更快的编译时间、更好的优化、增强的标准支持，以及对 GPU 和 FPGA 卸载的支持。英特尔建议所有新项目使用他们基于 LLVM 的英特尔 C/C++ 编译器，现有项目应计划在今年迁移到新编译器。他们的“经典”英特尔 C/C++ 编译器将在定期更新结束后过渡到遗留模式。除此以外，他们也在将 Fortran 编译器过渡到 LLVM。

>
> LLVM 发展迅速，GCC 似乎有些落伍了，这是 GPL 的原因吗？
>
>
>


《代码英雄》第四季（6）：开源硬件 —— 创客的联合

Summary: 人们从未停止过改装。个人电脑成为主流后，对硬件的黑客改装并没有消失。

人们从未停止过改装。个人电脑成为主流后，对硬件的黑客改装并没有消失。

# 《代码英雄》第四季（6）：开源硬件 —— 创客的联合

>
> 代码英雄讲述了开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。
>
>
>

>
> **什么是《代码英雄》**
>
>
> <ruby> 代码英雄 <rt>  Command Line Heroes </rt></ruby>是世界领先的企业开源软件解决方案供应商红帽（Red Hat）精心制作的原创音频播客，讲述开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。该音频博客邀请到了谷歌、NASA 等重量级企业的众多技术大牛共同讲述开源、操作系统、容器、DevOps、混合云等发展过程中的动人故事。
>
>
>

本文是《[代码英雄](https://www.redhat.com/en/command-line-heroes)》系列播客[《代码英雄》：第四季（6）开源硬件 —— 创客的联合](https://www.redhat.com/en/command-line-heroes/season-4/open-source-hardware)的[音频](https://cdn.simplecast.com/audio/a88fbe/a88fbe81-5614-4834-8a78-24c287debbe6/84559c59-7868-461d-af3f-a002e1d0646f/s4e6-open-source-hardware-vfinal-20200306_tc.mp3)脚本。

>
> 导语：人们从未停止过改装。个人电脑成为主流后，对硬件的黑客改装并没有消失。但它确实发生了变化。新一代的艺术家、设计师和活跃分子正联合起来，用开源硬件来改变世界。
>
>
> 曾经，对硬件的黑客改装是昂贵和耗时的。更具适应性的微控制器正在使这种改装变得更加容易。但是，即使进入门槛开始下降，围绕硬件销售的做法也继续偏向于保密性。Ayah Bdeir、Alicia Gibb 和 Limor Fried 正在努力保持硬件的开放。这些领袖们分享了她们是如何帮助发起开源硬件运动的，并在激烈的分歧中穿行，使每个人都能成为工程师。
>
>
>

**00:00:00 - Saron Yitbarek**：

现在是 2010 年 9 月 22 日，明天第一届开源峰会即将在纽约开幕，现在，这次活动的两位组织者 Alicia Gibb 和 Ayah Bdeir 都有些忐忑不安。

**00:00:13 - Alicia Gibb**：

在这样的夜晚，总是会产生紧张的情绪，比如“天哪，要是没有人来参加怎么办？”

**00:00:20 - Ayah Bdeir**：

这就好比，“嗯，就像是我们有一个会议室，大概会来 30 人，嗯，我们还会提供三明治这样。”

**00:00:27 - Saron Yitbarek**：

Alicia Gibb 和 Ayah Bdeir 几个月之前才初次见面，Ayah 召集了一群人组织了一个名为<ruby> 开源硬件 <rt>  Opening Hardware </rt></ruby>的研讨会，每一位与会者都以自己的方式参与到了一项新兴的、令人兴奋的新计划当中：<ruby> 开源硬件运动 <rt>  open source hardware movement </rt></ruby>。但是，这个早期的社区非常分散，而且缺乏良好的组织，同时每个人对于“开源硬件”的理解都有所不同。当时，Alicia 和 Ayah 意识到她们需要将这个研讨会提升到一个新的水平。

**00:01:05 - Alicia Gibb**：

所以，她和我决定共同努力，把研讨会进一步升级为<ruby> 开源硬件峰会 <rt>  Open Hardware Summit </rt></ruby>，让更多人可以参与到开源硬件中。

**00:01:12 - Saron Yitbarek**：

由于只有三个月的时间来准备这次峰会，紧迫的时间给她们带来了很大的压力。但是 Alicia Gibb 和 Ayah Bdeir 对于这次的合作感到非常兴奋。一群热烈的独立<ruby> 创客 <rt>  maker </rt></ruby>的初次会面会碰撞出怎样的火花，她们对此非常好奇。距离第一次峰会的所剩时间已经不多了，在 9 月 23 日早上 6 时，也就是峰会召开当天的早上，她们收到了一封来自会场联系人的电子邮件。

**00:01:49**：

当今的开源硬件是整个开源运动中一个引人注目的分支，如同开源硬件与工程学联系在一起一样，它也同时涉及了设计和艺术领域。事实上，开源硬件运动是早期计算机爱好运动的延续。还记得第三集里提到的<ruby> 自制计算机俱乐部 <rt>  Homebrew Computer Club </rt></ruby>的世界吗？在个人电脑成为主流之后，对硬件的黑客改造并没有就此销声匿迹。甚至当计算机成为一个巨大的专有业务之后，对硬件和电路的<ruby> 黑客改造 <rt>  tinkering </rt></ruby>的热爱、对与同好者分享你的创作的热爱，也从未真正消失过。人们从未停止过改造，而如今开放的硬件文化与早期的改造爱好者有很多共通之处。不同的是，现在这个开源运动分支的掌舵人，比如 Alicia Gibb 和 Ayah Bdeir，是全新一代的开发者和思想家。在接下来的内容中，我还会为大家介绍这个运动的第三位领导者：Limor Fried。我是 Saron Yitbarek，这里是《代码英雄》，一档来自红帽的原创播客。

**00:03:09**：

早在 2000 年代中期，开源硬件社区还不能算是一个真正的社区。当然，有个黑客的小圈子，那里有对开源硬件充满想法的人。越来越多这样的圈子在世界各地出现，其中一个位于麻省理工学院（MIT）。

**00:03:32 - Ayah Bdeir**：

我是 Ayah Bdeir，是 littleBits 的创造者。这个团队几乎都是由一群在麻省理工媒体实验室里的怪人组成，我们之中有艺术家、有设计师，还有一些积极分子，我们想用科技对世界做出一些改变。

**00:03:54 - Saron Yitbarek**：

Ayah 是这个由新硬件赋能的下一代多学科创客之一。她是一名工程师和互动艺术家。她毕业于<ruby> 贝鲁特 <rt>  Beirut </rt></ruby>，于 2004 年获得了计算机与通信工程及社会学的学位，之后于 2006 年毕业于麻省理工学院媒体实验室。

**00:04:15 - Ayah Bdeir**：

我和父母商量，在我取得了工程师的学位之后，我可以去学习我想要学的设计。这是一个约定。

**00:04:25 - Saron Yitbarek**：

工程技术开始进入世界各地的各种非工程领域。在 2008 年，Ayah 获得了 Eyebeam 艺术和科技中心的奖学金，就在这里，她创造了 littleBits。它是一种类似于乐高的、采用预制的、可以用磁性吸附的电子块，不过它们还包含了 LED 灯、声音传感器、发动机和太阳能电池板等。

**00:04:51 - Ayah Bdeir**：

所以当你拿出一个 LED 灯，装上电池，它就亮了。你可以在中间放一个光传感器，这样你就得到了一个小夜灯。你再将发动机和轮子装上，现在这是一个光动车了。如果再加上低功耗蓝牙模块，你就可以用手机来激活它。所以你并不需要是一个工程师，只需要花几秒钟就可以组装它。它们可以用磁铁扣住，就像是有魔法，而且扣住的时候声音听起来很美妙。

**00:05:22 - Saron Yitbarek**：

Ayah 有两个目标：把 littleBits 做成一个公司，并使之开源。她希望工程知识能够被每个人所接受。

**00:05:32 - Ayah Bdeir**：

现在只要是 IT 公司，它的很多工作都围绕着开源软件。有一些人感兴趣如何将开源应用于建筑、如何用于硬件、如何用于电子设备。世界上充满了这种奇思妙想，以及为此付出的努力，这很有意义。

**00:05:51**：

如果所有人都封锁他们的专利和知识产权，世界将会陷入困境。所以，对我来说，如何找到一种方法，让你可以支持自己，持续地发展，创造强大的企业，还可以分享知识，这很有趣。

**00:06:15 - Saron Yitbarek**：

但是 littleBits 也必须作为一个企业来运作，制造、分销、投资，每个部分都要花钱。Ayah Bdeir 是如何做到在商业化的同时，使她的硬件，也就是她的运营核心，成为开源的呢？为了找到这个问题的答案，她在<ruby> 知识共享 <rt>  Creative Commons </rt></ruby>组织做了一项研究，把 littleBits 当作一项案例研究。这是她决定在 2010 年初举办“开源硬件”研讨会的原因。

**00:06:46 - Ayah Bdeir**：

我们做了一个研讨会，我们想，“哪些东西是关键？我们应该有一个定义吗？我们需要一个开会的地方吗？我们需要一个网站吗？什么有用，什么没用？”与此同时，Alicia Gibb 正在另一家想要做开源的创业公司 Bug Labs 做一些类似的工作。

**00:07:08 - Alicia Gibb**：

我非常赞成在开源你的硬件之前，需要做好情感上的准备，因为在某种程度上意味着，你要把自己的孩子送出去。

**00:07:17 - Saron Yitbarek**：

Alicia Gibb 当时在一家叫做 Bug Labs 的开源硬件供应商工作，担任研究员和原型设计师。她曾经是一位图书管理员。

**00:07:28 - Alicia Gibb**：

我本来是为了取得图书和信息管理硕士学位，最终却走向了这个奇怪的方向，进入了电子领域。我发现自己真的非常热爱它，我享受点亮一个 LED 灯的感觉，沉迷于自己可以让电子去实现一些事情。这种感觉有一些类似于你可以控制宇宙中的小小的一部分，这样的感觉有一种强大的力量，我喜欢这种感觉。

**00:07:51 - Saron Yitbarek**：

尽管图书管理和开源硬件似乎有很大差异，但是对于 Alicia 而言，这两者展现出了相似的精神。

**00:07:58 - Alicia Gibb**：

作为一名图书馆员，你的工作并不是看门，你在那里是为了帮助人们寻找他们想要的信息。这种本质有点为我铺平了一条通往开源的路，让它展现在了我的眼前。

**00:08:13 - Saron Yitbarek**：

就像 Alicia 任职的 Bug Labs，许多公司开始意识到开源硬件可以创造商业机会。小型公司可以通过开源接触到更广泛的创客群体（也可以说是顾客）。大型公司可以对竞争对手开放设计，并通过向他们提供相关部件而获利。

**00:08:39 - Alicia Gibb**：

我的老板最后问我，“你看，除了我们，一定有更多的人在尝试做开源硬件，你觉得自己可以找到他们并且把他们聚在一起吗？”

**00:08:49 - Saron Yitbarek**：

就是这段谈话，让开源峰会的种子在 Alicia 心中种下。为此她开始寻找其他开源硬件创客，此时 Ayah 也得到了知识共享组织的奖学金，并主持了这次研讨会。

**00:09:03 - Alicia Gibb**：

所以，这就是我第一次见到了 Ayah 本人。当时我非常激动，因为我读过她的研究报告，并且在写 Arduino 的论文时还参考了她的文章。这个领域的很多人我都见过，要么就是在电子邮件列表或其他地方见过。

**00:09:20 - Saron Yitbarek**：

Ayah 在她的研讨会上召集的人后来都成为了开源硬件运动的领导者。其中有 Arduino 的成员、SparkFun 和 MakerBot 的创办者，还有一位非常有趣，她以世界上第一位程序员的名字命名了她的公司。

**00:09:49 - Limor Fried**：

你好。

**00:09:50 - Saron Yitbarek**：

你好 Limor，最近怎么样？

**00:09:52 - Limor Fried**：

嗨，Saron，很高兴见到你。

**00:09:54 - Saron Yitbarek**：

我也很高兴见到你。我去曼哈顿中心拜访了 Limor Fried。她不仅是 Ayah 研讨会的一份子，同时在 2000 年代初，她也是 Ayah 在麻省理工的同学。

**00:10:09 - Limor Fried**：

我喜欢拆解物品。我很少有强烈的意愿做什么，就用音乐来举个例子吧，尽管我父母想让我去学习小提琴，我喜欢的却是摆弄电子产品、计算机和技术。当时我不太喜欢把它们重新组装起来。但是随着我渐渐长大，学习了解了更多工程学知识，我开始组装东西而不仅是把它们拆开。这些齿轮和发动机，都是美丽又复杂的技术之舞。

**00:10:37 - Saron Yitbarek**：

在麻省理工，Limor 学到的不仅是组装，更重要的是如何以一致而精密的方式一遍又一遍地组装。与此同时，一件很酷的事情正在发生，对硬件的黑客改造出现了。

**00:10:53 - Limor Fried**：

在过去的几十年，你可以将单个芯片连接起来，这样你可以制造出一些东西，但是它们相当巨大、昂贵，且耗费大量的时间。

**00:11:03**：

之后人们想到，“既然我们可以在电脑上写代码，为什么我们不为电子元件编写代码呢？”我开始尝试改造电子设备。就在这时，一些可重复编程的低成本 MAC 控制器出现在市场上。

**00:11:20 - Saron Yitbarek**：

改变游戏规则的是一款叫做 Arduino 板卡的微型控制器，由意大利人 Massimo Banzi 创造。他正在一款叫做 BASIC Stamp 的旧设备上探索交互设计的新方法，但是这个设备非常昂贵，而且计算能力较弱，也不兼容 MAC。所以 Banzi 和他的团队创造了一个更便宜、更强大的微控制器，还可以接入到电脑。他们基于一种叫做 Processing 的图形语言进行编程，他们还用公元十世纪的意大利统治者 Arduino 国王的名字来命名他们的新板卡。Arduino 的出现是 Limor Fried 这样的硬件黑客的灵感来源。

**00:12:07 - Limor Fried**：

Arduino 真的非常非常的强大，你可以用它创造你自己的产品，这是迄今为止没有出现过的。很多人是软件工程师，或者想成为软件或硬件工程师。他们可能对电脑技术有些熟悉，但是他们还没有意识到，哇，你实际上可以制造出物理硬件。我认为，对于那些码农们来说，让“盒子”在屏幕上移动是一件很好的事情，我自己也做过许多类似的事情，他们最终会想，“我真的厌倦了在我的屏幕上移动 CSS 盒子，我想要创造一些可以拿起来的东西，可以和朋友分享的东西。”

**00:12:43 - Saron Yitbarek**：

在当时，这种创造物理硬件的概念还很新，Limor 在麻省理工的工程课程中并没有涉及，所以她就另外自学了这方面的知识。

**00:12:53 - Limor Fried**：

我觉得我在学校课程和自学课程中都学到了很多东西，我很高兴我会傅里叶变换，但是我更高兴的是我熬夜做出了一个并行端口选择程序。这不是课程上教的东西，但现在它实际上已经在课程中了。

**00:13:07 - Saron Yitbarek**：

所以在 2005 年，Limor 在做改装而没有在寝室完成她的论文，导致她的论文延误了。她被电路板环绕，自己动手做 MP3 播放器和便携电子游戏机。每当她完成一个项目，她都在网上分享电路图。现在，她的线上教程变得非常受欢迎，甚至有其他的创客问她是否可以购买她定制的微型控制套件。起初她拒绝了。但之后她意识到这是有意义的。于是，在麻省理工的宿舍，Limor 开始向其他的爱好者出售电路板和电路图。她受到了<ruby> 自由软件基金会 <rt>  Free Software Foundation </rt></ruby>和<ruby> 电子前沿基金会 <rt>  Electronic Frontier Foundation </rt></ruby>的启发。

**00:13:58 - Limor Fried**：

修改的自由、重用的自由。就像是在五金商店里买的工具一样，他们不会说，“请在这里签署许可协议，你只可以用这个锤子来在墙上钉画，不可以用它们盖房子。如果你要盖房子，你需要买一把加强版锤子。”但是现在，这正是我们在软件方面所面临的情况。我们意识到，如果我们不给人们运用软件的自由，不允许他们以公共的方式运用他们自己写的或是别人写的软件，这将是我们的未来。

**00:14:26 - Saron Yitbarek**：

他们为软件做的事情，她同样也想为硬件做这些。Limor 想倡导那种你可以使用 Arduino 控制板来创造的硬件，那种你可以在自己的宿舍里制造出的硬件。但是，为了推进这一愿景，Limor 需要开放的心态，需要吸引和教导其他创客。而且，很快就需要对所有这些开源硬件进行保护。现在让我们回到对 Limor 的采访。

**00:14:56 - Limor Fried**：

我们现在位于曼哈顿中心，在我们 50,000 平方英尺的车间里，在这里我们完成了制造、生产、测试、编程、设计，还有一些命令行操作。

**00:15:09 - Saron Yitbarek**：

所以，是的，这和她在 2005 年创办公司的那个小寝室相差甚远。Limor 向业余爱好者发售工具包的业务最终大规模地发展成为了一家名为 Adafruit Industries 的公司，它是以构思了世界上第一个计算机程序的 19 世纪英国数学家 Ada Lovelace 命名的。

**00:15:31 - Limor Fried**：

我们在生产和制造包含开源的固件和软件的开源硬件。这像是开源世界里的<ruby> 威利旺卡仙境 <rt>  Willy Wonka Wonderland </rt></ruby>。

**00:15:41 - Saron Yitbarek**：

这像是迪士尼乐园。

**00:15:41 - Limor Fried**：

是的，确实有人这么说过。

**00:15:42 - Saron Yitbarek**：

这是硬件的迪士尼乐园。Adafruit 的工厂在 2012 年开业。当我们参观它的时候，Limor 向我们展示了她的制版机，它可以勾勒出各个元件在版面上的位置。

**00:15:56 - Limor Fried**：

所以，你的手机、电脑、任何电子产品或者 GPS、你在假期赠送的小玩具、许许多多的产品都是由<ruby> 拾取-贴装 <rt>  pick-and-place </rt></ruby>流水线制造出来的。这些流水线所做的就是拾起非常小的表面贴装部件，并且放置它们。正因为这样，它们的名字叫做“拾取-贴装”线。

**00:16:19 - Saron Yitbarek**：

它的 Pick 操作系统包含了数据库、字典、查询语言、流程语言、外设管理、多用户管理和编译的 BASIC 编程语言。

**00:16:33 - Limor Fried**：

是的，这是一块薄薄的金属，你可以看到上面的激光切割小孔。

**00:16:38 - Saron Yitbarek**：

嗯。

**00:16:39 - Limor Fried**：

他们看起来像花边一样漂亮。

**00:16:41 - Saron Yitbarek**：

这真的太美了。

**00:16:42 - Limor Fried**：

是的，你再看这里，在电路板上看到的图案与模板上的花边相匹配。所以在拾取-贴装之后，所有的元件都安置在了电路板上。它们要经过这个烤箱。

**00:16:56 - Saron Yitbarek**：

嗯。

**00:16:56 - Limor Fried**：

这基本上就像是熟食店里的那些百吉饼传送带。

**00:17:00 - Saron Yitbarek**：

这看起来像是一个微型的城市。

**00:17:01 - Limor Fried**：

是啊。

**00:17:03 - Saron Yitbarek**：

Limor 发现，总的来说硬件的生态系统在历史上是开放的。不像软件，硬件总是更为开放一些。当你购买机械产品，甚至是电子产品时，都会附赠电路图，以防万一你需要修理它们。

**00:17:20 - Limor Fried**：

那时我们并没有真正意义上的开源硬件，但是所有的东西，你只需要一个螺丝刀就可以轻轻撬开。因此，这是某种自带的文档。你不会在没有电路图的情况下修理你的 Apple II 的软盘驱动器，所以你可以深入挖掘电路图。可是如今，这不再是现实了。现在你的硬件是在一个美观光滑的玻璃柜中。由此可见，自愿分享硬件的年代已经结束了，这就是为什么我必须想出一种方法让人们分享它们。

**00:17:53 - Saron Yitbarek**：

Limor、Ayah、Alicia 和其他参加知识共享组织的研讨会的开源硬件爱好者们，在一个关键时刻走到了一起，当时，了解硬件是如何组装起来的机会正在减少。如果他们想要为开源硬件社区打造一个未来，让开源运动成为可持续的运动，而不再只是黑客爱好的聚会，他们需要一起建立一个带有规则、定义和标准的更集中的集体。

**00:18:22 - Limor Fried**：

开源社区就像是珍贵且易碎的宝石，一个小的难题都可能将它毁灭。它是由一个个人组成的，人们编写代码、支持代码、使用代码，并为它撰写文档。发布代码是一件非常私人的事情。你在向大家展示你是如何思考的、如何编写的、你的大脑是如何构思的。如果没有一个健康的良好的环境，人们就不会通过他们发布的代码来自由地表达自己。

**00:18:51 - Saron Yitbarek**：

之后发生了什么呢？当一代硬件创客离开他们的寝室和黑客圈子并彼此相遇时，所发生的事情将为一场运动奠定基础。这是 2010 年 9 月 23 日清晨，在几个小时之后，Alicia Gibb 和 Ayah Bdeir 将欢迎与会者们来到第一届开源硬件峰会。在短短三个月里，她们为全新一代的创客们成功创建并策划了一个崭新的活动。但是他们会来吗？当天早晨 6 点，她们收到了一封来自会场联系人的邮件，令她们惊讶的是，邮件中说……

**00:19:37 - Alicia Gibb**：

门外已经有一队人在等候入场了，而峰会要到 9 点或延后的某个时候才会开始，然而在 6 点就已经有人在等待了。

**00:19:48 - Saron Yitbarek**：

2010 年的首届峰会，大厅被 320 个人挤得满满当当。

**00:19:55 - Alicia Gibb**：

这个社区的规模大到完全出乎我们的意料，同时也提醒了我这是一个国际化的社区。其中令我印象深刻的一点是，有人想要从泰国给予我们捐赠，于是他们从泰国寄来了现金和一张便签。他们竟然会如此信任我们，以至于在信件里寄来现金。

**00:20:16 - Ayah Bdeir**：

我环顾四周，感到“就是这个瞬间”。我当时就感觉到，这里发生的一些事情将成为一个历史时刻。而就在这期间和之后，从想要赞助的人身上，从期待着明年发言的人身上，我们感受到了支持。

**00:20:34 - Saron Yitbarek**：

在第一届峰会之前，Alicia 和 Ayah 知道自己的主要目标是制定开源硬件的定义。

**00:20:42 - Alicia Gibb**：

我们需要一个定义，其实原因有两个：首先是为了社区里达成共识，这样人们就不会认为你可以把一些东西作为开源硬件放在那里，但又说，“哦，但你……得有一个非商业条款才行”。我们必须能够转售硬件，特别是因为硬件需要花钱才能从各种零件把它组装起来。所以对于人们是否分享布线图，还是只是电路图就足够了，或者你是否需要打开电路板文件以及诸如 “等等，这是否符合开源硬件的要求？因为我们控制着芯片，但我们不开放芯片的源代码” 之类的事情，存在着分歧。

**00:21:23**：

第二个原因很重要，这是关于硬件本身的。硬件不同于软件，你不能在创造它的那一刻拥有它的版权。硬件实际上是天生自由的，直到你申请到专利，并将专利封锁垄断，它才真正属于你。所以我们希望这里可以有一些定义，可以或多或少地提供法律保障，可以成为能够在法庭上得到支持的社区准则。

**00:21:55 - Saron Yitbarek**：

这实际上并不是开源硬件标准化的第一次尝试。在 1997 年，一个名为 Bruce Perens 的人创建了一个开源硬件的认证项目。他是一位著名的开源人物，因为他在同一时期帮助创建了最初的开源软件准则。这些被一个叫做<ruby> 开源倡议 <rt>  Open Source Initiative </rt></ruby>（OSI）的组织管理着。但是在 1997 年，并没有围绕这个认证项目产生什么影响，随着新一代的创客开始出现，更新这些原则是有意义的。在开源峰会上，她们会让所有人都就开源硬件的标准化定义和最佳实践达成一致。仅仅让大家聚在一起，分享想法和项目似乎就能启动这个社区。但随后的讨论转向了定义开源硬件的含义。

**00:22:57 - Ayah Bdeir**：

有一些纯粹主义者认为，除非整个工具链都是开源的，否则不能称之为开源硬件。其他人会说，“不，这是不切实际的，因为我使用的一些电路设计工具或是 3D 打印机并不是开源的，但是它们是可以使用的，并且有免费的版本。”至少软件是这样的，因此，这就足以让你复制和修改那些发明。因此，为什么开源硬件的工具链必须全部是开源的呢？

**00:23:27**：

然后围绕归属问题进行了讨论。在许多开源软件的许可证中，<ruby> 归属权 <rt>  attribution </rt></ruby>并不那么重要。但在这里，我们对此做了大量的讨论，因为硬件很昂贵。创造它的人并不只是在车库里对着电脑，他们还投入了美元，在现实世界里投入了现金到实物中，这些实物从一个国家来到另一个国家并且被制造出来，然后以某种方式被收回。

**00:23:58 - Saron Yitbarek**：

Ayah Bdeir 的老同学 Limor 是开源峰会的主讲人之一。

**00:24:04 - Limor Fried**：

所以我们的辩论之一是，CAD 文件必须是开源格式的吗？我记得当时大家围坐在一个大圆桌边，每个人都在发表自己的观点。有些人说，不。而有些人则说是。我们最终说，“我们不如说，它必须采用合理的原始格式，否则好像我们必须得想出点什么似的。”之后我们找到了比较折中的说法，“如果你可以发布你的文件，它不一定必须是公开的文件格式，但必须是一个可以被合理使用工具的人阅读的格式。”

**00:24:40 - Saron Yitbarek**：

他们甚至从知识共享组织请来了几位律师来帮助理顺问题。

**00:24:44 - Limor Fried**：

律师说，“听着，如果你要为开源硬件上法庭，那就已经输了。”所以我们说，很多被许可人和社区的裂痕是不匹配的期望或人们没有很好的沟通他们的期望。因此，这个定义所做的是，它不是一个真正的法律框架，因为实际上很多都没有法律保护，但它是一个框架，可以让人们表达他们的期望，他们想要他们的硬件、固件以及设计被他人使用。

**00:25:17**：

到目前为止，这个定义取得了良好的效果。当越多的人展示出他们希望自己的硬件被怎样使用，其他人就可以更好地使用这些硬件，因为这样就不会有类似“你说要这样做，但是按照法律来说我应该那么做。”的麻烦。

**00:25:35 - Saron Yitbarek**：

对于开源硬件定义的争论持续了一年。同时，还举行了一次竞赛，以创造一个与定义相一致的徽标。在 2011 年的第二届开源硬件峰会中，人们打算批准这个开源硬件的定义。但是也出现了一些小的问题，在竞赛中取得胜利的徽标有一个麻烦，它与<ruby> 开源倡议 <rt>  Open Source Initiative </rt></ruby>（OSI）的徽标很相似。

**00:26:04 - Alicia Gibb**：

我当时还在想，“哦，就像彩虹和独角兽，每个人喜欢的都是类似的。”这就像是一个警钟，即使在开源社区，我想也会有错误发生，有分歧发生，也会有人想在法律上找你麻烦。

**00:26:22 - Saron Yitbarek**：

最终我们达成了妥协，但是这次的经历激发了新的运动。在 2012 年，Alicia、Ayah 及她们的团队创立了<ruby> 开源硬件联盟 <rt>  Open Source Hardware Association </rt></ruby>（OSHWA），并且这个联盟也有了自己的定义。

**00:26:41 - Alicia Gibb**：

所以，开源硬件的定义差不多是，你同意把你的硬件以开源的方式呈现出来，允许其他人去学习、改造、然后转售你的设计和硬件。然后，你可以要求在硬件上注明归属，可以要求其他人遵循你附加在硬件上的许可证。

**00:27:11 - Saron Yitbarek**：

从最初的宿舍、车库和餐桌，从世界各地的上千名创客那里，终于出现了一个社区标准。

**00:27:22 - Limor Fried**：

无论你使用何种许可证，人们都可以对你说，“如果你把自己的东西称作‘开源硬件’，这就是它的定义，这里你可以表达你的基本期待。如果不符合这些，请别叫它‘开源硬件’。”除此之外，几年前我遇到的另一件事更具体一些，比如说，注册开源硬件的目录。当你要加入其中时，你基本上要做出一个小小的承诺，说我要发布的设计遵守这个定义。所以说定义是某种基石，这些东西是在基石上的高楼。所以当人们得到了一个小徽标和标识符，他们就可以说，“是的，这是开源硬件，开源硬件联盟是支持我的。”

**00:28:07 - Saron Yitbarek**：

今年（2020）是开源硬件峰会庆祝成立 10 周年，如今他们甚至开拓了消费者领域。

**00:28:16 - Alicia Gibb**：

因此，有一系列来自 System76 的电脑是开源硬件，像 LulzBot 这样的 3D 打印，还有其他 3D 打印机也是开源硬件。我认为现在我们正处于更多消费者产品出现的风口。

**00:28:35 - Saron Yitbarek**：

在过去的 10 年，开源硬件为科技文化的开放性和多样性设立了一个新的标准。

**00:28:43 - Alicia Gibb**：

真正让我远离开源软件的事情之一是，我去参加几个会议时被问我的男朋友在哪里，我是和谁一起来的，这样类似的问题。这是在假定，作为一位女性，我是不会自己前来的。我可以看到的是，在开源硬件社区中，大家都非常年轻，我们刚刚建立。我和 Ayah 都认为，“在开源硬件社区里，这样的事情一定不会发生。”

**00:29:11 - Saron Yitbarek**：

在第一届峰会时，有几个 10 岁的创客参加了会议。他们是峰会上的亮点。峰会的组织者是女性，而开源硬件运动的代言人就是女性。Limor Fried 在 2011 年成为了第一位登上《WIRED》杂志封面的女工程师。根据 Ayah Bdeir 的说法，开源硬件的可及性和多样性，是我们现在应该关注的问题。

**00:29:43 - Ayah Bdier**：

在我的成长过程中，技术一直在我的生活里。它曾经对我而言是一门学科。你可以说，自己不是技术人员，这不是问题。现在已经不是这样了。技术是我们做所有事情的基础。它是我们如何吃饭、喝水、交谈、旅行、预测和出版的基础。技术影响民主、心理健康、社会和环境。这个使命很重要，因为如果我们失去了科技的创造者和决策者，失去了象征着世界人口的构成的科技，这时我们所作的决定就会有所偏驳，这是不包容的、是危险的。

**00:30:39 - Saron Yitbarek**：

《代码英雄》是一档来自红帽的原创播客节目。请在 <https://www.redhat.com/commandlineheroes> 上查看我们对开源硬件的研究。如果你已经看到了，请注册订阅我们的新闻。我是 Saron Yitbarek，感谢你的收听。下期之前，编码不止。

**附加剧集**

Ayah Bdeir、Alicia Gibb 和 Limor Fried 是将多样性纳入开源硬件社区的早期支持者。听听她们是如何定下这个基调的。

>
> **什么是 LCTT SIG 和 LCTT LCRH SIG**
>
>
> LCTT SIG 是 LCTT <ruby> 特别兴趣小组 <rt>  Special Interest Group </rt></ruby>，LCTT SIG 是针对特定领域、特定内容的翻译小组，翻译组成员将遵循 LCTT 流程和规范，参与翻译，并获得相应的奖励。LCRH SIG 是 LCTT 联合红帽（Red Hat）发起的 SIG，当前专注任务是《代码英雄》系列播客的脚本汉化，已有数十位贡献者加入。敬请每周三、周五期待经过我们精心翻译、校对和发布的译文。
>
>
> 欢迎[加入 LCRH SIG](/article-12436-1.html) 一同参与贡献，并领取红帽（Red Hat）和我们联合颁发的专属贡献者证书。
>
>
>

---

via: <https://www.redhat.com/en/command-line-heroes/season-4/open-source-hardware>

作者：[Red Hat](https://www.redhat.com/en/command-line-heroes) 选题：[bestony](https://github.com/bestony) 译者：[Ucoer](https://github.com/Ucoer) 校对：[Northurland](https://github.com/Northurland), [wxy](https://github.com/wxy)

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


使用 Linux 终端查看你的电脑上有哪些文件

Summary: 通过这个 Linux 教程学习如何使用 ls 命令在终端中列出文件。

通过这个 Linux 教程学习如何使用 ls 命令在终端中列出文件。

# 使用 Linux 终端查看你的电脑上有哪些文件

>
> 通过这个 Linux 教程学习如何使用 ls 命令在终端中列出文件。
>
>
>

<img src="content_image/album_202108_11_142450etebpqtp7bl4kupt.jpg" alt="" title="List files on your computer">

要在有图形界面的计算机上列出文件，你通常可以打开一个文件管理器（Linux 上的 “文件”，MacOS 上的 “访达”，Windows 上的 “文件资源管理器”）来查看文件。

要在终端中列出文件，你可以使用 `ls` 命令来列出当前目录中的所有文件。而 `pwd` 命令可以告诉你当前所在的目录：

```
$ pwd
/home/tux
$ ls
example.txt
Documents
Downloads
Music
Pictures
Templates
Videos

```

你可以通过 `--all`（简写为 `-a`） 选项看到隐藏文件：

```
$ pwd
/home/tux
$ ls --all
.               Downloads
..              .local
.bashrc         Music
.config         Pictures
example.txt     Templates
Documents       Videos

```

如你所见，列出的前两项是点。单个点（`.`）实际上是一个元位置，代表 *你当前所在的文件夹* 。两个点（`..`）表示你可以从当前位置返回的上级目录。也就是说，当前目录在另一个文件夹中。当你在计算机目录间移动时，你就可以利用这些元位置为自己创建快捷方式，或者增加你的路径的独特性。

### 文件和文件夹以及如何区分它们

你可能会注意到，文件和文件夹是很难区分的。一些 Linux 发行版有一些漂亮的颜色设置，比如所有的文件夹都是蓝色的，文件是白色的，二进制文件是粉色或绿色的，等等。如果你没有看到这些颜色，你可以试试 `ls --color`。如果你有色盲症或者使用的不是彩色显示器，你可以使用 `--classify` 选项替代：

```
$ pwd
/home/tux/Downloads
$ ls --classify
android-info.txt
cheat/
test-script.sh*

```

你会发现，文件夹末尾加了一个斜杠（`/`），以表示它们是文件系统中的某一级目录。而二进制文件，如压缩文件和可执行程序，用星号（`*`）标记。

---

via: <https://opensource.com/article/21/8/linux-list-files>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[piaoshi](https://github.com/piaoshi) 校对：[wxy](https://github.com/wxy)

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


# 久等了！elementary OS 6 “Odin” 正式发布，带来令人激动的新变化

>
> 基于 Ubuntu 20.04 LTS，备受期待的 elementary OS 6 终于可以下载了。
>
>
>

[2021 年最值得期待的 Linux 发行版](https://news.itsfoss.com/linux-distros-for-2021/) 之一，终于来了。

elementary OS 6 基于 Ubuntu 20.04 LTS，它大幅改进了用户体验和安全性。

虽然我们已经列出了 [elementary OS 6 的新功能列表](https://news.itsfoss.com/elementary-os-6-features/)，但咱们还是来看看本次更新的主要亮点吧。

### 正式引入暗黑模式

elementary OS 6 加入这个功能可能为时太晚，但至少他们做了极大的努力，让整个系统拥有一致的暗黑模式体验。

你也会注意到，预装应用和应用中心里部分适配过的应用都支持暗黑模式。

暗黑模式在安装 elementary OS 6 后也可以直接在欢迎页设置。

### 通知优化

通知现在支持操作按钮和图标徽章，视觉更舒适，也更加易用。

### Flatpak 优先原则

为了加强隐私保护和安全性，elementary OS 6 提供了开箱即用的 Flatpak 应用支持。

现在，不仅仅是系统应用，在应用中心，所有应用都已经打包为 Flatpak 格式。

### 多点触控手势

对于触控板和触摸屏用户，elementary OS 6 带来了不错的手势交互，你完全可以借助手势来穿梭于系统中。

你甚至可以通过手势来忽略通知。

### 新应用，新更新

本次更新中，待办事项和固件更新正式加入预装应用。

同时，大部分系统应用（如邮件）也重构了 UI，以及获得了一些新功能。

### 其他重要改进

如果你想了解更多关于本次更新的内容，我强烈建议你试用 elementary OS 6 来自行探索。

当然，如果你现在就想速览其他重要的新功能，那么我列出几个：

* 在安装应用中心之外的第三方应用时会有警告。
* 在向终端粘贴需要 root 权限的命令时会有警告。
* 更便于区分多任务视图中活动窗口的细节变化。
* 系统设置内置了在线账户集成。
* 辅助功能优化。
* 全新壁纸。
* 改进的安装器。

### 下载 elementary OS 6

你现在可以从 elementary OS 的官网获取 elementary OS 的最新版本。如需了解详情，你也可以查阅 [官方公告](https://blog.elementary.io/elementary-os-6-odin-released/)。

* [下载 elementary OS 6](https://elementary.io)

---

via: <https://news.itsfoss.com/elementary-os-6-release/>

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

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


Summary: 更多：• DeFi 平台 Poly Network 被攻击，已造成至少 6 亿美元的损失 • TikTok 超越 Facebook 成为全球下载量最大的应用程序

# 硬核观察 #360 OpenAI 推出可将自然语言翻译成代码的 Codex API

### OpenAI 推出可将自然语言翻译成代码的 Codex API

为 GitHub Copilot 辅助编程工具提供技术支持的 OpenAI 组织，现又推出了可将自然语言转译成代码的私有测试版 [Codex API](https://openai.com/blog/openai-codex/) 。这套应用程序接口能够理解十多种编程语言，允许开发者以简单的英语词汇来阐述相关命令并执行，从而轻松为当前的应用程序开发流程引入自然语言编程体验。在接受了数十亿行公共代码的训练之后，Codex 能够支持广泛的框架和语言，以及适应不同开发者的编程风格。该 API 模型最擅长于 Python，但也 精通 JavaScript、Go、Perl、PHP、Ruby、Swift、TypeScript、Shell 等编程语言。

>
> 以后“码农”级别的程序员可以下岗了。
>
>
>

### DeFi 平台 Poly Network 被攻击，已造成至少 6 亿美元的损失

Poly Network 是一项用于在多个区块链之间进行通证交换的跨链协议，它运行在 Binance 智能链、以太坊和 Polygon 区块链上。周二发生的[攻击](https://www.coindesk.com/cross-chain-defi-site-poly-network-hacked)连续袭击了每条链，被窃取了至少 6.11 亿美元。这应该是迄今为止最大的 DeFi 黑客攻击事件之一。被盗资产中包括了 2.73 亿美元的 ETH、2.53 亿美元的 BNB、以及 8500 万美元的 USDC。而同样被盗的 3300 万美元的 USDT 则被 USDT 发行方 Tether 冻结。

>
> 最近以来，对跨链基础设施的攻击愈演愈烈，在 DeFi 越来越规模庞大的同时，可能一点小的错误就可能导致积木式崩塌。
>
>
>

### TikTok 超越 Facebook 成为全球下载量最大的应用程序

字节跳动在 2017 年推出了 TikTok 国际版，其[下载量](https://asia.nikkei.com/Business/Technology/TikTok-overtakes-Facebook-as-world-s-most-downloaded-app)现在超过了 Facebook、WhatsApp、Instagram 和 Facebook Messenger —— 后面这些都是 Facebook 的产品。该应用程序的受欢迎程度在全球疫情期间有所提高。

>
> 看来大家都是疫情期间在家刷“抖音”啊。
>
>
>


2021 年可以购买的 10 大 Linux 笔记本电脑

Summary: 想挑选一台安装有 Linux 的新笔记本电脑？这里有几个选项可以考虑。

好O

要是在国内三大电商平台都能轻松购买到就好咯

以前很想买，现在送我都不要。真用起来你就输了

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

希望linux桌面软件生态能完善起来

希望有Fedora的本儿，Fedora 35做的真不错。顺便说一句windows除了生态比较好，系统真心难用:-(，桌面打不过Gnome，实话实说

想挑选一台安装有 Linux 的新笔记本电脑？这里有几个选项可以考虑。

# 2021 年可以购买的 10 大 Linux 笔记本电脑

>
> 想挑选一台安装有 Linux 的新笔记本电脑？这里有几个选项可以考虑。
>
>
>

Linux 笔记本电脑是 MacOS 和 Windows 笔记本电脑的完美替代品。

从技术上讲，你可以通过安装任何你能找到的 Linux 发行版，将你选择的任何笔记本电脑变成一台 Linux 机器。

但是，在这里，我们的重点将放在提供 Linux 开箱即用体验的笔记本电脑上，确保无论你有什么样的预算，都能获得最佳的兼容性和支持。

### 大众品牌的 Linux 笔记本电脑

对于消费者来说，选择由大众品牌制造商生产的 Linux 笔记本电脑往往是最好的选择。

你不必担心售后、延长保修期和服务维修等问题。

戴尔和联想是通常提供预装了 Linux 的笔记本电脑的厂商之一。

请注意，这会因国家/地区的情况而定。

*本文中提到的价格已转换为美元，以方便比较，不包括运费和其他额外费用。*

#### 1、联想 Thinkpad X1 Carbon （第 8 代/第 9 代）

**价格**：起价为 **$1535**

联想的整个 Thinkpad 系列是 Linux 用户的一个热门选择。它经久耐用，提供了良好的兼容性。

然而，它的价格一直偏高。

你有三种选择，这取决于你的需求。如果你定制一台第 9 代 Thinkpad 笔记本电脑，你可以选择安装 Ubuntu 20.04 和 Fedora 33。

对于第 8 代机型，似乎 Fedora 33 不在考虑之列，而是提供了 Fedora 32 和 Ubuntu 20.04。

所有的配置都采用英特尔芯片组，第 8 代采用的是 10 代芯片组，第 9 代采用 11 代芯片组。

其他的大部分规格都相似，有 14 英寸显示屏（FHD、WQHD 和 UHD 可供选择）、高达 32GB 的内存、1TB 固态硬盘、指纹识别器和 Wi-Fi 6 支持。

* [Thinkpad X1 Carbon （第 9 代）](https://www.lenovo.com/us/en/laptops/thinkpad/thinkpad-x1/X1-Carbon-G9/p/22TP2X1X1C9)
* [Thinkpad X1 Carbon （第 8 代）](https://www.lenovo.com/us/en/laptops/thinkpad/thinkpad-x1/X1-Carbon-Gen-8-/p/22TP2X1X1C8)

#### 2、戴尔 XPS 13 开发者版

**价格**：起价为 **$1059**

戴尔 XPS 系列是一个令人印象深刻的、可以考虑运行 Linux 的笔记本电脑系列。

它是为开发者运行 Linux（Ubuntu 20.04）而定制的。

你可以得到一个 13.4 英寸的显示屏（有 FHD 和 UHD 可选）、第 11 代 i5/i7 处理器、高达 32GB 的内存、2TB 固态硬盘、指纹识别器，以及 Wi-Fi 6 支持。

* [戴尔 XPS 13 开发者版](https://www.dell.com/en-us/work/shop/dell-laptops-and-notebooks/new-xps-13-developer-edition/spd/xps-13-9310-laptop/ctox139w10p2c3000u)

### 纯 Linux 制造商的笔记本电脑

如果你不想要主流的选择，而是想要一些独特的选择，那你可以选择支持纯 Linux 制造商，有几个是你可以考虑的。

#### 1、System76 Gazelle

**价格**：起价为 **$1499**

System76 的笔记本电脑将内置他们的 Pop!\_OS 操作系统，该系统基于 Ubuntu，但提供了**无忧的开箱即用体验**。

可以把 System76 视作 Linux 笔记本电脑中的苹果电脑，他们尽力为其提供的硬件优化了 Pop!\_OS。

他们可以完全控制这些软件和硬件，所以这对终端消费者来说应该是令人兴奋的产品整合。

除了 144Hz 的 16.5 英寸显示屏、第 11 代 i7 处理器、高达 8TB 的 NVMe 固态硬盘支持等令人印象深刻的基本配置外，你还会有一个 RTX 3050 GPU，应该可以让你在笔记本电脑上处理各种苛刻的任务。

虽然 System76 还有一些其他型号的笔记本电脑，但在写这篇文章时，还没有上市。因此，请随时查看官方商店页面，订购定制的配置。

* [System76 Gazelle](https://system76.com/laptops/gazelle)

#### 2、Purism 笔记本电脑

**价格**：起价为 **$1599**

如果你是一个有安全意识的用户，Purism 的笔记本电脑可以作为一个选择。

Librem 14 是他们最新的笔记本电脑之一，带有 [PureOS](https://www.pureos.net)（也是由他们制造的）。

虽然它可能没有提供最新一代的处理器，但你应该对机上的第 10 代 i7 芯片感到满意吧。

它支持高达 64GB 的内存，并具有硬件封禁开关，可以禁用网络摄像头、耳机插孔、蓝牙或无线音频。

* [Librem 14](https://puri.sm/products/librem-14/)

#### 3、TUXEDO Aura 15

**价格**：起价为 **$899**

如果你想要一台 AMD 的笔记本电脑（采用上一代处理器 Ryzen 7 4700U），TUXEDO 计算机公司的 Aura 15 是一个不错的选择。

主要规格包括全高清显示屏、高达 64GB 的内存、支持 Wi-Fi 6，以及一个 LTE 模块。

它配备了 Ubuntu 或 TUXEDO 操作系统（基于 Ubuntu Budgie），可根据你的定制要求。

* [TUXEDO Aura 15](https://www.tuxedocomputers.com/en/Linux-Hardware/Linux-Notebooks/15-16-inch/TUXEDO-Aura-15-Gen1.tuxedo)

#### 4、TUXEDO Stellaris 15

**价格**：起价为 **$2160**

如果你正在寻找最新和最强大的笔记本电脑，并希望用上 RTX 3080 显卡，这应该是一个非常好的选择。

它提供了最新的英特尔/AMD Ryzen 处理器的配置选择，并具有 165Hz 刷新率的 3K 分辨率显示屏。

它绝不是你会觉得在旅行时带着方便的东西，但如果你需要计算能力，你可以选择它。

* [TUXEDO Stellaris 15](https://www.tuxedocomputers.com/en/Linux-Hardware/Linux-Notebooks/15-16-inch/TUXEDO-Stellaris-15-Gen3.tuxedo)

#### 5、Slimbook Pro X

**价格**：起价为 **$1105**

Slimbook 专注于旅行方便携带的轻薄笔记本电脑型号。

你可以选择各种发行版，包括 Ubuntu（GNOME、KDE、MATE）、KDE Neon、Manjaro 和 Fedora。

你可以得到大部分的基本规格，包括支持高达 2TB 的固态硬盘、64GB 的内存、全高清 IPS 显示屏等等。

虽然你可以选择英特尔和 AMD Ryzen（最新一代处理器），并分别与 Nvidia 和 Vega 图形处理器相结合，但在写这篇文章时只有 Ryzen 型号有库存。

* [Slimbook Pro X](https://slimbook.es/en/store/slimbook-pro-x)

#### 6、Slimbook Essential

**价格**：起价为 **$646**

一个令人印象深刻的预算友好型 Linux 笔记本电脑的选择。

它提供了 AMD Ryzen 和英特尔的变体（最后一代）供你选择。你得到硬件规格还可以，包括高达 64GB 的内存、2TB 的 SSD 支持，但是要少一个大的屏幕和板载专用显卡。

* [Slimbook Essential](https://slimbook.es/en/essential-en)

#### 7、Jupiter 14 Pro

**价格**：起价为 **$1199**

Juno 计算机公司的 Jupiter 14 采用了第 11 代英特尔处理器，并配备了 NVIDIA GTX 1650，价格诱人。

它内置了 Ubuntu 20.04 系统，没有其他系统可供选择。

基本配置包括 16GB 内存，与其他一些产品相比，这可能更物超所值一些。

你会发现在他们的网站上可以选择你的地区（英国/欧洲或美国/加拿大），请确保利用这一点。

* [Jupiter Pro 14](https://junocomputers.com/us/product/jupiter-14-pro/)

#### 荣誉奖：PineBook Pro

PineBook Pro 是一款基于 ARM 的笔记本电脑（采用 Manjaro ARM 版），预算低廉，对于 Linux 上的很多基本任务来说，应该可以正常工作。

在写这篇文章的时候，它已经没有库存了（直到进一步通知）。然而，当你看到这篇文章时，可以自己去看看一下。

* [Pinebook Pro](https://www.pine64.org/pinebook-pro/)

### 总结

如果你不喜欢这里的选择，你可以去看看 [其他可以购买 Linux 笔记本电脑的地方](https://itsfoss.com/get-linux-laptops/)。根据你的预算，选择你觉得最适合你的东西。

毕竟，所有的东西都有 Linux 的影子。有些可以让你能够从多个发行版中选择，但大多数人都坚持使用预装的 Ubuntu。

---

via: <https://news.itsfoss.com/best-linux-laptops-2021/>

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

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


COPR 仓库中 4 个很酷的新项目（2021.07）

Summary: 本文介绍了 COPR 中一些有趣的新项目。

什么时候COPR能以ISO的方式发布软件组件，来让用户本地化安装更方便点！！！

来自111.18.123.20的 Chrome 90.0|GNU/Linux 用户

本文介绍了 COPR 中一些有趣的新项目。

# COPR 仓库中 4 个很酷的新项目（2021.07）

COPR 是个人软件仓库 [集合](https://copr.fedorainfracloud.org/)，它不在 Fedora 中。这是因为某些软件不符合轻松打包的标准；或者它可能不符合其他 Fedora 标准，尽管它是自由而开源的。COPR 可以在 Fedora 套件之外提供这些项目。COPR 中的软件不受 Fedora 基础设施的支持，或者是由项目自己背书的。但是，这是一种尝试新的或实验性的软件的一种巧妙的方式。

本文介绍了 COPR 中一些有趣的新项目。如果你第一次使用 COPR，请参阅 [COPR 用户文档](https://docs.pagure.org/copr.copr/user_documentation.html)。

### Wike

[Wike](https://github.com/hugolabe/Wike) 是一个用于 GNOME 桌面的维基百科阅读器，在 GNOME Shell 中集成了搜索功能。它提供了对 [在线百科全书](https://en.wikipedia.org/wiki/Main_Page) 的无干扰访问。它的界面很简约，但它支持在多种语言之间切换文章、书签、文章目录、黑暗模式等。

#### 安装说明

该 [仓库](https://copr.fedorainfracloud.org/coprs/xfgusta/wike/) 目前为 Fedora 33、34 和 Fedora Rawhide 提供了 Wike。要安装它，请使用这些命令：

```
sudo dnf copr enable xfgusta/wike
sudo dnf install wike

```

### DroidCam

我们正生活在一个混乱的时代，被隔离在家中，我们与朋友和同事的大部分互动都发生在一些视频会议平台上。如果你已经有一部手机，就不要把钱浪费在价格过高的网络摄像头上。[DroidCam](https://www.dev47apps.com/) 让你将手机与电脑配对，并将其作为专用网络摄像头使用。通过 USB 线或通过 WiFi 进行连接。DroidCam 提供对摄像头的远程控制，并允许缩放、使用自动对焦、切换 LED 灯和其他便利功能。

#### 安装说明

该 [仓库](https://copr.fedorainfracloud.org/coprs/meeuw/droidcam) 目前为 Fedora 33 和 34 提供了 DroidCam。在安装之前，请更新你的系统并重新启动，或者确保你运行的是最新的内核版本，并安装了适当版本的 `kernel-headers`。

```
sudo dnf update
sudo reboot

```

Droidcam 依赖 `v4l2loopback`，必须从 [RPM Fusion 自由软件仓库](https://docs.fedoraproject.org/en-US/quick-docs/setup_rpmfusion/#proc_enabling-the-rpmfusion-repositories-using-command-line-utilities_enabling-the-rpmfusion-repositories) 手动安装。

```
sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
sudo dnf install v4l2loopback
sudo modprobe v4l2loopback

```

现在安装 `droidcam` 软件包：

```
sudo dnf copr enable meeuw/droidcam
sudo dnf install droidcam

```

### Nyxt

[Nyxt](https://nyxt.atlas.engineer/) 是一个面向键盘、可无限扩展的 Web 浏览器，专为高级用户设计。它在很大程度上受到 Emacs 的启发，因此用 Common Lisp 实现和配置，提供熟悉的按键绑定（[Emacs](https://en.wikipedia.org/wiki/Emacs)、[vi](https://en.wikipedia.org/wiki/Vim_(text_editor))、[CUA](https://en.wikipedia.org/wiki/IBM_Common_User_Access)）。

其他不能错过的杀手锏是一个内置的 REPL、[树形历史](https://nyxt.atlas.engineer/#tree)、[缓冲区代替标签](https://nyxt.atlas.engineer/#fuzzy)，还有[更多](https://nyxt.atlas.engineer/)。

Nyxt 与网络引擎无关，所以不用担心页面会以意外的方式呈现。

#### 安装说明

该 [仓库](https://copr.fedorainfracloud.org/coprs/teervo/nyxt/) 目前为 Fedora 33、34 和 Fedora Rawhide 提供了 Nyxt。要安装它，请使用这些命令：

```
sudo dnf copr enable teervo/nyxt
sudo dnf install nyxt

```

### Bottom

[Bottom](https://github.com/ClementTsang/bottom) 是一个具有可定制界面和多种功能的系统监控器，它从 [gtop](https://github.com/aksakalli/gtop)、[gotop](https://github.com/xxxserxxx/gotop) 和 [htop](https://github.com/htop-dev/htop/) 获得了灵感。因此，它支持 [进程](https://clementtsang.github.io/bottom/nightly/usage/widgets/process/) 监控、[CPU](https://clementtsang.github.io/bottom/nightly/usage/widgets/cpu/)、[RAM](https://clementtsang.github.io/bottom/nightly/usage/widgets/memory/) 和 [网络](https://clementtsang.github.io/bottom/nightly/usage/widgets/network/) 使用监控。除了这些，它还提供了更多奇特的小部件，如 [磁盘容量](https://clementtsang.github.io/bottom/nightly/usage/widgets/disk/) 使用情况，[温度传感器](https://clementtsang.github.io/bottom/nightly/usage/widgets/temperature/)，和 [电池](https://clementtsang.github.io/bottom/nightly/usage/widgets/battery/) 使用情况。

由于小部件的可自定义布局以及 [可以只关注一个小部件并最大化它](https://clementtsang.github.io/bottom/nightly/usage/general-usage/#expansion)，Bottom 可以非常有效地利用屏幕空间。

#### 安装说明

该 [仓库](https://copr.fedorainfracloud.org/coprs/opuk/bottom/) 为 Fedora 33、34 和 Fedora Rawhide 提供了 Bottom。它也可用于 EPEL 7 和 8。要安装它，请使用这些命令：

```
sudo dnf copr enable opuk/bottom
sudo dnf install bottom

```

使用 `btm` 命令来运行该程序。

---

via: <https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-july-2021/>

作者：[Jakub Kadlčík](https://fedoramagazine.org/author/frostyx/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


使用 Linux 终端浏览你的计算机

Summary: 学习在 Linux 终端中从一个目录切换到另一个目录。

学习在 Linux 终端中从一个目录切换到另一个目录。

# 使用 Linux 终端浏览你的计算机

>
> 学习在 Linux 终端中从一个目录切换到另一个目录。
>
>
>

<img src="content_image/album_202108_12_113605d3hp448xm8m18wzw.jpg" alt="" title="Move around your computer">

要在图形界面中浏览你的计算机上的文件夹，你可能习惯于打开一个窗口来“进入”你的计算机，然后双击一个文件夹，再双击一个子文件夹，如此反复。你也可以使用箭头按钮或按键来回溯。

而要在终端中浏览你的计算机，你可以利用 `cd` 命令。你可以使用 `cd ..` 回到 *上一级* 目录，或者使用 `cd ./另一个/文件夹的/路径` 来跳过许多文件夹进入一个特定的位置。

你在互联网上已经使用的 URL 的概念，实际上直接来自 [POSIX](https://opensource.com/article/19/7/what-posix-richard-stallman-explains)。当你浏览某个网站的一个特定页面时，比如 `http://www.example.com/tutorials/lesson2.html`，你实际上做的是进入 `/var/www/imaginarysite/tutorials/` 目录，并打开一个叫 `classic2.html` 的文件。当然，你是在 Web 浏览器中打开它的，浏览器会将所有那些看起来奇怪的 HTML 代码解释成漂亮的文本和图片。但这两者的思路是完全一样的。

如果你把你的计算机看成是互联网（或者把互联网看成是计算机会更合适），那么你就能理解如何在你的文件夹和文件中遨游了。如果从你的用户文件夹（你的家目录，或简记为 `~`）开始，那么你想切换到的文件夹都是相对于这个文件夹而言的：

```
$ cd ~/Documents
$ pwd
/home/tux/Documents

$ cd ..
$ pwd
/home/tux

```

这需要一些练习，但一段时间后，它会变得比你打开和关闭窗口、点击返回按钮和文件夹图标快得多。

### 用 Tab 键自动补全

键盘上的 `Tab` 键可以自动补全你开始输入的文件夹和文件的名字。如果你要 `cd` 到 `~/Documents` 文件夹，那么你只需要输入 `cd ~/Doc`，然后按 `Tab` 键即可。你的 Shell 会自动补全 `uments`。这不仅仅是一个令人愉快的便利工具，它也是一种防止错误的方法。如果你按下 `Tab` 键而没有任何东西自动补全，那么可能你 *认为* 存在于某个位置的文件或文件件实际上并不存在。即使有经验的 Linux 用户也会试图切换到一个当前目录下不存在的文件夹，所以你可以经常使用 `pwd` 和 `ls` 命令来确认你确实在你认为你在的目录、以及你的当前目录确实包含了你认为它包含的文件。

---

via: <https://opensource.com/article/21/8/navigate-linux-directories>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[piaoshi](https://github.com/piaoshi) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #361 研究人员创造出能绕过面部识别的“万能钥匙”面孔

Summary: 更多：• 反病毒公司 Norton 和 Avast 将合并 • 黑客关注农业的网络安全风险

# 硬核观察 #361 研究人员创造出能绕过面部识别的“万能钥匙”面孔

### 研究人员创造出能绕过面部识别的“万能钥匙”面孔

这种计算机生成的面孔就像面部识别系统的“[万能钥匙](https://www.vice.com/en/article/k78ygn/researchers-create-master-faces-to-bypass-facial-recognition)”，并且可以冒充多个身份。他们成功创建了 9 张 “万能钥匙”面孔，这些面孔能够冒充三个主要人脸识别系统数据集中的几乎一半的面孔，而不需要任何额外的信息或他们所识别的人的数据。研究人员使用 StyleGAN 来生成人脸，然后使用进化算法和神经网络来优化和预测。研究人员随后使用该算法训练了一个神经网络。

>
> 能对抗 AI 的终究还是 AI。
>
>
>

### 反病毒公司 Norton 和 Avast 将合并

NortonLifeLock 表示它将与英国的 Avast [合并](https://www.zdnet.com/article/nortonlifelock-and-avast-plc-to-merge-in-8-billion-all-stock-transaction/)，交易总额在 81 亿至 86 亿美元之间。两家公司表示，这项交易将汇集具有广泛互补性的产品线，同时使合并后的公司拥有超过 5 亿的用户群。这项交易将扩大合并后的公司的地理市场覆盖面。

>
> 以前的自动传播的计算机病毒带来的影响，在有组织的超大金额的勒索和黑客攻击事件面前已经被人忽视了。
>
>
>

### 黑客关注农业的网络安全风险

上周日举办的 DEF CON 黑客大会上的一个演讲[描述](https://securityledger.com/2021/08/def-con-security-holes-in-deere-case-ih-shine-spotlight-on-agriculture-cyber-risk/)了美国农业设备巨头的软件和服务中存在的一系列严重的、可远程利用的漏洞。这些安全漏洞和错误配置加在一起，可以让黑客进入其全球产品基础设施、敏感的客户和第三方数据，并可能有能力远程访问作为食物链关键的种植机和收割机等关键农业设备。

>
> 过去一些年来，各种基础设施和基础行业纷纷涉网，这带来了前所未有的网络安全风险。
>
>
>


用 kubectl 管理 Kubernetes 的 5 种有用方法

Summary: 学习 kubectl，提升你与 Kubernetes 的互动方式。

# 用 kubectl 管理 Kubernetes 的 5 种有用方法

>
> 学习 kubectl，提升你与 Kubernetes 的互动方式。
>
>
>

<img src="content_image/album_202108_13_105348oxt824fszcyyzj2j.png" alt="Ship captain sailing the Kubernetes seas" title="Ship captain sailing the Kubernetes seas">

Kubernetes 可以帮你编排运行有大量容器的软件。Kubernetes 不仅提供工具来管理（或者说 [编排](https://opensource.com/article/20/11/orchestration-vs-automation)）运行的容器，还帮助这些容器根据需要进行扩展。有了 Kubernetes 作为你的中央<ruby> 控制面板 <rt>  control panel </rt></ruby>（或称 <ruby> 控制平面 <rt>  control plane </rt></ruby>），你需要一种方式来管理 Kubernetes，而这项工作的工具就是 kubectl。`kubectl` 命令让你控制、维护、分析和排查 Kubernetes 集群的故障。与许多使用 `ctl`（“控制”的缩写）后缀的工具一样，如 `systemctl` 和 `sysctl`，`kubectl` 拥有大量的功能和任务权限，所以如果你正在运行 Kubernetes，你肯定会经常使用它。它是一个拥有众多选项的命令，所以下面是 `kubectl` 中简单易用的五个常见任务。

### 1、列出并描述资源

按照设计，容器往往会成倍增加。在某些条件下，它们可以快速增加。如果你只能通过 `podman ps`或 `docker ps` 来查看正在运行的容器，这可能会让你不知所措。通过 `kubectl get` 和 `kubectl describe`，你可以列出正在运行的<ruby> 吊舱 <rt>  pod </rt></ruby>以及它们正在处理的容器信息。更重要的是，你可以通过使用 `--namespace` 或 `name` 或 `--selector`等选项，只列出所需信息。

`get` 子命令不仅仅对吊舱和容器有用。它也有关于节点、命名空间、发布、服务和副本的信息。

### 2、创建资源

如果你只通过类似 OpenShift、OKD 或 Kubernetes 提供的 Web 用户界面（UI）创建过发布，但你想从 Linux 终端控制你的集群，那么可以使用 `kubectl create`。`kubectl create` 命令并不只是实例化一个新的应用发布。Kubernetes 中还有很多其他组件可以创建，比如服务、配额和 [计划任务](https://opensource.com/article/20/11/kubernetes-jobs-cronjobs)。

Kubernetes 中的计划任务可以创建一个临时的吊舱，用来在你选择的时间表上执行一些任务。它们并不难设置。下面是一个计划任务，让一个 BusyBox 镜像每分钟打印 “hello world”。

```
$ kubectl create cronjob \
    hello-world \
    --image=busybox \
    --schedule="*/1 * * * *" -- echo "hello world"

```

### 3、编辑文件

Kubernetes 中的对象都有相应的配置文件，但在文件系统中查找相应的文件较为麻烦。有了 `kubectl edit`，你可以把注意力放在对象上，而不是定义文件上。你可以通过 `kubectl` 找到并打开文件（通过 `KUBE_EDITOR` 环境变量，你可以设置成你喜欢的编辑器）。

```
$ KUBE_EDITOR=emacs \
    kubectl edit cronjob/hello-world

```

### 4、容器之间的传输文件

初次接触容器的人往往对无法直接访问的共享系统的概念感到困惑。他们可能会在容器引擎或 `kubectl` 中了解到 `exec` 选项，但当他们不能从容器中提取文件或将文件放入容器中时，容器仍然会显得不透明。使用 `kubectl cp` 命令，你可以把容器当做远程服务器，使主机和容器之间文件传输如 SSH 命令一样简单：

```
$ kubectl cp foo my-pod:/tmp

```

### 5、应用变更

对 Kubernetes 对象进行修改，可以通过 `kubectl apply` 命令完成。你所要做的就是将该命令指向一个配置文件：

```
$ kubectl apply -f ./mypod.json

```

类似于运行 Ansible 剧本或 Bash 脚本，`apply` 使得快速“导入”设置到运行中的 Kubernetes 实例很容易。例如，GitOps 工具 [ArgoCD](https://argoproj.github.io/argo-cd/) 由于 `apply` 子命令，安装起来出奇地简单：

```
$ kubectl create namespace argocd
$ kubectl apply -n argocd \
    -f https://raw.githubusercontent.com/argoproj/argo-cd/vx.y.z/manifests/install.yaml

```

### 使用 kubectl

Kubectl 是一个强大的工具，由于它是一个终端命令，它可以写成脚本，并能实现用众多 Web UI 无法实现的功能。学习 `kubectl` 是进一步了解 Kubernetes、容器、吊舱以及围绕这些重要的云计算创新技术的一个好方法。[下载我们的 kubectl 速查表](https://opensource.com/downloads/kubectl-cheat-sheet)，以获得快速参考，其中包括命令示例，以帮助你学习，并在为你提供注意细节。

---

via: <https://opensource.com/article/21/7/kubectl>

作者：[Alan Smithee](https://opensource.com/users/alansmithee) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[turbokernel](https://github.com/turbokernel)

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


基础：在 Linux 终端中移动文件

Summary: 使用 mv 命令将一个文件从一个位置移动到另一个位置。

使用 mv 命令将一个文件从一个位置移动到另一个位置。

# 基础：在 Linux 终端中移动文件

>
> 使用 mv 命令将一个文件从一个位置移动到另一个位置。
>
>
>

<img src="content_image/album_202108_13_112248lnal8a0qz50zqzld.jpg" alt="" title="Moving files">

要在有图形界面的计算机上移动一个文件，你要打开该文件当前所在的文件夹，然后打开另一个窗口导航到你想把文件移到的文件夹。最后，你把文件从一个窗口拖到另一个窗口。

要在终端中移动文件，你可以使用 `mv` 命令将文件从一个位置移动到另一个位置。

```
$ mv example.txt ~/Documents

$ ls ~/Documents
example.txt

```

在这个例子中，你已经把 `example.txt` 从当前文件夹移到了主目录下的 `Documents` 文件夹中。

只要你知道一个文件在 *哪里*，又想把它移到 *哪里* 去，你就可以把文件从任何地方移动到任何地方，而不管你在哪里。与在一系列窗口中浏览你电脑上的所有文件夹以找到一个文件，然后打开一个新窗口到你想让该文件去的地方，再拖动该文件相比，这可以大大节省时间。

默认情况下，`mv` 命令完全按照它被告知的那样做：它将一个文件从一个位置移动到另一个位置。如果在目标位置已经存在一个同名的文件，它将被覆盖。为了防止文件在没有警告的情况下被覆盖，请使用 `--interactive`（或简写 `-i`）选项。

```
$ mv -i example.txt ~/Documents
mv: overwrite '/home/tux/Documents/example.txt'?

```

---

via: <https://opensource.com/article/21/8/move-files-linux>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


elementary OS 6 Linux 中的 11 个亮点

试用了一下，UI确实特别好，我非常喜欢，不过我已经离不开archlinux的体系了，而且这个发行版默认的ibus中文输入法下有黑色方块我不知道怎么解决，而且有一些小bug，假如没这些问题我真的想用这个替换掉我现在的manjaro-kde。

这个系统真的各种细节小问题，我安装完看到窗口图标都没对齐，用都没用就删了。

太好用了，网易云音乐 有道词典 WPS 百度网盘等都是傻瓜化安装

搜狗安装了还不知怎么启用，自带的智能拼音也挺好用的

微信得安装wine7

# elementary OS 6 Linux 中的 11 个亮点

>
> elementary OS 6 终于来了。让我们看一下这个主要版本中的重要亮点。
>
>
>

elementary OS 6 是其 5.x 系列经过几年更新后的一次重大升级。

虽然 5.x 系列也有许多功能更新和改进，但 [elementary OS 6](https://news.itsfoss.com/elementary-os-6-release/) 的努力成果看起来令人兴奋。

在这里，让我们来看看 elementary OS 6 引入的所有新功能和变化。

### 1、暗黑风格及强调色

[elementary OS](https://elementary.io) 暗黑风格的主题与现在主流的工作方式类似，是一种选择的偏好。你可以在安装 elementary OS 6 之后，在欢迎屏幕上选择它。

虽然增加暗黑模式听起来像是小事一桩，但他们似乎投入了大量的精力来提供一个整体一致的暗黑模式体验。

所有的第一方应用程序都无缝地支持暗黑风格和浅色主题。

elementary OS 还让应用开发者在 elementary OS 6 中遵照用户的偏好。因此，如果用户喜欢暗黑模式或浅色模式，应用程序就可以适应这种模式。

伴随着新的强调色的出现，还有一个自动的强调色偏好，可以从你当前的壁纸中挑选出强调的颜色。

### 2、改进的通知及重新设计的通知中心

通知现在支持图标徽章和行动按钮，这应该能提供更好的体验。

这可以让你快速打开链接、标记一条消息已读，以及其他几种可能的操作。

紧急通知有了新的外观和独特的声音，以帮助你识别它们。

除了通知方面的改进，通知中心也进行了改造，使其看起来更好，并可以对多个通知进行清理。

### 3、在线账户

终于，在 elementary OS 6 中，你能够从系统设置中添加在线账户了。

一旦登录，你的数据将在支持的系统应用程序（如日历、任务）中同步。

它也会显示在系统托盘通知中。

### 4、第一方 Flatpak 应用及权限查看

为了提高整个平台的隐私和安全，elementary OS 6 采用了优先选择 Flatpak 的方式。

Elementary OS 现在有自己的应用中心 Flatpak 资源库。一些默认的应用程序以 Flatpak 包的形式出现，应用中心列出的所有应用程序也都有 Flatpak。

总的来说，这意味着更好的沙盒体验，你的所有应用程序将保持相互隔离，不会访问你的敏感数据。

而且，最重要的是，elementary OS 6 增加了“门户”功能，应用程序会请求权限，以访问你的文件或启动另一个应用程序。

你还可以从系统设置中控制所有的权限。

### 5、多点触控手势

对于笔记本电脑和触摸板用户来说，新的多点触控手势将变得非常方便。

从访问多任务视图到浏览工作区，你都可以用多点触摸手势来完成。

不仅仅局限于桌面上的某些功能，你还可以与通知互动、滑过应用程序，并可以通过新的多点触控手势获得全系统的顺滑体验。

你可以自定义手势或从系统设置下的手势部分了解更多信息。

### 6、屏幕盾牌

在 elementary OS 5 中，有些人注意到当你想运行一个耗时的任务或简单地观看视频时，会出现自动锁定屏幕的问题。

然而，这种情况在 elementary OS 6 中得到了改变，它不仅解决了这个问题，还以 “屏幕盾牌” 功能的形式带来了新的实现方式。

因此，在观看视频或执行耗时的任务时，你可以轻松地保持系统的清醒，而不会突然中断。

它利用了 GNOME 的守护程序设置，与第三方应用程序有更好的兼容性。

### 7、新的任务应用

elementary OS 6 中添加了一个新的任务应用，在那里你可以管理任务、收到提醒，并在你的系统上组织任务，或与在线账户同步。

我可能还不会用它来取代 Planner，但它是一个很好的补充，因为它打造的很好。

### 8、固件更新应用程序

你可以为支持的设备获得最新的固件更新，而无需摆弄任何其他设置。

只要从菜单中寻找“固件”应用程序就可以开始了。

### 9、更新的应用程序

一些应用程序已经被更新，同时引入了新的功能。

例如，Epiphany 浏览器被重新命名为 “Web”，现在有 Flatpak 包可用，以方便快速更新。

它还包括内置的跟踪保护和广告拦截。

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

* 相机应用获得了一个新的用户界面，可以切换相机、镜像图像等等。
* 应用中心现在不仅列出了 Flatpak 应用程序，而且还在应用程序完成安装后通知你，让你快速打开它。
* 文件应用程序也得到了改进，其形式是一个新的侧边栏和列表视图。另外，现在需要双击才能打开一个文件，而单次点击可以在文件夹中导航。

其他应用程序如邮件、日历也得到了改进，以便更好地进行在线整合。

### 10、改进的桌面工作流程及屏幕截图工具

多任务视图现在可以帮助你明确区分多个活动窗口。而热角视图可以让你将窗口移动到新的工作区，也可以将窗口最大化。

屏幕截图工具可以在窗口中移动，而不仅仅是停留在窗口的中心。你还可以从预览中拖放图片，而不需要保存。

### 11、改进的安装程序

你会注意到一些新的微妙的动画，而且还做了一些努力，以便在不重新调整窗口大小的情况下提供一个一致的安装程序布局。

这不是一次大修，但他们提到新的安装程序带有改进的磁盘检测和错误处理功能，这应该能使安装顺滑进行。

### 总结

[elementary OS 6](https://elementary.io) 是一个激动人心的版本，有多项改进。尽管外观和感觉并没有完全改变，但它已被全面精心雕琢。

我喜欢他们为提供一致和漂亮的用户体验所做的工作。另外，像全系统的 Flatpak 这样的变化应该使用户更容易和更安全。

你对这个版本有什么看法？你试过了吗？

---

via: <https://news.itsfoss.com/elementary-os-6-features/>

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

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


硬核观察 #362 亚马逊将监控客服人员键盘输入和鼠标点击以提升安全性

Summary: 更多：• 黑客退还 6 亿美元加密货币，声称是出于好玩 • Linux 基金会旗下成立了 eBPF 基金会

# 硬核观察 #362 亚马逊将监控客服人员键盘输入和鼠标点击以提升安全性

### 亚马逊将监控客服人员键盘输入和鼠标点击以提升安全性

根据一份亚马逊机密文件显示，亚马逊计划监控客户服务员工的键盘和鼠标动作，以试图阻止流氓员工、冒名顶替者或黑客访问客户的数据。但并不是为了准确记录员工的输入内容或监控他们的通信，而是根据键盘和鼠标动作生成一个档案，然后验证是否似乎是同一个人在控制员工的账户，以抓住可能随后窃取数据的黑客或冒名者。

>
> 这是一个有趣的思路，可以根据一个人的键盘和鼠标“指纹”来识别异常信号。
>
>
>

### 黑客退还 6 亿美元加密货币，声称是出于好玩

我们之前报道过，黑客利用了一个 Poly Network 智能合约的漏洞，窃取了超过 6 亿美元的加密资产。该事件之后，迫于各方追查的压力，该黑客陆陆续续的地几乎将所窃取的所有加密资产退回了项目方留下的地址。黑客自称是出于安全考虑将加密货币转移到个人钱包的，担心如果将漏洞告诉其他人（包括项目团队）可能有人会无法抵挡如此巨大一笔金钱的吸引力。

>
> 有些嘲讽的是，去中心化的区块链世界，最终却需要中心化的威慑和帮助来拯救。
>
>
>

### Linux 基金会旗下成立了 eBPF 基金会

作为基础设施领域最具影响力的技术之一，eBPF 已在过去几年迎来了爆发式的增长。包括微软、谷歌、Facebook、Netflix 等在内的多家企业[宣布](https://www.linuxfoundation.org/press-release/facebook-google-isovalent-microsoft-and-netflix-launch-ebpf-foundation-as-part-of-the-linux-foundation/)，在 Linux 基金会麾下成立了一个全新的 eBPF 基金会，以规划和协调 eBPF 的发展。

操作系统内核由于其核心作用、以及对稳定性和安全性的高要求而难以演进。与在操作系统之外实现的功能相比，操作系统级别的创新速度通常都是较低的。而 eBPF 通过允许沙盒程序在操作系统中运行，使开发人员能够创建在运行时向操作系统添加功能的 eBPF 程序。

>
> eBPF 的崛起真是令人吃惊，想不到最初的一个防火墙程序最终成为了这样重要的一个技术。
>
>
>


如何在免费 WiFi 中保护隐私（一）

Summary: 第一步是安装一个“虚拟专用网络”服务器。

第一步是安装一个“虚拟专用网络”服务器。

# 如何在免费 WiFi 中保护隐私（一）

>
> 第一步是安装一个“虚拟专用网络”服务器。
>
>
>

你是否连接到了不受信任的网络，例如酒店或咖啡馆的 WiFi，而又需要通过智能手机和笔记本电脑安全浏览互联网？通过使用虚拟专用网络，你可以匿名访问不受信任的网络，就像你在专用网络上一样安全。

“虚拟专用网络” 是保护私人数据的绝佳工具。通过使用 “虚拟专用网络”，你可以在保持匿名的同时连接到互联网上的专用网络。

可选的 “虚拟专用网络” 服务有很多，[0penVPN](https://openvpn.net/) 依然是很多人在使用不受信任的网络时保护私人数据的第一选择。

0penVPN 在两点之间创建一个加密通道，防止第三方访问你的网络流量数据。通过设置你的 “虚拟专用网络” 服务，你可以成为你自己的 “虚拟专用网络” 服务商。许多流行的 “虚拟专用网络” 服务都使用 0penVPN，所以当你可以掌控自己的网络时，为什么还要将你的网络连接绑定到特定的提供商呢？

### 搭建 Linux 服务器

首先，在备用 PC 上安装一份 Linux。本例使用 Fedora，但是不论你使用的是什么 Linux 发行版，步骤基本是相同的。

从 [Fedora 项目](http://getfedora.org) 网站下载最新的 Fedora ISO 副本。制作一个 USB 启动盘，将其插入到你的 PC 并启动，然后安装操作系统。如果你从未制作过可引导的 USB 启动盘，可以了解一下 [Fedora Media Writer](https://opensource.com/article/20/10/fedora-media-writer)。如果你从未安装过 Linux，请阅读 [三步安装 Linux](https://opensource.com/article/21/2/linux-installation)。

### 设置网络

安装完成 Fedora 操作系统后，登录到控制台或者 SSH 会话。

更新到最新并重新启动：

```
$ sudo dnf update -y && reboot

```

重新登录并关闭防火墙：

```
systemctl disable firewalld.service
systemctl stop firewalld.service

```

你可能希望在此系统上为你的内部网络添加适当的防火墙规则。如果是这样，请在关闭所有防火墙规则后完成 0penVPN 的设置和调试，然后添加本地防火墙规则。想要了解更多，请参照 [在 Linux 上设置防火墙](https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd)。

### 设置 IP 地址

你需要在你的本地网络设置一个静态 IP 地址。下面的命令假设在一个名为 `ens3` 的设备上有一个名为 `ens3` 的<ruby> 网络管理器 <rt>  Network Manager </rt></ruby>连接。你的设备和连接名称可能不同，你可以通过打开 SSH 会话或从控制台输入以下命令：

```
$ sudo nmcli connection show
NAME  UUID                                  TYPE      DEVICE
ens3  39ad55bd-adde-384a-bb09-7f8e83380875  ethernet  ens3

```

你需要确保远程用户能够找到你的 “虚拟专用网络” 服务器。有两种方法可以做到这一点。你可以手动设置它的 IP 地址，或者将大部分工作交给你的路由器去完成。

#### 手动配置一个 IP 地址

通过以下命令来设置静态 IP 地址、前缀、网关和 DNS 解析器，用来替换掉原有的 IP 地址：

```
$ sudo nmcli connection modify ens3 ipv4.addresses 10.10.10.97/24
$ sudo nmcli connection modify ens3 ipv4.gateway 10.10.10.1
$ sudo nmcli connection modify ens3 ipv4.dns 10.10.10.10
$ sudo nmcli connection modify ens3 ipv4.method manual
$ sudo nmcli connection modify ens3 connection.autoconnect yes

```

设置主机名：

```
$ sudo hostnamectl set-hostname OVPNserver2020

```

如果你运行了一个本地的 DNS 服务，你需要设置一个 DNS 条目，将主机名指向 “虚拟专用网络” 服务器的 IP 地址。

重启并确保系统的网络运行正常。

#### 在路由器中配置 IP 地址

在你的网络当中应该有一台路由器。你可能已经购买了它，或者从互联网服务提供商（ISP）那里获得了一台。无论哪种方式，你的路由器可能都有一个内置的 DHCP 服务，可以为连接到网络上的每台设备分配一个 IP 地址。你的新 “虚拟专用网络” 服务器也是属于网络的一台设备，因此你可能已经注意到它会自动分配一个 IP 地址。

这里的潜在问题是你的路由器不能保证每台设备都能在重新连接后获取到相同的 IP 地址。路由器确实尝试保持 IP 地址一致，但这会根据当时连接的设备数量而发生变化。

但是，几乎所有的路由器都会有一个界面，允许你为特定设备调停和保留 IP 地址。

路由器没有统一的界面，因此请在你的路由器接口中搜索 “DHCP” 或 “Static IP address” 选项。为你的服务器分配自己的预留 IP 地址，使其在网络中保持 IP 不变。

### 连接到服务器

默认情况下，你的路由器可能内置了防火墙。这通常很好，因为你不希望网络之外的人能够强行进入你的任何计算机。但是，你必须允许发往 “虚拟专用网络” 服务器的流量通过防火墙，否则你的 “虚拟专用网络” 将无法访问，这种情况下你的 “虚拟专用网络” 服务器将形同虚设。

你至少需要一个来自互联网服务提供商的公共静态 IP 地址。使用其静态 IP 地址设置路由器的公共端，然后将你的 0penVPN 服务器放在专用端，在你的网络中使用专用静态 IP 地址。 0penVPN 默认使用 UDP 1194 端口。配置你的路由器，将你的公网 “虚拟专用网络” IP 地址的 UDP 1194 端口转发到 0penVPN 服务器上的 UDP 1194 端口。如果你决定使用不同的 UDP 端口，请相应地调整端口号。

### 准备好，我们开始下一步

在本文中，你在服务器上安装并配置了一个操作系统，这已经成功了一半。在下一篇文章中，你将解决安装和配置 0penVPN 本身的问题。同时，请熟悉你的路由器并确保你可以从外部访问你的服务器。但是请务必在测试后关闭端口转发，直到你的 “虚拟专用网络” 服务启动并运行。

本文的部分内容改编自 D. Greg Scott 的博客，并经许可重新发布。

---

via: <https://opensource.com/article/21/8/openvpn-server-linux>

作者：[D. Greg Scott](https://opensource.com/users/greg-scott) 选题：[lujun9972](https://github.com/lujun9972) 译者：[perfiffer](https://github.com/perfiffer) 校对：[wxy](https://github.com/wxy)

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


请问centos上应该怎么安装呢

我想用来打开obsidian项目，就不好用了，因为文件太多，下载太慢

我想用来打开obsidian项目，就不好用了，因为文件太多，下载太慢

# 用 OneDriver GUI 工具在 Linux 中挂载微软 OneDrive

在 Windows 上，微软提供了一个 [免费云存储服务](https://itsfoss.com/cloud-services-linux/) OneDrive。它与 Windows 集成，你可以通过你的微软账户获得 5GB 的免费存储空间。

这在 Windows 上很好用，但和谷歌一样，微软也没有在 Linux 桌面上提供 OneDrive 的本地客户端。

当然，你可以通过浏览器访问你的 OneDrive 数据。除此以外，还有一些其他的方法可以在 Linux 上访问 OneDrive。

你可以使用像 [Insync](https://itsfoss.com/use-onedrive-on-linux/) 这样的高级服务，或者选择用 [rclone 在 Linux 上使用 OneDrive](https://itsfoss.com/use-onedrive-linux-rclone/) 这种稍微复杂的命令行方式。

最近，我发现了另一个工具，它稍有不同，使用起来也更简单。不出所料，它叫 OneDriver。

### OneDriver：在你的 Linux 系统上挂载 OneDrive

[OneDriver](https://github.com/jstaf/onedriver) 是一个自由而开源的工具，允许你在 Linux 系统上挂载 OneDrive 文件。

请记住，它不会像 OneDrive 在 Windows 系统上那样同步文件。它将 OneDrive 文件挂载在本地的挂载点上。你通过网络访问这些文件。

然而，它确实提供了一种混合方法。你在挂载的 OneDrive 中打开的文件也被下载到系统中。这意味着，你也可以离线访问打开的文件。如果你没有连接到互联网，这些文件将成为只读。

如果你在本地对文件做任何修改，并且连接到互联网，它就会反映到 OneDrive 上。

我注意到，在 GNOME 上的 Nautilus 文件管理器中，它会自动下载当前文件夹中的图像。在我的印象中，它们只有在我打开它们时才会被下载。

另一件事是，Nautilus 一开始会建立缩略图缓存。OneDriver 在开始的时候可能会觉得有点慢，有点耗费资源，但最终会好起来。

哦！你也可以挂载多个 OneDrive 账户。

### 安装和使用 OneDriver

要在 Ubuntu 20.04（和 Linux Mint 20 系列）上安装 OneDriver，你可以使用 OneDriver 开发者的这个 PPA：

```
sudo add-apt-repository ppa:jstaf/onedriver
sudo apt update
sudo apt install onedriver

```

对于 Ubuntu 21.04，你可以下载 [其 PPA 中的 DEB 文件](https://launchpad.net/~jstaf/+archive/ubuntu/onedriver/+packages) 来使用它。

在 Fedora 上，你可以添加这个 COPR：

```
sudo dnf copr enable jstaf/onedriver
sudo dnf install onedriver

```

Arch 用户可以在 AUR 中找到它。

安装后，在菜单中搜索 OneDriver，然后从这里启动它。

首次运行时，它会给出一个奇怪的空界面。点击 “+” 号，选择一个文件夹或创建一个新的文件夹，OneDrive 会挂载在那里。在我的例子中，我在我的家目录下创建了一个名为 `One_drive` 的新文件夹。

当你选择了挂载点后，你会被要求输入你的微软凭证。

登录后，你可以在挂载的目录中看到 OneDrive 的文件。

完成这些后，你可以在应用界面上看到你的 OneDrive 账户。点击旁边的勾按钮，以在重启后自动挂载 OneDrive。

总的来说，OneDriver 是一个可以在 Linux 上访问 OneDrive 的不错的免费工具。它可能无法像 [高级 Insync 服务](https://itsfoss.com/recommends/insync/) 那样提供完整的同步设施，但对于有限的需求来说，它做得不错。

如果你使用这个漂亮的工具，请分享你的使用经验。如果你喜欢这个项目，也许可以给它一个 [GitHub 上的星标](https://github.com/jstaf/onedriver)。

---

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

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

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


硬核观察 #363 IBM PC 40 岁了

Summary: 更多：• Steam Deck 操作系统基于 Arch Linux • 加密挖矿木马改变 CPU 设置以提高采矿性能

# 硬核观察 #363 IBM PC 40 岁了

### IBM PC 40 岁了

虽然 IBM PC 并不是最早的个人计算机，但是在 1981 年推出的 IBM PC 以及所加载的 PC DOS，也是个人计算机史上的[重要里程碑](https://www.theregister.com/2021/08/12/ibm_pc_40_anniversary/)。IBM PC 采用了开放的架构，使用了现成的硬件和软件：英特尔的 8088 CPU 和微软的 PC DOS，微软还提供了 ROM 里面的 BASIC。IBM PC 的第一个型号是 IBM 5150 型，起价 1565 美元。CPU 为 4.77MHz 的 8088；内存有 16Kb，可扩充至 256Kb；单色或 16 色 CGA 显卡；存储为两个 5.25 英寸软驱，可选配磁带机，但不支持硬盘。它于 1987 年停产。

>
> 当年 IBM PC 如今看起来可笑的配置，可正是它们开创了个人计算时代。
>
>
>

### Steam Deck 操作系统基于 Arch Linux

之前我们报道过，Valve 发布了 Steam Deck 掌机。它的操作系统是基于定制的 Linux 发行版的 SteamOS。但是将在 Steam Deck 中搭载的操作系统 SteamOS 3.0 放弃了之前所基于 Debian，而是[转向 Arch Linux](https://arstechnica.com/gaming/2021/08/valves-upcoming-steam-deck-will-be-based-on-arch-linux-not-debian/)。Valve 称：“之所以将 SteamOS 3.0 切换到 Arch 底层，就是为了追求更快速的开发。尤其考虑到 Valve 需要进行大量更新、改动、以及自定义，才能在 Steam Deck 上提供最佳的游戏体验”。而 Debian 相比 Arch Linux 则更追求稳定，对新硬件和特性的支持没有那么积极。

>
> 说实话，这还是挺令人感到意外的，个人不看好这个选择。
>
>
>

### 加密挖矿木马改变 CPU 设置以提高采矿性能

安全研究人员发现了一种 Golang 编写的[恶意软件](https://www.tomshardware.com/news/cryptomining-botnet-modifies-cpus-to-boost-mining-performance)，它不仅劫持了基于 Linux/Unix 的服务器，并利用它们来挖掘加密货币，而且修改了它们的 CPU 配置，以提高挖矿性能，并以牺牲其他应用程序的性能为代价。在获得系统的访问权后，它会禁用硬件预取器。预取器可以提高各种任务的性能。然而，禁用它可以使挖矿软件的挖矿性能提高 15%，但会降低合法应用程序的性能。该僵尸网络至少从 2020 年 12 月开始运行，目标是利用 MySQL、Tomcat、Oracle WebLogic 和 Jenkins 中的漏洞。

>
> 这是典型的“鹊巢鸠占”啊。
>
>
>


使用 GNOME Web 的 Canary 版本测试前沿功能

# 使用 GNOME Web 的 Canary 版本测试前沿功能

>
> 如果你想测试高度不稳定的 GNOME Web 浏览器的前沿功能，Canary 版本就是为了这个。
>
>
>

Epiphany（或称 [GNOME Web](https://wiki.gnome.org/Apps/Web/)）是一个 Linux 发行版上精简而功能强大的浏览器，你会发现它也是 elementary OS 的默认浏览器。

随同 GNOME 40 发布的 Epiphany 浏览器有一些 [改进和新增功能](https://news.itsfoss.com/gnome-web-new-tab/)。

而在幕后，经常有许多令人兴奋的提升和新增特性。因此，你可以选择为早期测试人员量身定制的 GNOME Web 技术预览版。

现在，它发布了一个新的 Canary 版本，你可以使用它来测试甚至在技术预览版中都没有的特性。

### GNOME Web Canary 版本

GNOME Web 的 Canary 版本允许你测试甚至没有出现在最新 [WebKitGTK](https://webkitgtk.org) 版本中的特性。

注意 Canary 版本应该是极其不稳定的，甚至稳定性比开发者技术预览版更差。

可是，使用 Canary 版本，终端用户可以在开发过程中的早期进行测试，帮助开发者发现灾难性 bug。

不只是终端用户的早期测试，Canary 版本还让 GNOME Web 的开发者的工作更轻松。

他们不再需要为了实现和测试一个新特性，来单独构建 WebKitGTK。

尽管开发者有一个 Flatpak SDK 可以简化开发人员的流程，但是这仍然是一项耗时的任务。

现在，没有了这个阻碍，开发速度也有可能提升。

### 怎样获得 Canary 版本?

首先，你需要使用以下命令添加 WebKit SDK Flatpak 远端仓库:

```
flatpak --user remote-add --if-not-exists webkit https://software.igalia.com/flatpak-refs/webkit-sdk.flatpakrepo
flatpak --user install https://nightly.gnome.org/repo/appstream/org.gnome.Epiphany.Canary.flatpakref

```

完成后，你就可以使用提供的 [Flatpakref 文件](https://nightly.gnome.org/repo/appstream/org.gnome.Epiphany.Canary.flatpakref) 安装啦！

测试 Canary 版本可以让更多的用户能够在此过程中帮助 GNOME Web 的开发人员。所以，这绝对是改进 GNOME Web 浏览器开发的急需补充。

更多技术细节，你可能需要看这位开发者发布的 [公告](https://base-art.net/Articles/introducing-the-gnome-web-canary-flavor/)。

---

via: <https://news.itsfoss.com/gnome-web-canary/>

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

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


如老手一般玩转 MySQL 查询

Summary: 优化查询语句不过是一项简单的工程，而非什么高深的黑魔法。

优化查询语句不过是一项简单的工程，而非什么高深的黑魔法。

# 如老手一般玩转 MySQL 查询

>
> 优化查询语句不过是一项简单的工程，而非什么高深的黑魔法。
>
>
>

<img src="content_image/album_202108_15_104728m3e3wefi3bq3qn34.jpg" alt="" title="young woman working on a laptop">

许多人将数据库查询语句的调优视作哈利波特小说中某种神秘的“黑魔法”；使用错误的咒语，数据就会从宝贵的资源变成一堆糊状物。

实际上，对关系数据库系统的查询调优是一项简单的工程，其遵循的规则或启发式方法很容易理解。查询优化器会翻译你发送给 [MySQL](https://www.mysql.com/) 实例的查询指令，然后将这些启发式方法和优化器已知的数据信息结合使用，确定获取所请求数据的最佳方式。再读一下后面这半句：*“优化器已知的数据信息*。”查询优化器需要对数据所在位置的猜测越少（即已知信息越多），它就可以越好地制定交付数据的计划。

为了让优化器更好地了解数据，你可以考虑使用索引和直方图。正确使用索引和直方图可以大大提高数据库查询的速度。这就像如果你按照食谱做菜，就可以得到你喜欢吃的东西；但是假如你随意在该食谱中添加材料，最终得到的东西可能就不那么尽如人意了。

### 基于成本的优化器

大多数现代关系型数据库使用<ruby> 基于成本的优化器 <rt>  cost-based optimizer </rt></ruby>来确定如何从数据库中检索数据。该成本方案是基于尽可能减少非常耗费资源的磁盘读取过程。数据库服务器内的查询优化器代码会在得到数据时对这些数据的获取进行统计，并构建一个获取数据的历史模型。

但历史数据是可能会过时的。这就好像你去商店买你最喜欢的零食，然后突然发现零食涨价或者商店关门了。服务器的优化进程可能会根据旧信息做出错误的假设，进而制定出低效的查询计划。

查询的复杂性可能会影响优化。优化器希望提供可用的最低成本查询方式。连接五个不同的表就意味着有 5 的阶乘（即 120）种可能的连接组合。代码中内置了启发式方法，以尝试对所有可能的选项进行快捷评估。MySQL 每次看到查询时都希望生成一个新的查询计划，而其他数据库（例如 Oracle）则可以锁定查询计划。这就是向优化器提供有关数据的详细信息至关重要的原因。要想获得稳定的性能，在制定查询计划时为查询优化器提供最新信息确实很有效。

此外，优化器中内置的规则可能与数据的实际情况并不相符。没有更多有效信息的情况下，查询优化器会假设列中的所有数据均匀分布在所有行中。没有其他选择依据时，它会默认选择两个可能索引中较小的一个。虽然基于成本的优化器模型可以制定出很多好的决策，但最终查询计划并不是最佳方案的情况也是有可能的。

### 查询计划是什么？

<ruby> 查询计划 <rt>  query plan </rt></ruby>是指优化器基于查询语句产生的，提供给服务器执行的计划内容。查看查询计划的方法是在查询语句前加上 `EXPLAIN` 关键字。例如，以下查询要从城市表（`city`）和相应的国家表（`country`）中获得城市名称（和所属国家名称），城市表和国家表通过国家唯一代码连接。本例中仅查询了英国的字母顺序前五名的城市：

```
SELECT city.name AS 'City',
               country.name AS 'Country'
FROM city
JOIN country ON (city.countrycode = country.code)
WHERE country.code = 'GBR'
LIMIT 5;

```

在查询语句前加上 `EXPLAIN` 可以看到优化器生成的查询计划。跳过除输出末尾之外的所有内容，可以看到优化后的查询：

```
SELECT `world`.`city`.`Name` AS `City`,
                'United Kingdom' AS `Country`
FROM `world`.`city`
JOIN `world`.`country`
WHERE (`world`.`city`.`CountryCode` = 'GBR')
LIMIT 5;

```

看下比较大的几个变化， `country.name as 'Country'` 改成了 `'United Kingdom' AS 'Country'`，`WHERE` 子句从在国家表中查找变成了在城市表中查找。优化器认为这两个改动会提供比原始查询更快的结果。

### 索引

在 MySQL 世界中，你会听到索引或键的概念。不过，索引是由键组成的，键是一种识别记录的方式，并且大概率是唯一的。如果将列设计为键，优化器可以搜索这些键的列表以找到所需的记录，而无需读取整个表。如果没有索引，服务器必须从第一列的第一行开始读取每一行数据。如果该列是作为唯一索引创建的，则服务器可以直接读取该行数据并忽略其余数据。索引的值（也称为基数）唯一性越强越好。请记住，我们在寻找更快获取数据的方法。

MySQL 默认的 InnoDB 存储引擎希望你的表有一个主键，并按照该键将你的数据存储在 B+ 树中。“不可见列”是 MySQL 最近添加的功能，除非在查询中明确指明该不可见列，否则不会返回该列数据。例如，`SELECT * FROM foo;` 就不会返回任何不可见列。这个功能提供了一种向旧表添加主键的方法，且无需为了包含该新列而重写所有查询语句。

更复杂的是，有多种类型的索引，例如函数索引、空间索引和复合索引。甚至在某些情况下，你还可以创建这样一个索引：该索引可以为查询提供所有请求的信息，从而无需再去访问数据表。

本文不会详细讲解各种索引类型，你只需将索引看作指向要查询的数据记录的快捷方式。你可以在一个或多个列或这些列的一部分上创建索引。我的医师系统就可以通过我姓氏的前三个字母和出生日期来查找我的记录。使用多列时要注意首选唯一性最强的字段，然后是第二强的字段，依此类推。“年-月-日”的索引可用于“年-月-日”、“年-月”和“年”搜索，但不适用于“日”、“月-日”或“年-日”搜索。考虑这些因素有助于你围绕如何使用数据这一出发点来设计索引。

### 直方图

直方图就是数据的分布形式。如果你将人名按其姓氏的字母顺序排序，就可以对姓氏以字母 A 到 F 开头的人放到一个“逻辑桶”中，然后将 G 到 J 开头的放到另一个中，依此类推。优化器会假定数据在列内均匀分布，但实际使用时多数情况并不是均匀的。

MySQL 提供两种类型的直方图：所有数据在桶中平均分配的等高型，以及单个值在单个桶中的等宽型。最多可以设置 1,024 个存储桶。数据存储桶数量的选择取决于许多因素，包括去重后的数值量、数据倾斜度以及需要的结果准确度。如果桶的数量超过某个阈值，桶机制带来的收益就会开始递减。

以下命令将在表 `t` 的列 `c1` 上创建 10 个桶的直方图：

```
ANALYZE TABLE t UPDATE HISTOGRAM ON c1 WITH 10 BUCKETS;

```

想象一下你在售卖小号、中号和大号袜子，每种尺寸的袜子都放在单独的储物箱中。如果你想找某个尺寸的袜子，就可以直接去对应尺寸的箱子里找。MySQL 自从三年前发布 MySQL 8.0 以来就有了直方图功能，但该功能却并没有像索引那样广为人知。与索引不同，使用直方图插入、更新或删除记录都不会产生额外开销。而如果更新索引，就必须更新 `ANALYZE TABLE` 命令。当数据变动不大并且频繁更改数据会降低效率时，直方图是一种很好的方法。

### 选择索引还是直方图？

对需要直接访问的且具备唯一性的数据项目使用索引。虽然修改、删除和插入操作会产生额外开销，但如果数据架构正确，索引就可以方便你快速访问。对不经常更新的数据则建议使用直方图，例如过去十几年的季度结果。

### 结语

本文源于最近在 [Open Source 101 会议](https://opensource101.com/) 上的一次报告。报告的演示文稿源自 [PHP UK Conferenc](https://www.phpconference.co.uk/) 的研讨会。查询调优是一个复杂的话题，每次我就索引和直方图作报告时，我都会找到新的可改进点。但是每次报告反馈也表明很多软件界中的人并不精通索引，并且时常使用错误。我想直方图大概由于出现时间较短，还没有出现像索引这种使用错误的情况。

---

via: <https://opensource.com/article/21/5/mysql-query-tuning>

作者：[Dave Stokes](https://opensource.com/users/davidmstokes) 选题：[lujun9972](https://github.com/lujun9972) 译者：[unigeorge](https://github.com/unigeorge) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #364 Debian 11 “Bullseye” 正式发布

Summary: 更多：• GNU Hurd 微内核的非官方移植 GNU/Hurd 2021 发布 • 网络钓鱼攻击使用莫尔斯码来绕过电子邮件过滤系统

Windows闭源也就图一乐，debian Linux才是真的闭源，放着fuse-exfat 这么好的驱动硬是不上，等到windows都能用linux了它才支持。。。

你可能对开源和闭源有什么误解。

exFat 很重要吗？ 单独拿出来说？

# 硬核观察 #364 Debian 11 “Bullseye” 正式发布

### Debian 11 “Bullseye” 正式发布

经过两年多的开发，Debian 11 “Bullseye” 已经[正式发布](https://www.debian.org/News/2021/20210814)。这个版本是一个长期支持版本，将支持 5 年。主要亮点有：Linux 5.10 LTS 内核；首次支持 exFAT 文件系统；超过 59000 个软件包，其中有 11000 个新软件包；支持控制组 v2；默认编译器 GCC 从 8.3 升级到 GCC 10.2；LLVM Clang 从 7.0 升级到 11.0；支持六种桌面环境。

>
> 这是给 Debian 拥趸们的礼品。
>
>
>

### GNU Hurd 微内核的非官方移植 GNU/Hurd 2021 发布

[Debian GNU/Hurd](https://lists.debian.org/debian-hurd/2021/08/msg00040.html) 仍然是一个非官方的移植版本，是基于 Debian 11.0 的源代码结合 GNU Hurd 微内核。鉴于目前 Hurd 的限制，Debian GNU/Hurd 2021 仍然只是适用于i386，硬件支持仍然很差，基本上只能用于虚拟机中。

>
> GNU 项目哪里都好，就是这个内核一直没啥用。
>
>
>

### 网络钓鱼攻击使用莫尔斯码来绕过电子邮件过滤系统

微软[披露](https://www.zdnet.com/article/this-unique-phishing-attack-uses-morse-code-to-hide-its-approach/)了一个网络钓鱼攻击集团的内部技术，他们使用“拼图”技术加上莫尔斯码的破折号和圆点等不寻常的特征来隐藏其攻击。通过邮件发送的 HTML 附件被分成几个部分，然后用各种机制进行编码，包括像莫尔斯码这样古老而不寻常的加密方法，以隐藏这些攻击片段。这个附件就像一个拼图： HTML 文件的各个部分在代码层面上可能是无害的，只有当这些片段被组合在一起并被正确解码时，才会显示出恶意。

>
> 别看摩尔斯码古老，还真是简单而不引人注意。
>
>
>


基础：在 Linux 终端中删除文件和文件夹

Summary: 本教程讲述了如何在 Linux 终端中安全地删除文件和文件夹。

本教程讲述了如何在 Linux 终端中安全地删除文件和文件夹。

# 基础：在 Linux 终端中删除文件和文件夹

>
> 本教程讲述了如何在 Linux 终端中安全地删除文件和文件夹。
>
>
>

<img src="content_image/album_202108_16_110943z9boolgobdlyoiyo.jpg" alt="" title="Removing files">

要想使用图形化界面删除计算机上的文件，你可能会直接将文件或文件夹拖拽到 “垃圾箱” 或 “回收站”。或者你也可以选择要删除的文件或文件夹，右键单击并选择 **删除**。

而在终端中删除文件或文件夹时并没有垃圾箱一说（至少默认情况下没有）。在图形化桌面上，`Trash`（即垃圾箱文件夹）是一个受保护的目录，保护机制可以防止用户不小心将该目录删除，或将其从默认位置移动从而导致找不到它。Trash 本质不过是一个被高度管理的文件夹，因此你可以创建自己的 Trash 文件夹以在终端中使用。

### 为终端设置一个垃圾箱

在家目录中创建一个名为 `Trash` 的目录：

```
$ mkdir ~/Trash

```

### 删除文件

要删除文件或文件夹时，使用 `mv` 命令将文件或文件夹移至 `Trash` 中：

```
$ mv example.txt ~/Trash

```

### 永久删除文件或文件夹

当你准备从系统中永久删除某个文件或文件夹时，可以使用 `rm` 命令清除垃圾箱文件夹中的所有数据。通过将 `rm` 命令指向星号（`*`），可以删除 `Trash` 文件夹内的所有文件和文件夹，而不会删除 `Trash` 文件夹本身。因为用户可以方便且自由地创建目录，所以即使不小心删除了 `Trash` 文件夹，你也可以再次新建一个。

```
$ rm --recursive ~/Trash/*

```

### 删除空目录

删除空目录有一个专门的命令 `rmdir`，它只能用来删除空目录，从而保护你免受递归删除错误的影响。

```
$ mkdir full
$ touch full/file.txt
$ rmdir full
rmdir: failed to remove 'full/': Directory not empty

$ mkdir empty
$ rmdir empty

```

### 更好的删除方式

此外还有一些并没有默认安装在终端上的 [删除文件命令](https://www.redhat.com/sysadmin/recover-file-deletion-linux)，你可以从软件库安装它们。这些命令管理和使用的 `Trash` 文件夹与你在桌面模式使用的是同一个（而非你自己单独创建的），从而使删除文件变得更加方便。

```
$ trash ~/example.txt
$ trash --list
example.txt
$ trash --empty

```

---

via: <https://opensource.com/article/21/8/remove-files-linux-terminal>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[unigeorge](https://github.com/unigeorge) 校对：[wxy](https://github.com/wxy)

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


SteamOS 是什么？关于这款“游戏发行版”你所要知道的事

Summary: 在这篇文章中，我们将回答许多 SteamOS 相关的常见问题。

基于啥都好，基于Arch太不稳定。

请详细说明“不太稳定”

就是bug多，谁用谁知道

请详细说明bug

垃圾

来自河南郑州的 Chrome Mobile 73.0|Android 10 用户

正常滚动更新一般不会挂，sudo pacma -Syu,而且有timeshift用，只要不是sudo rm -rf /*，你怕坏什么

在这篇文章中，我们将回答许多 SteamOS 相关的常见问题。

# SteamOS 是什么？关于这款“游戏发行版”你所要知道的事

SteamOS 是一款基于 Linux 的操作系统，旨在提供来自 Steam 自己的游戏商店顺滑的游戏体验。

虽然它已经存在了许久，但有几件事你应该知道。

在这篇文章中，我们将回答许多 SteamOS 相关的常见问题。

### SteamOS 是什么？

SteamOS 是由游戏分发平台 Steam 开发的 Linux 发行版。它并是一款像 Debian、Linux Mint 或者 Ubuntu 那样的泛用型桌面操作系统，即便你确实可以使用桌面功能。默认情况下，SteamOS 的界面类似于游戏机，因为 SteamOS 旨在成为专为 Steam 游戏设备定制的操作系统，如 Steam Machine（已停产）和 Steam Deck。

你确实也可以在任何 Linux 发行版和其他平台安装 Steam 客户端，但 SteamOS 更是为了提供类似游戏机的体验，方便你玩 Steam 上的游戏。

### SteamOS 基于哪个 Linux 发行版？

作为基于 Linux 的系统，SteamOS 最初基于 Debian 8 开发。随着 Valve 的全新 [Steam Deck](https://www.steamdeck.com/en/) 掌机发布，SteamOS 的最新版本（SteamOS 3.0）将基于 Arch Linux 开发，因为 Arch 支持滚动更新。

SteamOS 的开发团队也相信，SteamOS 基于 Arch Linux 更有利于快速推送更新和优化 Steam Deck。

### SteamOS 的系统要求

理想情况下，符合以下最低要求的设备都应该可以正常运行 SteamOS：

* Intel / AMD 的 64 位 CPU
* 4GB 或更高的运行内存（RAM）
* 250GB 或更大的磁盘
* NVIDIA / Intel / AMD 的显卡
* 用于安装介质的 USB 或者 DVD

（LCTT 译注：本段内容仅针对 SteamOS 2.0。）

### SteamOS 能否在你的电脑上正常运作？

SteamOS（2.0 版本）内置了支持特定硬件的驱动程序。

理论上 SteamOS 可以在任何电脑上运行，但目前官方并没有支持最新的硬件。

### SteamOS 只是又一款 Linux 发行版吗？

SteamOS 严格来说已经是现有的 [适合游戏的 Linux 发行版](https://itsfoss.com/linux-gaming-distributions/) 之一。但与其他发行版不同的是，SteamOS 并不是为了泛用型桌面而设计的。你确实可以安装 Linux 程序，但 SteamOS 支持的软件包极为有限。

总之，它并不适合替代普通 Linux 桌面系统。

### SteamOS 现在还在积极维护中吗？

**是**，但又**不是**。

SteamOS 基于 Debian 8 许久，目前没有任何更新。

如果你正期望将 SteamOS 安装到你的个人设备上，那么目前公开发布的版本（SteamOS 2.0）已经处于不再维护的状态。

不过，Valve 目前正在为 Steam Deck 维护 SteamOS 3.0。因此，可能不久 SteamOS 就可以用于你的桌面了。

### 你是否推荐使用 SteamOS 来玩电脑游戏吗？

**不推荐**。在 Windows 和其它 Linux 发行版面前，SteamOS 并不是你应该选择的替代品。

虽然 SteamOS 主要是为游戏定制的，但在拿它玩游戏之前，你还需要了解许多注意事项。

### 所有游戏都可以在 SteamOS 上玩吗？

**不**。SteamOS 需要依赖 Proton 兼容层才能让 Windows 平台的游戏正常运行。

当然，如今借助同样的底层技术，[在 Linux 里玩游戏](https://itsfoss.com/linux-gaming-guide/) 已经成为了可能，但至少在我写这篇文章时，你并不能让 Steam 上架的所有游戏都可以在 Linux 中运行。

虽然大部分游戏都可以运行，但这并不意味着你游戏库里的所有游戏都能正常游玩。

如果你想玩 Steam 支持的游戏，以及仅限于 Linux 平台的游戏，那还是值得一试的。

### SteamOS 是否开源？

**是的**（SteamOS 2.0）。

SteamOS 操作系统是开源的，你可以在 [官方仓库](https://repo.steampowered.com/steamos/) 中找到源码。

不过，你用来玩游戏的 Steam 客户端是专有的。

值得注意的是，SteamOS 3.0 目前仍处于开发阶段，因此你无法获得它的源代码和任何公开进展。

### SteamOS 是否免费使用？

目前你暂时无法找到可供公众使用的最新版 SteamOS，但它基本上是免费的。基于 Debian 的旧版 SteamOS 可在其 [官方网站](https://store.steampowered.com/steamos/) 上获取。

### 我能找到内置 SteamOS 的游戏主机吗？

SteamOS 最初是为 Steam Machine 这款 Steam 自家的 PlayStation/Xbox 风格的游戏机定制的操作系统。2015 年 Steam Machine 发布后并没有在市场上获得成功，最终停产。

目前，唯一一款预装 SteamOS 的设备是备受瞩目的 Steam Deck。

待到 SteamOS 开放针对其它设备的下载后，你就可以看到有硬件厂商销售预装 SteamOS 的游戏设备了。

但，至少目前来看，你不应该相信任何不知名的制造商提供开箱即用的 SteamOS。

### 下一代 SteamOS 能否使 Linux 成为游戏的可行选择？

是的，绝对是的。

Linux 可能不是外界所推荐的游戏选择，但如果你乐意的话，你也可以查看 [我们所推荐的 Linux 游戏发行版](https://news.itsfoss.com/linux-for-gaming-opinion/)。最后，如果 SteamOS 下了狠心，让每款游戏都能在 Steam Deck 上运行，那么桌面 Linux 用户也将终于可以体验到所有曾经不支持的 Steam 游戏了。

---

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

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

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


硬核观察 #365 科技公司研发 AI 工具可通过摄像头识别员工是否真生病

Summary: 更多：• 英国拟 2025 年完全淘汰固定电话 • PINE64 将推出首款支持 Wacom 手写笔的开源 Linux 电子阅读器

# 硬核观察 #365 科技公司研发 AI 工具可通过摄像头识别员工是否真生病

### 科技公司研发 AI 工具可通过摄像头识别员工是否真生病

以色列一家科技公司开发一款 AI 工具，可以让企业透过智能电话、电脑远距监察员工的生命迹象，以确认员工是真的生病，还是装病请假。用户安装应用后，只需望着镜头 45 秒，该应用即可读取其生命迹象，如心跳、氧饱和度和呼吸频率。AI 系统可探测肉眼无法观察的细微颜色差异，可以看到表皮下方的血液流动情况。镜头可以每秒可以捕捉到 30 至 120 张照片，AI 系统会处理每张照片中皮肤反射的红、绿和蓝光之间的差异，以显示心率、氧饱和度和呼吸率频等讯息。

>
> 这就属于 AI 技术的“邪恶”应用。
>
>
>

### 英国拟 2025 年完全淘汰固定电话

根据英国政府的计划，从 2025 年起，所有家庭和企业需要互联网才能打电话，这意味着数百万的用户“被赶到网上”或只能使用手机打电话。数据显示，约 150 万个家庭——占英国家庭总数的约 6%，尚未上网；另外还有约 50 万个家庭没有手机。这一转变还会影响依赖固定电话的其他服务，例如报警电话、热线电话、支付终端和电话亭。

>
> 虽然说现在固话已经使用的越来越少了，但是确实有些场景下还是必要的。
>
>
>

### PINE64 将推出首款支持 Wacom 手写笔的开源 Linux 电子阅读器

今年晚些时候，PINE64 计划以 399 美元的价格提供首款支持 Wacom 手写笔的 PineNote 开源 Linux 电子阅读器。与 PineBook 笔记本、PinePhone 手机、以及 PineTab 平板电脑等 PINE64 的其它产品一样，都提供了对 Linux 操作系统的良好支持。

>
> 基于 Linux 的开源硬件产品越来越多了，这说明 Linux 的硬件兼容性已经不太是个问题了。
>
>
>


下载《Quarkus 的 Java 开发者指南》电子书

# 下载《Quarkus 的 Java 开发者指南》电子书

>
> 一本新的展示了开发者如何继续使用 Java 框架来构建新的无服务器功能的电子书。
>
>
>

<img src="content_image/album_202108_17_100432yslvlw6s2d462w41.jpg" alt="" title="Coffee beans and a cup of coffee">

[无服务器](https://opensource.com/article/21/1/devapps-strategies) 架构已经成为一种高效的解决方案，无论是物理服务器、虚拟机还是云环境，都可以根据实际工作负载调整超额配置和不足配置资源（如 CPU、内存、磁盘、网络）。然而，在选择新的编程语言来开发无服务器应用时，Java 开发者有一个担忧。对于云上的无服务器部署，尤其是 [Kubernetes](https://opensource.com/article/19/6/reasons-kubernetes)，Java 框架似乎过于沉重和缓慢。

作为 Java 开发者，如果可以继续使用 Java 框架来构建传统的云原生微服务以及同时构建新的无服务器功能呢？这种方法应该是令人兴奋的，因为你不必担心新的无服务器应用框架的学习曲线会很陡峭。

此外，如果 Java 框架不仅可以为开发者提供熟悉技术的乐趣，还可以在启动时以毫秒为单位优化 Kubernetes 中的 Java 无服务器功能，并提供微小的内存足迹，又会怎样？

### 什么是 Quarkus？

[Quarkus](https://quarkus.io/) 是一个新的 Java 框架，可以为 Java 开发者、企业架构师和 DevOps 工程师提供这些功能和好处。它旨在设计无服务器应用，并编写云原生微服务，以便在云基础设施（例如 Kubernetes）上运行。

Quarkus 还支持一个名为 [Funqy](https://quarkus.io/guides/funqy) 的可移植 Java API 扩展，供开发者编写和部署无服务器功能到异构无服务器运行时。

Quarkus Funqy 使开发者能够将 [CloudEvents](https://cloudevents.io/) 与 Knative 环境中的无服务器函数绑定，以处理反应式流。这有利于开发者建立一个通用的消息传递格式来描述事件，提高多云和混合云平台之间的互操作性。

在我的新电子书 《[Java 无服务器功能指南](https://opensource.com/downloads/java-serverless-ebook)》的帮助下，开始你的 Quarkus 之旅。与他人分享你的 Quarkus 经验，让大家都能享受到用 Java 和 Quarkus 进行的无服务器开发。

---

via: <https://opensource.com/article/21/8/java-quarkus-ebook>

作者：[Daniel Oh](https://opensource.com/users/daniel-oh) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


在 Linux 使用 systemd-udevd 管理你的接入硬件

Summary: 使用 udev 管理你的 Linux 系统处理物理设备的方式。

使用 udev 管理你的 Linux 系统处理物理设备的方式。

# 在 Linux 使用 systemd-udevd 管理你的接入硬件

>
> 使用 udev 管理你的 Linux 系统处理物理设备的方式。
>
>
>

<img src="content_image/album_202108_17_104654z1evcdx41xfc4zpq.jpg" alt="" title="collection of hardware on blue backround">

Linux 能够出色地自动识别、加载、并公开接入的无数厂商的硬件设备。事实上，很多年以前，正是这个特性说服我，坚持让我的雇主将整个基础设施转换到 Linux。痛点在于 Redmond 的某家公司（LCTT 译注：指微软）不能在我们的 Compaq 台式机上加载集成网卡的驱动，而 Linux 可以轻松实现这一点。

从那以后的岁月里，Linux 的识别设备库随着该过程的复杂化而与日俱增，而 [udev](https://en.wikipedia.org/wiki/Udev) 就是解决这个问题的希望之星。udev 负责监听 Linux 内核发出的改变设备状态的事件。它可能是一个新 USB 设备被插入或拔出，也可能是一个无线鼠标因浸入洒出的咖啡中而脱机。

udev 负责处理所有的状态变更，比如指定访问设备使用的名称和权限。这些更改的记录可以通过 [dmesg](https://en.wikipedia.org/wiki/Dmesg) 获取。由于 dmesg 的输出通常有几千行，对结果进行过滤通常是聪明的选择。下面的例子说明了 Linux 如何识别我的 WiFi 接口。这个例子展示了我的无线设备使用的芯片组（`ath9k`）、启动过程早期阶段分配的原始名称（`wlan0`）、以及正在使用的又臭又长的永久名称（`wlxec086b1ef0b3`）：

```
$ dmesg | grep wlan
[    5.396874] ath9k_htc 1-3:1.0 wlxec086b1ef0b3: renamed from wlan0

```

在这篇文章中，我会讨论为何有人想要使用这样的名称。在这个过程中，我会探索剖析 udev 的配置文件，然后展示如何更改 udev 的设置，包括编辑系统命名设备的方式。这篇文件基于我的新课程中《[Linux 系统优化](https://pluralsight.pxf.io/RqrJb)》的一个模块。

### 理解 udev 配置系统

使用 systemd 的机器上，udev 操作由 `systemd-udevd` 守护进程管理，你可以通过常规的 systemd 方式使用 `systemctl status systemd-udevd` 检查 udev 守护进程的状态。

严格来说，udev 的工作方式是试图将它收到的每个系统事件与 `/lib/udev/rules.d/` 和 `/etc/udev/rules.d/` 目录下找到的规则集进行匹配。规则文件包括匹配键和分配键，可用的匹配键包括 `action`、`name` 和 `subsystem`。这意味着如果探测到一个属于某个子系统的、带有特定名称的设备，就会给设备指定一个预设的配置。

接着，“分配”键值对被拿来应用想要的配置。例如，你可以给设备分配一个新名称、将其关联到文件系统中的一个符号链接、或者限制为只能由特定的所有者或组访问。这是从我的工作站摘出的一条规则：

```
$ cat /lib/udev/rules.d/73-usb-net-by-mac.rules
# Use MAC based names for network interfaces which are directly or indirectly
# on USB and have an universally administered (stable) MAC address (second bit
# is 0). Don't do this when ifnames is disabled via kernel command line or
# customizing/disabling 99-default.link (or previously 80-net-setup-link.rules).

IMPORT{cmdline}="net.ifnames"
ENV{net.ifnames}=="0", GOTO="usb_net_by_mac_end"

ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb", NAME=="", \
    ATTR{address}=="?[014589cd]:*", \
    TEST!="/etc/udev/rules.d/80-net-setup-link.rules", \
    TEST!="/etc/systemd/network/99-default.link", \
    IMPORT{builtin}="net_id", NAME="$env{ID_NET_NAME_MAC}"

```

`add` 动作告诉 udev，只要新插入的设备属于网络子系统，*并且*是一个 USB 设备，就执行操作。此外，如果我理解正确的话，只有设备的 MAC 地址由特定范围内的字符组成，并且 `80-net-setup-link.rules` 和 `99-default.link` 文件*不*存在时，规则才会生效。

假定所有的条件都满足，接口 ID 会改变以匹配设备的 MAC 地址。还记得之前的 dmesg 信息显示我的接口名称从 `wlan0` 改成了讨厌的 `wlxec086b1ef0b3` 吗？那都是这条规则的功劳。我怎么知道？因为 `ec:08:6b:1e:f0:b3` 是设备的 MAC 地址（不包括冒号）。

```
$ ifconfig -a
wlxec086b1ef0b3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.103  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::7484:3120:c6a3:e3d1  prefixlen 64  scopeid 0x20<link>
        ether ec:08:6b:1e:f0:b3  txqueuelen 1000  (Ethernet)
        RX packets 682098  bytes 714517869 (714.5 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 472448  bytes 201773965 (201.7 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

```

Linux 默认包含这条 udev 规则，我不需要自己写。但是为什么费力进行这样的命名呢——尤其是看到这样的接口命名这么难使用后？仔细看一下包含在规则中的注释：

>
> 对直接或间接插入在 USB 上的网络接口使用基于 MAC 的名称，并且用一个普遍提供的（稳定的）MAC 地址（第二位是 0）。当 ifnames 通过内核命令行或 `customizing/disabling 99-default.link`（或之前的 `80-net-setup-link.rules`）被禁用时，不要这样做。
>
>
>

注意，这个规则专为基于 USB 的网络接口设计的。和 PCI 网络接口卡（NIC）不同，USB 设备很可能时不时地被移除或者替换，这意味着无法保证它们的 ID 不变。某一天 ID 可能是 `wlan0`，第二天却变成了 `wlan3`。为了避免迷惑应用程序，指定绝对 ID 给设备——就像分配给我的 USB 接口的 ID。

### 操作 udev 的设置

下一个示例中，我将从 [VirtualBox](https://www.virtualbox.org/) 虚拟机里抓取以太网接口的 MAC 地址和当前接口 ID，然后用这些信息创建一个改变接口 ID 的 udev 新规则。为什么这么做？也许我打算从命令行操作设备，需要输入那么长的名称让人十分烦恼。下面是工作原理。

改变接口 ID 之前，我需要关闭 [Netplan](https://netplan.io/) 当前的网络配置，促使 Linux 使用新的配置。下面是 `/etc/netplan/` 目录下我的当前网络接口配置文件：

```
$ less /etc/netplan/50-cloud-init.yaml
# This file is generated from information provided by
# the datasource.  Changes to it will not persist across an instance.
# To disable cloud-init's network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
    ethernets:
        enp0s3:
            addresses: []
            dhcp4: true
    version: 2

```

`50-cloud-init.yaml` 文件包含一个非常基本的接口定义，但是注释中也包含一些禁用配置的重要信息。为此，我将移动到 `/etc/cloud/cloud.cfg.d` 目录，创建一个名为 `/etc/cloud/cloud.cfg.d` 的新文件，插入 `network: {config: disabled}` 字符串。

尽管我只在 Ubuntu 发行版上测试了这个方法，但它应该在任何一个带有 systemd 的 Linux（几乎所有的 Linux 发行版都有 systemd）上都可以工作。不管你使用哪个，都可以很好地了解编写 udev 配置文件并对其进行测试。

接下来，我需要收集一些系统信息。执行 `ip` 命令，显示我的以太网接口名为 `enp0s3`，MAC 地址是 `08:00:27:1d:28:10`。

```
$ ip a
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:1d:28:10 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.115/24 brd 192.168.0.255 scope global dynamic enp0s3

```

现在，我要在 `/etc/udev/rules.d` 目录创建一个名为 `peristent-net.rules` 的新文件。我将给文件一个以较小的数字开头的名称，比如 10：

```
$ cat /etc/udev/rules.d/10-persistent-network.rules
ACTION=="add", SUBSYSTEM=="net",ATTR{address}=="08:00:27:1d:28:10",NAME="eth3"

```

数字越小，Linux 越早执行文件，我想要这个文件早点执行。文件被添加时，包含其中的代码就会分配名称 `eth3` 给网络设备——只要设备的地址能够匹配 `08:00:27:1d:28:10`，即我的接口的 MAC 地址 。

保存文件并重启计算机后，我的新接口名应该就会生效。我可能需要直接登录虚拟机，使用 `dhclient` 手动让 Linux 为这个新命名的网络请求一个 IP 地址。在执行下列命令前，可能无法打开 SSH 会话：

```
$ sudo dhclient eth3

```

大功告成。现在你能够促使 udev 控制计算机按照你想要的方式指向一个网卡，但更重要的是，你已经有了一些工具，可以弄清楚如何管理任何不听话的设备。

---

via: <https://opensource.com/article/20/2/linux-systemd-udevd>

作者：[David Clinton](https://opensource.com/users/dbclinton) 选题：[lujun9972](https://github.com/lujun9972) 译者：[YungeG](https://github.com/YungeG) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #366 使用 Ubuntu 计算出了圆周率的最新记录

Summary: 更多：• glibc 安全修复带来了一个更糟糕的漏洞 • 断更十年的 Slackware 15.0 就要发布正式版了

# 硬核观察 #366 使用 Ubuntu 计算出了圆周率的最新记录

### 使用 Ubuntu 计算出了圆周率的最新记录

此前，圆周率的纪录是小数点后 50 万亿位。日前，瑞士的科学家宣布，他们使用了一台运行 Ubuntu Linux 20.04 的计算机算出了圆周率（π）的最新数值，小数点后 62.8 万亿位，打破了新的[世界纪录](https://www.theregister.com/2021/08/17/pi_world_record_challenged/ "https://www.theregister.com/2021/08/17/pi_world_record_challenged/")。这台计算机装有两块 32 核 AMD Epyc 芯片、1TB 内存，有 38 个 16TB 的硬盘，其中 34 块用作内存交换，剩下 4 块用于存储计算出来的圆周率。他们从今年的 5 月 4 日开始，历时 108 天 9 小时。最初是用十六进制进行计算的，然后又用了 12 天转换为十进制数字。最后的十位数为 78 1792 4264。

>
> 有一个这样的说法，宇宙中的所有信息都能在 π 的某个位置中找到。
>
>
>

### glibc 安全修复带来了一个更糟糕的漏洞

最初的问题并不那么糟糕，要利用这个缺陷发起最小的攻击，攻击者需要许多前提条件。而为了修复这个缺陷，却带来了一个[更糟糕的错误](https://www.zdnet.com/article/linux-glibc-security-fix-created-a-nastier-linux-bug/ "https://www.zdnet.com/article/linux-glibc-security-fix-created-a-nastier-linux-bug/")，有可能触发分段故障，导致任何使用该库的应用程序崩溃。红帽公司对第二个漏洞给予 CVSS 7.5 分的高危评分。由于每个 Linux 程序，包括其他语言的解释器（如 Python、PHP）都与 glibc 库相链接。glibc 是仅次于内核本身的第二重要的东西，所以影响相当大。目前新的修复已经提交到上游。

>
> 有时在不相关的代码路径中的改变会导致其他地方的行为改变，而程序员却没有意识到发生了什么。
>
>
>

### 断更十年的 Slackware 15.0 就要发布正式版了

Slackware 是最古老的仍在维护的 Linux 发行版之一。自 Slackware 14 以来，已经过去了近十年。早在 2 月份，Slackware 15.0 Alpha 就已发布，然后在 4 月份发布了 Slackware 15.0 Beta。现在，他们发布了 Slackware 15.0 的第一个[候选版本](http://www.slackware.com/changelog/current.php?cpu=x86_64 "http://www.slackware.com/changelog/current.php?cpu=x86_64")，而稳定版本应该不会太远了。

>
> 作为当年见过和使用过的第一个 Linux 发行版，我是没想到 Slackware 居然还能再次活跃起来。
>
>
>


如何在 Fedora Linux 上安装 Java

# 如何在 Fedora Linux 上安装 Java

不管是爱它还是恨它，都很难避开 Java。

Java 仍然是一种非常流行的编程语言，在学校里教，在企业里用。

如果你想使用基于 Java 的工具或用 Java 编程，你就需要在你的系统上安装 Java。

这就变得很混乱，因为围绕着 Java 有很多技术术语。

* <ruby> Java 开发工具包 <rt>  Java Development Kit </rt></ruby>（JDK）用于创建 Java 程序
* <ruby> Java 运行环境 <rt>  Java Runtime Environment </rt></ruby>（JRE）或 Java 虚拟机（JVM），用于运行 Java 程序。

除此之外，你还会遇到 [OpenJDK](https://openjdk.java.net/) 和 [Oracle Java SE](https://www.oracle.com/java/technologies/javase-downloads.html)。推荐使用 OpenJDK ，因为它是开源的。如果你有专门的需求，那么你应该选择 Oracle Java SE。

还有一件事。即使是 OpenJDK 也有几个版本可供选择。在写这篇文章的时候，Fedora 34 有 OpenJDK 1.8、OpenJDK 11 和 OpenJDK 16 可用。

你可以自行决定想要哪个Java版本。

### 在 Fedora Linux 上安装 Java

首先，检查是否已经安装了 Java，以及它是哪个版本。我不是在开玩笑。Fedora 通常预装了 Java。

要检查它，请使用以下命令：

```
java -version

```

正如你在下面的截图中看到的，我的 Fedora 系统上安装了 Java 11（OpenJDK 11）。

假设你想安装另一个版本的 Java。你可以用下面的命令检查可用的选项：

```
sudo dnf search openjdk

```

这里的 `sudo` 不是必须的，但它会刷新 `sudo` 用户的元数据，这在你安装另一个版本的 Java 时会有帮助。

上面的命令将显示很多输出，其中有很多看起来相似的软件包。你必须专注于最初的几个词来理解不同的版本。

例如，要安装 Java 8（OpenJDK 1.8），包的名字应该是 `java-1.8.0-openjdk.x86_64` 或者 `java-1.8.0-openjdk`。用它来安装：

```
sudo dnf install java-1.8.0-openjdk.x86_64

```

这就好了。现在你的系统上同时安装了 Java 11 和 Java 8。但你将如何使用其中一个呢？

#### 在 Fedora 上切换 Java 版本

你正在使用的 Java 版本保持不变，除非你明确改变它。使用这个命令来列出系统上安装的 Java 版本：

```
sudo alternatives --config java

```

你会注意到在 Java 版本前有一个数字。Java 版本前的 `+` 号表示当前正在使用的 Java 版本。

你可以指定这个数字来切换 Java 版本。因此，在下面的例子中，如果我输入 2，它将把系统中的 Java 版本从 Java 11 改为 Java 8。

这就是你在 Fedora 上安装 Java 所需要做的一切。

---

via: <https://itsfoss.com/install-java-fedora/>

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

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


Summary: 这个最新发布的通用操作系统已经来到。

这个最新发布的通用操作系统已经来到。

# 新发布的 Debian 11 “Bullseye” Linux 发行版的 7 大亮点

>
> 这个最新发布的通用操作系统已经来到。
>
>
>

期待已久的代号为 “Bullseye” 的 Debian 11 版本在经过两年的开发后终于来了。该版本将在未来五年内得到支持，就像任何其他的 Debian 稳定版版本一样。

感到兴奋吗？让我们来看看 Debian 11 的新内容。

### 1、新主题

Debian 11 带有一个新的 “Homeworld” 主题。它的灵感来自 [包豪斯运动](https://mymodernmet.com/what-is-bauhaus-art-movement/)，这是一种 20 世纪初诞生于德国的艺术风格，其特点是对建筑和设计的独特处理。

在 Debian 11 中，无论是在登录界面、安装程序还是 Grub 菜单上，你都会看到这个主题。

### 2、较新版本的桌面环境

Debian 11 包含了它所提供的桌面变体的较新版本：

* GNOME 3.38
* KDE Plasma 5.20
* LXDE 11
* LXQt 0.16
* MATE 1.24
* Xfce 4.16

如果你使用 Fedora 或 Arch/Manjaro 等先锐发行版，你可能会觉得很奇怪。但就是这样。Debian 更倾向于稳定，因此桌面环境的版本不是最新的。当然，它们与之前的 Debian 稳定版相比，还是比较新的。

### 3、软件包更新

Debian 已经更新了它的软件包库。Debian 11 包括了多达 11294 个新软件包，软件包总数多达 59551 个。42821 个软件包有了新的版本。删除了 9519 个软件包。

也就是说你应该会看到像 LibreOffice、Emacs、GIMP 以及各种服务器和编程相关工具等流行应用程序的新版本。

### 4、Linux 内核 5.10 LTS

Debian 11 带有 [Linux 5.10 内核，这是一个长期支持（LTS）版本](https://news.itsfoss.com/kernel-5-10-release/)。Debian 10 Buster 在发布时使用的是 Linux 4.19 内核。

一个新的内核显然意味着对硬件有更好的支持，特别是较新的硬件以及性能的改进。

### 5、打印机和扫描器的改进

Debian 11 带来了新的软件包 ipp-usb。它使用了许多现代打印机所支持的供应商中立的 IPP-over-USB 协议。这意味着许多较新的打印机将被 Debian 11 所支持，而不需要驱动程序。

同样地，SANE 无驱动后端可以让你轻松使用扫描仪。

### 6、支持 exFAT

你不再需要使用 exfat-fuse 包来挂载 exFAT 文件系统。借助 Linux 5.10 内核，Debian 11 已经支持 exFAT 文件系统，并且默认使用它来挂载 exFAT 文件系统。

### 7、仍然支持 32 位

这算是一个功能吗？考虑到现在只有 [少数几个 Linux 发行版支持 32 位架构](https://itsfoss.com/32-bit-linux-distributions/)，我觉得是。

除了 32 位和 64 位 PC，Debian 11 还支持 64 位 ARM（arm64）、ARM EABI（armel）、ARMv7（EABI hard-float ABI，armhf）、小端 MIPS（mipsel）、64 位小端 MIPS（mips64el）、64 位小端 PowerPC（ppc64el）和 IBM System z（s390x）。

现在你知道为什么它被称为“通用操作系统”了吧。 ?

### 其他变化

在这个版本中还有一些变化：

* Systemd 默认使用控制组 v2（cgroupv2）。
* 针对中文、日文、韩文和其他许多语言的新 Fcitx 5 输入法。
* Systemd 日记日志默认为持久性的。
* 一个新的打开命令，可以用某个应用程序（GUI 或 CLI）从命令行自动打开文件。
* 本地系统账户的密码散列现在默认使用 yescrypt 而不是 SHA-512 来提高安全性。

更多信息可以在 [官方发布说明](https://www.debian.org/releases/bullseye/amd64/release-notes/ch-whats-new.en.html) 中找到。

### 获取 Debian 11

Debian 11 可以从其网站下载。只要前往该网站并从那里获得 ISO。

* [下载 Debian](https://www.debian.org/)

如果你已经在使用 Debian 10，你可以 [通过改变你的源列表轻松升级到 Debian 11](https://www.debian.org/releases/bullseye/amd64/release-notes/ch-upgrading.en.html) 。

享受最新和最棒的通用操作系统吧。?

---

via: <https://news.itsfoss.com/debian-11-feature/>

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

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


[免费训练营] Shell 编程训练营，它来了

Summary: 今天，Linux 中国将为大家带来系列公益训练营之 《Shell 编程训练营》，以帮助大家掌握 Shell 编程的精髓和奥义。

一个 Linux 相关的课程，只能用手机之类的设备看，这合适吗？

来自120.231.49.77的 Firefox 93.0|GNU/Linux 用户

不能用Linux在线观看学习吗？

因为相关平台和支持啊阿里云开发者社区支持的，所以用的钉钉系统。<br />
不过回放视频我们会放到视频号和 B 站的。

# [免费训练营] Shell 编程训练营，它来了

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

Shell 作为 Linux 中的第一语言，几乎每一个使用 Linux 的人都用到或用过 Shell，但绝大多数人都并不能掌握 Shell 编程的基本能力和技巧。

但如果你的工作涉及到与 Linux 进行操作和交互，Shell 编程对于你来说，都是一个必学的选项。今天，Linux 中国将为大家带来系列公益训练营之 《**Shell 编程训练营**》，以帮助大家掌握 Shell 编程的精髓和奥义。本次训练营得到了阿里云开发者社区的大力支持。

在本次训练营当中，你将会学习到体系化的 Linux Shell 编程内容，从 0 开始，掌握 Shell 编程的各项基本信息。

本次课程将会分三天进行授课：

* DAY 1：Shell 的基本介绍、常用命令以及 Shell 的流程控制
* DAY 2：Shell 中的数组应用、参数处理和函数的应用
* DAY 3：Shell 的编码规范、调试 Debug 方案以及公共函数库

在授课过程中， 老师将以实战与理论相结合的方式，带着你学习基础知识，并掌握实战能力。

在本次训练营中，训练营导师将会带着你用三天的时间，从 Shell 的基础开始，一起开发一个 Shell 脚本，帮助你掌握 Shell 编程的精髓，提升你的 Shell 编程能力。

此外，通过 Linux 中国专属渠道报名并完成训练营学习的同学，还将获得一张由 Linux 中国颁发的训练营结业证书、全网可查询的电子证书。并有机会获得一本赠送的最新计算机书籍（共计 30 本，直播时抽取赠送）。

### 课程安排

授课时间：2021年 9 月 6 日 - 2021 年 9 月 8 日 21:00 - 22:00（为期 3 晚）

授课方式：直播授课，有回放

授课费用：免费授课，无任何费用

上课地点：报名后进入专属钉钉群

报名链接：<https://developer.aliyun.com/learning/trainingcamp/linux/2?utm_content=g_1000289929>


硬核观察 #367 防火墙可以成为超大型 DDoS 攻击的武器

Summary: 更多：• 黑莓几个月之后终于承认其汽车软件存在漏洞 • 微软 Office 网页版产品结束对 IE11 浏览器的支持

# 硬核观察 #367 防火墙可以成为超大型 DDoS 攻击的武器

### 防火墙可以成为超大型 DDoS 攻击的武器

安全研究人员[发现](https://therecord.media/firewalls-and-middleboxes-can-be-weaponized-for-gigantic-ddos-attacks/)了一种滥用 TCP 协议、防火墙和其他网络中间设备的方法，可以对互联网上的任何目标发动超大型 DDoS 攻击。它首次描述了一种通过 TCP 协议进行 DDoS 反射放大攻击的方法，以前人们认为这种操作是不可能的。更糟糕的是，研究人员说，这些基于 TCP 的攻击的放大系数也远远大于 UDP 协议，使 TCP 协议的滥用成为迄今为止已知的进行 DDoS 攻击的最危险的形式之一，并且在未来非常可能被滥用。

>
> 如果这种 TCP 协议缺陷真的被利用起来，那造成的破坏要比现在的 DDoS 攻击可怕的多。
>
>
>

### 黑莓几个月之后终于承认其汽车软件存在漏洞

黑莓公司开发的 QNX 是一款很老的操作系统，至今仍有许多地方还在使用。今年 5 月被爆出存在一个名为 BadAlloc 的漏洞，受影响的黑莓软件存在于近 [2 亿辆汽车](https://www.blackberry.com/us/en/company/newsroom/press-releases/2021/blackberry-qnx-software-is-now-embedded-in-over-195-million-vehicles)以及成千上万的工业控制设备、医疗工具等。[据称](https://www.politico.com/news/2021/08/17/blackberry-qnx-vulnerability-hackers-505649)，黑莓公司否认该漏洞影响了他们的产品，并抵制政府发布关于该问题的公告的尝试。本周二，黑莓公司才对外[承认](https://support.blackberry.com/kb/articleDetail?articleNumber=000082334)，QNX 操作系统存在一个漏洞，可能会被黑客利用。

>
> 存在这种漏洞的设备所使用的场所都是与生命安全密切相关的，一旦被利用，后果非常严重。
>
>
>

### 微软 Office 网页版产品结束对 IE11 浏览器的支持

微软在近日更新的博文中提供了一些指导。基本上，从今天起，IE11 上对 Microsoft 365 应用程序和服务的支持已经结束。这意味着，你可能无法连接到某些服务，或者不得不忍受糟糕的用户体验。该公司已建议用户将其工作负载迁移到微软 Edge，该浏览器还为那些在仍然支持 IE11 的网站上遇到兼容性问题的用户提供了一个“IE 模式”。

>
> 眼看着，IE 就慢慢没人用了——除了某些政府机构。
>
>
>


在 Fedora Linux 上使用 OpenCV（一）

Summary: OpenCV（开源计算机视觉库）是一个开源的计算机视觉和机器学习软件库。

恰好在用fedora

OpenCV（开源计算机视觉库）是一个开源的计算机视觉和机器学习软件库。

# 在 Fedora Linux 上使用 OpenCV（一）

*封面图片选自[文森特·梵高](https://commons.wikimedia.org/wiki/File:Van_Gogh_-_Starry_Night_-_Google_Art_Project.jpg)的《星空》，公共领域，通过维基共享资源发布*

技术世界每天都在变化，对计算机视觉、人工智能和机器学习的需求也在增加。让计算机和手机能够看到周围环境的技术被称为 [计算机视觉](https://en.wikipedia.org/wiki/Computer_vision)。这个重新创造人眼的工作始于 50 年代。从那时起，计算机视觉技术有了长足的发展。计算机视觉已经通过不同的应用进入了我们的手机。这篇文章将介绍 Fedora Linux 上的 [OpenCV](https://en.wikipedia.org/wiki/OpenCV)。

### 什么是 OpenCV？

>
> OpenCV（<ruby> 开源计算机视觉库 <rt>  Open Source Computer Vision Library </rt></ruby>）是一个开源的计算机视觉和机器学习软件库。OpenCV 的建立是为了给计算机视觉应用提供一个通用的基础设施，并加速机器感知在商业产品中的应用。它有超过 2500 种优化后的算法，其中包括一套全面的经典和最先进的计算机视觉和机器学习算法。这些算法可用于检测和识别人脸、识别物体、对视频中的人类行为进行分类，并建立标记，将其与增强现实叠加等等。
>
>
> [opencv.org – about](https://opencv.org/about/)
>
>
>

### 在 Fedora Linux 上安装 OpenCV

要开始使用 OpenCV，请从 Fedora Linux 仓库中安装它：

```
$ sudo dnf install opencv opencv-contrib opencv-doc python3-opencv python3-matplotlib python3-numpy

```

**注意：** 在 Fedora Silverblue 或 CoreOS 上，Python 3.9 是核心提交的一部分。用以下方法安装 OpenCV 和所需工具：

```
rpm-ostree install opencv opencv-doc python3-opencv python3-matplotlib python3-numpy

```

接下来，在终端输入以下命令，以验证 OpenCV 是否已经安装：

```
$ python
Python 3.9.6 (default, Jul 16 2021, 00:00:00)
[GCC 11.1.1 20210531 (Red Hat 11.1.1-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2 as cv
>>> print( cv.__version__ )
4.5.2
>>> exit()

```

当你输入 `print` 命令时，应该显示当前的 OpenCV 版本，如上图所示。这表明 OpenCV 和 Python-OpenCV 库已经成功安装。

此外，如果你想用 Jupyter Notebook 做笔记和写代码，并了解更多关于数据科学工具的信息，请查看早期的 Fedora Magazine 文章：[Fedora 中的 Jupyter 和数据科学](https://fedoramagazine.org/jupyter-and-data-science-in-fedora/)。

### 开始使用 OpenCV

安装完成后，使用 Python 和 OpenCV 库加载一个样本图像（按 `S` 键以 png 格式保存图像的副本并完成程序）：

```
$ cp /usr/share/opencv4/samples/data/starry_night.jpg .
$ python starry_night.py

```

`starry_night.py` 的内容：

```
import cv2 as cv
import sys
img = cv.imread(cv.samples.findFile("starry_night.jpg"))
if img is None:
    sys.exit("Could not read the image.")
cv.imshow("Display window", img)
k = cv.waitKey(0)
if k == ord("s"):
    cv.imwrite("starry_night.png", img)

```

通过在 `cv.imread` 函数中添加参数 `0`，对图像进行灰度处理，如下所示。

```
img = cv.imread(cv.samples.findFile("starry_night.jpg"),0)

```

这些是一些可以用于 `cv.imread` 函数的第二个参数的替代值：

* `cv2.IMREAD_GRAYSCALE` 或 `0`：以灰度模式加载图像。
* `cv2.IMREAD_COLOR** 或`1`：以彩色模式载入图像。图像中的任何透明度将被移除。这是默认的。
* `cv2.IMREAD_UNCHANGED** 或`-1`：载入未经修改的图像。包括 alpha 通道。

#### 使用 OpenCV 显示图像属性

图像属性包括行、列和通道的数量、图像数据的类型、像素的数量等等。假设你想访问图像的形状和它的数据类型。你可以这样做：

```
import cv2 as cv

img = cv.imread(cv.samples.findFile("starry_night.jpg"))
print("Image size is", img.shape)
print("Data type of image is", img.dtype)

Image size is (600, 752, 3)
Data type of image is uint8

print(f"Image 2D numpy array \n {img}")

Image 2D numpy array
 [[[0 0 0]
  [0 0 0]
  [0 0 0]
  ...
  [0 0 0]
  [0 0 0]
  [0 0 0]]

 [[0 0 0]
  [0 0 0]
  [0 0 0]
  ...

```

* `img.shape`：返回一个行数、列数和通道数的元组（如果是彩色图像）。
* `img.dtype`：返回图像的数据类型。

接下来用 Matplotlib 显示图像：

```
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(cv.samples.findFile("starry_night.jpg"),0)
plt.imshow(img)
plt.show()

```

#### 发生了什么？

该图像是作为灰度图像读入的，但是当使用 Matplotlib 的 `imshow` 函数时，它不一定会以灰度显示。这是因为 `imshow` 函数默认使用不同的颜色映射。要指定使用灰度颜色映射，请将 `imshow` 函数的第二个参数设置为 `cmap='gray'`，如下所示：

```
plt.imshow(img,cmap='gray')

```

这个问题在以彩色模式打开图片时也会发生，因为 Matplotlib 期望图片为 RGB（红、绿、蓝）格式，而 OpenCV 则以 BGR（蓝、绿、红）格式存储图片。为了正确显示，你需要将 BGR 图像的通道反转。

```
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR)
fig, (ax1, ax2) = plt.subplots(1,2)
ax1.imshow(img)
ax1.set_title('BGR Colormap')
ax2.imshow(img[:,:,::-1])
ax2.set_title('Reversed BGR Colormap(RGB)')
plt.show()

```

#### 分割和合并颜色通道

```
import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR)
b,g,r = cv.split(img)

fig,ax = plt.subplots(2,2)

ax[0,0].imshow(r,cmap='gray')
ax[0,0].set_title("Red Channel");
ax[0,1].imshow(g,cmap='gray')
ax[0,1].set_title("Green Channel");
ax[1,0].imshow(b,cmap='gray')
ax[1,0].set_title("Blue Channel");

# Merge the individual channels into a BGR image
imgMerged = cv.merge((b,g,r))
# Show the merged output
ax[1,1].imshow(imgMerged[:,:,::-1])
ax[1,1].set_title("Merged Output");
plt.show()

```

* `cv2.split`：将一个多通道数组分割成几个单通道数组。
* `cv2.merge`：将几个数组合并成一个多通道数组。所有的输入矩阵必须具有相同的大小。

**注意：** 白色较多的图像具有较高的颜色密度。相反，黑色较多的图像，其颜色密度较低。在上面的例子中，红色的密度是最低的。

#### 转换到不同的色彩空间

`cv2.cvtColor` 函数将一个输入图像从一个颜色空间转换到另一个颜色空间。在 RGB 和 BGR 色彩空间之间转换时，应明确指定通道的顺序（`RGB2BGR` 或 `BGR2RGB`）。**注意，OpenCV 中的默认颜色格式通常被称为 RGB，但它实际上是 BGR（字节是相反的）。** 因此，标准（24 位）彩色图像的第一个字节将是一个 8 位蓝色分量，第二个字节是绿色，第三个字节是红色。然后第四、第五和第六个字节将是第二个像素（蓝色、然后是绿色，然后是红色），以此类推。

```
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread(cv.samples.findFile("starry_night.jpg"),cv.IMREAD_COLOR)
img_rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.show()

```

### 更多信息

关于 OpenCV 的更多细节可以在[在线文档](https://docs.opencv.org/4.5.2/index.html)中找到。

感谢阅读。

---

via: <https://fedoramagazine.org/use-opencv-on-fedora-linux-part-1/>

作者：[Onuralp SEZER](https://fedoramagazine.org/author/thunderbirdtr/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


使用 commons-cli 解析 Java 中的命令行选项

Summary: 让用户用命令行选项调整你的 Java 应用程序运行方式。

让用户用命令行选项调整你的 Java 应用程序运行方式。

# 使用 commons-cli 解析 Java 中的命令行选项

>
> 让用户用命令行选项调整你的 Java 应用程序运行方式。
>
>
>

通常向终端中输入命令时，无论是启动 GUI 应用程序还是仅启动终端应用程序，都可以使用 <ruby>   命令行选项  <rt>  options or switches or flags </rt></ruby> （**以下简称选项**）来修改应用程序的运行方式。这是 [POSIX 规范](https://opensource.com/article/19/7/what-posix-richard-stallman-explains) 设定的标准，因此能够检测和解析选项对 Java 程序员而言是很有用的技能。

Java 中有若干种解析选项的方法，其中我最喜欢用的是 [Apache Commons CLI](https://commons.apache.org/proper/commons-cli/usage.html) 库，简称 **commons-cli**。

### 安装 commons-cli

如果你使用类似 [Maven](https://maven.apache.org/) 之类的项目管理系统以及<ruby> 集成开发环境 <rt>  Integrated Development Environment </rt></ruby>（简称 IDE），可以在项目属性（比如 `pom.xml` 配置文件或者 Eclipse 和 NetBeans 的配置选项卡）中安装 Apache Commons CLI 库。

而如果你采用手动方式管理库，则可以从 Apache 网站下载 [该库的最新版本](https://commons.apache.org/proper/commons-cli/download_cli.cgi)。下载到本地的是几个捆绑在一起的 JAR 文件，你只需要其中的一个文件 `commons-cli-X.Y.jar`（其中 X 和 Y 代指最新版本号）。把这个 JAR 文件或手动或使用 IDE 添加到项目，就可以在代码中使用了。

### 将库导入至 Java 代码

在使用 `commons-cli` 库之前，必须首先导入它。对于本次选项解析的简单示例而言，可以先在 `Main.java` 文件中简单写入以下标准代码：

```
package com.opensource.myoptparser;

import org.apache.commons.cli.*;

public class Main {
    public static void main(String[] args) {
    // code
    }
}

```

至此在 Java 中解析选项的准备工作已经做好了。

### 在 Java 中定义布尔选项

要实现解析选项，首先要定义应用程序可接收的有效选项。使用 `Option`（注意是单数）类来创建选项对象，使用 `Options`（注意是复数）类来追踪项目中创建的所有选项。

首先为选项创建一个组，按照惯例命名为 `options`：

```
    //code
    Options options = new Options();

```

接下来，通过列出短选项（即选项名简写）、长选项（即全写）、默认布尔值（LCTT 译注：设置是否需要选项参数，指定为 `false` 时此选项不带参，即为布尔选项）和帮助信息来定义选项，然后设置该选项是否为必需项（LCTT 译注：下方创建 `alpha` 对象的代码中未手动设置此项），最后将该选项添加到包含所有选项的 `options` 组对象中。在下面几行代码中，我只创建了一个选项，命名为 `alpha`：

```
    //define options
    Option alpha = new Option("a", "alpha", false, "Activate feature alpha");
    options.addOption(alpha);

```

### 在 Java 中定义带参选项

有时用户需要通过选项提供 `true` 或 `false` 以外的信息，比如给出配置文件、输入文件或诸如日期、颜色这样的设置项值。这种情况可以使用 `builder` 方法，根据选项名简写为其创建属性（例如，`-c` 是短选项，`--config` 是长选项）。完成定义后，再将定义好的选项添加到 `options` 组中：

```
    Option config = Option.builder("c").longOpt("config")
        .argName("config")
        .hasArg()
        .required(true)
        .desc("set config file").build();
    options.addOption(config);

```

`builder` 函数可以用来设置短选项、长选项、是否为必需项（本段代码中必需项设置为 `true`，也就意味着用户启动程序时必须提供此选项，否则应用程序无法运行）、帮助信息等。

### 使用 Java 解析选项

定义并添加所有可能用到的选项后，需要对用户提供的参数进行迭代处理，检测是否有参数同预设的有效短选项列表中的内容相匹配。为此要创建命令行 `CommandLine` 本身的一个实例，其中包含用户提供的所有参数（包含有效选项和无效选项）。为了处理这些参数，还要创建一个 `CommandLineParser` 对象，我在代码中将其命名为 `parser`。最后，还可以创建一个 `HelpFormatter` 对象（我将其命名为 `helper`），当参数中缺少某些必需项或者用户使用 `--help` 或 `-h` 选项时，此对象可以自动向用户提供一些有用的信息。

```
    // define parser
    CommandLine cmd;
    CommandLineParser parser = new BasicParser();
    HelpFormatter helper = new HelpFormatter();

```

最后，添加一些条件判断来分析用户提供的选项，我们假设这些选项已经作为命令行输入被获取并存储在 `cmd` 变量中。这个示例应用程序有两种不同类型的选项，但对这两种类型都可以使用 `.hasOption` 方法加上短选项名称来检测选项是否存在。检测到一个存在的选项后，就可以对数据做进一步操作了。

```
try {
    cmd = parser.parse(options, args);
    if(cmd.hasOption("a")) {
    System.out.println("Alpha activated");
    }

    if (cmd.hasOption("c")) {
    String opt_config = cmd.getOptionValue("config");
    System.out.println("Config set to " + opt_config);
    }
} catch (ParseException e) {
    System.out.println(e.getMessage());
    helper.printHelp("Usage:", options);
    System.exit(0);
}

```

解析过程有可能会产生错误，因为有时可能缺少某些必需项如本例中的 `-c` 或 `--config` 选项。这时程序会打印一条帮助信息，并立即结束运行。考虑到此错误（Java 术语中称为异常），在 `main` 方法的开头要添加语句声明可能的异常：

```
public static void main(String[] args) throws ParseException {

```

示例程序至此就大功告成了。

### 测试代码

你可以通过调整传递给代码的默认参数来在 IDE 中测试应用程序，或者创建一个 JAR 文件并在终端运行测试。这个过程可能会因 IDE 的不同而不同。具体请参阅相应的 IDE 文档，以及我写过的关于如何创建 JAR 文件的文章，或者参考 Daniel Oh 的关于如何使用 [Maven](https://developers.redhat.com/blog/2021/04/08/build-even-faster-quarkus-applications-with-fast-jar) 执行同样操作的文章。

首先，省略必需项 `-c` 或 `--config` 选项，检测解析器的异常处理：

```
$ java -jar dist/myapp.jar
Missing required option: c
usage: Usage:
 -a,--alpha             Activate feature alpha
 -c,--config <config>   Set config file

```

然后提供输入选项再进行测试：

```
java -jar dist/myantapp.jar --config foo -a
Alpha activated
Config set to foo

```

### 选项解析

为用户提供选项功能对任何应用程序来说都是很重要的。有了 Java 和 Apache Commons，要实现这个功能并不难。

以下是完整的演示代码，供读者参考：

```
package com.opensource.myapp;

import org.apache.commons.cli.*;

public class Main {

    /**
     * @param args the command line arguments
     * @throws org.apache.commons.cli.ParseException
     */
    public static void main(String[] args) throws ParseException {
        // define options
        Options options = new Options();

        Option alpha = new Option("a", "alpha", false, "Activate feature alpha");
        options.addOption(alpha);

        Option config = Option.builder("c").longOpt("config")
                .argName("config")
                .hasArg()
                .required(true)
                .desc("Set config file").build();
        options.addOption(config);

        // define parser
        CommandLine cmd;
        CommandLineParser parser = new BasicParser();
        HelpFormatter helper = new HelpFormatter();

        try {
            cmd = parser.parse(options, args);
            if(cmd.hasOption("a")) {
                System.out.println("Alpha activated");
            }

            if (cmd.hasOption("c")) {
                String opt_config = cmd.getOptionValue("config");
                System.out.println("Config set to " + opt_config);
            }
        } catch (ParseException e) {
            System.out.println(e.getMessage());
            helper.printHelp("Usage:", options);
            System.exit(0);
        }
    }
}

```

### 使用 Java 和选项

选项使用户可以调整命令的工作方式。使用 Java 时解析选项的方法有很多，其中之一的 `commons-cli` 是一个强大而灵活的开源解决方案。记得在你的下一个 Java 项目中尝试一下哦。

---

via: <https://opensource.com/article/21/8/java-commons-cli>

作者：[Seth Kenlon](https://opensource.com/users/seth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[unigeorge](https://github.com/unigeorge) 校对：[wxy](https://github.com/wxy)

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