用 git log 命令显示在特定日期的提交记录

Summary: git log 命令是 Git 中一个很重要的查看提交记录的工具，它也是人们喜欢使用 Git 的原因之一。

# 用 git log 命令显示在特定日期的提交记录

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

>
> `git log` 命令是 Git 中一个很重要的查看提交记录的工具，它也是人们喜欢使用 Git 的原因之一。
>
>
>

`git log` 命令能够让你了解到更多关于贡献者 <ruby> 提交 <rt>  commit </rt></ruby> 的记录。使用 `git log` 的一种方式是按日期查看提交记录 。要查看**在指定日期或日期范围内**创建的 Git 存储库中的提交记录，请使用带有选项 `--since` 或 `--until` 或者同时使用以上两个选项的 `git log` 命令。

首先，进入你要查看的分支（例如，`main` 分支）：

```
$ git checkout main

```

接下来，你可以使用以下命令，来显示当前日期（即今天）的提交记录：

```
$ git log --oneline --since="yesterday"

```

仅显示某一特定用户（例如，用户 `Agil`）在今天的提交记录：

```
$ git log --oneline --since="yesterday" --author="Agil"

```

还可以显示在某一日期范围内的提交记录。使用以下命令，显示在任意两个日期之间（例如，2022 年 4 月 22 日至 2022 年 4 月 24 日）的提交记录：

```
$ git log --oneline --since="2022-04-22" --until="2022-04-24"

```

在上面这个例子中，会输出 2022 年 4 月 22 日至 2022 年 4 月 24 日期间，不包括 2022 年 4 月 22 日的所有提交记录。如果你想要包括 2022 年 4 月 22 日的提交记录，请将命令中的 `2022-04-22` 替换为 `2022-04-21`。

运行以下命令，能够显示某一特定用户（例如，用户 `Agil`）在两个指定的日期之间的提交记录：

```
$ git log --oneline --since="2022-04-22" --until="2022-04-24" --author="Agil"

```

### 总结

Git 有很多优点，其中一个优点就是 Git 让你能够收集你项目的相关数据。`git log` 命令是一个重要的查看提交记录的工具，也是人们喜欢使用 Git 的原因之一！

---

via: <https://opensource.com/article/22/10/git-log-command>

作者：[Agil Antony](https://opensource.com/users/agantony) 选题：[lkxed](https://github.com/lkxed) 译者：[chai001125](https://github.com/chai001125) 校对：[wxy](https://github.com/wxy)

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


安卓开源项目（AOSP）现在兼容 RISC-V 了

Summary: 安卓的一个重要进展是将安卓开源项目Android Open Source Project（AOSP）移植到 RISC-V 处理器架构。

# 安卓开源项目（AOSP）现在兼容 RISC-V 了

>
> 安卓的一个重要进展是将<ruby> 安卓开源项目 <rt>  Android Open Source Project </rt></ruby>（AOSP）移植到 RISC-V 处理器架构。
>
>
>

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

AOSP 已经开始在上游启用 RISC-V，这将促进 RISC-V CPU 在可穿戴设备、物联网，以及最终在智能手机和笔记本电脑中的使用。

为了开放生态系统，中国科学院 PLCT 实验室的工程师和软件开发人员在 2020 年开始将 Android 10 移植到 RISC-V 架构上。阿里巴巴的云计算部门和平头哥芯片子公司一起努力保持开发与最新的安卓版本同步。

“我们很高兴看到谷歌对构建针对 RISC-V 的 AOSP 的更多支持！阿里云一直致力于通过一系列的创新来支持 RISC-V 社区的发展，比如将安卓的基本功能移植到 RISC-V 上，这证明了在从多媒体到信号处理、设备互联和人工智能等场景中使用基于 RISC-V 的设备的可行性。”阿里云生态系统总监、RISC-V 国际组织的应用与工具水平委员会副主席 David Chen 博士说：“我们期待着与安卓团队合作，为繁荣的 RISC-V 社区做出贡献。”

通过增强 RISC-V 上的安卓系统的基本功能，在 2021 年，阿里云的专家们付出了巨大的努力，积极推动了软件生态系统的发展。 RISC-V on Android 的工作集中在 RISC-V Android 工作组和软件库中进行。

---

via: <https://www.opensourceforu.com/2022/11/the-android-open-source-project-is-now-risc-v-compatible/>

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

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


硬核观察 #812 GitHub Copilot 被诉“规模空前的软件盗版”

Summary: • GitHub Copilot 被诉“规模空前的软件盗版” • 经过六年等待，Rust 终于支持通用关联类型了 • 谷歌计划建立支持世界上 1000 种最常用的语言的 AI 模型

是吗， 可惜你用不了谷歌

来自湖北武汉的 Chrome Mobile iOS 107.0|iOS 16.0 用户

# 硬核观察 #812 GitHub Copilot 被诉“规模空前的软件盗版”

### GitHub Copilot 被诉“规模空前的软件盗版”

周四，有程序员在旧金山提起诉讼，称其代表数百万可能受每月 10 美元的 Copilot 服务影响的 GitHub 用户。该诉讼旨在挑战 GitHub Copilot 的合法性。诉讼对象包括 GitHub 其所有者微软，以及为该工具提供支持的 OpenAI。该诉讼认为“被告已经侵犯了大量创作者的合法权利，这些创作者在 GitHub 上根据某些开源许可证发布代码或其他作品。”包括 MIT 许可证、GPL 许可证和 Apache 许可证等 11 个流行的开源许可证，都要求注明作者姓名和版权。Copilot 违反并删除这些许可证，“因此，它正在实施规模空前的软件盗版行为。”

>
> **[消息来源：IT Pro](https://www.itpro.co.uk/software/369456/github-copilot-sued-over-software-piracy-on-unprecendented-scale)**
>
>
>

>
> 老王点评：虽然可能是旷日持久的诉讼，但是目前的 AI 没有理会开源许可证就直接拿过来用代码的方式，肯定是有问题的。
>
>
>

### 经过六年等待，Rust 终于支持通用关联类型了

最新的 Rust 稳定版 1.65.0 支持了通用关联类型（GAT），可以在关联类型上声明生命期、类型和常量泛型。Rust 官方称，“很难用几个字来形容这些东西有多有用。”为了支持 GAT，必须对编译器进行大量的修改，而这项功能的 RFC 是 2016 年提出的。总的来说，GAT 为大量的模式和 API 提供了基础性的依据。大量项目因为 GAT 的稳定而受阻。即使你不需要直接使用 GAT，你所使用的库也很有可能在内部或公开场合使用它，很多时候，GAT 是唯一实现方式。

>
> **[消息来源：Slashdot](https://developers.slashdot.org/story/22/11/05/2048240/new-features-in-rust-include-generic-associated-types-gats-after-six-year-wait)**
>
>
>

>
> 老王点评：Rust 越来越发展完善，真的可以预期成为主要的底层语言。
>
>
>

### 谷歌计划建立支持世界上 1000 种最常用的语言的 AI 模型

该公司公布了一个经过 400 多种语言训练的 AI 模型，它将其描述为 “目前在语音模型中看到的最大的语言覆盖范围”，并宣布建立一个支持 1000 种语言的模型。谷歌认为，创建一个如此规模的模型将使其更容易将各种人工智能功能带入在线空间和人工智能训练数据集中表现不佳的语言（也被称为 “低资源语言”）。谷歌称，建立单一模型，而不是建立 1000 种不同的模型，有助于 AI 将从高资源语言获得的能力转化为低资源语言的能力。

>
> **[消息来源：The Verge](https://www.theverge.com/2022/11/2/23434360/google-1000-languages-initiative-ai-llm-research-project)**
>
>
>

>
> 老王点评：这样的进展，或许过几年，不需要专门学习外语了。
>
>
>


如何在 Ubuntu 和其他 Linux 中检查 CPU 和硬盘温度

对于win的wsl，好像都没法检测。

# 如何在 Ubuntu 和其他 Linux 中检查 CPU 和硬盘温度

>
> 想知道如何在台式机或笔记本电脑上检查 Ubuntu 和其他 Linux 中的 CPU 和硬盘温度？这是一个快速指南。
>
>
>

如果你是普通用户，那么实际上不需要检查 CPU 或 HDD 温度。但是，如果你使用的是非常旧的硬件或轻薄型的硬件，你可能会遇到过热问题。因为这些薄的硬件内部紧密耦合在一起，无论做了多少传热机制，它都会升温。因此，必须监控硬件的温度。然而，现代 Linux 发行版能够通过软件传感器很好地处理过热情况。

### 在 Ubuntu 上监控 CPU 和硬盘温度的步骤

#### 使用终端

我们将使用几个包来实现相同的目的。在基于 Ubuntu 的系统中打开一个终端并安装以下内容。

```
sudo apt install hddtemp
sudo apt install lm-sensors

```

[hddtemp](https://wiki.archlinux.org/title/Hddtemp) 程序为你提供硬盘和 SSD （根据我的测试）的温度。 [lm-sensors](https://github.com/lm-sensors/lm-sensors) 包为你提供来自 CPU 和其他通过 PCI 端口访问的传感器的温度详细信息。

安装后，从终端运行以下命令。你需要知道你的磁盘标识符，例如 `/dev/sda` 或 `/dev/sdb` 等。

要找出磁盘标识符，你可以使用 `fdisk`。

```
sudo fdisk -l

```

然后运行以下命令检查 HDD 或 SSD 温度。

```
sudo hddtemp

```

*来自终端的 HDD 或 SSD 温度*

检查 CPU 温度和其他信息需要额外的步骤。

首先，运行以下命令，以便传感器程序可以检测到系统中的传感器。

```
sudo sensors-detect

```

上面的命令可能会问你一些是/否的问题。继续按回车选择默认选项。

完成后，运行以下命令查看 CPU 和其他接口温度。

```
sensors

```

*使用传感器*

#### 使用 GUI 工具

如果你更喜欢能完成上述所有操作的漂亮 GUI，你可以安装 [psensor](https://wpitchoune.net/psensor/)。该程序适用于 Linux 系统，例如 Ubuntu、Fedora、[Arch](https://www.debugpoint.com/tag/arch-linux) 和其他变体。它为你提供了漂亮的图形和表格视图：

Ubuntu 及其衍生版：

```
sudo apt install psensor

```

Fedora 和基于 RPM 的衍生版：

```
sudo dnf install psensor

```

Arch、Manjaro 和类似的衍生版：

```
pacman -S psensor

```

安装后，从终端运行 `psensor` 或从应用菜单启动它。

正如你在下面的截图中所见，它通过漂亮的图表让你可以很好地了解 CPU、GPU 和 HDD 的所有重要温度。使用它的首选项，你可以根据需要对其进行调整。这个轻量级的程序在很多情况下都会很有帮助。

*psensor 运行*

因此，这些是你可以在 Ubuntu 和其他 Linux 系统中监控 CPU、GPU 或 HDD 温度的一些方法。如果你知道其他方法，请通过下面的评论栏告诉我。

---

via: <https://www.debugpoint.com/cpu-hdd-temperature-ubuntu/>

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

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


使用 Pip 升级 Python 软件包

Python软件包的依赖关系令人头疼。如果可以运行，建议不要升级它。

# 使用 Pip 升级 Python 软件包

你上次更新通过 Pip 安装的 Python 软件包是什么时候？大多数用户往往会忘记这些 Python 软件包也需要手动更新，因为仅仅更新系统存储库对于软件包来说是不起作用的。

因此，让我们花点时间看看如何使用 Pip，来更新旧的 Python 软件包吧。

### 如何使用 Pip 升级 Python 软件包

[Pip（Pip Installs Packages）](https://itsfoss.com/install-pip-ubuntu/) 是一个用于管理 Python 软件包的 <ruby> 命令行实用程序 <rt>  command line utility </rt></ruby> 。你可以将 Pip 安装 Python 软件包，类比为在 Ubuntu 和 Debian 中使用 `apt` 管理软件包那样。

因此，接下来就让我们深入了解如何使用这个极好的工具 Pip，来管理与 Python 软件包相关的内容吧。

#### 1、列出过时的 Python 软件包

在计划更新什么软件包之前，我们先要列出有哪些过时的软件包，你可以在其中选择想要更新的软件包，因为大多数人不会想一下子更新整个软件包库。

要列出过时的 Python 软件包，你只需将 `pip` 命令与 `list` 选项、`--outdated` 标志一同使用即可，如下图所示：

```
pip list --outdated

```

#### 2、升级特定的软件包

获得可更新的软件包列表后，你可以像我之前提到的那样，选择你要更新的那个特定的软件包，pip 升级软件包命令的语法如下：

```
pip install package_name -U

```

例如，我想将名为 `anime-api` 的软件包升级到最新版本，所以我将使用下面的命令来升级：

```
pip install anime-api -U

```

#### 3、将软件包升级到特定的版本

没有必要总是使用软件的最新版本，如果你想将软件包升级到不是最新的某个特定版本，参考如下的命令语法：

```
pip install --upgrade <package>==<version>

```

例如，我想将名为 `xdg` 的软件包更新到 5.1 版本，5.1 版本是最新版本的前一个版本，所以可以使用以下命令：

```
pip install --upgrade xdg==5.1

```

#### 4、使用 Pip 一次性升级所有软件包

**请注意：我不建议你一次性升级所以软件包，因为 Python 软件包的依赖项太复杂了，一次性的升级无法处理相互依赖项。**

要一次性升级所有 python 软件包，你可以使用以下命令：

```
pip3 list --outdated --format=freeze | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip3 install -U

```

上面的命令使用了 [xargs](https://linuxhandbook.com/xargs-command/)。首先，会得到所有需要更新的软件包，然后对每个软件包执行 `pip3 install -U` 命令。

我在这里使用的是 `pip3`，而不是 `pip`。在 Ubuntu 22.04 及更高的版本中，`pip` 和 `pip3` 命令都可以使用。

### 总结

使用 Pip 一次性更新所有 Python 软件包并不是一个好主意。我发现一次性更新后，软件包之间的依赖关系被破坏了，所以请确保只更新你想要更新的软件包。

如果你还有其他的疑问，就请在评论区中留言吧。

---

via: <https://itsfoss.com/upgrade-pip-packages/>

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

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


Summary: • systemd 252 如预期的锁定了 Linux 引导过程 • Mastodon 用户激增 • Arc 显卡的更新只能在支持英特尔 ME 的系统进行

# 硬核观察 #813 systemd 252 如预期的锁定了 Linux 引导过程

### systemd 252 如预期的锁定了 Linux 引导过程

之前，我们 [报道](/article-15184-1.html) 过，systemd 创始人发文指出 Linux 引导过程不安全，并提出采用加密签名的统一内核镜像（UKI），使用 TPM 2.0 硬件加强 Linux 系统启动过程的安全性。UKI 将 Linux 内核和 initrd，以及一些其他的小组件，合并到一个文件中，允许整个文件被加密签名。在刚刚发布的 systemd 252 中，几个重要的功能都与新的 UKI 全签名启动过程有关。除此以外，还很一些重要特性也值得关注。

>
> **[消息来源：The Register](https://www.theregister.com/2022/11/03/version_252_systemd/)**
>
>
>

>
> 老王点评：我是觉得 sytemd 有些激进了，虽然确实 systemd 在引入新特性方面进展很快。
>
>
>

### Mastodon 用户激增

在埃隆·马斯克接管 Twitter 的一周内，Mastodon 激增了 23 万名用户，月活用户已达 65 万。但与 Twitter 相比，仍然非常少，Twitter 有将近 “2.38 亿日活用户”。其创始人说，“它显然没有 Twitter 那么大，但它是这个网络有史以来最大的。”Mastodon 出现于 2016 年，可以免费使用，也没有广告，由一个非营利组织开发的，并通过众筹获得支持。

>
> **[消息来源：CNN](https://www.cnn.com/2022/11/05/tech/mastodon/index.html)**
>
>
>

>
> 老王点评：没用过，也不知道是啥。
>
>
>

### Arc 显卡的更新只能在支持英特尔 ME 的系统进行

英特尔管理引擎（ME）是隐藏在英特尔 CPU 中的一个操作系统，它是一个修改版的 MINIX 3，运行在用户根本接触不到的 -3 层。这个事情我们以前 [介绍](/article-9040-1.html) 过。根据 Fwupd 开发者的消息，至少现在，英特尔的 Arc 显卡只能通过 ME 来更新其图形系统控制器的固件。因此，旧的英特尔系统或非英特尔系统，如 AMD、RISC-V 等系统，将无法更新 Arc 显卡的固件。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Intel-GSC-Firmware-Needs-ME)**
>
>
>

>
> 老王点评：这显然是越来越封闭了。从最近的一些趋势来看，一些硬件厂商看似开放，其实本质上还是想各种办法封闭起来。
>
>
>


如何在 Web 浏览器中启用深色模式

现在黑暗模式有了，请问linuxcn打算什么时候启用黑暗主题啊？

# 如何在 Web 浏览器中启用深色模式

>
> 本指南旨在帮助你在 Firefox、Chrome、Chromium 和 Edge 等流行的网页浏览器中启用深色模式。
>
>
>

我们都喜欢深色模式。与标准浅色模式相比，许多人更喜欢它。许多桌面应用原生提供深色模式，而一些应用则是通过桌面环境的底层模式适应深色模式。

不可否认，我们都在网页浏览器上花费了很多时间。我们很少使用桌面应用（除非你从事专门的工作，例如视频编辑等）。因此，当你花费大量时间在浏览器中阅读和学习时，你始终可以选择深色模式。不过，对于网页浏览器，启用深色模式的方法略有不同。

本指南为你提供了在 Firefox、Chromium、Chrome 和 Edge 浏览器中启用深色模式的简单步骤。

### 在网页浏览器中启用深色模式

#### 在 Firefox 中启用深色模式

打开 Firefox 并点击右上角的菜单。

单击 “<ruby> 设置 <rt>  Settings </rt></ruby> > <ruby> 扩展和主题 <rt>  Extension and Themes </rt></ruby>”。

选择 “<ruby> 深色主题 <rt>  Dark Theme </rt></ruby>” 并点击 “<ruby> 启用 <rt>  enable </rt></ruby>”。你应该会看到深色模式已应用于 Firefox。

*在 Firefox 浏览器中启用深色模式*

*深色模式下的 Firefox*

要将其还原，请按照相同的步骤并选择浅色主题。

#### Chromium 和 Chrome 中的深色模式

默认情况下，Chromium 或 Chrome 不会预安装任何深色主题。因此，你需要前往 Chrome 应用商店并下载你想要的深色主题。对于本指南，我会推荐超过一百万用户使用的 “Morpheon Dark” 主题。

从 Chromium 浏览器打开 Morpheon Dark 主题页面（以下链接）。

>
> **[Chrome 应用商店中的 Morpheon Dark 主题](https://chrome.google.com/webstore/detail/morpheon-dark/mafbdhjdkjnoafhfelkjpchpaepjknad?hl=en-GB)**
>
>
>

点击 “<ruby> 添加到 Chrome <rt>  Add To Chrome </rt></ruby>” 按钮。它应该会在 Chrome 中启用。

你可能想探索 Chrome 应用店中提供的其他深色或浅色主题。 [访问此页面获取所有深色主题的集合](https://chrome.google.com/webstore/category/collection/dark_themes)。

但是，你应该要记住的一件事是：此主题不会更改设置或上下文菜单，这是显而易见的。因为它只是改变了浏览器窗口，而这些菜单（有时）是操作系统本身的一部分。

*Chromium 深色主题*

对 Chrome 浏览器也遵循相同的步骤。

#### Edge 浏览器 – 深色模式

但是，[Edge 浏览器](https://www.debugpoint.com/2020/10/how-to-install-edge-ubuntu-linux/) 默认带有更好的深色主题。它允许你从设置中使用 GTK+、浅色和深色模式。

打开 Edge 浏览器，点击右上角的三个小点。

转到 “<ruby> 外观 <rt>  Appearance </rt></ruby>” 并选择 “<ruby> 深色 <rt>  Dark </rt></ruby>”。这样应该就好了。

Edge 的这种深色主题实现更好，因为它改变了上下文菜单和地址栏。

*深色主题的 Edge*

### 总结

如果你是高级用户，你可能不需要本指南。你可以自己弄清楚。

但我们为所有读者涵盖了所有基础到高级教程。许多新的 Linux 用户可能不知道如何在浏览器中启用深色模式。

所以，就是说，我希望这对你和其他人有帮助。如果你遇到任何问题，请在下面的评论框中告诉我。

---

via: <https://www.debugpoint.com/dark-mode-browser/>

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

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


我们如何建立一个开源的设计系统来创造新的社区徽标

# 我们如何建立一个开源的设计系统来创造新的社区徽标

>
> 了解 Ansible 的新徽标是如何根据相关人员的意见开发的，以确保整个项目的品牌一致性。
>
>
>

作为红帽的用户体验（UX）设计和 Ansible 产品团队的交互设计师，我们花了大约 6 个月的时间为 Ansible 社区设计了一系列徽标。这件事其实在更早的时候就开始了，当时一位项目经理要求我们为一个幻灯片提供一个 “快速而简单” 的徽标。在收集了一些需求后，我们在几天内就向相关人员展示了一个徽标，而且没有经过太多调整。几个月后，另一个相关人员说他们也需要类似的徽标，所以我们重复了这个过程。

于是，我们注意到一个模式：像这样的徽标资源不仅仅代表个人的要求，而是整个 Ansible 项目的共同需要。在完成了几个徽标要求后，我们有了一系列临时的设计，但在没有意识到品牌和设计惯例的情况下，这可能给整个 Ansible 的品牌视觉造成了不一致。随着这个徽标系列的增加，我们认识到了这个迫在眉睫的问题，并需要解决它。

我们的解决方案是创建一个 Ansible 设计系统，这是一个针对品牌的资源，可以指导未来一致的徽标设计。

### 什么是设计系统？

设计系统是一个可重复使用的资源和指导方法的集合，有助于告知任何数字产品套件的视觉语言。设计系统创造了一些模式，将独立的产品整合在一起，并通过可扩展性和一致性提升品牌。

特别是在一个有多种产品的大公司里，如果没有标准化，扩展起来就不容易，因为不同的团队对每个产品都有贡献。设计系统可以作为每个团队建立新资产的基线。有了标准化的外观和感觉，产品在整个组合中被统一为一个家族。

### 从头构建一个设计系统

在收到相关人员提出的为 Ansible 开源社区（如 Ansible Builder、Ansible Runner 和Project Receptor）创建徽标的一系列要求后，我们决定为我们的工作流程设计一个结构，并创建一个单一的事实来源，为之努力。

首先，我们对现有的徽标进行了视觉审计，以确定我们要做的是什么。Ansible 的原始徽标系列由四个主要图像组成：代表 AWX 的 Angry Spud，代表 Ansible 核心/引擎的 Ansibull，以及代表 AWX 的带翅膀的显示器。大部分的徽标都是用一致的红色阴影和公牛的形象联系在一起的，但是笔画的宽度、笔画的颜色、线条的质量和排版复杂而多样。

Angry Spud 使用棕褐色的轮廓和手绘风格，而 Ansibull 则是一个对称的几何矢量图。AWX 显示器是一个异类，它有细线画的翅膀，蓝色的矢量矩形，以及古英语字体（这里没有包括在内，但与家族中其他使用现代无衬线的字体相比，它是一个例外）。

### 确立新的设计标准

考虑到调色板、排版和图像，我们产生了一个一致的构图，以 Ansibull 代表所有核心的 Ansible 产品，以及大胆的线条和充满活力的颜色。

新的 Ansible 社区徽标设计风格指南详细说明了 Ansible 产品徽标的调色、排版、尺寸、间距和徽标变化。

新的风格指南展示了一种全新的、现代的定制字体，该字体基于瑞士独立字体厂商 [Grilli Type](https://www.grillitype.com/) 的 GT America 字体。我们为该字体创造了一个柔和的外观，通过圆润每个字母某些角落来配合图像的圆润度。

我们决定通过在光谱中加入更多的颜色并以原色为基础，设计一个更生动、更饱和、更普遍的调色板。新的调色板以浅蓝色、黄色和粉红色为主色调，每种颜色都有较浅的高光和较深的阴影。这种更广泛的颜色范围使系统内有更多的灵活性，并引入了 3D 的外观和感觉。

我们还引入了新的图像，如 Receptor 和 AWX 徽标中的六边形，以保持视觉上的连续性。最后，我们确保每个徽标在浅色和深色背景上都能使用，以获得最大的灵活性。

### 拓展设计组合

一旦我们建立了核心徽标系列，我们就开始为 Ansible 服务创建徽章，如 Ansible Demo 和 Ansible Workshop。为了将服务与产品区分开来，我们决定将服务图形包围在一个圆圈中，圆圈中包含了相同的定制排版的服务名称。新的服务徽章显示了幼儿版的 Ansibull（来自 Ansible Builder 的徽标）正在完成与每个服务相关的任务，例如 Ansible Demo 指向白板，Ansible Workshop 则使用构建工具。

### 利用开放源码进行设计决策

最初的 AWX 徽标受到了摇滚乐图像的影响，如翅膀和重金属字体（此处省略）。

(Fiona Lin and Taufique Rahman, [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/))

Ansible 社区的一些成员，包括红帽多样性和包容性小组，提请我们注意，这些元素类似于仇恨团体使用的图像。

考虑到原徽标的社会影响，我们必须迅速与 Ansible 社区合作，设计一个替代徽标。我们没有像最初的徽标那样闭门造车，而是扩大了项目的范围，仔细考虑了更多的相关人员，包括 Ansible 社区、红帽多样性和包容性小组，以及红帽法律团队。

我们开始了头脑风暴，向 Ansible 开源社区征求意见。Ansible 的一位工程师 Rebeccah Hunter 在草图绘制阶段做出了贡献，后来成为我们设计团队中的一员。让一大群相关人员参与进来的挑战之一是，我们对新的徽标概念有了各种各样的想法，比如一条辅助电缆、一碗拉面等等。

我们勾画了五个社区贡献的徽标创意，每个徽标都有不同的品牌视觉：一个芽、一个火箭、一个显示器、一碗拉面和一个辅助电缆。

在完成这些初步的概念草图后，我们建立了一个虚拟的投票机制，并在整个迭代过程中使用。这个投票系统使我们能够利用社区的反馈，从五个初始概念缩小到三个：火箭、一碗拉面和显示器。我们在这三个方向上进一步迭代，并通过专门的 Slack 频道进行反馈，直到我们找到一个符合社区愿景的方向，即 AWX 显示器。

以社区的意见为指导，我们围绕显示器为 AWX 打造了徽标概念。我们保留了原徽标中的显示器元素，同时使其外观和感觉现代化，以配合我们更新的设计系统。我们使用了更鲜艳的色调，更简洁的无衬线字体，以及来自 Project Receptor 徽标的元素，包括六角形图案。

通过从一开始就与我们的社区接触，我们能够在公开场合进行设计和迭代，所有相关人员都有一种包容感。最后，我们认为这是取代一个有争议的徽标的最好方法。最终的版本被移交给了红帽法律团队，在获得批准后，我们用这个新的徽标替换了所有的现有资产。

### 主要收获

为设计系统创建一套规则和资源，使你的数字产品全面保持一致，消除品牌混乱，并实现可扩展性。

当你探索在自己的社区建立一个设计系统时，你可能会从我们在这条路上学到的这些关键经验中受益：

* 用设计系统来扩展新的徽标，比没有设计系统要容易得多。
* 当你使用投票系统来验证结果时，杂乱无章的设计方案就会变得不那么令人生畏。
* 将大量受众的注意力引向三套方案，可以消除决策疲劳，集中社区反馈。

我们希望这篇文章能够提供用于开源社区的设计系统的启示，并帮助你认识到在早期开发一个系统的好处。如果你正在创建一个新的设计系统，你有什么问题？如果你已经创建了一个，你学到了什么教训？请在评论中分享你的想法。

*（图像来自：Fiona Lin and Taufique Rahman, [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)）*

---

via: <https://opensource.com/article/21/4/ansible-community-logos>

作者：[Fiona Lin](https://opensource.com/users/fionalin) 选题：[lujun9972](https://github.com/lujun9972) 译者：[MareDevi](https://github.com/MareDEvi) 校对：[wxy](https://github.com/wxy)

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


前瞻：Xfce 4.18 主要新功能

Summary: 有关 Xfce 4.18 的核心和原生应用程序的功能的全面介绍。

我以为各种各大系统和桌面的圆角的设计已经够丑了，看了这些图才发现还有更丑的设计（也可能这些软件没做过设计？）。

小厂子哪来的设计，视觉设计非常耗时耗力(参考方正设计的100美元1个的微软雅黑字体），程序员修bug又没空，只能摆烂了

你的审美观有问题才觉得丑

来自广东广州的 Chrome Mobile 79.0|Android 7.0 用户

这用的gtk3的默认主题是真的丑，gtk4就顺眼多了

有关 Xfce 4.18 的核心和原生应用程序的功能的全面介绍。

# 前瞻：Xfce 4.18 主要新功能

>
> 有关 Xfce 4.18 的核心和原生应用程序的功能的全面介绍。
>
>
>

经过近两年的开发，Xfce 4.18 将在 2022 年圣诞节期间发布。作为 [Xfce 4.16](https://www.debugpoint.com/xfce-4-16-review/) 以来的重要的版本，其一直在开发标签 4.17 下进行开发，以增强这个轻量级桌面。

考虑到 GTK4 的更新、初步的 Wayland 支持，以及核心和本地应用程序的改进，Xfce 4.18 是一个重要的里程碑版本，其带来了大量更新。

从发布时间来看，第一个 Xfce 4.18 预发布版（pre1）已经发布。2022 年 12 月的第一周会有另一个预发布版。而 Xfce 4.18 的最终版本预计将在 2022 年 12 月 15 日至 12 月 29 日之间发布。

由于目前还没有官方的详细介绍，我在这篇文章中总结了 Xfce 4.18 的基本和主要功能。

请继续阅读。

### Xfce 4.18 的新功能

#### 1、核心库更新

Xfce 4.18 的依赖关系有所改变，并使用以下版本进行编译：

* glib-2.0 >= 2.66
* gtk >= 3.24
* libcairo >= 1.16
* gdk-pixbuf-2.0 >= 2.40
* gobject-introspection >= 1.66

#### 2、桌面和面板

顶部的主面板带来了新的设置和调整。但整体外观仍与以前的 4.16 版本中的一样。一些默认的面板小程序在这个版本中也有变化。桌面图标、右键上下文菜单和项目保持不变。

面板的首选项设置有两个新的选项。首先，面板的长度现在以**像素**设置，而不是百分比。其次，一个新的选项，“<ruby> 保持面板在窗口上方 <rt>  Keep panel above windows </rt></ruby>” ，可以让你将窗口对话放到面板后面。之前，应用程序的窗口只能达到面板的边缘。

彻底修改了时钟小程序的设置。是的，你终于可以改变 Xfce 时钟小程序的字体风格。与此同时，它提供了四种时钟布局：

* 只有日期
* 只有时间
* 日期和时间
* 时间和日期

此外，你还可以向日历中添加命令。

#### 3、Thunar 文件管理器

也许这个版本中最令人兴奋的变化是 Thunar 文件管理器的功能。首先，一个新的“搜索”图标取代了工具栏上的“重新加载”按钮。当点击时，它会在地址栏上出现搜索，可以使用你的搜索关键词进行递归搜索。重新加载按钮被放到了 “<ruby> 查看 <rt>  View </rt></ruby>” 菜单中。

其次，在左边的导航栏上增加了一个的新项目，“<ruby> 最近 <rt>  Recent </rt></ruby>”。在底部，元数据更有条理（从逗号分隔改为竖线分隔），还有一个新的上下文菜单项可以选择你想要显示的元数据。

Thunar 的主菜单有很多变化。下面列出了主要的变化。在下面的图片中还标注了自 4.16 以来的变化。

* 引入了一个**新的书签菜单**，可以将当前文件夹作为快捷方式添加到侧边栏。
* “<ruby> 编辑 <rt>  Edit </rt></ruby>”菜单有了 “<ruby> 撤销 <rt>  undo </rt></ruby>” 和 “<ruby> 重做 <rt>  redo </rt></ruby>” 选项。
* “<ruby> 前往 <rt>  Go </rt></ruby>” 菜单有了 “<ruby> 最近 <rt>  Recent </rt></ruby>” 和 “<ruby> 搜索 <rt>  Search </rt></ruby>” 的选项。

Thunar 首次通过 “<ruby> 视图 <rt>  View </rt></ruby>”菜单项有了“<ruby> 分割视图 <rt>  Split view </rt></ruby>”！ 是的，你现在可以在视图面板中拖放项目。

前不久，我 [报道](https://debugpointnews.com/thunar-image-preview/) 说图像预览即将在 Thunar 中出现。而它终于来了。作为谷歌代码之夏 2022 的部分开发成果，你现在可以嵌入在侧边栏中看到图片预览。或者在右边的一个独立的新面板上查看。它可以通过偏好设置来改变。

下面是它的外观。

#### 4、Thunar 的首选项

Thunar 设置中出现了大量调整。首先，一个新的选项卡可以为 Thunar 定制你的键盘快捷键。你可以直接指定新的快捷键组合，并从这个选项卡中改变现有的快捷键组合。

“<ruby> 显示 <rt>  Display </rt></ruby>” 设置中新增了一个缩略图部分，你现在可以指定缩略图的文件大小。缩略图的具体设置也被归为一组。

“<ruby> 侧面板 <rt>  Side Pane </rt></ruby>” 选项卡有了一个新的图像预览选项，你在上面看到过。你可以设置为嵌入式或独立式预览。此外，“<ruby> 行为 <rt>  Behaviour </rt></ruby>” 选项卡增加了 “<ruby> 启动时恢复选项卡 <rt>  restore tabs on startup </rt></ruby>” 和在选项卡标题中显示 “<ruby> 完整的目录路径 <rt>  full directory path </rt></ruby>” 的选项，这将有很大帮助。

“<ruby> 高级 <rt>  Advanced </rt></ruby>” 选项卡为 “<ruby> 文件传输 <rt>  File Transfer </rt></ruby>” 提供了一个新的设置部分，有两个新的选项：“<ruby> 中间文件复制 <rt>  Intermediate file copy </rt></ruby>”和“<ruby> 验证校验和 <rt>  Verify checksum </rt></ruby>”。此外，在这个选项卡中还增加了一个新的递归搜索的选项。你还可以通过以下选项将 Thunar 设置为直接 “<ruby> 执行 Shell 脚本 <rt>  Execute Shell script </rt></ruby>”。

除了上述变化外，文件夹属性对话框现在可以显示文件和文件夹的数量。另外，一个新的高亮选项使你能够为你的文件夹图标背景和前景选择任何自定义颜色。如果你有一个复杂的文件夹结构，这将使你能够快速导航。

下面是它的外观。

#### 设置

“<ruby> 外观 <rt>  Appearances </rt></ruby>” 设置现在允许你打开和关闭对话框的标题栏。

“<ruby> 桌面 <rt>  Desktop </rt></ruby>” 设置允许文件上下文菜单中的删除选项（打开或关闭）。

“<ruby> 显示 <rt>  Display </rt></ruby>” 设置现在允许你为多种显示情况设置默认值：镜像、扩展显示还是什么都不做。早些时候，这些选项在显示器被连接时才可用。

#### Wayland 和其他更新

除了上述 Xfce 4.18 的功能外，窗口管理器和桌面还有许多额外的错误修复和性能改进。这些都是在底层的，你应该能感受到一个更精良的 Xfce 桌面体验。

Xfce 桌面核心和原生应用程序的 Wayland 迁移工作开始了。离它完全准备好还有很长的路要走。在这个版本中，你可能不会看到很多 Wayland 的更新。然而，许多应用程序在 Wayland 下已经可以正常工作了。你可以在 [本页](https://wiki.xfce.org/releng/wayland_roadmap) 了解更多关于迁移状态的信息。

### 下载及什么时候出现在发行版

Xfce 4.18 应该会在 2023 年 4 月进入 Ubuntu 23.04 Lunar Lobster，并在 Fedora 38 中出现。基于滚动发布的发行版，如 Arch Linux、Manjaro 和 OpenSUSE Tumbleweed 应该会在 2022 年 12 月发布后的几天内得到它。轻量级的流行发行版 [MX Linux](https://www.debugpoint.com/tag/mx-linux) 应该在 2023 年采用这个版本，这个时候也是 Debian Bookworm 更新的时候。

Xfce 4.18 的第一个预发布版本 [现已发布](https://www.reddit.com/r/xfce/comments/yjiwwv/announce_xfce_418pre1_released/)。你可以从下面的页面下载源码压缩包，并编译它们。请参考官方的 [编译指南](https://docs.xfce.org/xfce/building)。

>
> **[下载 Xfce 4.18 源代码（pre1）](https://archive.xfce.org/xfce/4.18pre1/fat_tarballs)**
>
>
>

### 总结

总的来说，变化的数量巨大。许多核心变化和需要的变化都进入了这个版本。Thunar 文件管理器的更新是早该进行的，对于 Xfce 的爱好者来说应该是完美的。

随着 Wayland 的支持，未来的 Xfce 版本可能会带来一个可行的 Xfce 版本。Wayland 的支持仍在进行中，每个组件都有许多决定有待作出。许多发行版和关键部署仍然喜欢 Xfce 而不是 KDE Plasma 或 GNOME。考虑到这些用例和未来的路线图，Xfce 4.18 是下一个版本之前的一个重要的里程碑。

列表中你最喜欢的功能是什么？请在评论栏里告诉我。

---

via: <https://www.debugpoint.com/xfce-4-18-features/>

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

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


硬核观察 #814 美国没收窃取自丝绸之路的 33.6 亿美元比特币

Summary: • 美国没收窃取自丝绸之路的 33.6 亿美元比特币 • 被下载了数千次的偷取密码的 Python 软件包 • 微软在 Windows 11 的注销菜单中显示广告

Microsoft: I study from Chine's

不应该是Ubuntu吗？中国对不起你吗？你为什么要抹黑自己的国家？难道你不是中国人吗？谈产品就谈产品不要上升到国家层面。你啥也不是。

咱也不必先入为主认为这是国人自黑。用法语表达的中国，结合IP地址估计也有可能是法国的开源同道。

但凡你有点文化也不至于乱喷，最早是谁？乐视？小米ADUI？Ubuntu弟弟都不配，你是不是墙久了?

# 硬核观察 #814 美国没收窃取自丝绸之路的 33.6 亿美元比特币

### 美国没收窃取自丝绸之路的 33.6 亿美元比特币

现年 32 岁的 James Zhong 在 2012 年利用快存快取的方式从丝绸之路非法获取了 5 万枚比特币。他窃取的比特币当时只值 65 万美元，现在价值已超过 33 亿美元。去年 11 月，美国执法部门搜查了他的住处，查获了约 5 万枚比特币。这次扣押是当时美国司法部历史上最大的加密货币扣押。周一美国司法部宣布，James Zhong 已承认电信欺诈。

>
> **[消息来源：Slashdot](https://yro.slashdot.org/story/22/11/07/1447244/us-attorney-announces-336-billion-crypto-seizure-and-conviction-in-connection-with-silk-road-dark-web-fraud)**
>
>
>

>
> 老王点评：螳螂捕蝉黄雀在后。
>
>
>

### 被下载了数千次的偷取密码的 Python 软件包

安全研究专家在 PyPi 上发现了 30 多个恶意 Python 软件包，试图安装 W4SP，这是一个可以从浏览器会话中偷取密码和 Cookie 的脚本。这些恶意软件包的名字听起来很普通，比如 typeutil、colorwin 等等。攻击者通常会复制一个现有的软件包，并稍作修改，以使用户错误输入时无意中安装了恶意软件。

>
> **[消息来源：Dev Class](https://devclass.com/2022/11/03/phylum-report-password-stealing-pypi-packages-discovered-downloaded-over-5700-times/)**
>
>
>

>
> 老王点评：虽然 PyPi 已经做了一些工作，但是显然还是为恶意行为留下了广阔空间。
>
>
>

### 微软在 Windows 11 的注销菜单中显示广告

根据用户反馈的截图，微软在 Windows 11 的注销菜单中宣传其 OneDrive 文件托管服务，并提示用户创建或完成他们的微软账户。不过，看起来这可能只是针对特定群体的 A/B 测试。微软以前也在文件资源管理器、开始菜单等处发布过各种广告。

>
> **[消息来源：Bleeping Computer](https://www.bleepingcomputer.com/news/microsoft/microsoft-is-showing-ads-in-the-windows-11-sign-out-menu/)**
>
>
>

>
> 老王点评：不管是微软还是 Canonical，似乎都把用户安装的操作系统当成了自家的广告牌。问题是，这是谁赋予的权利？
>
>
>


如何在 Ubuntu 等 Linux 中安装 Python 3.11

# 如何在 Ubuntu 等 Linux 中安装 Python 3.11

>
> 打算为你的项目开发工作安装 Python 3.11？下面是如何在 Ubuntu 等发行版中安装 Python 3.11 的方法。
>
>
>

Python 3.11 于 2022 年 10 月 25 日发布，并声称比之前的 [Python 3.10](https://www.debugpoint.com/install-python-3-10-ubuntu/) 版本快 10% - 60%。

一如既往，3.11 中的功能和改进列表明显较多。下面是一个简介：

* 错误回溯更明确，可以指出导致错误的确切语句。
* 引入异常组和新的 except\* 语法。
* 你可以在基础表达式中添加自定义文本，以便在你的代码中更好地处理错误。
* 引入 Variadic 泛型，允许在 Python 数值库（如 NumPy）中使用类似数组的结构。
* 字典类型 TypedDict 得到了改进，现在你可以指定个别字典项目是必须的还是可选的。
* 引入了 Self 注解，允许类返回它们自己的类型实例。

还有很多，你可以在官方的 [3.11 亮点页面](https://docs.python.org/3.11/whatsnew/3.11.html) 上详细了解。

### Linux 发行版中的当前 Python 版本

[Ubuntu 22.04 LTS](https://www.debugpoint.com/ubuntu-22-04-review/) 带有 Python 3.10，而最近发布的 [Ubuntu 22.10 Kinetic Kudu](https://www.debugpoint.com/ubuntu-22-10/) 也是同样的版本。然而， Kinetick Kudu 可能会在几周内采用 3.11。

另外，[Fedora 37](https://www.debugpoint.com/fedora-37/) 已经有了 Python 3.11 RC2，并将提供该版本。

所以，如果你正在运行 Ubuntu 22.04 LTS、[Linux Mint 21](https://www.debugpoint.com/linux-mint-21-review/) 或任何基于 Ubuntu-LTS 的发行版，这里是你如何通过 PPA 安装 Python 3.11 的方法。

**注意**：谨慎地使用这个方法。确保你知道你在做什么，因为替换 Linux 发行版的基础 Python 版本可能会导致系统不稳定。许多默认的应用程序和软件包都依赖于 3.10 版本。

### 如何在 Ubuntu 和相关发行版中安装 Python 3.11

打开终端提示，添加以下 PPA：

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

```

使用下面的命令刷新缓存：

```
sudo apt update

```

并使用下面的命令安装 Python 3.11：

```
sudo apt install python3.11

```

### 设置默认的 Python 版本

理论上，你可以在 Linux 发行版中安装多个版本的 Python，但只能默认一个版本。将 Python 3.11 设置为默认版本需要一些额外的步骤。请跟我做。

然而，在这之前，请确保你知道哪些应用程序依赖于 Python 3.10。你可以使用 `apt-cache rdepends` 命令轻松地找到它，如下所示：

```
debugpoint@debugpoint-22-04:~$ apt-cache rdepends python3.10
python3.10
Reverse Depends:
python3.10-dbg
python3.10-venv
python3.10-full
libpython3.10-testsuite
idle-python3.10
idle-python3.10
python3.10-minimal
python3.10-doc
python3.10-dev
python3
[截断]
python3
python3-uno
python3-all
gedit

```

#### 使用 Python 3.11 作为默认的 Python3

首先，从终端使用以下命令检查当前的默认版本：

```
python3 --version

```

使用 `update-alternatives` 来创建 `python3` 的符号链接：

```
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1

```

```
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.11 2

```

并通过命令选择哪一个作为 Python3 使用：

```
sudo update-alternatives --config python3

```

现在你可以开始在你当前的 Ubuntu 版本中使用最新的 Python 来进行工作/学习了。你可以使用上述命令切换到库存版本，并随时改变版本。

如果你使用上述安装方法切换到 3.11，那么请确保你检查所有必要的应用程序，看它们是否工作正常。

最后，如果你遇到问题，请在评论区告诉我。

---

via: <https://www.debugpoint.com/install-python-3-11-ubuntu/>

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

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


为你的 awk 脚本注入 Groovy

Summary: awk 和 Groovy 相辅相成，可以创建强大、有用的脚本。

awk 和 Groovy 相辅相成，可以创建强大、有用的脚本。

# 为你的 awk 脚本注入 Groovy

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

>
> awk 和 Groovy 相辅相成，可以创建强大、有用的脚本。
>
>
>

最近我写了一个使用 Groovy 脚本来清理我的音乐文件中的标签的系列。我开发了一个 [框架](https://opensource.com/article/22/8/music-tagging-framework-groovy)，可以识别我的音乐目录的结构，并使用它来遍历音乐文件。在该系列的最后一篇文章中，我从框架中分离出一个实用类，我的脚本可以用它来处理文件。

这个独立的框架让我想起了很多 awk 的工作方式。对于那些不熟悉 awk 的人来说，你学习下这本电子书：

>
> **[《awk 实用指南》](https://opensource.com/downloads/awk-ebook)**
>
>
>

我从 1984 年开始大量使用 awk，当时我们的小公司买了第一台“真正的”计算机，它运行的是 System V Unix。对我来说，awk 是非常完美的：它有<ruby> 关联内存 <rt>  associative memory </rt></ruby>——将数组视为由字符串而不是数字来索引的。它内置了正则表达式，似乎专为处理数据而生，尤其是在处理数据列时，而且结构紧凑，易于学习。最后，它非常适合在 Unix 工作流使用，从标准输入或文件中读取数据并写入到输出，数据不需要经过其他的转换就出现在了输入流中。

说 awk 是我日常计算工具箱中的一个重要部分一点也不为过。然而，在我使用 awk 的过程中，有几件事让我感到不满意。

可能主要的问题是 awk 善于处理以分隔字段呈现的数据，但很奇怪它不善于处理 CSV 文件，因为 CSV 文件的字段被引号包围时可以嵌入逗号分隔符。另外，自 awk 发明以来，正则表达式已经有了很大的发展，我们需要记住两套正则表达式的语法规则，而这并不利于编写无 bug 的代码。[一套这样的规则已经很糟糕了](http://regex.info/blog/2006-09-15/247)。

由于 awk 是一门简洁的语言，因此它缺少很多我认为有用的东西，比如更丰富的基础类型、结构体、`switch` 语句等等。

相比之下，Groovy 拥有这些能力：可以使用 [OpenCSV 库](http://opencsv.sourceforge.net/)，它很擅长处理 CSV 文件、Java 正则表达式和强大的匹配运算符、丰富的基础类型、类、`switch` 语句等等。

Groovy 所缺乏的是简单的面向管道的概念，即把要处理数据作为一个传入的流，以及把处理过的数据作为一个传出的流。

但我的音乐目录处理框架让我想到，也许我可以创建一个 Groovy 版本的 awk “引擎”。这就是我写这篇文章的目的。

### 安装 Java 和 Groovy

Groovy 是基于 Java 的，需要先安装 Java。最新的、合适的 Java 和 Groovy 版本可能都在你的 Linux 发行版的软件库中。Groovy 也可以按照 [Groovy 主页](https://groovy.apache.org/download.html) 上的说明进行安装。对于 Linux 用户来说，一个不错的选择是 [SDKMan](https://opensource.com/article/22/3/manage-java-versions-sdkman)，它可以用来获得多个版本的 Java、Groovy 和其他许多相关工具。在这篇文章中，我使用的是 SDK 的版本：

* Java：OpenJDK 11 的 11.0.12 的开源版本
* Groovy：3.0.8

### 使用 Groovy 创建 awk

这里的基本想法是将打开一个或多个文件进行处理、将每行分割成字段、以及提供对数据流的访问等复杂情况封装在三个部分：

* 在处理数据之前
* 在处理每行数据时
* 在处理完所有数据之后

我并不打算用 Groovy 来取代 awk。相反，我只是在努力实现我的典型用例，那就是：

* 使用一个脚本文件而不是在命令行写代码
* 处理一个或多个输入文件
* 设置默认的分隔符为 `|`，并基于这个分隔符分割所有行
* 使用 OpenCSV 完成分割工作（awk 做不到）

### 框架类

下面是用 Groovy 类实现的 “awk 引擎”：

```
@Grab('com.opencsv:opencsv:5.6')
import com.opencsv.CSVReader
public class AwkEngine {
    // With admiration and respect for
    //     Alfred Aho
    //     Peter Weinberger
    //     Brian Kernighan
    // Thank you for the enormous value
    // brought my job by the awk
    // programming language
    Closure onBegin
    Closure onEachLine
    Closure onEnd
    private String fieldSeparator
    private boolean isFirstLineHeader
    private ArrayList<String> fileNameList
    public AwkEngine(args) {
        this.fileNameList = args
        this.fieldSeparator = "|"
        this.isFirstLineHeader = false
    }
    public AwkEngine(args, fieldSeparator) {
        this.fileNameList = args
        this.fieldSeparator = fieldSeparator
        this.isFirstLineHeader = false
    }
    public AwkEngine(args, fieldSeparator, isFirstLineHeader) {
        this.fileNameList = args
        this.fieldSeparator = fieldSeparator
        this.isFirstLineHeader = isFirstLineHeader
    }
    public void go() {
        this.onBegin()
        int recordNumber = 0
        fileNameList.each { fileName ->
            int fileRecordNumber = 0
            new File(fileName).withReader { reader ->
                def csvReader = new CSVReader(reader,
                    this.fieldSeparator.charAt(0))
                if (isFirstLineHeader) {
                    def csvFieldNames = csvReader.readNext() as
                        ArrayList<String>
                    csvReader.each { fieldsByNumber ->
                        def fieldsByName = csvFieldNames.
                            withIndex().
                            collectEntries { name, index ->
                                [name, fieldsByNumber[index]]
                            }
                        this.onEachLine(fieldsByName,
                                recordNumber, fileName,
                                fileRecordNumber)
                        recordNumber++
                        fileRecordNumber++
                    }
                } else {
                    csvReader.each { fieldsByNumber ->
                        this.onEachLine(fieldsByNumber,
                            recordNumber, fileName,
                            fileRecordNumber)
                        recordNumber++
                        fileRecordNumber++
                    }
                }
            }
        }
        this.onEnd()
    }
}
```

虽然这看起来是相当多的代码，但许多行是因为太长换行了（例如，通常你会合并第 38 行和第 39 行，第 41 行和第 42 行，等等）。让我们逐行看一下。

第 1 行使用 `@Grab` 注解从 [Maven Central](https://mvnrepository.com/artifact/com.opencsv/opencsv) 获取 OpenCSV 库的 5.6 本周。不需要 XML。

第 2 行我引入了 OpenCSV 的 `CSVReader` 类

第 3 行，像 Java 一样，我声明了一个 `public` 实用类 `AwkEngine`。

第 11-13 行定义了脚本所使用的 Groovy 闭包实例，作为该类的钩子。像任何 Groovy 类一样，它们“默认是 `public`”，但 Groovy 将这些字段创建为 `private`，并对其进行外部引用（使用 Groovy 提供的 getter 和 setter 方法）。我将在下面的示例脚本中进一步解释这个问题。

第 14-16 行声明了 `private` 字段 —— 字段分隔符，一个指示文件第一行是否为标题的标志，以及一个文件名的列表。

第 17-31 行定义了三个构造函数。第一个接收命令行参数。第二个接收字段的分隔符。第三个接收指示第一行是否为标题的标志。

第 31-67 行定义了引擎本身，即 `go()` 方法。

第 33 行调用了 `onBegin()` 闭包（等同于 awk 的 `BEGIN {}` 语句）。

第 34 行初始化流的 `recordNumber`（等同于 awk 的 `NR` 变量）为 0（注意我这里是从 00 而不是 1 开始的）。

第 35-65 行使用 `each` `{}` 来循环处理列表中的文件。

第 36 行初始化文件的 `fileRecordNumber`（等同于 awk 的 `FNR` 变量）为 0（从 0 而不是 1 开始）。

第 37-64 行获取一个文件对应的 `Reader` 实例并处理它。

第 38-39 行获取一个 `CSVReader` 实例。

第 40 行检测第一行是否为标题。

如果第一行是标题，那么在 41-42 行会从第一行获取字段的标题名字列表。

第 43-54 行处理其他的行。

第 44-48 行把字段的值复制到 `name:value` 的映射中。

第 49-51 行调用 `onEachLine()` 闭包（等同于 awk 程序 `BEGIN {}` 和 `END {}` 之间的部分，不同的是，这里不能输入执行条件），传入的参数是 `name:value` 映射、处理过的总行数、文件名和该文件处理过的行数。

第 52-53 行是处理过的总行数和该文件处理过的行数的自增。

如果第一行不是标题：

第 56-62 行处理每一行。

第 57-59 调用 `onEachLine()` 闭包，传入的参数是字段值的数组、处理过的总行数、文件名和该文件处理过的行数。

第 60-61 行是处理过的总行数和该文件处理过的行数的自增。

第 66 行调用 `onEnd()` 闭包（等同于 awk 的 `END {}`）。

这就是该框架的内容。现在你可以编译它：

```
$ groovyc AwkEngine.groovy

```

一点注释：

如果传入的参数不是一个文件，编译就会失败，并出现标准的 Groovy 堆栈跟踪，看起来像这样：

```
Caught: java.io.FileNotFoundException: not-a-file (No such file or directory)
java.io.FileNotFoundException: not-a-file (No such file or directory)
at AwkEngine$_go_closure1.doCall(AwkEngine.groovy:46)

```

OpenCSV 可能会返回 `String[]` 值，不像 Groovy 中的 `List` 值那样方便（例如，数组没有 `each {}`）。第 41-42 行将标题字段值数组转换为 list，因此第 57 行的 `fieldsByNumber` 可能也应该转换为 list。

### 在脚本中使用这个框架

下面是一个使用 `AwkEngine` 来处理 `/etc/group` 之类由冒号分隔并没有标题的文件的简单脚本：

```
def ae = new AwkEngine(args, ':')
int lineCount = 0
ae.onBegin = {
    println “in begin”
}
ae.onEachLine = { fields, recordNumber, fileName, fileRecordNumber ->
    if (lineCount < 10)
        println “fileName $fileName fields $fields”
    lineCount++
}
ae.onEnd = {
    println “in end”
    println “$lineCount line(s) read”
}
ae.go()

```

第 1 行 调用的有两个参数的构造函数，传入了参数列表，并定义冒号为分隔符。

第 2 行定义一个脚本级的变量 `lineCount`，用来记录处理过的行数（注意，Groovy 闭包不要求定义在外部的变量为 `final`）。

第 3-5 行定义 `onBegin()` 闭包，在标准输出中打印出 “in begin” 字符串。

第 6-10 行定义 `onEachLine()` 闭包，打印文件名和前 10 行字段，无论是否为前 10 行，处理过的总行数 `lineCount` 都会自增。

第 11-14 行定义 `onEnd()` 闭包，打印 “in end” 字符串和处理过的总行数。

第 15 行运行脚本，使用 `AwkEngine`。

像下面一样运行一下脚本：

```
$ groovy Test1Awk.groovy /etc/group
in begin
fileName /etc/group fields [root, x, 0, ]
fileName /etc/group fields [daemon, x, 1, ]
fileName /etc/group fields [bin, x, 2, ]
fileName /etc/group fields [sys, x, 3, ]
fileName /etc/group fields [adm, x, 4, syslog,clh]
fileName /etc/group fields [tty, x, 5, ]
fileName /etc/group fields [disk, x, 6, ]
fileName /etc/group fields [lp, x, 7, ]
fileName /etc/group fields [mail, x, 8, ]
fileName /etc/group fields [news, x, 9, ]
in end
78 line(s) read
$

```

当然，编译框架类生成的 `.class` 文件需要在 classpath 中，这样才能正常运行。通常你可以用 `jar` 把这些 class 文件打包起来。

我非常喜欢 Groovy 对行为委托的支持，这在其他语言中需要各种诡异的手段。许多年来，Java 需要匿名类和相当多的额外代码。Lambda 已经在很大程度上解决了这个问题，但它们仍然不能引用其范围之外的非 final 变量。

下面是另一个更有趣的脚本，它很容易让人想起我对 awk 的典型使用方式：

```
def ae = new AwkEngine(args, ';', true)
ae.onBegin = {
    // nothing to do here
}
def regionCount = [:]
    ae.onEachLine = { fields, recordNumber, fileName, fileRecordNumber ->
        regionCount[fields.REGION] =
            (regionCount.containsKey(fields.REGION) ?
                regionCount[fields.REGION] : 0) +
            (fields.PERSONAS as Integer)
}
ae.onEnd = {
    regionCount.each { region, population ->
        println “Region $region population $population”
    }
}
ae.go()

```

第 1 行调用了三个函数的构造方法，`true` 表示这是“真正的 CSV” 文件，第一行为标题。由于它是西班牙语的文件，因此它的逗号表示数字的`点`，标准的分隔符是分号。

第 2-4 行定义 `onBegin()` 闭包，这里什么也不做。

第 5 行定义一个（空的）`LinkedHashmap`，键是 String 类型，值是 Integer 类型。数据文件来自于智利最近的人口普查，你要在这个脚本中计算出智利每个地区的人口数量。

第 6-11 行处理文件中的行（加上标题一共有 180,500 行）—— 请注意在这个案例中，由于你定义 第 1 行为 CSV 列的标题，因此 `fields` 参数会成为 `LinkedHashMap<String,String>` 实例。

第 7-10 行是 `regionCount` 映射计数增加，键是 `REGION` 字段的值，值是 `PERSONAS` 字段的值 —— 请注意，与 awk 不同，在 Groovy 中你不能在赋值操作的右边使用一个不存在的映射而期望得到空值或零值。

第 12-16 行，打印每个地区的人口数量。

第 17 行运行脚本，调用 `AwkEngine` 。

像下面一样运行一下脚本：

```
$ groovy Test2Awk.groovy ~/Downloads/Censo2017/ManzanaEntidad_CSV/Censo*csv
Region 1 population 330558
Region 2 population 607534
Region 3 population 286168
Region 4 population 757586
Region 5 population 1815902
Region 6 population 914555
Region 7 population 1044950
Region 8 population 1556805
Region 16 population 480609
Region 9 population 957224
Region 10 population 828708
Region 11 population 103158
Region 12 population 166533
Region 13 population 7112808
Region 14 population 384837
Region 15 population 226068
$

```

以上为全部内容。对于那些喜欢 awk 但又希望得到更多的东西的人，我希望你能喜欢这种 Groovy 的方法。

---

via: <https://opensource.com/article/22/9/awk-groovy>

作者：[Chris Hermansen](https://opensource.com/users/clhermansen) 选题：[lkxed](https://github.com/lkxed) 译者：[lxbwolf](https://github.com/lxbwolf) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #815 微软为 Linux 内核提供了套娃支持

Summary: • 微软为 Linux 内核提供了套娃支持 • 能打败顶尖的围棋 AI 却会输给业余选手 • Linux 内核中出现一个丑陋的“黑科技”

惊了，xz，xfs套件，二进制文件不都是x开头的吗

这提交者不会去修补X11吗，改内核做什么

等着你去修呢

来自江西南昌的 Chrome Mobile iOS 107.0|iOS 16.0 用户

属实是闭源细作渗透了

# 硬核观察 #815 微软为 Linux 内核提供了套娃支持

### 微软为 Linux 内核提供了套娃支持

微软提交了一个一百多行的补丁，使 Linux 内核可以在嵌套的微软虚拟化管理程序（MSHV）下运行，即可以在 Hyper-V 虚拟机中运行 Hyper-V 虚拟机。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Nested-MS-Hypervisor-Linux)**
>
>
>

>
> 老王点评：你真的需要在套娃运行 Linux 吗？你可以试试。
>
>
>

### 能打败顶尖的围棋 AI 却会输给业余选手

自从 AlphaGo 使用神经网络而通过自我对弈精通围棋后，人类就一败涂地了。研究人员创建了一个对抗性的围棋程序，使用一些超乎常规的下法训练，它在与业余棋手的对弈中败北，但是却可以打败一个顶尖的开源围棋 AI KataGo。KataGo 使用数百万次自我对弈学习围棋，但这仍然不足以覆盖所有可能的情况，留下了可利用的漏洞。研究显示，达到人类水平的 AI 往往会犯一些非常奇怪的错误，以让人类感到惊讶的方式失败。

>
> **[消息来源：Ars Technica](https://arstechnica.com/?p=1894833)**
>
>
>

>
> 老王点评：不按套路出牌，连 AI 都受不了。
>
>
>

### Linux 内核中出现一个丑陋的“黑科技”

安全研究人员在 Linux 主线内核中发现了一个已经存在三年的“黑科技”：Linux 内核会识别以 “X” 字母开始的进程，并返回“不支持原子模式设置”的错误。这个丑陋的“黑科技”是为了解决旧版本的 [X.Org](http://x.org/) 服务器中的一个错误。但由于没有人愿意再维护 X11，于是这个补丁的提交者觉得，与其修复有问题的代码，不如调整内核以绕开。但事实上这只是检查第一个字母是否是 “X”，扩大了打击面，因为不是所有以 “X” 开头的进程都是 [X.Org](http://x.org/) 的进程。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Linux-DRM-Process-Start-With-X)**
>
>
>

>
> 老王点评：这样丑陋的代码显然会被 Linus 破口大骂的，不知道怎么悄悄潜入到内核当中的。
>
>
>


使用 PSCP 将文件和文件夹从 Windows 传输到 Linux

直接Filezilla登录SSH，通过FTP on SSH传不好？

# 使用 PSCP 将文件和文件夹从 Windows 传输到 Linux

>
> 开源的 PSCP 程序可以轻松地在 Windows 和 Linux 计算机之间传输文件和文件夹。
>
>
>

你是否正在寻找一种将文件从 Windows 计算机快速传输到 Linux 计算机并再次传输回来的方法？开源的 PSCP 程序可以轻松传输文件和文件夹，当然它是开源的。

### 在 Windows 中设置 PATH

了解如何在 Windows 中设置命令路径可以更轻松地使用 PSCP 等方便的程序。如果你不熟悉该过程，请阅读 [如何在 Windows 上设置 PATH](https://opensource.com/article/22/10/set-path-powershell)。

### 使用 PSCP

PSCP（PuTTY 安全复制协议）是一个命令行工具，用于将文件和文件夹从 Windows 计算机传输到 Linux 计算机。

* 从 [网站](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html) 下载 `pscp.exe`。
* 将 `pscp.exe` 移动到 `PATH` 中的文件夹（例如，如果你按照 [Opensource.com](http://Opensource.com) 上的 PATH 教程进行操作，则为 `Desktop\App`）。如果你没有设置 `PATH` 变量，你也可以将 `pscp.exe` 移动到保存要传输的文件的文件夹中。
* 使用 Windows 任务栏中的搜索栏在 Windows 计算机上打开 Powershell（在搜索栏中输入 `powershell`。）
* 输入 `pscp -version` 以确认你的计算机可以找到该命令。

### IP 地址

在进行传输之前，你必须知道目标计算机的 IP 地址或完全限定域名。假设它是同一网络上的计算机，并且你没有运行 DNS 服务器来解析计算机名称，你可以在 Linux 机器上使用 `ip` 命令找到目标 IP 地址：

```
[linux]$ ip addr show |grep 'inet '
inet 127.0.0.1/8 scope host lo
inet 192.168.1.23/24 brd 10.0.1.255 scope global noprefixroute eth0

```

在所有情况下，127.0.0.1 都是计算机仅用于与自身通信的环回地址，因此在此示例中，正确的地址是 192.168.1.23。在你的系统上，IP 地址可能不同。如果你不确定哪个是哪个，你可以连续尝试每个，直到找到正确的（然后在某处写下来！）

或者，你可以查看路由器的设置，其中列出了通过 DHCP 分配的所有地址。

### 防火墙和服务器

`pscp` 命令使用 OpenSSH 协议，因此你的 Linux 计算机必须运行 OpenSSH 服务器软件，并且防火墙必须允许 SSH 流量。

如果你不确定你的 Linux 机器是否正在运行 SSH，请在 Linux 机器上运行以下命令：

```
[linux]$ sudo systemctl enable --now sshd

```

要确保你的防火墙允许 SSH 流量，请运行以下命令：

```
[linux]$ sudo firewall-cmd --add-servicessh --permanent

```

有关 Linux 上的防火墙的更多信息，请阅读 [使用防火墙使 Linux 更强大](https://opensource.com/article/19/7/make-linux-stronger-firewalls)。

### 传输文件

在这个例子中，我有一个名为 `pscp-test.txt` 的文件，我想将它从我的 Windows 计算机上的 `C:\Users\paul\Documents` 传输到我的目标 Linux 计算机主目录 `/home/paul`。

现在你已经有了 `pscp` 命令和目标地址，你可以传输测试文件 `pscp-test.txt`。打开 Powershell 并使用 `dir` 命令切换到示例文件所在的 `Documents` 文件夹：

```
PS> dir %USERPROFILE%\Documents\

```

现在执行传输：

```
PS> pscp pscp-test.txt paul@192.168.1.23:/home/paul
| Password:
End of keyboard-interactive prompts from server
pscp-test.txt | 0 kb | 0.0 kB/s | ETA: 00:00:00 | 100%

```

这是语法，逐字逐句来：

* `pscp`：用于传输文件的命令。
* `pscp-test.txt` 是你要从 Windows 传输的文件的名称。
* `paul@192.168.1.23` 是我在 Linux 计算机上的用户名，以及 Linux 计算机的 IP 地址。你必须将其替换为你自己的用户和目的地信息。请注意，`pscp` 需要目标计算机上的目标路径，而 IP 地址末尾的 `:/home/paul` 指定我希望将文件复制到我的主文件夹。

对 Linux 计算机进行身份验证后，`pscp-test.txt` 文件将传输到 Linux 计算机。

### 验证已传输

在你的 Linux 计算机上，打开终端并使用 `ls` 命令验证文件 `pscp-test.txt` 是否出现在你的主目录中。

```
[linux]$ ls
Documents
Downloads
Music
Pictures
pscp-test.txt

```

### 从 Linux 系统复制文件

你不仅限于将文件复制到 Linux 系统。使用 `pscp`，你还可以将文件从 Linux 复制到 Windows。语法是一样的，只是反过来：

```
PS> pscp paul@192.168.1.23:/home/paul/pscp-test.txt %USERPROFILE%\Documents\pscp-win.txt

```

这是语法：

* `pscp`：用于传输文件的命令。
* `paul@192.168.1.23:/home/paul/pscp-test.txt` 是我在 Linux 计算机上的用户名、Linux 计算机的 IP 地址，以及我要复制的文件的路径。
* `%USERPROFILE%\Documents` 是我的 Windows 计算机上我要保存文件的位置。 请注意，在将文件复制回我的 Windows 计算机时，我可以给它一个新名称，例如 `pscp-win.txt`，以区别于原始文件。 当然，你不必重命名文件，但对于本演示来说，它是一个有用的快捷方式。

打开文件管理器以验证 `pscp-win.txt` 文件是否已从 Linux 计算机复制到 Windows `C:\Users\paul\Documents` 下。

### 远程复制

借助开源 `pscp` 命令的强大功能，你可以访问家中的任何计算机、拥有帐户的服务器，甚至是移动设备和 [边缘设备](https://opensource.com/tags/edge-computing)。

---

via: <https://opensource.com/article/22/10/transfer-files-windows-linux-pscp>

作者：[Paul](https://opensource.com/users/plaubscher) 选题：[lkxed](https://github.com/lkxed) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


使用 Lua 解析配置文件

Summary: 使用 Lua 配置持久化应用设置。

使用 Lua 配置持久化应用设置。

# 使用 Lua 解析配置文件

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

>
> 使用 Lua 配置持久化应用设置。
>
>
>

不是所有的应用都需要配置文件；对很多应用来说，在启动时变得焕然一新对它们更有利。例如，简单的工具就极少需要偏好项和设置在使用过程中保持稳定不变。然而，当你编写一个复杂的应用程序时，如果能让用户设置与应用的交互方式，以及应用与系统交互的方式会很不错。这就是配置文件用来做的事情。本文将讨论一些利用 Lua 进行持久化配置的方法。

### 选择一种格式

关于配置文件很重要的两点是一致性和可预见性。你不会希望为了保存用户偏好项，将信息转储到文件中，然后再花几天去编码实现“逆向工程”，处理最后出现在文件里的随机信息。

这里用一些常用的 [配置文件格式](https://opensource.com/article/21/6/config-files-and-their-formats)。Lua 有一些库可以处理大多数常用的配置格式；在本文中，我会采用 INI 格式。

### 安装库

Lua 库的核心仓库是 [Luarocks.org](https://opensource.com/article/19/11/getting-started-luarocks)。你可以在这个网站搜索库，或者你可以安装并使用 `luarocks` 终端命令。

Linux 环境中，你可以从发行版的软件仓库中下载它，例如：

```
$ sudo dnf install luarocks

```

在 macOS 上，请使用 [MacPorts](https://opensource.com/article/20/11/macports) 或者 [Homebrew](https://opensource.com/article/20/6/homebrew-mac)。在 Windows 上，请使用 [Chocolatey](https://opensource.com/article/20/3/chocolatey)。

`luarocks` 安装后，你可以使用 `search` 子命令来搜索一个恰当的库。如果你不知道库的名字，可以通过关键词来搜索这个库，例如 `ini`、xml`或者`json`，这取决于你想要用这个库做什么。打个比方，你可以搜索`inifile`， 这个库被我用来解析 INI 格式的文本文件。

```
$ luarocks search inifile
Search results:
inifile
 1.0-2 (rockspec) - https://luarocks.org
 1.0-2 (src) - https://luarocks.org
 1.0-1 (rockspec) - https://luarocks.org
 [...]

```

一个开发者容易犯的错误是在系统上安装了这个库却忘了把它和应用打包。这会给没有安装这个库的用户带来麻烦。为了防止这个问题发生，可以使用 `--tree` 选项将它安装在项目的本地文件夹中。如果你没有这个项目文件夹，那就先创建这个文件夹再安装库：

```
$ mkdir demo
$ cd demo
$ luarocks install --tree=local inifile

```

`--tree` 选项指示 `luarocks` 创建一个新文件夹并在其中安装你的库，例如这个例子中的 `local` 文件夹。 使用这个简单的技巧，你可以将所有你项目要使用的依赖项直接安装到项目文件夹中。

### 配置代码

首先，在一个名 `myconfig.ini` 的文件中创建一些 INI 数据。

```
[example]
name=Tux
species=penguin
enabled=false

[demo]
name=Beastie
species=demon
enabled=false

```

将这个文件保存到你的主目录下，命名为 `myconfig.ini`, *不要* 存到项目文件夹下。你通常会希望配置文件独立于你的文件存在，这样当用户卸载你的应用时，使用应用时产生的数据可以保存在系统中。有些用户会删除不重要的配置文件，但大多数不会。最终，如果他们要重装这个应用，还会保留着所有的用户偏好项。

配置文件的位置以技术来说并不重要，但每一个操作系统都有存储它们的特定或者默认的路径。在 Linux 中，这个路径由 [Freedesktop 规范](https://www.freedesktop.org/wiki/Specifications) 指定。它规定配置文件被保存在一个名为 `~/.config` 的隐藏文件夹中。为了操作时更加清晰明确，可以在主目录下存储配置文件，以便于使用和寻找。

创建第二个文件，命名为 `main.lua`，并在你喜欢的文本编辑器中打开它。

首先，你必须告诉 Lua 你将想要使用的附加库放置在哪里。`package.path` 变量决定了 Lua 到哪里去寻找这些库。你可以从终端中查看 Lua 默认的包地址：

```
$ Lua
> print(package.path)
./?.lua;/usr/share/lua/5.3/?.lua;/usr/share/lua/5.3/?/init.lua;/usr/lib64/lua/5.3/?.lua;/usr/lib64/lua/5.3/?/init.lua

```

在你的 Lua 代码中，将你本地库的路径添加到 `package.path` 中：

```
package.path = package.path .. ';local/share/lua/5.3/?.lua

```

### 使用 Lua 解析 INI 文件

当包的位置确定以后，下一件事就是引入 `inifile` 库并处理一些操作系统逻辑。即使这是一个很简单的应用，代码也需要从操作系统获取到用户主目录的路径，并建立在必要时将文件系统路径返回给操作系统的通信方式。

```
package.path = package.path .. ';local/share/lua/5.3/?.lua
inifile = require('inifile')

-- find home directory
home = os.getenv('HOME')

-- detect path separator
-- returns '/' for Linux and Mac
-- and '\' for Windows
d = package.config:sub(1,1)

```

现在你可使用 `inifile` 来从配置文件解析数据到 Lua 表中。一旦这些数据被导入进表中，你可以像查询其他的 Lua 表一样查询它。

```
-- parse the INI file and
-- put values into a table called conf
conf = inifile.parse(home .. d .. 'myconfig.ini')

-- print the data for review
print(conf['example']['name'])
print(conf['example']['species'])
print(conf['example']['enabled'])

```

在终端中运行代码可以看见结果：

```
$ lua ./main.lua
Tux
penguin
false

```

这看起来是正确的。试试在 `demo` 块中执行同样的操作。

### 使用 INI 格式存储数据

不是所有用来解析的库都会读写数据（通常被称为 \_编码 和 *解码*），但是 `inifile` 会这样做。这意味着你可以使用它对配置文件进行修改。

为了改变配置文件中的值，你可以对被解析的表中的变量进行设置，然后把表重写回配置文件中。

```
-- set enabled to true
conf['example']['enabled'] = true
conf['demo']['enabled'] = true

-- save the change
inifile.save(home .. d .. 'myconfig.ini', conf)

```

现在再来看看配置文件：

```
$ cat ~/myconfig.ini
[example]
name=Tux
species=penguin
enabled=true

[demo]
name=Beastie
species=demon
enabled=true

```

### 配置文件

按照用户的设想来存储数据对程序来说是至关重要的。幸运的是，这对工程师来说是一个很常规的任务，大多数工作可能早已被完成了。只要找到一个好用的库完成开放格式下编码和解码，你就能为用户提供一致且持续的体验。

以下是完整的演示代码，可供参考。

```
package.path = package.path .. ';local/share/lua/5.3/?.lua'
inifile = require('inifile')

-- find home directory
home = os.getenv('HOME')

-- detect path separator
-- returns '/' for Linux and Mac
-- and '\' for Windows
d = package.config:sub(1,1)

-- parse the INI file and
-- put values into a table called conf
conf = inifile.parse(home .. d .. 'myconfig.ini')

-- print the data for review
print(conf['example']['name'])
print(conf['example']['species'])
print(conf['example']['enabled'])

-- enable Tux
conf['example']['enabled'] = true

-- save the change
inifile.save(home .. d .. 'myconfig.ini', conf)

```

---

via: <https://opensource.com/article/21/6/parsing-config-files-lua>

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

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


硬核观察 #816 Fedora 38 考虑提供面向手机的版本

Summary: • Fedora 38 考虑提供面向手机的版本 • 罗马法院要求 Cloudflare 的 DNS 封锁 BT 网站 • 15000 个网站被黑帽 SEO 利用

老王 某个地方长期被DNS投毒，阻止解析。不知道你有什么看法

老王 某个地方长期被DNS投毒，阻止解析。不知道你有什么看法

互联网就是撕逼网，你拉着网线赚别人钱时就说公平共享，现在到别人赚你钱下载几个种子就说是盗版，什么是公平共享？这bt不就是共享本质吗?

不敢有看法。

# 硬核观察 #816 Fedora 38 考虑提供面向手机的版本

### Fedora 38 考虑提供面向手机的版本

虽然 Fedora 37 还没有发布，但是开发人员已经在计划下一个版本。一个新的提案建议提供一个面向移动设备的 Phosh 镜像，用于运行专注于智能手机和平板电脑的 Wayland shell，同时提供一个良好的基于 GNOME 的体验。另外预计也会引入一个带有 KDE Plasma Mobile 的镜像。Fedora 38 预计明年春天发布。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Fedora-38-Phosh-Proposal)**
>
>
>

>
> 老王点评：期待看到 Fedora 运行在手机上。
>
>
>

### 罗马法院要求 Cloudflare 的 DNS 封锁 BT 网站

罗马法院已经确认，Cloudflare 必须通过其公共的 1.1.1.1 DNS 解析器阻止三个 BT 网站。Cloudflare 并不反对阻止针对其客户网站的请求，但认为干扰其 DNS 解析器是有问题的，因为这些措施不容易在地理上加以限制，将影响封锁该政府管辖范围以外的终端用户。

>
> **[消息来源：Slashdot](https://yro.slashdot.org/story/22/11/09/2320228/court-upholds-piracy-blocking-order-against-cloudflares-1111-dns-resolver)**
>
>
>

>
> 老王点评：DNS 作为互联网流量入口的方向标，屡屡被用来做各种滥用。已经习惯了，不是吗？
>
>
>

### 15000 个网站被黑帽 SEO 利用

安全专家发现，有 15000 个网站（其中大部分是 WordPress 网站），这些网站被重定向到虚假的问答讨论区。恶意威胁者的目标是产生足够的索引页面，以增加虚假问答网站的权重，从而在搜索引擎中获得更好的排名。

>
> **[消息来源：Bleeping Computer](https://www.bleepingcomputer.com/news/security/15-000-sites-hacked-for-massive-google-seo-poisoning-campaign/)**
>
>
>

>
> 老王点评：WordPress 这样的 CMS 系统越流行，其被一网打尽的可能越多，尤其是都采用了某些存在缺陷的插件或主题时。
>
>
>


Kate 文本编辑器增加了四个非常棒的新功能

Summary: 这个由 KDE 开发的功能丰富的文本编辑器正在变得更好和更有用！

棒棒哒

kate启动快，kwrite启动更快，写个sh脚本、 配置文件什么的，比VScode好用

使用过kde,gnome,xfce,lxqt几个桌面环境，就属kde的应用体积最大，启动最慢，

来自广东江门的 Chrome Mobile 104.0|Android 12 用户

这个由 KDE 开发的功能丰富的文本编辑器正在变得更好和更有用！

# Kate 文本编辑器增加了四个非常棒的新功能

>
> 这个由 KDE 开发的功能丰富的文本编辑器正在变得更好和更有用！
>
>
>

[Kate 文本编辑器](https://kate-editor.org/) 是一个不断发展和强大的开源文本编辑器，它可以作为微软的 Visual Studio Code 应用程序的替代品。

它可以在 Linux、Windows 和 macOS 上使用。

这个代码编辑器在 2021 年进行了重大升级，这可能使它成为了 KDE 对微软产品的回应。

在即将到来的 Kate 和 KWrite 22.12 版本上，他们的目标是添加许多非常有用的功能。

来简单看看我们可以从 Kate 中期待什么。

### ? Kate Editor 的新增功能

如果你读了 [Nate 的博客](https://pointieststick.com) 了解 KDE 的改进，你可能已经知道了 KDE Plasma 和应用程序即将获得的升级。

但是，我想强调一些 Kate 22.12 将会带来的令人激动的新功能：

* 对 Qt 部件的支持
* 更新的欢迎页面
* Git 差异查看器
* 配置标签页
* 剪切板历史

#### 欢迎页面

和许多其他 [KDE 应用程序](https://news.itsfoss.com/content/images/2022/11/Kate_22.12_GitDiff-1.png) 一样，Kate 现在将显示一个欢迎页面，该页面将欢迎用户并显示创建或打开文件、启动新会话、查看最近的文档等选项。

对于不喜欢这个页面的用户，欢迎页面上将提供一个选项，以在新窗口上禁用欢迎页面。

#### Git 差异查看器

Kate 终于增加了对显示 git-diff 的支持；用户将能够比较他们的代码以检查差异，并找到那些令人讨厌的、会导致他们的应用程序无法正常运行错误。

用户也可以从多种视图中进行选择，例如统一视图、并排视图和原始视图。

#### 新的剪贴板历史粘贴对话框

Kate 现在添加了一个新的对话框，在粘贴的时候显示用户剪贴板内容的列表。

当你在多行代码之间切换，而又不想丢失重要的内容时，这可能会很有用。

#### 配置标签页

Kate 也将添加一个配置标签页，让用户可以更改重要的设置，并添加了一个搜索栏，使用户可以快速查找特定的设置。

#### ? 其他变更和改进

Kate 22.12 将带来的其他值得注意的改进包括：

* 优化的状态栏
* 对构建插件的改进
* 可移动的侧边栏按钮
* 对窗口处理的改进

Kate 正在成为微软的 [Visual Studio Code](https://code.visualstudio.com/) 的合适替代品，并且自 2021 年大规模重构以来已经取得了很大的进步。

在 Kate 的 [官方博客文章](https://kate-editor.org/post/2022/2022-10-31-treats-for-kate/) 中，你可以了解更多关于这些变化的信息，并看看它们实际是怎么工作的。

? 你期待 Kate 22.12 的发布吗？还是更喜欢 VS Code？

---

via: <https://news.itsfoss.com/kate-editor-22-12-features/>

作者：[Sourav Rudra](https://news.itsfoss.com/author/sourav/) 选题：[lkxed](https://github.com/lkxed) 译者：[Cubik65536](https://github.com/Cubik65536) 校对：[wxy](https://github.com/wxy)

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


Ubuntu 所有版本的吉祥物

Summary: 在这篇文章中，我们会介绍迄今为止所有 Ubuntu 发行版本的吉祥物。

在这篇文章中，我们会介绍迄今为止所有 Ubuntu 发行版本的吉祥物。

# Ubuntu 所有版本的吉祥物

>
> 在这篇文章中，我们会介绍迄今为止所有 Ubuntu 发行版本的吉祥物。
>
>
>

你可能已经注意到了：每个 Ubuntu 版本都会有一个版本名称和代号。代号由两个单词组成，这两个单词有相同的首字母，第一个单词是形容词，另一个单词通常是一个濒危的物种名称。

对应于其代号，这些 Ubuntu 版本也有一个吉祥物。例如，Ubuntu 22.04 的代号为 “Jammy Jellyfish”，因此 Ubuntu 22.04 的桌面壁纸上有 **吉祥物：水母** 的图像。

但是实际上，这些“吉祥物”并不总是 Ubuntu 版本的一部分，因为吉祥物在早期的 Ubuntu 版本中是没有的。

有史以来第一个 Ubuntu 版本是在 2004 年 10 月发布的 4.10 版（LCTT 译注：Ubuntu 的版本号是由年份和月份的组合来表示的。）但是，直到 Ubuntu 8.04 LTS “Hardy Heron” 版本，你才会看到相关的吉祥物。

在我之前写的 [另一篇文章](https://itsfoss.com/Ubuntu-default-wallpapers-download/) 中，我整理了所有 Ubuntu 版本的默认壁纸。在本文中，你将了解到所有 Ubuntu 版本的吉祥物。

现在，就让我们按时间倒序，一起进入 Ubuntu 的吉祥物之旅吧。

（LCTT 校注：本文原文发表时，Ubuntu 22.10 尚未发布，它的代号是 “Kinetic Kudu”，吉祥物是“捻角羚”。）

（LCTT 校注：由于 Ubuntu 系列的代号和吉祥物选择的都是比较少见的动物和晦涩的描述，因此尽管译者和校对虽然尽力了，但是应该还有谬误。我觉得原文作者为了找出这些说明也尽力，恐怕真正权威的诠释只有 Canonical 才能给出吧。）

### Ubuntu 22.04 Jammy Jellyfish（幸运水母）

于 2021 年 4 月 21 日发布。

Jammy 的意思是被果酱覆盖着的、充满果酱的。不太正式地，Jammy 还有**幸运**的意思。

<ruby> 水母 <rt>  Jellyfish </rt></ruby> 是一种自由游动的水生动物，它的身体就像是一把透明伞，还具有拖曳的触须。少数水母是通过茎干固定在海床上，而不能移动。全世界的海洋中有超过两百种的水母，它们分布于全球各地的水域里。

### Ubuntu 21.10 Impish Indri（顽皮大狐猴）

于 2021 年 10 月 14 日发布。

Impish 的意思是以**顽皮**而不是严肃的方式，对某人/某事不太尊重。

<ruby> 大狐猴 <rt>  Indri </rt></ruby>，也称为 babakoto，是现存的最大的狐猴之一。它的头身长约 64 至 72 厘米，体重在 6 至 9.5 公斤之间。它的毛发是黑白相间的。在攀爬或攀爬时，它会保持竖直的姿势。

>
> 据维基：2014 年的世界自然保护联盟（IUCN） <ruby> 红色名录 <rt>  Red List </rt></ruby> 中，仅出现在马达加斯加的大狐猴首次被提升至极危级别。
>
>
>

### Ubuntu 21.04 Hirsute Hippo（多毛河马）

于 2021 年 4 月 22 日发布。

Hirsute 的意思是**多毛的**。

<ruby> 河马 <rt>  Hippo </rt></ruby>，是一种生活在非洲大陆撒哈拉以南的大型半水生哺乳动物。河马是河马科中仅有的两个现存物种之一，另一个物种是 <ruby> 侏儒河马 <rt>  pygmy hippopotamus </rt></ruby>。河马的名字来源于古希腊语“river horse”。

>
> 据维基：在 2006 年 5 月已被 IUCN 红色名录中分为易危物种，世界仅存约 12.5 万－15 万头
>
>
>

但是其实，我并没有见过很多多毛的河马 ?。

### Ubuntu 20.10 Groovy Gorilla（时髦大猩猩）

于 2020 年 10 月 22 日发布。

Groovy 的意思是**时尚的**和令人兴奋的。

<ruby> 大猩猩 <rt>  Gorilla </rt></ruby>，是一种草食性的地栖巨猿。它主要栖息在赤道非洲的热带森林中。大猩猩属分为两个物种：东部大猩猩和西部大猩猩，以及进一步可分为四个或五个亚种。

### Ubuntu 20.04 LTS Focal Fossa（瞩目狸猫）

于 2020 年 4 月 23 日发布。

Focal 的意思是令人注目的、**瞩目**。

<ruby> 马岛长尾狸猫 <rt>  Fossa </rt></ruby>，是**马达加斯加岛上最大的食肉性哺乳动物**。它身体的长度可以达到近六英尺，其中它们的长尾巴占了一半。它们看起来就像是猫、狗和獴的杂交体。它们有细长的身体、肌肉发达的四肢和短的红棕色毛发。

### Ubuntu 19.10 Eoan Ermine（东方白鼬）

于 2019 年 10 月 17 日发布。

Eoan 的意思是**与黎明或东方有关的**。

<ruby> 白鼬 <rt>  Stoat </rt></ruby>，也被称为欧亚貂、白令貂，简称 <ruby> 貂 <rt>  Ermine </rt></ruby>，是一种原产于欧亚大陆和北美北部的鼬科动物。由于鼬在极地广泛分布，因此它被 IUCN 列为最不担忧灭绝的物种。

>
> 据维基：IUCN 将其列为世界百大外来入侵种。
>
>
>

### Ubuntu 19.04 Disco Dingo（迪斯科野犬）

于 2019 年 4 月 18 日发布。

Disco 与**迪斯科**音乐和夜总会有关。

<ruby> 澳洲野犬 <rt>  Dingo </rt></ruby>，是在澳大利亚发现的一种古老的犬种。澳洲野犬的科属分类在不同出版物中不太一样，因此它的科属分类存在争议。

### Ubuntu 18.10 Cosmic Cuttlefish（外星墨鱼）

于 2018 年 10 月 18 日发布。

Cosmic 意味着与地球**不同的**、宇宙的。

<ruby> 墨鱼 <rt>  Cuttlefish </rt></ruby>，是乌贼目的一种海洋软体动物。它属于头足类，这一类还包含了鱿鱼、章鱼和鹦鹉螺。墨鱼有一个独特的内壳，即墨鱼骨，它可以用于控制浮力。

### Ubuntu 18.04 LTS Bionic Beaver（仿生河狸）

于 2018 年 4 月 26 日发布。

Bionic 意味着**仿生的**，或者是机电的。

<ruby> 河狸 <rt>  Beaver </rt></ruby>，是北半球温带的一种大型半水生啮齿动物。有两种现存的海狸：北美河狸和欧亚河狸。河狸是仅次于水豚的现存第二大啮齿动物。

>
> 据维基：它们处于 IUCN 哺乳动物红色名录中的无危物种，在中国河狸被列为一级保护动物。
>
>
>

英国用户认为这个版本的名称特别有趣。

### Ubuntu 17.10 Artful Aardvark（机灵土豚）

于 2017 年 10 月 19 日发布。

Ubuntu 在此版本中默认切换回了 GNOME。

Artful 的意思是聪明的或**机灵的**。

<ruby> 土豚 <rt>  Aardvark </rt></ruby>，是一种原产于非洲的穴居、夜间活动的中型哺乳动物。它是管齿目中唯一的现存物种。与大多数其他食虫动物不同，它有一个长长的像猪一样的鼻子，可以闻出食物在哪里。

### Ubuntu 17.04 Zesty Zapus（开心跳鼠）

于 2017 年 4 月 13 日发布。

这个版本是最后一个以 Unity 桌面为特色的版本。

Zesty 意味着有一种强烈的、**令人开心的**、有点辛辣的味道。

<ruby> 跳鼠 <rt>  Zapus </rt></ruby> 是北美跳鼠中唯一一个有牙齿的一个属。跳鼠是除 <ruby> 指猴 <rt>  Aye-aye </rt></ruby>之外，唯一现存的有 18 颗牙齿的哺乳动物。

### Ubuntu 16.10 Yakkety Yak（唠叨牦牛）

于 2016 年 10 月 13 日发布。

Yakkety 有很多意思。OMG Ubuntu 说，“yakking” 有唠唠叨叨这一非正式意思，yakkety 还可能是一种知名的流行爵士乐器 “Yakety Sax” 的另一种拼写。

<ruby> 牦牛 <rt>  Yak </rt></ruby>，是一种大型驯养的野牛。它的毛发蓬松，肩部隆起，有很大的角。在一些地方它是一种驮畜，人们也可以食用它的奶和肉、以及加工它的皮制作东西。

### Ubuntu 16.04 LTS Xenial Xerus（好客地松鼠）

于 2016 年 4 月 21 日发布。

Xenial 的意思是**热情好客的**。

<ruby> 非洲地松鼠 <rt>  Xerus </rt></ruby>，有四个亚种，分别是**开普地松鼠，条纹地松鼠，山地松鼠和无条纹地松鼠**。这些动物是昼行性的，是食草动物，通常吃坚果、根和种子。然而，有时它们也会吃蛋类和其他小动物。

### Ubuntu 15.10 Wily Werewolf（狡猾狼人）

于 2015 年 10 月 22 日发布。

这个版本可能是少有的发布代号中带有虚构动物的 Ubuntu 版本之一。

Wily 的意思是善于获得优势，尤其在欺骗上十分**狡猾的**。

<ruby> 狼人 <rt>  Werewolf </rt></ruby>，是可以隐藏住耳朵和尾巴的一种神话生物。它是人，也是狼，大多数人因为它们的长相而害怕它们。

### Ubuntu 15.04 Vivid Vervet（活泼绿猴）

于 2015 年 4 月 23 日发布。

Vivid 的意思是**活泼**的、明亮的。

<ruby> 黑长尾猴 <rt>  Vervet monkey </rt></ruby>，是一种原产于非洲的角猿科的旧大陆猴。“vervet”一词也用于表示<ruby> 绿猴属 <rt>  Chlorocebus </rt></ruby>的所有动物，其中包含五个不同的亚种，这五个不同的亚种主要分布在南部非洲以及一些东部国家。

### Ubuntu 14.10 Utopic Unicorn（乌托邦独角兽）

于 2014 年 10 月 23 日发布。

这个版本是另一个其发布代号中带有虚构动物的 Ubuntu 版本。

Utopic 与**乌托邦**有关，乌托邦是一个虚构的、不存在但是一个理想的地方。

<ruby> 独角兽 <rt>  Unicorn </rt></ruby>，是一种传说中的生物。自古以来，它就被描述为前额有一个巨大的、尖的、螺旋状的角的一种野兽。

### Ubuntu 14.04 LTS Trusty Tahr（可靠塔尔羊）

于 2014 年 4 月 17 日发布。

Trusty 意味着**可靠的**或忠实的。

<ruby> 塔尔羊 <rt>  Tahr </rt></ruby>，是一种很像山羊的哺乳动物。它们会栖息在阿曼、印度南部和喜马拉雅山脉的悬崖和山坡上。

### Ubuntu 13.10 Saucy Salamander（活泼蝾螈）

于 2013 年 10 月 17 日发布。

Saucy 意味着大胆的、**活泼的**或精神饱满的。

<ruby> 蝾螈 <rt>  Salamander </rt></ruby>是一类两栖动物。其典型特征是有着蜥蜴般的外观，它们有细长的身体，钝的鼻子，以及与身体成直角突出的短肢，并且幼体和成体都有尾巴。现存的所有十个蝾螈科都属于有尾目。

### Ubuntu 13.04 Raring Ringtail（热情猫熊）

于 2013 年 4 月 25 日发布。

Raring 的意思是热情的和**非常渴望做某事**。

<ruby> 猫熊 <rt>  Ringtail </rt></ruby>，是**一种像猫一样大的食肉动物，类似于一只长着浣熊尾巴的小狐狸**。它浓密的尾巴是扁平的，几乎和头部和身体一样长，有黑白交替的环。它们是夜行动物，一天中的大部分时间都在它们的巢穴里睡觉。

### Ubuntu 12.10 Quantal Quetzal（量子大咬鹃）

于 2012 年 10 月 18 日发布。

Quantal 意味着与**量子**或量子理论有关的。

<ruby> 大咬鹃 <rt>  Quetzal </rt></ruby>，是咬鹃家族中的一种色彩鲜艳的鸟类。它们生活在森林中，主要是在潮湿的高地。来自*凤尾绿咬鹃属*的五种物种生活在新热带的，而另外一个物种，即角咬鹃，生活在墨西哥和美国最南端的局部地区。大咬鹃相当地大，它们的身体长度超过 32 厘米或者有 13 英寸长，比其他咬鹃科的物种都大。绚丽的大咬鹃因其鲜艳的色彩，而成为危地马拉的国鸟。

### Ubuntu 12.04 LTS Precise Pangolin（精准穿山甲）

于 2012 年 4 月 26 日发布。

Precise 意味着能**精确**或准确地表达细节。

<ruby> 穿山甲 <rt>  Pangolin </rt></ruby>，有时被称为有鳞食蚁兽，是鳞甲目的一种哺乳动物。它现存的一个科是穿山甲科，有三个属：穿山甲亚属、长尾穿山甲亚属和地穿山甲亚属。穿山甲亚属包括在亚洲发现的四种物种，而长尾穿山甲亚属和地穿山甲亚属各包括两种物种，均在撒哈拉以南非洲发现。

>
> 据维基百科：2014 年，IUCN 红色名录物种存续委员会穿山甲专门小组，指出穿山甲是目前全世界最常被走私买卖的哺乳动物。所有穿山甲都面临巨大的生存威胁，其中中华穿山甲和马来穿山甲被 IUCN 评估为“极危”物种，非法走私的活动极为猖獗。随着亚洲的 4 种穿山甲数量锐减，走私贸易商家已转移目标至非洲，以满足市场上的庞大需求。
>
>
>

### Ubuntu 11.10 Oneiric Ocelot（梦幻豹猫）

于 2011 年 10 月 13 日发布。

Oneiric 的意思是与**梦**有关的。

<ruby> 豹猫 <rt>  Ocelot </rt></ruby>，是一种中等大小的斑点野猫。它的肩长可达 40 至 50 厘米，体重在 8 至 15.5 公斤之间。<ruby> 卡尔·林奈 <rt>  Carl Linnaeus </rt></ruby> 于 1758 年首次在书中描述了它。

>
> 据维基：华盛顿公约将孟加拉国、印度以及泰国的豹猫族群列入附录一禁止进行国际贸易，而其他族群亦列入华盛顿公约附录二。
>
>
>

### Ubuntu 11.04 Natty Narwhal（聪明独角鲸）

于 2011 年 4 月 28 日发布。

这个版本是第一个采用 Unity 桌面的版本。

Natty 意味着**聪明**和时尚的。

<ruby> 独角鲸 <rt>  Narwhal </rt></ruby>，是一种中等大小的齿鲸。拥有一颗突出的犬齿的大“獠牙”。它常年生活在格陵兰、加拿大和俄罗斯周围的北极水域。它是一角鲸科中现存的两种鲸鱼物种之一，另一个物种是 <ruby> 白鲸 <rt>  Beluga whale </rt></ruby>。

### Ubuntu 10.10 Maverick Meerkat（独行猫鼬）

于 2010 年 10 月 10 日发布。

Maverick 的意思是**特立独行的**或有独立思想的。

<ruby> 猫鼬 <rt>  Meerkat </rt></ruby>，是一种在南部非洲发现的小型猫鼬。它的特点是头宽、眼睛大、鼻子尖、腿长、尾巴很细，毛色有斑纹。

### Ubuntu 10.04 LTS Lucid Lynx（清醒猞狸）

于 2010 年 4 月 29 日发布。

Lucid 意味着**易于理解的**或明亮的。

<ruby> 猞猁 <rt>  Lynx </rt></ruby>，是中型野猫属猞猁中的一种。猞猁这个名字起源于中古英语，源自希腊语 λύγξ，λύγξ 又源自于印欧语词根 leuk-，指的是它眼睛能反射发光的样子。

### Ubuntu 9.10 Karmic Koala（幸运考拉）

于 2009 年 10 月 29 日发布。

Karmic 意味着与**命运**、业力有关。

<ruby> 考拉 <rt>  Koala </rt></ruby>，是一种原产于澳大利亚的树栖草食性的有袋动物。它是袋鼠科唯一现存的物种，它的近亲是<ruby> 袋熊 <rt>  Wombat </rt></ruby>。

>
> 据维基：在 19 世纪初树袋熊遭到捕杀出口，数量由百万只锐减至一千多只，于是澳大利亚政府立法保护。
>
>
>

### Ubuntu 9.04 Jaunty Jackalope（自信鹿角兔）

于 2009 年 4 月 23 日发布。

这个版本是我用的第一个 Ubuntu 版本。

Jaunty 是指拥有活泼、开朗和**自信**的态度。

<ruby> 鹿角兔 <rt>  Jackalope </rt></ruby>，是**北美民间传说中的一种神话动物**，被描述为长着羚羊角的可怕的长角兔。Jackalope 这个词是由 jackrabbit 和 antelope 组合而成的。许多鹿角兔的标本都是由用鹿角制成的。

### Ubuntu 8.10 Intrepid Ibex（无畏野山羊）

于 2008 年 10 月 30 日发布。

Intrepid 意味着**无所畏惧**、冒险的。

<ruby> 野山羊 <rt>  Ibex </rt></ruby>，以雄性的大弯角为特征，在前面形成像横向的脊那样。它主要分布于欧亚大陆、北非和东非。

### Ubuntu 8.04 LTS Hardy Heron（坚韧苍鹭）

于 2008 年 4 月 24 日发布。

这个版本是第一个吉祥物出现在其默认壁纸上的 Ubuntu 版本。

Hardy 意味着能够**忍受**困难条件的、强大的。

<ruby> 苍鹭 <rt>  Heron </rt></ruby>，是一种长腿、长颈、生活在淡水和沿海的鸟类。

### Ubuntu 7.10 Gutsy Gibbon（阵风长臂猿）

于 2007 年 10 月 18 日发布。

Gusty 表示以**阵风**的方式吹动。

<ruby> 长臂猿 <rt>  Gibbon </rt></ruby>，是一种猿类，它们生活在孟加拉国东部、印度东北部、中国南部和印度尼西亚的亚热带和热带雨林地区。

### Ubuntu 7.04 Feisty Fawn（活泼小鹿）

于 2007 年 4 月 19 日发布。

Feisty 意味着**小而坚定**的。

<ruby> 小鹿 <rt>  Fawn </rt></ruby>，指的是第一年刚出生的小鹿。

### Ubuntu 6.10 Edgy Eft（紧张水蜥）

于 2006 年 10 月 26 日发布。

Edgy 的意思是**紧张的**。

<ruby> 水蜥 <rt>  Eft </rt></ruby>，是蝾螈的陆生幼年期。蝾螈是一种蜥蜴，它具有三个不同的发育生命阶段：水生幼虫、陆生幼体和成体。

所以水蜥指的是一个青年的蝾螈。

### Ubuntu 6.06 Dapper Drake（整洁公鸭）

于 2006 年 6 月 1 日发布。

Dapper 的意思是衣着整洁，**外表整洁的**。

<ruby> 公鸭 <rt>  Drake </rt></ruby>，是完全性成熟的成年雄性鸭子。

### Ubuntu 5.10 Breezy Badger（微风之獾）

于 2005 年 10 月 12 日发布。

Breezy 的意思是有**微风**的。

<ruby> 獾 <rt>  Badger </rt></ruby>，一种是短腿的杂食动物，经常蹲下身挤在一起。

### Ubuntu 5.04 Hoary Hedgehog（灰白刺猬）

于 2005 年 4 月 8 日发布。

Hoary 是**灰白色的**意思。

<ruby> 刺猬 <rt>  Hedgehogis </rt></ruby>，是一种多刺的哺乳动物，遍布于欧洲、亚洲和非洲的部分地区，并引入到了新西兰。

### Ubuntu 4.10 : Warty Warthog（有疣疣猪）

于 2004 年 10 月 20 日发布。

Ubuntu 就是从这个版本开始的。

Wart 是由病毒引起的一种小的、坚硬的、良性的皮肤生长物。Warty 的意思是**长满疣的**。

<ruby> 疣猪 <rt>  Warthog </rt></ruby>，是猪科的一种野生动物，它是在撒哈拉以南非洲的草原、稀树草原和林地中被发现的。

### 总结

本文有没有让 Ubuntu 用户了解了更多知识呢？从技术上讲，并没有，但回顾历史是件好事。如果你多年来一直是 Ubuntu 用户，那么这篇文章可能会引发你的怀旧之情。

Ubuntu 9.04 是我第一次尝试 Linux 桌面。如果我没记错的话，那是在 2009 年 9 月下旬。仅仅几周后，我的系统就升级到了 Ubuntu 9.10。那些天我经常在 Ubuntu 论坛上浏览，探索这个新的操作系统，并学习新的东西。

那么，这篇文章有没有勾起你的一些美好的回忆呢？你的第一个 Ubuntu 版本又是哪个呢？在评论区中分享你的 Ubuntu 使用经历吧。

---

via: <https://itsfoss.com/all-Ubuntu-mascots/>

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

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


如何在 VLC 播放器中裁剪视频

Summary: 这不是 裁剪视频 的最佳方式，但它可以作为一个选择使用。

这不是 裁剪视频 的最佳方式，但它可以作为一个选择使用。

# 如何在 VLC 播放器中裁剪视频

VLC 媒体播放器是 [最好的媒体播放器](https://itsfoss.com/video-players-linux/) 之一。这款跨平台播放器功能丰富，可以播放任何可用的媒体格式。

你会惊讶地发现 VLC 不仅仅是一个视频播放器。它可以对你的媒体文件做很多事情。

我们分享过 [使用 VLC 下载 YouTube 视频](https://itsfoss.com/download-youtube-videos-vlc/) 的 [VLC 技巧](https://itsfoss.com/simple-vlc-tips/)。

让我再和你分享一个。用 VLC 裁剪视频怎么样？这不是 [裁剪视频](https://itsfoss.com/video-trimmer/) 的最佳方式，但它可以作为一个选择使用。

### 使用 VLC 裁剪视频

在 VLC 中裁剪视频本质上意味着从所需部分的开头到结尾录制视频。默认情况下，录制控制工具通常在 VLC 面板中不可见。

让我详细介绍一下步骤。

#### 步骤 1：启用高级控件

要获取控件，你需要使其在主控制面板上可见。

首先选择“<ruby> 视图 <rt>  View </rt></ruby>”选项，然后选中“<ruby> 高级控件 <rt>  Advanced Controls </rt></ruby>”复选框。现在，如截图所示，出现了带有几个按钮的新控件行。

#### 步骤 2：打开视频

为了裁剪视频，你需要在 VLC 中打开它。你可以通过“<ruby> 媒体 <rt>  Media </rt></ruby> > <ruby> 打开文件 <rt>  Open File </rt></ruby>”在 VLC 播放器中打开视频：

或者你可以使用 Nautilus 文件管理器中的 VLC 打开视频文件：

#### 步骤 3：使用 VLC 的录制功能裁剪视频

打开视频文件后，将时间线设置为所需输出的起点并暂停视频。之后，按“录制”按钮并播放视频。

当达到所需输出的终点时，暂停视频并再次按下“录制”按钮停止录制。

这应该将裁剪后的输出保存到你的 `~/Videos` 目录中。

### 故障排除：无法识别的输出文件

VLC 以 .ts 文件格式录制视频。这在 VLC 中受支持，你可以根据需要使用它。但是 Ubuntu 中的许多其他播放器，包括本地视频播放器，都无法识别该格式。因此，在这种情况下，有两种解决方案。

#### Gnome-Video 提示安装 GStreamer 包

当你尝试打开文件时，GNOME-Videos 会提示错误并建议安装 Gstreamer 多媒体编解码器。

你可以点击上图所示的 “<ruby> 在 Ubuntu 软件应用中查找 <rt>  Find in Ubuntu Software </rt></ruby>” 按钮，这将打开 Ubuntu 软件中心。你可以在那里安装所需的编解码器包。

同样安装 Gnome-videos 并使用它打开视频将解决问题。

#### 使用 VLC 转换视频文件

如果你不想为此安装任何额外的软件包，你可以使用 VLC 本身将 .ts 文件转换为 mp4 格式以在任何其他播放器中播放。

为此，打开 VLC 并在“<ruby> 媒体 <rt>  Media </rt></ruby>”菜单下选择“<ruby> 转换/保存 <rt>  Conver/Save </rt></ruby>”选项。

现在，使用“<ruby> 添加 <rt>  Add </rt></ruby>”按钮提供需要转换的文件的位置，然后选择“<ruby> 转换/保存 <rt>  Conver/Save </rt></ruby>”，如截图所示。

选择所需的输出配置（MP4）并为输出设置文件名，然后按“<ruby> 开始 <rt>  Start </rt></ruby>”。

这将开始转换，并根据源的时长决定转换时间。完成后，你可以从 `~/Videos` 目录访问转换后的输出。

### 总结

虽然确实可以使用 VLC 播放器来裁剪视频，但整个过程与专门的 [视频编辑器](https://itsfoss.com/open-source-video-editors/) 完全不同。

最大的问题是你需要观看所有裁剪部分才能完成裁剪，如果你要裁剪跨越数分钟的视频的一大部分，这就不方便了。

无论如何，这个很酷的功能在某些情况下可能是一个方便的工具，比如你想要的只是裁剪一个特定的小剪辑或从电影场景中制作一个 Gif。

---

via: <https://itsfoss.com/vlc-trim-video/>

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

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


硬核观察 #817 一家神秘公司掌握着一个主流 SSL 根证书机构

Summary: • 一家神秘公司掌握着一个主流 SSL 根证书机构 • GitHub 实验 “Hey, GitHub!” 语音编程 • 美国国家安全局敦促各组织转向内存安全编程语言

作为Linux浏览器用户，又如何鉴别开源社区的公共证书安不安全呢？<br />
如何默认屏蔽特定CA签名的网站呢？

以Firefox为例，setting>privacy & security>certificate<br />
编辑信任与不信任的证书（如自带的TrustCor RootCert CA-1/2 ,...)。

安全公司开后门，司空见惯了，赚钱嘛，不寒碜

# 硬核观察 #817 一家神秘公司掌握着一个主流 SSL 根证书机构

### 一家神秘公司掌握着一个主流 SSL 根证书机构

据报道，Chrome、Safari、Firefox 和其他浏览器都接受一家名为 TrustCor 的根证书机构（CA）。CA 是互联网基础设施的基石，它签署的 SSL 证书可以保证网站不是假的，流量是加密的。因而，CA 可以签发“伪造”证书从而劫持加密流量。此外，该公司在巴拿马的注册记录显示，其信息与今年被确认的一家的间谍软件制造商相同，文件显示，该公司十多年来一直向美国政府机构出售通信拦截服务。Mozilla 表示它可能会取消 TrustCor 的根证书。

>
> **[消息来源：华盛顿邮报](https://www.washingtonpost.com/technology/2022/11/08/trustcor-internet-addresses-government-connections/)**
>
>
>

>
> 老王点评：谷歌当年就因为有根 CA 滥用而取消过该根 CA 证书，看看这次谷歌会如何？
>
>
>

### GitHub 实验 “Hey, GitHub!” 语音编程

GitHub Next 团队宣布了一项新的实验：“Hey, GitHub!”，允许与 Copilot 进行语音互动。也就是说，你甚至不需要使用键盘就可以让 VSCode 为你提供编程建议。GitHub 称，该实验可以识别“自然语言”。除了编写和编辑代码，它还允许程序员进行代码导航和执行其它 VSCode 命令。

>
> **[消息来源：The Verge](https://www.theverge.com/2022/11/9/23449175/hey-github-voice-copilot-code-programming-system)**
>
>
>

>
> 老王点评：连键盘都不用了，直接讲你要干啥就好了。
>
>
>

### 美国国家安全局敦促各组织转向内存安全编程语言

美国国家安全局（NSA）表示，建议各组织通过利用 C#、Go、Java、Ruby 或 Swift 等语言内存安全编程语言进行战略性转变。NSA 表示“内存管理问题已经被利用了几十年，今天仍然很常见。”软件内存安全问题是约 70% 的漏洞背后的原因。不良的内存管理也会导致技术问题，如不正确的程序结果，随着时间的推移程序性能的下降，以及程序崩溃。

>
> **[消息来源：NSA](https://www.nsa.gov/Press-Room/News-Highlights/Article/Article/3215760/nsa-releases-guidance-on-how-to-protect-against-software-memory-safety-issues/)**
>
>
>

>
> 老王点评：建议是好的，但是 NSA 不太值得信任。
>
>
>


Lua 值得学习吗？

“路啊”

“鹿啊”

# Lua 值得学习吗？

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

>
> Lua 是一个有趣而强大的语言，随着各个版本的推进，功能愈发的强大，开发者群体也在不断的增长。这篇文章我们将探索一下它的各种前景。
>
>
>

Lua 是一个脚本语言，它面向过程、函数式编程，甚至可以是 [面向对象的](https://opensource.com/article/22/10/object-oriented-lua%20)。它使用类 C 语言的语法，但却是动态类型，具有自动内存管理和垃圾回收功能，使用基于寄存器的虚拟机来解释字节码。这些特点使得它对于初学者来说是个很好的语言，同时也是经验丰富的程序员的强大工具。

虽然与 [Python](https://opensource.com/resources/python) 和 [JavaScript](https://opensource.com/article/22/9/javascript-glossary) 相比，Lua 现在已经有点儿黯然失色了，但是 Lua 拥有的一些优点使得它在许多的重大软件项目中很受欢迎。Lua 很容易嵌入到其他语言当中， 这意味着你可以在（例如）Java 编写的代码中包含 Lua 文件，就像原生的 Java 代码一样运行。这听起来就像魔法一般，现在有许多项目如 [luaj](https://github.com/luaj/luaj) 使得其成为可能，之所以可以实现，正是因为 Lua 就是为此而设计的。部分出于这种灵活性，你可以在许多游戏、图形应用的程序中发现 Lua 脚本的身影。

就像其他任何事情一样，做到完美是需要时间的，但 Lua 是很易于学习（并且有趣）的语言。它是一种一致的语言、一种带有有用的错误消息的友好的语言，并且可以在网上轻松找到许多有用的资料。那么就让我们开始吧！

### 安装 Lua

在 Linux 下，你可以使用发行版自带的包管理来安装 Lua。例如，在 Fedora、CentOS、 Mageia、OpenMandriva 以及类似发行版中：

```
$ sudo dnf install lua

```

在 Debian 以及基于 Debian 的系统中：

```
$ sudo apt install lua

```

对于 Mac，你可以使用 [MacPorts](https://opensource.com/article/20/11/macports) 或者 [Homebrew](https://opensource.com/article/20/6/homebrew-linux)：

```
$ sudo port install lua

```

对于 Windows，可以使用 [Chocolatey](https://opensource.com/article/20/3/chocolatey) 安装 Lua。

完成安装后，可以在终端中输入 `lua` 来在交互式解释器中使用 Lua。

### 函数

如许多编程语言一样，Lua 的语法通常是一个内建的函数或关键字，后面跟着参数。例如，`print` 函数显示你传给它的所有参数。

```
$ lua
Lua 5.4.2  Copyright (C) 1994-2020 Lua.org，PUC-Rio

> print('hello')
hello

```

Lua 的 `string` 库可以操作单词（在编程中称为“字符串”）。例如，要统计字符串中的字母数量，你可以使用 `string` 库中 `len` 函数：

```
> string.len('hello')
5

```

### 变量

变量允许你在计算机内存中为临时的数据创建一个指定的空间。Lua 中创建变量的方法是赋予变量一个名字，接着将数据放入其中。

```
> foo = "hello world"
> print(foo)
hello world
> bar = 1+2
> print(bar)
3

```

### 表

在编程中，数组的使用频率仅次于变量。“数组”这个词的字面意思就是一种排列，而这就是程序中数组的意义了。它是数据的一种排列，因为有排列，所有数组具有结构化的优势。本质上，数组通常用于和变量相同的目的，只不过数组会给对其中的数据进行排序。在 Lua 中，数组被称为“表”。（LCTT 译注：使用过其它编程语言的同学可以发现，Lua 的表相当于其它语言中的关联数组、哈希。）

创建表和创建变量类似，区别仅在于它的初始化内容被设置为 `{}`:

```
> mytable = {}

```

当往表中增加数据时，它就如同创建变量一样，区别在于这里的变量之前总是以表名开头，中间使用 `.` 来连接:

```
> mytable.foo = "hello world"
> mytable.bar = 1+2
> print(mytable.foo)
hello world
> print(mytable.bar)
3

```

### 使用 Lua 编写脚本

在终端交互环境中运行 Lua 可以得到良好的反馈，但是将 Lua 作为脚本运行会更为有用。Lua 脚本就是包含 Lua 代码的文本文件，Lua 命令可以解析并执行此文件。

在刚刚开始学习一门编程语言时，一个永恒的问题是你怎么知道该写什么。这篇文章将提供一个不错的开端，截至目前，你仅知道了两三个 Lua 函数。懂得查阅文档是很关键的。Lua 并不是一个复杂的语言，可以通过 [Lua 文档网站](http://www.lua.org/docs.html) 很方便的获取关键字以及函数的用法。

下面是一个练习题。

假设你想编写一个 Lua 脚本来统计句子中的单词数量。与众多的编程挑战一样，有许多方法可以解决这个问题，假设你在 Lua 文档中找到的第一个相关的函数是 `string.gmatch`，此函数可以搜索字符串中的特定字符。单词通常通过空格分隔开来，所以你决定计算空格数并加 1 来作为单词的数量。

下面是实现的代码：

```
function wc(words,delimiter)
  count=1
  for w in string.gmatch(words，delimiter) do
    count = count + 1
  end

  return count
end

```

下面是这个样例代码的解释：

* `function`：这是声明函数开始的关键字。自定义函数的工作方式与内置函数（如 `print` 和 `string.len`）基本相同。
* `words` 和 `delimiter`：这是函数运行所需的参数。正如 `print('hello')` 当中，`hello` 是一个参数。
* `counter`：一个变量，且被初始化为 `1`。
* `for`：在循环中使用 `string.gmatch` 作为迭代器遍历 `words`，并且在其中搜索`delimiter`。
* `count = count + 1`：当搜索到了 `delimiter`，则对 `count` 进行自增 1 的操作。
* `end`：`for` 循环的结束关键字。
* `return count`：这个函数输出（或返回）`count` 变量的内容。
* `end`：函数结束的关键字。

现在你已经创建了一个函数，你可以使用它。需要记住，函数不会自动运行，而是等待你在代码中调用它。

将下面的代码写入文件并保存为 `words.lua`：

```
function wc(words,delimiter)
  count=1
  for w in string.gmatch(words，delimiter) do
    count = count + 1
  end
  return count
end

result = wc('zombie apocalypse'，' ')
print(result)

result = wc('ice cream sandwich'，' ')
print(result)

result = wc('can you find the bug? '，' ')
print(result)

```

你现在创建了一个 Lua 脚本。你可以使用 Lua 运行它。随后你会发现统计单词的结果有些问题：

```
$ lua ./words.lua
2
3
6

```

你也许已经注意到了最后一个句子的单词统计不正确，因为在句子的最后带有一个额外的空格。Lua正确的检测到了空格，并将其计入 `count` 中，但是单子的统计是错误的，因为有个空格并没有作为单词的分隔出现。我把这个问题留给你来解决，或者去发现其他方法，即使方法不太理想。编程中有很多需要思考的地方。有时是纯粹学术性的思考，有时也许是应用是否运训正常的思考。

### 学习 Lua

Lua 是一个有趣且强大的语言，随着版本的推进，功能愈发的强大，开发者群体也在不断的增长。你可以将 Lua 作为实用性的个人脚本使用，或者在工作中使用，或者仅仅是体验一下一个新的语言。尝试一下，看看 Lua 能给你带来什么吧。

（LCTT 译注：顺便问一句，你知道 “Lua” 怎么发音吗？ ?）

---

via: <https://opensource.com/article/22/11/lua-worth-learning>

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

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


使用 GNOME Boxes 将虚拟机镜像移动到另一台主机

竟然没有export和import命令

# 使用 GNOME Boxes 将虚拟机镜像移动到另一台主机

>
> 本指南介绍了使用 GNOME Boxes 将虚拟机镜像移动到另一台主机所需的步骤。
>
>
>

GNOME Boxes 是由 GNOME 项目创建的虚拟化程序。此程序用作 libvirt 的前端。libvirt 是用于管理平台虚拟化的开源 API、守护进程和管理工具。它支持不同的虚拟化技术，如 KVM、Xen、VMware ESXi、QEMU 等。

如果你想使用 GNOME Boxes 创建虚拟机，[请参阅本指南](https://www.debugpoint.com/2020/05/install-use-gnome-boxes/)。

在本教程中，我将解释如何将任何虚拟机镜像文件（已使用 GNOME Boxes 创建并运行）移动到不同的主机并运行它。

这样，你不再需要从操作系统重新安装虚拟机。此外，它是便携式的，你可以将虚拟机镜像放在 U 盘中。

### 如何使用 GNOME Boxes 将虚拟机镜像移动到另一台主机

我希望你已经在 GNOME Boxes 中创建了一个虚拟机。如果没有，请查看 [本指南](https://www.debugpoint.com/2020/05/install-use-gnome-boxes/)。

GNOME Boxes 和 [libvert](https://libvirt.org/) 使用以下目录存储虚拟机镜像和配置。如下所述，你需要仔细备份每个文件。

GNOME Boxes 将虚拟机的物理镜像（通常为数 GB 大小）保存在以下路径中。对于你的每个虚拟机，你都会在其中找到一个镜像。

```
~/.local/share/gnome-boxes/images/

```

将图像文件复制到新主机的路径：`~/.local/share/gnome-boxes/images/`。

将 libvirt 的 XML 配置从以下路径复制到新主机的相同位置。

```
~/.config/libvirt/qemu/

```

在上述路径中，你应该会看到每个虚拟机的单独 xml 文件。复制你需要的那个。

在你当前的系统中打开以下文件。

```
~/.config/gnome-boxes/sources/'QEMU Session'

```

复制属于你的虚拟机的部分（从 `[display` ... 到本部分的末尾）。你可以使用名称轻松找到它（看下面的 `last-seen-name`）。

在另一台主机上打开相同的上述文件并将复制的内容附加到末尾。保存文件。

关闭新主机中的所有应用，包括 GNOME Boxes。

现在打开 GNOME Boxes，你应该会看到你的虚拟机和它的内容一起被移动到新主机中。

你现在可以拥有一个可以轻松携带和移动的便携式虚拟机。请记住，目标机器应该安装了 GNOME Boxes 才能完成这项工作。

---

via: <https://www.debugpoint.com/move-virtual-machine-image-another-host/>

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

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


硬核观察 #818  Linux 帮助 Windows 11 支持旧打印机

Summary: • Linux 帮助 Windows 11 支持旧打印机 • DeviantArt 为作品添加 AI 许可标签 • 一根普通光纤传输全球互联网流量

说反了，Linux还需要windows桥来接打印机，例子：UOS

# 硬核观察 #818  Linux 帮助 Windows 11 支持旧打印机

### Linux 帮助 Windows 11 支持旧打印机

也许你有一些古老的激光打印机或一体机，但是它们没有 Windows 11 驱动程序。而 Linux 在支持旧硬件方面明显更好，如果驱动程序仍然可以编译，它就不会被删除。现在你可以通过在 WSL 内运行的 OpenPrinting 中使用旧打印机进行打印。这之所以可以实现，还要感谢 WSL2 支持了 systemd，从而支持 Canonical 的 Snap 版的打印机应用。

>
> **[消息来源：The Register](https://www.theregister.com/2022/11/10/openprinting_keeps_old_printers_working/)**
>
>
>

>
> 老王点评：没想到 WSL 还有这种好处！
>
>
>

### DeviantArt 为作品添加 AI 许可标签

著名艺术网站 DeviantArt 推出了自己的 AI 艺术生成器 DreamUp。为了让艺术家控制他们的作品，DeviantArt 让他们可以选择该工具是否可以使用他们的风格作为直接灵感。并在不允许 AI 使用的作品页面添加特定的标签。DeviantArt 也鼓励其他创作者平台采用这种方法，以确保艺术家仍然能够与在线观众分享他们的作品。

>
> **[消息来源：Engadget](https://www.engadget.com/deviant-art-is-launching-its-own-ai-art-generator-140006449.html)**
>
>
>

>
> 老王点评：确实应该形成一种行业规范，或者新的许可证惯例。
>
>
>

### 一根普通光纤传输全球互联网流量

通过将 55 种模式的信号射入单芯光纤，该团队能够以每秒 1.53 Pbps 的数据速率进行传输。1Pbps 相当于 100 万 Gbps。据估计，整个全球互联网的带宽只有不到 1Pbps，这意味着这根光纤足够处理全球所有的互联网带宽。虽然这不是最快的传输速率，之前有日本研究机构达到了 1.84 Pbps 的速率，但这个纪录的意义在于，它是使用标准覆层直径为 0.125 毫米的光纤实现的，很大程度上与现有的基础设施兼容。

>
> **[消息来源：Tom's Hardware](https://www.tomshardware.com/news/standard-fiber-optic-tech-achieves-record-153-petabit-per-second-transmissions)**
>
>
>

>
> 老王点评：带宽扩展的太快，说不准以后个人设备也需要几个 G 的带宽了。
>
>
>


使用这个多功能的 Linux 命令转换音频文件

Summary: SoX Sound Exchange 甚至可以为你的音频文件添加特效。

SoX Sound Exchange 甚至可以为你的音频文件添加特效。

# 使用这个多功能的 Linux 命令转换音频文件

>
> SoX Sound Exchange 甚至可以为你的音频文件添加特效。
>
>
>

<img src="content_image/album_202211_13_104314skttlizoioyeaw3w.jpg" alt="" title="HiFi vintage stereo">

我工作需要使用音视频媒体，不管你处理哪种媒体，你肯定知道标准化是一种有价值的工具。就像你不会试图把一个分数加到一个小数上而不转换其中一个一样，我已经知道，把不同格式的媒体组合起来并不理想。为了方便用户，大多数爱好者级应用程序使转换过程不可见。然而，对于那些需要控制媒体细节的用户的灵活软件，会通常让你自己提前将媒体转换为所需的格式。我有一些最喜欢的音频转换工具，其中之一就是号称“音频的瑞士军刀” —— [SoX](http://sox.sourceforge.net/sox.html)。

### 安装

在 Linux 或 BSD 上，可以从软件存储库或 Ports 树中安装 `sox` 命令（，以及一些有用的符号链接）。

你也可以从 [Sourceforge.net](http://sox.sourceforge.net) 上安装 SoX。它不经常发布，但它的代码库往往是稳定的，所以如果你想要最新的功能（如 Opus 支持），构建它是容易和安全的。

SoX 主要提供了 `sox` 命令，但是创建了一些有用的符号链接：`play`、`rec` 和 `soxi`。

### 使用 SoX 获取文件信息

SoX 可以读取和重写音频数据。它是否存储重写的音频数据取决于你。在有些情况下，你不需要存储转换后的数据，例如，当你将输出直接发送到扬声器进行回放时。然而，在进行任何转换之前，最好首先确定要处理的是什么。

使用 `soxi` 命令也可以收集音频文件信息。`soxi` 会符号链接到 `soxi --info`。

```
$ soxi countdown.mp3
Input File（输入文件）    : '/home/tux/countdown.mp3'
Channels（通道数）       : 1
Sample Rate（采样率）    : 44100
Precision（数据精度）      : 16-bit（16 比特）
Duration（时长）       : 00:00:11.21 = 494185 samples...（11.21 秒 = 494185 采样点）
File Size（文件大小）      : 179k
Bit Rate（比特率）       : 128k
Sample Encoding（编码格式）: MPEG audio (layer I, II or III)

```

这个输出可以让你很好地了解音频文件的编码方式、文件长度、文件大小、采样率和通道数。其中一些你可能*认为*你已经知道了，但当客户把媒体带到我面前时，我从不相信这些假设。使用 `soxi` 验证媒体属性。

### 转换文件

在本例中，，一个游戏节目倒计时的音频是以MP3文件的形式提供的。虽然几乎所有的编辑应用程序都接受压缩音频，但它们并不是在压缩的数据上进行编辑。转换是在某个地方发生的，可能是一个秘密的后台任务，也可能提示让你保存一份副本。我通常喜欢自己提前完成转换。这样，我可以控制使用的格式。我可以在夜间批量处理大量的媒体，而不是浪费宝贵的制作时间，等待编辑应用程序按需处理它们。

`sox` 命令用于转换音频文件。在 `sox` 流程中有几个阶段：

* 输入
* 合并
* 特效
* 输出

但在命令语法中，特效步骤令人困惑地放到了*最后一步*。这意味着 `sox` 流程是这样组成的:

```
输入 → 合并 → 输出 → 特效

```

### 编码

最简单的转换命令只涉及一个输入文件和一个输出文件。下面是转换 MP3 文件为无损 FLAC 文件的命令：

```
$ sox countdown.mp3 output.flac
$ soxi output.flac

Input File（输入文件）     : 'output.flac'
Channels（通道数）       : 1
Sample Rate（采样率）    : 44100
Precision（数据精度）      : 16-bit（16 比特）
Duration（时长）       : 00:00:11.18 = 493056 samples...（11.18 秒 = 493056 采样点）
File Size（文件大小）      : 545k
Bit Rate（比特率）       : 390k
Sample Encoding（编码格式）: 16-bit FLAC
Comment（注释）        : 'Comment=Processed by SoX'

```

#### 特效

特效可以在命令末尾指定。它可以在将数据发送到最终目的地之前更改音频。例如，有时声音太大会在转换过程中造成问题：

```
$ sox bad.wav bad.ogg
sox WARN sox: `bad.ogg' output clipped 126 samples; decrease volume?

```

应用**增益**（`gain`）效果通常可以解决此问题：

```
$ sox bad.wav bad.ogg gain -1

```

#### 淡入淡出

另一个常用的效果是**淡入淡出**（`fade`）。此效果允许你定义淡入或淡出的类型，以及你希望淡入淡出效果持续的时间。

下面是一个使用倒抛物线的 6 秒淡入示例：

```
$ sox intro.ogg intro.flac fade p 6

```

这将对音频的头部应用 3 秒的淡入，并从 8 秒标记开始淡出（这段音乐只有 11 秒，因此在这种情况下淡出也是 3 秒）：

```
$ sox intro.ogg intro.flac fade p 3 8

```

`sox` 手册页中列出了不同类型的淡入淡出（正弦、线性、倒抛物线等）以及淡入淡出提供的选项。

#### 特效语法

每个特效插件都有自己的语法，因此请参阅手册页了解如何调用每个特效插件的详细信息。

效果可以在一个命令中以菊花链的方式进行，至少在你想组合它们的范围内是如此。换句话说，没有语法可以只在六秒钟的淡出期间应用一个镶边效果。对于如此精确的东西，你需要一个图形声波编辑器或数字音频工作站，例如 [LMMS](https://opensource.com/life/16/2/linux-multimedia-studio) 或 [Rosegarden](https://opensource.com/article/18/3/make-sweet-music-digital-audio-workstation-rosegarden)。但是，如果你只想应用一次特效，可以在同一命令中将它们一起列出。

此命令应用了一个 -1 的**增益**效果、1.35 的节奏**拉伸**和**淡出**：

```
$ sox intro.ogg output.flac gain -1 stretch 1.35 fade p 0 6
$ soxi output.flac

Input File（输入文件）     : 'output.flac'
Channels（通道数）       : 1
Sample Rate（采样率）    : 44100
Precision（数据精度）      : 16-bit（16 比特）
Duration（时长）        : 00:00:15.10 = 665808 samples...（15.10 秒 = 665808 采样点）
File Size（文件大小）      : 712k
Bit Rate（比特率）       : 377k
Sample Encoding（编码格式）: 16-bit FLAC
Comment（注释）        : 'Comment=Processed by SoX'

```

### 组合音频

SoX 还可以通过连接或混合音频文件来组合音频文件。

要连接（或者说*拼接*）文件合并为一个文件，请在命令中提供多个输入文件：

```
$ sox countdown.mp3 intro.ogg output.flac

```

在本例中，`output.flac` 现在包含 `countdown.mp3` 音频，紧接着是 `intro.ogg` 音乐。

但是，如果你希望两首曲目同时播放，可以使用 `--combine mix` 选项：

```
$ sox --combine mix countdown.mp3 intro.ogg output.flac

```

然而，想象一下，这两个输入文件的不同之处不仅仅在于它们的编解码器。人声音轨用单声道（一个声道）录制并不少见，但音乐至少要用立体声（至少两个声道）来录制。SoX 不会给出默认的解决方案，因此你必须首先自己标准化这两个文件的格式。

#### 更改音频文件

选项与后面列出文件名有关。例如，此命令中的 `--channels` 选项将*仅仅*应用于 `input.wav`，而*不被*应用于 `example.ogg` 和 **output.flac**：

```
$ sox --channels 2 input.wav example.ogg output.flac

```

这意味着在 SoX 中，选项的位置非常重要。如果你在命令开始时指定一个选项，那么实际上只会覆盖 SoX 自己从输入文件中收集的内容。然而，在*输出文件*名前的选项决定了 SoX 如何写入音频数据。

要解决前面的通道不兼容问题，你可以首先标准化输入，然后混合：

```
$ sox countdown.mp3 --channels 2 countdown-stereo.flac gain -1
$ soxi countdown-stereo.flac

Input File（输入文件）     : 'countdown-stereo.flac'
Channels（通道数）       : 2
Sample Rate（采样率）    : 44100
Precision（数据精度）      : 16-bit（16 比特）
Duration（时长）       : 00:00:11.18 = 493056 samples...（11.18 秒 = 493056 采样点）
File Size（文件大小）      : 545k
Bit Rate（比特率）       : 390k
Sample Encoding（编码格式）: 16-bit FLAC
Comment（注释）        : 'Comment=Processed by SoX'

$ sox --combine mix \
  countdown-stereo.flac \
  intro.ogg \
  output.flac

```

SoX 绝对需要多个命令来执行复杂的操作，因此根据需要创建几个临时和中间文件是正常的。

### 多通道音频

当然，并非所有音频都被限制在一个或两个声道。如果你想将多个音频通道组合成一个文件，可以使用 SoX 的 `--combine merge` 选项：

```
$ sox --combine merge countdown.mp3 intro.ogg output.flac
$ soxi output.flac

Input File     : 'output.flac'
Channels       : 3
[...]

```

### 简单的音频操作

在没有视觉界面的情况下操作音频似乎很奇怪，而且对于某些任务来说，SoX 绝对不是最好的工具。然而，对于许多任务，SoX 提供了一个简单而轻量级的工具包。SoX 是一个具有强大潜力的简单命令。有了它，你可以转换音频，操纵通道和波形，甚至生成自己的声音。本文仅简要概述了其功能，因此请阅读其手册页或 [在线文档](http://sox.sourceforge.net/sox.html)，然后看看你能创造什么。

---

via: <https://opensource.com/article/20/2/linux-sox>

作者：[Klaatu](https://opensource.com/users/klaatu) 选题：[lujun9972](https://github.com/lujun9972) 译者：[FYJNEVERFOLLOWS](https://github.com/FYJNEVERFOLLOWS) 校对：[wxy](https://github.com/wxy)

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


如何从 Ubuntu 21.10 及以后版本中删除 Firefox Snap

我选择不用Ubuntu，直接转回Debian

来自湖北武汉武汉大学测绘学院的 Firefox 106.0|Windows 7 用户

同楼上，直接逃去Debian了

来自广西南宁的 Chrome Mobile 107.0|Android 13 用户

同楼上，直接逃去Debian了

# 如何从 Ubuntu 21.10 及以后版本中删除 Firefox Snap

>
> Ubuntu 21.10 “Impish Indri” 及之后的版本将 Firefox Snap 设为默认浏览器。如果你不喜欢 Snap，可以通过以下方式将其删除并使用库存版本。
>
>
>

关于 Snap 是否是 APT 的更好替代品，一直存在争议。而许多用户更喜欢 Snap 系统，也有一些人非常讨厌它。Ubuntu 和 Canonical 认为它是 Linux 的最佳安装仓库和包管理工具之一。 Snap 被讨厌的主要原因是它的启动很慢。然而，这个论点是另一篇文章的内容。

### 从 Ubuntu 中删除 Firefox Snap 版本

所以，如果你还没有 [听说过这件事](https://bugs.launchpad.net/ubuntu/+source/ubuntu-release-upgrader/+bug/1943840)，Ubuntu 21.10（和所有后续版本）默认提供 Firefox Snap 包。因此，当你从 Ubuntu 21.10 开始安装时，默认的左侧停靠区的快捷方式是 Firefox 的 Snap 版本。你可以使用以下各种方法对其进行验证。

如果你因为 [性能](https://www.debugpoint.com/2021/03/clean-up-snap/) 和存储问题而不喜欢 Snap，可以通过以下命令将其删除。

如果已经打开，那么关闭所有 Firefox 实例。

打开一个终端。然后运行以下命令：

```
sudo snap remove firefox

```

等待命令完成。这将从你的系统中删除它的 Snap 可执行文件，并断开 Firefox 与各种系统服务的连接。但是主目录下的 Snap 目录仍然存在。你可以使用以下命令手动删除它：

```
cd ~/snap
rm -r firefox

```

### 安装 Firefox 替代方法

现在，当你删除了 Firefox，你可以通过以下方式来使用此浏览器。

#### 方法 1 – 使用 PPA（推荐）

在使用此方法之前，请确保如上删除了 Firefox 的 Snap 版本。

有一个 [官方 Firefox PPA](https://launchpad.net/~mozillateam/+archive/ubuntu/ppa)，由其开发团队维护。你可以将此 PPA 添加到你的软件源中，并使用它来安装最新的 Firefox。

确保使用文本编辑器创建一个首选项文件，以阻止 Ubuntu 在运行 `apt update` 命令时获取 Firefox 的 Snap 版本：

```
sudo gedit /etc/apt/preferences.d/firefox-no-snap

```

将以下行添加到上面的文件并保存：

```
Package: firefox*
Pin: release o=Ubuntu*
Pin-Priority: -1

```

依次使用以下命令。第一个命令将其从你的系统中完全清除它：

```
sudo apt purge firefox
sudo add-apt-repository ppa:mozillateam/firefox
sudo apt-get update
sudo apt install firefox

```

安装完成后，请确保使用以下命令启用自动升级：

```
echo 'Unattended-Upgrade::Allowed-Origins:: "LP-PPA-mozillateam:${distro_codename}";' | sudo tee /etc/apt/apt.conf.d/51unattended-upgrades-firefox

```

重启系统（可选）并使用 deb 版本的 Firefox。

#### 方法 2 – 使用 Firefox 的压缩可执行文件

你可以从官方网站（链接如下）下载适用于 Ubuntu 和其他 Linux 的 Firefox 可执行文件压缩包。然后解压并双击运行 Firefox 可执行文件。这是最安全的方法。如果你使用此方法，你仍然可以获得更新。

>
> **[下载 Firefox](https://www.mozilla.org/en-US/firefox/new/)**
>
>
>

#### 方法 3 – 使用 Flatpak 版本的 Firefox

你也可以使用 [Flatpak 版本的 Firefox](https://flathub.org/apps/details/org.mozilla.firefox)，这在 [Ubuntu 中设置 Flatpak](https://www.debugpoint.com/2018/07/how-to-install-flatpak-apps-ubuntu-linux/) 后可用。然后你可以运行以下命令进行安装：

```
flatpak install flathub org.mozilla.firefox

```

#### 方法 4 – 使用与系统耦合更少的 Snap 版本 Firefox

如果你认为你仍然可以继续使用 Snap 版本，但希望在系统中减少沙盒化，那么你可能需要使用以下命令和 [classic 开关](https://snapcraft.io/docs/snap-confinement) 重新安装 Firefox：

```
sudo snap install firefox --classic

```

### 结束语

因此，这是从 Ubuntu 21.10 开始删除 firefox Snap 版本的步骤，以及一些替代方案。我很想知道 Linux Mint 采取了什么措施，因为他们不支持 Snap。此外，这些发行版依赖于 Firefox 的 Ubuntu 上游仓库，看看它们会做什么很有趣。Debian 维护自己的仓库，但主要是 ESR 版本。

---

via: <https://www.debugpoint.com/remove-firefox-snap-ubuntu/>

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

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


我使用的 4 款开源编辑器

Summary: 分享一些我最喜欢的开源写作工具。

分享一些我最喜欢的开源写作工具。

# 我使用的 4 款开源编辑器

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

>
> 分享一些我最喜欢的开源写作工具。
>
>
>

在我的职业生涯中，我已经写过很多东西，主要是作为一名 IT 顾问，创建产品文档作为给的客户可交付成果。这些文档通常针对不同操作系统和软件产品提供说明。

自 2018 年，我开始在 [www.opensource.com](http://www.opensource.com) 上发表关于开源软件的文章。当然，我使用开源软件进行协作。接下来我将介绍我使用过的四款开源编辑器。

### 1、Vi

[Vi](https://opensource.com/article/20/12/vi-text-editor) 也被称为 `Vim`（LCTT 校注：此外不确，Vi 和 Vim 是两个软件，只是 Vim 取代了 Vi，并以 `vi` 的名字运行。），是我学习的第一款开源编辑器。这是我在计算机科学课程中学习的编辑器，并且我所有的 C 语言编程都是通过它完成的。自 1995 年以来，实际上我一直使用它作为命令行编辑器。这款工具有多个迭代版本，以至于我都可以为之写一系列文章了。我只想说，在我的日常使用中，我坚持使用它的基本命令行形式，并进行最小的定制。

### 2、LibreOffice Writer

Writer 是 LibreOffice 开源办公套件的一部分。它是由<ruby> 文档基金会 <rt>  Document Foundation </rt></ruby>维护的全功能文字处理器。它支持行业标准格式，例如开放文档格式 （ODF）、Open XML 和 MS Office DOC、DOCX。可以在其官方网站上 [了解有关 Writer 的更多信息](https://www.libreoffice.org/discover/writer/)。

### 3、Ghostwriter

Ghostwriter 是一个用于 [Markdown 的文本编辑器](https://opensource.com/article/21/10/markdown-editors)。它有一个很好的实时查看器和语法指南或备忘单功能。[访问官方网站](https://github.com/KDE/ghostwriter) 了解更多内容。

### 4、Gedit

Gedit 是许多 Linux 发行版中的基本图形编辑器，被描述为“用于 GNOME 桌面的小型轻量级文本编辑器”。我最近开始使用它来创建 Asciidoc 格式的文章。使用 Asciidoc 的好处是语法易于管理并可导入到 Drupal 等 Web 渲染系统中。通过 [Gedit Wiki](https://wiki.gnome.org/Apps/Gedit) 了解许多提示和技巧。

### 编辑文本

开源世界中有大量编辑软件。随着我继续写作，这个列表可能会增加。我的主要目标是格式简单。我希望我的文章易于在互联网平台上导入、转换和发布。

你的写作风格、功能需求和目标受众将指导你确定首选工具。

---

via: <https://opensource.com/article/22/10/open-source-editors>

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

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


硬核观察 #819 大众汽车制造了一辆时速 20 公里的《星际迷航》船长椅

Summary: • 大众汽车制造了一辆时速 20 公里的《星际迷航》船长椅 • 苹果自带的应用无视用户隐私设置 • 谷歌继续资助 GlobalFoundries 提供开源芯片免费制造服务

快进到集体诉讼美政府收集公民隐私，然后律师收集集体信息打官司，再快进到集体诉讼律师收集公民隐私, 然后律师收集集体信息打官司，再快进到集体诉讼律师收集公民隐私...

buff叠满，绕晕了

# 硬核观察 #819 大众汽车制造了一辆时速 20 公里的《星际迷航》船长椅

### 大众汽车制造了一辆时速 20 公里的《星际迷航》船长椅

挪威大众汽车公司声称已经制造了一把办公椅，它不仅看起来配得上《星际迷航》中的船长，而且还能用自己的五个轮子在办公室里行驶，速度高达每小时 20 公里。它的可更换电池可以行驶 12 公里。而且，它还有很多装备：360 度防撞传感器、“倒车”摄像头、带加热的刺绣座椅、派对灯、触摸屏显示器、USB 充电器、口袋式的“后备箱”，甚至还有拖车。

>
> **[消息来源：The Verge](https://www.theverge.com/2022/11/11/23453665/volkswagen-star-trek-office-chair-video)**
>
>
>

>
> 老王点评：也许只是营销噱头，如果是真的，就可以买来在办公室开车了~
>
>
>

### 苹果自带的应用无视用户隐私设置

有专家发现苹果应用商店向该公司发送用户在应用中的几乎所有信息，尽管 iPhone 的隐私设置声称在关闭时 “完全禁用设备分析的共享”。研究人员发现，这个问题在苹果的大部分内置 iPhone 应用套件中都存在。测试发现，苹果在收到这些数据的同时，还能识别你和你的设备，包括 ID、手机类型、联网方式等等。有用户已经于周四在加州联邦法院提起集体诉讼。

>
> **[消息来源：Gizmodo](https://gizmodo.com/apple-iphone-privacy-analytics-class-action-suit-1849774313)**
>
>
>

>
> 老王点评：果然规矩都是给别人定的。
>
>
>

### 谷歌继续资助 GlobalFoundries 提供开源芯片免费制造服务

谷歌资助 GlobalFoundries，为开源项目开放了资源并承担了费用，在 130 纳米工艺上制造其早期芯片，并计划将升级到 90 纳米工艺。他们已经为 350 个独特的芯片设计提供了实现，其中约 240 个得以成功制造。

>
> **[消息来源：phoronix](https://www.phoronix.com/news/Google-GloFo-Sponsored-Si)**
>
>
>

>
> 老王点评：这才是气魄啊。
>
>
>


如何提高 Ubuntu 和其他 Linux 系统中的扬声器音量

ubuntu每次开机都无法识别已经插好的耳机，还要拔出再插才能识别

# 如何提高 Ubuntu 和其他 Linux 系统中的扬声器音量

>
> 以下是如何在 Ubuntu 和其他 Linux 发行版中提高笔记本和桌面的音量的方法。
>
>
>

你有没有觉得你的 Ubuntu 笔记本的音量太小，尽管你把音量调到了 100%？我相信你有过。主要原因是：很明显，笔记本电脑的扬声器输出强度比大型扬声器要低。

此外，Ubuntu 和其他发行版将默认的最大音量设置为 100%，也就是 0dB（分贝）。0dB 是最大音量的参考值。做个比较，如果你把音量设置为 -10dB，这意味着你的音量比最大的 0dB 安静。

VLC 和一些媒体播放器允许你将音量提高到 200%。在最新的 Ubuntu 中使用一些设置，你可以将音量进一步提高。

>
> **注意**：在你尝试和使用以下方法之前，请记住，每个扬声器都有其制造商设定的硬件限制。偶尔一次，播放超过 100% 的音频是可以的。但是，连续放大到更高的分贝可能会使输出的音频失真，并且从长远来看可能会损坏你的扬声器。因此，在使用时要小心谨慎，并有所限制。
>
>
>

### 在 Ubuntu 和其他发行版中提高扬声器音量

#### 对于最新的 Ubuntu 22.04 及以上版本（GNOME）

从应用菜单中打开“<ruby> 设置 <rt>  Settings </rt></ruby>”，进入“<ruby> 声音 <rt>  Sound </rt></ruby>”标签。

启用 “<ruby> 过度放大 <rt>  Over Amplification </rt></ruby>” 开关。在你启用的那一刻，你应该看到音量条被扩大了。

现在你可以享受音量提升来听音乐了。

#### Fedora、Arch Linux 和其他发行版

如果你使用带有 GNOME 的 Fedora 工作站，你将看不到上述选项，因为这是 Ubuntu 特有的设置。见下面。

因此，对于任何其他 Linux 发行版（Arch、Fedora、RedHat 等）或桌面（KDE、Xfce、LXQt 等），打开终端并安装 [PulseAudio 音量控制器](https://freedesktop.org/software/pulseaudio/pavucontrol/)。

Fedora、RedHat Linux、OpenSUSE 等基于 RPM 的发行版：

```
sudo dnf install pavucontrol

```

对于 Arch Linux、Manjaro：

```
sudo pacman -S pavucontrol

```

基于 Ubuntu 的非 GNOME 发行版：

```
sudo apt install pavucontrol

```

### 如何使用

安装后，从应用菜单中打开 `pavucontrol`，它应该有个 “PulseAudio Volume Control” 菜单项。

### 总结

记住，上述方法可以提高整个系统的扬声器音量。这意味着系统的声音和警报也会受到影响。所以，要记住这一点。正如我前面提到的，如果连续使用，提升扬声器音量超过 100% 可能会导致扬声器变形或损坏。

我希望这个教程能帮助你提高系统音量。如果你遇到问题，请在评论栏里告诉我。

---

via: <https://www.debugpoint.com/boost-speaker-volume-ubuntu/>

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

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


13 个从头开始构建的独立 Linux 发行版

Summary: 在这篇文章当中，我们将列出一些优秀的独立 Linux 发行版。

在这篇文章当中，我们将列出一些优秀的独立 Linux 发行版。

# 13 个从头开始构建的独立 Linux 发行版

时至今日，世界上已经有成百上千种不同的 Linux 发行版。

它们中的大多数都可以被划归为三个大类 : Debian、Red Hat（Fedora）以及 Arch Linux。

使用基于 Debian/Ubuntu、Red Hat/SUSE 或者 Arch 的 Linux 发行版自然有它们的优势。它们很受大众欢迎，因此它们的包管理器能够提供大量的软件包。

然而，有一些用户更倾向于使用从头开始构建、独立于 DEB/RPM 这类包管理系统之外的发行版。

在这篇文章当中，我们将列出一些优秀的独立 Linux 发行版。

>
> **注意 :** 显然，下面的列表显然不会包括一些广受欢迎，通常作为创建新发行版的基础的发行版，如 Debian、Ubuntu 和 Fedora 等。此外，列表顺序不分先后，没有特定的排名。
>
>
>

### 1、NixOS

NixOS 最初发布于 2003 年，NixOS 建立在 Nix 包管理器之上。它每年发布两个版本，通常是在 5 月和 11 月。

NixOS 可能不是一个直接面向新用户或普通用户的发行版。然而，其独特的 [包管理](https://itsfoss.com/package-manager/) 方法吸引了各种用户。

此外，它仍然支持 32 位系统。

其他特性：

* 构建隔离的包
* 可靠的升级，并且具有回滚功能
* 可重现的系统配置

>
> **[NixOS](https://nixos.org/)**
>
>
>

### 2、Gentoo Linux

Geetoo Linux 是一个主要针对操作系统专家的独立 Linux 发行版。它是为那些希望自由定制、微调和优化操作系统以满足其要求的用户而构建。

Gentoo 使用 [Portage 包管理器](https://wiki.gentoo.org/wiki/Portage) 来创建和安装软件包，通常还允许你针对你的硬件来优化它们。Chrome 的开源版本 **Chromium OS** 便是使用 Gentoo 作为其核心的。

不要忘记，Gentoo 是 [仍然支持 32 位架构的发行版](https://itsfoss.com/32-bit-linux-distributions/) 之一。

其他特性：

* 增量更新
* 基于源码的软件管理方法
* 支持 GURU（Gentoo 用户仓库）的<ruby> 层叠 <rt>  Overlay </rt></ruby>仓库的概念，允许用户添加 Gentoo 尚未提供的软件包

>
> **[Gentoo Linux](https://www.gentoo.org/)**
>
>
>

### 3、Void Linux

Void Linux 是一个 [滚动发布的发行版](https://itsfoss.com/rolling-release/)，使用 X 二进制软件包系统（XBPS）来安装和删除软件。它由前 NetBSD 开发者 Juan Romero Pardines 创建。

它使用 runit 而不是 systemd 作为其初始化系统。此外，它还让你可以选择使用多个 [桌面环境](https://itsfoss.com/best-linux-desktop-environments/)。

其他特性：

* 最小化的系统要求
* 官方库也提供非自由软件包
* 支持树莓派
* 集成 OpenBSD 的 LibreSSL
* 支持 musl C 库
* 支持 32 位系统

>
> **[Void Linux](https://voidlinux.org/)**
>
>
>

### 4、Solus Linux

Solus 的前身是 EvolveOS，它从头开始构建并提供了一些令人兴奋的特性。Solus 的旗舰版本使用自己打造的 Budgie 作为桌面环境。

与本篇文章介绍的其他系统相比，Solus 对于新手较为友好。它设法成为 [最好的 Linux 发行版](https://itsfoss.com/best-linux-distributions/) 之一。

它使用 eopkg 作为其包管理系统，支持版滚动发布模型。按照开发人员的说法，开发 Solus 的目标是用于个人电脑。

其他特性：

* 支持 Budgie、Gnome、MATE 和 KDE Plasma
* 各种开箱即用的软件，从而减少设置工作

>
> **[Solus Linux](https://getsol.us/home/)**
>
>
>

### 5、Mageia

Mageia 始于 2010 年，它是 Mandriva Linux 的一个分支。它的目标是成为稳定且安全的桌面和服务器操作系统。

Mageia 是一个社区驱动的项目，由非营利组织和贡献者支持。每年会发布一个大版本。

其他特性：

* 支持 32 位系统
* 支持 KDE Plasma、Gnome 和 XFCE
* 最低的系统要求

>
> **[Mageia](https://www.mageia.org/en/)**
>
>
>

### 6、Clear Linux

Clear Linux 是一个由英特尔发布的发行版，主要设计考虑是性能和云服务的使用。

有趣的是，Clear Linux 升级时是作为一个整体而非去升级单个的软件包。所以，即使你不小心弄乱了系统设置，它也可以正确的启动，执行恢复出厂设置，并让用户重新设置。

它不太适合个人用户使用。但可以作为一个独特的选择而尝试一下。

其他特性：

* 针对英特尔平台的高度调优
* 用户和系统文件之间严格分离
* 持续的漏洞扫描

>
> **[Clear Linux OS](https://clearlinux.org/)**
>
>
>

### 7、PCLinuxOS

PCLinuxOS 是一个 x86\_64 的 Linux 发行版，使用 APT/RPM 包管理。你可以使用 KDE Plasma、Mate 以及 XFCE 桌面，它同时还提供了更多特性的社区版本的桌面。

得益于 [Synaptic 包管理器](https://itsfoss.com/synaptic-package-manager/)，本地安装的 PCLinuxOS 采用了 APT 包管理系统。但你也可以从它的仓库中找到 RPM 包。

其他特性：

* mylivecd 脚本允许用户去生成一个当前已安装的硬件驱动的“快照”（所有的配置、应用、文档等）并且将它压缩为 ISO CD/DVD/USB 镜像
* 额外支持超过 85 种语言

>
> **[PCLinuxOS](https://www.pclinuxos.com/)**
>
>
>

### 8、4MLinux

[4MLinux](https://itsfoss.com/4mlinux-review/) 是一个通用的 Linux 发行版，重点聚焦于下面四个 **“M”**

* <ruby> 维护 <rt>  Maintenance </rt></ruby>（系统救援 Live CD）
* <ruby> 多媒体 <rt>  Multimedia </rt></ruby>（支持大量的图形、音频和视频格式）
* <ruby> 微服务器 <rt>  Miniserver </rt></ruby>（支持 DNS、FTP、HTTP、MySQL、NFS、Proxy、SMTP、SSH 和 Telnet）
* <ruby> 神秘 <rt>  Mystery </rt></ruby>（包含了经典 Linux 游戏的集合）

它具有最低的系统要求，可作为桌面和服务器版本使用.

其他特性：

* 支持大量的图形、音频和视频格式
* 是小型并且通用的 Linux 发行版

>
> **[4MLinux](http://4mlinux.com/)**
>
>
>

### 9、Tiny Core Linux

Tiny Core Linux 专注于使用 BusyBox 和 FLTK 提供一个基础的系统。它不是一个完备的桌面，所以，并不能保证它可以运行于任何系统。

它只是一个启动到非常精简的 X 桌面所需的核心，通常带有有线互联网访问权限。

用户可以很好的控制一切，但对于新 Linux 用户来说，它并不是一个轻松的开箱即用的系统。

其他特性：

* 旨在从启动时创建的内存副本中运行
* 默认情况下，其操作就像像云端 / 互联网客户端一样
* 用户可以使用 appbrowser 来游览库以及下载应用

>
> **[Tiny Core Linux](http://www.tinycorelinux.net/)**
>
>
>

### 10、Linux From Scratch（LFS）

Linux From Scratch（LFS）并不是一个系统，而是通过手动构建所有组件来安装 Linux 的一种方法。一旦完成，它提供了一个紧凑、灵活和安全的系统，并且可以很好的理解一个基于 Linux 的操作系统内部是如何工作的。

如果你希望去深入理解 Linux 是如何工作的并且探寻其具体细节，那么 Linux From Scratch（LFS） 是你一定要去尝试，不能错过的一个项目。

其他特性

* 完全从头开始，定制化的构建 Linux 系统
* 极度的灵活性
* 由于从源码开始编译，提供了额外的安全性

>
> **[Linux From Scratch](https://www.linuxfromscratch.org/)**
>
>
>

### 11、Slackware

Slackware 是现今还在维护的最古老的发行版。最初创建于 1993 年，以 Softlanding Linux 系统为基础，随后，许多的 Linux 发行版都是基于 Slackware。

Slackware 目标是称为最类似于 UNIX 的 Linux 发行版，同时保持简单和稳定。

其他特性：

* 支持 32 位和 64 位系统
* 大量的在线文档
* 从奔腾处理器到最新的机器，它都可以运行

>
> **[Slackware](http://www.slackware.com/)**
>
>
>

### 12、Alpine Linux

Alpine Linux 是一个社区开发的操作系统，专为路由器、防火墙、VPN、VoIP 盒子和服务器而设计。它是 LEAF 项目的一个分支。

Alpine Linux 使用 apk-tools 包管理器，最初由 shell 脚本编写，而后使用 c 语言重构。它是最小的 Linux 发行版之一，仍然支持 32 位系统，并且是一个可以完全从电脑内存运行的操作系统。

其他特性：

* 提供大小仅为 5MB 的最小容器镜像
* 对于主库，提供 2 年的支持；对于社区库，在下一个稳定版本发布前提供支持
* 使用 musl libc 制作，Busybox 使用资源效率高的容器

>
> **[Alpine Linux](https://www.alpinelinux.org/)**
>
>
>

### 13、KaOS

KaOS 是一个受到 Arch 启发，从头开始构建的 Linux 发行版。它使用 [pacman 包管理器](https://itsfoss.com/pacman-command/)。它是按照"*一个桌面环境（KDE Plasma），一个工具包（Qt），一个架构（X86\_64）*"的理念构建的。

它的软件库比较有限，但依然为普通用户提供了许多工具。

其他特性：

* 最新的 Plasma 桌面
* 紧密集成的滚动和透明的现代桌面发行版

>
> **[KaOS](https://kaosx.us/)**
>
>
>

### 总结

如果你需要一些独特的体验，那么这些独立 Linux 发行版应该能很好的满足你。

然而，如果你想要用其来替换如 Ubuntu 这样主流的 Linux 发行版作为你的桌面系统……你也许需要三思而后行，上面大多数的发行版（并不代表所有）都不是一个日常使用的桌面系统的理想的选项。

但是话又说回来，如果你对 Linux 发行版充满了经验，那么毫无疑问，你会享受这项冒险的任务的。

*如果你想尝试这些独立发行版的其中一种，哪一个会是你的优先选择呢 ? 请在评论中与我们分享。*

---

via: <https://itsfoss.com/independent-linux-distros/>

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

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


硬核观察 #820 英伟达采用形式验证来验证软件安全性

Summary: • 英伟达采用形式验证来验证软件安全性 • JavaScript、Java、Python、Kotlin 和 Rust 开发者增长惊人 • 密码学家建议考虑非晶格的后量子密码算法

# 硬核观察 #820 英伟达采用形式验证来验证软件安全性

### 英伟达采用形式验证来验证软件安全性

英伟达软件安全副总裁说，“面向测试的软件验证对安全来说根本不起作用，你可以对提供给用户的功能的质量有一个衡量标准，但对于安全问题，就没有什么作用，……很难知道你是否已经完成了。”幸运的是，有可能用数学方法证明你的代码的行为与它的规范精确一致。这个过程被称为“形式验证”。英伟达采用软件形式验证行业解决方案 SPARK 来证明软件的安全性。在几年前进行过概念验证后，现在许多英伟达产品在使用 SPARK 组件发布。

>
> **[消息来源：AdaCore](https://blog.adacore.com/nvidia-security-team-what-if-we-just-stopped-using-c)**
>
>
>

>
> 老王点评：形式验证是个好方法，但是不是那么容易掌握和推行。
>
>
>

### JavaScript、Java、Python、Kotlin 和 Rust 开发者增长惊人

根据 SlashData 去年夏天从 163 个国家的 26000 多名开发者调查统计而成的第 23 期《开发者国家报告》，JavaScript 仍然是最大的编程语言社区，全球估计有 1960 万开发者每天都在使用 JavaScript；在过去的两年里，Java 社区的规模已经从 830 万增加到 1650 万，而同期开发者只增加了 50%；Python 在过去两年中增加了约 800 万新的开发人员；Kotlin 和 Rust 社区的规模在过去两年里都翻了一番。

>
> **[消息来源：ZDNet](https://www.zdnet.com/article/software-development-is-evolving-and-so-is-what-developers-are-interested-in/)**
>
>
>

>
> 老王点评：开发人员越来越倾向于使用主流开发工具，所以流行的越发流行，但是这样就会扼杀一些创新。
>
>
>

### 密码学家建议考虑非晶格的后量子密码算法

目前许多密码学系统的安全性是基于大数的因数分解的，但因数分解的一个怪癖使其容易受到量子计算机的攻击。因此人们对上世纪 90 年代提出的“晶格密码学”寄予厚望，美国 NIST 选择的四个后量子密码学标准有三个采用晶格密码学。RSA 算法名称中的 S，Adi Shamir 对此表示担忧，“从某种意义上说，我们是把所有鸡蛋放在同一个篮子里”。今年夏天早些时候，一个有前途的后量子密码学方案不是用量子计算机，而是用一台普通的笔记本电脑破解的。

>
> **[消息来源：Slashdot](https://it.slashdot.org/story/22/11/13/2042250/cryptographys-future-will-be-quantum-safe-heres-how)**
>
>
>

>
> 老王点评：确实如此，只有一种抗量子的密码理论，很难说会不会被发现潜在的弱点。
>
>
>


如何在没有互联网连接的情况下离线更新 Ubuntu

Summary: 本指南介绍了如何在没有互联网连接的情况下离线更新 Ubuntu 的步骤。

本指南介绍了如何在没有互联网连接的情况下离线更新 Ubuntu 的步骤。

# 如何在没有互联网连接的情况下离线更新 Ubuntu

>
> 本指南介绍了如何在没有互联网连接的情况下离线更新 Ubuntu 的步骤。
>
>
>

在很多情况下，你可能需要在没有互联网连接的情况下更新你的 Ubuntu 系统。你可能在外地不方便上网，也可能你需要更新一堆未联网的 Ubuntu，不管是哪种情况，保持你的系统更新最新的软件包总是需要的。

当然，始终建议通过联网来更新系统。

但有时，出于安全考虑，这是不行的。连接到互联网可能需要给你的系统进行额外的加固，以保护它们免受黑客和恶意软件的攻击。

以下的方法使用 [apt-offline](https://github.com/rickysarraf/apt-offline) 来解决这些问题，并概述了在没有互联网的情况下离线更新 Ubuntu 的步骤。

### 准备环节

* 一台能连接到网络的 Ubuntu（你朋友的、咖啡馆、实验室系统）
* 存储了软件包的 U 盘
* 两个系统都安装了 `apt-offline`：一个系统离线，另一个系统联网

### 安装 apt-offline

在两个系统下安装 `apt-offline`。你可以使用以下命令安装：

```
sudo apt install apt-offline

```

如果你想在离线的目标系统安装 `apt-offline`，你可以提前下载到 U 盘里，然后复制到目标系统，再使用下面的命令安装。

Ubuntu 22.04 LTS 和其他版本的下载链接如下所示。你可以选择一个镜像并下载 deb 文件。

>
> **[下载 .deb 文件 – apt-offline](https://packages.ubuntu.com/focal/all/apt-offline/download)**
>
>
>

```
sudo dpkg -i name_of_package.deb

```

### 如何更新 Ubuntu

在离线的目标系统上打开终端，使用以下命令创建一个 .sig 签名文件：

```
sudo apt-offline set ~/offline-data.sig

```

在这个刚创建的签名文件中，包含下载所需的软件包的路径和详细信息。

把签名文件复制到 U 盘中，再插到联网的 Ubuntu 系统上。

在联网的 Ubuntu 上创建一个目录（参见下面）来存放这些文件。

打开一个终端，运行以下命令来下载所需的软件包。记得根据你的系统，更改下载目录和 .sig 签名文件的路径。

```
apt-offline get -d ~/offline-data-dir offline-data.sig

```

你可以看到文件相应下载，然后复制整个下载目录到 U 盘，再插到离线的 Ubuntu 系统。

运行以下命令将下载的软件包安装到离线系统，记得根据你的系统更改目录路径。

```
sudo apt-offline install offline-data-dir/

```

如果一切顺利，你将获得一个更新完的 Ubuntu。

重复以上步骤，就可以保持你的离线 Ubuntu 为最新版本。

希望以上教程能帮到你更新离线的 Ubuntu 系统，如果你遇到任何问题，请在下面的评论框中告诉我。

---

via: <https://www.debugpoint.com/how-to-update-or-upgrade-ubuntu-offline-without-internet/>

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

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


为什么有时候域名的末尾有个点？

Summary: 但是为什么末尾的点是有用且重要的呢？

为什么后缀名前有一点并且很重要呢？因为没人关心它

点应该是表示根域，然后是一级子域名（例如 .com), 再是子域名（例如 example), 最后是主机名(例如 www). root -> com -> example -> www

但是为什么末尾的点是有用且重要的呢？

# 为什么有时候域名的末尾有个点？

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

大家好！今年早些时候，我在写《[DNS 是如何工作的](https://wizardzines.com/zines/dns/)》 时，有人问我——为什么人们有时在域名的末尾加一个点？例如，如果你通过运行 `dig example.com` 查询 `example.com` 的 IP，你会看到一下内容：

```
$ dig example.com
example.com.        5678    IN  A   93.184.216.34

```

执行完 `dig` 命令后，`example.com` 有一个 `.` ——变成了 `example.com.`！发生了什么？

有些 DNS 工具也要求传给它的域名后加一个 `.`：如果你在使用 [miekg/dns](https://github.com/miekg/dns) 时传给它 `example.com`，它会报错：

```
// trying to send this message will return an error
m := new(dns.Msg)
m.SetQuestion("example.com", dns.TypeA)

```

最初我以为我知道这个问题的答案（“呃，末尾的点意味着域名是完全限定的？”）。这是对的 —— 一个<ruby> 完全限定域名 <rt>  fully qualified domain name </rt></ruby>（FQDN）是一个末尾有 `.` 的域名！

但是*为什么*末尾的点是有用且重要的呢？

### 在 DNS 的请求/响应中，域名的末尾并没有 “.”

我曾经（错误地）认为 “为什么末尾有一个点？”的答案可能是 “在 DNS 请求/响应中，域名末尾有一个 `.`，所以我们把它放进去，以匹配你的计算机实际发送/接收的内容”。但事实并不是这样！

当计算机发送 DNS 请求/响应时，域名的末尾并没有点。实际上，域名中*没有*点。

域名会被编码成一系列的长度/字符串对。例如，域名 `example.com` 被编码为这 13 个字节。

```
7example3com0

```

编码后的内容一个点也没有。一个 ASCII 域名（如 `example.com`）被转成了各种 DNS 软件的 DNS 请求/响应中使用的格式。

今天我们来讨论域名被转成 DNS 响应的一个地方：区域文件。

### 区域文件中域名末尾的 “.”

一些人管理域名的 DNS 记录的方法是创建一个被称为 “区域文件” 的文本文件，然后配置一些 DNS 服务器软件（如 `nsd` 或 `bind`）来为该区域文件中指定的 DNS 记录提供服务。

下面是一个对应 `example.com` 的示例区域文件：

```
orange  300   IN    A     1.2.3.4
fruit   300   IN    CNAME orange
grape   3000  IN    CNAME example.com.

```

在这个文件中，任何不以 `.` 结尾的域名（比如 `orange`）后都会自动加上 `.example.com`。所以 `orange` 成了 `orange.example.com` 的简称。DNS 服务器从它的配置中得知这是一个 `example.com` 的区域文件，所以它知道在所有不以点结尾的名字后面自动添加 `example.com`。

我想这里的想法只是为了少打几个字符——如果要打出全称，区域文件会是这样：

```
    orange.example.com.  300   IN    A     1.2.3.4
    fruit.example.com.   300   IN    CNAME orange.example.com.
    grape.example.com.   3000  IN    CNAME example.com.

```

确实多了很多字符。

### 你也可以不通过区域文件来使用 DNS

尽管官方的 DNS RFC（[RFC 1035](https://www.rfc-editor.org/rfc/rfc1035#section-4.1.1)）中定义了区域文件格式，但你也可以不通过区域文件来使用 DNS。例如，AWS Route 53 就不用区域文件来存储 DNS 记录！你可以通过 Web 界面或 API 来创建记录，我猜他们是用某种数据库而不是一堆文本文件来存储记录。

不过，Route 53（像许多其他 DNS 工具一样）确实支持导入和导出区域文件，这个功能或许在你更换 DNS 提供商时很有用。

### dig 命令输出中末尾的 “.”

现在我们来讨论下 `dig` 命令的输出：

```
$ dig example.com
; <<>> DiG 9.18.1-1ubuntu1.1-Ubuntu <<>> +all example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10712
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;example.com.           IN  A

;; ANSWER SECTION:
example.com.        81239   IN  A   93.184.216.34

```

有一件奇怪的事是，几乎每一行都以 `;;` 开头，这是怎么回事？`;` 是区域文件中的注释字符！

我想 `dig` 以这种奇怪的方式输出的原因可能是为了方便你粘贴这些内容到区域文件时，不用修改就可以直接用。

这也是 `example.com` 末尾有个 `.` 的原因 —— 区域文件要求域名末尾必须有点（否则它们会被解释为是相对于该区域的）。因此 `dig` 也这么处理了。

我真的希望 dig 有一个 `+human` 选项，以更人性化的方式打印出这些信息，但现在我太懒了，懒得花工夫去实际贡献代码来做这件事（而且我并不擅长 C），所以我只能在我的博客上抱怨一下 :smiley:

### curl 命令输出中末尾的 “.”

我们来看下另一个末尾有 `.` 的例子：`curl`！

我家里有台计算机名为 `grapefruit`，其上运行着 Web 服务器。当我执行 `curl grapefruit` 时，会输出：

```
$ curl grapefruit
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
......

```

这样运行没问题！但是如果我在域名后加一个 `.` 会怎样呢？它报错了：

```
$ curl grapefruit.
curl: (6) Could not resolve host: grapefruit.

```

发生了什么？为了搞清楚，我们需要先来学习下搜索域：

### 初识搜索域

当我执行 `curl grapefrult` 时，它是怎么被转成一个 DNS 请求的？你可能会认为我的计算机会向域名 `grapefruit` 发送一个请求，对吗？但事实并不是这样。

让我们用 `tcpdump` 来看看到底是什么域名在被查询。

```
$ sudo tcpdump -i any port 53
[...] A? grapefruit.lan. (32)

```

实际上是向 `grapefruit.lan.` 发送的请求。为什么呢？

解释一下：

1. `curl` 调用函数 `getaddrinfo` 来查询 `grapefruit`
2. `getaddrinfo` 查询了我计算机上的文件 `/etc/resolv.conf`
3. `/etc/resolv.conf` 包含两行内容：

```
nameserver 127.0.0.53
search lan

```
4. 因为有 `search lan` 这行内容，所以 `getaddrinfo` 在 `grapefruit` 的末尾添加了一个 `lan`，去查询 `grapefruit.lan`

### 什么时候搜索域被使用?

现在我们知道了一些奇怪的事情：当我们查询一个域名时，有时会有一个额外的东西（如 `lan`）被加到最后。但是什么时候会发生这种情况呢？

1. 如果我们在域名**末尾**添加一个 `.`，那么这时不会用到搜索域
2. 如果域名**中间包含**一个 `.`（如 `example.com`），那么默认也不会用到搜索域。但是可以通过修改配置来改变处理逻辑（在 [ndots](https://pracucci.com/kubernetes-dns-resolution-ndots-options-and-why-it-may-affect-application-performances.html) 里有更详细的说明）

我们现在知道了 `curl grapefruit.` 与 `curl grapefruit` 结果不一样的原因——因为一个查询的是 `grapefruit.`，而另一个查询的是 `grapefruit.lan.`。

### 我的计算机怎么知道使用哪个搜索域呢？

当我连接路由时，它会通过 DHCP 告诉我它的搜索域是 `lan` —— 它也是通过这个方式给我的计算机分配 IP。

### 所以为什么要在域名末尾加一个点呢？

现在我们已经了解了区域文件和搜索域，下面是我认为的人们要在域名末尾加点的原因：

有两种情况下，域名会被修改，并在末尾添加其他东西。

* 在 `example.com` 的区域文件中，`grapefruit` 会被转为 `grapefruit.example.com`
* 在我的本地网络（我的计算机已经配置了使用搜索域 `lan`），`grapefruit` 被转为 `grapefruit.lan`

因此，由于域名在某些情况下实际上可能被转成其他名字，人们就在结尾处加一个 `.`，以此来表示 “**这是域名，末尾不需要添加任何东西，这就是全部内容**”。否则会引起混乱。

“这就是全部内容”的技术术语是\*\*“完全限定域名”**，简称为**“FQDN”\*\*。所以 `google.com.` 是一个完全限定域名，而 `google.com` 不是。

我总是要提醒自己这样做的原因，因为我很少使用区域文件和搜索域，所以我经常觉得——“我当然是指 `google.com` 而不是 `google.com.something.else`! 我为什么要指其他东西？那太傻了！”

但是有些人确实在使用区域文件和搜索域（例如 Kubernetes 中使用了搜索域！），所以结尾的 `.` 很有用，可以让人确切的知道，不应该再添加其他东西。

### 什么时候在末尾添加 “.”？

以下是关于何时在域名末尾加 ". " 的几个简单说明：

**需要添加：配置 DNS 时**

在配置 DNS 时，使用完全限定域名从来都不是坏事。你不一定要这样做：非完全限定域名通常也能正常工作，但我从来没有遇到过不接受完全限定域名的 DNS 软件。

有些 DNS 软件需要这样做：现在我为 `jvns.ca` 使用的 DNS 服务器让我在域名的末尾加上 `.`（例如在 CNAME 记录中），并提示如果我不添加，它将在我输入的内容末尾加上 `.jvns.ca`。我不同意这个设计决定，但这不是什么大问题，我只是在最后加一个 `.`。

**不需要加：在浏览器中**

令人困惑的是，在浏览器中，在域名结尾处加一个 `.` *不能*正常运行。例如，如果我在浏览器中输入 `https://twitter.com.`，它就会报错。它会返回 404。

我认为这里发生的事情是，它将 HTTP `Host` 标头设置为 `Host：twitter.com.`，而对端的 Web 服务器则期望 `Host：twitter.com`。

同样地，`https://jvns.ca.` 由于某种原因，返回了一个 SSL 错误。

### 我认为相对域名在过去是比较常见的

最后一件事：我认为“相对”域名（比如我用 `grapefruit` 来指代我家的另一台计算机 `grapefruit.lan`）在过去更常用，因为 DNS 是在大学或其他有大型内部网络的大机构中开发的。

在今天的互联网上，使用“绝对”域名（如 `example.com`）似乎更为普遍。

---

via: <https://jvns.ca/blog/2022/09/12/why-do-domain-names-end-with-a-dot-/>

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

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


硬核观察 #821 手写代码导致美国宇航局的水手号探测器失败

Summary: • 手写代码导致美国宇航局的水手号探测器失败 • 一个简单的安卓锁屏漏洞获得了 7 万美元 • 英特尔推出深度伪造实时检测工具

快进到以入侵计算机罪名被谷歌起诉，索赔7万美元

# 硬核观察 #821 手写代码导致美国宇航局的水手号探测器失败

### 手写代码导致美国宇航局的水手号探测器失败

1962 年夏天，美国宇航局启动了水手 1 号任务，这是一项无人驾驶的任务，该装置将飞过金星并探测数据。当时的工程师通常在纸上写出他们的代码。然后这些代码通过一个复杂的系统被翻译成计算机可读的卡片，然后通过计算机执行该程序。这种手工使得意外错误率变得很高。缺失的符号与字符最终导致了水手 1 号任务的彻底失败。这次任务在当时花费了大约 1800 万美元，相当于今天的 1.5 亿美元。

>
> **[消息来源：Slash Gear](https://www.slashgear.com/1101785/this-simple-programing-error-cost-nasa-18-million/)**
>
>
>

>
> 老王点评：计算机发展早期，不说流程，就是工具也很简陋。但是就是这样，也送上天那么多飞行器。
>
>
>

### 一个简单的安卓锁屏漏洞获得了 7 万美元

研究人员发现，任何能拿到谷歌 Pixel 手机的人都可以通过换上自己的 SIM 卡，并输入预设的恢复代码，从而绕过安卓操作系统的锁屏保护。这个漏洞的利用非常简单，但谷歌花了大约五个月的时间来修复。谷歌为此向他支付了 7 万美元的奖金。

>
> **[消息来源：Tech Crunch](https://techcrunch.com/2022/11/14/android-lock-screen-bypass-google-pixel/)**
>
>
>

>
> 老王点评：看似这个钱挣的容易，但是实际上研究人员投入了大量精力才可能遇到这样一块“狗头金”。
>
>
>

### 英特尔推出深度伪造实时检测工具

深度伪造视频现在无处不在，你可能见过名人做或说他们实际上从未做过的事情的视频。英特尔开发了 FakeCatcher，这项技术能够以 96% 的准确率检测虚假人脸视频。这是世界上第一个实时深度伪造检测器，它可以在几毫秒内返回结果。该工具是通过检测视频像素中微妙的“血流”信号，在真实视频中寻找真实的线索。当心脏泵血时，人的静脉会改变颜色，这些血流信号是可以从面部各处收集的，算法将这些信号翻译成时空图。然后，利用深度学习，就可以立即检测出一个视频是真的还是假的。

>
> **[消息来源：PC Gamer](https://www.pcgamer.com/intels-fakecatcher-tech-can-detect-deepfakes-instantly-with-96-accuracy/)**
>
>
>

>
> 老王点评：果然魔高一尺，道高一丈。不过我想深度伪造可能很快就会学会添加血流信号。
>
>
>


如何在 Linux 中确定运行的是那种初始化系统

# 如何在 Linux 中确定运行的是那种初始化系统

>
> 你可以通过以下方式确定你的 Linux 发行版中是否正在运行 systemd 或其它初始化系统。
>
>
>

首个进程在你启动 Linux 发行版时开始运行，它称为初始化进程 init（<ruby> 初始化 <rt>  initialization </rt></ruby>的缩写）。它的进程标识符为 1（即 pid=1）。基于 Unix 的系统中的所有进程和应用程序都是这个初始化进程的后代。

根据功能和特性，存在不同类型的初始化进程。例如，[systemd](https://www.debugpoint.com/tag/systemd)、Runit、OpenRC、sysVinit 等。其中，systemd 是最流行和最现代的一种，被包括 Ubuntu 和 Fedora 在内的所有现代 Linux 发行版使用和采用。

与传统的基于 Unix 的初始化系统相比，systemd 及其性能一直存在争议。但这就是另外一个话题了。

让我们看看如何确定在 Linux 发行版中运行的是 systemd 还是其它初始化系统。

### systemd 还是其它初始化系统？

不幸的是，没有直接的命令可以找到它。你可以从初始化进程追溯它，它基本上是到 `/sbin/init` 的符号链接，即 pid=1。

使用 [strings](https://linux.die.net/man/1/strings) 命令打印嵌入在二进制文件 `/sbin/init` 中的文本并使用以下命令搜索 `init`：

```
strings /sbin/init | grep init

```

#### 示例 1

在下面的输出中，它是一个运行 Debian（Peppermint OS）的 sysVinit 系统。如你所见，它清楚地显示了 `init` 进程名称。

```
strings /sbin/init | grep init

```

如果在上述同一个系统中找 `systemd`，那么不会有任何结果。因此，你可以得出结论，你正在运行 sysVinit 而不是 systemd。

#### 示例 2

如果你在 systemd 系统中运行上述命令，你可以在输出的第一行轻松看到 systemd 及其版本。

```
strings /sbin/init | grep systemd

```

#### 示例 3

你也可以尝试使用 `pstree` 命令打印进程树，它应该会显示第一个进程名称。它应该是 `systemd` 或 `init`，如下例所示。

```
pstree

```

这就好了。这样你就可以轻松找出你的发行版是使用 systemd 还是其他的。

---

via: <https://www.debugpoint.com/systemd-or-init/>

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

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