在 Linux 上用 dust 代替 du

Summary: dust 命令是用 Rust 编写的对 du 命令的一个更直观实现。

dust=du+tree???

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

dust 命令是用 Rust 编写的对 du 命令的一个更直观实现。

# 在 Linux 上用 dust 代替 du

>
> dust 命令是用 Rust 编写的对 du 命令的一个更直观实现。
>
>
>

如果你在 Linux 命令行上工作，你会熟悉 `du` 命令。了解像 `du` 这样的命令，可以快速返回磁盘使用情况，是命令行使程序员更有效率的方法之一。然而，如果你正在寻找一种方法来节省更多的时间，使你的生活更加容易，看看 [dust](https://github.com/bootandy/dust)，它是用 Rust 重写的 `du`，具有更多的直观性。

简而言之，`dust` 是一个提供文件类型和元数据的工具。如果你在一个目录中运行了 `dust`，它将以几种方式报告该目录的磁盘利用率。它提供了一个信息量很大的图表，告诉你哪个文件夹使用的磁盘空间最大。如果有嵌套的文件夹，你可以看到每个文件夹使用的空间百分比。

### 安装 dust

你可以使用 Rust 的 Cargo 包管理器安装 `dust`：

```
$ cargo install du-dust

```

另外，你可以在 Linux 上的软件库中找到它，在 macOS 上，可以使用 [MacPorts](https://opensource.com/article/20/11/macports) 或 [Homebrew](https://opensource.com/article/20/6/homebrew-mac)。

### 探索 dust

在一个目录中执行 `dust` 命令，会返回一个图表，以树状格式显示其内容和每个项目所占的百分比。

```
$ dust
 5.7M   ┌── exa                                                           │                                                ██ │   2%
 5.9M   ├── tokei                                                         │                                                ██ │   2%
 6.1M   ├── dust                                                          │                                                ██ │   2%
 6.2M   ├── tldr                                                          │                                                ██ │   2%
 9.4M   ├── fd                                                            │                                                ██ │   4%
 2.9M   │ ┌── exa                                                         │                                              ░░░█ │   1%
  15M   │ ├── rustdoc                                                     │                                              ░███ │   6%
  18M   ├─┴ bin                                                           │                                              ████ │   7%
  27M   ├── rg                                                            │                                            ██████ │  11%
 1.3M   │     ┌── libz-sys-1.1.3.crate                                    │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█ │   0%
 1.4M   │     ├── libgit2-sys-0.12.19+1.1.0.crate                         │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█ │   1%
 4.5M   │   ┌─┴ github.com-1ecc6299db9ec823                               │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█ │   2%
 4.5M   │ ┌─┴ cache                                                       │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░█ │   2%
 1.0M   │ │   ┌── git2-0.13.18                                            │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   0%
 1.4M   │ │   ├── exa-0.10.1                                              │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 1.5M   │ │   │ ┌── src                                                   │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 2.2M   │ │   ├─┴ idna-0.2.3                                              │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 1.2M   │ │   │       ┌── linux                                           │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   0%
 1.6M   │ │   │     ┌─┴ linux_like                                        │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 2.6M   │ │   │   ┌─┴ unix                                                │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 3.1M   │ │   │ ┌─┴ src                                                   │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 3.1M   │ │   ├─┴ libc-0.2.94                                             │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 1.2M   │ │   │     ┌── test                                              │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   0%
 2.6M   │ │   │   ┌─┴ zlib-ng                                             │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 904K   │ │   │   │   ┌── vstudio                                         │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   0%
 2.0M   │ │   │   │ ┌─┴ contrib                                           │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 3.4M   │ │   │   ├─┴ zlib                                                │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 6.1M   │ │   │ ┌─┴ src                                                   │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓██ │   2%
 6.1M   │ │   ├─┴ libz-sys-1.1.3                                          │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓██ │   2%
 1.6M   │ │   │     ┌── pcre                                              │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 2.5M   │ │   │   ┌─┴ deps                                                │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 3.8M   │ │   │   ├── src                                                 │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓▓█ │   1%
 7.4M   │ │   │ ┌─┴ libgit2                                               │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓██ │   3%
 7.6M   │ │   ├─┴ libgit2-sys-0.12.19+1.1.0                               │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▓▓▓▓██ │   3%
  26M   │ │ ┌─┴ github.com-1ecc6299db9ec823                               │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░██████ │  10%
  26M   │ ├─┴ src                                                         │               ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░██████ │  10%
 932K   │ │   ┌── .cache                                                  │               ░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓█ │   0%
  11M   │ │   │     ┌── pack-c3e3a51a17096a3078196f3f014e02e5da6285aa.idx │               ░░░░░░▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓███ │   4%
 135M   │ │   │     ├── pack-c3e3a51a17096a3078196f3f014e02e5da6285aa.pack│               ░░░░░░▓▓███████████████████████████ │  53%
 147M   │ │   │   ┌─┴ pack                                                │               ░░░░░░█████████████████████████████ │  57%
 147M   │ │   │ ┌─┴ objects                                               │               ░░░░░░█████████████████████████████ │  57%
 147M   │ │   ├─┴ .git                                                    │               ░░░░░░█████████████████████████████ │  57%
 147M   │ │ ┌─┴ github.com-1ecc6299db9ec823                               │               ░░░░░░█████████████████████████████ │  57%
 147M   │ ├─┴ index                                                       │               ░░░░░░█████████████████████████████ │  57%
 178M   ├─┴ registry                                                      │               ███████████████████████████████████ │  69%
 257M ┌─┴ .                                                               │██████████████████████████████████████████████████ │ 100%
$

```

将 `dust` 应用于一个特定的目录：

```
$ dust ~/Work/

```

`-r` 选项以相反的顺序显示输出，“根”在底部：

```
$ dust -r ~/Work/

```

使用 `dust -d 3` 会返回三层的子目录和它们的磁盘利用率：

```
$ dust -d 3 ~/Work/wildfly/jaxrs/target/classes
 4.0K     ┌── jaxrs.xml                                                           │                                         █ │   1%
 4.0K   ┌─┴ subsystem-templates                                                   │                                         █ │   1%
 4.0K   │   ┌── org.jboss.as.controller.transform.ExtensionTransformerRegistration│                                         █ │   1%
 4.0K   │   ├── org.jboss.as.controller.Extension                                 │                                         █ │   1%
 8.0K   │ ┌─┴ services                                                            │                                         █ │   2%
 8.0K   ├─┴ META-INF                                                              │                                         █ │   2%
 4.0K   │ ┌── jboss-as-jaxrs_1_0.xsd                                              │                                        ░█ │   1%
 8.0K   │ ├── jboss-as-jaxrs_2_0.xsd                                              │                                        ░█ │   2%
  12K   ├─┴ schema                                                                │                                        ██ │   3%
 408K   │   ┌── as                                                                │  ████████████████████████████████████████ │  94%
 408K   │ ┌─┴ jboss                                                               │  ████████████████████████████████████████ │  94%
 408K   ├─┴ org                                                                   │  ████████████████████████████████████████ │  94%
 432K ┌─┴ classes                                                                 │██████████████████████████████████████████ │ 100%
$

```

### 总结

`dust` 的魅力在于它是一个小而简单的、易于理解的命令。它使用颜色方案来表示最大的子目录，使你的目录易于可视化。这是一个受欢迎的项目，欢迎大家来贡献。

你是否使用或考虑使用 `dust`？如果是，请在下面的评论中告诉我们你的想法。

---

via: <https://opensource.com/article/21/6/dust-linux>

作者：[Sudeshna Sur](https://opensource.com/users/sudeshna-sur) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


为什么我们要开源我们的 Python 平台

Summary: 开源开发的理念使得 Anvil 的整个解决方案更加有用且值得信赖。

开源开发的理念使得 Anvil 的整个解决方案更加有用且值得信赖。

# 为什么我们要开源我们的 Python 平台

>
> 开源开发的理念使得 Anvil 的整个解决方案更加有用且值得信赖。
>
>
>

Anvil 团队最近开源了 [Anvil App Server](https://anvil.works/blog/open-source)， 一个用于托管完全用 Python 构建的 Web 程序的运行时引擎。

社区的反应十分积极，我们 Anvil 团队已经将许多反馈纳入了我们的 [下一个版本](https://github.com/anvil-works/anvil-runtime)。但是我们不断被问到的问题是，“为什么你们选择开源这个产品的核心呢？”

### 我们为何创造 Anvil

[Anvil](https://anvil.works/) 是一个可以使得构建 Web 应用更加简单的工具。我们让你们有能力仅使用一种语言—— Python —— 就可以来构建你的整个应用。

在 Anvil 之前，如果你想要构建一个 Web app，你需要写很多代码，用很多的技术，比如 HTML、Javascript、CSS、Python、SQL、React、Redux、Bootstrap、Sass、Webpack 等。这需要花费很长时间来学习。对于一个简单的应用便是这样子；相信我，一般的应用其实 [更加复杂](https://github.com/kamranahmedse/developer-roadmap#introduction)。

*是的。对于一个简单的 web 应用便是需要如此多的技术。*

但即使如此，你还没有完成！你需要了解有关 Git 和云托管提供商的所有信息、如何保护（很有可能是）Linux 操作系统、如何调整数据库，然后随时待命以保持其运行。一直如此。

因此，我们开发出了 Anvil，这是一个在线 IDE，你可以在用 [拖放编辑器](https://anvil.works/docs/client/ui) 来设计你的 UI 界面，用 Python 编写你的 [逻辑](https://anvil.works/docs/client/python)，然后 Anvil 会负责其余的工作。我们将所有的繁杂的技术栈进行了替换，只用 Python 就行啦！

### 简单的 Web 托管很重要，但还不够

Anvil 还可以为你托管你的应用程序。为什么不呢？部署 Web 应用程序非常复杂，因此运行我们自己的云托管服务是提供我们所需的简单性的唯一方法。在 Anvil 编辑器中构建一个应用程序，[单击按钮](https://anvil.works/docs/deployment)，它就在网上发布了。

但我们不断听到有人说，“那太好了，但是……”

* “我需要在没有可靠互联网接入的海外平台上运行这个应用。”
* “我想要将我的应用程序嵌入到我售出的 IoT 设备中”
* "如果我把我的宝都压到你的 Anvil 上，我怎么能确定十年后我的应用仍然能够运行呢？”

这些都是很好的观点！云服务并不是适合所有人的解决方案。如果我们想为这些用户提供服务，就必须有一些方法让他们把自己的应用从 Anvil 中取出来，在本地运行，由他们自己完全控制。

### 开源是一个逃生舱，而不是弹射座椅

在会议上，我们有时会被问到，“我可以将它导出为 Flask+JS 的应用程序吗？” 当然，我们可以将 Anvil 项目分别导出为 Python 和 JavaScript —— 我们可以生成一个服务器包，将客户端中的 Python 编译为 Javascript，然后生成一个经典的 Web 应用程序。但它会有严重的缺点，因为：**代码生成是一个弹射座椅。**

生成的代码聊胜于无；至少你可以编辑它！但是在你编辑该代码的那一刻，你就失去了生成它的系统的所有好处。如果你使用 Anvil 是因为它的 [拖放编辑器](https://anvil.works/docs/editor) 和 [运行在浏览器中的 Python](https://anvil.works/docs/client)，那么你为什么必须使用 vim 和 Javascript 才能在本地托管你的应用程序？

我们相信 [逃生舱，而不是弹射座椅](https://anvil.works/blog/escape-hatches-and-ejector-seats)。所以我们选择了一个正确的方式——我们 [开源了 Anvil 的运行引擎](https://anvil.works/blog/open-source)，这与在我们的托管服务中为你的应用程序提供服务的代码相同。这是一个独立的应用程序；你可以使用文本编辑器编辑代码并在本地运行。但是你也可以将它直接用 `git` 推回到我们的在线 IDE。这不是弹射座椅；没有爆炸性的转变。这是一个逃生舱；你可以爬出来，做你需要做的事情，然后再爬回来。

### 如果它开源了，它还可靠吗

开源中的一个看似矛盾的是，它的免费可用性是它的优势，但有时也会产生不稳定的感觉。毕竟，如果你不收费，你如何保持这个平台的长期健康运行？

我们正在做我们一直在做的事情 —— 提供一个开发工具，使构建 Web 应用程序变得非常简单，尽管你使用 Anvil 构建的应用程序 100% 是你的。我们为 Anvil 应用程序提供托管，并为 [企业客户](https://anvil.works/docs/overview/enterprise) 提供整个现场开发和托管平台。这使我们能够提供免费计划，以便每个人都可以将 Anvil 用于业余爱好或教育目的，或者开始构建某些东西并查看它的发展。

### 得到的多，失去的少

开源我们的运行引擎并没有减少我们的业务 —— 它使我们的在线 IDE 在今天和未来变得更有用、更值得信赖。我们为需要它的人开放了 Anvil App Server 的源代码，并提供最终的安全保障。对于我们的用户来说，这是正确的举措 —— 现在他们可以放心地进行构建，因为他们知道开源代码 [就在那里](https://github.com/anvil-works/anvil-runtime)，如果他们需要的话。

如果我们的开发理念与你产生共鸣，何不亲自尝试 Anvil？

---

这篇文章改编自 [Why We Open Sourced the Anvil App Server](https://anvil.works/blog/why-open-source)，经许可重复使用。

---

via: <https://opensource.com/article/20/7/why-open-source>

作者：[Meredydd Luff](https://opensource.com/users/meredydd-luff) 选题：[lujun9972](https://github.com/lujun9972) 译者：[zepoch](https://github.com/zepoch) 校对：[wxy](https://github.com/wxy)

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


Summary: 更多：• 使用虚拟机来隐藏勒索软件攻击正变得越来越流行 • GitHub 漏洞赏金激增超过 150 万美元大关

放20年前，老王可以呀：）

# 硬核观察 #317 DuckDuckGo 成为美国、加拿大、澳大利亚的第二大移动搜索引擎

### DuckDuckGo 成为美国、加拿大、澳大利亚的第二大移动搜索引擎

DuckDuckGo 发布[公告](https://spreadprivacy.com/duckduckgrowing/)称，在过去的 12 个月里，其应用程序被下载了 5000 多万次，比以前所有年份的总和还要多，其月度搜索流量增加了 55%，在许多国家的移动搜索引擎中成长为第二名。DuckDuckGo 说，“我们不跟踪我们的用户，所以我们不能确定我们有多少用户，但根据市场份额的估计、下载量和国家调查，我们相信有 7000 万至 1 亿 DuckDuckGo 用户。”

DuckDuckGo 现在每年的收入超过 1 亿美元。2020 年底，他们还获得了超过 1 亿美元的投资。

>
> 然而，我没有使用过它，不是我不想用……
>
>
>

### 使用虚拟机来隐藏勒索软件攻击正变得越来越流行

2020 年初，安全研究人员发现，一个勒索软件团伙想出了一个创新的招数，允许它在受感染主机的虚拟机内运行其有效载荷，作为绕过安全软件的技术解决方案。勒索软件团伙在受感染主机上有了一个小的立足点之后可以下载和安装虚拟机软件，启动一个虚拟机实例共享主机的存储空间，然后从虚拟机内继续加密受害者的文件。在执行过程中，主机的反病毒软件无法到达并检测到勒索软件。一年后，这种技术已经在地下网络犯罪中[传播](https://therecord.media/using-vms-to-hide-ransomware-attacks-is-becoming-more-popular/)，现在被多个勒索软件运营商使用。

>
> 没想到虚拟化还被运用到这个方面，不过这也并非无迹可查。
>
>
>

### GitHub 漏洞赏金激增超过 150 万美元大关

GitHub 表示，2020 年是漏洞披露方面“最繁忙的一年”。GitHub 安全漏洞赏金计划已经运作了 7 年，而在过去的一年里，发放了超过 50 万美元的[奖励](https://www.zdnet.com/article/github-bug-bounties-payouts-surge-past-1-5-million-mark/)，使支付的总金额超过 150 万美元。GitHub 的计划范围包括众多 GitHub 拥有的域名和目标，研究人员每份报告可获得高达 3 万美元。GitHub 的安全漏洞赏金计划在安全港原则下运作，遵守负责任的披露政策的漏洞赏金猎人受到保护，不会因其研究而产生任何潜在的法律后果。

>
> 做个白帽子挣赏金真香，可惜 20 年前没有这样的环境。
>
>
>


为什么要为你的家庭自动化项目选择开源

在opensource这都能水一篇文章？

# 为什么要为你的家庭自动化项目选择开源

>
> 家庭自动化是一个令人兴奋的技术分支。现在开始用开源工具为你的家庭自动化设计一套解决方案吧。
>
>
>

<img src="content_image/album_202106_29_215353tk85i7m1myggvu8g.jpg" alt="" title="Working from home at a laptop">

行动起来吧。科技的关键是让生活更加美好。

当然，“更好”的标准因人而异，取决于他们在特定时刻的需求。尽管如此，技术具有影响许多不同阶段生活的独特能力。对一些人来说，科技提供了一个轻松的下午娱乐，而对另一些人来说，它提供导航帮助、改善医疗保健或更精确的科学研究。

有趣的是，为一个目的开发的技术很少与用于另一个目的的技术完全无关。例如，运动相机的进步使得一个人可以记录她们在滑雪场上的滑雪过程，也可以使得人体摄像头来帮助防止警察侵犯人权。3D 打印的进步可以让一个人可以制作超级英雄的动作手办，也使得志愿者可以为体弱者制造氧气呼吸机成为可能。技术很重要，它影响着我们所有人。

开源的工作之一是确保每个人都能获得技术进步，无论种族、性别、国籍、身体能力、宗教信仰或财富如何。可悲的是，有些公司将技术视为一种工具来获取有关其客户（即你和我！）的数据，即使这些客户为该技术的研究和开发提供资金。不过，这不是开源的目标，开源项目保护其用户。

是的，家庭自动化是一种现代便利，它正在变得一天比一天好。但这是你的家。开源家庭自动化可以让生活变得更轻松，更像是所有科幻书籍和电影中承诺的未来。但它也可以改善那些身体能力与电器制造商计划不同的人的生活。一个简单的 Python 脚本对一个用户来说可能只是带来了一些便利，而对其他人来说却可能会改变生活。

家庭自动化是一个令人兴奋和有趣的技术分支。 借助这本 **[电子书](https://opensource.com/downloads/home-automation-ebook)**，立即开始设计你的家庭自动化解决方案，然后与他人分享你的创新，让每个人都能受益。

这就是开源的真正意义所在：可以帮助世界上的所有人。

---

via: <https://opensource.com/article/21/6/home-automation-ebook>

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

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


Fedora Linux 中的 Python 3.10 测试版

Summary: Python 开发者已经发布了 Python 3.10.0 的三个测试版本。

# Fedora Linux 中的 Python 3.10 测试版

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

Python 开发者已经发布了 Python 3.10.0 的三个测试版本。现在，你可以在 Fedora Linux 中试用最新的版本尽早用 3.10 测试你的 Python 代码，为 10 月份的 3.10.0 最终版本做好准备。

### 在 Fedora Linux 上安装 Python 3.10

如果你运行 Fedora Linux，你可以用 `dnf` 从官方仓库安装 Python 3.10：

```
$ sudo dnf install python3.10

```

你可能需要启用 `updates-testing` 仓库来获得最新的预发布版本：

```
$ sudo dnf install --enablerepo=updates-testing python3.10

```

随着更多的测试版和候选版 [发布](https://www.python.org/dev/peps/pep-0619/)，Fedora 包将得到更新。不需要编译你自己的 Python 开发版本，只要安装它就可以获得最新。从第一个测试版开始，Python 开发者不会再增加新的功能了。你已经可以享受所有的新东西了。

### 用 Python 3.10 测试你的项目

运行 `python3.10` 命令来使用 Python 3.10，或者用 [内置的 venv 模块 tox](https://developer.fedoraproject.org/tech/languages/python/multiple-pythons.html) 或用 [pipenv](https://fedoramagazine.org/install-pipenv-fedora/) 和 [poetry](https://python-poetry.org/) 创建虚拟环境。下面是一个使用 `tox` 的例子：

```
$ git clone https://github.com/benjaminp/six.git
Cloning into 'six'...
$ cd six/
$ tox -e py310
py310 run-test: commands[0] | python -m pytest -rfsxX
================== test session starts ===================
platform linux -- Python 3.10.0b3, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
collected 200 items

test_six.py ...................................... [ 19%]
.................................................. [ 44%]
.................................................. [ 69%]
.................................................. [ 94%]
............                                       [100%]

================== 200 passed in 0.43s ===================
________________________ summary _________________________
  py310: commands succeeded
  congratulations :)

```

如果你在 Fedora Linux 上发现了 Python 3.10 的问题，请 [在 Fedora 的 bugzilla 上提交 bug 报告](https://bugzilla.redhat.com/buglist.cgi?component=python3.10&product=Fedora) 或在 [Python 的问题追踪](https://bugs.python.org/) 上提交。如果你不确定这是否是 Python 的问题，你可以 [通过电子邮件或 IRC 直接联系 Fedora 的 Python 维护者](https://fedoraproject.org/wiki/SIGs/Python#Communicate) 。

### Python 3.10 中的新内容

参见 [Python 3.10 的全部新闻列表](https://docs.python.org/3.10/whatsnew/3.10.html)。例如，你可以尝试一下 [结构模式匹配](https://www.python.org/dev/peps/pep-0634/)：

```
$ python3.10
Python 3.10.0b3 (default, Jun 17 2021, 00:00:00)
[GCC 10.3.1 20210422 (Red Hat 10.3.1-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> point = (3, 10)
>>> match point:
...     case (0, 0):
...         print("Origin")
...     case (0, y):
...         print(f"Y={y}")
...     case (x, 0):
...         print(f"X={x}")
...     case (x, y):
...         print(f"X={x}, Y={y}")
...     case _:
...         raise ValueError("Not a point")
...
X=3, Y=10
>>> x
3
>>> y
10

```

敬请期待 [Fedora Linux 35 中的 python3 —— Python 3.10](https://fedoraproject.org/wiki/Changes/Python3.10)！

---

via: <https://fedoramagazine.org/python-3-10-beta-in-fedora-linux/>

作者：[Miro Hrončok](https://fedoramagazine.org/author/churchyard/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #318 微软推出 AI “结对编程”

Summary: 更多：• edX 被以 8 亿美元卖给营利性在线课程供应商 • 日本“富岳”在四项超级计算机世界排名中实现“三连冠”

# 硬核观察 #318 微软推出 AI “结对编程”

### 微软推出 AI “结对编程”

微软周二[宣布](https://www.cnbc.com/2021/06/29/microsoft-github-copilot-ai-offers-coding-suggestions.html)了一个人工智能系统 GitHub Copilot，可以像结对编程一样，为软件开发人员推荐代码。微软在 OpenAI 的帮助下开发了它，利用了上传到 GitHub 以及其他网站的源代码。它依靠的是许多编程语言的大量代码和庞大的 Azure 云计算能力。

该工具查看当前文件中的现有代码和注释，以及光标的位置，并提供可以添加的一个或多个代码行。随着程序员接受或拒绝建议，该模型会随着时间的推移进行学习并变得更加复杂。GitHub 的数百名开发者在编码时整天都在使用 Copilot 功能，他们中的大多数人都接受了建议，而没有关闭该功能。

>
> 这样发展下去，早晚一天编程都不需要人参与了，程序员在积极挖自己职业发展的墙角啊。
>
>
>

### edX 被以 8 亿美元卖给营利性在线课程供应商

当麻省理工学院和哈佛大学在近十年前创办 edX 时，它被吹捧为营利性在线课程供应商的非营利性替代者。今天，这两所大学宣布，他们正以 8 亿美元的价格将 edX [出售](https://www.edsurge.com/news/2021-06-29-2u-buys-edx-for-800m-in-surprise-end-to-nonprofit-mooc-provider-started-by-mit-and-harvard)给一个营利性供应商 2U。edX 称，全球疫情是导致出售的一个因素。edX 仍然拥有 3500 万用户和 3000 多门课程。

2U 是一家所谓的在线项目管理公司，帮助传统学院启动和运行在线学位课程，它说将把 edX 作为一个独立的子公司来运营，其结构将是一个公共福利公司。这意味着它将是营利性的。

>
> 别人都是因为疫情而发展起来，偏偏 edX 却被出售。
>
>
>

### 日本“富岳”在四项超级计算机世界排名中实现“三连冠”

日本的“富岳”（富士山的别称）在超级计算机 TOP500、HPCG、HPL-AI、Graph500 等榜单中连续三期排名世界第一。这些榜单都是用来判断超级计算机性能的评价指标，每年 6 月与 11 月更新两次，每一个代表性能的一个方面，比如数据处理性能、系统软件性能、浮点性能，或者科学工程计算的性能等。

在最新发布的 TOP500 榜单中，富岳每秒可以计算 44.201 TFlop，是排名第二的美国橡树岭国家实验室超算“Summit”（14.86 TFlop）的约 3 倍。我国的“神威·太湖之光”超级计算机位列第四，每秒可以计算 9.30146 TFlop。TOP500 榜单中，中国超级计算机共 192 台（上一次 221 台），美国为 122 台（上一次 113 台）。

>
> 超算榜单并不是目标，真正将超算落实到实际应用中才是最重要的。
>
>
>


如何在 Linux 上设置雷蛇设备的灯光效果和其他配置

Summary: 你可以在 Linux 上轻松设置你的雷蛇外设。

你可以在 Linux 上轻松设置你的雷蛇外设。

# 如何在 Linux 上设置雷蛇设备的灯光效果和其他配置

你有了一个闪亮的新雷蛇硬件，但你找不到 Linux 的 Razer Synapse 软件。而你最终没有正确 RGB 同步，也没有办法定制它。你会怎么做呢？

好吧，对于某些功能，比如给你的鼠标添加宏，你仍然需要（在 Windows 或 MacOS 上）访问 Razer Synapse。

但是，要调整其他一些选项，如键盘的宏，改变鼠标的 DPI，或灯光效果，你可以在 Linux 上轻松设置你的雷蛇外设。

这里有一些鼠标和鼠标垫的照片。这是同样的设置，但有不同的照明方案。点击图片可以看到更大的图片。

雷蛇 Basilisk 是一款不错的游戏鼠标。如果你想，你可以从亚马逊订购或从当地商店获得。

如果你已经拥有一个雷蛇设备，让我展示一下配置它的步骤，就像我在这里做的那样。

### 步骤 1：安装 OpenRazer

**OpenRazer** 是一个开源的驱动程序，使雷蛇硬件在 Linux 上工作。它支持几种功能来定制和控制你的设备，包括 RGB 鼠标垫。

虽然这不是官方 Linux 驱动，但它在各种设备上工作良好。

它为各种 Linux 发行版提供支持，包括 Solus、openSUSE、Fedora、Debian、Arch Linux、Ubuntu 和其他一些发行版。

在这里，我将重点介绍在任何基于 Ubuntu 的发行版上安装它的步骤，对于其他发行版，你可能想参考 [官方说明](https://openrazer.github.io/#download)。

你需要在 Ubuntu 上 [使用 PPA](https://itsfoss.com/ppa-guide/) 安装 OpenRazer，下面是如何做的：

```
sudo apt install software-properties-gtk
sudo add-apt-repository ppa:openrazer/stable
sudo apt update
sudo apt install openrazer-meta

```

它也提供了一个 [守护进程](https://itsfoss.com/linux-daemons/)，你可以选择让它工作，你要把你的用户加入到 `plugdev` 组，它给了设备的特权访问：

```
sudo gpasswd -a $USER plugdev

```

我不需要用上述命令中配置/添加一个守护程序，但我仍然可以很好地使用这些设备。守护进程主要是确保驱动保持活跃。

* [下载 OpenRazer](https://openrazer.github.io/)

### 步骤 2：安装一个 GUI 来管理和调整选项

现在驱动已经安装完毕，你所需要的是一个图形用户界面 （GUI） 来帮助你定制你的雷蛇硬件。

你可以找到一些可用的选择，但我将推荐安装 [Polychromatic](https://polychromatic.app)，它提供了一个有吸引力的用户界面，而且运行良好。

Polychromatic 是我能推荐的最接近 Razer Synapse 的应用，而且效果不错。

对于基于 Ubuntu 的发行版，你需要做的就是使用 PPA 安装它：

```
sudo add-apt-repository ppa:polychromatic/stable
sudo apt update
sudo apt install polychromatic

```

对于 Arch Linux 用户，你可以在 [AUR](https://itsfoss.com/aur-arch-linux/) 中找到它。关于更多的安装说明，你可以参考[官方下载页面](https://polychromatic.app/download/)。

* [下载 Polychromatic](https://polychromatic.app/)

你会得到不同设备的不同选项。在这里，我试着改变 DPI，自定义颜色周期，以及我的雷蛇 Basilisk v2 鼠标的轮询率，它完全正常。

如果你知道你想做什么，它还为你提供了轻松重启或停止 [守护进程](https://itsfoss.com/linux-daemons/)、改变小程序图标和执行高级配置选项的能力。

另外，你可以试试 [RazerGenie](https://github.com/z3ntu/RazerGenie)、[Snake](https://github.com/bithatch/snake) 或 [OpenRGB](https://itsfoss.com/openrgb/) （用于改变颜色）来调整鼠标的颜色或任何其他设置。

### 总结

现在你可以轻松地定制你的雷蛇硬件了，希望你能玩得开心！

虽然你可能会找到一些其他的选择来配置你的雷蛇设备，但我没有找到任何其他效果这么好的选择。

如果你遇到了一些有用的东西，值得在这里为所有的雷蛇用户提一下，请在下面的评论中告诉我。

---

via: <https://itsfoss.com/set-up-razer-devices-linux/>

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

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


使用开源工具创建私有的虚拟专用网络

OpenWrt使用的软件组件什么时候能独立打包到Debian Gnu/Linux中，成为Debian大家庭得一员，方便使用玩耍！！！

# 使用开源工具创建私有的虚拟专用网络

>
> 使用 OpenWRT 和 Wireguard 在路由器上创建自己的虚拟专用网络。
>
>
>

通过计算机网络从一个地方到另一个地方可能是一件棘手的事情。除了知道正确的地址和打开正确的端口之外，还有安全问题。 对于 Linux，SSH 是一种流行的默认方式，虽然你可以使用 SSH 做很多事情，但它仍然“只是”一个安全外壳（实际上，这就是 SSH 的含义）。用于加密流量的更广泛的协议是“虚拟专用网络”，它创建了一个独特的两点之间的虚拟的专用网络。有了它，你可以登录到另一个网络上的计算机并使用它的所有服务（文件共享、打印机等等），就像你坐在同一个房间里一样，并且全部的数据都是从点到点加密的。

通常，为了使虚拟专用网络连接成为可能，进入每个网络的网关必须接受虚拟专用网络流量，并且必须侦听目标网络上的某些计算机的虚拟专用网络流量。然而，你可以运行自己的带有虚拟专用网络服务器的路由器固件，使你能够连接到目标网络，而无需担心转发端口或考虑内部拓扑。我最喜欢的固件是 OpenWrt，在本文中我将演示如何设置它，以及如何启用虚拟专用网络。

### 什么是 OpenWrt？

[OpenWrt](https://openwrt.org/) 是一个使用 Linux 面向嵌入式设备的开源项目。它已经存在超过 15 年，拥有庞大而活跃的社区。

使用 OpenWrt 的方法有很多种，但它的主要用途是在路由器中。它提供了一个具有包管理功能的完全可写的文件系统，并且由于它是开源的，你可以查看和修改代码并为生态系统做出贡献。如果你想对路由器进行更多控制，这就是你想要使用的系统。

OpenWrt 支持很多路由器，包括 [思科](https://www.cisco.com/c/en/us/products/routers/index.html)、[华硕](https://www.asus.com/Networking-IoT-Servers/WiFi-Routers/All-series/)、[MikroTik](https://mikrotik.com/)、[Teltonika Networks](https://teltonika-networks.com/)、[D-Link](https://www.dlink.com/en/consumer)、[TP-link](https://www.tp-link.com/us/)、[Buffalo](https://www.buffalotech.com/products/category/wireless-networking)、[Ubiquiti](https://www.ui.com/) 等知名品牌和 [许多其他品牌](https://openwrt.org/toh/views/toh_fwdownload)。

### Wireguard 是什么？

[Wireguard](https://www.wireguard.com/) 是开源的虚拟专用网络软件，它比 OpenVPN 等其他选项更快、更简单且更安全。它使用最先进的密码学：用于对称加密的 ChaCha20；用于密钥协商的 Curve 25519（使用椭圆曲线），和用于散列的 BLAKE2。这些算法的设计方式在嵌入式系统上是高效的。Wireguard 也可用于各种操作系统 [平台](https://www.wireguard.com/install/)。

### 先决条件

对于这个项目，你需要：

* [Teltonika RUT955](https://teltonika-networks.com/product/rut955/) 或支持 OpenWrt 的其他路由器
* 一个公网 IP 地址，用于从外部网络连接到虚拟专用网络
* 一部安卓手机

### 安装 OpenWrt

首先，下载路由器的 OpenWrt 镜像。使用 [固件选择器](https://firmware-selector.openwrt.org/) 检查 OpenWrt 是否支持你的路由器并下载固件。输入你的路由器型号，将显示选项：

使用搜索框右侧的下拉输入选择要下载的固件版本。

下载出厂镜像。

许多路由器允许你从 Web 界面刷入未经授权的固件，但 Teltonika Networks 不允许。要将 OpenWrt 固件刷入这样的路由器，你需要使用引导加载器。为此，请按照下列步骤操作：

1. 拔掉路由器的电源线。
2. 按住重置按钮。
3. 插入路由器的电源线。
4. 插入电源线后，继续按住重置按钮 5 到 8 秒。
5. 将计算机的 IP 地址设置为 `192.168.1.15`，将网络掩码设置为 `255.255.255.0`。
6. 使用以太网电缆通过 LAN 端口连接路由器和计算机。
7. 打开网页浏览器并输入 `192.168.1.1:/index.html`。
8. 上传并刷写固件。

刷机过程可能占用三分钟。之后，你应该可以通过在浏览器中输入 `192.168.1.1` 来访问路由器的 Web 界面。 默认情况下没有设置密码

### 配置网络连接

网络连接是必要条件。如果你的 Internet 服务提供商（ISP） 使用 DHCP 自动分配你的 IP 地址，你只需将以太网电缆插入路由器的 WAN 端口。

如果你需要手动分配 IP 地址，导航至 “Network → Interfaces”。选择 “Edit” 编辑你的 WAN 接口。从 “Protocol” 字段中，选择 “Static address”，然后选择 “Switch protocol”。

在 “IPv4 address” 字段中，输入你的路由器地址。设置 “IPv4 netmask” 以匹配你的网络子网；输入你将用于连接到网络的 “IPv4 gateway” 地址； 并在 “Use custom DNS servers” 字段中输入 DNS 服务器的地址。保存配置。

就是这样！你已成功配置 WAN 接口以获得网络连接。

### 安装必要的包

默认情况下，该固件不包含很多包，但 OpenWrt 有一个包管理器和可选安装的软件包。导航到 “System → Software” 并通过选择 “Update list...” 更新你的包管理器。

在“Filter”输入中，键入 “Wireguard”，等待系统找到所有包含该关键字的包。找到并安装名为 “luci-app-wireguard” 的包。

该软件包包括一个用于配置 Wireguard 的 Web 界面，并安装 Wireguard 所必需的所有依赖项。

如果你在安装 Wireguard 软件包之前收到一个软件包丢失的警告并且在存储库中找不到，请忽略它并继续。

接下来，找到并安装名为 “luci-app-ttyd” 的包。这将用于稍后访问终端。

安装这些软件包后，重新启动路由器以使更改生效。

### 配置 Wireguard 接口

接下来，创建 Wireguard 接口。导航到 “Network → Interfaces” 并选择左下角的 “Add new interface...”。在弹出窗口中，输入你想要的接口名称，从下拉列表中选择 “WireguardVPN”，然后选择右下角的 “Create interface”。

在新弹出的窗口中，选择 “Generate Key” 为 Wireguard 接口生成私钥。在 “Listen Port” 字段中，输入所需的端口。我将使用默认的 Wireguard 端口，“51820”。在 “IP Addresses” 字段中，分配将用于 Wireguard 接口的 IP 地址。在这个例子中，我使用了 `10.0.0.1/24`。数字 “24” 表明我的子网的大小。

保存配置并重启接口。

导航到 “Services → Terminal”，登录到 shell，然后输入命令 `wg show`。你将看到有关 Wiregaurd 接口的一些信息，包括其公钥。复制公钥——稍后你将需要它来创建对等点。

### 配置防火墙

导航到 “Network → Firewall” 并选择 “Traffic Rules” 选项卡。在页面底部，选择 “Add”。在弹出窗口的 “Name” 字段中，为你的规则命名，例如 “Allow-wg”。接下来，将 “Destination zone” 从 “Lan” 更改为 “Device”，并将 “Destination port” 设置为 “51820”。

保存配置。

### 手机上配置 Wireguard

从 Google Play 在你的手机上安装 [Wireguard 应用程序](https://play.google.com/store/apps/details?id=com.wireguard.android&hl=lt&gl=US)。安装后，打开应用程序并从头开始创建一个新接口。在 “Name” 字段中，输入要用于接口的名称。在 “Private key” 字段中，按右侧的双向箭头图标生成密钥对。你将需要上面的公钥来在你的手机和路由器之间创建一个对等点。在 “Addresses” 字段中，分配你将用于通过虚拟专用网络访问电话的 IP 地址。我将使用 `10.0.0.2/24`。在 “Listen port” 中，输入端口；我将再次使用默认端口。

保存配置。

要向配置中添加对等点，请选择 “Add peer”。在 “Public key” 字段中，输入路由器的 Wireguard 公钥。在 “Endpoint” 字段中，输入路由器的公共 IP 地址和端口，以冒号分隔，例如 `12.34.56.78:51820`。在 “Allowed IP” 字段中，输入要通过 Wireguard 接口访问的 IP 地址。 （你可以输入路由器的虚拟专用网络接口 IP 地址和 LAN 接口地址。）IP 地址必须用逗号分隔。你还可以定义子网的大小。

保存配置。

配置中还剩下最后一步：在路由器上添加一个对等点。

### 在路由器上添加一个对等点

导航到 “Network → Interfaces” 并选择你的 Wireguard 接口。转到 “Peers” 选项卡并选择 “Add peer”。在 “Description” 字段中，输入对等方的名称。在 “Public Key” 字段中输入手机的 Wireguard 接口公钥，在 “Allowed IPs” 字段中输入手机的 Wireguard 接口 IP 地址。选中 “Route Allowed IPs” 复选框。

保存配置并重启接口。

### 测试配置

在手机上打开 Web 浏览器。在 URL 栏中，输入 IP 地址 `10.0.0.1` 或 `192.168.1.1`。你应该能够访问路由器的网站。

### 你自己的虚拟专用网络

这些天有很多虚拟专用网络服务商在做广告，但是拥有和控制自己的基础设施还有很多话要说，尤其是当该基础设施仅用于提高安全性时。无需依赖其他人为你提供安全的数据连接。使用 OpenWrt 和 Wireguard，你可以拥有自己的开源虚拟专用网络解决方案。

---

via: <https://opensource.com/article/21/5/open-source-private-vpn>

作者：[Lukas Janėnas](https://opensource.com/users/lukasjan) 选题：[lujun9972](https://github.com/lujun9972) 译者：[stevenzdg988](https://github.com/stevenzdg988) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #319 美国议员呼吁给加密货币留“后门”

Summary: 更多：• WWW 源代码的 NFT 拍卖以 540 万美元成交 • IBM 为期 18 个月的全公司电子邮件系统迁移已经崩溃

Gnu/Linux 5.13内核作为另一项内核安全改进，将每个系统调用的内核堆栈偏移量随机化。浏览器可不可以实现类似的用户数据处理随机化功能。很多美国科学家也很反感美国政府得无底线监控，所以他们也在用自己得知识和能力为保护更多人的隐私贡献自己的技术

# 硬核观察 #319 美国议员呼吁给加密货币留“后门”

### 美国议员呼吁给加密货币留“后门”

美国国会区块链核心小组联合主席周二表示，应该允许一个受信任的第三方，例如法院，拥有访问加密货币“后门”的权限。他说，新的立法和规则可能会建立一种伪匿名模式，只有司法权力才能访问某些信息，建议允许法院获得访问一个“受到非常严密保护的钥匙”的途径，“本质上是一个加密后门”，从而使其可以逆转区块链上的交易。

>
> 我想说的是，其实他想要的一个联盟链而不是公链。
>
>
>

### WWW 源代码的 NFT 拍卖以 540 万美元成交

在苏富比的一场在线拍卖中，WWW 的原始代码以 NFT 形式拍卖，最终拍卖价 [540 万美元](https://www.bbc.com/news/technology-57666335)。拍卖的 NFT 取名叫“This Changed Everything”，起拍价 1000 美元。该 NFT 来自英国计算机科学家、WWW 发明人蒂姆·伯纳斯-李。拍卖品包括原始时间戳文件，里面有蒂姆·伯纳斯-李编写的代码，还有代码可视化动画和一封信等。所有这些都有蒂姆·伯纳斯-李的数字签名。

>
> 能拍卖出如此高价，说明这个世界还是认可 WWW 之父的贡献的。
>
>
>

### IBM 为期 18 个月的全公司电子邮件系统迁移已经崩溃

这导致许多员工[无法使用](https://www.theregister.com/2021/06/30/ibm_email_outage/)电子邮件或安排日历事件，这种情况已经持续了好几天。电子邮件服务一直是断断续续的，而且不是每个人都受到同样的影响。据说 Slack 可以工作，但 Outlook、 Web 邮件和 Notes 一直不可靠。这个迁移计划源于 IBM 在 2018 年决定将包括 Notes 在内的各种软件产品出售给印度的HCL。出售之后，IBM 不希望其数据放在 HCL 的服务器上。

>
> 看来 Notes 上车后想下车没那么容易啊。
>
>
>


CI/CD 管道是什么？

Summary: 你如何定义持续集成/持续部署管道取决于你组织的要求。

你如何定义持续集成/持续部署管道取决于你组织的要求。

# CI/CD 管道是什么？

>
> 你如何定义持续集成/持续部署管道取决于你组织的要求。
>
>
>

<ruby> 持续集成 <rt>  continuous integration </rt></ruby>/<ruby> 持续部署 <rt>  continuous deployment </rt></ruby>（CI/CD）管道是每个 DevOps 计划的基础。 CI/CD 管道打破了传统的开发孤岛，使开发和运营团队能够在整个软件开发生命周期中进行协作。

更好的是，转向 DevOps 和 CI/CD 管道可以帮助你的组织以更高的速度更安全地 [交付软件](https://techbeacon.com/devops/5-reasons-why-cicd-vital-your-organizations-value-stream)。

### 拆解 CI/CD 管道

CI/CD 管道有很多定义，所以我总是建议组织定义自己的 CI/CD 管道版本和其他 DevOps 概念，而不是使用其他人的。开源 CI/CD 工具为你提供构建满足组织要求的 CI/CD 管道的自由和选择。

形成 CI/CD 管道的阶段是将不同的任务子集分组为 *管道阶段*。典型的管道阶段包括：

* **构建**：开发人员编译应用程序代码。
* **测试**：质量保证（QA）团队使用自动化测试工具和策略测试应用程序代码。
* **发布**：开发团队将应用程序代码交付到代码库。
* **部署**：DevOps 团队将应用程序代码分阶段投入生产。
* **安全性和合规性**：QA 团队根据项目要求验证构建。这是组织部署容器扫描工具的阶段，这些工具根据<ruby> 常见漏洞和暴露 <rt>  Common Vulnerabilities and Exposures </rt></ruby>（CVE）检查容器镜像的质量。

这些是 CI/CD 管道的标准阶段，但一些组织调整 CI/CD 管道模型以满足他们的要求。例如，为医疗保健市场构建应用程序的组织，具有严格的合规性标准，可以在整个工具链中分发测试、验证和合规性门槛。

其他示例可能是依赖于具有开源软件（OSS）的复杂软件供应链的组织。商业组件可能会设立一个门槛，开发团队成员可以在其中为 OSS 包生成 <ruby>   软件物料清单  <rt>  software bill of materials </rt></ruby>（SBOM），或者外部商业软件供应商必须将 SBOM 作为其合同可交付成果的一部分进行交付。

### CI/CD 管道的障碍

实施 CI/CD 管道会改变团队的流程和文化。尽管许多开发人员愿意接受某些任务和测试的自动化，但人员可能成为采用 CI/CD 的障碍。

从瀑布式流程转向 CI/CD 可能会动摇某些组织中基本的和隐含的权力结构。由于 CI/CD 管道提高了软件交付速度，旧手动流程的“守门人”可能会受到这种变化的威胁。

### 整合机会

随着你在文化、流程和工具中达到更高的 DevOps 成熟度水平，包含 CI/CD 工具链的工具的开源根源为一些激动人心的集成创造了机会。

分析公司 Forrester 在 2020 年预测，<ruby> 即时学习 <rt>  just-in-time learning </rt></ruby>将加入 CI/CD 管道。如果你考虑一下，会发现这是有道理的。在当前远程工作的时代，甚至对于新员工的远程入职，这更有意义。例如，组织可以将文档 wiki 与内部流程文档集成到其管道中。

更雄心勃勃的组织可以将学习管理系统（LMS）（例如 [Moodle](https://moodle.org/)）集成到其 CI/CD 管道中。它可以使用 LMS 发布有关新 DevOps 工具链功能的简短视频，开发人员在加入时或在整个管道中更新工具时需要学习这些功能。

一些组织正在将群聊和其他协作工具直接集成到他们的 CI/CD 管道中。聊天平台提供警报并支持团队之间的协作和沟通。将 Mattermost、Rocket.Chat 或其他 [企业聊天](https://opensource.com/alternatives/slack) 平台集成到你的 CI/CD 管道中需要预先规划和分析，以确保管道用户不会被警报淹没。

另一个需要探索的集成机会是将分析和高级报告构建到你的 CI/CD 管道中。这有助于你利用通过管道传输的数据。

### 总结

CI/CD 管道是 DevOps 的基础。开源使其能够适应并灵活地满足你在 DevOps 之旅中实施的运营变更所产生的新需求。

我希望看到对统一 DevOps 平台趋势的开源响应，在这种趋势中，组织寻求端到端的 CI/CD 解决方案。这种解决方案的要素就在那里。毕竟，GitLab 和 GitHub 将他们的平台追溯到开源根源。

最后，不要忘记每一个成功的 CI/CD 工具链背后的教育和外展。记录你的工具链和相关流程将改善开发人员入职和持续的 DevOps 团队培训。

你和你的组织如何定义你的 CI/CD 工具链？请在评论中分享你的反馈。

---

via: <https://opensource.com/article/21/6/what-cicd-pipeline>

作者：[Will Kelly](https://opensource.com/users/willkelly) 选题：[lujun9972](https://github.com/lujun9972) 译者：[baddate](https://github.com/baddate) 校对：[wxy](https://github.com/wxy)

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


使用 Python 来解决慈善机构的业务问题

# 使用 Python 来解决慈善机构的业务问题

>
> 比较不同的编程语言如何解决同一个问题是一个很有趣的事情，也很有指导意义。接下来，我们就来讲一讲如何用 Python 来解决。
>
>
>

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

在我这一系列的 [第一篇文章](https://opensource.com/article/20/8/solving-problem-groovy) 里，我描述了这样子的一个问题，如何将一大批的救助物资分为具有相同价值的物品，并将其分发给社区中的困难住户。我也曾写过用不同的编程语言写一些小程序来解决这样子的小问题以及比较这些程序时如何工作的。

在第一篇文章中，我是使用了 [Groovy](https://groovy-lang.org/) 语言来解决问题的。Groovy 在很多方面都与 [Python](https://www.python.org/) 很相似，但是在语法上她更像 C 语言和 Java。因此，使用 Python 来创造一个相同的解决方案应该会很有趣且更有意义。

### 使用 Python 的解决方案

使用 Java 时，我会声明一个工具类来保存元组数据（新的记录功能将会很好地用于这个需求）。使用 Groovy 时，我就是用了该语言的映射功能，我也将在 Python 使用相同的机制。

使用一个字典列表来保存从批发商处批发来的货物：

```
packs = [
        {'item':'Rice','brand':'Best Family','units':10,'price':5650,'quantity':1},
        {'item':'Spaghetti','brand':'Best Family','units':1,'price':327,'quantity':10},
        {'item':'Sardines','brand':'Fresh Caught','units':3,'price':2727,'quantity':3},
        {'item':'Chickpeas','brand':'Southern Style','units':2,'price':2600,'quantity':5},
        {'item':'Lentils','brand':'Southern Style','units':2,'price':2378,'quantity':5},
        {'item':'Vegetable oil','brand':'Crafco','units':12,'price':10020,'quantity':1},
        {'item':'UHT milk','brand':'Atlantic','units':6,'price':4560,'quantity':2},
        {'item':'Flour','brand':'Neighbor Mills','units':10,'price':5200,'quantity':1},
        {'item':'Tomato sauce','brand':'Best Family','units':1,'price':190,'quantity':10},
        {'item':'Sugar','brand':'Good Price','units':1,'price':565,'quantity':10},
        {'item':'Tea','brand':'Superior','units':5,'price':2720,'quantity':2},
        {'item':'Coffee','brand':'Colombia Select','units':2,'price':4180,'quantity':5},
        {'item':'Tofu','brand':'Gourmet Choice','units':1,'price':1580,'quantity':10},
        {'item':'Bleach','brand':'Blanchite','units':5,'price':3550,'quantity':2},
        {'item':'Soap','brand':'Sunny Day','units':6,'price':1794,'quantity':2}]

```

大米有一包，每包中有 10 袋大米，意大利面条有十包，每包中有一袋意大利面条。上述代码中，变量 `packs` 被设置为 Python 字典列表。这与 Groovy 的方法非常相似。关于 Groovy 和 Python 之间的区别，有几点需要注意：

1. 在 Python 中，无需关键字来定义变量 `packs`，Python 变量初始化时需要设置一个值。
2. Python 字典中的词键（例如，`item`、`brand`、`units`、`price`、 `quantity`）需要引号来表明它们是字符串；Groovy 假定这些是字符串，但也接受引号。
3. 在 Python 中，符号 `{ ... }` 表明一个字典声明； Groovy 使用与列表相同的方括号，但两种情况下的结构都必须具有键值对。

当然，表中的价格不是以美元计算的。

接下来，打开散装包。例如，打开大米的单个散装包装，将产出 10 单元大米； 也就是说，产出的单元总数是 `units * quantity`。 Groovy 脚本使用一个名为 `collectMany` 的方便的函数，该函数可用于展平列表列表。 据我所知，Python 没有类似的东西，所以使用两个列表推导式来产生相同的结果：

```
units = [[{'item':pack['item'],'brand':pack['brand'],
        'price':(pack['price'] / pack['units'])}] *
        (pack['units'] * pack['quantity']) for pack in packs]
units = [x for sublist in units for x in sublist]

```

第一个列表可理解为（分配给单元）构建字典列表列表。 第二个将其“扁平化”为字典列表。 请注意，Python 和 Groovy 都提供了一个 `*` 运算符，它接受左侧的列表和右侧的数字 `N`，并复制列表 `N` 次。

最后一步是将这些单元的大米之类的重新包装到篮子（`hamper`）中以进行分发。 就像在 Groovy 版本中一样，你需要更具体地了解理想的篮子数，当你只剩下几个单元时，你最好不要过度限制，即可以做一些随机分配：

```
valueIdeal = 5000
valueMax = valueIdeal * 1.1

```

很好！ 重新打包篮子。

```
import random
hamperNumber = 0              # 导入 Python 的随机数生成器工具并初始化篮子数
while len(units) > 0:      # 只要有更多可用的单元，这个 `while` 循环就会将单元重新分配到篮子中：
    hamperNumber += 1
    hamper = []
    value = 0
    canAdd = True              # 增加篮子编号，得到一个新的空篮子（单元的列表），并将其值设为 0； 开始假设你可以向篮子中添加更多物品。
    while canAdd:              # 这个 `while` 循环将尽可能多地向篮子添加单元（Groovy 代码使用了 `for` 循环，但 Python 的 `for` 循环期望迭代某些东西，而 Groovy 则是为更传统的 C 形式的 `for` 循环形式）：
        u = random.randint(0,len(units)-1)  # 获取一个介于 0 和剩余单元数减 1 之间的随机数。
        canAdd = False                      # 假设你找不到更多要添加的单元。
        o = 0                               # 创建一个变量，用于从你正在寻找要放入篮子中的物品的起点的偏移量。
        while o < len(units):               # 从随机选择的索引开始，这个 `while` 循环将尝试找到一个可以添加到篮子的单元（再次注意，Python `for` 循环可能不适合这里，因为列表的长度将在迭代中中发生变化）。
            uo = (u + o) % len(units)
            unit = units[uo]
            unitPrice = unit['price']          # 找出要查看的单元（随机起点+偏移量）并获得其价格。
            if len(units) < 3 or not (unit in hamper) and (value + unitPrice) < valueMax:
                                               # 如果只剩下几个，或者添加单元后篮子的价值不太高，你可以将此单元添加到篮子中。
                hamper.append(unit)
                value += unitPrice
                units.pop(u)                   # 将单元添加到篮子中，按单价增加 篮子数，从可用单元列表中删除该单元。
                canAdd = len(units) > 0
                break                          # 只要还有剩余单元，你就可以添加更多单元，因此可以跳出此循环继续寻找。
            o += 1                             # 增加偏移量。
                                            # 在退出这个 `while` 循环时，如果你检查了所有剩余的单元并且找不到单元可以添加到篮子中，那么篮子就完成了搜索； 否则，你找到了一个，可以继续寻找更多。
    print('')
    print('Hamper',hamperNumber,'value',value)
    for item in hamper:
        print('%-25s%-25s%7.2f' % (item['item'],item['brand'],item['price'])) # 打印出篮子的内容。
    print('Remaining units',len(units))                                       # 打印出剩余的单元信息。

```

一些澄清如上面的注释。

运行此代码时，输出看起来与 Groovy 程序的输出非常相似：

```
Hamper 1 value 5304.0
UHT milk                 Atlantic                  760.00
Tomato sauce             Best Family               190.00
Rice                     Best Family               565.00
Coffee                   Colombia Select          2090.00
Sugar                    Good Price                565.00
Vegetable oil            Crafco                    835.00
Soap                     Sunny Day                 299.00
Remaining units 148

Hamper 2 value 5428.0
Tea                      Superior                  544.00
Lentils                  Southern Style           1189.00
Flour                    Neighbor Mills            520.00
Tofu                     Gourmet Choice           1580.00
Vegetable oil            Crafco                    835.00
UHT milk                 Atlantic                  760.00
Remaining units 142

Hamper 3 value 5424.0
Soap                     Sunny Day                 299.00
Chickpeas                Southern Style           1300.00
Sardines                 Fresh Caught              909.00
Rice                     Best Family               565.00
Vegetable oil            Crafco                    835.00
Spaghetti                Best Family               327.00
Lentils                  Southern Style           1189.00
Remaining units 135

...

Hamper 21 value 5145.0
Tomato sauce             Best Family               190.00
Tea                      Superior                  544.00
Chickpeas                Southern Style           1300.00
Spaghetti                Best Family               327.00
UHT milk                 Atlantic                  760.00
Vegetable oil            Crafco                    835.00
Lentils                  Southern Style           1189.00
Remaining units 4

Hamper 22 value 2874.0
Sardines                 Fresh Caught              909.00
Vegetable oil            Crafco                    835.00
Rice                     Best Family               565.00
Rice                     Best Family               565.00
Remaining units 0

```

最后一个篮子在内容和价值上有所简化。

### 结论

乍一看，这个程序的 Python 和 Groovy 版本之间没有太大区别。 两者都有一组相似的结构，这使得处理列表和字典非常简单。 两者都不需要很多“样板代码”或其他“繁杂”操作。

此外，使用 Groovy 时，向篮子中添加单元还是一件比较繁琐的事情。 你需要在单元列表中随机选择一个位置，然后从该位置开始，遍历列表，直到找到一个价格允许的且包含它的单元，或者直到你用完列表为止。 当只剩下几件物品时，你需要将它们扔到最后一个篮子里。

另一个值得一提的问题是：这不是一种特别有效的方法。 从列表中删除元素、极其多的重复表达式还有一些其它的问题使得这不太适合解决这种大数据重新分配问题。 尽管如此，它仍然在我的老机器上运行。

如果你觉得我在这段代码中使用 `while` 循环并改变其中的数据感到不舒服，你可能希望我让它更有用一些。 我想不出一种方法不使用 Python 中的 map 和 reduce 函数，并结合随机选择的单元进行重新打包。 你可以吗？

在下一篇文章中，我将使用 Java 重新执行此操作，以了解 Groovy 和 Python 的工作量减少了多少，未来的文章将介绍 Julia 和 Go。

---

via: <https://opensource.com/article/20/9/solve-problem-python>

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

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


硬核观察 #320 谷歌和微软决定结束和平，重启诉讼大战

Summary: 更多：• 互联网在腐化 • 微软的蓝色死屏在 Windows 11中变成了黑色

更多：• 互联网在腐化 • 微软的蓝色死屏在 Windows 11中变成了黑色

# 硬核观察 #320 谷歌和微软决定结束和平，重启诉讼大战

### 谷歌和微软决定结束和平，重启诉讼大战

两大巨头在五年前签署了互不侵犯协议，搁置诉讼，并创建一个程序闭门解决分歧，在要求监管方介入前先通过这个程序磋商。但随着微软认为谷歌在广告技术上没有公平游戏之后，和平走到了[尽头](https://arstechnica.com/tech-policy/2021/06/google-and-microsoft-ditch-non-aggression-pact-rev-up-rivalry-again/)。双方的 CEO 进行了磋商，但是没有取得进展。

>
> 战争与和平，这是一个问题。
>
>
>

### 互联网在腐化

互联网的发明堪称奇迹，它就像一个不断增长的图书馆，但没有中心文件系统。不过这个没有中心文件系统的互联网面临的一大风险是里面的超链接会不断失效，这种现象被称为[链接腐化和内容漂移](https://www.theatlantic.com/technology/archive/2021/06/the-internet-is-a-collective-hallucination/619320/)。对美国最高法院司法意见书和《哈佛法律评论》的研究发现，自 1996 年以来，司法意见书里嵌入的超链接一半失效；《哈佛法律评论》中四分之三的链接失效。对《纽约时报》200 万外链的分析发现，四分之一的深链接失效，文章的年份越古老，超链失效的比例越高。

>
> 即便是有互联网档案馆这样的组织来保存一切，也依然会有一些信息逐渐遗失。不过，新陈代谢也是正常的。
>
>
>

### 微软的蓝色死屏在 Windows 11中变成了黑色

微软将在 Windows 11 中改用[黑色死屏](https://www.theverge.com/2021/7/1/22559852/microsoft-windows-11-black-blue-screen-of-death-bsod-change)，与新的黑色登录和关机屏幕相匹配。这是自 2012 年微软在 Windows 8 的屏幕上添加“愁眉苦脸”的表情符，以及 2016 年添加二维码以来，BSOD 的第一个重大变化。微软在 Windows 3.0 中首次引入了蓝色死屏（BSOD），它是 Windows 自己的内核错误或错误检查，它通常包括一个数据转储，可以帮助系统管理员分析是什么系统故障导致蓝屏。

>
> 改成黑色也挺好，至少 BSOD 这个缩写不用改了。
>
>
>


《Bash it out》书评：用这本谜题书学习 Bash

所以这本书有中文版吗？

# 《Bash it out》书评：用这本谜题书学习 Bash

>
> 《Bash it out》使用 16 个谜题，涵盖了基本、中级和高级 Bash 脚本。
>
>
>

计算机既是我的爱好，也是我的职业。我的公寓里散布着大约 10 台计算机，它们都运行 Linux（包括我的 Mac）。由于我喜欢升级我的电脑和提升我的电脑技能，当我遇到 Sylvain Leroux 的《[Bash it out](https://www.amazon.com/Bash-Out-Strengthen-challenges-difficulties/dp/1521773262/)》时，我抓住了购买它的机会。我在 Debian Linux 上经常使用命令行，这似乎是扩展我的 Bash 知识的好机会。当作者在前言中解释他使用 Debian Linux 时，我笑了，这是我最喜欢的两个发行版之一。

Bash 可让你自动执行任务，因此它是一种省力、有趣且有用的工具。在阅读本书之前，我已经有相当多的 Unix 和 Linux 上的 Bash 经验。我不是专家，部分原因是脚本语言非常广泛和强大。当我在基于 Arch 的 Linux 发行版 [EndeavourOS](https://endeavouros.com/) 的欢迎屏幕上看到 Bash 时，我第一次对 Bash 产生了兴趣。

以下屏幕截图显示了 EndeavourOS 的一些选项。你可能不相信，这些面板只指向 Bash 脚本，每个脚本都完成一些相对复杂的任务。而且因为它都是开源的，所以我可以根据需要修改这些脚本中的任何一个。

### 总有东西要学

我对这本书的印象非常好。虽然不长，但经过了深思熟虑。作者对 Bash 有非常广泛的了解，并且具有解释如何使用它的不可思议的能力。这本书使用 16 个谜题涵盖了基本、中级和高级 Bash 脚本，他称之为“挑战”。这教会了我将 Bash 脚本视为需要解决的编程难题，这让我玩起来更有趣。

Bash 的一个令人兴奋的方面是它与 Linux 系统深度集成。虽然它的部分能力在于它的语法，但它也很强大，因为它可以访问很多系统资源。你可以编写重复性任务或简单但厌倦了手动执行的任务的脚本。不管是大事还是小事，《Bash it out》可以帮助你了解可以做什么以及如何实现它。

如果我不提及 David Both 的发布在 [Opensource.com](http://Opensource.com) 的免费资源《[A sysadmin's guide to Bash scripting\_](https://opensource.com/downloads/bash-scripting-ebook)》，这篇书评就不会完整。这个 17 页的 PDF 指南与《Bash it out》不同，但它们共同构成了任何想要了解它的人的成功组合。

我不是计算机程序员，但《Bash it out》增加了我进入更高级 Bash 脚本水平的欲望——虽然没有这个打算，但我可能最终无意中成为一名计算机程序员。

我喜欢 Linux 的原因之一是因为它的操作系统功能强大且用途广泛。无论我对 Linux 了解多少，总有一些新东西需要学习，这让我更加欣赏 Linux。

在竞争激烈且不断变化的就业市场中，我们所有人都应该不断更新我们的技能。这本书帮助我以非常实际的方式学习了 Bash。几乎感觉作者和我在同一个房间里，耐心地指导我学习。

作者 Leroux 具有不可思议的能力去吸引读者。这是一份难得的天赋，我认为比他的技术专长更有价值。事实上，我写这篇书评是为了感谢作者预见了我自己的学习需求；虽然我们从未见过面，但我从他的天赋中受益匪浅。

---

via: <https://opensource.com/article/20/4/bash-it-out-book>

作者：[Carlos Aguayo](https://opensource.com/users/hwmaster1) 选题：[lujun9972](https://github.com/lujun9972) 译者：[baddates](https://github.com/baddates) 校对：[wxy](https://github.com/wxy)

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


在 WSL 上忘记了 Linux 密码？下面是如何轻松重设的方法

Summary: 如果你有一段时间没有使用它，你可能会忘记 WSL 的账户密码。

好文章,救命了!

如果你有一段时间没有使用它，你可能会忘记 WSL 的账户密码。

# 在 WSL 上忘记了 Linux 密码？下面是如何轻松重设的方法

对于那些想从舒适的 Windows 中享受 Linux 命令行的人来说，WSL（Windows Subsystem for Linux） 是一个方便的工具。

当你 [在 Windows 上使用 WSL 安装 Linux](https://itsfoss.com/install-bash-on-windows/) 时，会要求你创建一个用户名和密码。当你在 WSL 上启动 Linux 时，这个用户会自动登录。

现在的问题是，如果你有一段时间没有使用它，你可能会忘记 WSL 的账户密码。而如果你要使用 `sudo` 的命令，这将成为一个问题，因为这里你需要输入密码。

不要担心。你可以很容易地重置它。

### 在 Ubuntu 或任何其他 Linux 发行版上重置遗忘的 WSL 密码

要在 WSL 中重设 Linux 密码，你需要：

* 将默认用户切换为 `root`
* 重置普通用户的密码
* 将默认用户切换回普通用户

让我向你展示详细的步骤和截图。

#### 步骤 1：将默认用户切换为 root

记下你的普通/常规用户名将是明智之举。如你所见，我的普通帐户的用户名是 `abhishek`。

WSL 中的 `root` 用户是无锁的，没有设置密码。这意味着你可以切换到 `root` 用户，然后利用 `root` 的能力来重置密码。

由于你不记得帐户密码，切换到 `root` 用户是通过改变你的 Linux WSL 应用的配置，使其默认使用 `root` 用户来完成。

这是通过 Windows 命令提示符完成的，你需要知道你的 Linux 发行版需要运行哪个命令。

这个信息通常在 [Windows 商店](https://www.microsoft.com/en-us/store/apps/windows) 中的发行版应用的描述中提供。这是你首次下载发行版的地方。

从 Windows 菜单中，启动命令提示符：

在这里，以这种方式使用你的发行版的命令。如果你使用的是 Windows 商店中的 Ubuntu 应用，那么该命令将是：

```
ubuntu config --default-user root

```

截图中，我正在使用 Windows 商店中的 Ubuntu 20.04 应用。所以，我使用了 ubuntu2004 命令。

为了减少你的麻烦，我在这个表格中列出了一些发行版和它们各自的命令：

| 发行版应用 | Windows 命令 |
| --- | --- |
| Ubuntu | `ubuntu config –default-user root` |
| Ubuntu 20.04 | `ubuntu2004 config –default-user root` |
| Ubuntu 18.04 | `ubuntu1804 config –default-user root` |
| Debian | `debian config –default-user root` |
| Kali Linux | `kali config –default-user root` |

#### 步骤 2：重设帐户密码

现在，如果你启动 Linux 发行程序，你应该以 `root` 身份登录。你可以重新设置普通用户帐户的密码。

你还记得 WSL 中的用户名吗？（LCTT 译注：请使用你的“用户名”替换下列命令中的 `username`）如果没有，你可以随时检查 `/home` 目录的内容。当你有了用户名后，使用这个命令：

```
passwd username

```

它将要求你输入一个新的密码。\*\*当你输入时，屏幕上将不会显示任何内容。这很正常。只要输入新的密码，然后点击回车就可以了。\*\*你必须重新输入新的密码来确认，当你输入密码时，屏幕上也不会显示任何东西。

恭喜你。用户账户的密码已经被重置。但你还没有完成。默认用户仍然是 `root`。你应该把它改回你的普通用户帐户，否则它将一直以 `root` 用户的身份登录。

#### 步骤 3：再次将普通用户设置为默认用户

你需要你在上一步中用 [passwd 命令](https://linuxhandbook.com/passwd-command/) 使用的普通帐户用户名。

再次启动 Windows 命令提示符。**使用你的发行版命令**，方式与第 1 步中类似。然而，这一次，用普通用户代替 `root`。

```
ubuntu config --default-user username

```

现在，当你在 WSL 中启动你的 Linux 发行版时，你将以普通用户的身份登录。你已经重新设置了密码，可以用它来运行 `sudo` 命令。

如果你将来再次忘记了密码，你知道重置密码的步骤。

### 如果重设 WSL 密码如此简单，这难道不是一种安全风险吗？

并非如此。你需要有对计算机的物理访问权以及对 Windows 帐户的访问权。如果有人已经有这么多的访问权，他/她可以做很多事情，而不仅仅是改变 WSL 中的 Linux 密码。

### 你是否能够重新设置 WSL 密码？

我给了你命令并解释了步骤。我希望这对你有帮助，并能够在 WSL 中重置你的 Linux 发行版的密码。

如果你仍然遇到问题，或者你对这个话题有疑问，请随时在评论区提问。

---

via: <https://itsfoss.com/reset-linux-password-wsl/>

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

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


硬核观察 #321 谷歌要用新的安卓软件包格式取代 APK

Summary: 更多：• 暂缓废除第三方 cookie 后，谷歌提出第二种替代方案 • 多个托管服务提供商遭遇 REvil 供应链攻击

# 硬核观察 #321 谷歌要用新的安卓软件包格式取代 APK

### 谷歌要用新的安卓软件包格式取代 APK

自 2008 年安卓发布以来，其软件包一直是 APK 格式。但谷歌想要更好的控制安卓应用的发布，[宣布](https://android-developers.googleblog.com/2021/06/the-future-of-android-app-bundles-is.html)从 8 月开始上传到 Play 商店的应用必须使用安卓应用打包格式 AAB。谷歌是在 2018 年推出 AAB 的，其背后动机是安卓支持的语言、CPU 架构和屏幕分辨率越来越多，单一的版本太占空间，因此通过提供多个 APK 文件集合，由 Play 商店根据相应的设备提供相应的特定 APK。但从 APK 切换到 AAB，谷歌对安卓生态系统有了[更大的控制](https://arstechnica.com/gadgets/2021/07/google-play-dumps-apks-for-the-more-google-controlled-android-app-bundle/)，因为 AAB 需要 Play 商店的云计算进行处理，增加了第三方应用商店的工作和困难。

>
> 假借技术之名的垄断之举，是谷歌对安卓的开放生态的收割。
>
>
>

### 暂缓废除第三方 cookie 后，谷歌提出第二种替代方案

在谷歌提出的 FLoC 方案遭到业界的联合反对之后，上周，谷歌提出暂缓废除第三方 cookie，允许它们存活到 2023 年底。现在，谷歌提案了一种新的“分区 cookies” 方案 [CHIPS](https://github.com/WICG/CHIPS)。该提案要求第三方服务器可以设置 Cookie，但只能在最初设置 Cookie 的第一方网站范围内读取，而不能在其它也设置该 Cookie 的网站中读取。

>
> 这个方案似乎不错，而且 FireFox 和 Safari 也实现了类似的方案。
>
>
>

### 多个托管服务提供商遭遇 REvil 供应链攻击

[REvil 勒索软件团伙](https://www.bleepingcomputer.com/news/security/revil-ransomware-hits-200-companies-in-msp-supply-chain-attack/)又盯上了拥有数千名客户的多个大型托管服务提供商，大约有 200 家企业被加密。所有受影响的托管服务提供商都在使用 Kaseya VSA，且有证据表明他们的客户也受到了影响。Kaseya VSA 是一个基于云的 MSP 平台，允许提供商为客户执行补丁管理和客户端监控任务。Kaseya 在网站上发布了安全公告，警告所有 VSA 客户立即关闭他们的服务器，以防止事态的进一步蔓延。

>
> 利用供应链攻击进行的勒索攻击其影响广泛，目前看起来还没有特别好的方法。
>
>
>


“MAGFest 先生”专访：用 Python 和 Linux 进行音乐创作

Summary: 与 “MAGFest 先生” Brendan Becker 的对话。

# “MAGFest 先生”专访：用 Python 和 Linux 进行音乐创作

>
> 与 “MAGFest 先生” Brendan Becker 的对话。
>
>
>

1999 年，我在一家计算机商店工作时遇到了 Brendan Becker。我们都喜欢构建定制计算机并在其上安装 Linux。Brendan 一直在同时参与着从游戏编程到音乐创作的多个技术项目。从那之后快进几年，他继续编写 [pyDance](http://icculus.org/pyddr/)，这是一个多舞种游戏的开源实现，然后成为了音乐和游戏项目 [MAGFest](http://magfest.org/) 的 CEO。他有时被称为 “MAGFest 先生”，因为他是该项目的负责人，Brendan 现在使用的音乐笔名是 “[Inverse Phase](http://www.inversephase.com/)”，是一位<ruby> 电子合音 <rt>  chiptune </rt></ruby>（主要在 8 位计算机和游戏机上创作的音乐）作曲家。

我认为采访并询问他在整个职业生涯中如何从 Linux 和开源软件中受益的一些细节会很有趣。

### 你是如何开始接触计算机和软件的？

Brendan Becker：从我记事起，我家就有一台电脑。我父亲热衷于技术；在康柏便携式电脑刚刚上市时，他就带了一台回家，当他不在上面工作时，我就可以使用它。由于我两岁时就开始阅读，使用电脑就成了我的第二天性——只要阅读磁盘上的内容，按照说明进行操作，我就可以玩游戏了！有时我会玩一些学习和教育软件，我们有几张装满游戏的磁盘，我可以在其他时间玩。我记得有一张磁盘，里面有一些流行游戏的免费副本。后来，我父亲向我展示了我们可以呼叫其他计算机（我 5 岁时就上了 BBS！），我看到了一些游戏来自那儿。我喜欢玩的一款游戏是用 BASIC 编写的，当我意识到我可以简单地修改游戏，只需阅读一些内容并重新输入它们游戏就会更轻松，玩游戏就没意思了。

### 这是上世纪 80 年代？

Becker：康柏便携式电脑于 1983 年推出，这可以给你一些参考。我爸爸有一个那个型号的初代产品。

### 你是如何进入 Linux 和开源软件的？

Becker：在上世纪 90 年代初，我酷爱 MOD 和<ruby> 演示场景 <rt>  demoscene </rt></ruby>之类的东西，我注意到 Walnut Creek（即 [cdrom.com](https://en.wikipedia.org/wiki/Walnut_Creek_CDROM)；现已解散）在 FreeBSD 上开设了商店。总的来说，我对 Unix 和其他操作系统非常好奇，但没有太多的第一手资料，我认为是时候尝试一些东西了。当时 DOOM 刚刚发布，有人告诉我，我可以试着在计算机上运行它。在这与能够运行很酷的互联网服务器之间，我开始陷入两难取舍。有人看到我在阅读有关 FreeBSD 的文章，并建议我了解一下 Linux，这是一个为 x86 重新编写的新操作系统，与 BSD 不同，（他们说）后者存在一些兼容性问题。因此，我加入了 undernet IRC 上的 #linuxhelp 频道，询问如何开始使用 Linux，并表明我已经做了一些研究（我已经能问出 “Red Hat 和 Slackware 之间有什么区别？”这样的问题），想知道什么是最容易使用的。频道里唯一说话的人说他已经 13 岁了，他都能弄明白 Slackware，所以我应该不会有问题。学校的一个数学老师给了我一个硬盘，我下载了 “A” 盘组和一个启动盘，写入到软盘，安装了它，回头看也并没有花太多时间。

### 你是如何被称为 “MAGFest 先生”的？

Becker：嗯，这个很简单。在第一个活动后，我几乎立即成为了 MAGFest 的代理负责人。前任主席都各奔东西，我向负责人要求不要取消活动。解决方案就是自己运营它，当我慢慢地将项目塑造成我自己的时，这个昵称就成了我的。

### 我记得我在早期参加过，MAGFest 最终变得有多大？

Becker：第一届 MAGFest 是 265 人。现在它超大，有两万多名不同的参与者。

### 太棒了！你能简要描述一下 MAGFest 大会吗？

Becker：我的一个朋友 Hex 描述得非常好。他说：“就像是和你所有的朋友一起举办这个以电子游戏为主题的生日派对，那里恰好有几千人，如果你愿意，他们都可以成为你的朋友，然后还有摇滚音乐会。” 这很快被采用并缩短为 “这是一个为期四天的电子游戏派对，有多场电子游戏摇滚音乐会”。通常 “音乐和游戏节” 这句话就能让人们明白这个意思。

### 你是如何利用开源软件来运行 MAGFest 的？

Becker：当我成为 MAGFest 的负责人时，我已经用 Python 编写了一个游戏，所以我觉得用 Python 编写我们的注册系统最舒服。这是一个非常轻松的决定，因为不涉及任何费用，而且我已经有了经验。后来，我们的在线注册系统和拼车界面都是用 PHP/MySQL 编写的，我们的论坛使用了 Kboard。最终，这发展到我们用 Python 从头开始编写了自己的注册系统，我们也在活动中使用它，并在主网站上运行 Drupal。有一次，我还用 Python 编写了一个系统来管理视频室和邀请比赛站。哦，我们有一些游戏音乐收听站，你可以翻阅标志性的游戏 OST（原始音轨）的曲目和简介，和演奏 MAGFest 的乐队。

### 我知道几年前你减少了你在 MAGFest 的职责，去追求新的项目。你接下来的努力是什么？

Becker：我一直非常投入游戏音乐领域，并试图将尽可能多的音乐带到 MAGFest 中。随着我越来越多地成为这些社区的一部分，我想参与其中。我使用以前用过的自由开源版本的 DOS 和 Windows 演示场景工具编写了一些视频游戏曲调的混合曲、封面和编曲，我以前使用过的这种工具也是免费的，但不一定是开源的。我在运行 MAGFest 的最初几年发布了一些曲目，然后在 Jake Kaufman（也被称为 `virt`；在他的简历之外也叫 Shovel Knight 和 Shantae）的一些严厉的关爱和建议之后，我改变主题到我更擅长的电子和音。尽管我小时候就用我的康柏便携式电脑编写了 PC 扬声器发出的哔哔啵啵声，并在 90 年代的演示场景中写过 MOD 文件，但我在 2006 年发布了第一首 NES 规格的曲目，我真的能很自豪地称之为我自己的作品。随后还有几张流行音乐的作品和专辑。

2010 年，有很多人找我做游戏配乐工作。尽管配乐工作对它没有太大影响，但我开始更认真地缩减我在 MAGFest 的一些职责，并且在 2011 年，我决定更多地进入幕后。我会留在董事会担任顾问，帮助人们了解他们需要什么来管理他们的部门，但我不再掌舵了。与此同时，我的兼职工作，即给我支付账单的工作，解雇了他们所有的工人，我突然发现自己有了很多空闲时间。我开始写《 Pretty Eight Machine》，这是一首向《Nine Inch Nails》致敬的作品，我在这个事情和游戏配乐工作之间花了一年多，我向自己证明了我可以用音乐来（即便只是勉强）维持生计，这就是我接下来想做的。

*版权所有 Inverse Phase，经许可使用。*

### 就硬件和软件而言，你的工作空间是什么样的？

Becker：在我的 DOS/Windows 时代，我主要使用 FastTracker 2。在 Linux 中，我将其替换为 SoundTracker（不是 Karsten Obarski 的原始版本，而是 GTK 重写版本；参见 [soundtracker.org](http://soundtracker.org)）。近来，SoundTracker 处于不断变化的状态——虽然我仍然需要尝试新的 GTK3 版本——但是当我无法使用 SoundTracker 时，[MilkyTracker](http://www.milkytracker.org) 是一个很好的替代品。如果我真的需要原版 FastTracker 2，虽然老旧但它也可以在 DOSBox 中运行起来。然而，那是我开始使用 Linux 的时候，所以这是我在 20-25 年前发现的东西。

在过去的十年里，我已经从基于采样的音乐转向了电子和音，这是由来自 8 位和 16 位游戏系统和计算机的旧声音芯片合成的音乐。有一个非常好的跨平台工具叫 [Deflemask](http://www.deflemask.com)，可以为许多这些系统编写音乐。不过，我想为其创作音乐的一些系统不受支持，而且 Deflemask 是闭源的，因此我已经开始使用 Python 和 [Pygame](http://www.pygame.org) 从头开始构建自己的音乐创作环境。我使用 Git 维护我的代码树，并将使用开源的 [KiCad](http://www.kicad-pcb.org) 控制硬件合成器板。

### 你目前专注于哪些项目？

Becker：我断断续续地从事于游戏配乐和音乐委托工作。在此期间，我还一直致力于创办一个名为 [Bloop](http://bloopmuseum.com) 的电子娱乐博物馆。我们在档案和库存方面做了很多很酷的事情，但也许最令人兴奋的是我们一直在用树莓派构建展览。它们的用途非常广泛，而且我觉得很奇怪，如果我在十年前尝试这样做，我就不会有可以驱动我的展品的小型单板计算机；我可能会用把一个平板固定在笔记本电脑的背面！

### 现在有更多游戏平台进入 Linux，例如 Steam、Lutris 和 Play-on-Linux。你认为这种趋势会持续下去吗？这些会一直存在吗？

Becker：作为一个在 Linux 上玩了 25 年游戏的人——事实上，我 *是因为* 游戏才接触 Linux 的——我想我认为这个问题比大多数人认为的更艰难。我已经玩了 Linux 原生游戏几十年了，我甚至不得不对收回我当年说的“要么存在 Linux 解决方案，要么编写出来”这样的话，但最终，我做到了，我编写了一个 Linux 游戏。

说实话：Android 问世于 2008 年。如果你在 Android 上玩过游戏，那么你就在 Linux 上玩过游戏。Steam 在 Linux 已经八年了。Steambox/SteamOS 发布在 Steam 发布一年后。我没有听到太多 Lutris 或 Play-on-Linux 的消息，但我知道它们并希望它们成功。我确实看到 GOG 的追随者非常多，我认为这非常好。我看到很多来自 Ryan Gordon（icculus）和 Ethan Lee（flibitijibibo）等人的高质量游戏移植，甚至有些公司在内部移植。Unity 和 Unreal 等游戏引擎已经支持 Linux。Valve 已经将 Proton 纳入 Linux 版本的 Steam 已有两年左右的时间了，所以现在 Linux 用户甚至不必搜索他们游戏的 Linux 原生版本。

我可以说，我认为大多数游戏玩家期待并将继续期待他们已经从零售游戏市场获得的支持水平。就我个人而言，我希望这个水平是增长而不是下降！

*详细了解 Brendan 的 [Inverse Phase](https://www.inversephase.com) 工作。*

---

via: <https://opensource.com/article/20/2/linux-open-source-music>

作者：[Alan Formy-Duval](https://opensource.com/users/alanfdoss) 选题：[lujun9972](https://github.com/lujun9972) 译者：[stevenzdg988](https://github.com/stevenzdg988) 校对：[wxy](https://github.com/wxy)

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


在 Linux 和 FreeDOS 之间复制文件

# 在 Linux 和 FreeDOS 之间复制文件

>
> 下面是我如何在我的 FreeDOS 虚拟机和 Linux 桌面系统之间传输文件。
>
>
>

我运行 Linux 作为我的主要操作系统，我在一个虚拟机中启动 FreeDOS。大多数时候，我使用 QEMU 作为我的 PC 模拟器，但有时我会用 GNOME Boxes（它使用 QEMU 作为后端虚拟机）或用 VirtualBox 运行其他实验。

我喜欢玩经典的 DOS 游戏，有时我也会调出一个最喜欢的 DOS 应用。我在管理信息系统（MIS）课上讲计算机的历史，有时我会用 FreeDOS 和一个传统的 DOS 应用录制一个演示，比如 As-Easy-As（我最喜欢的 DOS 电子表格，曾经作为“共享软件”发布，但现在可以 [从 TRIUS 公司免费获得](http://www.triusinc.com/forums/viewtopic.php?t=10)）。

但是以这种方式使用 FreeDOS 意味着我需要在我的 FreeDOS 虚拟机和我的 Linux桌 面系统之间传输文件。让我来展示是如何做到这一点的。

### 用 guestmount 访问镜像

我曾经通过计算第一个 DOS 分区的偏移量来访问我的虚拟磁盘镜像，然后用正确的选项组合来调用 Linux 的 `mount` 命令来匹配这个偏移量。这总是很容易出错，而且不是很灵活。幸运的是，有一个更简单的方法可以做到这一点。来自 [libguestfs-tools](https://libguestfs.org/) 包的 `guestmount` 程序可以让你从 Linux 中访问或 *挂载* 虚拟磁盘镜像。你可以在 Fedora 上用这个命令安装 `libguestfs-tools`：

```
$ yum install libguestfs-tools libguestfs

```

使用 `guestmount` 并不像从 GNOME 文件管理器中双击文件那么简单，但命令行的使用并不难。`guestmount` 的基本用法是：

```
$ guestmount -a image -m device mountpoint

```

在这个用法中，`image` 是要使用的虚拟磁盘镜像。在我的系统中，我用 `qemu-img` 命令创建了 QEMU 虚拟磁盘镜像。`guestmount` 程序可以读取这种磁盘镜像格式，以及 GNOME Boxes 使用的 QCOW2 镜像格式，或者 VirtualBox 使用的 VDI 镜像格式。

`device` 选项表示虚拟磁盘上的分区。想象一下，把这个虚拟磁盘当作一个真正的硬盘使用。你可以用 `/dev/sda1` 访问第一个分区，用 `/dev/sda2` 访问第二个分区，以此类推。这就是 `guestmount` 的语法。默认情况下，FreeDOS 1.3 RC4 在一个空的驱动器上创建了一个分区，所以访问这个分区的时候要用 `/dev/sda1`。

而 `mountpoint` 是在你的本地 Linux 系统上“挂载” DOS 文件系统的位置。我通常会创建一个临时目录来工作。你只在访问虚拟磁盘时需要挂载点。

综上所述，我使用这组命令从 Linux 访问我的 FreeDOS 虚拟磁盘镜像：

```
$ mkdir /tmp/freedos
$ guestmount -a freedos.img -m /dev/sda1 /tmp/freedos

```

之后，我可以通过 `/tmp/freedos` 目录访问我的 FreeDOS 文件，使用 Linux 上的普通工具。我可以在命令行中使用 `ls /tmp/freedos`，或者使用桌面文件管理器打开 `/tmp/freedos` 挂载点。

```
$ ls -l /tmp/freedos
total 216
drwxr-xr-x. 5 root root 8192 May 10 15:53 APPS
-rwxr-xr-x. 1 root root 85048 Apr 30 07:54 COMMAND.COM
-rwxr-xr-x. 1 root root  103 May 13 15:48 CONFIG.SYS
drwxr-xr-x. 5 root root 8192 May 15 16:52 DEVEL
drwxr-xr-x. 2 root root 8192 May 15 13:36 EDLIN
-rwxr-xr-x. 1 root root 1821 May 10 15:57 FDAUTO.BAT
-rwxr-xr-x. 1 root root  740 May 13 15:47 FDCONFIG.SYS
drwxr-xr-x. 10 root root 8192 May 10 15:49 FDOS
-rwxr-xr-x. 1 root root 46685 Apr 30 07:54 KERNEL.SYS
drwxr-xr-x. 2 root root 8192 May 10 15:57 SRC
-rwxr-xr-x. 1 root root 3190 May 16 08:34 SRC.ZIP
drwxr-xr-x. 3 root root 8192 May 11 18:33 TEMP

```

*使用 GNOME 文件管理器来访问虚拟磁盘*

例如，要从我的 Linux `projects` 目录中复制几个 C 源文件到虚拟磁盘镜像上的 `C:\SRC`，以便我以后能在 FreeDOS 下使用这些文件，我可以使用 Linux `cp` 命令：

```
$ cp /home/jhall/projects/*.c /tmp/freedos/SRC

```

虚拟驱动器上的文件和目录在技术上是不分大小写的，所以你可以用大写或小写字母来引用它们。然而，我发现使用所有大写字母来输入 DOS 文件和目录更为自然。

```
$ ls /tmp/freedos
APPS     CONFIG.SYS EDLIN    FDCONFIG.SYS KERNEL.SYS SRC.ZIP
COMMAND.COM DEVEL    FDAUTO.BAT FDOS     SRC     TEMP

$ ls /tmp/freedos/EDLIN
EDLIN.EXE MAKEFILE.OW

$ ls /tmp/freedos/edlin
EDLIN.EXE MAKEFILE.OW

```

### 用 guestmount 卸载

在你再次在虚拟机中使用虚拟磁盘镜像之前，你应该总是先 *卸载*。如果你在运行 QEMU 或 VirtualBox 时让镜像挂载，你有可能弄乱你的文件。

与 `guestmount` 配套的命令是 `guestunmount`，用来卸载磁盘镜像。只要给出你想卸载的挂载点就可以了：

```
$ guestunmount /tmp/freedos

```

请注意命令拼写与 Linux 的 `umount` 稍有不同。

---

via: <https://opensource.com/article/21/6/copy-files-linux-freedos>

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

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


Summary: 更多：• 古老的编程语言正面临人才青黄不接 • “天河”E级验证系统获得图计算领域两项世界第一

Craig Wright好无耻。

# 硬核观察 #322 Bitcoin.org 败诉，需支付“中本聪” 35,000 英镑

### Bitcoin.org 败诉，需支付“中本聪” 35,000 英镑

英国高等法院[裁决](https://markets.businessinsider.com/currencies/news/bitcoin-creator-satoshi-nakamoto-uk-court-cobra-copyright-craig-wright-2021-6)，[Bitcoin.org](http://bitcoin.org/) 不能再在其网站上分享发布于 2008 年的《[比特币白皮书](https://bitcoin.org/bitcoin.pdf)》，Craig Wright 声称是该文件的原始作者“中本聪”。[Bitcoin.org](http://bitcoin.org/) 的匿名创始人 Cobra 因为担心暴露身份而没有出席法院辩论，所以 Wright 以默认方式赢得了他提起的版权侵权案件。因此，[Bitcoin.org](http://bitcoin.org/) 必须支付 35,000 英镑的法律费用，并在其网站上发布法院命令的通知，为期六个月。

>
> 这么说，在英国《比特币白皮书》的使用要看“版权方”的脸色了。
>
>
>

### 古老的编程语言正面临人才青黄不接

许多大型组织仍在依赖陈旧的 IT 系统和编程语言来支撑大型机的运转。但随着老一代开发者到了退休年龄，行业内正面临着人才青黄不接的尴尬局面。这些系统通常以诞生于 1959 年的 COBOL 等编程语言为基础，目前仍被许多大型组织广泛用于处理某些重要的中央系统数据，比如计费、账户、工资单和客户交易。比如，美国财政部国税局的“六号系统”，正是用汇编程序和 COBOL 语言来管理包含纳税人在内的各种数据的。

在 [Advanced Software 调查](https://modernsystems.oneadvanced.com/modernization2021/)的 400 家组织中，有 3/4 表示 COBOL 仍是其大型机应用中最主要的依赖语言，66% 的大型企业仍在使用汇编程序，其它主要语言包括 ADS/Online（40%）、CA Gen（37%）、CA Telon（24%）、以及 PL/1（15%）。

>
> 套用一句运维潜规则，“能运行的就不要去动”。越是老旧的系统和平台，越是没人敢碰。
>
>
>

### “天河”E级验证系统获得图计算领域两项世界第一

据新华网报道，由国防科技大学研制，部署在国家超级计算天津中心的“天河”E级（百亿亿次）计算机关键技术验证系统，在 7 月 1 日发布的国际 Graph500 排名中，获得单源最短路径榜单世界第一和大数据图计算能效榜单世界第一的佳绩。

国家超级计算天津中心也是我国首个千万亿次超算“天河一号”部署所在地。

>
> 可喜可贺，榜单排名是一方面，希望可以在实际研究中取得重要应用。
>
>
>


使用 GDB 查看程序的栈空间

Summary: 这是一个快速教程，介绍如何使用 GDB 查看 C 程序的栈空间。

这是一个快速教程，介绍如何使用 GDB 查看 C 程序的栈空间。

# 使用 GDB 查看程序的栈空间

昨天我和一些人在闲聊的时候，他们说他们并不真正了解栈是如何工作的，而且也不知道如何去查看栈空间。

这是一个快速教程，介绍如何使用 GDB 查看 C 程序的栈空间。我认为这对于 Rust 程序来说也是相似的。但我这里仍然使用 C 语言，因为我发现用它更简单，而且用 C 语言也更容易写出错误的程序。

### 我们的测试程序

这里是一个简单的 C 程序，声明了一些变量，从标准输入读取两个字符串。一个字符串在堆上，另一个字符串在栈上。

```
#include <stdio.h>
#include <stdlib.h>

int main() {
    char stack_string[10] = "stack";
    int x = 10;
    char *heap_string;

    heap_string = malloc(50);

    printf("Enter a string for the stack: ");
    gets(stack_string);
    printf("Enter a string for the heap: ");
    gets(heap_string);
    printf("Stack string is: %s\n", stack_string);
    printf("Heap string is: %s\n", heap_string);
    printf("x is: %d\n", x);
}

```

这个程序使用了一个你可能从来不会使用的极为不安全的函数 `gets` 。但我是故意这样写的。当出现错误的时候，你就知道是为什么了。

### 第 0 步：编译这个程序

我们使用 `gcc -g -O0 test.c -o test` 命令来编译这个程序。

`-g` 选项会在编译程序中将调式信息也编译进去。这将会使我们查看我们的变量更加容易。

`-O0` 选项告诉 gcc 不要进行优化，我要确保我们的 `x` 变量不会被优化掉。

### 第一步：启动 GDB

像这样启动 GDB：

```
$ gdb ./test

```

它打印出一些 GPL 信息，然后给出一个提示符。让我们在 `main` 函数这里设置一个断点：

```
(gdb) b main

```

然后我们就可以运行程序：

```
(gdb) b main
Starting program: /home/bork/work/homepage/test
Breakpoint 1, 0x000055555555516d in main ()

(gdb) run
Starting program: /home/bork/work/homepage/test

Breakpoint 1, main () at test.c:4
4   int main() {

```

好了，现在程序已经运行起来了。我们就可以开始查看栈空间了。

### 第二步：查看我们变量的地址

让我们从了解我们的变量开始。它们每个都在内存中有一个地址，我们可以像这样打印出来：

```
(gdb) p &x
$3 = (int *) 0x7fffffffe27c
(gdb) p &heap_string
$2 = (char **) 0x7fffffffe280
(gdb) p &stack_string
$4 = (char (*)[10]) 0x7fffffffe28e

```

因此，如果我们查看那些地址的堆栈，那我们应该能够看到所有的这些变量！

### 概念：栈指针

我们将需要使用栈指针，因此我将尽力对其进行快速解释。

有一个名为 ESP 的 x86 寄存器，称为“<ruby> 栈指针 <rt>  stack pointer </rt></ruby>”。 基本上，它是当前函数的栈起始地址。 在 GDB 中，你可以使用 `$sp` 来访问它。 当你调用新函数或从函数返回时，栈指针的值会更改。

### 第三步：在 `main` 函数开始的时候，我们查看一下在栈上的变量

首先，让我们看一下 main 函数开始时的栈。 现在是我们的堆栈指针的值：

```
(gdb) p $sp
$7 = (void *) 0x7fffffffe270

```

因此，我们当前函数的栈起始地址是 `0x7fffffffe270`，酷极了。

现在，让我们使用 GDB 打印出当前函数堆栈开始后的前 40 个字（即 160 个字节）。 某些内存可能不是栈的一部分，因为我不太确定这里的堆栈有多大。 但是至少开始的地方是栈的一部分。

我已粗体显示了 `stack_string`，`heap_string` 和 `x` 变量的位置，并改变了颜色：

* `x` 是红色字体，并且起始地址是 `0x7fffffffe27c`
* `heap_string` 是蓝色字体，起始地址是 `0x7fffffffe280`
* `stack_string` 是紫色字体，起始地址是 `0x7fffffffe28e`

你可能会在这里注意到的一件奇怪的事情是 `x` 的值是 0x5555，但是我们将 `x` 设置为 `10`！ 那是因为直到我们的 `main` 函数运行之后才真正设置 `x` ，而我们现在才到了 `main` 最开始的地方。

### 第三步：运行到第十行代码后，再次查看一下我们的堆栈

让我们跳过几行，等待变量实际设置为其初始化值。 到第 10 行时，`x` 应该设置为 `10`。

首先我们需要设置另一个断点：

```
(gdb) b test.c:10
Breakpoint 2 at 0x5555555551a9: file test.c, line 11.

```

然后继续执行程序：

```
(gdb) continue
Continuing.

Breakpoint 2, main () at test.c:11
11      printf("Enter a string for the stack: ");

```

好的！ 让我们再来看看堆栈里的内容！ `gdb` 在这里格式化字节的方式略有不同，实际上我也不太关心这些（LCTT 译注:可以查看 GDB 手册中 `x` 命令，可以指定 `c` 来控制输出的格式）。 这里提醒一下你，我们的变量在栈上的位置：

* `x` 是红色字体，并且起始地址是 `0x7fffffffe27c`
* `heap_string` 是蓝色字体，起始地址是 `0x7fffffffe280`
* `stack_string` 是紫色字体，起始地址是 `0x7fffffffe28e`

在继续往下看之前，这里有一些有趣的事情要讨论。

### `stack_string` 在内存中是如何表示的

现在（第 10 行），`stack_string` 被设置为字符串`stack`。 让我们看看它在内存中的表示方式。

我们可以像这样打印出字符串中的字节（LCTT 译注：可以通过 `c` 选项直接显示为字符）：

```
(gdb) x/10x stack_string
0x7fffffffe28e: 0x73    0x74    0x61    0x63    0x6b    0x00    0x00    0x00
0x7fffffffe296: 0x00    0x00

```

`stack` 是一个长度为 5 的字符串，相对应 5 个 ASCII 码- `0x73`、`0x74`、`0x61`、`0x63` 和 `0x6b`。`0x73` 是字符 `s` 的 ASCII 码。 `0x74` 是 `t` 的 ASCII 码。等等...

同时我们也使用 `x/1s` 可以让 GDB 以字符串的方式显示：

```
(gdb) x/1s stack_string
0x7fffffffe28e: "stack"

```

### `heap_string` 与 `stack_string` 有何不同

你已经注意到了 `stack_string` 和 `heap_string` 在栈上的表示非常不同：

* `stack_string` 是一段字符串内容（`stack`）
* `heap_string` 是一个指针，指向内存中的某个位置

这里是 `heap_string` 变量在内存中的内容：

```
0xa0  0x92  0x55  0x55  0x55  0x55  0x00  0x00

```

这些字节实际上应该是从右向左读：因为 x86 是小端模式，因此，`heap_string` 中所存放的内存地址 `0x5555555592a0`

另一种方式查看 `heap_string` 中存放的内存地址就是使用 `p` 命令直接打印 ：

```
(gdb) p heap_string
$6 = 0x5555555592a0 ""

```

### 整数 x 的字节表示

`x` 是一个 32 位的整数，可由 `0x0a 0x00 0x00 0x00` 来表示。

我们还是需要反向来读取这些字节（和我们读取 `heap_string` 需要反过来读是一样的），因此这个数表示的是 `0x000000000a` 或者是 `0x0a`，它是一个数字 `10`;

这就让我把把 `x` 设置成了 `10`。

### 第四步：从标准输入读取

好了，现在我们已经初始化我们的变量，我们来看一下当这段程序运行的时候，栈空间会如何变化：

```
printf("Enter a string for the stack: ");
gets(stack_string);
printf("Enter a string for the heap: ");
gets(heap_string);

```

我们需要设置另外一个断点：

```
(gdb) b test.c:16
Breakpoint 3 at 0x555555555205: file test.c, line 16.

```

然后继续执行程序：

```
(gdb) continue
Continuing.

```

我们输入两个字符串，为栈上存储的变量输入 `123456789012` 并且为在堆上存储的变量输入 `bananas`;

### 让我们先来看一下 `stack_string`（这里有一个缓存区溢出）

```
(gdb) x/1s stack_string
0x7fffffffe28e: "123456789012"

```

这看起来相当正常，对吗？我们输入了 `12345679012`，然后现在它也被设置成了 `12345679012`（LCTT 译注：实测 gcc 8.3 环境下，会直接段错误）。

但是现在有一些很奇怪的事。这是我们程序的栈空间的内容。有一些紫色高亮的内容。

令人奇怪的是 **`stack_string` 只支持 10 个字节**。但是现在当我们输入了 13 个字符以后，发生了什么？

这是一个典型的缓冲区溢出，`stack_string` 将自己的数据写在了程序中的其他地方。在我们的案例中，这还没有造成问题，但它会使你的程序崩溃，或者更糟糕的是，使你面临非常糟糕的安全问题。

例如，假设 `stack_string` 在内存里的位置刚好在 `heap_string` 之前。那我们就可能覆盖 `heap_string` 所指向的地址。我并不确定 `stack_string` 之后的内存里有一些什么。但我们也许可以用它来做一些诡异的事情。

### 确实检测到了有缓存区溢出

当我故意写很多字符的时候：

```
 ./test
Enter a string for the stack: 01234567891324143
Enter a string for the heap: adsf
Stack string is: 01234567891324143
Heap string is: adsf
x is: 10
*** stack smashing detected ***: terminated
fish: Job 1, './test' terminated by signal SIGABRT (Abort)

```

这里我猜是 `stack_string` 已经到达了这个函数栈的底部，因此额外的字符将会被写在另一块内存中。

当你故意去使用这个安全漏洞时，它被称为“堆栈粉碎”，而且不知何故有东西在检测这种情况的发生。

我也觉得这很有趣，虽然程序被杀死了，但是当缓冲区溢出发生时它不会立即被杀死——在缓冲区溢出之后再运行几行代码，程序才会被杀死。 好奇怪！

这些就是关于缓存区溢出的所有内容。

### 现在我们来看一下 `heap_string`

我们仍然将 `bananas` 输入到 `heap_string` 变量中。让我们来看一下内存中的样子。

这是在我们读取了字符串以后，`heap_string` 在栈空间上的样子：

需要注意的是，这里的值是一个地址。并且这个地址并没有改变，但是我们来看一下指向的内存上的内容。

```
(gdb) x/10x 0x5555555592a0
0x5555555592a0: 0x62    0x61    0x6e    0x61    0x6e    0x61    0x73    0x00
0x5555555592a8: 0x00    0x00

```

看到了吗，这就是字符串 `bananas` 的字节表示。这些字节并不在栈空间上。他们存在于内存中的堆上。

### 堆和栈到底在哪里？

我们已经讨论过栈和堆是不同的内存区域，但是你怎么知道它们在内存中的位置呢？

每个进程都有一个名为 `/proc/$PID/maps` 的文件，它显示了每个进程的内存映射。 在这里你可以看到其中的栈和堆。

```
$ cat /proc/24963/maps
... lots of stuff omitted ...
555555559000-55555557a000 rw-p 00000000 00:00 0                          [heap]
... lots of stuff omitted ...
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0                          [stack]

```

需要注意的一件事是，这里堆地址以 `0x5555` 开头，栈地址以 `0x7fffff` 开头。 所以很容易区分栈上的地址和堆上的地址之间的区别。

### 像这样使用 gdb 真的很有帮助

这有点像旋风之旅，虽然我没有解释所有内容，但希望看到数据在内存中的实际情况可以使你更清楚地了解堆栈的实际情况。

我真的建议像这样来把玩一下 gdb —— 即使你不理解你在内存中看到的每一件事，我发现实际上像这样看到我程序内存中的数据会使抽象的概念，比如“栈”和“堆”和“指针”更容易理解。

### 更多练习

一些关于思考栈的后续练习的想法（没有特定的顺序）：

* 尝试将另一个函数添加到 `test.c` 并在该函数的开头创建一个断点，看看是否可以从 `main` 中找到堆栈！ 他们说当你调用一个函数时“堆栈会变小”，你能在 gdb 中看到这种情况吗？
* 从函数返回一个指向栈上字符串的指针，看看哪里出了问题。 为什么返回指向栈上字符串的指针是不好的？
* 尝试在 C 中引起堆栈溢出，并尝试通过在 gdb 中查看堆栈溢出来准确理解会发生什么！
* 查看 Rust 程序中的堆栈并尝试找到变量！
* 在 [噩梦课程](https://github.com/guyinatuxedo/nightmare) 中尝试一些缓冲区溢出挑战。每个问题的答案写在 README 文件中，因此如果你不想被宠坏，请避免先去看答案。 所有这些挑战的想法是给你一个二进制文件，你需要弄清楚如何导致缓冲区溢出以使其打印出 `flag` 字符串。

---

via: <https://jvns.ca/blog/2021/05/17/how-to-look-at-the-stack-in-gdb/>

作者：[Julia Evans](https://jvns.ca/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[amwps290](https://github.com/amwps290) 校对：[wxy](https://github.com/wxy)

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


使用 Python 解析配置文件

Summary: 第一步是选择配置文件的格式：INI、JSON、YAML 或 TOML。

第一步是选择配置文件的格式：INI、JSON、YAML 或 TOML。

# 使用 Python 解析配置文件

>
> 第一步是选择配置文件的格式：INI、JSON、YAML 或 TOML。
>
>
>

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

有时，程序需要足够的参数，将它们全部作为命令行参数或环境变量既不让人愉快也不可行。 在这些情况下，你将需要使用配置文件。

有几种流行的配置文件格式。其中包括古老的（虽然有时定义不明确）INI 格式，虽然流行但有时难以手写的 JSON 格式，使用广泛但有时在细节方面令人意外的 YAML 格式，以及很多人还没有听说过的最新出现的 TOML。

你的首要任务是选择一种格式，然后记录该选择。解决了这个简单的部分之后就是时候解析配置了。

有时，在配置中拥有一个与“抽象“数据相对应的类是一个不错的想法。因为这段代码不会对配置做任何事情，所以这是展示解析逻辑最简单的方式。

想象一下文件处理器的配置：它包括一个输入目录、一个输出目录和要提取的文件。

配置类的抽象定义可能类似于：

```
from __future__ import annotations

```

```
import attr

@attr.frozen
class Configuration:
    @attr.frozen
    class Files:
        input_dir: str
        output_dir: str
    files: Files
    @attr.frozen
    class Parameters:
        patterns: List[str]
    parameters: Parameters

```

为了使特定于格式的代码更简单，你还需要编写一个函数来从字典中解析此类。请注意，这假设配置将使用破折号，而不是下划线。 这种差异并不少见。

```
def configuration_from_dict(details):
    files = Configuration.Files(
        input_dir=details["files"]["input-dir"],
        output_dir=details["files"]["output-dir"],
    )
    parameters = Configuration.Paraneters(
        patterns=details["parameters"]["patterns"]
    )
    return Configuration(
        files=files,
        parameters=parameters,
    )

```

### JSON

JSON（JavaScript Object Notation）是一种类似于 JavaScript 的格式。

以下是 JSON 格式的示例配置：

```
json_config = """
{
    "files": {
        "input-dir": "inputs",
        "output-dir": "outputs"
    },
    "parameters": {
        "patterns": [
            "*.txt",
            "*.md"
        ]
    }
}
"""

```

解析逻辑使用 `json` 模块将 JSON 解析为 Python 的内置数据结构（字典、列表、字符串），然后从字典中创建类：

```
import json
def configuration_from_json(data):
    parsed = json.loads(data)
    return configuration_from_dict(parsed)

```

### INI

INI 格式，最初只在 Windows 上流行，之后成为配置标准格式。

这是与 INI 相同的配置：

```
ini_config="""
[files]
input-dir = inputs
output-dir = outputs

[parameters]
patterns = ['*.txt', '*.md']
"""

```

Python 可以使用内置的 `configparser` 模块解析它。解析器充当类似 `dict` 的对象，因此可以直接传递给 `configuration_from_dict`：

```
import configparser

def configuration_from_ini(data):
    parser = configparser.ConfigParser()
    parser.read_string(data)
    return configuration_from_dict(parser)

```

### YAML

YAML（Yet Another Markup Language）是 JSON 的扩展，旨在更易于手动编写。为了实现了这一点，部分原因是有一个很长的规范。

以下是 YAML 中的相同配置：

```
yaml_config = """
files:
  input-dir: inputs
  output-dir: outputs
parameters:
  patterns:
  - '*.txt'
  - '*.md'
"""

```

要让 Python 解析它，你需要安装第三方模块。最受欢迎的是`PyYAML`（`pip install pyyaml`）。 YAML 解析器还返回可以传递给 `configuration_from_dict` 的内置 Python 数据类型。但是，YAML 解析器需要一个字节流，因此你需要将字符串转换为字节流。

```
import io
import yaml
def configuration_from_yaml(data):
    fp = io.StringIO(data)
    parsed = yaml.safe_load(fp)
    return configuration_from_dict(parsed)

```

### TOML

TOML（Tom's Own Markup Language）旨在成为 YAML 的轻量级替代品。其规范比较短，已经在一些地方流行了（比如 Rust 的包管理器 Cargo 就用它来进行包配置）。

这是与 TOML 相同的配置：

```
toml_config = """
[files]
input-dir = "inputs"
output-dir = "outputs"

[parameters]
patterns = [ "*.txt", "*.md",]
"""

```

为了解析 TOML，你需要安装第三方包。最流行的一种被简单地称为 `toml`。 与 YAML 和 JSON 一样，它返回基本的 Python 数据类型。

```
import toml
def configuration_from_toml(data):
    parsed = toml.loads(data)
    return configuration_from_dict(parsed)

```

### 总结

选择配置格式是一种微妙的权衡。但是，一旦你做出决定，Python 就可以使用少量代码来解析大多数流行的格式。

---

via: <https://opensource.com/article/21/6/parse-configuration-files-python>

作者：[Moshe Zadka](https://opensource.com/users/moshez) 选题：[lujun9972](https://github.com/lujun9972) 译者：[zepoch](https://github.com/zepoch) 校对：[wxy](https://github.com/wxy)

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


硬核观察 #323 REvil：有史以来最大的一次全球勒索软件攻击

Summary: 更多：• 自由软件基金会宣布改进董事会治理的下一步举措 • 著名开源软件被收购后开始收集用户数据

# 硬核观察 #323 REvil：有史以来最大的一次全球勒索软件攻击

### REvil：有史以来最大的一次全球勒索软件攻击

此次 REvil 通过 Kaseya VSA 供应链进行的勒索攻击已经影响到了 17 个国家的数千客户，大部分都是小型企业。这此事件被称之为“[有史以来最大的一次全球勒索软件攻击](https://apnews.com/article/joe-biden-europe-government-and-politics-technology-business-fc0df4c42f8cd6148bf936ca24bb5cbe)”。Kaseya 公司周五呼吁客户立即关闭他们的 VSA 服务器，并在周日表示，希望在未来几天内推出补丁。据美联社采访的专家称，这些攻击可能是为了利用美国庆祝建国的三天周末。

一个好的迹象是，在过去的 48 小时内，从互联网上可以到达的 Kaseya VSA 实例的数量已经从超过 2200 个下降到最后一次扫描中的[不到 140 个](https://csirt.divd.nl/2021/07/04/Kaseya-Case-Update-2/)。

>
> 正如我们昨天说到的，利用供应链进行的勒索攻击难以防范，也会愈演愈烈。
>
>
>

### 自由软件基金会宣布改进董事会治理的下一步举措

FSF 董事会[宣布](https://www.fsf.org/news/fsf-takes-next-step-in-commitment-to-improving-board-governance)，他们聘请了一位专业顾问，以帮助自由软件基金会设计和执行所需的变革。将在半年内实现：一个透明的由社区支持的确定新董事会成员和评估现有董事会成员的过程；一份明确列出所有董事会成员责任的董事会成员协议；一套道德准则，阐明 FSF 的价值观；更加集中和精简的董事会程序。

FSF 董事会还在评估自 2002 年以来对其章程的首次修改建议。这些修订的目标是确保用户自由不会因董事会、成员或敌对法庭的变化而受到影响，特别是关注各种 GPL 许可证的未来。

>
> 作为最老牌的自由软件方面的基金会，FSF 在开放治理方面却并不“先进”，很高兴 FSF 能看到并改进这一点。
>
>
>

### 著名开源软件被收购后开始收集用户数据

著名开源音频处理软件 Audacity 于两个月前被一家叫作 Muse Group 的公司收购。该公司同时还拥有其它著名音乐电子项目。一个月前其隐私政策的[变化显示](https://fosspost.org/audacity-is-now-a-spyware/)该工具正在收集其用户的数据，并与其他公司共享，同时还将数据发送到俄罗斯。虽然 Audacity 并不是一个手机应用，但程序设计者依然试图利用该软件从用户电脑上获取数据。

在各大开源社区中出现了许多愤怒的回应，GitHub 和 Reddit 上的用户纷纷呼吁尽快分叉该软件。

>
> 当一个开源软件易主之后，对它之前积累的信任需要重新评估。
>
>
>


我在进入技术行业之前的奇怪工作

Summary: 你永远不会知道从你的第一份工作会走到哪里！

你永远不会知道从你的第一份工作会走到哪里！

# 我在进入技术行业之前的奇怪工作

>
> 你永远不会知道从你的第一份工作会走到哪里！
>
>
>

在我从事技术工作之前，我做过一些奇怪的工作。

我是一家飞机修理厂的初级助理，这意味着我的工作要在溶剂中清洗肮脏的金属零件（哇，70 年代的事情可和现在不一样）。我在那里最有趣的工作是熨烫涤纶飞机的布料，放到一架正在修理中的漂亮的老式<ruby> 比奇交错式双翼机 <rt>  Beechcraft Staggerwing </rt></ruby>的木制副翼和水平稳定器上。

在大学期间的一个夏天，我在同一个机场的一个团队工作，混合阻燃剂，然后把它注入灭火飞机（“<ruby>   水轰炸机  <rt>  water bomber </rt></ruby>”）。那可能是我做过的最脏的工作了，但是给飞机装载还是挺酷的。有一个离地面约两米的小挡板，你可以在把填充软管连接到接头后把手指伸进去。然后泵上的人启动泵。当你觉得你的手指湿了，就挥手让管理泵的人停止泵。与此同时，在你前方几米处运行的右侧径向引擎噪音极大，螺旋桨吹掉了你身上因混合阻燃剂而积聚的红色粉尘。如果你搞砸了，让飞机装得太满，他们就得滑到一块地方，把货卸在那里，否则他们会太重而无法起飞。

另外两个夏天，我在当地的百事可乐、七喜、Orange Crush 经销商那里工作，给商店和餐馆送一箱箱的软饮料。这绝对是我做过的最重的体力活了。想想看，在一辆手推车上堆放着五层高的木箱，每个木箱里装着一打 750 毫升的软饮料玻璃瓶。想想把它搬到二楼的餐厅，想想那家餐厅每周要运 120 箱……爬 24 次楼，然后又带着所有的空瓶子下来。一辆小卡车上通常会有 300 箱左右的软饮料。我们的工资是按载重计算的，而不是按小时计算的，所以我们的目标是早点完工，然后去海滩。

### 我的技术工作

送苏打水是我大学期间最后一份暑期工作。第二年我毕业了，获得了数学学位，还修了很多计算机课程，尤其是数值分析。我在技术领域的第一份工作，是为一家小型电脑服务咨询公司工作。我用 SPSS 对一些运动钓鱼调查做了一些分析，写了几百行 PL/1，在我们按时间租来的服务部门的 IBM 3800 激光打印机上打印演唱会门票，并开始研究一些程序来分析森林统计数据。我最终为需要林业统计的客户工作，在 20 世纪 80 年代中期成为合伙人。那时我们已经不仅仅是测量树木，也不再使用<ruby> 分时服务部门 <rt>  timesharing bureau </rt></ruby>来进行计算了。我们买了一台 UNIX 小型计算机，我们在 80 年代后期升级到 SUN 工作站网络。

我在一个大型开发项目上工作了一段时间，它的总部设在马来西亚吉隆坡。然后我们买了第一个地理信息系统，在 80 年代末和 90 年代，我的大部分时间都在和我们的客户一起工作，他们需要定制软件来满足他们的业务需求。到了 21 世纪初，我的三个老合伙人都准备退休了，我试图弄明白，我是如何融入我们这个不再是小公司的，大约 200 名员工的长期图景。我们新的员工老板也不明白这一点，2002 年，我来到智利，想看看智利-加拿大自由贸易协定，是否提供了一个合理的机会，把我们的部分业务转移到拉丁美洲。

该业务在 2004 年正式成立。与此同时，加拿大的母公司由于一些投资组合受到严重影响，在 2007-2009 年的经济衰退的情况下，这些投资似乎不再那么明智，它在 2011 年被迫倒闭。然而，那时候，智利子公司还在经营，所以我们原来的雇员和我成了合伙人，通过资产出售买下了它。直到今天，它仍在运行，在社会环境领域做了很多很酷的事情，我经常参与其中，特别是当我可靠的数学和计算背景有用的时候。

作为一个副业，我为一个在印度以买卖赛马为业的人开发和支持一个赛马信息系统。

---

via: <https://opensource.com/article/21/5/weird-jobs-tech>

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

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


使用 Tokei 查看有关代码的统计信息

Summary: 了解有关项目编程语言的详细信息。

了解有关项目编程语言的详细信息。

# 使用 Tokei 查看有关代码的统计信息

>
> 了解有关项目编程语言的详细信息。
>
>
>

近来，GitHub 添加了一个小指标来展示项目的细节，包括项目使用的编程语言。在这之前，对一个新的贡献者来说，了解他们感兴趣的项目的信息是较为困难的。

这个补充很有帮助，但是如果您想知道有关本地存储库中项目的相同信息该怎么办呢？ 这正是 [Tokei](https://github.com/XAMPPRocky/tokei) 派上用场的地方。这是一个当你想和精通不同语言的人想要构建一个项目时可以告诉你项目的代码数据的特别有用的工具。

### 探索 Tokei

据其 [README](https://github.com/XAMPPRocky/tokei/blob/master/README.md)，“Tokei 是一个可以展示你的代码数据的程序。Tokei 将会展示文件的数量，和这些文件中不同语言的代码、注释、空白的行数。”它的 v.12.1.0 版本 [elaborates](https://github.com/XAMPPRocky/tokei/releases/tag/v12.1.0) 是这样子介绍的，“Tokei 是一个快速准确的代码分析 CLI 工具和库，可以使你轻松快速地在你的代码库中看到有多少空白、评论和代码行”。它能够识别超过 150 种编程语言。

```
$ ./tokei ~/exa/src ~/Work/wildfly/jaxrs
==================
Language   Files Lines Code Comments Blank
Java        46    6135  4324  945     632
XML         23    5211  4839  473     224
---------------------------------
Rust
Markdown
-----------------------------------
Total

```

### 安装 Tokei

在 Fedora 上安装 Tokei：

```
$ sudo dnf install tokei

```

用 Rust's Cargo 包管理器安装：

```
$ cargo install tokei

```

### 使用 Tokei

要列出当前目录中的代码统计：

```
$ tokei
===============================================================================
 Language            Files        Lines         Code     Comments       Blanks
===============================================================================
 Ada                    10         2840         1681          560          599
 Assembly                4         2508         1509          458          541
 GNU Style Assembly      4         2751         1528          748          475
 Autoconf               16         2294         1153          756          385
 Automake                1           45           34            0           11
 BASH                    4         1895         1602          133          160
 Batch                   2            4            4            0            0
 C                     330       206433       150241        23402        32790
 C Header              342        60941        24682        29143         7116
 CMake                  48         4572         3459          548          565
 C#                      9         1615          879          506          230
 C++                     5          907          599          136          172
 Dockerfile              2           16           10            0            6
 Fish                    1           87           77            5            5
 HTML                    1          545          544            1            0
 JSON                    5         8995         8995            0            0
 Makefile               10          504          293           72          139
 Module-Definition      12         1183         1046           65           72
 MSBuild                 1          141          140            0            1
 Pascal                  4         1443         1016          216          211
 Perl                    2          189          137           16           36
 Python                  4         1257          949          112          196
 Ruby                    1           23           18            1            4
 Shell                  15         1860         1411          222          227
 Plain Text             35        29425            0        26369         3056
 TOML                   64         3180         2302          453          425
 Visual Studio Pro|     30        14597        14597            0            0
 Visual Studio Sol|      6          655          650            0            5
 XML                     1          116           95           17            4
 YAML                    2           81           56           12           13
 Zsh                     1           59           48            8            3
-------------------------------------------------------------------------------
 Markdown               55         4677            0         3214         1463
 |- C                    1            2            2            0            0
 |- Rust                19          336          268           20           48
 |- TOML                23           61           60            0            1
 (Total)                           5076          330         3234         1512
-------------------------------------------------------------------------------
 Rust                  496       210966       188958         5348        16660
 |- Markdown           249        17676         1551        12502         3623
 (Total)                         228642       190509        17850        20283
===============================================================================
 Total                1523       566804       408713        92521        65570
===============================================================================
$

```

下面的命令打印出了支持的语言和拓展：

```
$ tokei -l
ABNF
ABAP
ActionScript
Ada
Agda
Alex
Alloy
Arduino C++
AsciiDoc
ASN.1
ASP
ASP.NET
Assembly
GNU Style Assembly

```

如果你在两个文件夹上运行 `tokei` 并指定其位置作为参数，它将以先入先出的规则打印单个文件的统计数据：

默认情况下，`tokei` 仅仅输出有关语言的数据，但是使用 `--files` 标记可提供单个文件统计信息：

```
$ tokei ~/exa/src --files
===========================================================================================
 Language                              Files      Lines      Code             Comments     Blanks
===========================================================================================
 Rust                                   54          9339        7070             400       1869
 |- Markdown                            33          1306           0            1165        141
 (Total)                                           10645        7070        1565       2010
-------------------------------------------------------------------------------------------
 /home/ssur/exa/src/theme/default_theme.rs           130         107           0         23
 /home/ssur/exa/src/output/render/times.rs            30          24           0          6
 /home/ssur/exa/src/output/render/users.rs            98          76           0         22
 /home/ssur/exa/src/output/render/size.rs            182         141           3         38
 /home/ssur/exa/src/output/render/octal.rs           116          88           0         28
 /home/ssur/exa/src/output/render/mod.rs              33          20           3         10
 /home/ssur/exa/src/output/render/inode.rs            28          20           0          8
 /home/ssur/exa/src/output/render/links.rs            87          65           0         22
 /home/ssur/exa/src/output/render/groups.rs          123          93           0         30
 |ome/ssur/exa/src/output/render/filetype.rs          31          26           0          5
 /home/ssur/exa/src/output/render/blocks.rs           57          40           0         17
 /home/ssur/exa/src/output/render/git.rs             108          87           0         21
 |/ssur/exa/src/output/render/permissions.rs         204         160           3         41
 /home/ssur/exa/src/output/grid.rs                    67          51           3         13
 /home/ssur/exa/src/output/escape.rs                  26          18           4          4
 /home/ssur/exa/src/theme/lsc.rs                     235         158          39         38
 /home/ssur/exa/src/options/theme.rs                 159         124           6         29
 /home/ssur/exa/src/options/file_name.rs              46          39           0          7
 /home/ssur/exa/src/options/flags.rs                  84          63           6         15
 /home/ssur/exa/src/fs/mod.rs                         10           8           0          2
 /home/ssur/exa/src/fs/feature/mod.rs                 33          25           0          8
-- /home/ssur/exa/src/output/time.rs ---------------------------------------------------------------
 |- Rust                                             215          170          5         40
 |- Markdown                                          28            0         25          3

```

### 总结

我发现使用 `tokei` 来了解我的代码统计数据十分容易。另一个使用 `tokei` 的好处就是它可以用作为一个很容易集成到其他项目的库。访问 Tokei 的 [Crate.io page](https://crates.io/crates/tokei) 和 [Docs.rs](https://docs.rs/tokei/12.1.2/tokei/) 网站来了解其更多用法。如果你想参与其中，你也可以通过它的 [GitHub 仓库](https://github.com/XAMPPRocky/tokei) 来为 Tokei 作贡献。

你是否觉得 Tokei 很有用呢？可以在下方的评论区告诉我们。

---

via: <https://opensource.com/article/21/6/tokei>

作者：[Sudeshna Sur](https://opensource.com/users/sudeshna-sur) 选题：[lujun9972](https://github.com/lujun9972) 译者：[zepoch](https://github.com/zepoch) 校对：[wxy](https://github.com/wxy)

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


如何用 Rust 编写一个 Linux 内核模块

Rust要支棱起来了。

还是用ada吧

来自广东佛山的 Chrome Mobile 71.0|Android 6.0 用户

为什么内核配置中的General setup  --->Rust support找不到，rustc编译环境已经安装了

有没有解决啊，我的也是这种情况

# 如何用 Rust 编写一个 Linux 内核模块

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

>
> 编者按：近些年来 Rust 语言由于其内存安全性和性能等优势得到了很多关注，尤其是 Linux 内核也在准备将其集成到其中，因此，我们特邀阿里云工程师苏子彬为我们介绍一下如何在 Linux 内核中集成 Rust 支持。
>
>
>

2021 年 4 月 14 号，一封主题名为《[Rust support](https://lkml.org/lkml/2021/4/14/1023)》的邮件出现在 LKML 邮件组中。这封邮件主要介绍了向内核引入 Rust 语言支持的一些看法以及所做的工作。邮件的发送者是 [Miguel Ojeda](https://ojeda.dev/)，为内核中 Compiler attributes、.clang-format 等多个模块的维护者，也是目前 Rust for Linux 项目的维护者。

Rust for Linux 项目目前得到了 [Google 的大力支持](https://www.zdnet.com/article/rust-in-the-linux-kernel-just-got-a-big-boost-from-google/)，[Miguel Ojeda](https://ojeda.dev/) 当前的全职工作就是负责 Rust for Linux 项目。

长期以来，内核使用 C 语言和汇编语言作为主要的开发语言，部分辅助语言包括 Python、Perl、shell 被用来进行代码生成、打补丁、检查等工作。2016 年 Linux 25 岁生日时，在对 Linus Torvalds 的一篇 [采访](https://www.infoworld.com/article/3109150/linux-at-25-linus-torvalds-on-the-evolution-and-future-of-linux.html)中，他就曾表示过：

>
> 这根本不是一个新现象。我们有过使用 Modula-2 或 Ada 的系统人员，我不得不说 Rust 看起来比这两个灾难要好得多。
>
>
> 我对 Rust 用于操作系统内核并不信服（虽然系统编程不仅限于内核），但同时，毫无疑问，C 有很多局限性。
>
>
>

在最新的对 [Rust support](https://lkml.org/lkml/2021/4/14/1023) 的 RFC 邮件的回复中，他更是说：

>
> 所以我对几个个别补丁做了回应，但总体上我不讨厌它。
>
>
>

没有用他特有的回复方式来反击，应该就是暗自喜欢了吧。

目前 Rust for Linux 依然是一个独立于上游的项目，并且主要工作还集中的驱动接口相关的开发上，并非一个完善的项目。

项目地址： <https://github.com/Rust-for-Linux/linux>

### 为什么是 Rust

在 [Miguel Ojeda](https://ojeda.dev/) 的第一个 RFC 邮件中，他已经提到了 “Why Rust”，简单总结下：

* 在<ruby> 安全子集 <rt>  safe subset </rt></ruby>中不存在未定义行为，包括内存安全和数据竞争；
* 更加严格的类型检测系统能够进一步减少逻辑错误；
* 明确区分 `safe` 和 `unsafe` 代码；
* 更加面向未来的语言：`sum` 类型、模式匹配、泛型、RAII、生命周期、共享及专属引用、模块与可见性等等；
* 可扩展的独立标准库；
* 集成的开箱可用工具：文档生成、代码格式化、linter 等，这些都基于编译器本身。

### 编译支持 Rust 的内核

根据 [Rust for Linux 文档](https://github.com/Rust-for-Linux/linux/blob/rust/Documentation/rust/quick-start.rst)，编译一个包含 Rust 支持的内核需要如下步骤：

1. 安装 `rustc` 编译器。Rust for Linux 不依赖 cargo，但需要最新的 beta 版本的 `rustc`。使用 `rustup`命令安装：

```
rustup default beta-2021-06-23

```
2. 安装 Rust 标准库的源码。Rust for Linux 会交叉编译 Rust 的 `core` 库，并将这两个库链接进内核镜像。

```
rustup component add rust-src

```
3. 安装 `libclang` 库。`libclang` 被 `bindgen` 用做前端，用来处理 C 代码。`libclang` 可以从 [llvm 官方主页](https://github.com/llvm/llvm-project/releases) 下载预编译好的版本。
4. 安装 `bindgen` 工具，`bindgen` 是一个自动将 C 接口转为 RustFFI 接口的库：

```
cargo install --locked --version 0.56.0 bindgen

```
5. 克隆最新的 Rust for Linux 代码：

```
git clone https://github.com/Rust-for-Linux/linux.git

```
6. 配置内核启用 Rust 支持：

```
Kernel hacking
  -> Sample kernel code
    -> Rust samples

```
7. 构建：

```
LIBCLANG_PATH=/path/to/libclang make -j LLVM=1 bzImage

```

这里我们使用 `clang` 作为默认的内核编译器，使用 `gcc` 理论上是可以的，但还处于 [早期实验](https://github.com/Rust-for-Linux/linux/blob/rust/Documentation/rust/quick-start.rst#building) 阶段。

### Rust 是如何集成进内核的

#### 目录结构

为了将 Rust 集成进内核中，开发者首先对 Kbuild 系统进行修改，加入了相关配置项来开启/关闭 Rust 的支持。

此外，为了编译 `rs` 文件，添加了一些 `Makefile` 的规则。这些修改分散在内核目录中的不同文件里。

Rust 生成的目标代码中的符号会因为 `Mangling` 导致其长度超过同样的 C 程序所生成符号的长度，因此，需要对内核的符号长度相关的逻辑进行补丁。开发者引入了 “大内核符号”的概念，用来在保证向前兼容的情况下，支持 Rust 生成的目标文件符号长度。

其他 Rust 相关的代码都被放置在了 `rust` 目录下。

#### 在 Rust 中使用 C 函数

Rust 提供 FFI（<ruby> 外部函数接口 <rt>  Foreign Function Interface </rt></ruby>）用来支持对 C 代码的调用。[Bindgen](https://github.com/rust-lang/rust-bindgen) 是一个 Rust 官方的工具，用来自动化地从 C 函数中生成 Rust 的 FFI 绑定。内核中的 Rust 也使用该工具从原生的内核 C 接口中生成 Rust 的 FFI 绑定。

```
quiet_cmd_bindgen = BINDGEN $@
      cmd_bindgen = \
	$(BINDGEN) $< $(shell grep -v '^\#\|^$$' $(srctree)/rust/bindgen_parameters) \
		--use-core --with-derive-default --ctypes-prefix c_types \
		--no-debug '.*' \
		--size_t-is-usize -o $@ -- $(bindgen_c_flags_final) -DMODULE

$(objtree)/rust/bindings_generated.rs: $(srctree)/rust/kernel/bindings_helper.h \
	$(srctree)/rust/bindgen_parameters FORCE
	$(call if_changed_dep,bindgen)

```

#### ABI

Rust 相关的代码会单独从 `rs` 编译为 `.o`，生成的目标文件是标准的 ELF 文件。在链接阶段，内核的链接器将 Rust 生成的目标文件与其他 C 程序生成的目标文件一起链接为内核镜像文件。因此，只要 Rust 生成的目标文件 ABI 与 C 程序的一致，就可以无差别的被链接（当然，被引用的符号还是要存在的）。

#### Rust 的 `alloc` 与 `core` 库

目前 Rust for Linux 依赖于 `core` 库。在 `core` 中定义了基本的 Rust 数据结构与语言特性，例如熟悉的 `Option<>` 和 `Result<>` 就是 `core` 库所提供。

这个库被交叉编译后被直接链接进内核镜像文件，这也是导致启用 Rust 的内核镜像文件尺寸较大的原因。在未来的工作中，这两个库会被进一步被优化，去除掉某些无用的部分，例如浮点操作，Unicode 相关的内容，Futures 相关的功能等。

之前的 Rust for Linux 项目还依赖于 Rust 的 `alloc` 库。Rust for Linux 定义了自己的 `GlobalAlloc` 用来管理基本的堆内存分配。主要被用来进行堆内存分配，并且使用 `GFP_KERNEL` 标识作为默认的内存分配模式。

不过在在最新的 [拉取请求](https://github.com/Rust-for-Linux/linux/pull/402) 中，社区已经将移植并修改了 Rust的 `alloc` 库，使其能够在尽量保证与 Rust 上游统一的情况下，允许开发者定制自己的内存分配器。不过目前使用自定义的 `GFP_` 标识来分配内存依然是不支持的，但好消息是这个功能正在开发中。

### “Hello World” 内核模块

用一个简单的 Hello World 来展示如何使用 Rust 语言编写驱动代码，`hello_world.rs`:

```
#![no_std]
#![feature(allocator_api, global_asm)]

use kernel::prelude::*;

module! {
    type: HelloWorld,
    name: b"hello_world",
    author: b"d0u9",
    description: b"A simple hello world example",
    license: b"GPL v2",
}

struct HelloWorld;

impl KernelModule for HelloWorld {
    fn init() -> Result<Self> {
        pr_info!("Hello world from rust!\n");

        Ok(HelloWorld)
    }
}

impl Drop for HelloWorld {
    fn drop(&mut self) {
        pr_info!("Bye world from rust!\n");
    }
}

```

与之对应的 `Makefile`：

```
obj-m := hello_world.o

```

构建：

```
make -C /path/to/linux_src M=$(pwd) LLVM=1 modules

```

之后就和使用普通的内核模块一样，使用 `insmod` 工具或者 `modprobe` 工具加载就可以了。在使用体验上是没有区别的。

#### `module! { }` 宏

这个宏可以被认为是 Rust 内核模块的入口，因为在其中定义了一个内核模块所需的所有信息，包括：`Author`、`License`、`Description` 等。其中最重要的是 `type` 字段，在其中需要指定内核模块结构的名字。在这个例子中：

```
module! {
    ...
    type: HelloWorld,
    ...
}

struct HelloWorld;

```

#### `module_init()` 与 `module_exit()`

在使用 C 编写的内核模块中，这两个宏定义了模块的入口函数与退出函数。在 Rust 编写的内核模块中，对应的功能由 `trait KernelModule` 和 `trait Drop` 来实现。`trait KernelModule` 中定义 `init()` 函数，会在模块驱动初始化时被调用；`trait Drop` 是 Rust 的内置 trait，其中定义的 `drop()` 函数会在变量生命周期结束时被调用。

#### 编译与链接

所有的内核模块文件会首先被编译成 `.o` 目标文件，之后由内核链接器将这些 `.o` 文件和自动生成的模块目标文件 `.mod.o` 一起链接成为 `.ko` 文件。这个 `.ko` 文件符合动态库 ELF 文件格式，能够被内核识别并加载。

### 其他

完整的介绍 Rust 是如何被集成进内核的文章可以在 [我的 Github](https://github.com/d0u9/Linux-Device-Driver-Rust/tree/master/00_Introduction_to_Rust_Module_in_Linux) 上找到，由于写的仓促，可能存在一些不足，还请见谅。

---

作者：苏子彬，阿里云 PAI 平台开发工程师，主要从事 Linux 系统及驱动的相关开发，曾为 PAI 平台编写 FPGA 加速卡驱动。


硬核观察 #324 因不满厂商不修复被黑客入侵的游戏，玩家入侵了它的另一款游戏

Summary: 更多：• BSD 中也在“传播”新冠 • Ubuntu 21.10 开始利用 Zstd 压缩软件包

图弄岔了。

# 硬核观察 #324 因不满厂商不修复被黑客入侵的游戏，玩家入侵了它的另一款游戏

### 因不满厂商不修复被黑客入侵的游戏，玩家入侵了它的另一款游戏

2019 年年初，已经发行 5 年的《Titanfall》出现了非常严重的漏洞，黑客可以利用漏洞让其他玩家无法游戏。明知道存在这个严重问题，EA 和 Respawn 也不对其进行修复和完善，而依然在 Steam 和 Origin 上积极销售这款游戏。

因对此不满，一名黑客玩家决定以相同方式入侵该游戏开发商的另一款热门游戏《Apex Legends》，导致大量玩家无法正常游戏。黑客玩家希望能通过这种方式引起公众关注，并向 Respawn 施加压力希望修复《Titanfall》。此后，Respawn 在 Twitter 上承认了这些问题，并表示会“积极调查”这些问题。

>
> 以这种方式取得了关注和可能的解决也是够奇葩的。
>
>
>

### BSD 中也在“传播”新冠

DragonFlyBSD 从 NetBSD [移植](https://www.phoronix.com/scan.php?page=news_item&px=DragonFlyBSD-COVID)了一个 COVID 软件包。这个软件包包含了 COVID-19 基因组数据，以及鼓励接种疫苗和其他步骤以帮助防止新冠传播的手册页。这个 `covid` 工具是一个简单的 C 程序，它将打印出早已公开的 COVID-19 基因组。NetBSD 的这个 covid 工具是在 Linus Torvalds 最近鼓励大家接种这种冠状病毒的疫苗之后推出的。

>
> 这是技术人的幽默。
>
>
>

### Ubuntu 21.10 开始利用 Zstd 压缩软件包

过去三年里，整个 Ubuntu/Debian 生态系统已经有了广泛而成熟的 Zstd 支持，它被添加到 Ubuntu 的 APT 和 dpkg 中，只读压缩支持也被移植到 Ubuntu 16.04 LTS 版本。Ubuntu 将在 Ubuntu 21.10 中[切换](https://balintreczey.hu/blog/hello-zstd-compressed-debs-in-ubuntu/)到 zstd 压缩的 .deb 软件包，但这比最初的计划晚了三年。hello/2.10-2ubuntu3 将会是第一个 zstd 压缩的 Ubuntu 软件包。这是继 Fedora RPM 等发行版本之后，又一个主流发行版利用 Facebook 开发的 [Zstandard](https://engineering.fb.com/2018/12/19/core-data/zstandard/) 压缩技术。

>
> 即便是在 Linux 中，一项没有伤害的新技术的普及也需要漫长的时间。
>
>
>


TIOBE 编程社区指数 20 年

Summary: 2021 年 7 月版的 TIOBE 编程社区指数已经出来了，榜单前几名有点拥挤。

# TIOBE 编程社区指数 20 年

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

2021 年 7 月版的 [TIOBE 编程社区指数](https://www.tiobe.com/tiobe-index/)已经出来了，榜单前几名有点拥挤。

该指数首次发布于 2001 年 7 月，当时 TIOBE 首席执行官 Paul Jansen 开始了“一个个人爱好项目，想看看哪些语言有需求”。从那时起，确定一种语言的受欢迎程度（也就是在该指数中的位置）的方法基本保持不变：通过计算列表中的热门搜索引擎的 “+<语言> programming” 的查询的点击率并将其标准化来计算评级。

2004 年，谷歌方式的改变使得 TIOBE 增加了更多的搜索引擎，以减少波动。然而，目前使用的大多数合格的引擎都属于谷歌家族，所以那里的变化仍然会影响整体结果。对该指数的批评往往归结为其意义不大，因为像新版本或临时问题这样的单一事件有可能大大改变排名的结果。

TIOBE 公司成立于 Eindhoven，主要以其 TICS 产品而闻名，这是一个测量软件代码质量的框架。它的名字是“The Importance Of Being Earnest”的缩写，意在反映该公司“真诚和专业的态度”（我们想，这也为奥斯卡•王尔德的鉴赏家提供了一点笑料）。

20 年前，TIOBE 指数的最高排名是由 Java、C 和 C++ 组成的。这与今天的情况没有太大区别，只是 Python 取代了 C++ 的位置，而且这三个顶级竞争者显然比以前更接近。

在连续 15 个月占据最高位置的 C 和排名第三的 Python 之间，这次的差距只有 0.67%。一年前，两者之间的差距约为 7.36%，因此 2020 年的年度语言似乎正处于一个清晰的轨道上。最新一期的 [PYPL 指数](https://pypl.github.io/PYPL.html)已经看到 Python 在那里牢牢占据榜首，它在过去五年中的受欢迎程度增长最快。同时，在 TIOBE 指数中排名第二的 Java 似乎正在继续失去地位。

Jansen [解释](https://www.tiobe.com/tiobe-index/)说 Python 的持续上升与“数据挖掘和人工智能领域的蓬勃发展”有关。然而，这不可能全部的原因，因为像 R、Matlab 和 Julia 这样的语言在该领域也很常见，目前在该榜单中略有回落，要么更多是停滞不前。拥有一个比较成熟的工具生态系统，包括像 NumPy、TensorFlow 和 PyTorch 这样的重量级工具，以及相对稳固的 IDE 支持，肯定有助于 Python 的排名攀升。

除了少数例外，前十名与去年的排名基本保持一致。R 从第 8 位下降到第 12 位，Swift 从第 10 位下降到第 16 位，为中坚力量 PHP 和 SQL 腾出了一点空间。

再往下看，前 30 名中还有一点有趣的变化，Go 从第 20 名爬升到 2 月份的第 13 名。

Rust 也有些许进步，从第 30 位跃升至第 27 位。除其他原因外，这可能是由于人们对 Rust for Linux 项目的兴趣越来越大，该项目旨在为 Linux 内核带来内存安全，并在[最近](https://www.memorysafety.org/blog/supporting-miguel-ojeda-rust-in-linux/)开始获得资金支持。

---

via: <https://devclass.com/2021/07/05/20-years-of-tiobe-programming-community-index-go-gets-a-bounce/>

作者： [Julia Schmidt](https://devclass.com/author/julia/) 选题：[wxy](https://github.com/wxy) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](/article-13553-1.html) 荣誉推出


Jim Hall，你觉得 Fedora 怎么样?

Summary: 我们最近采访了 Jim Hall，了解他是如何使用 Fedora 的。

Fedora稳定么，其实桌面环境最害怕的就是崩溃，Linux比起Windows确实要快速不少

我们最近采访了 Jim Hall，了解他是如何使用 Fedora 的。

# Jim Hall，你觉得 Fedora 怎么样?

我们最近采访了 Jim Hall，了解他是如何使用 Fedora 的。这个 Fedora 杂志 [系列](https://fedoramagazine.org/tag/how-do-you-fedora) 中的一篇。该系列介绍了 Fedora 用户以及他们如何使用 Fedora 来完成任务。如果你对本系列的后继采访感兴趣，请通过 [反馈表](https://fedoramagazine.org/submit-an-idea-or-tip) 与我们联系。

### Jim Hall 是谁？

Jim Hall 曾担任高等教育和政府部门的首席信息官超过 8 年，最近创办了咨询公司 [Hallmentum](https://hallmentum.com/)。他的大部分工作包括培训、研讨会和指导，帮助新的 IT 领导者发展领导技能，也帮助当前的 IT 领导者更好地发挥领导力。除了咨询，Jim 还担任大学的兼职教师，目前教授管理信息系统（MIS）和技术与专业写作课程。

Jim 是如何成长的? Jim 童年时代的英雄来自电视和电影，包括蝙蝠侠和汉索罗。Jim 长期以来最喜欢看的电影是《星球大战：新希望》。Jim 说：“我是一个星球大战迷。”Jim 最喜欢吃意大利菜，“我喜欢意大利菜！我最喜欢的意大利菜可能是炖鸡”。Jim 的观点是，诚实、创造力、想象力、好奇心和开放性是一个人所能拥有的五个好品质。

他喜欢写作，非常好的是他的日常工作主要是写作。他花了很多时间为像 [OpenSource.com](http://OpenSource.com)、 CloudSavvy IT 和 Linux Magazine 等网站撰写“如何”类文章。现在他正在写一本关于 C 编程的书。除了写作，他还玩电子游戏来放松。他有一台 PlayStation 4 游戏机，大多数周六下午他都会坐在电视机前玩游戏。

### Fedora 社区

Jim 从 1993 年开始使用 Linux。他的第一个 Linux 发行版是 Softlanding Linux System（SLS）1.03，运行 Linux 内核 0.99，补丁级别 11。“从那以后，我一直是家里的全职 Linux 用户”。Jim 在很久以前参加了 Fedora Core 时代的一个 Linux 会议之后，开始更多参与到 Fedora 中。Jim 在这遇见了 Tom “Spot” Callaway，他们开始谈论 Fedora。“Spot 鼓励我用另一种方式来做贡献：找到 bug 并报告它们。这就是我参与测试所有 Beta 版本的原因”。

Jim 想在 Fedora 改变什么? 他想在 [getfedora.com](http://getfedora.com) 上看到一个倒计时，告诉大家新的 Beta 版本或新的完整版本是什么时候发布的，这是 Fedora 项目的一个改变。并且 Jim 想让人们都知道，使用 Fedora 是多么容易。“对开源做出贡献最具挑战性的事情是，弄清楚如何做出他们的第一个贡献。”Jim 补充道，“我不知道我和其他开发人员一样是‘Fedora 项目成员’。我只是个用户。但是作为一个从 1993、1994 年就开始参与开发开源软件的人，我努力成为社区中一个有用的成员。因此，我利用一切机会尝试新的 Fedora 版本，甚至是 Beta 版，如果我发现问题，就会告诉大家。”

### 你用什么硬件？

Jim 目前正在运行一台 ThinkCentre M720 Tiny。它配置了第 8 代酷睿 i3-8100T（3.10GHz，6MB 缓存）、32GB（16GB + 16GB）DDR4 2666MHz、英特尔显卡、256GB 固态硬盘 PCIe-NVME Opal M.2、英特尔 8265 802.11AC 和 蓝牙 4.2。他的显示器是华硕 VE248H。 Jim 说：“这一切在Fedora上都很好用！”。

他使用 Perixx Periboard-512 人体工程学经典分体式键盘，它从 1998 年开始取代了他最初的微软 Natural Keyboard Elitee PS/2 键盘。Jim 说： “我有时候会把我的 Perixx 键盘换成 Unicomp 的 IBM Model M USB 克隆键盘。我很喜欢这种带有扣动式弹簧动作的点击式键盘。我的是‘灰白色’，所以它有种经典的外观和感觉”

### 你用什么软件？

Jim 目前运行的是 Fedora 33，之前是 Fedora 33 Beta 和 Fedora 32。Jim 说：“我使用 GNOME 3 作为我的桌面。我发现默认设置适合我的大多数需求，所以我没有加载任何 GNOME 扩展，但我确实使用‘设置’和 ‘GNOME Tweaks’ 调整了一些东西。所以我没有做什么大的改变。例如，我将默认用户界面字体改为使用 Droid Sans Regular 字体。并且我用‘设置’来改变键盘快捷键，用 `Alt-Tab` 键来切换窗口，而不是切换应用程序。我是在 `Alt-Tab` 工作流程中长大的，所以我已经习惯了。”他使用火狐和谷歌浏览器来作为他的 Web 浏览器。

为了经营他的咨询业务，Jim 依赖于一套应用程序：

* 使用 [LibreOffice](https://www.libreoffice.org/) 去写他的书。例如，他去年出版了 《[Coaching Buttons](https://www.amazon.com/Coaching-Buttons-Jim-Hall/dp/0359834930)》，他完全使用 LibreOffice 来写这本书。最近他写了一本关于 [用 C 语言编写 FreeDOS 程序的书](https://www.freedos.org/books/) 也用了 LibreOffice 。

* [INKSCAPE](https://inkscape.org/) 为他创建了矢量格式的公司标志。他的标志可以完美地放大缩小，从文件上的小角落图像到大幅面的海报或横幅。并且 INKSCAPE 允许他导出各种通用格式。Jim 说他的广告合作伙伴很欣赏 INKSCAPE 可以输出到EPS（Encapsulated Postscript），这使得在产品上打印他的标志变得很容易。
* [GIMP](https://www.gimp.org/) 用于其他图形，例如闪屏图片。“我的闪屏图片是我们公司的标志被放在了背景照片上，在我需要额外装饰的地方，比如印刷材料，我用它来替代普通标志。我也在我的网站上使用了闪屏图片的一个版本”。
* [QEMU](https://www.qemu.org/) 用来运行虚拟机，在他那里可以启动 [FreeDOS](https://www.freedos.org/)。“我喜欢使用 QEMU，因为我可以在命令行中设置所有需要的选项，这使我在配置虚拟机时有了很大的灵活性。为了更方便，我将所有选项放入到一个脚本中，用它来运行QEMU，每次都是相同的选项”。

* [Scribus](https://www.scribus.net/) 是用来打印产品的。Scribus 很容易用来创建具有“全出血”的印刷品，这意味着任何颜色的背景都会与纸张的边缘重叠。全出血需要一个特殊的打印准备文件，与打印区域重叠。它甚至还提供了切割标记，以便打印机准确地知道要修剪的位置。

---

via: <https://fedoramagazine.org/jim-hall-how-do-you-fedora/>

作者：[Karimi Hari Priya](https://fedoramagazine.org/author/haripriya21/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[zz-air](https://github.com/zz-air) 校对：[wxy](https://github.com/wxy)

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


Fotoxx：用于管理和编辑大型照片集合的开源应用

# Fotoxx：用于管理和编辑大型照片集合的开源应用

说到 [Linux 中的照片管理软件](https://itsfoss.com/linux-photo-management-software/)，Shotwell 可能是其中最有名的。难怪它在许多发行版中都预装了。

但是，如果你正在寻找一个类似 Shotwell 而速度更快的应用，Fotoxx 可能是一个不错的选择。

它可能没有一个现代的用户界面，但它在处理大量照片集合时速度很快。这一点很重要，因为索引和显示成千上万张照片的缩略图可能需要相当多的时间和计算资源。

### 用 Fotoxx 在 Linux 中管理照片并编辑它们

正如你在上面的截图中看到的，它没有漂亮的界面。看起来更像是一个 2010 年左右的应用。它在视觉上的不足，在功能和性能上得到了弥补。

你可以导入大量的照片，包括 RAW 图像。这些图片保持原样。它们不会被复制或移动。它们只是在应用中被索引。

你可以编辑图像元数据，如标签、地理标签、日期、评级、标题等。你可以根据这些元数据来搜索图片。

它还有一个地图功能，可以分组并显示属于某个地点的图片（基于图片上的地理标签数据）。

由于它专注于管理大型照片集合，有几个批处理功能，可以重命名、调整大小、复制/移动、转换图像格式和编辑元数据。

你可以选择图片来创建相册和幻灯片，所有这些都是在去重图片的情况下进行的。照片可以组合成 360 度的全景图。

Fotoxx 还有几个编辑功能，可以用来修饰图片，添加效果（如素描、绘画）、修剪、旋转等。

还有一些选项可以去除旧的、扫描照片打印件上的红眼和尘斑。

我可以继续列举功能清单，但这太长了。它的网站描述了它的[全部功能](https://kornelix.net/fotoxx/fotoxx.html)，你应该去看看。

### 在 Linux 上安装 Fotoxx

请记住，**Fotoxx 的开发者建议使用一台强大的计算机**，有 4 个以上的 CPU 核心，16GB 以上的内存，以便正常运行。较小的计算机可能会很慢，或可能无法编辑大型图像。

Fotoxx 在大多数 Linux 发行版中都有，如 Debian、Ubuntu、Fedora 和 Arch Linux。只需使用你的发行版的包管理器或软件中心来搜索 Fotoxx 并安装它。

在基于 Ubuntu 和 Debian 的发行版上，你可以使用 apt 命令来安装它，像这样：

```
sudo apt install fotoxx

```

当你第一次运行它时，它会要求搜索主目录中的图像。你可以继续使用它，或者将搜索位置限制在选定的文件夹。

我注意到，尽管在一分钟左右的时间内索引了 4700 多张，但它并没有立即开始显示图片。我不得不**点击 Gallery->All Folders，然后选择文件夹，然后它就显示了图片**。所以，这一点要记住。

Fotoxx 是一个功能广泛的工具，你需要一些时间来适应它并探索它的[所有功能](https://kornelix.net/fotoxx/fotoxx.html)。它的网站列出了几个例子，你应该看看。

正如我前面所说，它不是最漂亮的应用，但它大量的功能列表可以完成任务。如果你是一个摄影师或有大量的图片收藏，你可以试试 Fotoxx，看看它是否符合你的需要。当你试过后，请在评论区分享你的经验。

---

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

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

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


硬核观察 #325 孙正义以 16 亿美元买下了“雅虎”在日本的名称权

Summary: 更多：• 波兰极客用一张软盘运行了最新的 Linux 系统 • 减肥失败的 Firefox Lite 终于胖死了

# 硬核观察 #325 孙正义以 16 亿美元买下了“雅虎”在日本的名称权

### 孙正义以 16 亿美元买下了“雅虎”在日本的名称权

雅虎曾经是孙正义早期的大笔投资之一，他随后成立了合资公司雅虎日本，随着雅虎出售其核心资产，该公司变成了 Z 控股公司。这次孙正义终于又将雅虎这个名字拿了回来，软银同意以 16 亿美元的价格[购买](https://www.bloomberg.com/news/articles/2021-07-06/the-yahoo-brand-is-still-worth-1-6-billion-to-masayoshi-son)雅虎在日本的名称权。这笔交易是在 Verizon 的媒体部门以 50 亿美元的价格出售给私募股权公司 Apollo 之后进行的。

>
> 雅虎这个传奇的互联网品牌，虽然日暮西山，但总还是有人在意它的。就是不知道雅虎在中国的名称权是不是还有人在意。
>
>
>

### 波兰极客用一张软盘运行了最新的 Linux 系统

曾经用软盘运行 Linux 操作系统是可行的，但是随着 Linux 越来越复杂，一张软盘已经不足以承载一个 Linux 系统了。一位波兰极客采用最新的 Linux 5.13 内核、BusyBox 将 Linux 放到一张 1.44MB 的 3 英寸[软盘](https://bits.p1x.in/floppinux-an-embedded-linux-on-a-single-floppy/)中，并且可以运行其上的磁盘杂志。当然，这种极度精简的系统所能运行的应用非常有限。感兴趣的同学，可以跟着[教程](https://bits.p1x.in/floppinux-an-embedded-linux-on-a-single-floppy/)做一张自己的软盘 Linux，即便是你没有软驱和软盘，你也可以在 QEMU 中体验一下。

>
> 虽然没有太多的实用价值，但是这种极客乐趣才是最重要的。
>
>
>

### 减肥失败的 Firefox Lite 终于胖死了

Firefox Lite 是为 Mozilla 为特定市场提供的精简版本，不过 Mozilla 宣布已经于 6 月 30 日停止支持。2017 年它以 Firefox Rocket 名字出现，其重点是运行速度快，同时最大限度地减少数据使用。不幸的是经过多次版本更新，Firefox Lite 到 2020 年已经变得臃肿不堪。Mozilla 表示结束对 Firefox Lite 的开发和支持是因为重新设计的 Firefox 应用程序的速度足以使“精简版”成为多余。

>
> 可见“减肥”有多重要。
>
>
>


如何解析 Bash 程序的配置文件

# 如何解析 Bash 程序的配置文件

>
> 将配置文件与代码分离，使任何人都可以改变他们的配置，而不需要任何特殊的编程技巧。
>
>
>

<img src="content_image/album_202107_08_163606y3287i6c7dqq0223.jpg" alt="" title="bash logo on green background">

将程序配置与代码分离是很重要的。它使非程序员能够改变配置而不需要修改程序的代码。如果是编译好的二进制可执行文件，这对非程序员来说是不可能的，因为它不仅需要访问源文件（我们在开源程序中会这样），而且还需要程序员的技能组合。很少有人有这种能力，而且大多数人都不想学习它。

对于像 Bash 这样的 shell 语言，由于 shell 脚本没有被编译成二进制格式，所以从定义上讲，源码是可以访问的。尽管有这种开放性，但对于非程序员来说，在 shell 脚本中钻研和修改它们并不是一个特别好的主意。即使是经验丰富的开发人员和系统管理员，也会意外地做出一些导致错误或更糟的改变。

因此，将配置项放在容易维护的文本文件中，提供了分离，并允许非程序员编辑配置，而不会有对代码进行意外修改的危险。许多开发者对用编译语言编写的程序都是这样做的，因为他们并不期望用户是开发者。由于许多相同的原因，对解释型 shell 语言这样做也是有意义的。

### 通常的方式

和其他许多语言一样, 你可以为 Bash 程序编写代码，来读取并解析 ASCII 文本的配置文件、读取变量名称并在程序代码执行时设置值。例如，一个配置文件可能看起来像这样：

```
var1=LinuxGeek46
var2=Opensource.com

```

程序将读取文件，解析每一行，并将值设置到每个变量中。

### 源引

Bash 使用一种更简单的方法来解析和设置变量, 叫做<ruby> 源引 <rt>  sourcing </rt></ruby>。从一个可执行的 shell 程序中获取一个外部文件是一种简单的方法，可以将该文件的内容完整地引入 shell 程序中。在某种意义上，这很像编译语言的 `include` 语句，在运行时包括库文件。这样的文件可以包括任何类型的 Bash 代码，包括变量赋值。

（LCTT 译注：对于使用 `source` 或 `.` 命令引入另外一个文件的行为，我们首倡翻译为“源引”。）

像往常一样，演示比解释更容易。

首先，创建一个 `~/bin` 目录（如果它还不存在的话），并将其作为当前工作目录（PWD）。[Linux 文件系统分层标准](http://refspecs.linuxfoundation.org/fhs.shtml) 将 `~/bin` 定义为用户存储可执行文件的适当位置。

在这个目录下创建一个新文件。将其命名为 `main`，并使其可执行：

```
[dboth@david bin]$ touch main
[dboth@david bin]$ chmod +x main
[dboth@david bin]$

```

在这个可执行文件中添加以下内容：

```
#!/bin/bash
Name="LinuxGeek"
echo $Name

```

并执行这个 Bash 程序：

```
[dboth@david bin]$ ./main
LinuxGeek
[dboth@david bin]$

```

创建一个新的文件并命名为 `~/bin/data`。这个文件不需要是可执行的。在其中添加以下信息：

```
# Sourced code and variables
echo "This is the sourced code from the data file."
FirstName="David"
LastName="Both"

```

在 `main` 程序中增加三行，看起来像这样：

```
#!/bin/bash
Name="LinuxGeek"
echo $Name
source ~/bin/data
echo "First name: $FirstName"
echo "LastName: $LastName"

```

重新运行该程序：

```
[dboth@david bin]$ ./main
LinuxGeek
This is the sourced code from the data file.
First name: David
LastName: Both
[dboth@david bin]$

```

关于源引还有一件非常酷的事情要知道。你可以使用一个单点（`.`）作为 `source` 命令的快捷方式。改变 `main` 文件，用 `.` 代替 `source`。

```
#!/bin/bash
Name="LinuxGeek"
echo $Name
. ~/bin/data
echo "First name: $FirstName"
echo "LastName: $LastName"

```

并再次运行该程序。其结果应该与之前的运行完全相同。

### 运行 Bash

每一台使用 Bash 的 Linux 主机（几乎所有主机都是，因为 Bash 是所有发行版的默认 shell），都包括一些优秀的、内置的源引示例。

每当 Bash shell 运行时，它的环境必须被配置成可以使用的样子。有五个主要文件和一个目录用于配置 Bash 环境。它们和它们的主要功能如下：

* `/etc/profile`: 系统级的环境和启动程序
* `/etc/bashrc`: 系统级的函数和别名
* `/etc/profile.d/`: 包含系统级的脚本的目录，用于配置各种命令行工具，如 `vim` 和 `mc` 以及系统管理员创建的任何自定义配置脚本
* `~/.bash_profile`: 用户特定的环境和启动程序
* `~/.bashrc`: 用户特定的别名和函数
* `~/.bash_logout`: 用户特定的命令，在用户注销时执行

试着通过这些文件追踪执行顺序，确定它在非登录 Bash 初始化和登录 Bash 初始化中使用的顺序。我在我的 Linux 培训系列《[使用和管理 Linux：从零到系统管理员](http://www.both.org/?page_id=1183)》的第一卷第 17 章中这样做过。

给你一个提示。这一切都从 `~/.bashrc` 脚本开始。

### 总结

这篇文章探讨了在 Bash 程序中引用代码和变量的方法。这种从配置文件中解析变量的方法是快速、简单和灵活的。它提供了一种将 Bash 代码与变量赋值分开的方法，以使非程序员能够设置这些变量的值。

---

via: <https://opensource.com/article/21/6/bash-config>

作者：[David Both](https://opensource.com/users/dboth) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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