使用 cron 定时任务的小技巧

不应该是  分 时 日 月 周 嘛：）

“周”容易和周号混，所以干脆，日月星了。

# 使用 cron 定时任务的小技巧

>
> 通过使用这个简单而强大的 Linux 命令行工具，来安排备份、文件清理以及其他任务。
>
>
>

<img src="content_image/album_202208_15_151143fjdses6bdj2nj1j5.jpg" alt="" title="Linux keys on the keyboard for a desktop computer">

在计算机上让任务按照有规律并且可预测的时间表运行很重要。作为人类，我们有时会因为分心、脑子里想太多，或是度假而记不住要做的事情。计算机真的很擅长按计划做事，但在计算机采取行动之前，人类必须对计算机进行编程。

在某种程度上，cron 系统是编程的初级简单入门。通过编辑一个文件就可以让计算机做你想让它做的事。你甚至不需要知道文件保存在哪里。只需键入一个简单的命令，输入你希望电脑遵循的 “配方”，并保存。从那时起，计算机会在指定时间执行你的指令，直到被告知停止。

从设计上来看，cron 不是一个复杂的系统。这里有一些你需要了解的内容。

### cron 是什么？

cron 命令在 Linux 和 Unix 中无处不在，而且它经常被模仿和重塑，以至于它几乎成了按计划发生的事情的一个通用术语。它是自动化的一种形式，尽管有不同的实现方式（比如 Dillon's cron、Vixie's cron、chrony 和其他），以及像 anacron 和 systemd 定时器这样的变化，但其语法和工作流程几十年来一直保持着基本一致。

cron 在一个 “<ruby> 假脱机 <rt>  spool </rt></ruby>” 系统上工作，像打印机和电子邮件一样。如果不你知道打印机和电子邮件使用假脱机也没关系，因为假脱机文件的意义在于，你不需要想太多。在 Linux 系统中，`/var/spool` 目录被设计为重要但低级的文件的中心枢纽，用户不需要直接与之交互。 在 `/var/spool` 中管理的一个假脱机是 cron 表（简称为 “crontab”）。 包括你在内的每个用户在 Linux 系统中都有一个 crontab。用户可以编辑、查看和删除自己的 crontab。除此之外，用户可以使用 crontab 来安排任务。cron 系统监控 crontab，并确保一个 crontab 中列出的任何工作都能在其指定时间执行。

### 编辑 cron 设置

你可以使用 `crontab` 命令和 `-e`（代表“编辑”）选项来编辑你的 crontab。默认情况下，大多数系统会调用 `vim` 文本编辑器。如果你和我一样，不使用 Vim，那么你可以在 `~/.bashrc` 文件中为自己设置一个不同的编辑器。我把我的设置为 Emacs，但你也可以试试 [Nano](https://opensource.com/article/20/12/gnu-nano)、[Kate](https://opensource.com/article/20/12/kate-text-editor)，或者任何你喜欢的编辑器。`EDITOR` 环境变量定义了你在终端使用的文本编辑器，而 `VISUAL` 变量定义了你在图形模式下使用的编辑器：

```
export EDITOR=nano
export VISUAL=kate

```

更新设置后刷新你的 shell 会话：

```
$ source ~/.bashrc

```

现在你可以用喜欢的编辑器编辑 crontab：

```
$ crontab -e

```

#### 为任务执行安排时间

cron 系统本质上是一个日历系统。可以通过五个不同的属性告诉 cron 需要让一个任务多长时间运行一次：分、时、日、月、星期。这些属性的顺序是固定的，并且不一定是直观的，你可以把它们看作是过滤器或掩码。默认情况下，你可以理解为所有东西都被设置为“总是”或者“每一个”。此命令将在全年的每一天每小时每分钟运行 `touch /tmp/hello`：

```
* * * * * touch /tmp/hello

```

可以通过设置每个属性的具体定义来限制这个包罗万象的时间安排表。使任务在每个小时的 30 分钟时运行，将分钟设置为 `30`：

```
30 * * * * touch /tmp/hello

```

可以通过一个具体的小时来进一步约束这个指令。使任务在每个凌晨 3:30 运行：

```
30 3 * * * touch /tmp/hello

```

你也可以让这个任务只在每个月的第一天运行：

```
30 3 1 * * touch /tmp/hello

```

你可以用 `1` 至 `12` 表示 1 至 12 月来设置月份，用 `0` 至 `6` 表示周日至周六来设置星期。这项任务在 4 月份的周一的 3:15 运行：

```
15 3 * 4 1 touch /tmp/hello

```

### 设置增量

所有这些设置都与一个固定时间 *完全* 匹配。使用 cron 符号设置可以在特定时间段后运行任务，例如，每 15 分钟运行一个任务：

```
*/15 * * * * touch /tmp/hello

```

每三天在上午 10 点运行任务：

```
* 10 */3 * * touch /tmp/hello

```

每 6 小时运行一次任务：

```
* */6 * * * touch /tmp/hello

```

### Cron 速记符

现代的 cron 实现已经为常见的时间安排表添加了方便的速记符，包括：

* `@hourly`：每小时
* `@daily`：每天
* `@weekly`：每周
* `@monthly`：每月
* `@yearly` 或 `@annually`：每年

### 列出 cron 任务

使用 `crontab` 命令，查看计划中的 cron 任务列表：

```
$ crontab -l
15 3 * 4 1 touch /tmp/hello

```

### 删除一个 crontab

当一个 crontab 任务不需要时，可以使用 `-r` 选项来删除它：

```
$ crontab -r -i

```

`-i` 选项代表 *交互式*。它在删除文件之前会提示你进行确认。

### Cron 可以做什么

知道如何使用 cron 是一回事，但但知道它的用途是另一回事。经典用例就是备份计划。如果你的电脑一天中大部分时间都是开着的，或者整天整夜地开着，那么可以为重要分区进行例行备份。我会在每天凌晨 3 点在主要数据分区上运行一个名为 `rdiff-backup` 的备份程序：

```
$ crontab -l | grep rdiff
* 3 * * * rdiff-backup /data/ /vault/

```

另一个常见的用途是系统维护。在我的 Slackware 桌面上，每周五下午会更新本地版本库目录：

```
$ crontab -l | grep slack
* 14 * * 5 sudo slackpkg update

```

我还会每 3 天在 15:00 运行一个 Ansible 脚本来 [清理我的下载文件夹](https://opensource.com/article/21/9/keep-folders-tidy-ansible) ：

```
$ crontab -l | grep ansible
* 15 */3 * * ansible-playbook /home/seth/Ansible/cleanup.yaml

```

有一些重复数据删除脚本、文件大小和 `/tmp` 目录的监视器、照片调整器、文件移动工具以及很多琐碎的任务，你可以安排在后台运行，以帮助保持系统不受干扰。有了 cron，计算机可以以我希望我的实体公寓能够做到的方式来照顾自己。

### 记住 cron 的设置

除了想明白你为什么需要 cron 之外，根据我的经验，cron 最难的事情是记住它的语法。重复这句话给自己听，反反复复，直到你记牢它：

>
> 分、时、日、月、星
>
>
> 分、时、日、月、星
>
>
> 分、时、日、月、星
>
>
>

更好的做法是，去 [下载我们免费的速查表](https://opensource.com/downloads/linux-cron-cheat-sheet) ，这样当你最需要它时，它触手可及！

>
> **[Cron 速查表](https://opensource.com/downloads/linux-cron-cheat-sheet)**
>
>
>

---

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

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

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


Kali Linux 2022.3 发布

Kali Linux更新得越来越快了，下个版本号2022.4估计都不用等年底

一个季度一个

# Kali Linux 2022.3 发布

>
> Kali Linux 2022.3 在引入了新的 VirtualBox 镜像格式的同时，也使测试变得更加方便。不要忘了试试新的工具！
>
>
>

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

Kali Linux 在 2022 年的第三次升级中带着激动人心的新内容回来了。

像往常一样，你可以期待新的工具和全面的改进。此外，还有一些关键的亮点，包括新的 **测试实验室环境** 和 **VirtualBox 镜像**。

在这里，让我给你介绍一下这个版本的细节。

### Kali Linux 2022.3 有什么新内容？

Kali Linux 2022.3 的发布标志着他们开始启用了 **新的 Discord 服务器**，使社区能够聚集在一起，谈论关于 Kali Linux 的事情。

除了社区有了 Discord 服务器之外，应该引起你对升级的关注的事情包括：

* 一个便于测试的新测试实验室环境
* 开放 kali-tools 资源库，以供社区提交
* NetHunter 商店中的新软件
* 一个新的 VirtualBox 镜像格式
* 大量的新工具

### 测试实验室环境

Kali Linux 是为安全研究人员量身定做的，可以用于测试和学习。但是，为了增强体验，使任何人都能毫不费力地建立一个测试实验室，Kali Linux 现在增加了易于安装的软件包，如 [DVWA](https://www.kali.org/tools/dvwa/) 和 [Juice Shop](https://www.kali.org/tools/juice-shop/)。

开发者还提到，在不久的将来会有更多的软件包。

### 新工具

新的升级包括了五个有趣的工具，它们是：

* BruteShark（网络分析工具）
* DefectDojo（开源的应用程序漏洞工具）
* phpsploit（隐蔽的破解后应用框架）
* shellfire（利用命令注入漏洞）
* SprayingToolkit（密码攻击）

你可以探索这些工具以了解更多信息。

### 增强的 VirtualBox 支持

虽然 Kali Linux 已经可以用于 VMware 和 VirtualBox，但现在为 VirtualBox 用户提供了一种新的镜像格式。

你现在可以下载用于 VirtualBox 的 VDI 磁盘镜像和 .vbox 元数据文件。它是原生的 VirtualBox 镜像格式，具有更好的压缩率，下载速度更快。

对于希望使用最新和最先进工具的用户，Kali Linux 提供了按周构建的虚拟机镜像，构建自其滚动分支。

此外，如果你需要构建你的自定义虚拟机镜像，Kali Linux 已经在 [GitLab](https://gitlab.com/kalilinux/build-scripts/kali-vm) 上提供了一些脚本。

### 其他改进

Kali Linux 2022.3 增加了几个重要的升级。其中包括：

* 针对树莓派设备的 Linux 内核 5.15 更新。
* 针对 ARM 设备的技术改进。
* 文档更新，有一些新页面。
* 网络存储库的维护工作。
* NetHunter 商店的大量更新，以及对即将到来的 Android 12 支持。

### 下载 Kali Linux 2022.3

你可以在其 [官方下载页面](https://www.kali.org/get-kali/) 找到最新的 Kali Linux 2022.3 ISO，以及新的 VirtualBox 镜像文件和每周更新包。

>
> **[Kali Linux 2022.3](https://www.kali.org/get-kali/#kali-platforms)**
>
>
>

---

via: <https://news.itsfoss.com/kali-linux-2022-3-release/>

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

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


硬核观察 #729 苹果发现了一个大生意：在你的 iPhone 上显示广告

Summary: • 苹果发现了一个大生意：在你的 iPhone 上显示广告 • 电动汽车正在变成订阅制 • 2300 万美元：有史以来最大的 YouTube 版税骗局

# 硬核观察 #729 苹果发现了一个大生意：在你的 iPhone 上显示广告

### 苹果发现了一个大生意：在你的 iPhone 上显示广告

据报道，苹果已经在内部测试了苹果地图中的搜索广告，当你搜索餐馆、商店或其他附近的企业时，它可以显示推荐。苹果已经在其应用商店上实施了类似的广告模式，因为开发者可以付费让他们的应用在特定查询的搜索页面上得到推广。苹果的地图，播客和图书等应用目前是无广告的。

>
> **[消息来源：The Verge](https://www.theverge.com/2022/8/14/23305200/iphone-more-ads-advertising-apple-maps-podcasts-books-mark-gurman-rumors)**
>
>
>

>
> 老王点评：毕竟没有乔布斯的苹果，靠新产品挣钱有点难。
>
>
>

### 电动汽车正在变成订阅制

一家美国加州的初创公司囤积了大量的各种品牌的电动汽车，然后以订阅费的方式提供给客户，除了启动费之外，每月收取 490 至 690 美元，最多可行驶 1000 英里。而另外一方面，宝马公司在英国出售每月 18 美元的座椅加热服务，通用汽车公司则将其安吉星语音服务变成了每辆新的别克、凯迪拉克的 1500 美元的强制订阅。具有讽刺意味的是，即使没有自选附加项目，支撑二手电动汽车价格的主要力量之一是其远程更新的能力，而汽车制造商正在利用同样的技术，通过订阅服务向司机收取费用。

>
> **[消息来源：BNN](https://www.bnnbloomberg.ca/a-california-startup-is-selling-electric-vehicle-subscriptions-1.1805217)**
>
>
>

>
> 老王点评：如果汽车的主要功能是以软件方式体现的，那么订阅制似乎是有道理的。或许，将来除了汽车，其它的家电、智能房屋都会在一次性购买费用之外，也收取各种功能订阅费用？
>
>
>

### 2300 万美元：有史以来最大的 YouTube 版税骗局

两位被指控的罪犯成立了一家公司，声称拥有超过 5 万个拉丁音乐歌曲和作品的版权。这家欺诈公司制作了一些假文件，以证明其声称的音乐的所有权。他们通过一家第三方公司合作，该公司可以进入 YouTube 的 CMS 和内容 ID 工具，并帮助艺术家管理他们的数字版权。四年来，这家欺诈公司通过这种手段骗到了 2300 万美元，直到被美国国税局的调查后起诉。

>
> **[消息来源：mashable](https://mashable.com/article/youtube-copyright-royalties-heist)**
>
>
>

>
> 两位点评：保护版权是好的，但是这种宣称版权而欺诈的，可不只是音乐方面。
>
>
>


Inkscape 扩展应用：Ink/Stitch

Summary: 本篇文章将探索 Inkscape 的另一项扩展功能：用于绣花设计的 Ink/Stitch。

十分硬核，好评!

# Inkscape 扩展应用：Ink/Stitch

Inkscape 是 Fedora 设计团队最喜爱最常用的软件，它的功能可不止于制作精美的矢量图形。矢量图形（也就是 SVG 文件）可以帮助实现更多操作，许多软件也支持这一格式。不过，Inkscape 还有其他功能有待发掘。[本系列](https://fedoramagazine.org/series/make-more/) 第一篇文章介绍了如何 [使用 Inkscape 生成 GCode 文件](https://fedoramagazine.org/make-more-with-inkscape-g-code-tools/)；本篇文章将探索 Inkscape 的另一项扩展功能：用于绣花设计的 [Ink/Stitch](https://inkstitch.org/)。

### 绣花 DIY

在过去数年里，DIY 风靡一时。可以说，这一现象始于廉价的 [3D 打印](https://fedoramagazine.org/3d-printing-in-fedora-from-an-idea-to-the-thing/) 技术，以及后来的 [数控](https://en.wikipedia.org/wiki/Numerical_control) 机床与激光切割机、激光雕刻机。这些设备都算不上非常昂贵。同时，绣花机等“传统”机器的价格也有下降。[家用绣花机现在只需 500 美元就能买到了](https://www.amazon.com/-/de/dp/B07VZ2YBLL/ref=sr_1_11?__mk_de_DE=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=1MFJJWXMKQD6R&dchild=1&keywords=home+embroidery+machine&qid=1628388092&rnid=2941120011&s=arts-crafts&sprefix=home+embroider+%2Caps%2C-1&sr=1-11)。

如果你不想买或者买不到绣花机，离你最近的 [创客空间](https://www.fablabs.io/labs/map) 一般也会有。即便是一台商用单头绣花机，价格也下降到了 5000 美元。对于购置绣花机这种投资来说，一般很快就能看到回报。

### 绣花设计软件

一些家用绣花机附有配套的绣花设计软件，不过大部分都只能在 Windows 系统上运行，就算该领域最常用的、独立于各绣花机制造商的软件 [Embird](https://www.embird.net/) 也是如此。不过，你也可以通过 Wine 来运行这些软件。

在 Linux 上，另一个办法就是使用 [Embroidermodde](https://embroidermodder.org/)。不过，该软件在 2014 年的募捐活动之后，就停止了开发活动。

到今天，只剩下一个办法：[Ink/Stitch](https://inkstitch.org/)

### 开源与绣花设计

绣花机价格高以及 Linux 用户少都怪不得制造商，毕竟为 Linux 开发应用的确不太值得。

#### 绣花文件格式问题

绣花机所用文件格式大量涌现，甚至还有一些制造商为自家机器定制了文件格式。在某些情况下，即便是一家制造商，可能也会使用多种文件格式。

* **.10o** – 丰田绣花机
* **.100** – 丰田绣花机
* **.CSD** – Poem、Huskygram 和胜家家用绣花缝纫机
* **.DSB** – 百灵达绣花机
* **.JEF** – 车乐美 MemoryCraft 10000
* **.SEW** – 车乐美 MemoryCraft 5700、8000 和 9000
* **.PES** – 兄弟和 Babylock 家用绣花缝纫机
* **.PEC** – 兄弟和 Babylock 家用绣花缝纫机
* **.HUS** – 好时运家用绣花缝纫机
* **.PCS** – 百福家用绣花缝纫机
* **.VIP** – 百福旧格式 & 好时运格式
* **.VP3** – 百福家用缝纫机新格式
* **.DST** – 田岛商用绣花缝纫机
* **.EXP** – 美高商用绣花缝纫机
* **.XXX** – Compucon 和 胜家家用绣花缝纫机
* **.ZSK** – 美国市场的 ZSK 绣花机

关于绣花机会用到的文件格式，上面列出来的只是九牛一毛，可 [在此](http://www.needlework.ru/page/embroidery.htm) 查看全部格式。如果你想进一步了解这些文件格式，可点击 [此处](http://edutechwiki.unige.ch/en/Embroidery_format) 获取更多信息。

#### Ink/Stitch 文件格式

Ink/Stitch 最初使用的是 [libembroidery](https://github.com/Embroidermodder/libembroidery) 库，现在则使用 [pyembroidery](https://github.com/inkstitch/pyembroidery) 库。在 pyembroidery 库的支持下，Ink/Stitch 目前可以读取以下格式：100, 10o, BRO, DAT, DSB, DST, DSZ, EMD, EXP, EXY, FXY, GT, INB, JEF, JPX, KSM, MAX, MIT, NEW, PCD, PCM, PCQ, PCS, PEC, PES, PHB, PHC, SEW, SHV, STC, STX, TAP, TBF, U01, VP3, XXX, ZXY 以及 TXT（内容为 GCode 代码）。

不过，Ink/Stitch 支持的储存格式则比较少：DST, EXP, JEF, PEC, PES, U01, VP3 and of course SVG, CSV 以及 TXT（内容为 GCode 代码）。

除了文件格式，绣花缝纫软件还需解决其它一些问题。

支持繁杂多样的线迹类型是一个难题，绘制工具与缝制工具的搭配使用又是另一个难题。不过，为什么非要从无到有搞出一套新应用？为什么不依赖现有的矢量软件？这样一来，开发者只需要在其基础上增添绣花扩展功能即可。后者就是 [Ink/Stitch 项目](https://inkstitch.org/) 过去四年来的设计理念。

### 安装 Ink/Stitch

Ink/Stitch 是 [Inkscape 的一个扩展功能](https://inkscape.org/~wwderw/%E2%98%85inkstitch-embroidery-extension)。不过，由于 Inkscape 下载安装扩展的新功能还处于测试阶段，在其提供的扩展功能中可能无法找到 Ink/Stitch。因此，你需要自行手动 [下载](https://github.com/inkstitch/inkstitch/releases/tag/v2.0.0) 该扩展。下载后，将压缩包解压到 Inkscape 扩展所在路径，默认路径为 `~/.config/Inkscape/extensions`（或者放置在系统全局路径：`/usr/share/inkscape/extensions`）。若你改变了默认路径，则需检查 Inkscape 设置选项，找到扩展文件的存放位置。

### 自定义：为 Ink/Stitch 安装插件

Ink/Stitch 提供了为 Inkscape 安装插件的功能，用户需首先执行这一功能。

依次点击如下选项：<ruby> 扩展 <rt>  Extensions </rt></ruby> > Ink/Stitch > <ruby> 线条颜色管理 <rt>  Thread Color Management </rt></ruby> > <ruby> 为 Inkscape 安装线条调色板 <rt>  Install thread color palettes for Inkscape </rt></ruby>，之后等待片刻。

虽然这一过程不会出现进度条之类的提示，不过也无需着急。

该功能执行后，将会安装来自不同纱线制造商的 70 套色板，以及一套符号库。

如果你使用的 Ink/Stitch 是从 Github 下载的 2.0.0 版本，那么下载下来的 ZIP 文件里就包括了色板文件。你只需将其解压到正确的路径：`~/.config/inkscape/palettes/`。如果你需要环形模板，可以点击 [此处](https://inkstitch.org/assets/images/tutorials/templates/hoop-template.svg) 下载，并将其保存到 `~/.config/inkscape/templates` 目录下。

重新启动 Inkscape，可在 <ruby> 文件 <rt>  File </rt></ruby> > <ruby> 由模板新建 <rt>  New From Template </rt></ruby> 下找到该模板。

### Ink/Stitch 绣字

到目前为止，绣花设计最简单也最常用的方法就是使用 Ink/Stitch 的 <ruby> 文字缝制 <rt>  Lettering </rt></ruby> 功能。该功能位于 <ruby> 扩展 <rt>  Extensions </rt></ruby> > Ink/Stitch > <ruby> 文字缝制 <rt>  Lettering </rt></ruby>。绣花文字缝制可不是一件简单事儿，它其实就是所谓的缎面绣字，需要做好特殊的文字设置。

你可以将路径转换为缎面绣，但是这种方法比使用文字缝制功能还要繁琐许多。多亏了社区的活跃，2021 年 5 月份发布的 Ink/Stitch 2.0 版本预置了更多的字体。2.0 版本还增加了 <ruby> 扩展 <rt>  Extensions </rt></ruby> > Ink/Stitch > <ruby> 字体管理 <rt>  Font Management </rt></ruby> 功能，让用户更方便地管理这些字体。

此外，还有制作字体的功能，但是你需要了解如何使用 Inkscape 设计字体，可在 [此处](https://inkstitch.org/tutorials/font-creation/) 浏览相关英文教程。这里只给出大概的介绍：首先创建一个 SVG 字体，接着将其储存在 JSON 文件中，这样便可以在 Ink/Stitch 字体管理功能中使用。

该功能将打开一个对话窗口，你可以把文字输进去，调整字体及其大小，然后即可将输入的文字渲染出来。

### 绣制区域、路径等对象

Ink/Stitch 最容易实现的就是绣制区域或者路径。你需要做的只是画出路径。如果你使用的是形状，那么你需要将其转换成路径，然后执行如下操作：<ruby> 扩展 <rt>  Extensions </rt></ruby> > Ink/Stitch > <ruby> 填充工具 <rt>  Fill Tools </rt></ruby> > <ruby> 分离填充对象 <rt>  Break Apart Fill Objects… </rt></ruby>，将路径分割成若干部分。

虽然 Inkscape 也有 <ruby> 路径 <rt>  Path </rt></ruby> > <ruby> 分离 <rt>  Break apart </rt></ruby> 功能，但是在这种情况下并不可行。

接下来，运行 Ink/Stitch 内置模拟器：<ruby> 扩展 <rt>  Extensions </rt></ruby> > Ink/Stitch > <ruby> 可视化并导出 <rt>  Visualise and Export </rt></ruby> > <ruby> 模拟器/实际预览 <rt>  Simulator/Realistic Preview </rt></ruby>。

注意，模拟器运行时需要占用大量的系统资源，而且启动时间也比较长。其实，以下功能操作起来会更加简便：<ruby> 扩展 <rt>  Extensions </rt></ruby> > Ink/Stitch > <ruby> 可视化并导出 <rt>  Visualise and Export </rt></ruby> > <ruby> 线迹计划预览 <rt>  Stitch Plan Preview </rt></ruby>。该功能会在文件外部对线条进行渲染。

### 简单的缎面及缎面绣

Ink/Stitch 会使用连续的线条（非虚线）将每个笔画转换成之字形或简单的缎面。依照预先设置好的描边宽度，沿着路径绣出线迹。只要路径上没有过多的曲线，使用这一方法就没问题。

这个方法虽然简单，但绝不是最好的选择。最好的选择是使用缎面工具，该功能可以在 <ruby> 扩展 <rt>  Extensions </rt></ruby> > <ruby> 缎面工具 <rt>  Satin Tools </rt></ruby> 找到。其中，转换功能又是重中之重，它可以将路径转换为缎面笔画。

通过 <ruby> 扩展 <rt>  Extensions </rt></ruby> > <ruby> 缎面工具 <rt>  Satin Tools </rt></ruby> > <ruby> 旋转缎纹路径 <rt>  Flip Satin Column Rails </rt></ruby>，你还可以改变线迹的方向。这样做可以凸显缎面绣的立体感，典型的例子就是泡芙刺绣（一种非常具有立体感的刺绣）。支持这种功能的机器还可以为绣花时产生的多余的连线线迹标记出修剪记号。这些记号正是从 Ink/Stitch 自身符号库里安装得到的符号。

### Ink/Stitch 线迹库

线迹库包括了 Ink/Stitch 可以创建的线迹类型。在前文，填充式线迹和之字形/缎纹线迹已经介绍过了，不过其他还有很多。

* **平针**：平针用于边缘装饰，沿直线或曲线缝制出一排短小的线迹，由此组成的一条条虚线就是平针。虚线的尺寸可大可小。

* **豆针**：豆针可用于边缘装饰或添加设计细节。使用平针来回缝制就是豆针，这种缝法会增加线迹的厚度。

* **手工针**：在该模式下，Ink/Stitch 会将路径的每个节点当作穿针点；这些节点也正是针穿入的位置。

* **E 字针**：E 字针是一种简单但十分好用的绷缝线迹，用于贴花织物。这种线迹多用于婴儿装，因为婴儿的皮肤比较敏感。

### 绣花用线列表

有些绣花机，尤其是商用的绣花机，根据设计的需要，可以提前适配不同的针线。必要时，这类机器会自动切换使用合适的针线。有些绣花文件格式支持这一功能，但有些并不支持。Ink/Stitch 可以将用户设置好的线条列表应用到绣花设计中。

如果你想在现有的设计上导入线条列表，可执行如下操作：<ruby> 扩展 <rt>  Extensions </rt></ruby> > Ink/Stitch > <ruby> 导入线条列表 <rt>  Import Threadlist </rt></ruby>。同样的，线条列表也可以导出：<ruby> 另存为 <rt>  Save As </rt></ruby> 不同的文件格式，如 \*.zip。当然，也可以将其打印出来：<ruby> 扩展 <rt>  Extensions </rt></ruby> > Ink/Stitch > <ruby> 可视化并导出 <rt>  Visualise and Export </rt></ruby> > <ruby> 打印 PDF <rt>  Print PDF </rt></ruby>。

### 结语

为绣花设计编写软件可不是一件简单的事儿，软件需要支持很多功能，还要应对不同文件格式（有些属于闭源文件格式）带来的难题。Ink/Stitch 已经做得很好了，尽力打造出了一款功能多样的绣花工具，让用户能够进行基础的绣花设计。当然，它也不是完美的，有些功能还需要完善。但是，Ink/Stitch 绝对是一款十分优秀的工具，我也希望它能越来越好。绣花是个不错的兴趣爱好，有了 Ink/Stitch，Fedora Linux 用户便可开启天马行空的设计之门。

---

via: <https://fedoramagazine.org/make-more-with-inkscape-ink-stitch/>

作者：[Sirko Kemter](https://fedoramagazine.org/author/gnokii/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[aREversez](https://github.com/aREversez) 校对：[wxy](https://github.com/wxy)

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


Linux 的版本号和 520

高通888是吧，最好不要! 有老婆的去陪陪老婆，少花掉时间浪费在一个破软件上。如果没老婆的，那就赶紧去找。如果不想找的，那还要什么520?!

r u serious?  你如何称呼内核？我没听错吧……破软件？

不会吧，不会吧，有人找不到老婆，还怪到内核头上。真是拉不出屎来怪地球引力太小。

草履虫，脑子就一个单细胞？不会平衡生活中各种事情的时间？

怎么说呢

这些邮件不错 有意思

更有意思的是 你们都在关注这个

# Linux 的版本号和 520

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

在中国，有各种节日，有各种情人节。

最早是从西方传来的所谓公历 2.14 的“情人节”，后来又有了 3.14 的“白色情人节”。然后，人们觉得这些节的洋味太重，何不把中国的农历七夕当成中国传统的情人节呢？而随着二次元一代，谐音梗也开始流行，不知道是谁滥觞，5.20 也被当成了一种情人节，因为谐音是“我爱您”。

前几天，我的朋友 Paulus Wren 跟我说，有位内核开发者在 Linux 内核邮件列表中向 Linus Torvalds 请求，将刚刚准备进位到 6.0 的版本号在 5.20 上停留一次，他认为这是一个在中国宣传 Linux 的好机会。就在前几天，Linus Torvalds 刚刚在邮件列表中 [宣布](/article-14887-1.html) 了 Linux 5.19 正式发布，并通告下一个版本准备“进位”到 6.0 了。

说起来 Linux 内核的版本号，比较有意思的是从 3.0 开始主版本号就没有什么特别的意义，只是当次版本号太大时，Linus 觉得过大的数字会让他困扰，因此就“进位”到主版本号了。比如，2.6.39 之后就是 3.0，3.19 之后就是 4.0，4.20 之后就是 5.0（之所以没有在 4.19 就开始进位，也许是 Linus 忘记了）。所以，按照这种不严格的 20 进制，该进位了。

这位名叫 Zhang Boyang（让我们称他为“张同学”）的内核开发者在内核邮件列表中向 Linus Torvalds [发起倡议](https://lore.kernel.org/lkml/9bc1f1f4-3923-be9e-ee13-9c8252a56643@gmail.com/)：

>
> 您能不能考虑使用 5.20 作为下一个 Linux 版本号，而不是 6.0。“5.20” 这个数字在中文中是一个文字游戏，代表 “我爱您”，所以 “Linux 5.20” 在中文中可以被读作 “我爱 Linux”。
>
>
>

他认为，这可以引起一些广泛传播，可以宣传 Linux。这个 [消息](/article-14903-1.html) 传播到国内后，褒贬不一，有人认为这是一件有趣的事情，可以向更多不了解 Linux 的人宣传 Linux；也有人认为，这事太无聊了。

但是这封邮件并未带来什么影响，可能是它发出的时间恰逢周末，也没有得到 Linus Torvalds 的回复。

眼看过去了一周，合并窗口接近关闭了，看来修改版本号这件事希望渺茫，张同学 [再次发出](https://lore.kernel.org/lkml/61d77412-af1a-5b00-9754-f156b1c63a74@gmail.com/) 了他的倡议，请 Linus Torvalds 考虑给该版本一个命名：

>
> 您能不能考虑将下一个 Linux 版本（5.20 或 6.0）命名为 “I love linux”？……即使下一个内核版本号是 6.0，我想对于讲中文的人和不讲中文的人来说，表达我们对 Linux 内核的爱可能都是一个好主意。
>
>
>

而历史上，Linux 内核的一些版本有特别的名称，比如 Linux 5.17 就被命名为 “Superb Owl”（“超级碗”的一个文字游戏）。

这一次，他的邮件得到了六位中国的 Linux 内核开发者的支持。但是，依旧没有得到 Linus 和其它国家开发者的回应。

在大家的回应中，有人对 5.20 这个节日做了进一步解释，以及表达了一个并不浪漫的已婚男人对各种情人节的紧张，并表示这样的 520 挺好，不需要专门准备礼物。也有人表示，这是内核列表里面一次较大规模的“文化输出”，就像我们对美国人的“超级碗”无感一样，外国人对我们的 520可能也没什么感受。

原本，我以为，这件事就此作罢了。不料 Linus Torvalds 在昨天发布 Linux 6.0-rc1 时，专门提到了这件事，[他说](https://lore.kernel.org/lkml/20220815234840.GA654054@roeck-us.net/T/)，

>
> 如果你愿意，你可以继续叫它 “Linux 5.20”。
>
>
>

并且，Linus Torvalds 在这份公告里面再次重申了，主版本号变化并不代表有根本性的变化，他早就摒弃了“主版本号是有意义的”的说法了，而采用分层的版本号只是为了使版本号容易记忆而已。

老王觉得，张同学这件事办的很好，诸位在内核邮件列表回复的同学也很给力。说到底，我们对 Linux 就是一种热爱，为什么不借着各种可能的机会来宣传它呢？虽然，Linux 越来越用在各种严肃的场合，但是 Linux，乃至开源，其本底一直是一种极客文化，“Just for Fun”，所以，为什么不呢？虽然，由于文化差异，没有得到太多的回应，但是我们的“文化输出”才能让世界对我们有更多的亲近。

那么，你的看法呢？

另外，你认为这样的版本号有趣吗？你会向你的爱人（如果不是计算机的话）讲这个故事吗？为了这个有爱的版本号，你是否会为 Linux 内核或更广泛的 Linux 做些什么吗（比如去修个 Bug，让你的痕迹留在 Linux 5.20 中）？

（题图修改自：[ninchanese.com](https://ninchanese.com/blog/2016/05/20/520-chinese-love-word-number/)）


硬核观察 #730 Linus 发布 Linux 6.0 的第一个候选版本

Summary: • Linus 发布 Linux 6.0 的第一个候选版本 • AI 可以使未来的消防员免于致命的燃爆 • 谷歌发布 Android 13，源代码已发布到 AOSP

520根本不是我爱你，而是吾饿哩

# 硬核观察 #730 Linus 发布 Linux 6.0 的第一个候选版本

### Linus 发布 Linux 6.0 的第一个候选版本

Linus Torvalds 说主版本的变化并不意味着这个版本有什么根本不同，他说，“我早就摒弃了‘主要版本号是有意义的’概念，使用分层版本号的唯一原因是它更容易记忆和区分”。他也表示，一些中国开发者建议采用 5.20 版本号，他说“因此，如果你想把这个叫做 ‘Linux 5.20’，那你继续好了”。该版本包括了 13,099 个更改的文件，这意味着“6.0 看起来是又一个相当大的版本”。大部分的更新是对 GPU、网络和声音的改进。他对一些支持 Rust 的代码没有进入该版本表示遗憾，“我希望我们能得到一些最早的 Rust 基础设施，以及多代 LRU 虚拟机，但这两个都没能进入”。

>
> **[消息来源：The Register](https://www.theregister.com/2022/08/15/linux_60_debuts_missing_some/)**
>
>
>

>
> 老王点评：关于 Linux 5.20 的更详细的介绍，我今天专门写了一篇文章，感兴趣的可以去看看今天 Linux 中国的微信头条。
>
>
>

### AI 可以使未来的消防员免于致命的燃爆

当房间里的可燃材料突然开始一次性点燃时，就会发生燃爆，并产生大量的热量和可燃气体爆炸，可能会打破墙壁和窗户。据估计，消防员受伤事故中有 13% 是燃爆造成的。来自美国 NIST、谷歌以及香港理工大学和中国石油大学的研究人员，建立了一个使用图神经网络（GNN）的系统，从模拟火灾中学习不同的数据来源之间的关系。他们使用了 25,000 个火灾案例来训练模型。初步结果显示，该模型的准确率最高为 92.1%，可以检测未来 30 秒内是否会发生燃爆。

>
> **[消息来源：The Register](https://www.theregister.com/2022/08/14/ai_firefighter_prediction/)**
>
>
>

>
> 老王点评：非常有意义的研究，这比用 AI 来聊天更具有价值。另外，图神经网络似乎是个很有希望的技术。
>
>
>

### 谷歌发布 Android 13，源代码已发布到 AOSP

Android 13 开始推送给谷歌的智能手机 Pixel 系列，今年晚些时候，主要厂商三星、小米、一加等也会给旗下部分型号手机更新 Android 13。新变化包括：自定义非谷歌应用匹配墙纸主题和颜色，允许给应用分配与系统不同的语言，设定应用只能访问特定照片和视频，剪切板拷贝的敏感数据会在一定时间后自动清除，等等。Android 13 的源代码已经发布到了安卓开源项目（AOSP）。

>
> **[消息来源：谷歌](https://blog.google/products/android/android-13/)**
>
>
>

>
> 老王点评：我觉得买谷歌 Pixel 手机的最大好处就是能第一时间得到新版本，我也想买一台。
>
>
>


如何使用 Linux sed 命令自动进行文件编辑

Summary: 以下是从 Linux 命令行自动编辑文件的一些提示和技巧。

以下是从 Linux 命令行自动编辑文件的一些提示和技巧。

# 如何使用 Linux sed 命令自动进行文件编辑

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

>
> 以下是从 Linux 命令行自动编辑文件的一些提示和技巧。
>
>
>

当我使用 Linux 命令行时，无论是在台式机上编写新程序还是在 Web 服务器上管理网站，我经常需要处理文本文件。Linux 提供了强大的工具，我可以利用这些工具来完成我的工作。我经常使用 `sed`，一个可以根据模式修改文本的编辑器。

`sed` 代表 <ruby> 流编辑器 <rt>  Stream EDitor </rt></ruby>，它编辑文件中的文本并打印结果。使用 `sed` 的一种方法是识别一个字符串在文件中的几次出现，并将它们替换为不同的字符串。使用 `sed` 来处理文本文件的方式似乎是无穷无尽的，但我想分享一些使用 `sed` 来帮助我管理文件的方法。

### 在 Linux 上搜索和替换文件中的文本

要使用 `sed`，你需要使用一个*正则表达式*。正则表达式是定义模式的一组特殊字符。我最常使用 `sed` 的例子是替换文件中的文本。替换文本的语法如下：`s/originaltext/newtext`。`s` 告诉 `sed` 执行文本替换或交换出现的文本。在斜线之间提供原始文本和新文本。

此语法将仅替换每行中第一次出现的 `originaltext`。要替换每个匹配项，即使在一行中原始文本出现了不止一次，要将 `g` 追加到表达式的末尾。例如：`s/originaltext/newtext/g`。

要在 `sed` 中使用此表达式，请使用 `-e` 选项指定此正则表达式：

```
$ sed -e 's/originaltext/newtext/g'

```

例如，假设我有一个名为 `game` 程序的 Makefile 文件，该程序模拟了康威的《生命游戏》：

```
.PHONY: all run clean

all: game

game: game.o
        $(CC) $(CFLAGS) -o game game.o $(LDFLAGS)

run: game
        ./game

clean:
        $(RM) *~
        $(RM) *.o
        $(RM) game

```

`game` 这个名字并不是很有描述性，所以我想会把它改名为 `life`。将 `game.c` 源文件重命名为 `life.c` 非常简单，但现在我需要修改 Makefile 以使用新名称。我可以使用 `sed` 来将所有的 `game` 更改为 `life`：

```
$ sed -e 's/game/life/g' Makefile
.PHONY: all run clean

all: life

life: life.o
        $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)

run: life
        ./life

clean:
        $(RM) *~
        $(RM) *.o
        $(RM) life

```

`sed` 会将输出打印到屏幕上，这是检查文本替换是否符合你要求的好方法。要对 Makefile 进行这些更改，首先，备份文件，然后运行 `sed` 并将输出保存到原始文件名：

```
$ cp Makefile Makefile.old
$ sed -e 's/game/life/g' Makefile.old > Makefile

```

如果你确信你的更改正是你想要的，请使用 `-i` 或 `--in-place` 选项来编辑文件。但是，我建议添加一个备份文件后缀，如 `--in-place=.old`，用来备份原始文件，以备日后需要恢复时使用。它看起来像这样：

```
$ sed --in-place=.old -e 's/game/life/g' Makefile
$ ls Makefile*
Makefile  Makefile.old

```

### 在 Linux 上使用 sed 引用文件

你可以使用正则表达式的其它功能来匹配特定的文本实例。例如，你可能需要替换出现在行首的文本。使用 `sed`，你可以用上尖号 `^` 来匹配行的开头。

我使用“行首”来替换文本的一种方式是当我需要在电子邮件中引用一个文件时。假设我想在电子邮件中共享我的 Makefile，但我不想将其作为文件附件包含在内。相反，我更喜欢在电子邮件正文中“引用”文件，在每行之前使用 `>`。我可以使用以下 `sed` 命令将编辑后的版本打印到我的终端，并将其复制粘贴到新的电子邮件中：

```
$ sed -e 's/^/>/' Makefile
>.PHONY: all run clean
>
>all: life
>
>life: life.o
>       $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
>
>run: life
>       ./life
>
>clean:
>       $(RM) *~
>       $(RM) *.o
>       $(RM) life

```

`s/^/>/` 正则表达式匹配每行的开头（`^`），并在那里放置一个 `>`。实际上，这相当于每行都以 `>` 符号开始。

制表符可能无法在电子邮件中正确显示，但我可以通过添加另一个正则表达式将 Makefile 中的所有制表符替换为几个空格：

```
$ sed -e 's/^/>/' -e 's/\t/  /g' Makefile
>.PHONY: all run clean
>
>all: life
>
>life: life.o
>  $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
>
>run: life
>  ./life
>
>clean:
>  $(RM) *~
>  $(RM) *.o
>  $(RM) life

```

`\t` 表示文字制表符，因此 `s/\t/ /g` 告诉 `sed` 用输出中的两个空格替换输入中的所有制表符。

如果你需要对文件进行大量编辑，你可以将 `-e` 命令保存在文件中，并使用 `-f` 选项来告诉 `sed` 将该文件用作“脚本”。如果你需要经常进行相同的编辑，这种方法特别有用。我已经准备了 `quotemail.sed` 的脚本文件来在我的电子邮件中引用 Makefile：

```
$ cat quotemail.sed
s/^/>/
s/\t/  /g
$ sed -f quotemail.sed Makefile
>.PHONY: all run clean
>
>all: life
>
>life: life.o
>  $(CC) $(CFLAGS) -o life life.o $(LDFLAGS)
>
>run: life
>  ./life
>
>clean:
>  $(RM) *~
>  $(RM) *.o
>  $(RM) life

```

### 学习在 Linux 上使用 sed

`sed` 是一个很好的工具，可以保存在你的 Linux 命令行工具包中。浏览 `sed` 手册页并了解有关如何使用它的更多信息。在命令行中键入 `man sed` 以获取有关不同命令行选项的完整文档，以及如何使用 `sed` 处理文本文件。

---

via: <https://opensource.com/article/22/8/automate-file-edits-sed-linux>

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

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


Sunamu：在 Linux 桌面上显示当前播放音乐的歌词

Summary: 作为一个吸睛的音乐小部件（或控制器） —— 这是 Sunamu 唯一专注的事情，它工作得很好。

# Sunamu：在 Linux 桌面上显示当前播放音乐的歌词

作为一个吸睛的**音乐小部件**（或控制器） —— 这是 Sunamu 唯一专注的事情，它工作得很好。

Sunamu 是一个有趣的工具。它不是音乐播放器，但可让你显示正在播放的音乐并对其进行控制。

我不喜欢在我的主要工作区使用浮动小部件，但 Sunamu 简约而优雅的方法改变了我的想法！

因此，我将向你介绍它的功能、安装、配置调整以及我的使用经验。

### Sunamu：开源音乐控制器

正如你在上面的截图中所注意到的，它看起来是一种显示正在播放的音乐的非常好的方式，带有歌词，同时具有基本的控件。

你可以播放/暂停、转到下一首/上一首曲目、随机播放和启用循环。

Sunamu 支持多种音频平台，包括 Spotify。它还可以检测本地收藏中的音乐，支持一些可用于 Linux 的 [最佳音乐播放器](https://itsfoss.com/best-music-players-linux/)。

此外，它还支持 Windows。因此，如果你通过 Windows 上的 Edge 浏览器流式传输某些内容，它应该可以正常工作。

你可以查看其 GitHub 页面上的 [兼容性列表](https://github.com/NyaomiDEV/Sunamu/blob/master/COMPATIBILITY.md) 以了解有关支持的播放器和浏览器的更多信息。

幸运的是，你不必受限于它默认提供的功能。它提供了一种调整配置文件的简单方法（在其 [GitHub 页面](https://github.com/NyaomiDEV/Sunamu/blob/master/assets/config.json5) 上可以了解更多信息）。这使得新手可以调整一些设置并获得乐趣。

我将在本文的后面部分提到一些关于它的技巧。

### Sunamu 的特点

Sunamu 具有一些不错的特性，其中一些是：

* 检测并显示当前正在播放的歌曲。
* 从专辑封面中获取配色方案，并使用相同的调色板以获得更好的视觉效果。
* 可通过配置文件进行定制。
* 与 Discord 完美集成。
* 消耗最少的系统资源。

### 在 Linux 上安装 Sunamu

它提供 AppImage、deb 和 rpm 包，以便在各种 Linux 发行版中轻松安装。我使用 AppImage 进行测试，并且非常好用。

如果你是 Linux 新手，你还可以从我们关于 [如何使用 AppImage](https://itsfoss.com/use-appimage-linux/) 或 [安装 deb 包](https://itsfoss.com/install-deb-files-ubuntu/)、[rpm 包](https://itsfoss.com/install-rpm-files-fedora/) 的指南中得到帮助。

有趣的是，Sunamu 是少数为基于 ARM 的机器提供直接支持的开源音乐工具之一。

访问他们的 [GitHub 发布页面](https://github.com/NyaomiDEV/Sunamu/releases/tag/v2.0.0)下载包或从源代码构建它。

**让我通过终端向你展示基于 Debian 的发行版的快速安装方法**。只需按照给定的说明进行操作，你就可以开始使用了：

首先，让我们使用 `wget` 命令下载 .deb 包，如下所示：

```
wget https://github.com/NyaomiDEV/Sunamu/releases/download/v2.0.0/sunamu_2.0.0_amd64.deb

```

下载完包后，使用给定的命令进行安装：

```
sudo dpkg -i sunamu_2.0.0_amd64.deb

```

### 技巧：调整配置文件

默认情况下，Sunamu 不会从专辑封面中获取颜色，而是显示每首歌曲的歌词。和许多其他人一样，我喜欢不看歌词。

Sunamu 的配置文件通常位于 `~/.config/sunamu/config.json5`。

要打开 Sunamu 配置文件，请输入给定的命令：

```
nano ~/.config/sunamu/config.json5

```

如下所示在 `electron` 部分进行更改（启用颜色并禁用歌词）：

```
electron: {
      type: 'electron',
      widgetMode: true,
      colors: true,
      font: '',
      theme: 'default',
      showLyrics: false,
    }

```

这是最终配置文件的样子：

### 总结

除非你是避免使用基于 Electron 应用的人，否则 Sunamu 是一款足以增强你在 Linux 上的音乐体验的应用。继 [Amberol](https://itsfoss.com/amberol-music-player/) 之后，这是我最近喜欢的第二款音乐相关应用。

如果你尝试过，请不要忘记在评论部分分享你的经验。

---

via: <https://itsfoss.com/sunamu-music-widget/>

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


硬核观察 #731 无处不在的 DOOM，这次是拖拉机

Summary: • 无处不在的 DOOM，这次是拖拉机 • 中国主要互联网公司向网信办备案算法 • 微软为 Ubuntu 22.04 LTS 提供原生 .NET 6 支持

快进到Microsoft Office 365上架Ubuntu Snap商店

MS Office 大部分是 C++。

# 硬核观察 #731 无处不在的 DOOM，这次是拖拉机

### 无处不在的 DOOM，这次是拖拉机

在最近的 Def Con 安全会议上，安全研究人员演示了在约翰迪尔 4240 拖拉机的显示屏上运行 DOOM 游戏。研究人员花了数个月时间，来越狱该拖拉机所使用的 Linux 系统。在拖拉机上运行的 DOOM 游戏也经过了特别修改，场景被设置在玉米田里，玩家操纵拖拉机去消灭敌人。这一尝试不仅仅是好玩，其展示的获取 root 访问权限的方法，可能有助于农民绕过这类拖拉机的限制，自行维修拖拉机，这算是对“维护权”的一种努力。

>
> **[消息来源：Wired](https://www.wired.com/story/john-deere-tractor-jailbreak-defcon-2022/)**
>
>
>

>
> 老王点评：方法已经有了，现在就缺一台可以玩 DOOM 的拖拉机了，知道这拖拉机多少钱嘛。
>
>
>

### 中国主要互联网公司向网信办备案算法

网信办上周公布了境内互联网信息服务算法备案清单，中国主要互联网公司向网信办披露了其使用的算法细节。清单包含了 30 个备案算法，其中包括网易新闻的推送算法和信息搜索算法，360 的搜索信息检索算法，微博热搜算法，美团配送调度决策算法，百度信息检索算法，抖音个性化推荐算法，淘宝推荐算法，微信看一看个性化推送算法，等等。

>
> **[消息来源：Solidot](https://www.solidot.org/story?sid=72485)**
>
>
>

>
> 老王点评：被算法操纵下的世界，公开不公开，都无法逃避算法的操纵。
>
>
>

### 微软为 Ubuntu 22.04 LTS 提供原生 .NET 6 支持

微软和 Canonical 共同宣布了在 Ubuntu 22.04 LTS 主机和容器环境中可原生运行 .NET 应用。微软的 .NET 6 现在可以在 Ubuntu 22.04 LTS 上通过简单的命令安装使用。.NET 开发平台是微软对开源项目最早的贡献之一。Canonical 为 .NET 6 LTS 和 [ASP.NET](http://asp.net/) 运行时发布了新的、符合 OCI 标准的超小型设备镜像，无需 Shell 或软件包管理器。

>
> **[消息来源：Ubuntu](https://ubuntu.com//blog/install-dotnet-on-ubuntu)**
>
>
>

>
> 老王点评：来自官方的 .NET 原生支持终于出现了，不知道有多少 .NET 程序会在 Linux 下运行？
>
>
>


硬核观察 #732 好奇号将通过软件更新提速 50%

Summary: • 好奇号将通过软件更新提速 50% • VisionFive RISC-V 单板机正式得到 Ubuntu 支持 • Linus 破例为 NTFS3 内核驱动更新网开一面

paragon 虽然提交了ntfs3 但是维护得并不积极啊

又不是不能用.webp

# 硬核观察 #732 好奇号将通过软件更新提速 50%

### 好奇号将通过软件更新提速 50%

已经登陆火星达十年之久的好奇号火星车，依靠视觉测程法测量行驶距离，它通常每行驶约 1 米就要停下来检查周围环境的照片，以计算究竟走了多远。这种谨慎的做法使得好奇号的时速只有 45 米，而它本身的硬件能支持每小时 120 米的速度。更新后的软件可以让好奇号在静止时拍摄周围环境照片，而在行驶时检查位置并修正错误。测试显示，好奇号的时速能增加到 83.2 米，提速 50%。

>
> **[消息来源：新科学家](https://www.newscientist.com/article/2332983-curiosity-mars-rover-gets-50-per-cent-speed-boost-from-software-update/)**
>
>
>

>
> 老王点评：一样是“电动车”，要是电动汽车得到这种提升 50% 的升级补丁，怎么也得收个升级费或订阅费啊。
>
>
>

### VisionFive RISC-V 单板机正式得到 Ubuntu 支持

Canonical 正式发布了适用于 VisionFive RISC-V 单板机的 Ubuntu 22.04.1 LTS。作为一款售价 179 美元的单板机，国内厂商赛昉科技的 VisionFive 旨在支撑成熟的 RISC-V Linux 发行版运行。过去几个月，Canonical 工程师一直在努力向后移植各种补丁，以确保 Ubuntu 22.04 LTS 也可在该单板机上良好运行。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/Ubuntu-22.04.1-VisionFive-RISCV)**
>
>
>

>
> 老王点评：说起来，下周二赛昉科技会在线上举办发布会，会发布全球首款高性能、低成本的开源 RISC-V 单板计算机。
>
>
>

### Linus 破例为 NTFS3 内核驱动更新网开一面

Linux 6.0 的合并窗口已经关闭，正常情况下除了修复 bug，不会接受代码清理、功能添加等提交。而在两周的合并窗口期间，开源的 NTFS3 并未带来新功能代码和其它严重 bug 修复。不过，维护者在 rc1 发布后，提交了一批 NTFS3 代码重构和 bug 修复。Linus Torvalds 认为“似乎大多仅为重构和清理 —— 这些内容本该在上一个合并窗口期内出现。不过鉴于这些只涉及 NTFS3 本身，我们认为相关实验还是相当可靠的。”因而破例接纳了这些提交。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/NTFS3-Linux-6.0-Updates)**
>
>
>

>
> 老王点评：毕竟 NTFS3 是 Linus 钟爱的部分。
>
>
>


在 Linux 上截屏的 3 种方法

Summary: 使用我最喜欢的工具在 Linux 上截屏，可以节省时间。

还以为有啥不知道的截图方法呢，点进去一看还是车轱辘话。Linux 上各种截屏软件：

+ CoreShot

+ Deepin Screenshot

+ Escrotum

+ Flameshot

+ GNOME Screenshot

+ grim

+ gscreenshot

+ HotShots

+ imgur-screenshot

+ ksnip

+ Lightscreen

+ LXQt Screenshot

+ maim

+ MATE Screenshot

+ menyoki

+ mss

+ Pantheon Screenshot

+ ScreenCloud

+ ScreenGrab

+ Scrot

+ Shotgun

+ Shutter

+ Spectacle

+ Xfce4 Screenshooter

+ xwd

flameshot 也不错

使用我最喜欢的工具在 Linux 上截屏，可以节省时间。

# 在 Linux 上截屏的 3 种方法

>
> 使用我最喜欢的工具在 Linux 上截屏，可以节省时间。
>
>
>

在写开源软件时，我更喜欢展示一些截图来帮助演示我在说什么。古语有云，一图胜千言。如果你能展示一件事，那通常比试图用言语描述它要好。

有几种方法可以在 Linux 中截图。以下是我在 Linux 上用于捕获截图的三种方法：

### 1、GNOME

GNOME 有一个很棒的内置截图工具。只需按下键盘上的 `PrtScr` 键，GNOME 就会显示一个截图对话框：

默认操作是抓取区域的截图。这是一种在你制作截图时裁剪截图的非常有用的方法。只需将高亮显示框移动到你需要的位置，然后使用“抓取”角来更改大小。或选择其他图标之一以截取整个屏幕或系统上的单个窗口。点击“圆圈”图标进行截图，类似于手机上的“拍照”按钮。 GNOME 截图工具将截图保存在图片文件夹内的截图文件夹中。

### 2、GIMP

如果你需要更多截图选项，你可以使用流行的图像编辑器 GIMP 截图。要进行截图，请选择“<ruby> 文件 <rt>  File </rt></ruby>”并选择“<ruby> 创建 <rt>  Create </rt></ruby>”子菜单，然后选择“<ruby> 截图 <rt>  Screenshot </rt></ruby>”。

该对话框允许你截取单个窗口、整个屏幕或仅一个区域的屏幕截图。我喜欢这个工具可以让你设置一个延迟：选择窗口后多长时间，按下截图后多长时间。当我想截取菜单操作的截图时，我经常使用此功能，因此我有足够的时间去窗口打开菜单。

GIMP 将截图作为新图像打开，你可以对其进行编辑并保存到你喜欢的位置。

### 3、Firefox

如果你需要截取网站的截图，请尝试使用 Firefox 的内置截图程序。右键单击网页正文中的任意位置，然后从菜单中选择“<ruby> 截图 <rt>  Take Screenshot </rt></ruby>”：

Firefox 切换到模态显示，并提示你单击或拖动页面以选择区域，或使用其中一个图标保存整个页面的副本，或仅在浏览器中可见的内容：

当你在屏幕上移动鼠标时，你可能会注意到 Firefox 会高亮显示某些区域。这些是页面上的块元素，例如 `<div>` 或其他块元素。单击该元素以对其进行截图。 Firefox 将截图保存到你的下载文件夹，或你设置为“下载”位置的任何位置。

如果你尝试记录流程，那么截图可以为你节省大量时间。

尝试使用其中一种方法在 Linux 上截图。

（图片来源：Jim Hall，CC BY-SA 40）

---

via: <https://opensource.com/article/22/8/screenshots-linux>

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


用 Python 测试 API 的 3 种方式

Summary: 单元测试可能令人生畏，但是这些 Python 模块会使你的生活变得更容易。

单元测试可能令人生畏，所以我直接不写，BUG 看不见就不是 BUG。

单元测试可能令人生畏，但是这些 Python 模块会使你的生活变得更容易。

# 用 Python 测试 API 的 3 种方式

>
> 单元测试可能令人生畏，但是这些 Python 模块会使你的生活变得更容易。
>
>
>

在这个教程中，你将学到如何对执行 HTTP 请求代码的进行单元测试。也就是说，你将看到用 Python 对 API 进行单元测试的艺术。

单元测试是指对单个行为的测试。在测试中，一个众所周知的经验法则就是隔离那些需要外部依赖的代码。

比如，当测试一段执行 HTTP 请求的代码时，建议在测试过程中，把真正的调用替换成一个假的的调用。这种情况下，每次运行测试的时候，就可以对它进行单元测试，而不需要执行一个真正的 HTTP 请求。

问题就是，*怎样才能隔离这些代码？*

这就是我希望在这篇博文中回答的问题！我不仅会向你展示如果去做，而且也会权衡不同方法之间的优点和缺点。

要求：

* [Python 3.8](https://miguendes.me/how-i-set-up-my-python-workspace)
* pytest-mock
* requests
* flask
* responses
* [VCR.py](http://VCR.py)

### 使用一个天气状况 REST API 的演示程序

为了更好的解决这个问题，假设你正在创建一个天气状况的应用。这个应用使用第三方天气状况 REST API 来检索一个城市的天气信息。其中一个需求是生成一个简单的 HTML 页面，像下面这个图片：

*伦敦的天气，OpenWeatherMap。图片是作者自己制作的。*

为了获得天气的信息，必须得去某个地方找。幸运的是，通过 [OpenWeatherMap](https://miguendes.me/how-i-set-up-my-python-workspace) 的 REST API 服务，可以获得一切需要的信息。

*好的，很棒，但是我该怎么用呢？*

通过发送一个 `GET` 请求到：`https://api.openweathermap.org/data/2.5/weather?q={city_name}&appid={api_key}&units=metric`，就可以获得你所需要的所有东西。在这个教程中，我会把城市名字设置成一个参数，并确定使用公制单位。

### 检索数据

使用 `requests` 模块来检索天气数据。你可以创建一个接收城市名字作为参数的函数，然后返回一个 JSON。JSON 包含温度、天气状况的描述、日出和日落时间等数据。

下面的例子演示了这样一个函数：

```
def find_weather_for(city: str) -> dict:
    """Queries the weather API and returns the weather data for a particular city."""
    url = API.format(city_name=city, api_key=API_KEY)
    resp = requests.get(url)
    return resp.json()

```

这个 URL 是由两个全局变量构成：

```
BASE_URL = "https://api.openweathermap.org/data/2.5/weather"
API = BASE_URL + "?q={city_name}&appid={api_key}&units=metric"

```

API 以这个格式返回了一个 JSON：

```
{
  "coord": {
    "lon": -0.13,
    "lat": 51.51
  },
  "weather": [
    {
      "id": 800,
      "main": "Clear",
      "description": "clear sky",
      "icon": "01d"
    }
  ],
  "base": "stations",
  "main": {
    "temp": 16.53,
    "feels_like": 15.52,
    "temp_min": 15,
    "temp_max": 17.78,
    "pressure": 1023,
    "humidity": 72
  },
  "visibility": 10000,
  "wind": {
    "speed": 2.1,
    "deg": 40
  },
  "clouds": {
    "all": 0
  },
  "dt": 1600420164,
  "sys": {
    "type": 1,
    "id": 1414,
    "country": "GB",
    "sunrise": 1600407646,
    "sunset": 1600452509
  },
  "timezone": 3600,
  "id": 2643743,
  "name": "London",
  "cod": 200

```

当调用 `resp.json()` 的时候，数据是以 Python 字典的形式返回的。为了封装所有细节，可以用 `dataclass` 来表示它们。这个类有一个工厂方法，可以获得这个字典并且返回一个 `WeatherInfo` 实例。

这种办法很好，因为可以保持这种表示方法的稳定。比如，如果 API 改变了 JSON 的结构，就可以在同一个地方（`from_dict` 方法中）修改逻辑。其他代码不会受影响。你也可以从不同的源获得信息，然后把它们都整合到 `from_dict` 方法中。

```
@dataclass
class WeatherInfo:
    temp: float
    sunset: str
    sunrise: str
    temp_min: float
    temp_max: float
    desc: str

    @classmethod
    def from_dict(cls, data: dict) -> "WeatherInfo":
        return cls(
            temp=data["main"]["temp"],
            temp_min=data["main"]["temp_min"],
            temp_max=data["main"]["temp_max"],
            desc=data["weather"][0]["main"],
            sunset=format_date(data["sys"]["sunset"]),
            sunrise=format_date(data["sys"]["sunrise"]),
        )

```

现在来创建一个叫做 `retrieve_weather` 的函数。使用这个函数调用 API，然后返回一个 `WeatherInfo`，这样就可创建你自己的 HTML 页面。

```
def retrieve_weather(city: str) -> WeatherInfo:
    """Finds the weather for a city and returns a WeatherInfo instance."""
    data = find_weather_for(city)
    return WeatherInfo.from_dict(data)

```

很好，我们的 app 现在有一些基础了。在继续之前，对这些函数进行单元测试。

### 1、使用 mock 测试 API

[根据维基百科](https://en.wikipedia.org/wiki/Mock_object)，<ruby> 模拟对象 <rt>  mock object </rt></ruby>是通过模仿真实对象来模拟它行为的一个对象。在 Python 中，你可以使用 `unittest.mock` 库来<ruby> 模拟 <rt>  mock </rt></ruby>任何对象，这个库是标准库中的一部分。为了测试 `retrieve_weather` 函数，可以模拟 `requests.get`，然后返回静态数据。

#### pytest-mock

在这个教程中，会使用 `pytest` 作为测试框架。通过插件，`pytest` 库是非常具有扩展性的。为了完成我们的模拟目标，要用 `pytest-mock`。这个插件抽象化了大量 `unittest.mock` 中的设置，也会让你的代码更简洁。如果你感兴趣的话，我在 [另一篇博文中](https://miguendes.me/7-pytest-plugins-you-must-definitely-use) 会有更多的讨论。

*好的，言归正传，现在看代码。*

下面是一个 `retrieve_weather` 函数的完整测试用例。这个测试使用了两个 `fixture`：一个是由 `pytest-mock` 插件提供的 `mocker` fixture, 还有一个是我们自己的。就是从之前请求中保存的静态数据。

```
@pytest.fixture()
def fake_weather_info():
    """Fixture that returns a static weather data."""
    with open("tests/resources/weather.json") as f:
        return json.load(f)

```

```
def test_retrieve_weather_using_mocks(mocker, fake_weather_info):
    """Given a city name, test that a HTML report about the weather is generated
    correctly."""
    # Creates a fake requests response object
    fake_resp = mocker.Mock()
    # Mock the json method to return the static weather data
    fake_resp.json = mocker.Mock(return_value=fake_weather_info)
    # Mock the status code
    fake_resp.status_code = HTTPStatus.OK

    mocker.patch("weather_app.requests.get", return_value=fake_resp)

    weather_info = retrieve_weather(city="London")
    assert weather_info == WeatherInfo.from_dict(fake_weather_info)

```

如果运行这个测试，会获得下面的输出：

```
============================= test session starts ==============================
...[omitted]...
tests/test_weather_app.py::test_retrieve_weather_using_mocks PASSED      [100%]
============================== 1 passed in 0.20s ===============================
Process finished with exit code 0

```

很好，测试通过了！但是...生活并非一帆风顺。这个测试有优点，也有缺点。现在来看一下。

#### 优点

好的，有一个之前讨论过的优点就是，通过模拟 API 的返回值，测试变得简单了。将通信和 API 隔离，这样测试就可以预测了。这样总会返回你需要的东西。

#### 缺点

对于缺点，问题就是，如果不再想用 `requests` 了，并且决定回到标准库的 `urllib`，怎么办。每次改变 `find_weather_for` 的代码，都得去适配测试。好的测试是，当你修改代码实现的时候，测试时不需要改变的。所以，通过模拟，你最终把测试和实现耦合在了一起。

而且，另一个不好的方面是你需要在调用函数之前进行大量设置——至少是三行代码。

```
...
    # Creates a fake requests response object
    fake_resp = mocker.Mock()
    # Mock the json method to return the static weather data
    fake_resp.json = mocker.Mock(return_value=fake_weather_info)
    # Mock the status code
    fake_resp.status_code = HTTPStatus.OK
...

```

*我可以做的更好吗？*

是的，请继续看。我现在看看怎么改进一点。

### 使用 responses

用 `mocker` 功能模拟 `requests` 有点问题，就是有很多设置。避免这个问题的一个好办法就是使用一个库，可以拦截 `requests` 调用并且给它们 <ruby> 打补丁 <rt>  patch </rt></ruby>。有不止一个库可以做这件事，但是对我来说最简单的是 `responses`。我们来看一下怎么用，并且替换 `mock`。

```
@responses.activate
def test_retrieve_weather_using_responses(fake_weather_info):
    """Given a city name, test that a HTML report about the weather is generated
    correctly."""
    api_uri = API.format(city_name="London", api_key=API_KEY)
    responses.add(responses.GET, api_uri, json=fake_weather_info, status=HTTPStatus.OK)

    weather_info = retrieve_weather(city="London")
    assert weather_info == WeatherInfo.from_dict(fake_weather_info)

```

这个函数再次使用了我们的 `fake_weather_info` fixture。

然后运行测试：

```
============================= test session starts ==============================
...
tests/test_weather_app.py::test_retrieve_weather_using_responses PASSED  [100%]
============================== 1 passed in 0.19s ===============================

```

非常好！测试也通过了。但是...并不是那么棒。

#### 优点

使用诸如 `responses` 这样的库，好的方面就是不需要再给 `requests` <ruby> 打补丁 <rt>  patch </rt></ruby>。通过将这层抽象交给库，可以减少一些设置。然而，如果你没注意到的话，还是有一些问题。

#### 缺点

和 `unittest.mock` 很像，测试和实现再一次耦合了。如果替换 `requests`，测试就不能用了。

### 2、使用适配器测试 API

*如果用模拟让测试耦合了，我能做什么？*

设想下面的场景：假如说你不能再用 `requests` 了，而且必须要用 `urllib` 替换，因为这是 Python 自带的。不仅仅是这样，你了解了不要把测试代码和实现耦合，并且你想今后都避免这种情况。你想替换 `urllib`，也不想重写测试了。

事实证明，你可以抽象出执行 `GET` 请求的代码。

*真的吗？怎么做？*

可以使用<ruby> 适配器 <rt>  adapter </rt></ruby>来抽象它。适配器是一种用来封装其他类的接口，并作为新接口暴露出来的一种设计模式。用这种方式，就可以修改适配器而不需要修改代码了。比如，在 `find_weather_for` 函数中，封装关于 `requests` 的所有细节，然后把这部分暴露给只接受 URL 的函数。

所以，这个：

```
def find_weather_for(city: str) -> dict:
    """Queries the weather API and returns the weather data for a particular city."""
    url = API.format(city_name=city, api_key=API_KEY)
    resp = requests.get(url)
    return resp.json()

```

变成这样：

```
def find_weather_for(city: str) -> dict:
    """Queries the weather API and returns the weather data for a particular city."""
    url = API.format(city_name=city, api_key=API_KEY)
    return adapter(url)

```

然后适配器变成这样：

```
def requests_adapter(url: str) -> dict:
    resp = requests.get(url)
    return resp.json()

```

现在到了重构 `retrieve_weather` 函数的时候：

```
def retrieve_weather(city: str) -> WeatherInfo:
    """Finds the weather for a city and returns a WeatherInfo instance."""
    data = find_weather_for(city, adapter=requests_adapter)
    return WeatherInfo.from_dict(data)

```

所以，如果你决定改为使用 `urllib` 的实现，只要换一下适配器：

```
def urllib_adapter(url: str) -> dict:
    """An adapter that encapsulates urllib.urlopen"""
    with urllib.request.urlopen(url) as response:
        resp = response.read()
    return json.loads(resp)

```

```
def retrieve_weather(city: str) -> WeatherInfo:
    """Finds the weather for a city and returns a WeatherInfo instance."""
    data = find_weather_for(city, adapter=urllib_adapter)
    return WeatherInfo.from_dict(data)

```

*好的，那测试怎么做？*

为了测试 `retrieve_weather`, 只要创建一个在测试过程中使用的假的适配器：

```
@responses.activate
def test_retrieve_weather_using_adapter(
    fake_weather_info,
):
    def fake_adapter(url: str):
        return fake_weather_info

    weather_info = retrieve_weather(city="London", adapter=fake_adapter)
    assert weather_info == WeatherInfo.from_dict(fake_weather_info)

```

如果运行测试，会获得：

```
============================= test session starts ==============================
tests/test_weather_app.py::test_retrieve_weather_using_adapter PASSED    [100%]
============================== 1 passed in 0.22s ===============================

```

#### 优点

这个方法的优点是可以成功将测试和实现解耦。使用<ruby>   依赖注入  <rt>  dependency injection </rt></ruby>在测试期间注入一个假的适配器。你也可以在任何时候更换适配器，包括在运行时。这些事情都不会改变任何行为。

#### 缺点

缺点就是，因为你在测试中用了假的适配器，如果在实现中往适配器中引入了一个 bug，测试的时候就不会发现。比如说，往 `requests` 传入了一个有问题的参数，像这样：

```
def requests_adapter(url: str) -> dict:
    resp = requests.get(url, headers=<some broken headers>)
    return resp.json()

```

在生产环境中，适配器会有问题，而且单元测试没办法发现。但是事实是，之前的方法也会有同样的问题。这就是为什么不仅要单元测试，并且总是要集成测试。也就是说，要考虑另一个选项。

### 3、使用 VCR.py 测试 API

现在终于到了讨论我们最后一个选项了。诚实地说，我也是最近才发现这个。我用<ruby> 模拟 <rt>  mock </rt></ruby>也很长时间了，而且总是有一些问题。`VCR.py` 是一个库，它可以简化很多 HTTP 请求的测试。

它的工作原理是将第一次运行测试的 HTTP 交互记录为一个 YAML 文件，叫做 `cassette`。请求和响应都会被序列化。当第二次运行测试的时候，`VCT.py` 将拦截对请求的调用，并且返回一个响应。

现在看一下下面如何使用 `VCR.py` 测试 `retrieve_weather`：

```
@vcr.use_cassette()
def test_retrieve_weather_using_vcr(fake_weather_info):
    weather_info = retrieve_weather(city="London")
    assert weather_info == WeatherInfo.from_dict(fake_weather_info)

```

*天呐，就这样？没有设置？`@vcr.use_cassette()` 是什么？*

是的，就这样！没有设置，只要一个 `pytest` 标注告诉 VCR 去拦截调用，然后保存 cassette 文件。

*cassette 文件是什么样？*

好问题。这个文件里有很多东西。这是因为 VCR 保存了交互中的所有细节。

```
interactions:
- request:
    body: null
    headers:
      Accept:
      - '*/*'
      Accept-Encoding:
      - gzip, deflate
      Connection:
      - keep-alive
      User-Agent:
      - python-requests/2.24.0
    method: GET
    uri: https://api.openweathermap.org/data/2.5/weather?q=London&appid=<YOUR API KEY HERE>&units=metric
  response:
    body:
      string: '{"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":800,"main":"Clear","description":"clearsky","icon":"01d"}],"base":"stations","main":{"temp":16.53,"feels_like":15.52,"temp_min":15,"temp_max":17.78,"pressure":1023,"humidity":72},"visibility":10000,"wind":{"speed":2.1,"deg":40},"clouds":{"all":0},"dt":1600420164,"sys":{"type":1,"id":1414,"country":"GB","sunrise":1600407646,"sunset":1600452509},"timezone":3600,"id":2643743,"name":"London","cod":200}'
    headers:
      Access-Control-Allow-Credentials:
      - 'true'
      Access-Control-Allow-Methods:
      - GET, POST
      Access-Control-Allow-Origin:
      - '*'
      Connection:
      - keep-alive
      Content-Length:
      - '454'
      Content-Type:
      - application/json; charset=utf-8
      Date:
      - Fri, 18 Sep 2020 10:53:25 GMT
      Server:
      - openresty
      X-Cache-Key:
      - /data/2.5/weather?q=london&units=metric
    status:
      code: 200
      message: OK
version: 1

```

*确实很多！*

真的！好的方面就是你不需要留意它。`VCR.py` 会为你安排好一切。

#### 优点

现在看一下优点，我可以至少列出五个：

* 没有设置代码。
* 测试仍然是分离的，所以很快。
* 测试是确定的。
* 如果你改了请求，比如说用了错误的 header，测试会失败。
* 没有与代码实现耦合，所以你可以换适配器，而且测试会通过。唯一有关系的东西就是请求必须是一样的。

#### 缺点

再与模拟相比较，除了避免了错误，还是有一些问题。

如果 API 提供者出于某种原因修改了数据格式，测试仍然会通过。幸运的是，这种情况并不经常发生，而且在这种重大改变之前，API 提供者通常会给他们的 API 提供不同版本。

另一个需要考虑的事情是<ruby> 就地 <rt>  in place </rt></ruby><ruby> 端到端 <rt>  end-to-end </rt></ruby>测试。每次服务器运行的时候，这些测试都会调用。顾名思义，这是一个范围更广、更慢的测试。它们会比单元测试覆盖更多。事实上，并不是每个项目都需要使用它们。所以，就我看来，`VCR.py` 对于大多数人的需求来说都绰绰有余。

### 总结

就这么多了。我希望今天你了解了一些有用的东西。测试 API 客户端应用可能会有点吓人。然而，当武装了合适的工具和知识，你就可以驯服这个野兽。

在 [我的 Github](https://github.com/miguendes/tutorials/tree/master/testing_http) 上可以找到这个完整的应用。

*这篇文章最早发表在 [作者的个人博客](https://miguendes.me/3-ways-to-test-api-client-applications-in-python)，授权转载*

---

via: <https://opensource.com/article/21/9/unit-test-python>

作者：[Miguel Brito](https://opensource.com/users/miguendes) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Yufei-Yan](https://github.com/Yufei-Yan) 校对：[wxy](https://github.com/wxy)

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


在《毁灭战士》中应用二叉空间分割（BSP）是何等天才之举？

Summary: 如果按照从霍默·辛普森到阿尔伯特·爱因斯坦的顺序为天才列出一套级别体系，那么卡马克将二叉空间分割技术运用于《毁灭战士》的做法究竟属于什么级别的天才之举呢？

别发这种过时的技术了，BSP 早就不用于渲染了。

—— zhihu.com/pin/1544106562658127872

很不错

这个介绍不错

这个介绍不错

# 在《毁灭战士》中应用二叉空间分割（BSP）是何等天才之举？

1993 年，游戏开发公司 id Software 发行了一款第一人称射击游戏 《<ruby> 毁灭战士 <rt>  DOOM </rt></ruby>》，游戏一经发行迅速爆火。在今天看来，《毁灭战士》可谓有史以来最具影响力的游戏之一。

《毁灭战士》发行之后的第十年（2003 年），记者 <ruby> 大卫·库什纳 <rt>  David Kushner </rt></ruby> 出版了一本关于 id Software 的书，书名为《<ruby> Doom 启示录 <rt>  Masters of Doom </rt></ruby>》，后被奉为记录毁灭战士创作史的典范读物。几年前我曾读过这本书，如今内容已记得不太真切了，但是书中有一个关于 id Software 首席程序员 <ruby> 约翰·卡马克 <rt>  John Carmack </rt></ruby> 的故事，我印象特别深刻。这里只对故事做粗略描述（具体情节请往下阅读）。实际上，早在《毁灭战士》开发前期，卡马克就发现自己为这款游戏编写的 3D 渲染器在渲染某些关卡时慢得像爬一样。对于《毁灭战士》这一对动感和速度有着相当高要求的射击游戏来说，这是一个非常严重的问题。意识到了这一问题的严重性，卡马克需要一个更加有效的渲染算法，于是他开始阅读相关论文。最后，他实现了一种叫做“<ruby> 二叉空间分割 <rt>  binary space partitioning </rt></ruby>（BSP）”的技术，极大地提升了《毁灭战士》游戏引擎的运行速度，而这项技术此前从未用于电子游戏当中。

一直以来，我对这个故事的印象十分深刻。卡马克将学术前沿研究运用于电子游戏之中，我觉得这正是他之所以成为传奇人物的原因。无论从哪个角度来看，卡马克都应该是电子游戏行业中人尽皆知的典型的天才程序员，只不过上面这个故事是我最先能够想到的理由。

显而易见，“二叉空间分割”这个术语听起来就是难度相当高的课题，能够自行阅读论文并将其付诸实施实属不易，所以这个故事给我留下了深刻的印象。我一直认为卡马克的做法十分具有创见性，不过由于我既不懂二叉空间分割到底是怎样的一项技术，也不晓得这项技术在当时究竟有多么革新，所以我也并不确定自己的观点是否正确。如果按照从 <ruby> 霍默·辛普森 <rt>  Homer Simpson </rt></ruby>（LCTT 译注：《辛普森一家人》中的那个老爹）到 <ruby> 阿尔伯特·爱因斯坦 <rt>  Albert Einstein </rt></ruby> 的顺序为天才列出一套级别体系，那么卡马克将二叉空间分割技术运用于《毁灭战士》的做法究竟属于什么级别的天才之举呢？

同时，我也在想，二叉空间分割这个概念最初是从哪儿来的，又是怎样吸引到卡马克的？因此，本篇文章不仅仅会讲述约翰·卡马克和《毁灭战士》的故事，也会探讨二叉空间分割树（BSP 树）数据结构的发展历史。有意思的是，BSP 树和计算机科学领域其他许多技术一样，最初都起源于军事研究领域。

没错，《毁灭战士》的第一关卡 E1M1 就受到了美国空军的启发。

### VSD 难题

BSP 树是计算机图形领域最具挑战性难题的解决方案之一。举个例子，为了渲染出三维场景，渲染器必须能够区分在一个特定角度下的可见物体和不可见物体。如果渲染时间比较充足，这一要求也算不上大问题；但是就理想情况来说，实时游戏引擎在 1 秒内至少需要完成 30 次区分任务。

这一问题有时被称为 <ruby> 可见面检测 <rt>  visible surface determination </rt></ruby>（VSD）问题。后来与卡马克合作开发《<ruby> 雷神之锤 <rt>  Quake </rt></ruby>》（id Software 继《毁灭战士》之后开发的游戏）的程序员 <ruby> 迈克尔·亚伯拉什 <rt>  Michael Abrash </rt></ruby>，在自己的著作《<ruby> 图形程序开发人员指南 <rt>  Graphics Programming Black Book </rt></ruby>》 中写道：

>
> 我想探讨一下在我看来 3D 中最棘手的一个问题：可见面检测问题（在每个像素点上绘制合适的表面）以及与之密切相关的隐面消除问题（迅速去除不可见的多边形，用于加快可见表面检测速度）。简略起见，我将在下文采用缩写 VSD 来表示可见面检测和隐面消除。
>
>
> 为什么我会认为 VSD 是 3D 中最棘手的问题呢？尽管纹理映射等光栅化问题更让人感兴趣而且也更重要，但是相对而言，它们是范围相对有限的任务。随着 3D 加速器的出现，它们逐渐被转移到硬件中。同时，它们只随着屏幕分辨率的增加而增加，而分辨率的增加是相对温和的。
>
>
> 相反，VSD 却像是一个无底洞，目前应对方案也有很多。但实际上，在采用简单的方法处理 VSD 时，其性能会直接受到场景复杂程度的影响，而场景的复杂程度通常会以平方级或立方级的形式增大。所以在渲染过程中，VSD 很快就会成为制约因素。   [1]
>
>
>

亚伯拉什是在上个世纪九十年代末写的关于 VSD 问题的这些困难，这是在《毁灭战士》之后数年，这款游戏证明了普通人盼望着能用自家电脑玩很吃图形配置的游戏。九十年代早期，id Software 成立后发行了一些游戏。尽管当时的计算机还只是用来处理文字与表格或者执行其他任务，未尝想过要在上面运行游戏，id Software 必须对发行的游戏进行编程，使其能在计算机上流畅运行。为了实现这一飞跃，尤其是为了能让在《毁灭战士》之前 id Software 发行的少数 3D 游戏在电脑上运行，id Software 必须做出革新。在这些游戏中，所有的关卡在设计时都受到了一定限制，以便更容易解决 VSD 问题。

例如，在《毁灭战士》之前，id Software 发行了《<ruby> 德军总部 3D 版 <rt>  Wolfenstein 3D 版 </rt></ruby>》，该游戏的每一个关卡都是由与坐标轴平齐的墙壁组成。换言之，在《德军总部 3D 版》的游戏画面里，你看到的只有南北方向或者东西方向的墙壁。在游戏中，墙壁与墙壁之间有着固定的间隔，所有过道的宽度或是一个方格，或是两个方格等等，但绝不会出现 2.5 个方格。如此一来，尽管 id Software 团队只能设计出外观十分相似的关卡，但这也让卡马克为 《德军总部 3D 版》 编写渲染器的工作简单了不少。

通过将屏幕上的光线“齐射”入虚拟游戏世界，《德军总部 3D 版》的渲染器解决了 VSD 问题。通常来说，使用光线的渲染器叫做“光线投射”渲染器。这种渲染器的速度一般较慢，因为解决内部的 VSD 问题涉及到在光线和游戏中的物体之间找到第一个交点，这通常需要进行大量的计算。但在 《德军总部 3D 版》，由于所有的墙壁都与网格平齐，所以光线与墙壁相交的位置只能在网格线上。如此一来，渲染器只需逐个检查这些交点即可。如果渲染器先从离玩家视角最近的交点开始检查，接着检查下一个最近的交点，以此类推，最后遇到第一面墙壁时停止检查。这样，VSD 问题便轻而易举地得到了解决。光线从每一个像素点向前投射，与画面物体接触时停止，这一方法是可行的。因为从 CPU 资源来看，投射的成本很低。事实上，由于每面墙壁高度相同，因此针对同列的像素点，投射的光线只需一条。

尽管当时还没有专业的图形显卡，《德军总部 3D 版》凭借这一取巧之法得以在配置较低的个人电脑上正常运行起来。然而，这个办法并不适用于《毁灭战士》。因为 id Software 为这款新游戏增添了许多新元素 —— 倾斜的墙面、楼梯以及高低不一的天花板。光线投射的办法自然也就不好用了，于是卡马克编写出了一个新的渲染器。《德军总部 3D 版》的渲染器关注的是图像，将光线投射到屏幕像素表示的列上，而 《毁灭战士》 关注的则是物体。换句话说，《毁灭战士》 的渲染器会记录游戏场景中的所有物体，继而将其投射到屏幕当中；而非记录屏幕上的像素点，判断每个像素点的颜色。

对于强调物体的渲染器来说，可以使用 Z 缓冲区来解决 VSD 问题，比较简单。每次将物体投射到屏幕上时，需要对每个用于绘制的像素点进行检查。如果你想绘制出的物体的部分和已经绘制在目标像素点上的物体相比更加靠近玩家，可以将其覆盖。否则，必须保持像素不变。尽管办法很简单，但是 Z 缓冲区对内存的要求较高，而且渲染器可能仍然要花费大量的 CPU 资源来投射玩家永远不会看到的水平几何体。

在 20 世纪 90 年代，使用 Z 缓冲区的方法还存在着其他缺陷：IBM 兼容机（PC）搭载的是一种叫 VGA 的显示适配器系统，在这类电脑上，将图像写入帧缓冲区的成本非常之高。因此，在只会以后被覆盖的像素上绘制花费的时间拖慢了渲染器的性能。

考虑到将图像写入帧缓冲区的成本非常之高，理想的渲染器需要首先绘制离玩家最近的物体，接着是比较近的物体，以此类推，直到屏幕上每个像素点都写入了信息。这时，渲染器会停止运行，大幅缩短远处不可见物体的渲染时间。这种由近及远对物体进行排序的方法也可以解决 VSD 问题。那么问题又来了：什么才是玩家可以看到的？

最初，卡马克打算依靠《毁灭战士》的关卡布局来解决 VSD 问题。首先用渲染器绘制出玩家目前所在房间的墙壁，之后玩家冲进隔壁房间，再绘制出隔壁房间的墙壁。由于每个房间互不遮挡，这一办法也能解决 VSD 问题。而互相遮挡的房间可以分割成若干互不遮挡的“区域”。在 YouTube 上的一个 [视频](https://youtu.be/HQYsFshbkYw?t=822) 中，Bisqwit 展示了自己制作出来的使用了相同算法的渲染器。可以看到，如果以超慢的速度运行，便能一睹渲染的具体过程。这一算法同样运用到了《毁灭公爵 3D 版》当中，这款游戏在 《毁灭战士》 推出三年之后发行，当时 CPU 的性能也更加强大了。1993 年，尽管在硬件上已经可以运行游戏了，但是使用这一算法的《毁灭战士》渲染器在复杂的层级结构上依旧表现吃力，尤其是在房间分割出来的各部分相互嵌套的情况下。不巧的是，这类层级结构正是构造环形楼梯等物体的唯一办法。沿着环形楼梯走下去，直到走入已经绘制好的区域，由于这其中涉及多次循环下降运动，导致游戏引擎的运行速度大幅降低。

在 id Software 团队意识到《毁灭战士》游戏引擎的速度可能过慢时，公司还面临着其他任务：将《德军总部 3D 版》移植到超级任天堂游戏机（简称“超任”）上。那时，超任的性能比 IBM 兼容机还要差。结果表明，尽管光线投射渲染器非常简单，但是想要在超任上快速运行是不可能的。于是，卡马克着手研究更为高效的算法。事实上，也正是为了顺利将《德军总部》移植到超任，卡马克首次研究了二叉空间分割技术，并将其付诸应用。由于《德军总部 3D 版》的墙壁与坐标轴平齐，所以二叉空间分割技术应用起来也比较简单直接；但是《毁灭战士》的情况则比较复杂。不过，卡马克发现，二叉空间分割树同样可以用来解决《毁灭战士》速度过慢的问题。

### 二叉空间分割

<ruby> 二叉空间分割 <rt>  binary space partitioning </rt></ruby>（BSP）会提前将 3D 场景分割为若干部分，使 VSD 问题易于解决。讲到这里，你需要先了解一下为什么分割场景可以奏效：如果你在场景上画条线（对应三维空间里的一个平面），你就可以指出玩家或者摄像机视角在这条线的哪一侧，在这条线另一侧的物体无法遮挡玩家所在一侧的物体。如果多次重复这一操作，该三维场景最终会被分割为多个区域，这并不是对原始场景的改进，只是现在你知道了更多关于场景的不同部分会如何相互阻挡。

首次阐述上述三维场景分割的是美国空军的研究员，他们曾尝试向美国空军证明计算机图形已经非常先进，可以应用到飞行模拟器领域。1969 年，他们将研究发现发表在一份题为《计算机生成图像在图形仿真中的应用研究》的报告中。该报告的总结部分指出，计算机图形可用于训练飞行员，但也警告说，其实际应用可能会受制于 VSD 问题：

>
> 实时图像处理需要解决的一个关键问题就是优先级问题，或称隐藏线问题。在我们平时用眼睛观察外界时，大自然替我们轻易地解决了这一问题：不透明物体上的一个点，掩盖了同一视觉方向上、且距离较远的所有其它物体。但在计算机中，这项任务却非常困难。图像处理需要解决的优先级问题，随着环境复杂程度的增加，计算量会呈指数级增长，随即就会超过绘制物体透视图所需的计算负载。   [2]
>
>
>

他们在报告中提出了一项基于构造“遮挡矩阵”的方案，这一方案据说早些时候曾被应用于 NASA 的项目当中。研究员指出，平面将场景一分为二，可用来解决平面两侧物体之间存在的“任何优先级问题”。通常情况下，可能需要明确将这些平面添加到场景中，但对某些几何体，只需借助你已经拥有的几何体的表面即可。他们举了一个例子，如下图：p 1、p 2 以及 p 3 是三个不同的平面，如果摄像机视角位于其中一个平面的前方，即“正”面，p i 的值就等于 1。这种矩阵展示出基于三个不同平面和摄像机视角位置的三个物体之间的关系 —— 如果物体 a i 遮挡了物体 a j，那么 a ij 在此矩阵中的数值等于 1。

研究人员指出，这种矩阵可以应用到硬件中，对每一帧进行重新评估。该矩阵基本上可以用作大型的开关，或者一种预置的 Z 缓冲区。在绘制给定的物体时，如果在物体所在列上得出数值 1，并且所在行已经在绘制中，那么物体被遮挡的部分就不会绘制出来。

不过，该矩阵方法的主要缺点在于，为了在场景中表示出 n 个物体，你需要一个尺寸为 n 2 的矩阵。于是，研究人员们继续深入，探究将遮挡矩阵表示为“优先级列表”的可行性，该列表的尺寸是 n，可确定物体绘制的顺序。他们随即发现，诸如上图此类场景根本无法确定顺序（因为它存在循环阻塞的现象）。因此，他们花了很多时间来阐明“合适”与“不合适”场景之间的数学区别。最后，他们得出了一个结论：至少对于“合适的”场景下，优先级列表是可以制作出来的；而对场景设计师来说，避免设计出“不合适”的场景也不是一件难事。但是，他们并没有说明如何生成该列表。可以说，这份 1969 年的研究的首要贡献在于提出了：至少，在 *理论上*，可以采用平面分割的方法，对场景中的物体进行渲染排序。

直到 1980 年，一份题为《基于优先级树结构的可见表面生成》的论文提出了解决该问题的具体算法。在这份论文中，作者 <ruby> 亨利·福克斯 <rt>  Henry Fuchs </rt></ruby>、<ruby> 泽维·凯德姆 <rt>  Zvi Kedem </rt></ruby> 以及 <ruby> 布鲁斯·内勒 <rt>  Bruce Naylor </rt></ruby> 介绍了 BSP 树。他们指出，这种新的数据结构“可以替代十年前首次使用，但由于一些问题未得到广泛发展的方案”（即前文 1969 年美国空军相关研究中的方案）。   [3]  BSP 树一经生成，即可用于确定场景中物体的优先级顺序。

三人在论文中对 BSP 树的工作原理给出了相当可读的解释。但在本文，我将尝试使用更加通俗的语言，介绍给大家。

首先，在场景中选定一个多边形，将该多边形所在的平面作为分割平面。同时，该多边形充当树的根节点。场景中剩下的多边形会分散在分割平面的两侧。位于分割表面“前方”或者与分割平面相交后位于“前”半部分的多边形落在了根节点左侧的左子树上；位于分割表面“后方”或者与分割平面相交后位于“后”半部分的多边形落在了右子树上。接着，递归重复这一过程：在左子树和右子树上各选定一个多边形，作为各自空间新的分割平面，继而二分出来更多的子空间和子树。等到全部的多边形均选定之后，二叉空间分割也就结束了。

假设你想由后向前将场景中的几何图形进行渲染。（这就是所谓的“<ruby> 画家算法 <rt>  painter's algorithm </rt></ruby>”。因为在绘制时，距离摄像机较远的多边形会被距离摄像机较近的多边形所覆盖，借此正确进行渲染任务。）如果想要实现这一算法，必须按顺序遍历 BSP 树，左右子树的渲染顺序由摄像机视角与节点所在分割平面的位置关系决定的。因此，针对树上的每个节点，首先渲染距离分割平面较“远”一侧的所有多边形，接着是位于平面上的多边形，最后是距离平面较“近”一侧的所有多边形 —— “远”与“近”相对于摄像机视角而言。根据前文，距离分割平面较远一侧的多边形无法遮挡近侧的物体，所以这种方法可以解决 VSD 问题。

下图表示一个简单的二维场景的 BSP 树的构造与遍历过程。在二维中，分割平面变成了分割线，但就基本原理而言，与复杂的三维场景并无二致。

第一步：根分割线落在 D 墙上，将剩下的几何图形分为两组。

第二步：继续分割位于 D 墙两侧的空间。C 墙是其中一侧的唯一一堵墙壁，因此无需再分。另一侧，B 墙形成新的分割平面。因为 A 墙与新的分割平面相交，所以必须将其分割为两堵墙。

第三步：参照右上方视角，由后向前对墙壁进行排序，对执行画家算法很有帮助。这就是树的顺序遍历过程。

福克斯、凯德姆以及内勒多次强调了 BSP 树的优势：它只需构建一次。可能有些难以置信，但实际上无论摄像机视角位于何处，同一棵 BSP 树都可以用来渲染一个场景。只要场景中的多边形没有移动，BSP 树就不会失效。因此，BSP 树在实时渲染任务中非常实用 —— 构建树时的所有艰巨任务都可以在渲染工作开展之前完成。

同时，三人也提到了一项需要进一步深入研究的问题：究竟怎样才能构建出一棵 “高质量的” BSP 树？BSP 树的质量取决于用作分割平面的多边形的选择。我在前文跳过了这一问题，不过如果用作分割平面的多边形与其他多边形相交，那么为了让 BSP 算法发挥作用，必须将相交的多边形一分为二，这样两部分就可以分在不同的空间。但是如果这种现象反复出现，BSP 树的构建势必会大幅增加场景中多边形的数量。

内勒后来在其 1993 年的论文《构建高质量的分割树》中提及这一问题。卡马克的同事，id Software 的共同创始人 <ruby> 约翰·罗梅洛 <rt>  John Romero </rt></ruby> 指出，这篇论文是卡马克在《毁灭战士》中引入 BSP 树时读到的论文之一。   [4]

### 《毁灭战士》中的 BSP 树

别忘了，卡马克首次为《毁灭战士》设计渲染器时，通过让渲染器渲染玩家所在房间之外的临近房间，试图为关卡几何图形建立一套渲染顺序。对此，BSP 树是个不错的选择，因为在玩家进入之前的房间（区域）时，BSP 树能够避免让渲染器重复劳动，从而节省 CPU 资源。

实际上，“将 BSP 树引入《毁灭战士》”意味着将 BSP 树生成器引入《毁灭战士》的关卡编辑器中。当完成一个《毁灭战士》的关卡的制作时，BSP 树就会在关卡几何图形的基础上生成。根据程序员 <ruby> 法比安·桑格勒德 <rt>  Fabien Sanglard </rt></ruby> 的说法，在原版《毁灭战士》中，一个关卡的 BSP 树生成时间需要 8 秒，全部关卡合计共需 11 分钟    [5] 。之所以生成时间较长，部分原因在于卡马克所用的 BSP 生成算法，该算法尝试使用各种启发式方法找出 “高质量” BSP 树。在运行时，8 秒的延时可能让人无法接受；但是离线等 8 秒，时间并不算长，尤其是考虑到 BSP 树提升了渲染器的性能。为每个关卡生成的 BSP 树将在游戏启动时作为关卡数据载入。

卡马克对 1980 年论文中提出的 BSP 树算法进行了改造，因为在《毁灭战士》开始运行时，当前关卡的 BSP 树就会读取到内存中，渲染器通过 BSP 树由前向后绘制物体，而非由后向前进行绘制。福克斯三人在那篇论文中演示了 BSP 树可用于执行由后向前的画家算法，但是画家算法会造成许多重复的绘制任务，对于 IBM 兼容机来说负担较大。因此，《毁灭战士》的渲染器换了个方向，首先绘制距离玩家较近的图形，之后再绘制离玩家较远的。这种反向排序很容易通过 BSP 树来实现，因为你可以在树的每个节点都进行反向遍历。为了避免绘制出来的远处图形遮挡到近处的图形，《毁灭战士》的渲染器使用了一种隐式 Z 缓冲区，这种缓冲区不仅具备普通 Z 缓冲区的优势，而且对内存的要求也较低。这种 Z 缓冲区有两组数组，一组记录水平方向的遮挡关系，另两组记录自屏幕顶部和底部的垂直方向的遮挡关系。《毁灭战士》的渲染器就算不使用实际的 Z 缓冲区也无伤大雅，因为从技术上来看它并不是真正的 3D 游戏。BSP 树数据结构的成本虽然不高，但却能够起作用，其原因在于《毁灭战士》不会发生以下问题：水平方向的遮挡数组能够发挥作用，是因为该游戏中没有倾斜的墙体；垂直方向的遮挡数组能够发挥作用，是因为该游戏不存在有着一上一下两扇窗户的墙体。

剩下比较棘手的问题是如何将《毁灭战士》中处于运动中的角色融入到借助 BSP 树绘制的静止的关卡几何图形中。该游戏中的敌人不可能纳入 BSP 树之中，因为他们会移动，而 BSP 树只对静止的几何形状起作用。所以渲染器首先绘制静止的关卡几何图形，同时与另一个内存使用效率较高的数据结构协作，记录屏幕上分割出来用于绘制的区域。之后，渲染器按照由后往前的顺序绘制敌人，并消除被屏幕上的区域遮挡住的敌人。这一过程与使用 BSP 树进行渲染相比，效果稍差一些。但是由于关卡中能看到的敌人的数量少于几何图形的数量，所以速度并不是一个严重的问题。

将 BSP 树应用到《毁灭战士》中可谓一大成功。卡马克能够想到 BSP 树是解决 VSD 问题的最佳方案，无疑非常高明。但是这可以称得上是天才之举吗？

桑格勒德在其关于《毁灭战士》游戏引擎的书中引用了罗梅洛的话：内勒的论文《构建高质量的分割树》主要讲述使用 BSP 树消除 3D 模型的背面。   [6]  根据罗梅洛所言，卡马克认为这种算法对《毁灭战士》依然有效，所以他放手一试，将 BSP 技术应用到了该游戏中。不过这话说得有些奉承的意味 —— 意在暗示卡马克在别人仍然使用 BSP 树渲染静止的场景时，发现该技术可以用于实时游戏领域。在《Doom 启示录》中也有给卡马克戴高帽的故事。该书作者库什纳认为，卡马克在阅读内勒的论文之后，问了自己，“如果使用 BSP 技术创造一整个虚拟世界，而不仅仅是一张 3D 图像，会怎么样呢？”    [7] 。

这些“片面之词”忽视了 BSP 树的发展历史。当美国空军研究人员开始意识到场景分割可能会加快渲染任务的时候，他们就对提升 *实时* 渲染的速度产生了兴趣，毕竟他们当时试图创建一个飞行模拟器。1980 年，同样的案例再次出现在了福克斯等人的论文中，他们探讨了 BSP 树如何应用于飞行模拟器中，帮助飞行员进行训练：飞行员用它来反复练习将飞机降至同一空港。由于空港的地形不会发生改变，BSP 树只需生成一次，即可一劳永逸。很明显，他们考虑的是实时模拟。在论文的引言部分，福克斯等人还谈到实时图形系统必须在至少 1/30 秒内生成一张图像，由此激励了他们的研究。

因此，卡马克不是第一个想到在实时图形模拟中应用 BSP 树的人。诚然，设想与付诸实践是两码事。但是即使在实施的过程中，卡马克受到的帮助与指导可比人们想象的要多得多。至少是到这篇文章写成之时，BSP 树的 [维基百科词条](https://en.wikipedia.org/wiki/Binary_space_partitioning) 页面显示，卡马克参考了 1991 年 <ruby> 陈 <rt>  Chen </rt></ruby> 和 <ruby> 戈登 <rt>  Gordon </rt></ruby> 的一篇论文，以及 1990 年的一本教材《计算机图形学：原理及实践》。尽管该页面并未提供引用信息，但可信度没什么问题。陈和戈登的论文介绍了运用 BSP 树由前向后的渲染方法，这种方法与《毁灭战士》中用到的方法基本一致，还包括了我称之为“隐式 Z 缓冲区”的数据结构，可用于防止远处的图形在绘制时遮挡近处的图形。《计算机图形学：原理及实践》详细介绍了 BSP 树，以及一些构建并展示 BSP 树的伪代码（非常感谢我大学的图书馆，让我能够一睹这本教材 1990 年的版本）。因为这本书是计算机图形学的经典之作，所以卡马克很可能也有一本。

然而，卡马克发现自己遇到一个新问题：如何让第一人称射击游戏在一台 CPU 甚至都无法进行浮点操作的电脑上运行呢？通过调查研究，他证明了 BSP 树的数据结构非常适用于实时电子游戏渲染。尽管 BSP 树早已提出，而且到了卡马克的时代，相关理论已经非常成熟了，但我始终认为，卡马克的做法可谓惊人之壮举。也许，得到人们称誉的应该是整个《毁灭战士》的游戏引擎，它的确非常精致。我在前文也提及过，但是桑格勒德的《<ruby> 游戏引擎黑皮书：毁灭战士 <rt>  Game Engine Black Book: DOOM </rt></ruby>》 很好地讲解了这款游戏引擎的非凡之处，以及这些优势相互契合之法。要明白，VSD 问题只是卡马克在编写《毁灭战士》游戏引擎时需要解决的诸多问题之一。不得不说，面对不为大多数程序员所知的复杂的数据结构，卡马克能够查阅相关文献，将其付诸实践，仅此一点就足以说明其技术之精湛、匠心之独到。

*如果你喜欢这篇文章，欢迎关注推特 [@TwoBitHistory](https://twitter.com/TwoBitHistory)，也可通过 [RSS feed](https://twobithistory.org/feed.xml) 订阅，获取最新文章（每四周更新一篇）。*

---

1. Michael Abrash, “Michael Abrash’s Graphics Programming Black Book,” James Gregory, accessed November 6, 2019, <http://www.jagregory.com/abrash-black-book/#chapter-64-quakes-visible-surface-determination>. [↩](#fnref1)
2. R. Schumacher, B. Brand, M. Gilliland, W. Sharp, “Study for Applying Computer-Generated Images to Visual Simulation,” Air Force Human Resources Laboratory, December 1969, accessed on November 6, 2019, <https://apps.dtic.mil/dtic/tr/fulltext/u2/700375.pdf>. [↩](#fnref2)
3. Henry Fuchs, Zvi Kedem, Bruce Naylor, “On Visible Surface Generation By A Priori Tree Structures,” ACM SIGGRAPH Computer Graphics, July 1980. [↩](#fnref3)
4. Fabien Sanglard, Game Engine Black Book: DOOM (CreateSpace Independent Publishing Platform, 2018), 200. [↩](#fnref4)
5. Sanglard, 206. [↩](#fnref5)
6. Sanglard, 200. [↩](#fnref6)
7. David Kushner, Masters of Doom (Random House Trade Paperbacks, 2004), 142. [↩](#fnref7)

---

via: <https://twobithistory.org/2019/11/06/doom-bsp.html>

作者：[Two-Bit History](https://twobithistory.org) 选题：[lujun9972](https://github.com/lujun9972) 译者：[aREversez](https://github.com/aREversez) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #733 听别的电脑放歌会崩溃的笔记本电脑

Summary: • 听别的电脑放歌会崩溃的笔记本电脑 • 骗子利用带有微软徽标的 U 盘来诈骗 • DDoS 攻击新纪录：每秒请求超过 4600 万次

# 硬核观察 #733 听别的电脑放歌会崩溃的笔记本电脑

### 听别的电脑放歌会崩溃的笔记本电脑

微软的一位工程师分享了一个 Windows XP 时代的故事：某些型号的笔记本电脑在播放珍妮·杰克逊的上世纪八十年代的热门音乐视频《节奏国度》时会崩溃。更离奇的是相邻的一台未播放音乐的笔记本电脑也崩溃了。原因是《节奏国度》中的音频与某款笔记本硬盘发生共振，会干扰其运行。该 bug 被赋予了正式的 CVE 编号 CVE-2022-38392。还好这些电脑是 2005 年上市的，基本上已经淘汰。

>
> **[消息来源：ARS Technica](https://arstechnica.com/gadgets/2022/08/janet-jacksons-rhythm-nation-is-officially-a-security-threat-for-some-old-laptops/)**
>
>
>

>
> 老王点评：这音乐太劲爆了，笔记本电脑脆弱的小心脏受不了。
>
>
>

### 骗子利用带有微软徽标的 U 盘来诈骗

一位安全顾问称，接到了一个印刷有微软品牌的欺诈 U 盘。该 U 盘被包装在一个 Office 2021 专业版的纸盒内。当用户将该 U 盘插入他们的电脑之后，就会弹出一条假的警告信息，告知用户他们的系统中存在病毒，并提示受害者拨打技术支持电话，这显然是骗子使用的号码。然后，骗子要求受害者安装一个远程访问程序来接管系统。

>
> **[消息来源：Sky News](https://news.sky.com/story/criminals-posting-counterfeit-microsoft-products-to-get-access-to-victims-computers-12675123)**
>
>
>

>
> 老王点评：这诈骗真是用心了，还专门弄了包装盒和印刷了徽标的 U 盘。
>
>
>

### DDoS 攻击新纪录：每秒请求超过 4600 万次

今年 6 月，Cloudflare 报告遭遇了有史以来最大规模的 DDoS 网络攻击，峰值每秒请求高达 2600 万次。这刷新了 2021 年 8 月创下的 1720 万次和 2022 年 4 月创下的 1530 万次。不过谷歌最近披露的一个数据创造了新纪录：峰值达到了每秒 4600 万次。攻击于 6 月 1 日凌晨开始，速度为每秒 1 万次请求，但在 8 分钟后升至每秒 10 万次请求，此时 Cloud Armor 自适应保护启动。两分钟后，每秒请求数增加到 4600 万。攻击在 69 分钟内消失了，可能是因为被 Cloud Armor 挫败而没有达到预期的效果。

>
> **[消息来源：The Register](https://www.theregister.com/2022/08/18/google_record_ddos/)**
>
>
>

>
> 老王点评：如果没有云服务商的 DDoS 防护服务，任谁也扛不住这种强度的攻击啊。
>
>
>


如何在 Linux 中实时监控日志文件（桌面和服务器）

# 如何在 Linux 中实时监控日志文件（桌面和服务器）

>
> 本教程介绍了如何实时监控 Linux 日志文件（桌面、服务器或应用）以进行诊断和故障排除。
>
>
>

当你在 Linux 桌面、服务器或任何应用中遇到问题时，你首先会查看单独的日志文件。日志文件通常是文本流和来自应用的带有时间戳的消息。它可以帮助你缩小特定问题的范围，并使你能够找到问题的原因。它还可以帮助从网络获得帮助。

一般来说，所有的日志文件都位于 `/var/log`。此目录包含特定应用和服务的扩展名为 `.log` 的日志文件，它还包含了其他含有日志的独立目录。

所以，如果你想监控一堆日志文件或特定的一个，这里有一些方法可以做到。

### Linux 实时监控日志文件

#### 使用 tail 命令

`tail` 命令是实时跟踪日志文件的最基本方式。特别是如果你在只有终端而没有 GUI 的服务器中。这很有帮助。

基本语法如下：

```
tail /path/to/log/file

```

用法：

可以使用开关 `-f` 跟踪实时更新的日志文件。例如，如果要关注 syslog，可以使用以下命令。

```
tail -f /var/log/syslog

```

你可以使用单个命令监控多个日志文件：

```
tail -f /var/log/syslog /var/log/dmesg

```

如果要监视 HTTP 或 sftp 或任何服务器，可以在此命令中使用它们各自的日志文件。

请记住，上述命令需要管理员权限。

#### 使用 lnav（日志文件浏览器）

`lnav` 是一个出色的程序，你可以用它来用彩色编码的信息以更有条理的方式监控日志文件。在 Linux 系统中，这个工具不是默认安装的。你可以用下面的命令来安装它：

Ubuntu：

```
sudo apt install lnav

```

Fedora：

```
sudo dnf install lnav

```

lnav 的好处在于，如果你不想安装它，你可以下载其预编译的可执行文件并在任何地方运行它，甚至可以从 U 盘上运行。无需设置，并加载了功能。使用 lnav，你可以通过 SQL 查询日志文件，以及其他很酷的功能，你可以在其[官方网站](https://lnav.org/features)上学习。

安装后，你可以在具有管理员权限的终端上运行 `lnav`，它会默认显示 `/var/log` 中的所有日志并开始实时监控。

#### 关于 systemd 的 journalctl 的一个说明

当今所有现代 Linux 发行版都主要使用 systemd。 systemd 提供了运行 Linux 操作系统的基本框架和组件。 systemd 通过 `journalctl` 提供日志服务，这有助于管理来自所有 systemd 服务的日志。你还可以使用以下命令实时监控各个 systemd 服务和日志。

```
journalctl -f

```

以下是一些特定的 `journalctl` 命令，可用于多种情况。你可以将这些与上面的 `-f` 选项结合使用以开始实时监控。

对于紧急系统消息，请使用：

```
journalctl -p 0

```

显示带有解释的错误：

```
journalctl -xb -p 3

```

使用时间控制过滤：

```
journalctl --since "2022-12-04 06:00:00"
journalctl --since "2022-12-03" --until "2022-12-05 03:00:00"
journalctl --since yesterday
journalctl --since 09:00 --until "1 hour ago"

```

如果你想了解更多关于 journalctl 的详细信息，我已经在这写了份 [指南](https://www.debugpoint.com/2020/12/systemd-journalctl/)。

### 结束语

我希望这些命令和技巧可以帮助你找到桌面或服务器中问题/错误的根本原因。有关更多详细信息，你可以随时参考手册页并使用各种选项。如果你对本文有任何意见或想法，请使用下面的评论栏告诉我。

干杯。

---

via: <https://www.debugpoint.com/monitor-log-files-real-time/>

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


外媒点评：deepin 23 将引入新的软件包格式和存储库

Summary: deepin 23 将是一个有趣的升级，有几个基本的变化。

壁纸可以说是最无关紧要的东西!

一张合适的壁纸能让本来就粗糙的 Linux 图形界面增色不少

分发的所有格式软件，都将被统一玲珑格式所整合，将是非常方便的。

分发的所有格式软件，都将被统一玲珑格式所整合，将是非常方便的。

分发的所有格式软件，都将被统一玲珑格式所整合，将是非常方便的。

deepin 23 将是一个有趣的升级，有几个基本的变化。

# 外媒点评：deepin 23 将引入新的软件包格式和存储库

>
> deepin 23 将是一个有趣的升级，有几个基本的变化。
>
>
>

deepin 仍然是目前最 [漂亮的 Linux 发行版](https://itsfoss.com/beautiful-linux-distributions/) 之一。

虽然整个用户体验可能不是毫无痛点的，但它还是看起来不错的。deepin 的开发者尝试了一些引人关注的定制，以使它从人群中脱颖而出。

如果你是第一次了解它，你应该知道它是 [基于 Debian Linux 的有趣发行版](https://itsfoss.com/debian-based-distros/) 之一。

随着 [deepin 20](https://itsfoss.com/deepin-20-review/) 和它最近的小版本发布，他们推出了一系列不错的升级。现在，看起来deepin 23 将是下一个主要的升级。

### deepin 23 预览版中的新内容

deepin 23 预览版已经可以进行测试。与之前的版本不同，deepin 23 包括一些基本的升级，在多个层面上影响用户体验。

主要的亮点包括：

* 一个新的软件包格式。
* 一个新的系统更新的构想。
* 一个新的资源库。
* 新的墙纸。
* [Linux 内核 5.18](https://news.itsfoss.com/linux-kernel-5-18-release/)。

### 新的软件包格式：玲珑

**玲珑** 是 deepin 开发的新软件包格式。

它的目的是解决 Linux 下传统软件包格式的复杂依赖性所造成的各种兼容性问题。此外，通过支持沙盒以及增量更新和隐私保护来减少安全风险。

截至目前，你可以在其 [玲珑商店](https://store.linglong.dev/) 上找到这些软件包。

我们需要另一种软件包格式吗？我不这么认为。

有了 Flatpak 和 Snap 的存在，它听起来并不像以前没有的新东西。

对我来说，看起来 deepin 只是想拥有自己的软件包格式作为其产品的一部分。

### 原子式更新

系统更新将被视为原子操作，也就是说，当软件包被成功安装后，更新就完成了。如果安装失败，系统可以恢复到以前的版本，没有任何变化。

因此，你在升级后可以得到系统回滚的支持，并可以避免部分升级的困难。

### 独立的上游

虽然它是基于 Debian 的，但 deepin 的目标是为核心软件包和一些可选组件建立一个独立的仓库。

对于预览版，开发者提到，他们打算从上游如 Debian 和 Arch Linux 中学习，以改进他们的仓库。

### 新的墙纸

像其他主要版本一样，deepin 23 增加了一些令人耳目一新的壁纸和新的默认壁纸。

### 下载 deepin 23 预览

请注意，deepin 23稳定版还没有上市。因此，如果你想在你的测试系统上进行实验，并体验一下，请尝试预览版。

你可以在 [官方公告](https://www.deepin.org/en/linux-system-distribution-deepin-23-preview-released/) 中找到 ISO 文件的下载链接。

---

via: <https://news.itsfoss.com/deepin-23/>

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


为防止对开源供应链的攻击，GitHub 在行动

为防止开源供应链被攻击，我们应该做好国内的备份

国内做好备份，然后GitHub就被墙了

# 为防止对开源供应链的攻击，GitHub 在行动

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

在 2020 年 SolarWinds 网络间谍活动之后，一系列进一步的软件供应链漏洞凸显了确保软件监管链安全的必要性。在这场间谍活动中，俄罗斯黑客渗透到一个广泛使用的 IT 管理平台，并将受污染的升级程序悄悄带入其中。由于开源项目从根本上来说是分散的，而且经常是临时的活动，因此在这种背景下，这个问题尤其紧迫。GitHub 著名的 npm 注册中心广泛使用的 JavaScript 软件包遭到一系列令人不安的黑客攻击后，该公司前不久公布了一项战略，以提供更好的开源安全保护。

代码签名平台 Sigstore 将由微软旗下的 GitHub 支持，以用于 npm 软件包。代码签名类似于数字蜡封。为了让开源维护者更加容易地确认他们编写的代码是否与全球范围内人们实际下载的软件包中最终包含的代码相同，跨行业协作促成了该工具的创建。

GitHub 并不是开源生态系统的唯一组成部分，但 Sigstore 的联合开发者、Chainguard 的首席执行官 Dan Lorenc 指出，它是社区的一个重要枢纽，因为绝大多数项目都在这里存储和共享源代码。然而，当开发人员真正想下载开源软件或工具时，他们通常会通过软件包管理进行。

通过让包管理器可以使用 Sigstore，开发人员可以在 Sigstore 工具的帮助下，在软件通过供应链时处理加密检查和要求。这增加了产品流通过程中每个阶段的透明度。Lorenc 说，许多人在得知这些完整性检查尚未实施时感到震惊，开源生态系统中相当大的一部分长期以来一直依赖于盲目的信心。拜登政府于 2021 年 5 月发布了一项行政命令，主要涉及软件供应链安全问题。

Linux 基金会、谷歌、红帽、Purdue Universit 和 Chainguard 都对 Sigstore 的开发做出了贡献。现在有了使用 Sigstore 为 Python 包发行版签名的官方软件，而且开发软件的开源环境 Kubernetes 现在也支持它。

Sigstore 依靠免费和简单易用来鼓励采用，就像主要行业推动 HTTPS 网络加密一样，这在很大程度上是由非营利组织<ruby> 互联网安全研究组 <rt>  Internet Security Research Group </rt></ruby>的 Let's Encrypt 等工具实现的。据 GitHub 称，该项目会首先提出 Sigstore 将如何在 npm 中实现的建议，并在开放评论期征求社区人员对该工具的精确部署策略的意见。然而，最终的目标是让这样的代码签名能够被尽可能多的开源项目使用，从而让对供应链的攻击更加困难。

GitHub 的 Hutchings 说：“我们希望看到这样一个世界，最终所有的软件工件都被签名并链接回源代码，这就是为什么构建像 Sigstore 这样的开放技术栈是如此重要，其他打包存储库也可以采用这种技术。”

---

via: <https://www.opensourceforu.com/2022/08/github-takes-action-to-prevent-supply-chain-attacks-on-open-source/>

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

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


Summary: • 韦伯太空望远镜大量使用了 20 年前的一种 JavaScript 方言• VFX 参考平台建议动画行业升级到 RHEL 9 • Meta 用算法“随机”解雇 60 名劳务派遣人员

Any application that can be written in JavaScript, will eventually be written in JavaScript.

# 硬核观察 #734 韦伯太空望远镜大量使用了 20 年前的一种 JavaScript 方言

### 韦伯太空望远镜大量使用了 20 年前的一种 JavaScript 方言

根据韦伯太空望远镜的综合科学仪器模块手册，它有一堆预先写好的 JavaScript 脚本来完成特定的任务，地面上的科学家可以告诉它运行这些任务。当然，这些脚本不是运行在一个浏览器里面，而是用一个叫做“脚本处理器”的程序解释，然后它将根据脚本的要求，与其他的应用程序和系统联系。这些脚本所使用的语言是一种 JavaScript 版本 Nombas ScriptEase 5.00e，但开发它的公司已不存在，这种语言最后的版本发布于 2003 年。虽然韦伯太空望远镜是在 2021 年底发射的，但这个项目从上世纪八十年代就开始了，而建设在 2004 年开始时的。

>
> **[消息来源：The Verge](https://www.theverge.com/2022/8/18/23206110/james-webb-space-telescope-javascript-jwst-instrument-control)**
>
>
>

>
> 老王点评：居然选择了这么古老而不严谨的脚本，这十年间就难道没有一点点改进的想法吗？
>
>
>

### VFX 参考平台建议动画行业升级到 RHEL 9

VFX 参考平台旨在帮助规范数字内容创作领域的软件平台，以发布年度软件建议清单而闻名，如每个操作系统上的编译器版本，特定年份的 Qt/Python/Numpy 组件，以及基于行业反馈和与各种内容创作者和工作室互动的各种其他软件版本。他们发布了一份报告，供视觉效果和动画工作室在选择下一个 Linux 平台时考虑。他们发现很多工作室仍然依赖 CentOS 7，他们建议这些工作室不迟于 2024 年转移到新的操作系统，首选是红帽的 RHEL 9，或者 Rocky Linux、AlmaLinux 等下游分支。他们也建议可以考虑 Ubuntu Linux。

>
> **[消息来源：Phoronix](https://www.phoronix.com/news/VFX-Animation-Linux-Recommends)**
>
>
>

>
> 老王点评：即便不想付费购买 RHEL 9，Rocky Linux 等也可以考虑。其实，根据我的研究， CentOS Stream 也是可以的。
>
>
>

### Meta 用算法“随机”解雇 60 名劳务派遣人员

此前 Meta 与埃森哲签订了近 5 亿美元的合同，由隶属于后者的劳务派遣人员到 Meta 位于奥斯汀的办公室工作，主要开展内容审核和商业诚信等业务。Meta 通过视频电话会议告知被裁的员工，除了明确是“随机”选择之外，没有给出裁员的具体原因。去年 8 月份，游戏行业支付处理公司 Xsolla 也使用算法裁掉了 150 名员工。

>
> **[消息来源：纽约邮报](https://nypost.com/2022/08/19/facebook-parent-meta-lays-off-60-workers-at-random-using-algorithm-report/)**
>
>
>

>
> 老王点评：很多底层员工，在他们看起来，其实就是一个数字，可以掷骰子决定。
>
>
>


7 个基于 Fedora Linux 的最佳发行版

Summary: 如果你想在 Fedora 领域中尝试一些东西，我可以列出一些选项。

说实话，还是觉得Deian Gnu/Linux方便。组件安装方便，获取方便，全组件ISO本地源更方便！！！

虽然说 "青菜萝卜，各有所爱"，但我个人还是不喜欢，也不建议用下游发行版。

首先，下游的各种更新肯定滞后于上游 (Ubuntu 基于 Debian 倒是挺快，但毕竟大公司，和那些社区小作坊不一样)。

其次，下游会加一些自认为很棒的魔改，会出现莫明其妙的问题，而且还不能套用上游的解决方案（比如经常有人在 Arch 群问问题，结果 Arch 用户都重现不了，一问原来是 Manjaro 用户）。

xfce4桌面不在列？这个比gnome快多了。。。

你是在搞笑吗？文章在说发行版，管 xfce 和 gnome 什么事？<br />
什么发行版不能装 xfce 和 gnome？

如果你想在 Fedora 领域中尝试一些东西，我可以列出一些选项。

# 7 个基于 Fedora Linux 的最佳发行版

有几十个基于 Ubuntu 的发行版可用。从 [面向初学者的发行版](https://itsfoss.com/best-linux-beginners/) 到 [漂亮的发行版](https://itsfoss.com/beautiful-linux-distributions/)，Ubuntu 主导着 Linux 桌面空间。

如果通用发行版还不够的话，你还会发现一些 [奇怪的基于 Ubuntu 的发行版](https://itsfoss.com/weird-ubuntu-based-linux-distributions/)。

我不打算参与 [Ubuntu 与 Fedora](https://itsfoss.com/ubuntu-vs-fedora/) 的辩论。我只是说如果你想在 Fedora 领域中尝试一些东西，我可以列出一些选项。

请记住，我不会列出面向服务器的 Linux 发行版。此处的列表适用于 **桌面 Linux 用户**。

该列表没有特定的排名顺序，并且提到的选项可能并不总是适合新用户。因此，在第一次安装任何基于 Fedora 的发行版之前，请确保你浏览了文档。

### 1、Fedora 定制版

Fedora 有很多<ruby> 定制版 <rt>  spin </rt></ruby>，但没有 Ubuntu 那么多。

[Fedora 定制版](https://spins.fedoraproject.org/) 不是基于 Fedora 的独立发行版，而只是具有 [不同桌面环境](https://itsfoss.com/best-linux-desktop-environments/) 或采用平铺窗口管理器的不同版本的 Fedora。

如果你不喜欢默认的 GNOME 桌面环境，你可以下载其中一种。

一些可用的选项是：

* Fedora KDE Plasma
* Fedora i3 平铺窗口管理器
* Fedora LXQt
* Fedora LXDE
* Fedora MATE-COMPIZ
* Fedora Cinnamon 版

### 2、Nobara

当你在找 [游戏发行版](https://itsfoss.com/linux-gaming-distributions/) 时，列表将由 Debian 和 Arch 衍生产品占据主导地位。因此，如果你正在寻找基于 Fedora 且具有相同效果的游戏发行版，那么 [Nobara](https://nobaraproject.org/) 就是你所需要的。

Nobara 是由 Proton GE 的维护者制作的游戏发行版，他也是 Lutris 开发团队的成员，因此你可以期待开箱即用的下一代游戏体验！

为了带来更好的体验，Nobara 在 Fedora 上预先应用了 30 多个补丁程序，以及一组游戏工具，包括 Lutris、GOverlay、Stream 和 ProtonUp。

### 3、Ultramarine

基于 Fedora 的发行版，开箱即用，适用于普通用户，它就是 [Ultramarine](https://ultramarine-linux.org/)！

Ultramarine 预装了一堆工具，包括 Flathub、RPM fusion 和该发行版自己的专用仓库。

你将获得一个预配置的桌面，使其看起来赏心悦目，因此你不再需要花费额外的时间进行调整。

此外，对于那些在 Fedora 基础上寻求 Pantheon 和 Budgie 桌面环境的微调体验的人来说，Ultramarine 是完美的选择。

### 4、RisiOS

“一个支持 Web 应用的 Fedora。”

这是一种描述 [RisiOS](https://risi.io/) 的方式，但等等，不止如此。

从 Bash 脚本的用户 GUI 到欢迎屏幕，你只需单击几下即可准备好系统，RisiOS 让 Fedora 的使用更加轻松！

RisiOS 还为你提供与 Linux Mint 相同的 Web 应用管理器，而且非常棒。

但是在你跳转到下载页面之前，要记住一件事是 RisiOS 仍处于测试阶段（如网站所说的 Big beta），你可能会遇到一些小问题。

### 5、Qubes OS

[Qubes OS](https://www.qubes-os.org/) 是一个有趣的 Linux 发行版，它让你可以自由选择要用作基础的操作系统。它也提供了一个 Fedora 模板，并且他们会定期维护它。

事实上，Qubes OS 也是一个 [注重隐私的 Linux 发行版](https://itsfoss.com/privacy-focused-linux-distributions/)。因此，你可以在使用基于 Fedora 的产品时获得最新技术，而且完全自由。

值得注意的是，Qubes OS 需要大量系统资源和至少 **8-16 GB** 的内存才能使用，并且具有挑战性的学习曲线。

### 6、Berry Linux

[Berry Linux](https://berry-lab.net/eberry.html) 是一个简单的基于 Fedora 的发行版，你可以直接从 CD 或任何其他介质启动。它支持自动硬件检测，并且似乎定期维护。

Berry Linux 提供对英语和日语的支持。它预装了一些媒体播放器、照片编辑应用和基本应用。

### 7、ClearOS

它不是 [来自 Intel 的 Clear Linux 项目](https://itsfoss.com/clear-linux/)，尽管听起来很相似。

[ClearOS](https://www.clearos.com) 是基于 Fedora 的发行版，专为服务器环境量身定制，或帮助你在 HP 支持的家庭网络上运行 IT 相关任务和流式传输音乐/视频。你必须根据自己的要求同时购买家庭版/企业版。

如果你不想购买而想自己管理，还有一个社区版。

### 你的看法

长期使用 Linux 的用户可能还记得 Korora 和 Chapeau 发行版。它们曾经在 Fedora 用户中很受欢迎，但从那时起这些项目就停止了。

虽然 Fedora 本身很棒，但我并不反对衍生发行版。看看 Linux Mint 的成功。它是 Ubuntu 的衍生产品，但已经获得了如此好的用户群。谁知道这些基于 Fedora 的发行版是否会像 Mint 一样流行？

我缺失了任何基于 Fedora 的活跃发行版吗？你如何看待 Fedora 衍生版及其定制版本？ 在下面的评论中告诉我！

---

via: <https://itsfoss.com/best-fedora-linux-distributions/>

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


我给新手程序员的实用建议

Summary: 做一个高效的、充满好奇心的问题解决者吧！这会帮助你成为一名成功的程序员。

《提问的智慧》<br />
github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md

做一个高效的、充满好奇心的问题解决者吧！这会帮助你成为一名成功的程序员。

# 我给新手程序员的实用建议

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

>
> 做一个高效的、充满好奇心的问题解决者吧！这会帮助你成为一名成功的程序员。
>
>
>

你是否曾经遇到过这样一种情况：你想解决一个问题，并且你在 YouTube 或 Google 中找到了相关的教程。嗯，你觉得看会了，可真做起来，却止步不前，大脑一片空白。你感觉自己每一行代码都看懂了，可一旦离开了那个教程，就步履维艰。如果你在 HackerRank 或 LeetCode 上看过别人的解题过程，你就能体会到，一个有追求的程序员第一次看到这些挑战时，他会是何种感受。举例来说，假设你正在学习一门新语言，在你刚开始理解这门语言的基础知识的时候，你看了一个教程，摩拳擦掌，结果发现自己无法独立应用学到的知识，这反过来可能会导致你怀疑自己的知识和能力。

### 把教程付诸于实践

你应该从头开始吗？如果你这么做，你可能很快就会发现自己重复学习了很多次相同的知识点。虽然从头开始并不一定是种浪费，但是，你该如何变得更高效呢？

死记硬背在编程中完全是行不通的。话虽如此，但你也不能够忽视熟悉语法的重要性。因为，死记硬背和养成习惯之间是有明显区别的。习惯是很难打破的。要养成多使用编程语言的常规语法、函数、方法、模式、范式和构造的习惯，这样你才能掌握它。掌握一门编程语言需要大量的创造力和练习。练习语法是非常必要的，直到它们能在你的脑海中自然地浮现，就像血液在血管里流动一样。

### “问题解决”的工作原理

那么，你该采取什么样的方案呢？这实际上取决于许多因素。这些因素可以是任何东西，下至技术限制，上至用户需要。世界上有无数的问题，每个问题都有许多解决方式。如何选择一个最好的？这就需要<ruby> “问题解决” <rt>  problem-solving </rt> <ruby>  的技巧了。 </ruby></ruby>

下面是一个简单的例子。你需要把两个数**相加**，让它们等于 **6**。显然，你有多种方式可供选择：

**3 + 3 = 6** 或 **4 + 2 = 6** 或 **5 + 1 = 6**

同理，如果你需要让两个数字，经过一次减法、乘法或除法运算后，得到的结果为 **6**。你仍然有很多选项，包括：

**8 - 2 = 6** 或 **12 / 2 = 6** 或 **3 \* 2 = 6**

每种方案都有它固有的限制，且各不相同。当你在现实生活中尝试做出一个高效的方案时，你必须要考虑到所有的限制。这个方案可行吗？有什么障碍吗？有可操作性吗？是否可扩展呢？而如何最小化约束，并做出一个最优方案，就取决于问题类型和业务需要。

### 练习很重要

编程的目标不仅仅是解决问题。因此，从工程视角理解代码**如何**工作始终是一个优势。这就是代码审查在企业级开发中发挥作用的地方。编程的最低要求是具备基本的编码知识，包括语言的语法、函数和方法。归根结底，“写代码”是需要你去**写**的，所以练习总是有助于提高你的技能。流畅的写作和复杂方案的开发都来自于持续的学习和训练。

### 学习编码

我撰写和分享这篇文章，是为了鼓励新程序员去探寻自己的内心，寻找那个“优秀的问题解决者”。请不要停止相信自己。

要成功编码，你需要培养许多习惯。下面是我在学习编码时保持高效的方法：

1. 一个包含语法、方法和函数 [速查手册](https://opensource.com/downloads/cheat-sheets) 总能应付不时之需。
2. 将问题分解成更小的部分，便于追踪。
3. 尝试理解代码运行的核心概念。
4. 构思解决方案时，大可发挥你的创造力 —— 但刚开始还是要注重基础。
5. 在练习时，创建尽可能多的应用和组件。
6. 永远不要从 Stack Overflow/Exchange 等开放平台上复制/粘贴代码，特别是在不了解上下文的情况下。
7. 跟着教程做了一遍后，尝试从头开始构建所有内容。即使你只能独立完成一半，那也仍然是一个成就。

祝我们所有人好运！

---

via: <https://opensource.com/article/22/8/coding-advice-new-programmers>

作者：[Sachin Samal](https://opensource.com/users/sacsam005) 选题：[lkxed](https://github.com/lkxed) 译者：[lkxed](https://github.com/lkxed) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #735 新的 USB “橡皮鸭子”比以前更危险

Summary: • 新的 USB “橡皮鸭子”比以前更危险 • Copilot 将使计算机教育的编程练习变得毫无意义 • 新的后量子密码学算法将于 2024 成为标准

橡皮鸭子？Bad USB？

USB Rubber Ducky

# 硬核观察 #735 新的 USB “橡皮鸭子”比以前更危险

### 新的 USB “橡皮鸭子”比以前更危险

USB “橡皮鸭子”看起来就像一个普通的 U 盘。但把它插入电脑，机器就会把它看作是一个 USB 键盘。最初的 USB “橡皮鸭子”在 10 多年前发布，成为黑客们的最爱，如创建一个假的 Windows 弹出框来获取用户的登录凭证，或使 Chrome 浏览器将所有保存的密码发送到攻击者的服务器。这些年来它也在不断更新。新的 DuckyScript 3.0 允许用户编写函数、存储变量和使用逻辑流控制，成为了一种功能丰富的语言。它还可以将数据编码为二进制格式，并通过键盘的大写锁定或数字锁定灯的闪烁作为信号，来窃取目标机器的数据。用这种方法，攻击者可以把它插上几秒钟，告诉别人："对不起，我想那个 U 盘坏了"，然后把它拿回来，并保存他们所有的密码。

>
> **[消息来源：The Verge](https://www.theverge.com/23308394/usb-rubber-ducky-review-hack5-defcon-duckyscript)**
>
>
>

>
> 老王点评：真是防不胜防，要我说，这些黑客工具的想法也真巧妙。
>
>
>

### Copilot 将使计算机教育的编程练习变得毫无意义

有计算机教授担心 Copilot 将使传统的计算机教育的编程练习变得毫无意义，因为 Copilot 知道所有的答案。“据我所知，Copilot 在所有的入门编程作业上都接受过专门培训，Copilot 该死的喜欢编程入门作业。”虽然很多计算机编程练习可以在网上找到代码的例子，但老师也可以在谷歌上找到它们，然后用抄袭检测器将这些代码与提交的代码进行比较。而 Copilot 是不同的，它实际上产生了新颖的解决方案，在表面上有足够的不同，以至于它们看起来可能来自学生们自己写的。

>
> **[消息来源：The Register](https://www.theregister.com/2022/08/19/copilot_github_students/)**
>
>
>

>
> 老王点评：确实，这就如同使用计算器来学习初等数学，并不能真的让人学会数学。所以，计算机教育需要为 Copilot 这类 AI 工具的到来做一些准备。除了限制对 Copilot 的访问，是否还可以做更多的事情？
>
>
>

### 新的后量子密码学算法将于 2024 成为标准

上个月，由恩智浦、IBM 和 Arm 的安全专家共同编写的专门安全算法被美国 NIST 选中，成为旨在应对量子威胁的行业全球标准的一部分。NIST 宣布了这些后量子密码学算法将在 2024 年成为标准。而目前通行的 RSA 和 ECC 等密码学算法用了十多年才确定了最佳标准。

>
> **[消息来源：IoT Times](https://iot.eetimes.com/post-quantum-cryptography-needs-to-be-ready-to-protect-iot/)**
>
>
>

>
> 老王点评：先不说两年时间能不能准备好，我认为现在的抗量子加密学算法还未经受过考验，仓促之下怕是用处有限。
>
>
>


桌面 Linux 市场份额（2022 年 7 月）

我再补充个百度统计的数据：

Windos: 52.09+29.37+3.31+1.61+1.4 = 87.78%

macOS: 4.7%

Linux: 1.85%

tongji.baidu.com/research/site#os

从这表里看到一个奇怪的现象：一到周末，自由软件的使用率就上涨（如 Linux），而商业软件的使用率往往下跌（如 Windows、macOS、Chrome）。不知道这意味着什么

意味着大家业余时间更愿意折腾

来自湖北武汉武汉大学测绘学院的 Chrome 104.0|Windows 10 用户

总之，linux还需努力创新，希望大于渺茫，更大于绝望。

继续加油

来自36.148.60.72的 Firefox 104.0|GNU/Linux 用户

Linux一般还是服务器用的多

# 桌面 Linux 市场份额（2022 年 7 月）

>
> 每年，我们都会讨论 Linux 桌面年。当我们看到操作系统在消费者领域的市场份额有所增加时，却知道是无望的。
>
>
>

<img src="content_image/album_202208_22_160711vg1nrjfz9skxjefr.jpg" alt="linux desktop market share" title="linux desktop market share">

当然，Linux 主导着整个云行业（Web 托管、云计算、数据仓库等）。在这里，我们只关注桌面 Linux 的市场份额。

**如果你是 Linux 世界的新手**，可能不知道，Linux 不是一个操作系统，它是一个内核。但是，为了简单起见，我们倾向于将 “Linux” 称为操作系统。你可以在我们的解释文章中了解 [Linux 是什么](https://itsfoss.com/what-is-linux/)。

有朝一日，我们希望 Linux 发行版在未来的桌面操作市场份额中占据主导地位。但是，当前的趋势说明了什么？现在是 Linux 桌面年了吗？

趋势每个月都在变化。去年，与今年相比，Linux 可能市场份额更多一些。因此，跟踪最新报告至关重要。

在这里，我们试图以来自不同来源的每月更新报告的形式跟踪最新趋势。

### 操作系统市场份额：2022 年 7 月

>
> 我们每个月都会更新可用信息。请注意，上个月的信息将在下个月发布。因此，例如，当我们在 8 月份更新报告时，它将包括 7 月份的统计数据。
>
>
>

在可用的桌面操作系统（Windows、macOS 和 Chrome OS）中，Linux 通常倾向于占据**第三位**。

一些最新的统计数据包括：

| 报告 | 备注 | Linux | macOS | Windows |
| --- | --- | --- | --- | --- |
| [Net Marketshare](https://www.netmarketshare.com/operating-system-market-share.aspx?options=%7B%22filter%22%3A%7B%22%24and%22%3A%5B%7B%22deviceType%22%3A%7B%22%24in%22%3A%5B%22Desktop%2Flaptop%22%5D%7D%7D%5D%7D%2C%22dateLabel%22%3A%22Custom%22%2C%22attributes%22%3A%22share%22%2C%22group%22%3A%22platform%22%2C%22sort%22%3A%7B%22share%22%3A-1%7D%2C%22id%22%3A%22platformsDesktop%22%2C%22dateInterval%22%3A%22Monthly%22%2C%22dateStart%22%3A%222021-12%22%2C%22dateEnd%22%3A%222022-07%22%2C%22segments%22%3A%22-1000%22%7D) |  | 1.68% | 6.09% | 91.40% |
| [Statcounter](https://gs.statcounter.com/os-market-share/desktop/worldwide) |  | 2.76% | 14.51% | 75.21% |
| [W3Schools](https://www.w3schools.com/browsers/browsers_os.asp) | 最后更新于 2022 年 5 月 | 4.2% | 9.2% | 70% |
| [Steam 调查](https://store.steampowered.com/hwsurvey/Steam-Hardware-Software-Survey-Welcome-to-Steam?platform=linux) | 在桌面游戏方面 | 1.23% | 1.74% | 97.03% |
| [Statista](https://www.statista.com/statistics/218089/global-market-share-of-windows-7/) | 最后更新于 2022 年 6 月 | 2.42% | 14.64% | 76.33% |

另外，参与 [Stack Overflow 调查](https://survey.stackoverflow.co/2022/#technology-most-popular-technologies) 的开发者中，40.23% 的用户将基于 Linux 的操作系统用于个人用途，39.89% 的用户将其用于专业用途。

每个来源都使用不同的数据收集方法。市场份额不断变化，这就是为什么我们决定定期更新此报告，而不是单独发布关于市场份额微小变化的帖子。

**总体而言**，看起来 Linux 作为桌面操作系统在开发人员中很受欢迎，并最终影响游戏玩家和其他消费者作为替代操作系统。

*你对这种趋势有何看法？你认为 Linux 会在桌面市场份额方面超过 macOS 吗？在下面的评论中分享你的想法。*

---

via: <https://itsfoss.com/linux-market-share/>

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


一项研究显示，谷歌在开源贡献方面超过了微软

# 一项研究显示，谷歌在开源贡献方面超过了微软

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

>
> 根据 Aiven 的一份新报告，谷歌已经提高了其对开源软件的投入，并在活跃贡献者方面超过了微软。
>
>
>

根据 Aiven 的报告（LCTT 译注：我没有找到这份报告），谷歌目前的活跃贡献者多于微软，这要归功于对开源代码库 GitHub 的每月提交量同比增长 20%。根据开源贡献者指数（OCSI）的数据，谷歌 7 月份有 5421 名活跃贡献者，而微软的活跃贡献者为 5268 名。

Aiven 联合创始人兼首席技术官 Heikki Nousiainen 说，谷歌超过微软“特别令人惊讶”。

“这其中的一个因素是微软对开源项目的提交逐年下降，”Nousiainen 说，“然而，微软对开发者自由和创新的投入是一致的，该公司是开源的主要参与者，甚至在 2018 年收购了 GitHub。”

Aiven 指出，亚马逊已经开始更加重视开源计划，其对 OpenSearch（ElasticSearch 的复刻）的支持以及 GitHub 上项目数量的增加就是证明。Nousiainen 认为，亚马逊对 OpenSearch 和 ElasticSearch 的支持代表了“该公司方向的重大改变”，以及对重大开源项目掌舵的愿望。据 Aiven 介绍，这些科技巨头正在迅速扩大对开源软件的使用。根据数据，现在来自亚马逊、微软和谷歌的活跃 GitHub 贡献者比六年前多了 300%。

“这项研究的总体信息是积极的，”Nousiainen 说，“在开源社区有大量的创新在继续发生，其结果使我们所有人受益。数不清的人正在为其他人树立一个榜样。”

---

via: <https://www.opensourceforu.com/2022/08/google-surpasses-microsoft-in-terms-of-open-source-contributors-says-a-study/>

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


硬核观察 #736 研究发现所有的网络拥堵算法都解决不了“饿死”问题

Summary: • 研究发现所有的网络拥塞控制算法都解决不了“饿死”问题 • TikTok 否认内置浏览器记录用户输入 • 美国绝大部分雇主正在跟踪员工的生产力

# 硬核观察 #736 研究发现所有的网络拥堵算法都解决不了“饿死”问题

### 研究发现所有的网络拥塞控制算法都可能是非常不公平的

尽管在过去大约 40 年中提出了数百种控制计算机网络“拥堵”延迟的关键算法，但没有明显的赢家。一项新的研究发现，每种拥塞控制算法都无法解决“饿死”的问题，即让一些用户占据了所有的带宽，而至少有一个人基本上得不到带宽。拥塞控制算法依靠数据包的丢失和延迟作为细节来推断拥塞，并决定发送数据的速度。然而，数据包可能因为网络拥堵以外的原因而丢失和延迟 —— 这被称之为网络“抖动”。而拥塞控制算法无法区分由拥塞和抖动造成的延迟的区别，由抖动引起的延迟是不可预测的，最终会导致出现饥饿的情况。

>
> **[消息来源：Slashdot](https://tech.slashdot.org/story/22/08/22/0522210/network-jitters-confuse-packet-routing-algorithms-make-unfair-congestion-inevitable)**
>
>
>

>
> 老王点评：这就是算法的不公平，或许，限定在算法的层面上，并无一个完美的解决方案。
>
>
>

### TikTok 否认内置浏览器记录用户输入

研究发现，流行 iOS 应用如 TikTok、Instagram、FB Messenger 和 Facebook 都支持用户在应用内打开浏览器访问第三方网站，期间会植入跟踪代码。以 TikTok 为例，它会记录用户的所有键盘输入，包括密码信用卡信息等敏感数据，以及屏幕上的每一次点击。从技术上说这相当于安装了一个键盘记录器。在这一报道发表之后，TikTok 发表声明，证实该功能存在，但 TikTok 并没有利用这些代码。TikTok 表示应用内浏览器旨在提供更好的用户体验，它植入第三方网站的 JS 代码是为了调试、排错和性能监视。

>
> **[消息来源：Solidot](https://www.solidot.org/story?sid=72526)**
>
>
>

>
> 老王点评：植入这种第三方 SDK，即便是没启用，但是谁知道你什么时候会启用呢？
>
>
>

### 美国绝大部分雇主正在跟踪员工的生产力

根据《纽约时报》的调查，美国 10 个最大的私人雇主中，有 8 个正在为他们的雇员追踪生产力指标。其中一些软件测量活动时间，观察键盘停顿，甚至默默地计算击键次数。他们看到了从写电子邮件的时间到键盘活动的一切。如果员工没有达到预期的目标，就会产生影响：一个催促的通知，一个跳过的奖金，或者一个在家工作的日子被剥夺。对于在返回办公室的斗争中投降的雇主来说，这种监控是保持控制感的一种方式。

>
> **[消息来源：Slashdot](https://it.slashdot.org/story/22/08/22/0024205/employers-are-tracking-employees-productivity---sometimes-badly)**
>
>
>

>
> 老王点评：这可真是“工具人”，我觉得这和用代码行数来统计程序员的绩效具有“异曲同工之妙”。
>
>
>


使用 LaTeX 创建优美的 PDF 文件

Summary: 使用 LaTeX 标记语言来撰写文档。

使用 LaTeX 标记语言来撰写文档。

# 使用 LaTeX 创建优美的 PDF 文件

>
> 使用 LaTeX 标记语言来撰写文档。
>
>
>

LaTeX 文件准备系统有一段有趣的历史。在 1968 年，程序员 Don Knuth 用一种老式印刷排版方式，撰写了他的第一本书《<ruby> 计算机程序设计艺术 <rt>  The Art of Computer Programming </rt></ruby>》。当他在 1976 年出版第二版时，出版商已经转向现代照相排版技术。

Knuth 对新版本的外观不满意。他从程序员的角度解决问题，决定创建他自己的文字处理系统，这样以后他出版的书就可以以相同格式排版，拥有相同的外观。因此，Don Knuth 在 1978 年编写了第一版 TeX 。

几年后，Leslie Lamport 创建了一组宏定义，以便作者更容易编写复杂文档。Lamport 的宏定义扩展，即 LaTeX，有效地扩展了 TeX 能够轻松创建各种文档。例如，许多学术组织使用 LaTeX 出版期刊和论文集。

### 使用 LaTeX 编写文档

通过写一些短文就可以很容易掌握 LaTeX 基础。让我们从 [Opensource.com](https://opensource.com/about) 介绍页面借用一下内容，创建一个示例：

```
$ cat about.tex
\documentclass{article}
\begin{document}

Opensource.com is a premier, daily publication focused on
open source and Linux tutorials, stories, and resources.

We're a diverse and inviting group, made up of staff
editors, Correspondents, contributors, and readers. We
value differences in skills, talents, backgrounds, and
experiences. There are a few different ways to get involved
as a reader or a writer.

\end{document}

```

类似其他文档格式程序， LaTeX 会将单词汇集起来，填充成段落 。这意味着你可以在段落中间添加新文本，而不用担心最终文档的段落参差不齐。只要你不在段落中添加空行， LaTeX 就会创建完全对齐的段落。当它找到一个空行时， LaTeX 会开启一个新段落。

LaTeX 需要一些定义文档的控制语句。任何 LaTeX 文档应当以“文档类别”声明开始。LaTeX 支持多种文档，包括书信、书籍和文章。例如，我使用 `\documentclass{article}` 设置类别为 “文章” 。

使用 `\begin{document}` 和 `\end{document}` 声明来定义文本的开始和结束。如果你在 `\begin{document}` 前添加了文本，那么 LaTeX 会报错。在 `\end{document}` 之后的文本都会被忽略。

使用 LaTeX 的 `latex` 命令处理文档：

```
$ latex about.tex
This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021) (preloaded format=latex)
 restricted \write18 enabled.
entering extended mode
(./about.tex
LaTeX2e <2020-10-01> patch level 4
(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls
Document Class: article 2020/04/10 v1.4m Standard LaTeX document class
(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo))
(/usr/share/texlive/texmf-dist/tex/latex/l3backend/l3backend-dvips.def)
No file about.aux.
[1] (./about.aux) )
Output written on about.dvi (1 page, 736 bytes).
Transcript written on about.log.

```

LaTeX 会输出许多文本，这样你就可以知道它在干什么。若你的文档包含错误， LaTeX 会报错并提示它可以做什么。大多数情况下，你可以在提示后输入 `exit` 来强制退出 LaTeX 。

如果用 LaTeX 成功生成一个文档，会生成一个带 `.dvi` 后缀的文件。`DVI` 表示 “<ruby> 设备无关 <rt>  Device Independent </rt></ruby>”，因为你可以使用不同的工具来生成其他格式。例如， `dvipdf` 程序可以将 DVI 文件转换为 PDF 文件。

```
$ dvipdf about.dvi

```

### 添加列表

LaTeX 支持两种列表：一种以数字开头的 “枚举” 列表，一种 “逐项” 或 “项目符号” 列表。在第二段后添加一个简短的枚举列表，列出人们可以参与 [Opensource.com](http://Opensource.com) 的方式：

```
\begin{enumerate}
\item Be a writer
\item Be a reader
\end{enumerate}

```

与在文档定义中添加 `\begin` 和 `\end` 声明类似，你也需要在列表前后添加 `\begin` 和 `\end` 声明。在列表中，每个项目以 `\item` 命令开始。当你用 LaTeX 处理该文档并转换为 PDF 格式后，你会看到该列表为数字列表：

你也可以在列表中嵌套列表。这是一个优雅的功能，如果你需要在列表中为每个条目添加选项。例如，你可以为想要在 [Opensource.com](http://Opensource.com) 中成为作者的人们提供一些不同的资源。嵌入列表使用单独的 `\begin` 和 `\end` 声明。为了看起来方便，我在示例中添加了空行，但是 LaTeX 会忽略这些空行：

```
\begin{enumerate}
\item Be a writer

  \begin{itemize}
  \item Resources for writers
  \item Contributor Club
  \item Correspondent Program
  \end{itemize}

\item Be a reader
\end{enumerate}

```

作为嵌套列表，新列表嵌入在编号 1 的项目中，因为你在原先的 `\item` 声明之间添加了列表。你可以通过在 `\end{enumerate}` 语句前添加新列表，作为编号 2 项目的嵌套列表。

### 章节和小节

你可以将冗长文章分成多个章节，这样更易于阅读。使用 `\section{...}` 语句在大括号内添加章节标题。例如，你可以在文档顶部添加一个标题为 “About [Opensource.com](http://Opensource.com)” 的新章节：

```
$ head about.tex
\documentclass{article}
\begin{document}

\section{About Opensource.com}

Opensource.com is a premier, daily publication focused on
open source and Linux tutorials, stories, and resources.

We're a diverse and inviting group, made up of staff
editors, Correspondents, contributors, and readers. We

```

`article` 文档类会在每个主要章节添加编号，并使字体变大来突出显示。

你可以使用 `\subsection{...}` 命令来组织文档。就像 `\section{...}` 命令一样，在大括号中输入副标题名称。

```
$ head about.tex
\documentclass{article}
\begin{document}

\section{About Opensource.com}

Opensource.com is a premier, daily publication focused on
open source and Linux tutorials, stories, and resources.

\subsection{Welcome to the Opensource.com community}

```

### 标题和作者

用于出版的科学类的文章需要标题、作者以及发表日期。LaTeX 提供了通过插入命令的方式来添加这些信息，然后使用单独的 `\maketitle` 命令生成文章的标题。

将 “About Us” 作为文章标题，作者为 “[Opensource.com](http://Opensource.com) Editors”，发表日期为 “July 10, 2022” 。你必须在 `\begin{document}` 之后，文章内容前插入这些内容。

```
\title{About Us}
\author{Opensource.com Editors}
\date{July 10, 2022}
\maketitle

```

当你在生成文档时，LaTeX 会将标题、作者和日期添加到文章的顶部：

### 着重强调

科学和其他技术类文章通常会突出术语和短语。 LaTeX 提供了几种可以在技术文档中使用的字体效果，包括强调文本（通常以斜体显示）、粗体文本和<ruby> 小型大写字母 <rt>  small caps </rt></ruby>。

将短语“staff editors, Correspondents, contributors, and readers”放在斜体文本中，并将特定词“reader”和“writer”放在段落后面的强调文本中。你也可以将“skills, talents, backgrounds, and experiences”加粗。虽然这不是正确的样式设置方式，但你可以使用小型大写字母来键入 “Linux” 。

```
$ head -20 about.tex
\documentclass{article}
\begin{document}

\title{About Us}
\author{Opensource.com Editors}
\date{July 10, 2022}
\maketitle

\section{About Opensource.com}

Opensource.com is a premier, daily publication focused on
open source and \textsc{Linux} tutorials, stories, and resources.

\subsection{Welcome to the Opensource.com community}

We're a diverse and inviting group, made up of \textit{staff
editors, Correspondents, contributors, and readers}. We
value differences in \textbf{skills, talents, backgrounds, and
experiences}. There are a few different ways to get involved
as a \emph{reader} or a \emph{writer}.

```

该示例展示了不同样式的文本的应用方法。当你需要强调时，使用 `\emph{...}` 命令，将强调主题放在大括号内。要以斜体、粗体或小型大写字母显示文本，使用 `\text` 命令的变体：`\textit{...}` 用于斜体，`\textbf{...}` 用于粗体，以及 `\ textsc{...}` 用于小型大写字母。LaTeX 支持许多其他方式来设置文本样式，这些样式有助于你编写科学技术类文章。

### 使用 LaTeX

我只是介绍了使用 LaTeX 撰写科学技术文章的几种方式。你也可以在 LaTeX 中添加脚注，进行数学公式和方程的排版，取决于你的需求。你也可以通过阅读 [Opensource.com](http://Opensource.com) 中的文章 [《在 LaTeX 中创建文档的介绍》](https://opensource.com/article/17/6/introduction-latex) ，了解使用 LaTeX 撰写科学技术文章的其他方式。

---

via: <https://opensource.com/article/22/8/pdf-latex>

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

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


硬核观察 #737 现代公司的电动汽车在其车载系统使用教程上的示例密钥

Summary: • 现代公司的电动汽车在其车载系统使用教程上的示例密钥 • AI 被用于通过监控视频中的行人步态识别和分类行人 • 苹果公司的服务成为其收入的重要来源

游戏 Watch Dog 终会成现实。

汤姆克鲁斯演的电影 预判犯罪的要实现了

# 硬核观察 #737 现代公司的电动汽车在其车载系统使用教程上的示例密钥

### 现代公司的电动汽车在其车载系统使用教程上的示例密钥

一位开发者发帖称，他想要修改汽车上的车载信息娱乐系统，他的汽车是现代公司 2021 款的“全新未来移动生活概念的电动汽车 IONIQ”。在试图找出如何为汽车更新定制固件时发现，其中用来为某些部分签名的 RSA 公钥可以在网上搜索找到。更离谱的是，正如这位开发者说的，“如果运气好的话，他们不仅留下了公钥，还留下了私钥”，它是一个常见的密钥对，出现在“使用 OpenSSL 进行 RSA 加密和解密的 C 语言示例”之类的在线教程中，在这些教程中列出了使用的示例公钥和私钥。现代公司对此没有置评。

>
> **[消息来源：The Register](https://www.theregister.com/2022/08/17/software_developer_cracks_hyundai_encryption/)**
>
>
>

>
> 老王点评：这可真是按照教程来的，连示例的密钥对都一起学习了。
>
>
>

### AI 被用于通过监控视频中的行人步态识别和分类行人

据报道，马里兰大学的一个明星教授研究团队在资金的支持下，开发了一种城市监控软件，可以根据行人的独特步态特征来识别他们。然后，该算法将使用这些步态特征将行人分为“好斗”、“害羞”、“冲动”和其他性格。“这些能力将被用来预测每个行人的行为，对监视很有用”。他们在赞助方提供的视频上进行了测试，并提供了该软件的 C++ 代码库和原始数据集作为交付品。该团队还进行了“模拟大规模异质人群的有效计算模型”等类似研究。这一研究引发了对“关于机器学习研究中的严重道德问题”的关注。

>
> **[消息来源：The Daily Beast](https://www.thedailybeast.com/university-of-maryland-professor-dinesh-manocha-built-surveillance-machine-for-chinas-alibaba)**
>
>
>

>
> 老王点评：AI 究竟该用于什么地方，该如何用，这里面不仅仅是道德问题，还应该是法律问题。我只能说这么多了。
>
>
>

### 苹果公司的服务成为其收入的重要来源

迄今为止，苹果公司已将 18 亿台设备装入世界上一些最富裕的消费者的口袋和办公桌上。现在，它正在向其他公司出售这些客户的使用权，并说服那些拥有其设备的人注册自己的订阅服务。去年，苹果的服务带来了 680 亿美元的收入，占苹果总收入的 19%。在最近一个季度，服务收入的份额甚至高达 24%。据估计，最大的一块是来自其应用商店的费用，去年的费用可能达到 250 亿美元。其次是谷歌为 iOS 中的默认搜索引擎付出的费用，2020 年付出了 100 亿美元，据估计现在接近 200 亿美元。而其广告服务今年估计是 70 亿美元。剩下的是一系列订阅服务：iCloud 存储、苹果音乐和苹果护理保险等等。

>
> **[消息来源：Economist](https://www.economist.com/business/2022/07/31/apple-already-sold-everyone-an-iphone-now-what)**
>
>
>

>
> 老王点评：成功的硬件和软件带来的大量用户，其附加服务也是日进斗金。
>
>
>


在 GNOME 中创建你自定义的浅色和深色壁纸

Summary: 在 GNOME 桌面中创建自定义浅色和深色壁纸的简单指南。

在 GNOME 桌面中创建自定义浅色和深色壁纸的简单指南。

# 在 GNOME 中创建你自定义的浅色和深色壁纸

>
> 在 GNOME 桌面中创建自定义浅色和深色壁纸的简单指南。
>
>
>

[GNOME 42](https://www.debugpoint.com/2022/03/gnome-42-release/) 将期待已久的浅色和深色主题引入了 GNOME 桌面。它还带来了浅色和深色版壁纸，当你在浅色和深色主题之间切换时，它会自动改变。

因此，默认情况下，GNOME 会为你提供几组预配置的浅色和深色壁纸。

但是，如果你想要在主题更改时可以自动更改的别的壁纸怎么办？

以下是在 GNOME 中为浅色和深色主题配置和创建自定义壁纸的方法。

### 如何为 GNOME 创建自定义浅色和深色壁纸

首先，确保有两个版本的壁纸。通常，它们应该是标准的 PNG 或 JPG 图像。例如，我们在演示中使用了以下两个壁纸。

但是，如果你没有合适的浅色和深色壁纸，或正在寻找更多壁纸，在本指南的末尾，我会告诉你如何获取它们或准备你自己的。

跟着我来。

其次，我们需要为自己创建一个模式文件。壁纸的自动更换由名为 `adwaita.xml` 的 XML 文件处理，该文件定义了特定的浅色和深色背景标签。因此，我们将为壁纸创建 XML 文件。

为此，从 GitLab 复制 `adwaita.xml` 的内容并创建一个新的 XML 文件（链接在下面）。你应该在这个文件中看到两个标签：`filename` 和 `filename-dark`。这两个 XML 标记包含两个壁纸的完全限定路径。在这两个标签下添加图片的路径，如下所示。

>
> **[从这里下载 XML 文件 (adwaita.xml.in)](https://gitlab.gnome.org/GNOME/gnome-backgrounds/-/tree/main/backgrounds)**
>
>
>

第三步，使用你想要的任何名称将此文件保存到 `/home/YOUR_NAME/.local/share/gnome-background-properties`（请将 `YOUR_NAME` 替换为你的用户名）。如果 `gnome-background-properties` 不存在，请创建它们。对此示例，我使用了 `my_cool_backgrounds.xml`。

都准备好了。最后，打开设置并转到外观选项卡，你应该会看到选项中出现新的壁纸。

选择你的自定义浅色和深色壁纸并享受。

### 如何下载或制作你的动态壁纸

你一定会想，“谁有时间去寻找和创建深浅版本的壁纸”？一些网站为你提供现成的动态壁纸，你可以轻松下载和安装。

我推荐的一个网站是 [dynamicwallpaper.club](https://dynamicwallpaper.club)，它为 macOS 提供了一些高达 6K 的优秀高质量壁纸。你可以轻松下载它们。

此外，如果你打算从上述网站下载，请记住该网站的图像是 [heic 格式](https://en.wikipedia.org/wiki/High_Efficiency_Image_File_Format)，因为该网站适用于 macOS。高效视频编码（HEIC）是 Apple 的 HEIF（高效图像文件格式）的专有版本。

你需要一个驱动来查看和转换 Ubuntu 或 Fedora Linux 中的动态 heic 图像。那么，如何将它们转换为适用于 Linux 系统呢？打开终端并运行以下命令来安装驱动。

Ubuntu 用户：

```
sudo apt install heif-gdk-pixbuf

```

Fedora 用户：

```
sudo dnf install libheif

```

仅适用于带有 KDE Plasma 的 Fedora/Ubuntu（没有此插件，Plasma 应用无法打开 heic 图像）：

```
sudo apt install qt-heif-image-plugin
sudo dnf install qt-heif-image-plugin

```

最后，使用你喜欢的图像查看器打开 heic 图像并将其保存为 JPG/PNG。

最后，别忘了在下面的评论部分告诉我你是否可以为 GNOME 创建自定义深色和浅色壁纸。

干杯。

---

via: <https://www.debugpoint.com/custom-light-dark-wallpaper-gnome/>

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


“作弊”：只需要知道这一个 Linux 命令就够了

这和TLDR不是一回事吗？社区又在重复建设了？

啥软件没重复造轮子啊，多这一个不多呢。

# “作弊”：只需要知道这一个 Linux 命令就够了

>
> Linux cheat 命令是一个实用程序，可以用来搜索和显示你想要使用的命令的使用示例。
>
>
>

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

互联网上有很多关于 Linux 和开源的信息，但是当你想要深入工作，通常需要一份便捷的文档。早在 Linux 出现之前的 Unix 系统中，就有 `man`（“manual” 的缩写）和 `info` 命令了，二者都会显示命令、配置文件、系统调用等的官方项目文档。

关于 `man` 和 `info` 页面是对知晓如何使用工具的用户的有用提醒，还是为初次使用的用户提供介绍存在争议。不管怎样，`man` 和 `info` 页面介绍了工具以及如何使用该工具，很少涉及特定任务以及如何完成它们。正是出于这个原因，开发了 `cheat` 命令。

例如，设想你想不起来如何 [解压 tar 压缩包文件](https://opensource.com/article/17/7/how-unzip-targz-file) 。`man` 页面会给你展示所有的选项，但需要你将这些信息转换为命令：

```
tar -A [OPTIONS] ARCHIVE ARCHIVE
tar -c [-f ARCHIVE] [OPTIONS] [FILE...]
tar -d [-f ARCHIVE] [OPTIONS] [FILE...]
tar -t [-f ARCHIVE] [OPTIONS] [MEMBER...]
tar -r [-f ARCHIVE] [OPTIONS] [FILE...]
tar -u [-f ARCHIVE] [OPTIONS] [FILE...]
tar -x [-f ARCHIVE] [OPTIONS] [MEMBER...]

```

这确实是一些用户需要的，但是也使一些用户感到困惑。相比之下，`cheat` 命令会罗列常用命令：

```
$ cheat tar

# To extract an uncompressed archive:
tar -xvf /path/to/foo.tar

# To extract a .tar in specified Directory:
tar -xvf /path/to/foo.tar -C /path/to/destination/

# To create an uncompressed archive:
tar -cvf /path/to/foo.tar /path/to/foo/

# To extract a .tgz or .tar.gz archive:
tar -xzvf /path/to/foo.tgz
tar -xzvf /path/to/foo.tar.gz
[...]

```

这真是雪中送炭！

### Linux Cheat 命令

`cheat` 命令是一个实用程序，可以用来搜索和显示你想要使用的命令的使用示例。如大多数 Unix 命令一样，同一个概念有多种不同的实现方式，它包括一个 [使用 Go 编写](https://github.com/cheat/cheat) 的和一个由我帮助维护的 [仅用 100 行 Bash 编写](https://gitlab.com/slackermedia/cheat) 的两个版本。

若要安装 Go 版本的，下载 [最新版](https://github.com/cheat/cheat/releases) 并将它放在某个 [路径](https://opensource.com/article/17/6/set-path-linux) 中，例如 `~/.local/bin/` 或 `/usr/local/bin` 中。若安装 Bash 版本，下载最新版并运行 `install-cheat.sh` 脚本：

```
$ sh ./install-cheat.sh

```

如需配置后安装，请使用 [自动工具](https://opensource.com/article/19/7/introduction-gnu-autotools)（Autotools）：

```
$ aclocal ; autoconf
$ automake --add-missing ; autoreconf
$ ./configure --prefix=$HOME/.local
$ make
$ make install

```

### 在 Linux 中安装 Cheat 程序

Cheat 只是包含常用命令的纯文本文件。该程序可以从 [github.com/cheat/cheatsheets](https://github.com/cheat/cheatsheets) 获得。当你第一次运行命令时，Go 版本会自动为你下载支持列表。如果你使用 Bash 版本，用 `--fetch` 选项可以下载支持列表：

```
$ cheat --fetch

```

与 `man` 一样，你的系统上可以有多个备忘单集合。 Go 版本的 `cheat` 使用 [YAML](https://opensource.com/article/21/9/yaml-cheat-sheet) 配置文件来定义每个集合的位置。Bash 版本在安装过程中定义了路径，默认下载 [github.com/cheat/cheatsheets](https://github.com/cheat/cheatsheets) 集合以及 [opensource.com](http://Opensource.com) 自己的 [gitlab.com/opensource.com/cheatsheets](https://gitlab.com/opensource.com/cheatsheets) 集合。

### 列出 Cheat 支持项目

使用 `--list` 选项即可查看 `cheat` 支持的项目：

```
$ cheat --list
7z
ab
acl
alias
ansi
ansible
ansible-galaxy
ansible-vault
apk
[...]

```

### 使用 Cheat 查看 Linux 命令

使用 `cheat` 查看命令如同使用 `man` 和 `info` 查看一样简单。只需要输入你需要查询的命令即可：

```
$ cheat alias

# To show a list of your current shell aliases:
alias

# To alias `ls -l` to `ll`:
alias ll='ls -l'

```

默认情况下，`cheat` 命令会使用你的 [环境变量](https://opensource.com/article/19/8/what-are-environment-variables) `PAGER` 中指定的分页器。你可以在运行 `cheat` 命令前改写 `PAGER` 变量值，暂时修改环境变量。

```
$ PAGER=most cheat less

```

如果你只是想在没有 `PAGER` 的情况下将 `cheat` [输出](https://opensource.com/article/19/2/getting-started-cat-command) 到终端里，在 Bash 版中有 `--cat` 选项可以使用：

```
$ cheat --cat less

```

### 这并不是作弊

`cheat` 系统抓住了要害，你不必拼凑有关如何使用命令的线索，你只需按照示例进行操作即可。当然，对于复杂的命令，它不是深入研究实际文档的捷径，但为了快速借用，它还是可以的。

甚至你可以通过将文件放入其中一个备忘单集合中，来创建自己的备忘单。好消息是，因为这些项目是开源的，所以你可以将你的个人备忘单贡献给 GitHub 集合。另一个好消息是，当有新的 [opensource.com](http://opensource.com) [备忘单](https://opensource.com/downloads) 版本发布时，我们将从现在开始包含纯文本版本，以便你可以将其添加到你的收藏中。

该命令称为 “<ruby> 作弊 <rt>  cheat </rt></ruby>”，但正如任何 Linux 用户都会向你保证的那样，它实际上并不是作弊。它只是以开源的方式工作得更巧妙。

---

via: <https://opensource.com/article/22/6/linux-cheat-command>

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

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


硬核观察 #738 Tornado Cash 代码在 GitHub 上重新上传

Summary: • Tornado Cash 代码在 GitHub 上重新上传 • 亚马逊使用为将来保留的 IPv4 240/4 地址段 • 美科技巨头收集了大量用户数据，谷歌最多

又赢了？ 谁收集的最多心里一点都没数吗？站在道德的洼地里对别人指手画脚！

来自湖北的 Chrome Mobile iOS 104.0|iOS 15.6 用户

# 硬核观察 #738 Tornado Cash 代码在 GitHub 上重新上传

### Tornado Cash 代码在 GitHub 上重新上传

美国财政部本月早些时候宣布制裁混币器 Tornado Cash，禁止美国个人或组织与 Tornado Cash 有任何交易往来。GitHub 随即下架了该代码库，删除了开发者账号。荷兰还逮捕了一名参与它的开发的开发者。本周，美国约翰霍普金斯大学计算机科学教授 Matthew Green 以教学和研究的目的在 GitHub 上重新上传了 Tornado Cash 代码。电子前哨基金会（EFF）宣布将代表 Green 教授捍卫发布源代码的权利。EFF 称美国宪法第一修正案保护了 GitHub 托管代码的权利，也保护了 Green 教授重新发布代码的权利。

>
> **[消息来源：EFF](https://www.eff.org/deeplinks/2022/08/code-speech-and-tornado-cash-mixer)**
>
>
>

>
> 老王点评：这让我想起来当年 PGP 源代码以出版书籍的方式被带出美国的事情。
>
>
>

### 亚马逊使用为将来保留的 IPv4 240/4 地址段

称之为 E 类地址的 240/4（240.0.0.0 - 255.255.255.255）被保留供未来使用。但 IPv4 地址资源的稀缺促使 IETF 开始讨论使用这些地址空间。主要操作系统从 2008 年起就支持将 240/4 地址空间作为单播地址使用。调查发现，亚马逊等公司已经在没有和国际互联网机构协调的情况下，在其 AS 内使用 240/4 地址块。

>
> **[消息来源：RIPE](https://labs.ripe.net/author/qasim-lone/2404-as-seen-by-ripe-atlas/)**
>
>
>

>
> 老王点评：就算是这几亿个 IP 地址释放出来，也很快就会耗尽，所以倒不如像现在这样，当成私有地址使用好了。
>
>
>

### 美科技巨头收集了大量用户数据，谷歌最多

研究人员分析了谷歌、苹果、Facebook、亚马逊和 Twitter 等主要科技公司收集的用户的大量敏感数据。其中，谷歌从用户那里收集的数据最多，有 39 种。接下来是 Twitter，24 种；亚马逊，23 种；Facebook，14 种。排名最后的是苹果，它收集了 12 种。报告称，“用户没有耐心、时间或精力来发现网站存储了哪些信息，以及如何利用这些信息来获取利益。这意味着，用户通过接受隐私政策，能够让这些公司获取他们所需要的所有信息。”

>
> **[消息来源：Stock Apps](https://stockapps.com/blog/google-tracks-39-types-of-private-data-the-highest-among-big-tech-companies/)**
>
>
>

>
> 老王点评：这些商业公司不收集用户隐私反而会是奇怪的事情，所以，现在开始比谁最过分了，不出预料，果然是广告公司谷歌拔的头筹。
>
>
>


# 80 高龄的计算机科学家曾为 “Unix” 命名，如今为 AWK 代码添加了 Unicode 支持

>
> 布莱恩·克尼汉在 80 岁的时候还在积极为他的原始项目 AWK 增加代码贡献。这真是鼓舞人心！
>
>
>

<img src="content_image/album_202208_25_125453ovdfuvuixuo33fvi.jpg" alt="这位 80 岁的计算机科学家曾提出 “Unix” 这一名字，在 AWK 代码中加入了 Unicode 支持" title="这位 80 岁的计算机科学家曾提出 “Unix” 这一名字，在 AWK 代码中加入了 Unicode 支持">

<ruby> 布莱恩·克尼汉 <rt>  Brian Kernighan </rt></ruby> 因其与 Unix 的创造者 <ruby> 肯·汤普森 <rt>  Ken Thompson </rt></ruby> 和 <ruby> 丹尼斯·里奇 <rt>  Dennis Ritchie </rt></ruby> 一起的工作而广为人知。他对 Unix 的发展做出了重大贡献。

不仅如此，布莱恩·克尼汉还提出了 “Unix” 这个名字，并创造了 “Hello, world” 作为程序的测试短语。

他也是《C 编程语言》一书的共同作者（另一位是丹尼斯·里奇）。因此，可以说他是你所知道的关于 Unix、Linux、BSD 和 C 编程语言的演变的重要组成部分。

而且，作为一位如今已 80 岁的老人家，他似乎投入了一些时间来为 AWK（一种他在上世纪 70 年代共同创造的脚本语言）增加了一个新的功能。

? 这真是妙极了，对吗？而且，听起真是鼓舞人心！

注：AWK 仍然是一个处理文本和提取数据的强大工具，忠实于它的最初目的。如果你感到好奇，你可以在 [freeCodeCamp](https://www.freecodecamp.org/news/the-linux-awk-command-linux-and-unix-usage-syntax-examples/) 上了解更多关于它的信息。

### 为 AWK 添加 Unicode 支持

最近，[The Register](https://www.theregister.com/2022/08/23/universal_unix_tool_awk_gets/) 通过一篇发表在 YouTube 上的近期采访，发现了这个功能的增加。

从技术上讲，这项贡献早在几个月前就有了，但现在它才得到人们的关注。

当然，这个功能的增加对很多人来说可能不是什么大事。但是，它背后的努力，以及谁贡献了它，就有了天壤之别。

此外，有趣的是，他并不完全了解 Git 的工作原理。所以，考虑到这一点，我认为他在这里的提交做得相当好。

在这个提交 “[附上 BWK 的邮件 - onetrueawk/awk@9ebe940](https://github.com/onetrueawk/awk/commit/9ebe940cf3c652b0e373634d2aa4a00b8395b636)” 中，他提到：

>
> 一旦我搞清楚了（并做了一些检查，我将尝试提交一个拉取请求。我希望我更了解 git，但尽管有你的帮助，我仍然没能正确地理解，所以这可能需要一段时间。
>
>
>

如果你对 Unix 的原始创造者和贡献者以及一路走来的许多重要创新有好奇心，我建议你观看上面链接的采访。

你也可以在 [普林斯顿大学网站](https://www.cs.princeton.edu/~bwk/) 上查看他的更多工作和最近的书籍。

? 那么，你对这位 80 岁的 Unix 传奇人物的代码贡献有何看法？你有什么特别佩服他的地方吗？请在下面的评论中分享你的想法。

---

via: <https://news.itsfoss.com/unix-awk-unicode/>

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


Summary: Spotify 不需要介绍。它是最流行的音乐流媒体服务。

啊这。无言以对，安装官方仓库的软件也能写一大篇，牛逼。

虽然十分感谢译者的翻译，但是也非常真诚的建议选择一些更有深度的文章吧。

Spotify 不需要介绍。它是最流行的音乐流媒体服务。

# 在 Manjaro 和其他基于 Arch Linux 的发行版上安装 Spotify

>
> Spotify 不需要介绍。它是最流行的音乐流媒体服务。
>
>
>

你可以 [在 Web 浏览器中播放 Spotify](https://open.spotify.com/)，但如果你经常使用它，使用桌面应用会是一个更好的选择。

为什么呢？因为你可以用媒体键控制播放，得到歌曲的通知，而且不需要担心不小心关闭浏览器标签或窗口。桌面客户端给人一种完整的体验。

Spotify 为 Ubuntu 和 Debian [提供了一个仓库](https://www.spotify.com/us/download/linux/)。但在 Arch Linux 上安装 Spotify 呢？

实际上，在 Arch Linux 上获得 Spotify 的桌面应用更加简单。只需使用这个命令：

```
sudo pacman -Syu spotify-launcher

```

这就是在基于 Arch 的 Linux 发行版上安装 Spotify 的众多方法之一，如 Manjaro、[Endeavour OS](https://endeavouros.com/)、[Garuda Linux](https://garudalinux.org/) 等。

在本教程中，我将讨论以下安装 Spotify 的方法：

* 使用 [pacman](https://wiki.archlinux.org/title/Pacman)（你已经在上面看到了，但我们会更深入地挖掘）。
* 使用 [Pamac](https://wiki.manjaro.org/index.php/Pamac)（Manjaro的软件包管理器）进行安装
* 使用 [Flatpak](https://itsfoss.com/what-is-flatpak/)（通用打包格式）进行安装
* 使用 Snap（Spotify 团队的官方包）。

### 方法 1：使用 pacman 安装 Spotify

Spotify 可在 Arch Linux 的社区仓库中 [找到](https://archlinux.org/packages/community/x86_64/spotify-launcher/)。它实际上是 Spotify 提供的 APT 仓库的 Rust 实现。

打开你的终端，按以下方式 [使用 pacman 命令](https://itsfoss.com/pacman-command/)：

```
sudo pacman -Syu spotify-launcher

```

安装后，从应用菜单中启动它，并登录开始收听。

输入下面的命令，将其连同其依赖关系和配置文件一起删除。

```
sudo pacman -Rns spotify-launcher

```

### 方法 2：使用 Pamac 安装 Spotify

如果你使用 Manjaro 或者 [在你的系统中安装了 Pamac](https://itsfoss.com/install-pamac-arch-linux/)，你可以用它来图形化安装 Spotify。

从应用菜单中打开添加/删除软件。点击左上角的搜索图标，搜索 Spotify。然后，选择名为 `spotify-launcher` 的软件包，并点击应用进行安装，如下图所示。

你也可以在安装后取消选择该软件包，并点击应用来删除它。

#### 使用 Pamac CLI

是的，Pamac 也有一个命令行界面，你可以通过以下方式使用它来获得 Spotify。

```
pamac install spotify-launcher

```

要删除，使用：

```
pamac remove spotify-launcher

```

### 方法 3：使用 Flatpak 安装 Spotify

许多用户喜欢使用 Flatpak 安装专有应用，因为它提供了沙盒。

在终端输入以下命令来更新你的系统并安装 Flatpak（如果你还没有）。

```
sudo pacman -Syu flatpak

```

然后，使用下面的命令启用 [Flathub 仓库](https://flathub.org)。

```
flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo

```

现在，通过输入下面的命令安装 Spotify。

```
flatpak install spotify

```

要删除 Spotify 的 Flatpak 包，你可以使用下面的命令。

```
flatpak remove spotify

```

### 方法 4：使用 Snap 安装 Spotify

我知道很多人对 Snap 打包格式的“封闭性”非常反感。然而，Spotify 官方提供了一个 Snap 包。你可以从 Spotify 的开发者那里得到它。

如果你的系统支持 Snap 包，请使用以下命令：

```
sudo snap install spotify

```

如果你以后想删除它，使用这个命令：

```
sudo snap remove spotify

```

### 总结

第一个方法中讨论的 Arch 包是由 [kpcyrd](https://github.com/kpcyrd) 开发和维护的。你可以在 [这里](https://github.com/kpcyrd/spotify-launcher) 查看源代码。

如果你喜欢 Arch Linux 并想支持它，请考虑向该项目捐款。所有的工作都是由社区成员完成的，他们是无偿的志愿者。

如果你在 Arch 上安装 Spotify 有任何问题，请告诉我。

---

via: <https://itsfoss.com/install-spotify-arch/>

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


Summary: • Python 虽然是最受欢迎的编程语言，但是找工作还是要会点 SQL • 微软发现一个 ChromeOS 的高危漏洞 • 利用手机陀螺仪窃取物理隔离系统的数据

# 硬核观察 #739 Python 虽然是最受欢迎的编程语言，但是找工作还是要会点 SQL

### Python 虽然是最受欢迎的编程语言，但是找工作还是要会点 SQL

在 IEEE 的最新年度调查榜单中，Python 名列榜首，然后是三种 C 语言的变体（C、C++ 和 C#），接着是 Java、SQL 和 JavaScript。但涉及到找工作时，SQL 爬到了列表的顶端，其次是 Java、Python。该榜单的编辑称，“SQL 信号的强度并不是因为有很多雇主只寻找 SQL 程序员，……他们想要一种特定的语言加上 SQL。”

>
> **[消息来源：The Register](https://www.theregister.com/2022/08/24/ieee_python_language/)**
>
>
>

>
> 老王点评：复杂的 SQL 不会，简单的 SQL 总是会一点的，所以，请在简历上大大的写上 SQL。
>
>
>

### 微软发现一个 ChromeOS 的高危漏洞

微软在 ChromeOS 中发现了一个漏洞，并给它打出了 9.8 的评分。在报告给谷歌后，该漏洞不到一周就得到了修复，只用了一个月就提供给了用户。这个问题源于 D-Bus，它是 Linux 中使用的一种进程间通信机制，使用了一个标准库中的典型的危险函数 `strcpy()`，稍有安全经验的 C 程序员都知道这个函数容易出现缓冲区溢出安全漏洞。这个漏洞为安全研究人员得到了 25000 美元的奖金。比较有趣的是，以往经常是谷歌的 Project Zero 团队提醒微软的产品漏洞，并且，如果在三个月内没修复就会不管不顾地公开漏洞细节。有时候让微软特别上火。

>
> **[消息来源：The Register](https://www.theregister.com/2022/08/23/microsoft_chromeos_bug/)**
>
>
>

>
> 老王点评：居然会犯这么低级的错误，这钱也太好挣了吧 —— 我寻思是不是写个扫描器，当这些有钱的企业的代码一旦发布，就触发对这种经典漏洞的扫描。
>
>
>

### 利用手机陀螺仪窃取物理隔离系统的数据

物理隔离在物理上是隔离的，用于对安全要求特别高的环境中，它无法与其他计算机或网络设备进行无线或物理连接。之前有研究利用物理隔离系统上的扬声器发出特定频率的声波，从而通过手机接受声波而窃取数据。现在安全专家发现陀螺仪也可用于此用途。陀螺仪用于检测智能手机的旋转速度，被广泛认为是一种安全的传感器，因而 iOS 或 Android 没有提供阻止访问的选项。安全专家利用这种方法，可以在“几米远”的范围内从物理隔离的计算机中窃取敏感信息。这些听不见的频率会让陀螺仪产生微小机械振荡，从而将其转换为数据。

>
> **[消息来源：Tech Crunch](https://techcrunch.com/2022/08/24/gairoscope-air-gap-attack/)**
>
>
>

>
> 老王点评：真是无孔不入，我觉得这种物理隔离环境就不该让人带手机进去。?
>
>
>