使用 virtualenvwrapper 构建 Python 虚拟环境

Summary: 虚拟环境是安全地使用不同版本的 Python 和软件包组合的关键。

虚拟环境是安全地使用不同版本的 Python 和软件包组合的关键。

# 使用 virtualenvwrapper 构建 Python 虚拟环境

>
> 虚拟环境是安全地使用不同版本的 Python 和软件包组合的关键。
>
>
>

Python 对管理虚拟环境的支持，已经提供了一段时间了。Python 3.3 甚至增加了内置的 `venv` 模块，用于创建没有第三方库的环境。Python 程序员可以使用几种不同的工具来管理他们的环境，我使用的工具叫做 [virtualenvwrapper](https://virtualenvwrapper.readthedocs.io/en/latest/index.html)。

虚拟环境是将你的 Python 项目及其依赖关系与你的系统安装的 Python 分离的一种方式。如果你使用的是基于 macOS 或 Linux 的操作系统，它很可能在安装中附带了一个 Python 版本，事实上，它很可能依赖于那个特定版本的 Python 才能正常运行。但这是你的计算机，你可能想用它来达到自己的目的。你可能需要安装另一个版本的 Python，而不是操作系统提供的版本。你可能还需要安装一些额外的库。尽管你可以升级你的系统 Python，但不推荐这样做。你也可以安装其他库，但你必须注意不要干扰系统所依赖的任何东西。

虚拟环境是创建隔离的关键，你需要安全地修改不同版本的 Python 和不同组合的包。它们还允许你为不同的项目安装同一库的不同版本，这解决了在相同环境满足所有项目需求这个不可能的问题。

为什么选择 `virtualenvwrapper` 而不是其他工具？简而言之：

* 与 `venv` 需要在项目目录内或旁边有一个 `venv` 目录不同，`virtualenvwrapper` 将所有环境保存在一个地方：默认在 `~/.virtualenvs` 中。
* 它提供了用于创建和激活环境的命令，而且激活环境不依赖于找到正确的 `activate` 脚本。它只需要（从任何地方）`workon projectname`而不需要 `source ~/Projects/flashylights-env/bin/activate`。

### 开始使用

首先，花点时间了解一下你的系统 Python 是如何配置的，以及 `pip` 工具是如何工作的。

以树莓派系统为例，该系统同时安装了 Python 2.7 和 3.7。它还提供了单独的 `pip` 实例，每个版本一个：

* 命令 `python` 运行 Python 2.7，位于 `/usr/bin/python`。
* 命令 `python3` 运行 Python 3.7，位于 `/usr/bin/python3`。
* 命令 `pip` 安装 Python 2.7 的软件包，位于 `/usr/bin/pip`。
* 命令 `pip3` 安装 Python 3.7 的包，位于 `/usr/bin/pip3`。

在开始使用虚拟环境之前，验证一下使用 `python` 和 `pip` 命令的状态是很有用的。关于你的 `pip` 实例的更多信息可以通过运行 `pip debug` 或 `pip3 debug` 命令找到。

在我运行 Ubuntu Linux 的电脑上几乎是相同的信息（除了它是 Python 3.8）。在我的 Macbook 上也很相似，除了唯一的系统 Python 是 2.6，而我用 `brew` 安装 Python 3.8，所以它位于 `/usr/local/bin/python3`（和 `pip3` 一起）。

### 安装 virtualenvwrapper

你需要使用系统 Python 3 的 `pip` 安装 `virtualenvwrapper`：

```
sudo pip3 install virtualenvwrapper

```

下一步是配置你的 shell 来加载 `virtualenvwrapper` 命令。你可以通过编辑 shell 的 RC 文件（例如 `.bashrc`、`.bash_profile` 或 `.zshrc`）并添加以下几行：

```
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
source /usr/local/bin/virtualenvwrapper.sh

```

如果你的 Python 3 位于其他地方，请根据你的设置修改第一行。

关闭你的终端，然后重新打开它，这样才能生效。第一次打开终端时，你应该看到 `virtualenvwrapper` 的一些输出。这只会发生一次，因为一些目录是作为设置的一部分被创建的。

现在你应该可以输入 `mkvirtualenv --version` 命令来验证 `virtualenvwrapper` 是否已经安装。

### 创建一个新的虚拟环境

假设你正在进行一个名为 `flashylights` 的项目。要用这个名字创建一个虚拟环境，请运行该命令：

```
mkvirtualenv flashylights

```

环境已经创建并激活，所以你会看到 `(flashlylights)` 出现在你的提示前：

现在环境被激活了，事情发生了变化。`python` 现在指向一个与你之前在系统中识别的 Python 实例完全不同的 Python 实例。它为你的环境创建了一个目录，并在其中放置了 Python 3 二进制文件、pip 命令等的副本。输入 `which python` 和 `which pip` 来查看它们的位置。

如果你现在运行一个 Python 程序，你可以用 `python` 代替 `python3` 来运行，你可以用 `pip` 代替 `pip3`。你使用 `pip`安装的任何包都将只安装在这个环境中，它们不会干扰你的其他项目、其他环境或系统安装。

要停用这个环境，运行 `deactivate` 命令。要重新启用它，运行 `workon flashylights`。

你可以用 `workon` 或使用 `lsvirtualenv` 列出所有可用的环境。你可以用 `rmvirtualenv flashylights` 删除一个环境。

在你的开发流程中添加虚拟环境是一件明智的事情。根据我的经验，它可以防止我在系统范围内安装我正在试验的库，这可能会导致问题。我发现 `virtualenvwrapper` 是最简单的可以让我进入流程的方法，并无忧无虑地管理我的项目环境，而不需要考虑太多，也不需要记住太多命令。

### 高级特性

* 你可以在你的系统上安装多个 Python 版本（例如，在 Ubuntu 上使用 [deadsnakes PPA](https://tooling.bennuttall.com/deadsnakes/)），并使用该版本创建一个虚拟环境，例如，`mkvirtualenv -p /usr/bin/python3.9 myproject`。
* 可以在进入和离开目录时自动激活、停用。
* 你可以使用 `postmkvirtualenv` 钩子在每次创建新环境时安装常用工具。

更多提示请参见[文档](https://virtualenvwrapper.readthedocs.io/en/latest/tips.html)。

*本文基于 Ben Nuttall 在 [Tooling Tuesday 上关于 virtualenvwrapper 的帖子](https://tooling.bennuttall.com/virtualenvwrapper/)，经许可后重用。*

---

via: <https://opensource.com/article/21/2/python-virtualenvwrapper>

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


基础设施代码化（IaC）的自动化配置与编排

# 基础设施代码化（IaC）的自动化配置与编排

云上运维，那就是和云上资源和产品打交道，无疑会涉及到一系列的资源部署。比如简单地使用一台云服务器，就需要运维人员依次创建 VPC、VSwitch、安全组和云服务器实例，如果想创建一个集群，那还要进一步创建负载均衡、数据库和多个云服务器实例。

随着业务规模的不断扩大，IT系统和环境日益复杂，人工一个一个创建资源的方式显然不可取，许多人正在转向自动化资源部署和配置的工具。

本文将基于基础设施即代码 IaC 理念，分享如何借助自动化编排工具实现自动化部署，使得运上运维工作更为高效。

### 手动/半手动云上运维的五大痛点

对于云上资源的部署，如果你的云上运维还处于手动或是半手动运维阶段，那么大部分工作是通过控制台选择特定资源规格参数进行创建，还有一部分是使用 CLI（如 aliyun-cli）或者 SDK 直接调用接口来创建资源。但随着企业的云上业务规模不断扩大，不论是哪种方式，或多或少都会遇到下述五个问题：

* **部署效率低。**手动创建对于创建少量种类的资源来说倒是种很直观的方式，但一旦涉及到大量不同资源时，尤其是资源之间还有依赖关系，这时候会发现需要在不同的产品控制台之间来回切换，还要时刻关注创建进度，才能再去创建下一个依赖它的资源，整个过程所耗费的时间和精力可想而知，相信不少人有深有体会。
* **可复制性差。**当手动创建好了一系列的资源后，如果需要针对不同的环境（如预发、测试和生产）或不同的地域（如北京和上海）创建完全相同的资源，则又需要花费很多时间一步步地进行操作，无法直接复制、做到一键部署。
* **一致性差。**手动创建还有一个非常大的问题，那就是非常容易出现配置错误，很难保证两套环境中各个资源配置是完全相同的。
* **管理困难。**资源的创建只是开始，可能还需要针对这批资源做扩缩容、更新特定资源的规格等操作。但手动运维的方式就导致没有统一管理这批资源的入口，仍需要分别到各产品控制台上操作。随着资源数越来越多，资源管理就愈发难以维护。
* **难以 DevOps。**每次开发、测试或部署软件应用程序时都可能需要手动部署基础设施，既无法对基础设施进行版本控制，也无法对其变动进行评审，更无法做到敏捷部署。

其实，我们都知道这些问题的背后是因为资源的部署还未做到自动化。但这些问题也不断促使着我们思考应该通过什么样的方式来解决这些痛点，才能让整个资源部署过程自动化。

### 引入基础设施即代码 IaC 理念，实现云上资源自动化部署

在真正做到自动化部署之前，不妨回头看看所需要创建的云服务资源（如 VPC、VSwitch、ECS 实例等），它们相对于Web服务等应用程序来说都是云上的基础设施，如果把这些基础设施想象成一段“代码”，在“代码”中定义产品、规格、数量等信息，那么是不是就可以通过这段“代码”来管理整个基础设施了呢？

**这就是<ruby> 基础设施即代码 <rp>  （ </rp> <rt>  Infrastructure as Code </rt> <rp>  ） </rp></ruby>（IaC）的理念，将基础设施配置视为软件编程。**Kief Morris 在《Infarftruce as Code》一书中对基础设施即代码是这么定义的：

>
> “基础设施即代码是一种使用新的技术来构建和管理动态基础设施的方式。它把基础设施、工具和服务以及对基础设施的管理本身作为一个软件系统，采纳软件工程实践以结构化的安全的方式来管理对系统的变更。”
>
>
>

引入 IaC 的理念，运维人员可以将基础设施的部署和管理过程变得敏捷：

* 在模板（宽泛意义上的代码）中定义基础设施，即各类云资源及其规格、数量等属性、云资源之间的依赖；
* 使用版本控制（如 Git）管理模板，并提交评审；
* 通过评审后由自动化部署工具使用模板来创建/更新基础设施；

基础设施的部署和管理变得便捷后，上述提到的手动运维/半手动运维的痛点问题就可以得到很好的解决：

* **提升部署效率。**使用自动化部署工具进行部署，相对于人工部署的效率将大大提升。
* **标准化和一致性。**将基础设施的内容通过模板的形式保存，对基础设施的变更由对模板的变更来实现，实现了基础设施管理的标准化。此外，使用相同的模板在不同地域部署，也能够保证资源的一致性。
* **易于管理。**对基础设施的管理不再分散于各个产品控制台，而统一到单个模板，使得管理成本大大降低。
* **敏捷化工作流程。**通过基础设施管理流程的规范化和标准化，资源部署的整个过程就变得敏捷。
* **审计和回滚。**对模板进行版本管理，使得对基础设施变动的审计和回退到某个特定版本成为了可能。

### 四个常见的 IaC 自动化配置与编排工具

当前，有很多 IaC 自动化部署工具，有第三方资源编排工具，也有云服务商提供的云原生的资源编排工具，这里介绍四个自动化配置与编排工具：

1. **阿里云资源编排服务 ROS**（Resource Orchestration Service），这是云原生编排工具，通过编写 JSON/YAML 格式的模板，在模板中定义所需的ECS实例、数据库实例等云服务资源以及资源依赖关系等，然后再根据模板在 ROS 中创建资源栈，ROS 服务端将根据模板自动完成所有资源的创建和配置，实现自动化部署及运维。而资源栈则管理着模板中定义的所有资源，并可通过新模板来更新资源栈，包括资源的新增、更新或删除等操作。
2. **AWS CloudFormation**，也是云原生的编排工具，运维人员也是通过 JSON/YAML 格式的模板定义云服务资源，通过资源栈管理这些资源。
3. **HashiCorp Terraform**，这是一个开源的自动化编排工具。以配置文件为驱动，可以在文件中定义所要管理的组件，即基础设施资源，以此生成一个可执行的计划，通过执行这个计划来完成所定义组件的创建，增量式的变更和持续的管理。如果不可执行，会提示报错。Terraform 不仅可以管理 IaaS 层的资源，如计算实例、网络实例和存储实例等，也可以管理更上层的服务，如DNS 域名和解析记录、SaaS 应用的功能等。
4. **Pulumi**，与 Terraform 一样也是开源项目，但它与 Terraform 的重要区别在于：可以用熟悉的编程语言来编写声明式配置，而不需要额外学习云服务商特定的模板语言来写配置。

对于自动化配置与编排工具的选择，笔者的建议是：

1. **如果你的业务部署在单一云平台，就选择云平台提供的资源编排工具，在阿里云平台就用 ROS、在 AWS 平台就用 CloudFormation，原因很简单：云平台提供的工具是云原生，是免费的托管服务，在服务端就可以执行自动化部署；同时，它还实现了云原生的访问控制、编排资源与实际资源差异检测等功能，用起来比较省心。**
2. **如果你的业务是部署在多个云平台，建议使用第三方的 Terraform 和 Pulumi，因为它不仅可以进行多云资源的部署和管理，还能管理除云以外的其他资源，如 Kubernetes。**

### 如何利用编排工具进行自动化部署和管理？

对于运维人员来说，使用 IaC 理念的自动化部署工具的门槛其实不高，使用步骤也非常简单，主要来说就是编写模板和使用模板。这里谈谈编写模板和使用模板有哪些注意事项，如何才能更好地利用工具、更好地提升运维效率。

#### 1、编写模板的三个注意事项

确认好自动化部署工具，就可以根据不同工具的模板语言来编写对应的模板文件。如果你选择云服务商提供的云原生的编排工具， 编写模板这里，有三点注意事项想重点提醒一下：

1. **注意资源的依赖关系。**不恰当的依赖或少了依赖都会导致资源创建出错。
2. **注意使用通用属性作为参数。**比如实例规格等就是比较通用的属性，建议使用同一份模板，指定不同的参数来达到部署不同规格实例的目的。
3. **使用有价值的属性作为输出。**比如实例 ID、连接地址等内容就是有价值的属性，它们都是在资源创建完成后才能获取到，把这些属性作为整个模板的输出，可以方便后续的查看和管理。

#### 2、自动解析依赖关系，自动化部署基础设施

编写完模板后，就可以通过对应的自动化部署工具将模板转化为真正的资源。上述提到的编排工具都能解析资源的依赖关系，并能先后创建这些资源。同时，对于互不依赖的资源也能够并行创建。

* 对于阿里云 ROS 和 AWS CloudFormation 来说，可使用模板来创建一个资源栈。一个资源栈即一组云上资源，也就是在模板中定义的基础设施。后续当需要增/删/改一些资源时，也是通过使用模板来更新资源栈来达到目的。
* 对于 Terraform 来说，可使用配置文件生成一个可执行的计划，通过执行这个计划来完成所定义资源/组件的创建，增量式的变更和持续的管理。
* 对于 Pulumi 来说，则是直接执行代码来进行部署。

这样的部署方式既能使得资源能按照合理的顺序创建出来，又能够提升部署效率，在遇到异常情况时也会进行一定程度的重试，真正让整个自动化部署过程变得稳定和高效。

### 以基础设施代码化为基础，进一步高效运维

当运维工作完成整个基础设施模板化后，DevOps 就变得更加容易。我们可以使用版本管理工具（如 Git）管理描述当前基础设施的模板，使用阿里云云效/AWS CodePipline/Jenkins 创建一个从代码提交触发到人工卡点再到资源栈部署的流水线，这样整个基础设施的管理就会变得更加敏捷和自动化。

*图1： 基础设施变更的流程图*

1. 在每次变更模板后，将本地仓库的分支内容推送到远程仓库，并发起评审；
2. 若评审不通过，则修改模板后重新发起评审；若评审通过，则自动触发流水线；
3. 流水线触发人工卡点，通知上级管理员检查此次变更。若不同意，则终止；若同意，则进入下一个步骤；
4. 若是首次提交模板，则创建资源栈（即创建基础设施）；反之，则更新资源栈（即更新基础设施）。

#### 基础设施变更及预览

IT 基础设施并非一成不变，随着业务的变化，我们可能面临扩缩容场景，也可能面临整个架构的变化。好在基于 IaC 的理念，我们只需要描述基础设施最新配置，而不用担心如何进行变更。但即使如此，我们需要在变更前知道究竟会发生哪些变化。阿里云ROS 和 AWS CloudFormation 的更改集功能，Terraform 的执行计划均能让我们提前了解到变更内容。

例如，由于业务变化，在基于图1的架构基础上，在阿里云平台上新增一台 ECS 实例，并使用 SLB 实例为两台 ECS 实例做负载均衡。在编写好新的模板后，就可以使用更改集功能来感知变化，下图是 阿里云ROS 的一个变更示例：

在确认无误后，便可以执行变更。随后，自动化编排工具便会对整个基础设施进行更新，根据模板发生的变化来决定新增、更改或删除哪些资源。

#### 基础设施偏差检测和纠正

尽管使用了自动化编排工具部署资源，仍可能有部分人员会通过非标准化的方式（比如通过控制台或 API）修改了基础设施中部分资源的属性，使得资源实际情况和模板中定义的资源产生了差异。好的自动化编排工具不仅具备检测基础设施实际属性和模板中定义的属性之间差异的能力；还能基于差异结果纠正模板或实际资源，使得模板和基础设施保持一致。

当前，通过 阿里云 ROS 和 AWS CloudFormation 的偏差检测能力，就可以轻松地发现实际资源和模板中定义的资源之间的差异，并可通过偏差纠正功能使模板内容和实际资源保持一致。

### 总结

在 IT 基础设施全面上云的趋势下，云上手工运维的方式已难以为继，出现了部署效率低、可复制性差、一致性差、管理困难、难以 DevOps 等痛点。阿里云 ROS/AWS CloudFormation/Terraform/Pulumi 等自动化编排工具都是基于基础设施即代码（IaC）的理念，可以通过模板来定义基础设施，同时标准化和自动化整个部署过程，配合更改集、偏差检测等能力，再结合流水线，真正实现了 IT 基础设施管理的 DevOps。建议运维人员可以重点关注和巧用工具，将帮助你更好的提升运维效率，解放生产力。

---

作者介绍：

王斌鑫，从事阿里云弹性计算资源编排工具的研发工作，热爱开源和写作。阿里云凌云时刻出品人、PyCon China出品人。


Summary: 更多：• Google 表示不再为广告而跟踪用户 • 美国空军要求逆向工程 B-2 隐形轰炸机的关键零件

Google: 就算不用Cookie,我也知道你是谁

# 硬核观察 | 华为称，鸿蒙中有 Android 代码，但将不包含 Google 贡献的

### 华为称，鸿蒙中有 Android 代码，但将不包含 Google 贡献的

华为消费者业务软件部总裁王成录今年初曾表示，鸿蒙不是 Android 或 iOS 的拷贝，面对鸿蒙 V2 中包含 Android 代码的质疑，王成录在采访中[回应](https://mp.weixin.qq.com/s/fIQyqzNML6GN2AiZXAeQ5Q)称，“并不是所有 Android 代码都是 Google 开发的，绝大部分代码来自开源社区。鸿蒙也会吸收社区的优秀技术和代码，用了 AOSP（Android 开源项目）的开源代码，就判断鸿蒙是 Android 换了皮，说明这类吐槽者没有太准确理解什么是开源。今年 10 月，鸿蒙第三阶段的开源代码会上线，来自 AOSP 社区的、由 Google 贡献的代码几乎没有了。”

这份采访中透露的信息量非常大。

### Google 表示不再为广告而跟踪用户

Google 准备杀死跟踪用户在网上活动的 cookie，[称](https://blog.google/products/ads-commerce/a-more-privacy-first-web/)它没有计划构建新的用户身份识别符，因为它并不需要为了广告而[跟踪个别用户](https://arstechnica.com/gadgets/2021/03/google-claims-it-will-stop-tracking-individual-users-for-ads/)。

Google 称，聚合、匿名化和设备本地处理等隐私保护技术的进步提供了一条清晰的道路替代个人身份识别符，广告商不需要跟踪用户就能受益于数字广告。

说不清这到底是一种进步还是退步，总之，广告是少不了的。

### 美国空军要求逆向工程 B-2 隐形轰炸机的关键零件

B-2 单价高达 24 亿美元，总共只造了 20 架，相关零部件显然早就停产了。利用新的技术[逆向工程](https://www.thedrive.com/the-war-zone/39537/the-air-force-needs-to-reverse-engineer-parts-of-its-own-stealth-bomber)制造出合适的零部件可能比重启生产更廉价。美国政府对 B-2 隐形轰炸机的关键零件负载热交换器的逆向工程发出招标，要求在交付时提供完整的技术数据。

这就像回家忘记带钥匙找开锁公司一样。


不懂代码的人也可以干的 4 种技术工作

Summary: 对于不是工程师的人来说也有很多技术工作可以做。

对于不是工程师的人来说也有很多技术工作可以做。

# 不懂代码的人也可以干的 4 种技术工作

>
> 对于不是工程师的人来说也有很多技术工作可以做。本文作为本系列的第二篇，就具体阐述这些工作。
>
>
>

在 [本系列的第一篇文章](/article-13168-1.html) 中，我解释了技术行业如何将人员和角色划分为“技术”或“非技术”类别，以及与此相关的问题。科技行业使得那些对科技感兴趣但不懂编程的人很难找到适合自己的角色。

如果你对技术或开源感兴趣，但对编程不感兴趣，这也有一些工作适合你。科技公司的任何一个职位都可能需要一个精通科技但不一定会写代码的人。但是，你确实需要了解术语并理解产品。

我最近注意到，在诸如技术客户经理、技术产品经理、技术社区经理等职位头衔上增加了“技术”一词。这反映了几年前的趋势，即在头衔上加上“工程师”一词，以表示该职位的技术需要。过了一段时间，每个人的头衔中都有“工程师”这个词，这样的分类就失去了一些吸引力。

当我坐下来写这些文章时，Tim Banks 的这条推特出现在我的通知栏上：

>
> 已经将职业生涯规划为技术行业的非开发人员（除了信息安全、数据科学/分析师、基础设施工程师等以外的人员）的女性，你希望知道的事情有哪些，有价值的资源有哪些，或者对希望做出类似改变的人有哪些建议？
>
>
> —— Tim Banks is a buttery biscuit (@elchefe) [December 15，2020](https://twitter.com/elchefe/status/1338933320147750915?ref_src=twsrc%5Etfw)
>
>
>

这遵循了我第一篇文章中的建议：Tim 并不是简单地询问“非技术角色”；他提供了更重要的详细描述。在 Twitter 这样的媒体上，每一个字符都很重要，这些额外的字符会产生不同的效果。这些是技术角色。如果为了节约笔墨，而简单的称呼他们为“非技术人员”，会改变你的原意，产生不好的影响。

以下是需要技术知识的非工程类角色的示例。

### 技术作者

[技术作者的工作](https://opensource.com/article/17/5/technical-writing-job-interview-tips) 是在两方或多方之间传递事实信息。传统上，技术作者提供有关如何使用技术产品的说明或文档。最近，我看到术语“技术作者”指的是写其他形式内容的人。科技公司希望一个人为他们的开发者读者写博客文章，而这种技巧不同于文案或内容营销。

**需要的技术技能：**

* 写作
* 特定技术或产品的用户知识或经验
* 快速跟上新产品或新特性的速度的能力
* 在各种环境中创作的技能

**适合人群：**

* 可以清楚地提供分步说明
* 享受合作
* 对活跃的声音和音乐有热情
* 喜欢描述事物和解释原理

### 产品经理

[产品经理](https://opensource.com/article/20/2/product-management-open-source-company) 负责领导产品战略。职责可能包括收集客户需求并确定其优先级，撰写业务案例，以及培训销售人员。产品经理跨职能工作，利用创造性和技术技能的结合，成功地推出产品。产品经理需要深厚的产品专业知识。

**所需技术技能：**

* 掌握产品知识，并且会配置或运行演示模型
* 与产品相关的技术生态系统知识
* 分析和研究技能

**适合以下人群：**

* 享受制定战略和规划下一步的工作
* 在不同的人的需求中可以看到一条共同的线索
* 能够清楚地表达业务需求和要求
* 喜欢描述原因

### 数据分析师

数据分析师负责收集和解释数据，以帮助推动业务决策，如是否进入新市场、瞄准哪些客户或在何处投资。这个角色需要知道如何使用所有可用的潜在数据来做出决策。我们常常希望把事情简单化，而数据分析往往过于简单化。获取正确的信息并不像编写查询 `select all limit 10` 来获取前 10 行那么简单。你需要知道要加入哪些表。你需要知道如何分类。你需要知道是否需要在运行查询之前或之后以某种方式清理数据。

**所需技术技能：**

* 了解 SQL、Python 和 R
* 能够看到和提取数据中的样本
* 了解事物如何端到端运行
* 批判性思维
* 机器学习

**适合以下人群：**

* 享受解决问题的乐趣
* 渴望学习和提出问题

### 开发者关系

[开发者关系](https://www.marythengvall.com/blog/2019/5/22/what-is-developer-relations-and-why-should-you-care) 是一门相对较新的技术学科。它包括 <ruby>   开发者代言人  <rt>  developer advocate </rt></ruby>、<ruby> 开发者传道者 <rt>  developer evangelist </rt></ruby>和<ruby> 开发者营销 <rt>  developer marketing </rt></ruby>等角色。这些角色要求你与开发人员沟通，与他们建立关系，并帮助他们提高工作效率。你向公司倡导开发者的需求，并向开发者代表公司。开发者关系可以包括撰写文章、创建教程、录制播客、在会议上发言以及创建集成和演示。有人说你需要做过开发才能进入开发者关系。我没有走那条路，我知道很多人没有。

**所需技术技能：**

这些将高度依赖于公司和具体角色。你需要部分技能（不是全部）取决于你自己。

* 了解与产品相关的技术概念
* 写作
* 教程和播客的视频和音频编辑
* 说话

**适合以下人群：**

* 有同情心，想要教导和授权他人
* 可以为他人辩护
* 你很有创意

### 无限的可能性

这并不是一个完整的清单，并没有列出技术领域中所有的非工程类角色，而是一些不喜欢每天编写代码的人可以尝试的工作。如果你对科技职业感兴趣，看看你的技能和什么角色最适合。可能性是无穷的。为了帮助你完成旅程，在本系列的最后一篇文章中，我将与这些角色的人分享一些建议。

---

via: <https://opensource.com/article/21/2/non-engineering-jobs-tech>

作者：[Dawn Parzych](https://opensource.com/users/dawnparzych) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Chao-zhi](https://github.com/Chao-zhi) 校对：[wxy](https://github.com/wxy)

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


硬核观察 | 密码学家发表论文宣称破解了 RSA 加密系统

Summary: 更多：• 去年三分之二的勒索软件活动来自“勒索软件即服务” • 微软为 Excel 增加了新的防病毒集成，以在运行时阻止 XLM 恶意宏脚本

# 硬核观察 | 密码学家发表论文宣称破解了 RSA 加密系统

### 密码学家发表论文宣称破解了 RSA 加密系统

近日，德国密码学家施诺尔在预印本网站上传论文称自己破解了 RSA 加密系统。此事引起密码学界和量子密码界的广泛关注。RSA 加密算法是 1977 年提出的，其名字来源于三位作者的名字字头。这一算法利用大素数分解困难的特性，如果想要破解密码，需要花费很长时间进行大量运算。当前，许多对信息安全性要求较高的领域都大量采用 RSA 非对称加密算法，可以说是如今的信息技术的基石之一。

目前该论文尚未得到学术界的同行审议，是否真正破解了 RSA 还存疑。如果确实破解了 RSA 或提出了一个可行的方向，那对现在的信息技术所构建起来的信息社会的冲击是无疑是巨大的。

### 去年三分之二的勒索软件活动来自“勒索软件即服务”

事实证明，勒索软件攻击仍然非常有利可图，组织最严密的团伙每个受害者都能赚取数百万美元，因此许多网络犯罪分子都想兑现这种攻击，但没有能力自己编码和分发。这就是勒索软件即服务（RaaS）的作用，这些联盟计划为低级攻击者提供了分发和管理勒索软件活动的能力，而勒索软件背后的开发者则从每个勒索受害者的解密密钥报酬中获得分成。

对勒索软件作为服务的需求如此之大，以至于 2020 年期间出现了 15 个新的[勒索软件联盟计划](https://www.group-ib.com/resources/threat-research/ransomware-2021.html)，包括 Thanos、Avaddon、SunCrypt 等。

最重要的不是在被勒索后付出赎金，而是在一开始就切断入侵的渠道和采用必要的安全措施。

### 微软为 Excel 增加了新的防病毒集成，以在运行时阻止 XLM 恶意宏脚本

自上世纪 90 年代以来，宏恶意软件一直是黑客的热门选择。微软多年来一直在使用其反恶意软件扫描接口（AMSI）来剔除宏恶意软件，但其成功地剔除用 VBA 编写的宏脚本的努力最终将攻击者推向了一种名为 XLM 的旧宏语言，该语言在 1992 年随 Excel 4.0 一起出现。虽然 XLM 在 1993 年被 VBA 取代，但一些客户仍在使用 XLM，因此 Excel 仍支持它。

现在，微软正在扩大其 [AMSI 与 Office 365 的集成](https://www.microsoft.com/security/blog/2021/03/03/xlm-amsi-new-runtime-defense-against-excel-4-0-macro-malware/)，包括在运行时扫描 Excel 4.0 XLM 宏，使 AMSI 也可以检测 XLM 宏。

没有脚本功能的 Office 软件没有灵魂，但是脚本其实是麻烦之源。我觉得微软内置对恶意脚本的检测是非常必要的。


逐行解读 MIT 许可证

Summary: 每个程序员都应该明白的 171 个字。

好，希望多一点这样的开源协议有关的内容

每个程序员都应该明白的 171 个字。

# 逐行解读 MIT 许可证

>
> 每个程序员都应该明白的 171 个字。
>
>
>

[MIT 许可证](http://spdx.org/licenses/MIT) 是世界上最流行的开源软件许可证。以下是它的逐行解读。

### 阅读许可证

如果你参与了开源软件，但还没有花时间从头到尾的阅读过这个许可证（它只有 171 个单词），你需要现在就去读一下。尤其是如果许可证不是你日常每天都会接触的，把任何看起来不对劲或不清楚的地方记下来，然后继续阅读。我会分段、按顺序、加入上下文和注释，把每一个词再重复一遍。但最重要的还是要有个整体概念。

>
> The MIT License (MIT)
>
>
> Copyright (c) <year> <copyright holders>
>
>
> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
>
>
> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
>
>
> *The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the Software.*
>
>
>

（LCTT 译注：MIT 许可证并无官方的中文文本，我们也没找到任何可靠的、精确的非官方中文文本。在本文中，我们仅作为参考目的提供一份逐字逐行而没有经过润色的中文翻译文本，但该文本及对其的理解**不能**作为 MIT 许可证使用，我们也不为此中文翻译文本的使用承担任何责任，这份中文文本，我们贡献给公共领域。）

>
> MIT 许可证（MIT）
>
>
> 版权 (c) <年份> <版权人>
>
>
> 特此免费授予任何获得本软件副本和相关文档文件（下称“软件”）的人不受限制地处置该软件的权利，包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本，以及再授权被配发了本软件的人如上的权利，须在下列条件下：
>
>
> 上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。
>
>
> 本软件是“如此”提供的，没有任何形式的明示或暗示的保证，包括但不限于对适销性、特定用途的适用性和不侵权的保证。在任何情况下，作者或版权持有人都不对任何索赔、损害或其他责任负责，无论这些追责来自合同、侵权或其它行为中，还是产生于、源于或有关于本软件以及本软件的使用或其它处置。
>
>
>

该许可证分为五段，按照逻辑划分如下：

* **头部**
	+ **许可证名称**：“MIT 许可证”
	+ **版权说明**：“版权 (c) …”
* **许可证授予**：“特此授予 …”
	+ **授予范围**：“… 处置软件 …”
	+ **条件**：“… 须在 …”
		- **归因和声明**：“上述 … 应包含在 …”
		- **免责声明**：“本软件是‘如此’提供的 …”
		- **责任限制**：“在任何情况下 …”

接下来详细看看。

### 头部

#### 许可证名称

>
> The MIT License (MIT)
>
>
>

>
> MIT 许可证（MIT）
>
>
>

“MIT 许可证”不是一个单一的许可证，而是根据<ruby> 麻省理工学院 <rt>  Massachusetts Institute of Technology </rt></ruby>（MIT）为发行版本准备的语言衍生出来一系列许可证形式。多年来，无论是对于使用它的原始项目，还是作为其他项目的范本，它经历了许多变化。Fedora 项目一直保持着 [收藏 MIT 许可证的好奇心](https://fedoraproject.org/wiki/Licensing:MIT?rd=Licensing/MIT)，以纯文本的方式记录了那些平淡的变化，如同泡在甲醛中的解剖标本一般，追溯了它的各种演变。

幸运的是，<ruby>   开放源码倡议组织  <rt>  Open Source Initiative </rt></ruby>（OSI） 和 <ruby>   软件数据包交换  <rt>  Software Package Data eXchange </rt></ruby>组织（SPDX）已经将一种通用的 MIT 式的许可证形式标准化为“<ruby> MIT 许可证 <rt>  The MIT License </rt></ruby>”。OSI 反过来又采用了 SPDX 通用开源许可证的标准化 [字符串标志符](http://spdx.org/licenses/)，并将其中的 “MIT” 明确指向了标准化形式的“MIT 许可证”。如果你想为一个新项目使用 MIT 式的条款，请使用其 [标准化的形式](http://spdx.org/licenses/MIT)。

即使你在 `LICENSE` 文件中包含 “The MIT License” 或 “SPDX:MIT”，任何负责的审查者仍会将文本与标准格式进行比较，以确保安全。尽管自称为“MIT 许可证”的各种许可证形式只在细微的细节上有所不同，但所谓的“MIT 许可证”的松散性已经诱使了一些作者加入麻烦的“自定义”。典型的糟糕、不好的、非常坏的例子是 [JSON 许可证](https://spdx.org/licenses/JSON)，一个 MIT 家族的许可证被加上了“本软件应用于善，而非恶”。这件事情可能是“非常克罗克福特”的（LCTT 译者注，Crockford 是 JSON 格式和 [JSON.org](http://JSON.org) 的作者）。这绝对是一件麻烦事，也许这个玩笑本来是开在律师身上的，但他们却笑得前仰后合。

这个故事的寓意是：“MIT 许可证”本身就是模棱两可的。大家可能很清楚你的意思，但你只需要把标准的 MIT 许可证文本复制到你的项目中，就可以节省每个人的时间。如果使用元数据（如包管理器中的元数据文件）来指定 “MIT 许可证”，请确保 `LICENSE` 文件和任何头部的注释都使用标准的许可证文本。所有的这些都可以 [自动化完成](https://www.npmjs.com/package/licensor)。

#### 版权声明

>
> Copyright (c)
>
>
>

>
> 版权 (c) <年份> <版权持有人>
>
>
>

在 1976 年（美国）《版权法》颁布之前，美国的版权法规要求采取具体的行动，即所谓的“手续”来确保创意作品的版权。如果你不遵守这些手续，你起诉他人未经授权使用你的作品的权力就会受到限制，往往会完全丧失权力，其中一项手续就是“<ruby> 声明 <rt>  notice </rt></ruby>”。在你的作品上打上记号，以其他方式让市场知道你拥有版权。“©” 是一个标准符号，用于标记受版权保护的作品，以发出版权声明。ASCII 字符集没有 © 符号，但 `Copyright (c)` 可以表达同样的意思。

1976 年的《版权法》“落实”了国际《<ruby> 伯尔尼公约 <rt>  Berne Convention </rt></ruby>》的许多要求，取消了确保版权的手续。至少在美国，著作权人在起诉侵权之前，仍然需要对自己的版权作品进行登记，如果在侵权行为开始之前进行登记，可能会获得更高的赔偿。但在实践中，很多人在对某个人提起诉讼之前，都会先注册版权。你并不会因为没有在上面贴上声明、注册它、向国会图书馆寄送副本等而失去版权。

即使版权声明不像过去那样绝对必要，但它们仍然有很多用处。说明作品的创作年份和版权属于谁，可以让人知道作品的版权何时到期，从而使作品纳入公共领域。作者或作者们的身份也很有用。美国法律对个人作者和“公司”作者的版权条款的计算方式不同。特别是在商业用途中，公司在使用已知竞争对手的软件时，可能也要三思而行，即使许可条款给予了非常慷慨的许可。如果你希望别人看到你的作品并想从你这里获得许可，版权声明可以很好地起到归属作用。

至于“<ruby> 版权持有人 <rt>  copyright holder </rt></ruby>”。并非所有标准形式的许可证都有写明这一点的空间。最新的许可证形式，如 [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) 和 [GPL 3.0](https://www.gnu.org/licenses/gpl-3.0.en.html)，发布的许可证文本是要逐字复制的，并在其他地方加上标题注释和单独文件，以表明谁拥有版权并提供许可证。这些办法巧妙地阻止了对“标准”文本的意外或故意的修改。这还使自动许可证识别更加可靠。

MIT 许可证是从为机构发布的代码而写的语言演变而来。对于机构发布的代码，只有一个明确的“版权持有人”，即发布代码的机构。其他机构抄袭了这些许可证，用他们自己的名字代替了 “MIT”，最终形成了我们现在拥有的通用形式。这一过程同样适用于该时代的其他简短的机构许可证，特别是加州大学伯克利分校的最初的 <ruby>   四条款 BSD 许可证  <rt>  four-clause BSD License </rt></ruby> 成为了现在使用的 [三条款](https://spdx.org/licenses/BSD-3-Clause) 和 [两条款](https://spdx.org/licenses/BSD-2-Clause) 变体，以及 MIT 许可证的变体<ruby> 互联网系统联盟 <rt>  Internet Systems Consortium </rt></ruby>的 [ISC 许可证](http://www.isc.org/downloads/software-support-policy/isc-license/)。

在每一种情况下，该机构都根据版权所有权规则将自己列为版权持有人，这些规则称为“[雇佣作品](http://worksmadeforhire.com/)”规则，这些规则赋予雇主和客户在其雇员和承包商代表其从事的某些工作中的版权所有权。这些规则通常不适用于自愿提交代码的分布式协作者。这给项目监管型基金会（如 Apache 基金会和 Eclipse 基金会）带来了一个问题，因为它们接受来自更多不同的贡献者的贡献。到目前为止，通常的基础方法是使用一个单一的许可证，它规定了一个版权持有者，如 [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) 和 [EPL 1.0](https://www.eclipse.org/legal/epl-v10.html)，并由<ruby> 贡献者许可协议 <rt>  contributor license agreements </rt></ruby> [Apache CLA](https://www.apache.org/licenses/#clas) 以及 [Eclipse CLA](https://wiki.eclipse.org/ECA) 为后盾，以从贡献者中收集权利。在像 GPL 这样的<ruby> 左版 <rt>  copyleft </rt></ruby>许可证下，将版权所有权收集在一个地方就更加重要了，因为 GPL 依靠版权所有者来执行许可证条件，以促进软件自由的价值。

如今，大量没有机构或商业管理人的项目都在使用 MIT 风格的许可条款。SPDX 和 OSI 通过标准化不涉及特定实体或机构版权持有人的 MIT 和 ISC 之类的许可证形式，为这些用例提供了帮助。有了这些许可证形式，项目作者的普遍做法是在许可证的版权声明中尽早填上自己的名字...也许还会在这里或那里填上年份。至少根据美国的版权法，由此产生的版权声明并不能说明全部情况。

软件的原始所有者保留其工作的所有权。但是，尽管 MIT 风格的许可条款赋予了他人开发和更改软件的权利，创造了法律上所谓的“衍生作品”，但它们并没有赋予原始作者对他人的贡献的所有权。相反，每个贡献者在以现有代码为起点所做的任何作品都拥有版权，[即使是稍做了一点创意](https://en.wikipedia.org/wiki/Feist_Publications,_Inc.,_v._Rural_Telephone_Service_Co.)。

这些项目大多数也对接受<ruby> 贡献者许可协议 <rt>  contributor license agreements </rt></ruby>（CLA）的想法嗤之以鼻，更不用说签署版权转让协议了。这既幼稚又可以理解。尽管一些较新的开源开发人员认为，在 GitHub 上发送<ruby> 拉取请求 <rt>  Pull Request </rt></ruby>，就会“自动”根据项目现有的许可证条款授权分发贡献，但美国法律不承认任何此类规则。强有力的版权保护是默认的，而不是宽松许可。

>
> 更新：GitHub 后来修改了全站的服务条款，包括试图至少在 [GitHub.com](http://GitHub.com) 上改变这一默认值。我在 [另一篇文章](https://writing.kemitchell.com/2017/02/16/Against-Legislating-the-Nonobvious.html) 中写了一些对这一发展的想法，并非所有想法都是积极的。
>
>
>

为了填补法律上有效的、有据可查的贡献权利授予与完全没有纸质痕迹之间的差距，一些项目采用了 <ruby>   开发者原创证书  <rt>  Developer Certificate of Origin </rt></ruby>，这是贡献者在 Git 提交中使用 `Signed-Off-By` 元数据标签暗示的标准声明。开发者原创证书是在臭名昭著的 SCO 诉讼之后为 Linux 内核开发而开发的，该诉讼称 Linux 的大部分代码源自 SCO 拥有的 Unix 源代码。作为创建显示 Linux 的每一行都来自贡献者的书面记录的一种方法，开发者原创证书的功能良好。尽管开发者原创证书不是许可证，但它确实提供了大量证据，证明提交代码的人希望项目分发其代码，并让其他人根据内核现有的许可证条款使用该代码。内核还维护着一个机器可读的 `CREDITS` 文件，其中列出了贡献者的名字、所属机构、贡献领域和其他元数据。我做了 [一些](https://github.com/berneout/berneout-pledge) [实验](https://github.com/berneout/authors-certificate)，把这种方法改编成适用于不使用内核开发流程的项目。

### 许可证授权

>
> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”),
>
>
>

>
> 特此免费授予任何获得本软件副本和相关文档文件（下称“软件”）的人
>
>
>

MIT 许可证的实质是许可证（你猜对了）。一般来说，许可证是一个人或法律实体（“<ruby> 许可人 <rt>  licensor </rt></ruby>”）给予另一个人（“<ruby> 被许可人 <rt>  licensee </rt></ruby>”）做一些法律允许他们起诉的事情的许可。MIT 许可证是一种不起诉的承诺。

法律有时将许可证与给予许可证的承诺区分开来。如果有人违背了提供许可证的承诺，你可以起诉他们违背了承诺，但你最终可能得不到许可证。“<ruby> 特此 <rt>  Hereby </rt></ruby>”是律师们永远摆脱不了的一个矫揉造作、老生常谈的词。这里使用它来表明，许可证文本本身提供了许可证，而不仅仅是许可证的承诺。这是一个合法的 [即调函数表达式（IIFE）](https://en.wikipedia.org/wiki/Immediately-invoked_function_expression)。

尽管许多许可证都是授予特定的、指定的被许可人的，但 MIT 许可证是一个“<ruby> 公共许可证 <rt>  public license </rt></ruby>”。公共许可证授予所有人（整个公众）许可。这是开源许可中的三大理念之一。MIT 许可证通过“向任何获得……软件副本的人”授予许可证来体现这一思想。稍后我们将看到，获得此许可证还有一个条件，以确保其他人也可以了解他们的许可。

在美国式法律文件中，括号中带引号的首字母大写词汇是赋予术语特定含义的标准方式（“定义”）。当法庭看到文件中其他地方使用了一个已定义的大写术语时，法庭会可靠地回顾定义中的术语。

#### 授权范围

>
> to deal in the Software without restriction,
>
>
>

>
> 不受限制地处置该软件的权利，
>
>
>

从被许可人的角度来看，这是 MIT 许可证中最重要的七个字。主要的法律问题就是因侵犯版权而被起诉，和因侵犯专利而被起诉。无论是版权法还是专利法都没有将 “<ruby> 处置 <rt>  to deal in </rt></ruby>” 作为一个术语，它在法庭上没有特定的含义。因此，任何法庭在裁决许可人和被许可人之间的纠纷时，都会询问当事人对这一措辞的含义和理解。法庭将看到的是，该措辞有意宽泛和开放。它为被许可人提供了一个强有力的论据，反对许可人提出的任何主张 —— 即他们不允许被许可人使用该软件做那件特定的事情，即使在授予许可证时双方都没有明显想到。

>
> including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
>
>
>

>
> 包括不受限制地使用、复制、修改、合并、发布、分发、转授许可和/或出售该软件副本，以及再授权被配发了本软件的人如上的权利，
>
>
>

没有一篇法律是完美的、“意义上完全确定”、或明确无误的。小心那些假装不然的人。这是 MIT 许可证中最不完美的部分。主要有三个问题：

首先，“<ruby> 包括不受限制地 <rt>  including without limitation </rt></ruby>”是一种法律反模式。它有多种衍生：

* <ruby> 包括，但不受限制 <rt>  including, without limitation </rt></ruby>
* <ruby> 包括，但不限于前述的一般性 <rt>  including, without limiting the generality of the foregoing </rt></ruby>
* <ruby> 包括，但不限于 <rt>  including, but not limited to </rt></ruby>
* 很多、很多毫无意义的变化

所有这些都有一个共同的目标，但都未能可靠地实现。从根本上说，使用它们的起草者也会尽量试探着去做。在 MIT 许可证中，这意味着引入“<ruby> 处置软件 <rt>  dealing in the Software </rt></ruby>”的具体例子 — “使用、复制、修改”等等，但不意味着被许可方的行为必须与给出的例子类似，才能算作“处置”。问题是，如果你最终需要法庭来审查和解释许可证的条款，法庭将把它的工作看作是找出这些语言的含义。如果法庭需要决定“<ruby> 处置 <rt>  deal in </rt></ruby>”的含义，它不能“无视”这些例子，即使你告诉它。我认为，“不受限制地处置本软件”本身对被许可人更好，也更短。

其次，作为“<ruby> 处置 <rt>  deal in </rt></ruby>”的例子的那些动词是一个大杂烩。有些在版权法或专利法下有特定的含义，有些稍微有或根本没有含义：

* “<ruby> 使用 <rt>  use </rt></ruby>”出现在 [《美国法典》第 35 篇，第 271(a)节](https://www.govinfo.gov/app/details/USCODE-2017-title35/USCODE-2017-title35-partIII-chap28-sec271)，这是专利法中专利权人可以起诉他人未经许可的行为的清单。
* “<ruby> 复制 <rt>  copy </rt></ruby>”出现在 [《美国法典》第 17 篇，第 106 节](https://www.govinfo.gov/app/details/USCODE-2017-title17/USCODE-2017-title17-chap1-sec106)，即版权法列出的版权所有人可以起诉他人未经许可的行为。
* “<ruby> 修改 <rt>  modify </rt></ruby>”既不出现在版权法中，也不出现在专利法中。它可能最接近版权法下的“<ruby> 准备衍生作品 <rt>  prepare derivative works </rt></ruby>”，但也可能涉及改进或其他衍生发明。
* 无论是在版权法还是专利法中，“<ruby> 合并 <rt>  merge </rt></ruby>”都没有出现。“<ruby> 合并 <rt>  merger </rt></ruby>”在版权方面有特定的含义，但这显然不是这里的意图。相反，法庭可能会根据其在行业中的含义来解读“合并”，如“合并代码”。
* 无论是在版权法还是专利法中，都没有“<ruby> 发布 <rt>  publish </rt></ruby>”。由于“软件”是被发布的内容，根据《[版权法](https://www.govinfo.gov/app/details/USCODE-2017-title17/USCODE-2017-title17-chap1-sec106)》，它可能最接近于“<ruby> 分发 <rt>  distribute </rt></ruby>”。该法令还包括“公开”表演和展示作品的权利，但这些权利只适用于特定类型的受版权保护的作品，如戏剧、录音和电影。
* “<ruby> 分发 <rt>  distribute </rt></ruby>”出现在《[版权法](https://www.govinfo.gov/app/details/USCODE-2017-title17/USCODE-2017-title17-chap1-sec106)》中。
* “<ruby> 转授许可 <rt>  sublicense </rt></ruby>”是知识产权法中的一个总称。转授许可的权利是指把自己的许可证授予他人，有权进行你所许可的部分或全部活动。实际上，MIT 许可证的转授许可的权利在开源代码许可证中并不常见。通常的做法是 Heather Meeker 所说的“<ruby> 直接许可 <rt>  direct licensing </rt></ruby>”方式，在这种方法中，每个获得该软件及其许可证条款副本的人都直接从所有者那里获得授权。任何可能根据 MIT 许可证获得转授许可的人都可能会得到一份许可证副本，告诉他们其也有直接许可证。
* “<ruby> 出售副本 <rt>  sell copies </rt></ruby>”是个混杂品。它接近于《[专利法](https://www.govinfo.gov/app/details/USCODE-2017-title35/USCODE-2017-title35-partIII-chap28-sec271)》中的“<ruby> 要约出售 <rt>  offer to sell </rt></ruby>”和“<ruby> 出售 <rt>  sell </rt></ruby>”，但指的是“<ruby> 副本 <rt>  coyies </rt></ruby>”，这是一种版权概念。在版权方面，它似乎接近于“<ruby> 分发 <rt>  distribute </rt></ruby>”，但《[版权法](https://www.govinfo.gov/app/details/USCODE-2017-title17/USCODE-2017-title17-chap1-sec106)》没有提到销售。
* “<ruby> 允许被配发了本软件的人这样做 <rt>  permit persons to whom the Software is furnished to do so </rt></ruby>”似乎是多余的“转授许可”。这也是不必要的，因为获得副本的人也可以直接获得许可证。

最后，由于这种法律、行业、一般知识产权和一般使用条款的混杂，并不清楚 MIT 许可证是否包括专利许可。一般性语言“<ruby> 处置 <rt>  deal in </rt></ruby>”和一些例子动词，尤其是“使用”，指向了一个专利许可，尽管是一个非常不明确的许可。许可证来自于版权持有人，而版权持有人可能对软件中的发明拥有或不拥有专利权，以及大多数的例子动词和“<ruby> 软件 <rt>  the Software </rt></ruby>”本身的定义，都强烈地指向版权许可证。诸如 [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0) 之类的较新的宽容开源许可分别具体地处理了版权、专利甚至商标问题。

#### 三个许可条件

>
> subject to the following conditions:
>
>
>

>
> 须在下列条件下：
>
>
>

总有一个陷阱！MIT 许可证有三个！

如果你不遵守 MIT 许可证的条件，你就得不到许可证提供的许可。因此，如果不能履行条件，至少从理论上说，会让你面临一场诉讼，很可能是一场版权诉讼。

开源软件的第二个伟大思想是，利用软件对被许可人的价值来激励被许可人遵守条件，即使被许可人没有支付任何许可费用。最后一个伟大思想，在 MIT 许可证中没有，它构建了许可证条件：像 [GNU 通用公共许可证](https://www.gnu.org/licenses/gpl-3.0.en.html)（GPL）这样的左版许可证，使用许可证条件来控制如何对修改后的版本进行许可和发布。

#### 声明条件

>
> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
>
>
>

>
> 上述版权声明和本许可声明应包含在该软件的所有副本或实质成分中。
>
>
>

如果你给别人一份软件的副本，你需要包括许可证文本和任何版权声明。这有几个关键目的：

1. 给别人一个声明，说明他们有权使用该公共许可证下的软件。这是直接授权模式的一个关键部分，在这种模式下，每个用户直接从版权持有人那里获得许可证。
2. 让人们知道谁是软件的幕后人物，这样他们就可以得到赞美、荣耀和冷冰冰的现金捐赠。
3. 确保保修免责声明和责任限制（在后面）伴随该软件。每个得到该副本的人也应该得到一份这些许可人保护的副本。

没有什么可以阻止你对提供一个副本、甚至是一个没有源代码的编译形式的副本而收费。但是当你这么做的时候，你不能假装 MIT 代码是你自己的专有代码，也不能在其他许可证下提供。接受的人要知道自己在“公共许可证”下的权利。

坦率地说，遵守这个条件正在崩溃。几乎所有的开源许可证都有这样的“<ruby> 归因 <rt>  attribution </rt></ruby>”条件。系统和装机软件的制作者往往明白，他们需要为自己的每一个发行版本编制一个声明文件或“许可证信息”屏，并附上库和组件的许可证文本副本。项目监管型基金会在教授这些做法方面起到了重要作用。但是整个 Web 开发者群体还没有取得这种经验。这不能用缺乏工具来解释，工具有很多，也不能用 npm 和其他资源库中的包的高度模块化来解释，它们统一了许可证信息的元数据格式。所有好的 JavaScript 压缩器都有保存许可证标题注释的命令行标志。其他工具可以从包树中串联 `LICENSE` 文件。这实在是没有借口。

#### 免责声明

>
> The Software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement.
>
>
>

>
> 本软件是“如此”提供的，没有任何形式的明示或暗示的保证，包括但不限于对适销性、特定用途的适用性和不侵权的保证。
>
>
>

美国几乎每个州都颁布了一个版本的《<ruby> 统一商业法典 <rt>  Uniform Commercial Code </rt></ruby>》（UCC），这是一部规范商业交易的示范性法律。UCC 的第 2 条（加利福尼亚州的“第 2 部分”）规定了商品销售合同，包括了从二手汽车的购买到向制造厂运送大量工业化学品。

UCC 关于销售合同的某些规则是强制性的。这些规则始终适用，无论买卖双方是否喜欢。其他只是“默认”。除非买卖双方以书面形式选择不适用这些默认，否则 UCC 潜在视作他们希望在 UCC 文本中找到交易的基准规则。默认规则中包括隐含的“<ruby> 免责 <rt>  warranties </rt></ruby>”，或卖方对买方关于所售商品的质量和可用性的承诺。

关于诸如 MIT 许可证之类的公共许可证是合同（许可方和被许可方之间的可执行协议）还是仅仅是许可证（单向的，但可能有附加条件），这在理论上存在很大争议。关于软件是否被视为“商品”，从而触发 UCC 规则的争论较少。许可人之间没有就赔偿责任进行辩论：如果他们免费提供的软件出现故障、导致问题、无法正常工作或以其他方式引起麻烦，他们不想被起诉和被要求巨额赔偿。这与“<ruby> 默示保证 <rt>  implied warranty </rt></ruby>”的三个默认规则完全相反：

1. 据 [UCC 第 2-314 节](https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=2314.&lawCode=COM)，“<ruby> 适销性 <rt>  merchantability </rt></ruby>”的默示保证是一种承诺：“商品”（即软件）的质量至少为平均水平，并经过适当包装和标记，并适用于其常规用途。仅当提供该软件的人是该软件的“商人”时，此保证才适用，这意味着他们从事软件交易，并表现出对软件的熟练程度。
2. 据 [UCC 第 2-315 节](https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=2315.&lawCode=COM)，当卖方知道买方依靠他们提供用于特定目的的货物时，“<ruby> 适用于某一特定目的 <rt>  fitness for a particular purpose </rt></ruby>”的默示保证就会生效。商品实际上需要“适用”这一目的。
3. “<ruby> 非侵权 <rt>  noninfringement </rt></ruby>”的默示保证不是 UCC 的一部分，而是一般合同法的共同特征。如果事实证明买方收到的商品侵犯了他人的知识产权，则这种默示的承诺将保护买方。如果根据 MIT 许可证获得的软件实际上并不属于尝试许可该软件的许可人，或者属于他人拥有的专利，那就属于这种情况。

UCC 的 [第2-316（3）节](https://leginfo.legislature.ca.gov/faces/codes_displaySection.xhtml?sectionNum=2316.&lawCode=COM) 要求，选择不适用或“排除”适销性和适用于某一特定目的的默示保证措辞必须醒目。“醒目”意味着书面化或格式化，以引起人们的注意，这与旨在从不小心的消费者身边溜走的细小字体相反。各州法律可以对不侵权的免责声明提出类似的引人注目的要求。

长期以来，律师们都有一种错觉，认为用“全大写”写任何东西都符合明显的要求。这是不正确的。法庭曾批评律师协会自以为是，而且大多数人都认为，全大写更多的是阻止阅读，而不是强制阅读。同样的，大多数开源许可证的形式都将其免责声明设置为全大写，部分原因是这是在纯文本的 `LICENSE` 文件中唯一明显的方式。我更喜欢使用星号或其他 ASCII 艺术，但那是很久很久以前的事了。

#### 责任限制

>
> In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the Software or the use or other dealings in the Software.
>
>
>

>
> 在任何情况下，作者或版权持有人都不对任何索赔、损害或其他责任负责，无论这些追责来自合同、侵权或其它行为中，还是产生于、源于或有关于本软件以及本软件的使用或其它处置。
>
>
>

MIT 许可证授予软件“免费”许可，但法律并不认为接受免费许可证的人在出错时放弃了起诉的权利，而许可人应该受到责备。“责任限制”，通常与“损害赔偿排除”条款搭配使用，其作用与许可证很像，是不起诉的承诺。但这些都是保护许可人免受被许可人起诉的保护措施。

一般来说，法庭对责任限制和损害赔偿排除条款的解读非常谨慎，因为这些条款可以将大量的风险从一方转移到另一方。为了保护社会的切身利益，让民众有办法纠正在法庭上所犯的错误，他们“严格地”用措辞限制责任，尽可能地对受其保护的一方进行解读。责任限制必须具体才能成立。特别是在“消费者”合同和其他放弃起诉权的人缺乏成熟度或讨价还价能力的情况下，法庭有时会拒绝尊重那些似乎被埋没在视线之外的措辞。部分是出于这个原因，部分是出于习惯，律师们往往也会给责任限制以全大写处理。

再往下看，“责任限制”部分是对被许可人可以起诉的金额上限。在开源许可证中，这个上限总是没有钱，0 元，“不承担责任”。相比之下，在商业许可证中，它通常是过去 12 个月内支付的许可证费用的倍数，尽管它通常是经过谈判的。

“排除”部分具体列出了各种法律主张，即请求赔偿的理由，许可人不能使用。像许多其他法律形式一样，MIT 许可证 提到了“<ruby> 违约 <rt>  of contract </rt></ruby>”行为（即违反合同）和“<ruby> 侵权 <rt>  of tort </rt></ruby>”行为。侵权规则是防止粗心或恶意伤害他人的一般规则。如果你在发短信时在路上撞倒了人，你就犯了侵权行为。如果你的公司销售的有问题的耳机会烧伤人们的耳朵，则说明贵公司已经侵权。如果合同没有明确排除侵权索赔，那么法庭有时会在合同中使用排除措辞以防止合同索赔。出于很好的考虑，MIT 许可证抛出“或其它”字样，只是为了截住奇怪的海事法或其它异国情调的法律主张。

“<ruby> 产生于、源于或有关于 <rt>  arising from, out of or in connection with </rt></ruby>”这句话是法律起草人固有的、焦虑的不安全感反复出现的症状。关键是，任何与软件有关的诉讼都被这些限制和排除范围所覆盖。万一某些事情可以“<ruby> 产生于 <rt>  arising from </rt></ruby>”，但不能“<ruby> 源于 <rt>  out of </rt></ruby>”或“<ruby> 有关于 <rt>  in connection with </rt></ruby>”，那就最好把这三者都写在里面，所以要把它们打包在一起。更不用说，任何被迫在这部分内容中斤斤计较的法庭将不得不为每个词提出不同的含义，前提是专业的起草者不会在一行中使用不同的词来表示同一件事。更不用说，在实践中，如果法庭对一开始就不利的限制感觉不好，那么他们会更愿意狭隘地解读范围触发器。但我离题了，同样的语言出现在数以百万计的合同中。

### 总结

所有这些诡辩都有点像在进教堂的路上吐口香糖。MIT 许可证是一个法律经典，且有效。它绝不是解决所有软件知识产权弊病的灵丹妙药，尤其是它比已经出现的软件专利灾难还要早几十年。但 MIT 风格的许可证发挥了令人钦佩的作用，实现了一个狭隘的目的，用最少的、谨慎的法律工具组合扭转了版权、销售和合同法等棘手的默认规则。在计算机技术的大背景下，它的寿命是惊人的。MIT 许可证已经超过、并将要超过绝大多数软件许可证。我们只能猜测，当它最终失去青睐时，它能提供多少年的忠实法律服务。对于那些无法提供自己的律师的人来说，这尤其慷慨。

我们已经看到，我们今天所知道的 MIT 许可证是如何成为一套具体的、标准化的条款，使机构特有的、杂乱无章的变化终于有了秩序。

我们已经看到了它对归因和版权声明的处理方法如何为学术、标准、商业和基金会机构的知识产权管理实践提供信息。

我们已经看到了 MIT 许可证是如何运行所有人免费试用软件的，但前提是要保护许可人不受担保和责任的影响。

我们已经看到，尽管有一些生硬的措辞和律师的矫揉造作，但一百七十一个小词可以完成大量的法律工作，为开源软件在知识产权和合同的密集丛林中开辟一条道路。

我非常感谢所有花时间阅读这篇相当长的文章的人，让我知道他们发现它很有用，并帮助改进它。一如既往，我欢迎你通过 [e-mail](mailto:kyle@kemitchell.com)、[Twitter](https://twitter.com/kemitchell) 和 [GitHub](https://github.com/kemitchell/writing/tree/master/_posts/2016-09-21-MIT-License-Line-by-Line.md) 发表评论。

---

有很多人问，他们在哪里可以读到更多的东西，或者找到其他许可证，比如 GNU 通用公共许可证或 Apache 2.0 许可证。无论你的兴趣是什么，我都会向你推荐以下书籍:

* Andrew M. St. Laurent 的 [Understanding Open Source & Free Software Licensing](https://lccn.loc.gov/2006281092)，来自 O’Reilly。

>
> 我先说这本，因为虽然它有些过时，但它的方法也最接近上面使用的逐行方法。O'Reilly 已经把它[放在网上](http://www.oreilly.com/openbook/osfreesoft/book/)。
>
>
>
* Heather Meeker 的 [Open (Source) for Business](https://www.amazon.com/dp/1511617772)

>
> 在我看来，这是迄今为止关于 GNU 通用公共许可证和更广泛的左版的最佳著作。这本书涵盖了历史、许可证、它们的发展，以及兼容性和合规性。这本书是我给那些考虑或处理 GPL 的客户的书。
>
>
>
* Larry Rosen 的 [Open Source Licensing](https://lccn.loc.gov/2004050558)，来自 Prentice Hall。

>
> 一本很棒的入门书，也可以免费 [在线阅读](http://www.rosenlaw.com/oslbook.htm)。对于从零开始的程序员来说，这是开源许可和相关法律的最好介绍。这本在一些具体细节上也有点过时了，但 Larry 的许可证分类法和对开源商业模式的简洁总结经得起时间的考验。
>
>
>

所有这些都对我作为一个开源许可律师的教育至关重要。它们的作者都是我的职业英雄。请读一读吧 — K.E.M

我将此文章基于 [Creative Commons Attribution-ShareAlike 4.0 license](https://creativecommons.org/licenses/by-sa/4.0/legalcode) 授权

---

via: <https://writing.kemitchell.com/2016/09/21/MIT-License-Line-by-Line.html>

作者：[Kyle E. Mitchell](https://kemitchell.com/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[bestony](https://github.com/bestony) 校对：[wxy](https://github.com/wxy)

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


定制你的 Linux 终端外观的 5 项调整

Summary: 我将向你展示一些简单或复杂的调整来改变终端的外观

我将向你展示一些简单或复杂的调整来改变终端的外观

# 定制你的 Linux 终端外观的 5 项调整

终端仿真器（或简称终端）是任何 Linux 发行版中不可或缺的一部分。

当你改变发行版的主题时，往往终端也会自动得到改造。但这并不意味着你不能进一步定制终端。

事实上，很多读者都问过我们，为什么我们截图或视频中的终端看起来那么酷，我们用的是什么字体等等。

为了回答这个经常被问到的问题，我将向你展示一些简单或复杂的调整来改变终端的外观。你可以在下图中对比一下视觉上的差异：

### 自定义 Linux 终端

本教程利用 Pop!\_OS 上的 GNOME 终端来定制和调整终端的外观。但是，大多数建议也应该适用于其他终端。

对于大多数元素，如颜色、透明度和字体，你可以利用 GUI 来调整它，而不需要输入任何特殊的命令。

打开你的终端。在右上角寻找汉堡菜单。在这里，点击 “偏好设置”，如下图所示：

在这里你可以找到改变终端外观的所有设置。

#### 技巧 0：使用独立的终端配置文件进行定制

我建议你建立一个新的配置文件用于你的定制。为什么要这样做？因为这样一来，你的改变就不会影响到终端的主配置文件。假设你做了一些奇怪的改变，却想不起默认值？配置文件有助于分离你的定制。

如你所见，我有个单独的配置文件，用于截图和制作视频。

你可以轻松地更改终端配置文件，并使用新的配置文件打开一个新的终端窗口。

这就是我想首先提出的建议。现在，让我们看看这些调整。

#### 技巧 1：使用深色/浅色终端主题

你可以改变系统主题，终端主题也会随之改变。除此之外，如果你不想改变系统主题。你也可以切换终端的深色主题或浅色主题，

一旦你进入“偏好设置”，你会注意到在“常规”选项中可以改变主题和其他设置。

#### 技巧 2：改变字体和大小

选择你要自定义的配置文件。现在你可以选择自定义文本外观、字体大小、字体样式、间距、光标形状，还可以切换终端铃声。

对于字体，你只能改成你系统上可用的字体。如果你想要不同的字体，请先在你的 Linux 系统上下载并安装字体。

还有一点! 要使用等宽字体，否则字体可能会重叠，文字可能无法清晰阅读。如果你想要一些建议，可以选择 [Share Tech Mono](https://fonts.google.com/specimen/Share+Tech+Mono)（开源）或 [Larabiefont](https://www.dafont.com/larabie-font.font)（不开源）。

在“文本”选项卡下，选择“自定义字体”，然后更改字体及其大小（如果需要）。

#### 技巧 3：改变调色板和透明度

除了文字和间距，你还可以进入“颜色”选项，改变终端的文字和背景的颜色。你还可以调整透明度，让它看起来更酷。

正如你所注意到的那样，你可以从一组预先配置的选项中选择调色板，也可以自己调整。

如果你想和我一样启用透明，点击“使用透明背景”选项。

如果你想要和你的系统主题类似的颜色设置，你也可以选择使用系统主题的颜色。

#### 技巧 4：调整 bash 提示符变量

通常当你启动终端时，无需任何修改你就会看到你的用户名和主机名（你的发行版名称）作为 bash 提示符。

例如，在我的例子中，它会是 “ankushdas@pop-os:~$”。然而，我把 [主机名永久地改成了](https://itsfoss.com/change-hostname-ubuntu/) “itsfoss”，所以现在看起来像这样：

要改变主机名，你可以键入：

```
hostname 定制名称

```

然而，这只适用于当前会话。因此，当你重新启动时，它将恢复到默认值。要永久地更改主机名，你需要输入：

```
sudo hostnamectl set-hostname 定制名称

```

同样，你也可以改变你的用户名，但它需要一些额外的配置，包括杀死所有与活动用户名相关联的当前进程，所以我们会跳过用它来改变终端的外观/感觉。

#### 技巧 5：不推荐：改变 bash 提示符的字体和颜色（面向高级用户）

然而，你可以使用命令调整 bash 提示符的字体和颜色。

你需要利用 `PS1` 环境变量来控制提示符的显示内容。你可以在 [手册页](https://linux.die.net/man/1/bash) 中了解更多关于它的信息。

例如，当你键入：

```
echo $PS1

```

在我这里输出：

```
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$

```

我们需要关注的是该输出的第一部分：

```
\[\e]0;\u@\h: \w\a\]$

```

在这里，你需要知道以下几点：

* `\e` 是一个特殊的字符，表示一个颜色序列的开始。
* `\u` 表示用户名，后面可以跟着 `@` 符号。
* `\h` 表示系统的主机名。
* `\w` 表示基本目录。
* `\a` 表示活动目录。
* `$` 表示非 root 用户。

在你的情况下输出可能不一样，但变量是一样的，所以你需要根据你的输出来试验下面提到的命令。

在你这样做之前，请记住这些：

* 文本格式代码：`0` 代表正常文本，`1` 代表粗体，`3` 代表斜体，`4` 代表下划线文本。
* 背景色的颜色范围：`40` - `47`。
* 文本颜色的颜色范围：`30` - `37`。

你只需要键入以下内容来改变颜色和字体：

```
PS1="\e[41;3;32m[\u@\h:\w\a\$]"

```

这是输入该命令后 bash 提示符的样子：

如果你注意到这个命令，就像上面提到的，`\e` 可以帮助我们分配一个颜色序列。

在上面的命令中，我先分配了一个**背景色**，然后是**文字样式**，接着是**字体颜色**，然后是 `m`。这里，`m` 表示颜色序列的结束。

所以，你要做的就是，调整这部分：

```
41;3;32

```

命令其余部分应该是不变的，你只需要分配不同的数字来改变背景色、文字样式和文字颜色。

要注意的是，这并没有特定的顺序，你可以先指定文字样式，再指定背景色，最后指定文字颜色，如 `3;41;32`，这里的命令就变成了：

```
PS1="\e[3;41;32m[\u@\h:\w\a\$]"

```

正如你所注意到的，无论顺序如何，颜色的定制都是一样的。所以，只要记住自定义的代码，并在你确定你想把它作为一个永久的变化之前，试试它。

上面我提到的命令会临时定制当前会话的 bash 提示符。如果你关闭了会话，你将失去这个自定义设置。

所以，要想把它变成一个永久的改变，你需要把它添加到 `.bashrc` 文件中（这是一个配置文件，每次加载会话时都会加载）。

简单键入如下命令来访问该文件：

```
nano ~/.bashrc

```

除非你明确知道你在做什么，否则不要改变任何东西。而且，为了可以恢复设置，你应该把 `PS1` 环境变量的备份（默认情况下复制粘贴其中的内容）保存到一个文本文件中。

所以，即使你需要默认的字体和颜色，你也可以再次编辑 `.bashrc` 文件并粘贴 `PS1` 环境变量。

#### 附赠技巧：根据你的墙纸改变终端的调色板

如果你想改变终端的背景和文字颜色，但又不知道该选哪种颜色，你可以使用一个基于 Python 的工具 Pywal，它可以 [根据你的壁纸](https://itsfoss.com/pywal/) 或你提供的图片自动改变终端的颜色。

如果你有兴趣使用这个工具，我之前已经详细[介绍](https://itsfoss.com/pywal/)过了。

### 总结

当然，使用 GUI 定制很容易，同时也可以更好地控制你可以改变的东西。但是，需要知道命令也是必要的，万一你开始 [使用 WSL](https://itsfoss.com/install-bash-on-windows/) 或者使用 SSH 访问远程服务器，无论如何都可以定制你的体验。

你是如何定制 Linux 终端的？在评论中与我们分享你的秘方。

---

via: <https://itsfoss.com/customize-linux-terminal/>

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

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


如何在 Ubuntu Linux 上安装最新的 Erlang

Summary: Erlang 是一种用于构建大规模可扩展实时系统的函数式编程语言。

Erlang 是一种用于构建大规模可扩展实时系统的函数式编程语言。

# 如何在 Ubuntu Linux 上安装最新的 Erlang

[Erlang](https://www.erlang.org/) 是一种用于构建大规模可扩展实时系统的函数式编程语言。Erlang 最初是由 [爱立信](https://www.ericsson.com/en) 创建的专有软件，后来被开源。

Erlang 在 [Ubuntu 的 Universe 仓库](https://itsfoss.com/ubuntu-repositories/) 中可用。启用该仓库后，你可以使用下面的命令轻松安装它：

```
sudo apt install erlang
```

但是，*Ubuntu 仓库提供的 Erlang 版本可能不是最新的*。

如果你想要 Ubuntu 上最新的 Erlang 版本，你可以添加 [Erlang Solutions 提供的](https://www.erlang-solutions.com/downloads/)仓库。它们为各种 Linux 发行版、Windows 和 macOS 提供了预编译的二进制文件。

如果你之前安装了一个名为 `erlang` 的包，那么它将会被升级到由添加的仓库提供的较新版本。

### 在 Ubuntu 上安装最新版本的 Erlang

你需要[在 Linux 终端下载密钥文件](https://itsfoss.com/download-files-from-linux-terminal/)。你可以使用 `wget` 工具，所以请确保你已经安装了它：

```
sudo apt install wget

```

接下来，使用 `wget` 下载 Erlang Solution 仓库的 GPG 密钥，并将其添加到你的 apt 打包系统中。添加了密钥后，你的系统就会信任来自该仓库的包。

```
wget -O- https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc | sudo apt-key add -

```

现在，你应该在你的 APT `sources.list.d` 目录下为 Erlang 添加一个文件，这个文件将包含有关仓库的信息，APT 包管理器将使用它来获取包和未来的更新。

对于 Ubuntu 20.04（和 Ubuntu 20.10），使用以下命令：

```
echo "deb https://packages.erlang-solutions.com/ubuntu focal contrib" | sudo tee /etc/apt/sources.list.d/erlang-solution.list

```

我知道上面的命令提到了 Ubuntu 20.04 focal，但它也适用于 Ubuntu 20.10 groovy。

对于 **Ubuntu 18.04**，使用以下命令：

```
echo "deb https://packages.erlang-solutions.com/ubuntu bionic contrib" | sudo tee /etc/apt/sources.list.d/erlang-solution.list

```

你必须更新本地的包缓存，以通知它关于新添加的仓库的包。

```
sudo apt update

```

你会注意到，它建议你进行一些升级。如果你列出了可用的升级，你会在那里找到 erlang 包。要更新现有的 erlang 版本或重新安装，使用这个命令：

```
sudo apt install erlang

```

安装好后，你可以测试一下。

要退出 Erlang shell，使用 `Ctrl+g`，然后输入 `q`，由于我从来没有用过 Erlang，所以我只好尝试了一些按键，然后发现了操作方法。

#### 删除 erlang

要删除该程序，请使用以下命令：

```
sudo apt remove erlang

```

还会有一些依赖关系。你可以用下面的命令删除它们：

```
sudo apt autoremove

```

如果你愿意，你也可以删除添加的仓库文件。

```
sudo rm /etc/apt/sources.list.d/erlang-solution.list

```

就是这样。享受在 Ubuntu Linux 上使用 Erlang 学习和编码的乐趣。

---

via: <https://itsfoss.com/install-erlang-ubuntu/>

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


硬核观察 | 写字的纸条就能骗过 OpenAI 的物体识别

Summary: 更多：• 谷歌的多平台应用框架 Flutter 发布 2.0，支持 Web 应用 • RHEL 自助服务的价格翻了一番，但是软件没变

# 硬核观察 | 写字的纸条就能骗过 OpenAI 的物体识别

### 写字的纸条就能骗过 OpenAI 的物体识别

OpenAI 的研究人员[发现](https://openai.com/blog/multimodal-neurons/)了一种令人震惊的简单方法来蒙蔽他们的对象识别软件，而且只需要笔和纸就可以进行。只要在一张纸上写上 “iPod” 的字样，贴在一只苹果上，就能骗过他们最新的计算机视觉模型 CLIP，该软件会错误地将这个水果归类为音乐播放器。

研究人员认为，像这样的攻击远非单纯的学术问题，通过利用模型强大的文字阅读能力，即使是手写文字的照片也经常可以欺骗模型。OpenAI 的模型是使用文本的图片以及从互联网上搜刮的物体图像进行训练的，因此被所谓这种“排版攻击”误导也不足为奇。

这种所谓的“智能”，有时候还是很笨拙的，没有“智慧”的“智能”始终也只是算法和数据而已。

### 谷歌的多平台应用框架 Flutter 发布 2.0，支持 Web 应用

Flutter 允许开发者创建一个单一的代码库，可以为 Android、iOS、Windows、macOS 和 Linux、Web 和嵌入式设备生成应用，不过桌面操作系统的支持还不稳定。最重要的是，[Flutter 2.0](https://medium.com/flutter/whats-new-in-flutter-2-0-fe8e95ecc65) 从主要是一个移动平台，拓展到现在可以真正实现跨移动、桌面、Web 和嵌入式的可移植性。

谷歌的大量应用都依赖于 Flutter，这包括 Google One、Google Pay、Nest Hub、Google Ads、Google Shopping、Google Analytics、Cloud Search 等等。

这样一个重要的里程碑版本，值得开发者们学习了解一下。不过，新东西太多了，感觉有点学不过来了。

### RHEL 自助服务的价格翻了一番，但是软件没变

2019 年红帽公司[下线](https://access.redhat.com/articles/54702)了其 RHEL Server 自助服务（RH0197181），而被 RHEL Server 入门级自助服务（RH00005）所取代。它们的售价都是 349 美元，但只有停售那款才允许使用最低程度的虚拟功能。现在客户发现，需要支付两倍以上的费用（[每年 799 美元](https://www.redhat.com/en/store/red-hat-enterprise-linux-server)）才能在虚拟机中运行 RHEL。换言之，你想不要红帽的技术支持就运行虚拟机，也必须多花一倍的钱，哪怕你真的不需要那些技术支持。

在红帽公司停止其免费的 CentOS 之后，该公司已经明确表示，它对那些只付很少费用或不付费用的用户没有什么兴趣。即便是为了安抚不满的 CentOS 用户而推出的 RHEL 开发者订阅，根据使用条款，不允许用在企业生产环境。而现在，对 RHEL 商业客户也开始层层加码，我觉得，可能红帽的营收压力太大了。


在 Linux 上运行你最喜欢的 Windows 应用程序

apt install wine

正在读取软件包列表... 完成

正在分析软件包的依赖关系树

正在读取状态信息... 完成

虚拟软件包 wine 由下面的软件包提供：

  wine-stable 3.0-1ubuntu1

  wine-development 3.6-1

请您明确地选择安装其中一个。

E: 软件包 wine 没有可安装候选

# 在 Linux 上运行你最喜欢的 Windows 应用程序

>
> WINE 是一个开源项目，它可以协助很多 Windows 应用程序在 Linux 上运行，就好像它们是原生程序一样。
>
>
>

在 2021 年，有很多比以往更喜欢 Linux 的原因。在这系列中，我将分享使用 Linux 的 21 种原因。这里是如何使用 WINE 来实现从 Windows 到 Linux 的无缝切换。

你有只能在 Windows 上运行的应用程序吗？那一个应用程序阻碍你切换到 Linux 的唯一因素吗？如果是这样的话，你将会很高兴知道 WINE，这是一个开源项目，它几乎重新发明了关键的 Windows 库，使为 Windows 编译的应用程序可以在 Linux 上运行。

WINE 代表着“Wine Is Not an Emulator” ，它指的是驱动这项技术的代码。开源开发者从 1993 年就开始致力将应用程序的任何传入 Windows API 调用翻译为 [POSIX](https://opensource.com/article/19/7/what-posix-richard-stallman-explains) 调用。

这是一个令人十分惊讶的编程壮举，尤其是考虑到这个项目是独立运行的，没有来自微软的帮助（至少可以这样说），但是也有局限性。一个应用程序偏离 Windows API 的 “内核” 越远，WINE 就越不能预期应用程序的请求。有一些供应商可以弥补这一点，尤其是 [Codeweavers](https://www.codeweavers.com/crossover) 和 [Valve Software](https://github.com/ValveSoftware/Proton)。在需要翻译应用程序的制作者和翻译的人们及公司之间没有协调配合，因此，比如说一个更新的软件作品和从 [WINE 总部](http://winehq.org) 获得完美适配状态之间可能会有一些时间上的滞后。

然而，如果你想在 Linux 上运行一个著名的 Windows 应用程序，WINE 可能已经为它准备好了可能性。

### 安装 WINE

你可以从你的 Linux 发行版的软件包存储库中安装 WINE 。在 Fedora、CentOS Stream 或 RHEL 系统上：

```
$ sudo dnf install wine

```

在 Debian、Linux Mint、Elementary 及相似的系统上：

```
$ sudo apt install wine

```

WINE 不是一个你自己启动的应用程序。当启动一个 Windows 应用程序时，它是一个被调用的后端。你与 WINE 的第一次交互很可能就发生在你启动一个 Windows 应用程序的安装程序时。

### 安装一个应用程序

[TinyCAD](https://sourceforge.net/projects/tinycad/) 是一个极好的用于设计电路的开源应用程序，但是它仅在 Windows 上可用。虽然它是一个小型的应用程序，但是它确实包含一些 .NET 组件，因此应该能对 WINE 进行一些压力测试。

首先，下载 TinyCAD 的安装程序。Windows 安装程序通常都是这样，它是一个 `.exe` 文件。在下载后，双击文件来启动它。

*TinyCAD 的 WINE 安装向导*

像你在 Windows 上一样逐步完成安装程序。通常最好接受默认选项，尤其是与 WINE 有关的地方。WINE 环境基本上是独立的，隐藏在你的硬盘驱动器上的一个 `drive_c` 目录中，作为 Windows 应用程序使用的一个文件系统的仿真根目录。

*WINE TinyCAD 目标驱动器*

安装完成后，应用程序通常会为你提供启动机会。如果你正准备测试一下它的话，启动应用程序。

### 启动 Windows 应用程序

除了在安装后的第一次启动外，在正常情况下，你启动一个 WINE 应用程序的方式与你启动一个本地 Linux 应用程序相同。不管你使用应用程序菜单、活动屏幕或者只是在运行器中输入应用程序的名称，在 WINE 中运行的桌面 Windows 应用程序都会被视为在 Linux 上的本地应用程序。

*通过 WINE 的支持来运行 TinyCAD*

### 当 WINE 失败时

我在 WINE 中的大多数应用程序，包括 TinyCAD ，都能如期运行。不过，也会有例外。在这些情况下，你可以等几个月来查看 WINE 开发者 （或者，如果是一款游戏，就等候 Valve Software）是否进行追加修补，或者你可以联系一个像 Codeweavers 这样的供应商来查看他们是否出售对你所需要的应用程序的服务支持。

### WINE 是种欺骗，但它用于正道

一些 Linux 用户觉得：如果你使用 WINE 的话，你就是在“欺骗” Linux。它可能会让人有这种感觉，但是 WINE 是一个开源项目，它使用户能够切换到 Linux ，并且仍然能够运行工作或爱好所需的应用程序。如果 WINE 解决了你的问题，让你使用 Linux，那就使用它，并拥抱 Linux 的灵活性。

---

via: <https://opensource.com/article/21/2/linux-wine>

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

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


硬核观察 | 因为姓“True”，而被 iCloud 拒绝访问

Summary: 更多：• 最近披露的“依赖性混淆”攻击开始大量增加 • “别用！”，Linus Torvalds 对最新的 Linux 内核警告称

swap分区逃过一劫

# 硬核观察 | 因为姓“True”，而被 iCloud 拒绝访问

### 因为姓“True”，而被 iCloud 拒绝访问

据国外媒体[报道](https://www.imore.com/author-takes-twitter-after-breaking-icloud-true-last-name "https://www.imore.com/author-takes-twitter-after-breaking-icloud-true-last-name")，当事人 Rachel True 在 Twitter 上抱怨称自己无法登录 iCloud 账号已有 6 个月。从她贴出的报错诊断信息上可以看到，上面写着“iCloud 已停止响应”，并提到用户不能将 `true` 值设置值为姓氏。这显然是将字符串“true”当成布尔值处理了。目前该问题尚未得到解决。

有人开玩笑道，按西方习俗，当事人嫁人后会跟夫姓，就可以解决该问题了，当然，不要嫁给姓 Null 的人 —— 因为这没准也会被视作关键词。

之前有则流传已久的故事，有人在汽车车牌处贴了一句 SQL 语句，通过摄像头的文字识别注入到交管部门的数据库中，从而进行破坏。当然，我们都知道这是一个编撰的笑话而已。但是真没想到，连苹果的 iCloud 服务也会出现这种数据库注入漏洞。

### 最近披露的“依赖性混淆”攻击开始大量增加

之前我们[报道](/article-13108-1.html "/article-13108-1.html")过，有研究人员发现利用开源生态系统的“依赖性混淆”设计缺陷，成功地入侵了包括谷歌在内的 35 家知名科技公司，获得了超过 13 万美元的漏洞报告奖励。

当时我们曾经预测，这种攻击很可能会迅速针对使用开源软件构建内部软件的公司展开。果不其然，最近 npm 和 PyPi 开源代码仓库涌入了超过五千个此类概念验证攻击包，数十家科技公司都成为了类似攻击的目标。研究人员[担心](https://arstechnica.com/gadgets/2021/03/more-top-tier-companies-targeted-by-new-type-of-potentially-serious-attack/ "https://arstechnica.com/gadgets/2021/03/more-top-tier-companies-targeted-by-new-type-of-potentially-serious-attack/")，这种攻击会愈演愈烈，毕竟这种攻击的成本非常低。

我觉得这种漏洞披露得有点冒失了，毕竟这个设计缺陷应该需要各种语言本身提供一个适当的防御机制比较好。希望各个语言社区和企业们能及时关注和做临时性规避吧。

### “别用！”，Linus Torvalds 对最新的 Linux 内核警告称

最近刚刚发布的 Linux 5.12-rc1 出现了严重问题，以至于 Linux Torvalds 将 v5.12-rc1 的标签改名为 v5.12-rc1-dontuse。这个多灾多难的 Linux 5.12 之前就因为北美暴风雪导致停电而推迟了合并窗口，现在，又由于其中一个会导致整个文件系统被破坏的严重错误而被 Linus 喊停。

不过，如果你不使用内存交换，或只使用交换分区，那不会影响到你，但是如果使用 Ubuntu 这样默认使用交换文件的发行版，那么这个严重错误会导致你的文件系统损坏。

一般来说，这种还散发着热乎气的候选内核，没有人会将其用于正式环境，所以，大家也不用太担心。


值得尝试的 3 个 Linux 终端

Summary: Linux 让你能够选择你喜欢的终端界面，而不是它强加的界面。

几乎每一个桌面环境都有一个终端

deepin-terminal

音乐播放器，还有计算器，直呼内行。

Linux 让你能够选择你喜欢的终端界面，而不是它强加的界面。

# 值得尝试的 3 个 Linux 终端

>
> Linux 让你能够选择你喜欢的终端界面，而不是它强加的界面。
>
>
>

在 2021 年，人们喜欢 Linux 的理由比以往任何时候都多。在这个系列中，我将分享 21 个使用 Linux 的不同理由。能够选择自己的终端是使用 Linux 的一个重要原因。

很多人认为一旦你用过一个终端界面，你就已经用过所有的终端了。但喜欢终端的用户都知道，它们之间有一些细微但重要的区别。本文将介绍我最喜欢的三种。

不过在深入研究它们之前，先要了解 shell 和<ruby> 终端 <rt>  terminal </rt></ruby>之间的区别。终端（技术上说是<ruby> 终端模拟器 <rt>  terminal emulator </rt></ruby>，因为终端曾经是物理硬件设备）是一个在桌面上的窗口中运行的应用。shell 是在终端窗口中对你可见的引擎。流行的 shell 有 [Bash](https://opensource.com/resources/what-bash)、[tcsh](https://opensource.com/article/20/8/tcsh) 和 [zsh](https://opensource.com/article/19/9/getting-started-zsh)，它们都在终端中运行。

在现代 Linux 上几乎不用说，至少本文中所有的终端都有标签界面。

### Xfce 终端

[轻量级 Xfce 桌面](https://opensource.com/article/19/12/xfce-linux-desktop) 提供了一个轻量级的终端，很好地平衡了功能和简单性。它提供了对 shell 的访问（如预期的那样），并且它可以轻松访问几个重要的配置选项。你可以设置当你双击文本时哪些字符会断字、选择你的默认字符编码，并禁用终端窗口的 Alt 快捷方式，这样你最喜欢的 Bash 快捷方式就会传递到 shell。你还可以设置字体和新的颜色主题，或者从常用预设列表中加载颜色主题。它甚至在顶部有一个可选的工具栏，方便你访问你最喜欢的功能。

对我来说，Xfce 的亮点功能是可以非常容易地为你打开的每一个标签页改变背景颜色。当在服务器上运行远程 shell 时，这是非常有价值的。它让我知道自己在哪个标签页中，从而避免了我犯愚蠢的错误。

### rxvt-unicode

[rxvt 终端](https://opensource.com/article/19/10/why-use-rxvt-terminal) 是我最喜欢的轻量级控制台。它有许多老式 [xterm](https://opensource.com/article/20/7/xterm) 终端仿真器的功能，但它的扩展性更强。它的配置是在 `~/.Xdefaults` 中定义的，所以没有偏好面板或设置菜单，但这使得它很容易管理和备份你的设置。通过使用一些 Perl 库，rxvt 可以有标签，并且通过 xrdb，它可以访问字体和任何你能想到的颜色主题。你可以设置像 `URxvt.urlLancher: firefox` 这样的属性来设置当你打开 URL 时启动的网页浏览器，改变滚动条的外观，修改键盘快捷键等等。

最初的 rxvt 不支持 Unicode（因为当时 Unicode 还不存在），但 `rxvt-unicode`（有时也叫 `urxvt`）包提供了一个完全支持 Unicode 的补丁版本。

我在每台电脑上都有 rxvt，因为对我来说它是最好的通用终端。它不一定是所有用户的最佳终端（例如，它没有拖放界面）。不过，对于寻找快速和灵活终端的中高级用户来说，rxvt 是一个简单的选择。

### Konsole

Konsole 是 KDE Plasma 桌面的终端，是我转到 Linux 后使用的第一个终端，所以它是我对所有其他终端的标准。它确实设定了一个很高的标准。Konsole 有所有通常的不错的功能（还有些其他的），比如简单的颜色主题加上配置文件支持、字体选择、编码、可分离标签、可重命名标签等等。但这在现代桌面上是可以预期的（至少，如果你的桌面运行的是 Plasma 的话）。

Konsole 比其他终端领先许多年（或者几个月）。它可以垂直或水平地分割窗口。你可以把输入复制到所有的标签页上（就像 [tmux](https://opensource.com/article/20/1/tmux-console) 一样）。你可以将其设置为监视自身是否静音或活动并配置通知。如果你在 Android 手机上使用 KDE Connect，这意味着当一个任务完成时，你可以在手机上收到通知。你可以将 Konsole 的输出保存到文本或 HTML 文件中，为打开的标签页添加书签，克隆标签页，调整搜索设置等等。

Konsole 是一个真正的高级用户终端，但它也非常适合新用户。你可以将文件拖放到 Konsole 中，将目录改为硬盘上的特定位置，也可以将路径粘贴进去，甚至可以将文件复制到 Konsole 的当前工作目录中。这让使用终端变得很简单，这也是所有用户都能理解的。

### 尝试一个终端

你的审美观念是黑暗的办公室和黑色背景下绿色文字的温暖光芒吗？还是喜欢阳光明媚的休息室和屏幕上舒缓的墨黑色字体？无论你对完美电脑设置的愿景是什么，如果你喜欢通过输入命令高效地与操作系统交流，那么 Linux 已经为你提供了一个接口。

---

via: <https://opensource.com/article/21/2/linux-terminals>

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

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


Guake 终端：一个灵感来自于 FPS 游戏的 Linux 终端

Summary: 使用 Guake 终端这个可自定义且强大的适合各种用户的工具快速访问你的终端。

这个和htop几乎一样 - -!

使用 Guake 终端这个可自定义且强大的适合各种用户的工具快速访问你的终端。

# Guake 终端：一个灵感来自于 FPS 游戏的 Linux 终端

>
> 使用 Guake 终端这个可自定义且强大的适合各种用户的工具快速访问你的终端。
>
>
>

### Guake 终端：GNOME 桌面中自上而下终端

[Guake](http://guake-project.org/) 是一款为 GNOME 桌面量身定做的终端模拟器，采用下拉式设计。

它最初的灵感来自于一款 FPS 游戏（[Quake](https://quake.bethesda.net/en)）中的终端。尽管它最初是作为一个快速和易于使用的终端而设计的，但它的功能远不止于此。

Guake 终端提供了大量的功能，以及可定制的选项。在这里，我将重点介绍终端的主要功能，以及如何将它安装到你的任何 Linux 发行版上。

### Guake 终端的特点

* 按下键盘快捷键（`F12`）以覆盖方式在任何地方启动终端
* Guake 终端在后台运行，以便持久访问
* 能够横向和纵向分割标签页
* 从可用的 shell 中（如果有的话）更改默认的 shell
* 重新对齐
* 从多种调色板中选择改变终端的外观
* 能够使用 GUI 方式将终端内容保存到文件中
* 需要时切换全屏
* 你可以轻松地保存标签，或在需要时打开新的标签
* 恢复标签的能力
* 可选择配置和学习新的键盘快捷键，以快速访问终端和执行任务
* 改变特定选项卡的颜色
* 轻松重命名标签，快速访问你需要的内容
* 快速打开功能，只需点击一下，就可直接在终端中用你最喜欢的编辑器打开文件
* 能够在启动或显示 Guake 终端时添加自己的命令或脚本。
* 支持多显示器

只是出于乐趣，你可以做很多事情。但是，我也相信，高级用户可以利用这些功能使他们的终端体验更轻松，更高效。

就我用它来测试一些东西和写这篇文章的时候，说实话，我觉得我是在召唤终端。所以，我绝对觉得它很酷！

### 在 Linux 上安装 Guake

在 Ubuntu、Fedora 和 Arch 的默认仓库中都有 Guake 终端。

你可以按照它的官方说明来了解你可以使用的命令，如果你使用的是基于 Ubuntu 的发行版，只需输入：

```
sudo apt install guake

```

请注意，使用这种方法可能无法获得最新版本。所以，如果你想获得最新的版本，你可以选择使用 [Linux Uprising](https://www.linuxuprising.com/) 的 PPA 来获得最新版本：

```
sudo add-apt-repository ppa:linuxuprising/guake
sudo apt update
sudo apt install guake

```

无论是哪种情况，你也可以使用 [Pypi](https://pypi.org/) 或者参考[官方文档](https://guake.readthedocs.io/en/latest/user/installing.html)或从 [GitHub 页面](https://github.com/Guake/guake)获取源码。

* [Guake Terminal](https://github.com/Guake/guake)

你觉得 Guake 终端怎么样？你认为它是一个有用的终端仿真器吗？你知道有什么类似的软件吗？

欢迎在下面的评论中告诉我你的想法。

---

via: <https://itsfoss.com/guake-terminal/>

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


硬核观察 | 哈勃空间望远镜软件出错，进入安全模式

Summary: 更多：• Wave 更名为 MIPS，彻底投奔 RISC-V • AMD 考虑推出专用型加密货币挖矿 GPU

# 硬核观察 | 哈勃空间望远镜软件出错，进入安全模式

### 哈勃空间望远镜软件出错，进入安全模式

NASA 称，“哈勃太空望远镜因机载软件错误进入安全模式。所有的科学系统看起来都是正常的，哈勃是安全稳定的。”希望能从地面解决软件故障，从而让哈勃望远镜能够在太空正常运行。哈勃已经远远超出了它的计划寿命，其原本设定寿命为 15 年，现在已经运行 30 多年了。

这么远的设备出了问题，真有点鞭长莫及，不知道“重启试试”能不能解决问题？：D

### Wave 更名为 MIPS，彻底投奔 RISC-V

2018 年，Wave Computing 收购了 MIPS Technologies，宣布将在 2019 年第一季度发布 core R6 时开源。2019 年初它发起了 MIPS Open Initiative 倡议，但在 2019 年 11 月它终止了这一倡议。2020 年 4 月，Wave 申请破产保护。

2021 年 3 月，Wave 更名为 MIPS，宣布将放弃开发 MIPS 架构，加入 RISC-V 基金会。RISC-V 和 MIPS 都是基于精简指令集（RISC）原则，但今天的 MIPS 公司只是挂了一个名字。

RISC 架构大行其道，这应该不仅仅是 RISC 架构的优势，更多是开源开放的力量。

### AMD 考虑推出专用型加密货币挖矿 GPU

今年 2 月，英伟达宣布了专为加密货币挖矿任务而设计的 CMP GPU 。与传统主打显示输出的 GPU 相比，其特点是没有预留任何图形接口。而据报道，AMD 或许也将推出专为加密货币挖矿而设计的 RNDA GPU 。预计它将基于初代 RNDA 架构、拥有 40 组计算单元 / 2560 个流处理器。

看来，挖矿已经是 GPU 厂商的主题之一了，连传统 GPU 厂商都要专门生成挖矿芯片了。


站在开发者的角度。意义在于GUI有参照，不需要我做产品设计就能做出来。不是每个开发者都能做除开发之外的事（产品设计之类）

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

没有SWAP监控？

# SysMonTask：一个类似于 Windows 任务管理器的 Linux 系统监控器

得益于桌面环境，几乎所有的 [Linux 发行版都带有任务管理器应用程序](https://itsfoss.com/task-manager-linux/)。除此之外，还有 [一些其他的 Linux 的系统监控应用程序](https://itsfoss.com/linux-system-monitoring-tools/)，它们具有更多的功能。

但最近我遇到了一个为 Linux 创建的任务管理器，它看起来像……嗯……Windows 的任务管理器。

你自己看看就知道了。

就我个人而言，我不确定用户界面的相似性是否有意义，但开发者和其他一些 Linux 用户可能不同意我的观点。

### SysMonTask: 一个具有 Windows 任务管理器外观的系统监控器

开源软件 [SysMonTask](https://github.com/KrispyCamel4u/SysMonTask) 将自己描述为“具有 Windows 任务管理器的紧凑性和实用性的 Linux 系统监控器，以实现更高的控制和监控”。

SysMonTask 以 Python 编写，拥有以下功能：

* 系统监控图。
* 显示 CPU、内存、磁盘、网络适配器、单个 Nvidia GPU 的统计数据。
* 在最近的版本中增加了对挂载磁盘列表的支持。
* 用户进程选项卡可以进行进程过滤，显示递归-CPU、递归-内存和列头的汇总值。
* 当然，你可以在进程选项卡中杀死一个进程。
* 还支持系统主题（深色和浅色）。

### 体验 SysMonTask

SysMonTask 需要提升权限。当你启动它时，你会被要求提供你的管理员密码。我不喜欢一个任务管理器一直用 `sudo` 运行，但这只是我的喜好。

我玩了一下，探索它的功能。磁盘的使用量基本稳定不变，所以我把一个 10GB 的文件从外部 SSD 复制到笔记本的磁盘上几次。你可以看到文件传输时对应的峰值。

进程标签也很方便。它在列的顶部显示了累积的资源利用率。

杀死按钮被添加在底部，所以你要做的就是选择一个进程，然后点击“Killer” 按钮。它在 [杀死进程](https://itsfoss.com/how-to-find-the-process-id-of-a-program-and-kill-it-quick-tip/) 之前会询问你的确认。

### 在 Linux 发行版上安装 SysMonTask

对于一个简单的应用程序，它需要下载 50 MB 的存档文件，并占用了大约 200 MB 的磁盘。我想这是因为 Python 的依赖性。

还有就是它读取的是 env。

在写这篇文章的时候，SysMonTask 可以通过 [PPA](https://itsfoss.com/ppa-guide/) 在基于 Ubuntu 的发行版上使用。

在基于 Ubuntu 的发行版上，打开一个终端，使用以下命令添加 PPA 仓库：

```
sudo add-apt-repository ppa:camel-neeraj/sysmontask

```

当然，你会被要求输入密码。在新版本中，仓库列表会自动更新。所以，你可以直接安装应用程序：

```
sudo apt install sysmontask

```

基于 Debian 的发行版也可以尝试从 deb 文件中安装它。它可以在发布页面找到。

对于其他发行版，没有现成的软件包。令我惊讶的是，它基本上是一个 Python 应用程序，所以可以为其他发行版添加一个 PIP 安装程序。也许开发者会在未来的版本中添加它。

由于它是开源软件，你可以随时得到源代码。

* [SysMonTask Deb 文件和源代码](https://github.com/KrispyCamel4u/SysMonTask/releases)

安装完毕后，在菜单中寻找 SysMonTask，并从那里启动它。

#### 删除 SysMonTask

如果你想删除它，使用以下命令：

```
sudo apt remove sysmontask

```

最好也 [删除 PPA](https://itsfoss.com/how-to-remove-or-delete-ppas-quick-tip/)：

```
sudo add-apt-repository -r ppa:camel-neeraj/sysmontask

```

你也可以在这里 [使用 PPA 清除](https://itsfoss.com/ppa-purge/) 工具，这是一个处理 PPA 应用程序删除的方便工具。

### 你会尝试吗？

对我来说，功能比外观更重要。SysMonTask 确实有额外的功能，监测磁盘性能和检查 GPU 统计数据，这是其他系统监视器通常不包括的东西。

如果你尝试并喜欢它，也许你会喜欢添加 `Ctrl+Alt+Del` 快捷键来启动 SysMonTask，以获得完整的感觉 :smiley:

---

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

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

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


基于 Linux 的 Moodle 虚拟课堂教学

Summary: 基于 Linux 的 Moodle 学习管理系统进行远程教学。

基于 Linux 的 Moodle 学习管理系统进行远程教学。

# 基于 Linux 的 Moodle 虚拟课堂教学

>
> 基于 Linux 的 Moodle 学习管理系统进行远程教学。
>
>
>

这次大流行对远程教育的需求比以往任何时候都更大。使得像 [Moodle](https://moodle.org/) 这样的<ruby> 学习管理系统 <rt>  learning management system </rt></ruby>（LMS）比以往任何时候都重要，因为越来越多的学校教育是借助虚拟现实技术的提供。

Moodle 是用 PHP 编写的免费 LMS，并以开源 [GNU 公共许可证](https://docs.moodle.org/19/en/GNU_General_Public_License)（GPL）分发。它是由 [Martin Dougiamas](https://dougiamas.com/about/) 开发的，自 2002 年发布以来一直在不断发展。Moodle 可用于混合学习、远程学习、<ruby> 翻转课堂 <rt>  flipped classroom </rt></ruby>和其他形式的在线学习。目前，全球有超过 [1.9 亿用户](https://docs.moodle.org/39/en/History) 和 145,000 个注册的 Moodle 网站。

我曾作为 Moodle 管理员、教师和学生等角色使用过 Moodle，在本文中，我将向你展示如何设置并开始使用它。

### 在 Linux 系统上安装 Moodle

Moodle 对 [系统要求](https://docs.moodle.org/39/en/Installation_quick_guide#Basic_Requirements) 适中，并且有大量文档可为你提供帮助。我最喜欢的安装方法是从 [Turnkey Linux](https://www.turnkeylinux.org/) 下载并制作 ISO，然后在 VirtualBox 中安装 Moodle 网站。

首先，下载 [Moodle ISO](https://www.turnkeylinux.org/download?file=turnkey-moodle-16.0-buster-amd64.iso) 保存到电脑中。

下一步，安装 VirtualBox 的 Linux 命令行如下：

```
$ sudo apt install virtualbox

```

或，

```
$ sudo dnf install virtualbox

```

当下载完成后，启动 VirtualBox 并在控制台中选择“<ruby> 新建 <rt>  New </rt></ruby>”按钮。

选择使用的虚拟机的名称、操作系统（Linux）和 Linux 类型（例如 Debian 64 位）。

下一步，配置虚拟机内存大小，使用默认值 1024 MB。接下来选择 “<ruby> 动态分配 <rt>  dynamically allocated </rt></ruby>”虚拟磁盘并在虚拟机中添加 `Moodle.iso` 镜像。

将你的网络设置从 NAT 更改为 “<ruby> 桥接模式 <rt>  Bridged adapter </rt></ruby>”。然后启动虚拟机并安装 ISO 以创建 Moodle 虚拟机。在安装过程中，系统将提示为 root 帐户、MySQL 和Moodle 创建密码。Moodle 密码必须至少包含八个字符，至少一个大写字母和至少一个特殊字符。

重启虚拟机。安装完成后，请确保将 Moodle 应用配置内容记录在安全的地方。（安装后，可以根据需要删除 ISO 文件。）

重要提示，在互联网上的任何人还看不到你的 Moodle 实例。它仅存在于你的本地网络中：现在只有建筑物中与你连接到相同的路由器或 wifi 接入点的人可以访问你的站点。全世界的互联网无法连接到它，因为你位于防火墙（可能嵌入在路由器中，还可能嵌入在计算机中）的后面。有关网络配置的更多信息，请阅读 Seth Kenlon 关于 [打开端口和通过防火墙进行流量路由](https://opensource.com/article/20/9/firewall) 的文章。

### 开始使用 Moodle

现在你可以登录到 Moodle 机器并熟悉该软件了。使用默认的用户名 `admin` 和创建 Moodle VM 时设置的密码登录 Moodle。

首次登录后，你将看到初始的 Moodle 网站的主仪表盘。

默认的应用名称是 “Turnkey Moodle”，但是可以很容易地对其进行更改以适合你的学校、课堂或其他需要和选择。要使你的 Moodle 网站个性化，请在用户界面左侧的菜单中，选择“站点首页Site home”。然后，点击屏幕右侧的 “<ruby> 设置 <rt>  Settings </rt></ruby>” 图标，然后选择 “<ruby> 编辑设置 <rt>  Edit settings </rt></ruby>”。

你可以根据需要更改站点名称，并添加简短名称和站点描述。

确保滚动到底部并保存更改。现在，你的网站已定制好。

默认类别为其他，这不会帮助人们识别你网站的目的。要添加类别，请返回主仪表盘，然后从左侧菜单中选择 “<ruby> 站点管理 <rt>  Site administration </rt></ruby>”。 在 “<ruby> 课程 <rt>  Courses </rt></ruby>”下，选择 “<ruby> 添加类别 <rt>  Add a category </rt></ruby>”并输入有关你的网站的详细信息。

要添加课程，请返回 “<ruby> 站点管理 <rt>  Site administration </rt></ruby>”，然后单击 “<ruby> 添加新课程 <rt>  Add a new course </rt></ruby>”。你将看到一系列选项，例如为课程命名、提供简短名称、设定类别以及设置课程的开始和结束日期。你还可以为课程形式设置选项，例如社交、每周式课程、主题，以及其外观、文件上传大小、完成情况跟踪等等。

### 添加和管理用户

现在，你已经设置了课程，你可以添加用户。有多种方法可以做到这一点。如果你是家庭教师，则手动输入是一个不错的开始。Moodle 支持基于电子邮件的注册、[LDAP](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol)、[Shibboleth（口令或暗语）](https://www.shibboleth.net/) 和许多其他方式等。校区和其他较大的机构可以用逗号分隔的文件上传用户。也可以批量添加密码，并在首次登录时强制更改密码。有关更多信息，一定要查阅 Moodle [文档](https://docs.moodle.org/39/en/Main_page)。

Moodle 是一个非常细化的、面向许可的环境。使用 Moodle 的菜单将策略和角色分配给用户并执行这些分配很容易。

Moodle 中有许多角色，每个角色都有特定的特权和许可。默认角色有管理员、课程创建者、教师、非编辑教师、学生、来宾和经过身份验证的用户，但你可以添加其他角色。

### 为课程添加内容

一旦搭建了 Moodle 网站并设置了课程，就可以向课程中添加内容。Moodle 拥有创建出色内容所需要的所有工具，并且它建立在强调 [社会建构主义](https://docs.moodle.org/39/en/Pedagogy#How_Moodle_tries_to_support_a_Social_Constructionist_view) 观点的坚实教学法之上。

我创建了一个名为 “Code with [Mu](https://opensource.com/article/20/9/teach-python-mu)” 的示例课程。它在 “<ruby> 编程 <rt>  Programming </rt></ruby>” 类别和 “Python” 子类别中。

我为课程选择了每周式课程，默认为四个星期。使用编辑工具，我隐藏了除课程第一周以外的所有内容。这样可以确保我的学生始终专注于材料。

作为教师或 Moodle 管理员，我可以通过单击 “<ruby> 添加活动或资源 <rt>  Add an activity or resource </rt></ruby>” 来将活动添加到每周的教学中。

我会看到一个弹出窗口，其中包含可以分配给我的学生的各种活动。

Moodle 的工具和活动使我可以轻松地创建学习材料，并以一个简短的测验来结束一周的学习。

你可以使用 1600 多个插件来扩展 Moodle，包括新的活动、问题类型，与其他系统的集成等等。例如，[BigBlueButton](https://moodle.org/plugins/mod_bigbluebuttonbn) 插件支持幻灯片共享、白板、音频和视频聊天以及分组讨论。其他值得考虑的包括用于视频会议的 [Jitsi](https://moodle.org/plugins/mod_jitsi) 插件、[抄袭检查器](https://moodle.org/plugins/plagiarism_unicheck) 和用于颁发徽章的 [开放徽章工厂](https://moodle.org/plugins/local_obf)。

### 继续探索 Moodle

Moodle 是一个功能强大的 LMS，我希望此介绍能引起你的兴趣，以了解更多信息。有很多出色的 [指南](https://learn.moodle.org/) 可以帮助你提高技能，如果想要查看 Moodle 的内容，可以在其 [演示站点](https://school.moodledemo.net/) 上查看运行中的 Moodle；如果你想了解 Moodle 的底层结构或为开发做出 [贡献](https://git.in.moodle.com/moodle/moodle/-/blob/master/CONTRIBUTING.txt)，也可以访问 [Moodle 的源代码](https://git.in.moodle.com/moodle/moodle)。如果你喜欢在旅途中工作，Moodle 也有一款出色的 [移动应用](https://download.moodle.org/mobile/)，适用于 iOS 和 Android。在 [Twitter](https://twitter.com/moodle)、[Facebook](https://www.facebook.com/moodle) 和 [LinkedIn](https://www.linkedin.com/company/moodle/) 上关注 Moodle，以了解最新消息。

---

via: <https://opensource.com/article/20/10/moodle>

作者：[Don Watkins](https://opensource.com/users/don-watkins) 选题：[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/) 荣誉推出


硬核观察 | 漏洞赏金计划吸引了更多道德黑客，但有 2/3 是为了好玩

Summary: 更多：• Linux 基金会推出 sigstore 软件真实性验证服务 • 世界上最强大的超算“富岳”即将全面投入运行

# 硬核观察 | 漏洞赏金计划吸引了更多道德黑客，但有 2/3 是为了好玩

### 漏洞赏金计划吸引了更多道德黑客，但有 2/3 是为了好玩

漏洞赏金计划的目标是为道德黑客提供一种手段，在网络犯罪分子利用这些漏洞之前发现并披露这些漏洞。漏洞赏金平台 HackerOne 的《2021 年黑客报告》[显示](https://www.zdnet.com/article/bug-bounties-more-hackers-are-spotting-vulnerabilities-across-web-mobile-and-iot/ "https://www.zdnet.com/article/bug-bounties-more-hackers-are-spotting-vulnerabilities-across-web-mobile-and-iot/")，发现安全漏洞并提交给漏洞赏金项目的道德黑客数量在去年增加了近三分之二。仅在去年，道德黑客就通过向 HackerOne 漏洞赏金计划披露漏洞获得了 4000 万美元的收入，而 2019 年则为 1900 万美元。

虽然发现漏洞在道德黑客行为中起到的经济激励作用：76% 接受调查的人表示他们是为了赚钱，但 85% 参与漏洞赏金计划的人表示他们是为了学习，而三分之二的人是为了好玩。

### Linux 基金会推出 sigstore 软件真实性验证服务

这项[服务](https://sigstore.dev/ "https://sigstore.dev/")使得软件开发者能够轻松地对各种软件工件进行签名，比如发行文件、容器镜像以及二进制文件。通过将签名材料存储在防篡改的公共日志中，Linux 基金会希望 sigstore 签名服务能够在开源软件开发领域普及开来。

此前很少有开源项目使用加密签名手段，主要原因是软件维护人员在密钥管理、撤销和公钥分配等工作方面遇到了一定的挑战。通常他们将公钥存储在易受黑客攻击的网站上，甚至放置在公共 git 存储库的 README 文件中。但随着 sigstore 公共服务的推出，我们可以使用临时密钥和信任根来规避上述问题（后者源于开放且可审核的公共透明日志）。

公钥是需要公开的，但是确保公开的公钥是可信的才是安全和信任的基石，这项服务可以有效而便捷地为开源软件分发提供安全保障。

### 世界上最强大的超算“富岳”即将全面投入运行

经过 7 年研制，世界上最快的超级计算机“富岳”在日本正式建成，现在已经可以供研究人员开始使用。其交付工作已于 2020 年 5 月完成，其后一直在对其进行试用。目前，该计算机已全面开放共享使用，日本信息科学与技术研究机构已选定 74 个研究项目，将于下月起实施。

“富岳”已经连续两届蝉联 Top500 榜首，其性能为 442 petaflops，遥遥领先于竞争对手，是榜单上第二名 IBM 的 Summit 的 3 倍，后者的性能为 148.8 petaflops。

超算竞赛极大的推高了计算力对世界的影响，在重要领域极有价值。不过，更重要的是，研发出来的超算能有合适的应用发挥其能力。


4 个打造多媒体和共享服务器的开源工具

# 4 个打造多媒体和共享服务器的开源工具

>
> 通过 Linux，你可以将任何设备变成服务器，以共享数据、媒体文件，以及其他资源。
>
>
>

在 2021 年，人们喜欢 Linux 的理由比以往任何时候都多。在这个系列中，我将分享 21 个使用 Linux 的不同理由。这里有四个开源工具，可以将任何设备变成 Linux 服务器。

有时，我会发现有关服务器概念的某种神秘色彩。许多人，如果他们在脑海中有一个形象的话，他们认为服务器一定是又大又重的机架式机器，由一个谨慎的系统管理员和一群神奇的修理工精心维护。另一些人则把服务器设想成虚无缥缈的云朵，以某种方式为互联网提供动力。

虽然这种敬畏对 IT 工作的安全性是有好处的，但事实上，在开源计算中，没有人认为服务器是或应该是专家的专属领域。文件和资源共享是开源不可或缺的，而开源让它变得比以往任何时候都更容易，正如这四个开源服务器项目所展示的那样。

### Samba

[Samba 项目](http://samba.org) 是 Linux 和 Unix 的 Windows 互操作程序套件。尽管它是大多数用户从未与之交互的底层代码，但它的重要性却不容小觑。从历史上看，早在微软争相消灭 Linux 和开源的时候，它就是最大最重要的目标。时代变了，微软已经与 Samba 团队会面以提供支持（至少目前是这样），在这一切中，该项目继续确保 Linux 和 Windows 计算机可以轻松地在同一网络上共存。换句话说，无论你使用什么平台，Samba 都可以让你可以轻松地在本地网络上共享文件。

在 [KDE Plasma](https://opensource.com/article/19/12/linux-kde-plasma) 桌面上，你可以右键点击自己的任何目录，选择**属性**。在**属性**对话框中，点击**共享**选项卡，并启用**与 Samba 共享（Microsoft Windows）**。

就这样，你已经为本地网络上的用户打开了一个只读访问的目录。也就是说，当你在家的时候，你家同一个 WiFi 网络上的任何人都可以访问该文件夹，如果你在工作，工作场所网络上的任何人都可以访问该文件夹。当然，要访问它，其他用户需要知道在哪里可以找到它。通往计算机的路径可以用 [IP 地址](https://opensource.com/article/18/5/how-find-ip-address-linux) 表示，也可以根据你的网络配置，用主机名表示。

### Snapdrop

如果通过 IP 地址和主机名来打开网络是令人困惑的，或者如果你不喜欢打开一个文件夹进行共享而忘记它是开放的，那么你可能更喜欢 [Snapdrop](https://github.com/RobinLinus/snapdrop)。这是一个开源项目，你可以自己运行，也可以使用互联网上的演示实例通过 WebRTC 连接计算机。WebRTC 可以通过 Web 浏览器实现点对点的连接，也就是说同一网络上的两个用户可以通过 Snapdrop 找到对方，然后直接进行通信，而不需要通过外部服务器。

一旦两个或更多的客户端连接了同一个 Snapdrop 服务，用户就可以通过本地网络来回交换文件和聊天信息。传输的速度很快，而且你的数据也保持在本地。

### VLC

流媒体服务比以往任何时候都更常见，但我在音乐和电影方面有非常规的口味，所以典型的服务似乎很少有我想要的东西。幸运的是，通过连接到媒体驱动器，我可以很容易地将自己的内容从我的电脑上传送到我的房子各个角落。例如，当我想在电脑显示器以外的屏幕上观看一部电影时，我可以在我的网络上串流电影文件，并通过任何可以接收 HTTP 的应用来播放它，无论该应用是在我的电视、游戏机还是手机上。

[VLC](https://www.videolan.org/index.html) 可以轻松设置流媒体。事实上，它是**媒体**菜单中的一个选项，或者你可以按下键盘 `Ctrl+S`。将一个文件或一组文件添加到你的流媒体队列中，然后点击 **Stream** 按钮。

VLC 通过配置向导来帮助你决定流媒体数据时使用什么协议。我倾向于使用 HTTP，因为它通常在任何设备上可用。当 VLC 开始播放文件时，请进入播放文件计算机的 IP 或主机名以及给它分配的端口 （当使用 HTTP 时，默认是 8080）, 然后坐下来享受。

### PulseAudio

我最喜欢的现代 Linux 功能之一是 [PulseAudio](https://www.freedesktop.org/wiki/Software/PulseAudio/)。Pulse 为 Linux 上的音频实现了惊人的灵活性，包括可自动发现的本地网络流媒体。这个功能对我来说的好处是，我可以在办公室的工作站上播放播客和技术会议视频，并通过手机串流音频。无论我走进厨房、休息室还是后院最远的地方，我都能获得完美的音频。此功能在 PulseAudio 之前很久就存在，但是 Pulse 使它像单击按钮一样容易。

需要进行一些设置。首先，你必须确保安装 PulseAudio 设置包（**paprefs**），以便在 PulseAudio 配置中启用网络音频。

在 **paprefs** 中，启用网络访问你的本地声音设备，可能不需要认证（假设你信任本地网络上的其他人），并启用你的计算机作为 **Multicast/RTP 发送者**。我通常只选择串流通过我的扬声器播放的任何音频，但你可以在 Pulse 输出选项卡中创建一个单独的音频设备，这样你就可以准确地选择串流的内容。你在这里有三个选项：

* 串流任何在扬声器上播放的音频
* 串流所有输出的声音
* 只将音频直接串流到多播设备（按需）。

一旦启用，你的声音就会串流到网络中，并可被其他本地 Linux 设备接收。这是简单和动态的音频共享。

### 分享的不仅仅是代码

Linux 是共享的。它在服务器领域很有名，因为它很擅长*服务*。无论是提供音频流、视频流、文件，还是出色的用户体验，每一台 Linux 电脑都是一台出色的 Linux 服务器。

---

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

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

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


硬核观察 | 推特 CEO 的第一条推文可能拍卖出 250 万美元

Summary: 更多：• RedMonk 排名：JavaScript 稳居榜首 • 微软正式干掉了传统版 Edge 浏览器

# 硬核观察 | 推特 CEO 的第一条推文可能拍卖出 250 万美元

### 推特 CEO 的第一条推文可能拍卖出 250 万美元

前两天，推特 CEO Dorsey 将其发布的[第一条推文，同时也是推特全平台的历史首条推文](https://twitter.com/jack/status/20 "https://twitter.com/jack/status/20")通过 Valuables 以 NFT 的形式进行了拍卖，尽管当时没有宣布拍卖何时结束，也没有宣布拍卖所得会捐赠给慈善事业，但是人们还是纷纷涌入竞相出价。获胜者将获得一份“该推特的数字证书”。

目前，这条推文的拍卖出价已经高达 250 万美元。出价者为预言机系统 Bridge Oracle 首席执行官，此前孙宇晨出价 200 万美元。拍卖将于 3 月 21 日结束，所以很可能会有更高的出价。Dorsey 计划将拍卖所得的比特币捐给一个非营利组织，以用于非洲的 COVID-19 救援。

或许在现在看起来 NFT 的火爆有些魔怔，不过也许将来会发现其价值，虽然这个拍卖价值目前看起来高的离谱。

### RedMonk 排名：JavaScript 稳居榜首

RedMonk 在过去的十年里，定期将 Stack Overflow 上的语言讨论与 GitHub 上的使用情况关联起来，以洞察采用趋势。最新的[排名](https://redmonk.com/sogrady/2021/03/01/language-rankings-1-21/ "https://redmonk.com/sogrady/2021/03/01/language-rankings-1-21/")是，JavaScript 仍然位居榜首，其次是 Python、Java、PHP，C#、C++ 和 CSS 并列第五名。与早期版本的排名相比，放在前 20 名的语言中有一半出现了变动。

JavaScript 能稳居榜首，既意外也不意外，毕竟这是一个 Web 互联网的时代。

### 微软正式干掉了传统版 Edge 浏览器

微软宣布，“我们新的现代浏览器微软 Edge 在一年多前首次亮相，今天可以在数亿台设备上找到它。去年 8 月，我们宣布传统版 Edge 桌面应用支持将于 2021 年 3 月 9 日结束。”

在 3 月份的星期二补丁周期中，微软发布了对传统版 Edge 浏览器的最后一次更新。而在下个月将会发布移除更新，在所有 Windows 10 设备上用 Chromium Edge 来取代传统版 Edge。

虽然当时微软放弃传统版 Edge 浏览器这一决策令人吃惊，但是效果确实出奇的好。不过 Edge 传统版的落幕，还是让人有点淡淡的忧伤。


利用 BATS 测试 Bash 脚本和库

# 利用 BATS 测试 Bash 脚本和库

>
> Bash 自动测试系统可以使 Bash 代码也通过 Java、Ruby 和 Python 开发人员所使用的同类测试过程。
>
>
>

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

用 Java、Ruby 和 Python 等语言编写应用程序的软件开发人员拥有复杂的库，可以帮助他们随着时间的推移保持软件的完整性。他们可以创建测试，以在结构化环境中通过执行一系列动作来运行应用程序，以确保其软件所有的方面均按预期工作。

当这些测试在持续集成（CI）系统中自动进行时，它们的功能就更加强大了，每次推送到源代码库都会触发测试，并且在测试失败时会立即通知开发人员。这种快速反馈提高了开发人员对其应用程序功能完整性的信心。

<ruby> Bash 自动测试系统 <rt>  Bash Automated Testing System </rt></ruby>（[BATS](https://github.com/sstephenson/bats)）使编写 Bash 脚本和库的开发人员能够将 Java、Ruby、Python 和其他开发人员所使用的相同惯例应用于其 Bash 代码中。

### 安装 BATS

BATS GitHub 页面包含了安装指令。有两个 BATS 辅助库提供更强大的断言或允许覆写 BATS 使用的 Test Anything Protocol（[TAP](http://testanything.org/)）输出格式。这些库可以安装在一个标准位置，并被所有的脚本引用。更方便的做法是，将 BATS 及其辅助库的完整版本包含在 Git 仓库中，用于要测试的每组脚本或库。这可以通过 [git 子模块](https://git-scm.com/book/en/v2/Git-Tools-Submodules) 系统来完成。

以下命令会将 BATS 及其辅助库安装到 Git 知识库中的 `test` 目录中。

```
git submodule init
git submodule add https://github.com/sstephenson/bats test/libs/bats
git submodule add https://github.com/ztombol/bats-assert test/libs/bats-assert
git submodule add https://github.com/ztombol/bats-support test/libs/bats-support
git add .
git commit -m 'installed bats'

```

要克隆 Git 仓库并同时安装其子模块，请在 `git clone` 时使用 `--recurse-submodules` 标记。

每个 BATS 测试脚本必须由 `bats` 可执行文件执行。如果你将 BATS 安装到源代码仓库的 `test/libs` 目录中，则可以使用以下命令调用测试：

```
./test/libs/bats/bin/bats <测试脚本的路径>

```

或者，将以下内容添加到每个 BATS 测试脚本的开头：

```
#!/usr/bin/env ./test/libs/bats/bin/bats
load 'libs/bats-support/load'
load 'libs/bats-assert/load'

```

并且执行命令 `chmod +x <测试脚本的路径>`。 这将 a、使它们可与安装在 `./test/libs/bats` 中的 BATS 一同执行，并且 b、包含这些辅助库。BATS 测试脚本通常存储在 `test` 目录中，并以要测试的脚本命名，扩展名为 `.bats`。例如，一个测试 `bin/build` 的 BATS 脚本应称为 `test/build.bats`。

你还可以通过向 BATS 传递正则表达式来运行一整套 BATS 测试文件，例如 `./test/lib/bats/bin/bats test/*.bats`。

### 为 BATS 覆盖率而组织库和脚本

Bash 脚本和库必须以一种有效地方式将其内部工作原理暴露给 BATS 进行组织。通常，在调用或执行时库函数和运行诸多命令的 Shell 脚本不适合进行有效的 BATS 测试。

例如，[build.sh](https://github.com/dmlond/how_to_bats/blob/preBats/build.sh) 是许多人都会编写的典型脚本。本质上是一大堆代码。有些人甚至可能将这堆代码放入库中的函数中。但是，在 BATS 测试中运行一大堆代码，并在单独的测试用例中覆盖它可能遇到的所有故障类型是不可能的。测试这堆代码并有足够的覆盖率的唯一方法就是把它分解成许多小的、可重用的、最重要的是可独立测试的函数。

向库添加更多的函数很简单。额外的好处是其中一些函数本身可以变得出奇的有用。将库函数分解为许多较小的函数后，你可以在 BATS 测试中<ruby> 援引 <rt>  source </rt></ruby>这些库，并像测试任何其他命令一样运行这些函数。

Bash 脚本也必须分解为多个函数，执行脚本时，脚本的主要部分应调用这些函数。此外，还有一个非常有用的技巧，可以让你更容易地用 BATS 测试 Bash 脚本：将脚本主要部分中执行的所有代码都移到一个函数中，称为 `run_main`。然后，将以下内容添加到脚本的末尾：

```
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]
then
  run_main
fi

```

这段额外的代码做了一些特别的事情。它使脚本在作为脚本执行时与使用<ruby> 援引 <rt>  source </rt></ruby>进入环境时的行为有所不同。通过援引并测试单个函数，这个技巧使得脚本的测试方式和库的测试方式变得一样。例如，[这是重构的 build.sh，以获得更好的 BATS 可测试性](https://github.com/dmlond/how_to_bats/blob/master/bin/build.sh)。

### 编写和运行测试

如上所述，BATS 是一个 TAP 兼容的测试框架，其语法和输出对于使用过其他 TAP 兼容测试套件（例如 JUnit、RSpec 或 Jest）的用户来说将是熟悉的。它的测试被组织成单个测试脚本。测试脚本被组织成一个或多个描述性 `@test` 块中，它们描述了被测试应用程序的单元。每个 `@test` 块将运行一系列命令，这些命令准备测试环境、运行要测试的命令，并对被测试命令的退出和输出进行断言。许多断言函数是通过 `bats`、`bats-assert` 和 `bats-support` 库导入的，这些库在 BATS 测试脚本的开头加载到环境中。下面是一个典型的 BATS 测试块：

```
@test "requires CI_COMMIT_REF_SLUG environment variable" {
  unset CI_COMMIT_REF_SLUG
  assert_empty "${CI_COMMIT_REF_SLUG}"
  run some_command
  assert_failure
  assert_output --partial "CI_COMMIT_REF_SLUG"
}

```

如果 BATS 脚本包含 `setup`（安装）和/或 `teardown`（拆卸） 函数，则 BATS 将在每个测试块运行之前和之后自动执行它们。这样就可以创建环境变量、测试文件以及执行一个或所有测试所需的其他操作，然后在每次测试运行后将其拆卸。[Build.bats](https://github.com/dmlond/how_to_bats/blob/master/test/build.bats) 是对我们新格式化的 `build.sh` 脚本的完整 BATS 测试。（此测试中的 `mock_docker` 命令将在以下关于模拟/打标的部分中进行说明。）

当测试脚本运行时，BATS 使用 `exec`（执行）来将每个 `@test` 块作为单独的子进程运行。这样就可以在一个 `@test` 中导出环境变量甚至函数，而不会影响其他 `@test` 或污染你当前的 Shell 会话。测试运行的输出是一种标准格式，可以被人理解，并且可以由 TAP 使用端以编程方式进行解析或操作。下面是 `CI_COMMIT_REF_SLUG` 测试块失败时的输出示例：

```
 ✗ requires CI_COMMIT_REF_SLUG environment variable
   (from function `assert_output' in file test/libs/bats-assert/src/assert.bash, line 231,
    in test file test/ci_deploy.bats, line 26)
     `assert_output --partial "CI_COMMIT_REF_SLUG"' failed

   -- output does not contain substring --
   substring (1 lines):
     CI_COMMIT_REF_SLUG
   output (3 lines):
     ./bin/deploy.sh: join_string_by: command not found
     oc error
     Could not login
   --

   ** Did not delete , as test failed **

1 test, 1 failure

```

下面是成功测试的输出：

```
✓ requires CI_COMMIT_REF_SLUG environment variable

```

### 辅助库

像任何 Shell 脚本或库一样，BATS 测试脚本可以包括辅助库，以在测试之间共享通用代码或增强其性能。这些辅助库，例如 `bats-assert` 和 `bats-support` 甚至可以使用 BATS 进行测试。

库可以和 BATS 脚本放在同一个测试目录下，如果测试目录下的文件数量过多，也可以放在 `test/libs` 目录下。BATS 提供了 `load` 函数，该函数接受一个相对于要测试的脚本的 Bash 文件的路径（例如，在我们的示例中的 `test`），并援引该文件。文件必须以后缀 `.bash` 结尾，但是传递给 `load` 函数的文件路径不能包含后缀。`build.bats` 加载 `bats-assert` 和 `bats-support` 库、一个小型 [helpers.bash](https://github.com/dmlond/how_to_bats/blob/master/test/helpers.bash) 库以及 `docker_mock.bash` 库（如下所述），以下代码位于测试脚本的开头，解释器魔力行下方：

```
load 'libs/bats-support/load'
load 'libs/bats-assert/load'
load 'helpers'
load 'docker_mock'

```

### 打标测试输入和模拟外部调用

大多数 Bash 脚本和库运行时都会执行函数和/或可执行文件。通常，它们被编程为基于这些函数或可执行文件的输出状态或输出（`stdout`、`stderr`）以特定方式运行。为了正确地测试这些脚本，通常需要制作这些命令的伪版本，这些命令被设计成在特定测试过程中以特定方式运行，称为“<ruby> 打标 <rt>  stubbing </rt></ruby>”。可能还需要监视正在测试的程序，以确保其调用了特定命令，或者使用特定参数调用了特定命令，此过程称为“<ruby> 模拟 <rt>  mocking </rt></ruby>”。有关更多信息，请查看在 Ruby RSpec 中 [有关模拟和打标的讨论](https://www.codewithjason.com/rspec-mocks-stubs-plain-english/)，它适用于任何测试系统。

Bash shell 提供了一些技巧，可以在你的 BATS 测试脚本中使用这些技巧进行模拟和打标。所有这些都需要使用带有 `-f` 标志的 Bash `export` 命令来导出一个覆盖了原始函数或可执行文件的函数。必须在测试程序执行之前完成此操作。下面是重写可执行命令 `cat` 的简单示例：

```
function cat() { echo "THIS WOULD CAT ${*}" }
export -f cat

```

此方法以相同的方式覆盖了函数。如果一个测试需要覆盖要测试的脚本或库中的函数，则在对函数进行打标或模拟之前，必须先声明已测试脚本或库，这一点很重要。否则，在声明脚本时，打标/模拟将被原函数替代。另外，在运行即将进行的测试命令之前确认打标/模拟。下面是`build.bats` 的示例，该示例模拟 `build.sh` 中描述的`raise` 函数，以确保登录函数会引发特定的错误消息：

```
@test ".login raises on oc error" {
  source ${profile_script}
  function raise() { echo "${1} raised"; }
  export -f raise
  run login
  assert_failure
  assert_output -p "Could not login raised"
}

```

一般情况下，没有必要在测试后复原打标/模拟的函数，因为 `export`（输出）仅在当前 `@test` 块的 `exec`（执行）期间影响当前子进程。但是，可以模拟/打标 BATS `assert` 函数在内部使用的命令（例如 `cat`、`sed` 等）是可能的。在运行这些断言命令之前，必须对这些模拟/打标函数进行 `unset`（复原），否则它们将无法正常工作。下面是 `build.bats` 中的一个示例，该示例模拟 `sed`，运行 `build_deployable` 函数并在运行任何断言之前复原 `sed`：

```
@test ".build_deployable prints information, runs docker build on a modified Dockerfile.production and publish_image when its not a dry_run" {
  local expected_dockerfile='Dockerfile.production'
  local application='application'
  local environment='environment'
  local expected_original_base_image="${application}"
  local expected_candidate_image="${application}-candidate:${environment}"
  local expected_deployable_image="${application}:${environment}"
  source ${profile_script}
  mock_docker build --build-arg OAUTH_CLIENT_ID --build-arg OAUTH_REDIRECT --build-arg DDS_API_BASE_URL -t "${expected_deployable_image}" -
  function publish_image() { echo "publish_image ${*}"; }
  export -f publish_image
  function sed() {
    echo "sed ${*}" >&2;
    echo "FROM application-candidate:environment";
  }
  export -f sed
  run build_deployable "${application}" "${environment}"
  assert_success
  unset sed
  assert_output --regexp "sed.*${expected_dockerfile}"
  assert_output -p "Building ${expected_original_base_image} deployable ${expected_deployable_image} FROM ${expected_candidate_image}"
  assert_output -p "FROM ${expected_candidate_image} piped"
  assert_output -p "build --build-arg OAUTH_CLIENT_ID --build-arg OAUTH_REDIRECT --build-arg DDS_API_BASE_URL -t ${expected_deployable_image} -"
  assert_output -p "publish_image ${expected_deployable_image}"
}

```

有的时候相同的命令，例如 `foo`，将在被测试的同一函数中使用不同的参数多次调用。这些情况需要创建一组函数：

* `mock_foo`：将期望的参数作为输入，并将其持久化到 TMP 文件中
* `foo`：命令的模拟版本，该命令使用持久化的预期参数列表处理每个调用。必须使用 `export -f` 将其导出。
* `cleanup_foo`：删除 TMP 文件，用于拆卸函数。这可以进行测试以确保在删除之前成功完成 `@test` 块。

由于此功能通常在不同的测试中重复使用，因此创建一个可以像其他库一样加载的辅助库会变得有意义。

[docker\_mock.bash](https://github.com/dmlond/how_to_bats/blob/master/test/docker_mock.bash) 是一个很棒的例子。它被加载到 `build.bats` 中，并在任何测试调用 Docker 可执行文件的函数的测试块中使用。使用 `docker_mock` 典型的测试块如下所示：

```
@test ".publish_image fails if docker push fails" {
  setup_publish
  local expected_image="image"
  local expected_publishable_image="${CI_REGISTRY_IMAGE}/${expected_image}"
  source ${profile_script}
  mock_docker tag "${expected_image}" "${expected_publishable_image}"
  mock_docker push "${expected_publishable_image}" and_fail
  run publish_image "${expected_image}"
  assert_failure
  assert_output -p "tagging ${expected_image} as ${expected_publishable_image}"
  assert_output -p "tag ${expected_image} ${expected_publishable_image}"
  assert_output -p "pushing image to gitlab registry"
  assert_output -p "push ${expected_publishable_image}"
}

```

该测试建立了一个使用不同的参数两次调用 Docker 的预期。在对Docker 的第二次调用失败时，它会运行测试命令，然后测试退出状态和对 Docker 调用的预期。

一方面 BATS 利用 `mock_docker.bash` 引入 `${BATS_TMPDIR}` 环境变量，BATS 在测试开始的位置对其进行了设置，以允许测试和辅助程序在标准位置创建和销毁 TMP 文件。如果测试失败，`mock_docker.bash` 库不会删除其持久化的模拟文件，但会打印出其所在位置，以便可以查看和删除它。你可能需要定期从该目录中清除旧的模拟文件。

关于模拟/打标的一个注意事项：`build.bats` 测试有意识地违反了关于测试声明的规定：[不要模拟没有拥有的！](https://github.com/testdouble/contributing-tests/wiki/Don't-mock-what-you-don't-own) 该规定要求调用开发人员没有编写代码的测试命令，例如 `docker`、`cat`、`sed` 等，应封装在自己的库中，应在使用它们脚本的测试中对其进行模拟。然后应该在不模拟外部命令的情况下测试封装库。

这是一个很好的建议，而忽略它是有代价的。如果 Docker CLI API 发生变化，则测试脚本不会检测到此变化，从而导致错误内容直到经过测试的 `build.sh` 脚本在使用新版本 Docker 的生产环境中运行后才显示出来。测试开发人员必须确定要严格遵守此标准的程度，但是他们应该了解其所涉及的权衡。

### 总结

在任何软件开发项目中引入测试制度，都会在以下两方面产生权衡： a、增加开发和维护代码及测试所需的时间和组织，b、增加开发人员在对应用程序整个生命周期中完整性的信心。测试制度可能不适用于所有脚本和库。

通常，满足以下一个或多个条件的脚本和库才可以使用 BATS 测试：

* 值得存储在源代码管理中
* 用于关键流程中，并依靠它们长期稳定运行
* 需要定期对其进行修改以添加/删除/修改其功能
* 可以被其他人使用

一旦决定将测试规则应用于一个或多个 Bash 脚本或库，BATS 就提供其他软件开发环境中可用的全面测试功能。

致谢：感谢 [Darrin Mann](https://github.com/dmann) 向我引荐了 BATS 测试。

---

via: <https://opensource.com/article/19/2/testing-bash-bats>

作者：[Darin London](https://opensource.com/users/dmlond) 选题：[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 上安装官方 Evernote 客户端

可惜国内的印象笔记账户登录不了！

# 在 Linux 上安装官方 Evernote 客户端

[Evernote](https://evernote.com/) 是一款流行的笔记应用。它在推出时是一个革命性的产品。从那时起，已经有好几个这样的应用，可以将网络剪报、笔记等保存为笔记本格式。

多年来，Evernote 一直没有在 Linux 上使用的桌面客户端。前段时间 Evernote 承诺推出 Linux 应用，其测试版终于可以在基于 Ubuntu 的发行版上使用了。

>
> 非 FOSS 警报！
>
>
> Evernote Linux 客户端不是开源的。之所以在这里介绍它，是因为该应用是在 Linux 上提供的，我们也会不定期地介绍 Linux 用户常用的非 FOSS 应用。这对普通桌面 Linux 用户有帮助。
>
>
>

### 在 Ubuntu 和基于 Debian 的 Linux 发行版上安装 Evernote

进入这个 Evernote 的[网站页面](https://evernote.com/intl/en/b1433t1422)。

向下滚动一点，接受“早期测试计划”的条款和条件。你会看到一个“立即安装”的按钮出现在屏幕上。点击它来下载 DEB 文件。

要 [从 DEB 文件安装应用](https://itsfoss.com/install-deb-files-ubuntu/)，请双击它。它应该会打开软件中心，并给你选择安装它。

安装完成后，在系统菜单中搜索 Evernote 并启动它。

当你第一次启动应用时，你需要登录到你的 Evernote 账户。

第一次运行会带你进入“主页面”，在这里你可以整理你的笔记本，以便更快速地访问。

你现在可以享受在 Linux 上使用 Evernote 了。

### 体验 Evernote 的 Linux 测试版客户端

由于软件处于测试版，因此这里或那里会有些问题。

如上图所示，Evernote Linux 客户端检测到 [Ubuntu 中的深色模式](https://itsfoss.com/dark-mode-ubuntu/) 并自动切换到深色主题。然而，当我把系统主题改为浅色或标准主题时，它并没有立即改变应用主题。这些变化是在我重启 Evernote 应用后才生效的。

另一个问题是关于关闭应用。如果你点击 “X” 按钮关闭 Evernote，程序会进入后台而不是退出。

有一个似乎可以启动最小化的 Evernote 的应用指示器，就像 [Linux 上的 Skype](https://itsfoss.com/install-skype-ubuntu-1404/)。不幸的是，事实并非如此。它打开了便笺，让你快速输入笔记。

这为你提供了另一个 [Linux 上的笔记应用](https://itsfoss.com/note-taking-apps-linux/)，但它也带来了一个问题。这里没有退出 Evernote 的选项。它只用于打开快速记事应用。

那么，如何退出 Evernote 应用呢？为此，再次打开 Evernote 应用。如果它在后台运行，在菜单中搜索它，并启动它，就像你重新打开它一样。

当 Evernote 应用在前台运行时，点击 “文件->退出” 来退出 Evernote。

这一点开发者应该在未来的版本中寻求改进。

我也不能说测试版的程序将来会如何更新。它没有添加任何仓库。我只是希望程序本身能够通知用户有新的版本，这样用户就可以下载新的 DEB 文件。

我并没有订阅 Evernote Premium，但我仍然可以在没有网络连接的情况下访问保存的网络文章和笔记。很奇怪，对吧？

总的来说，我很高兴看到 Evernote 终于努力把这个应用带到了 Linux 上。现在，你不必再尝试第三方应用来在 Linux 上使用 Evernote 了，至少在 Ubuntu 和基于 Debian 的发行版上是这样。当然，你可以使用 [Evernote 替代品](https://itsfoss.com/5-evernote-alternatives-linux/)，比如 [Joplin](https://itsfoss.com/joplin/)，它们都是开源的。

---

via: <https://itsfoss.com/install-evernote-ubuntu/>

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

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


硬核观察 | 黑客入侵了数以千计的监控探头，特斯拉仓库也在列

Summary: 更多：• IBM 开发 AI 发明新的抗生素 • 2017 年的龙芯 2K1000 已获得新的 Linux 内核补丁

# 硬核观察 | 黑客入侵了数以千计的监控探头，特斯拉仓库也在列

### 黑客入侵了数以千计的监控探头，特斯拉仓库也在列

黑客[入侵](https://www.bnnbloomberg.ca/hackers-break-into-thousands-of-security-cameras-exposing-tesla-jails-hospitals-1.1574681)了硅谷创业公司 Verkada 收集的监控探头数据库，访问了超过 15 万探头的实时视频源，而这些探头安装在医院、企业、监狱、警察局和学校内。包括特斯拉、Cloudflare 在内的知名企业的监控探头遭到泄露。

黑客演示了特斯拉位于上海的仓库内的监控探头视频，他们表示访问了 222 个特斯拉工厂和仓库探头。黑客此举是为了展示监控的无处不在，以及监控系统很容易遭到入侵。

身处摄像头丛林，却不知道谁在看着你。

### IBM 开发 AI 发明新的抗生素

抗生素耐药“超级细菌”需要新的抗生素来对抗，但开发它们需要时间。IBM 研究团队创建了一个人工智能系统，它在探索整个分子配置的可能性空间方面速度更快。在 48 天的时间里，AI 系统识别、合成和实验了 20 种新的抗生素候选肽。其中有两种特别被证明是特别有前途。

如果说科技向善，这才是科技应该用的地方。

### 2017 年的龙芯 2K1000 已获得新的 Linux 内核补丁

虽然已被更先进的龙芯 3 号所取代，但国产 MIPS64 芯片制造商龙芯在 2017 年发布的 2K1000 芯片，还是于近日获得了最新的 Linux 内核[补丁](https://lore.kernel.org/lkml/20210310075639.20372-1-zhangqing@loongson.cn/)。最新补丁中，为该芯片提供了基础支持（暂未包含 SMP 支持 / 其它外围设备的启用），以及引入了 700 多行新代码。

国产硬件的开源生态支持，无论是厂商资源，还是社区力量，都显得不足。


WebAssembly 介绍

Summary: WebAssembly，也叫 Wasm，是一种为 Web 优化的代码格式和 API（应用编程接口），它可以大大提高网站的性能和能力。

# WebAssembly 介绍

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

### 到底什么是 WebAssembly？

[WebAssembly](https://webassembly.org/)，也叫 Wasm，是一种为 Web 优化的代码格式和 API（应用编程接口），它可以大大提高网站的性能和能力。WebAssembly 的 1.0 版本于 2017 年发布，并于 2019 年成为 W3C 官方标准。

该标准得到了所有主流浏览器供应商的积极支持，原因显而易见：官方列出的 [“浏览器内部”用例](https://webassembly.org/docs/use-cases/) 中提到了，其中包括视频编辑、3D 游戏、虚拟和增强现实、p2p 服务和科学模拟。除了让浏览器的功能比JavaScript 强大得多，该标准甚至可以延长网站的寿命：例如，正是 WebAssembly 为 [互联网档案馆的 Flash 动画和游戏](https://blog.archive.org/2020/11/19/flash-animations-live-forever-at-the-internet-archive/) 提供了持续的支持。

不过，WebAssembly 并不只用于浏览器，目前它还被用于移动和基于边缘环境的 Cloudflare Workers 等产品中。

### WebAssembly 如何工作？

.wasm 格式的文件包含低级二进制指令（字节码），可由使用通用栈的虚拟机以“接近 CPU 原生速度”执行。这些代码被打包成模块（可以被浏览器直接执行的对象），每个模块可以被一个网页多次实例化。模块内部定义的函数被列在一个专用数组中，或称为<ruby> 表 <rt>  Table </rt></ruby>，相应的数据被包含在另一个结构中，称为 <ruby> 缓存数组 <rt>  arraybuffer </rt></ruby>。开发者可以通过 Javascript `WebAssembly.memory()` 的调用，为 .wasm 代码显式分配内存。

.wasm 格式也有纯文本版本，它可以大大简化学习和调试。然而，WebAssembly 并不是真的要供人直接使用。从技术上讲，.wasm 只是一个与浏览器兼容的**编译目标**：一种用高级编程语言编写的软件编译器可以自动翻译的代码格式。

这种选择正是使开发人员能够使用数十亿人熟悉的语言（C/C++、Python、Go、Rust 等）直接为用户界面进行编程的方式，但以前浏览器无法对其进行有效利用。更妙的是，至少在理论上程序员可以利用它们，无需直接查看 WebAssembly 代码，也无需担心物理 CPU 实际运行他们的代码（因为目标是一个**虚拟**机）。

### 但是我们已经有了 JavaScript，我们真的需要 WebAssembly 吗？

是的，有几个原因。首先，作为二进制指令，.wasm 文件比同等功能的 JavaScript 文件小得多，下载速度也快得多。最重要的是，Javascript 文件必须在浏览器将其转换为其内部虚拟机可用的字节码之前进行完全解析和验证。

而 .wasm 文件则可以一次性验证和编译，从而使“流式编译”成为可能：浏览器在开始**下载它们**的那一刻就可以开始编译和执行它们，就像串流电影一样。

这就是说，并不是所有可以想到的 WebAssembly 应用都肯定会比由专业程序员手动优化的等效 JavaScript 应用更快或更小。例如，如果一些 .wasm 需要包含 JavaScript 不需要的库，这种情况可能会发生。

### WebAssembly 是否会让 JavaScript 过时？

一句话：不会。暂时不会，至少在浏览器内不会。WebAssembly 模块仍然需要 JavaScript，因为在设计上它们不能访问文档对象模型 （DOM）—— [主要用于修改网页的 API](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Introduction)。此外，.wasm 代码不能进行系统调用或读取浏览器的内存。WebAssembly 只能在沙箱中运行，一般来说，它能与外界的交互甚至比 JavaScript 更少，而且只能通过 JavaScript 接口进行。

因此，至少在不久的将来 .wasm 模块将只是通过 JavaScript 提供那些如果用 JavaScript 语言编写会消耗更多带宽、内存或 CPU 时间的部分。

### Web 浏览器如何运行 WebAssembly？

一般来说，浏览器至少需要两块来处理动态应用：运行应用代码的虚拟机（VM），以及可以同时修改浏览器行为和网页显示的 API。

现代浏览器内部的虚拟机通过以下方式同时支持 JavaScript 和 WebAssembly：

1. 浏览器下载一个用 HTML 标记语言编写的网页，然后进行渲染
2. 如果该 HTML 调用 JavaScript 代码，浏览器的虚拟机就会执行该代码。但是...
3. 如果 JavaScript 代码中包含了 WebAssembly 模块的实例，那么就按照上面的描述获取该实例，然后根据需要通过 JavaScript 的 WebAssembly API 来使用该实例
4. 当 WebAssembly 代码产生的东西将修改 DOM（即“宿主”网页）的结构，JavaScript 代码就会接收到，并继续进行实际的修改。

### 我如何才能创建可用的 WebAssembly 代码？

越来越多的编程语言社区支持直接编译到 Wasm，我们建议从 [webassembly.org](http://webassembly.org) 的 [入门指南](https://webassembly.org/getting-started/developers-guide/) 开始，这取决于你使用什么语言。请注意，并不是所有的编程语言都有相同水平的 Wasm 支持，因此你的工作量可能会有所不同。

我们计划在未来几个月内发布一系列文章，提供更多关于 WebAssembly 的信息。要自己开始使用它，你可以报名参加 Linux 基金会的免费 [WebAssembly 介绍](https://training.linuxfoundation.org/training/introduction-to-webassembly-lfd133/)在线培训课程。

这篇[WebAssembly 介绍](https://training.linuxfoundation.org/announcements/an-introduction-to-webassembly/)首次发布在 [Linux Foundation – Training](https://training.linuxfoundation.org/)。

---

via: <https://www.linux.com/news/an-introduction-to-webassembly/>

作者：[Dan Brown](https://training.linuxfoundation.org/announcements/an-introduction-to-webassembly/) 选题：[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/) 荣誉推出


硬核观察 | 吴晟当选首位华人 Apache 软件基金会董事

Summary: 更多：• 欧洲最大云服务公司 OVH 机房着火，350 万家网站下线 • 佳士得以近 7000 万美元拍卖出一枚 NFT 加密艺术品

加密艺术品的潜力 x<br />
投机艺术品的潜力 v

# 硬核观察 | 吴晟当选首位华人 Apache 软件基金会董事

### 吴晟当选首位华人 Apache 软件基金会董事

在本周举行的 Apache 软件基金会（ASF）年度会员大会上，吴晟当选为 ASF 董事会成员，这是首位华人担任的 ASF 董事。此外，还有 7 位来自中国的新成员也接到了正式成员邀请。至此 ASF 中国区成员预计将达到 28 位，而全球仅 700 余位正式成员。

吴晟所创建并担任项目 VP 的分布式程序监测软件 SkyWalking 是国内唯一一款由个人开源成为 Apache 基金会的顶级开源项目。除此之外，其本人还是 Apache ShardingSphere 项目联合创始人，并且担任 Apache 基金会旗下多个顶级开源项目 PMC 成员与孵化器指导者。

让我们恭喜吴晟！恭喜 Apache 基金会！

### 欧洲最大云服务公司 OVH 机房着火，350 万家网站下线

OVH 位于法国的机房前日发生严重火灾，有一个数据中心被完全烧毁、部分客户数据完全丢失且无法恢复。这场灾难已导致超过 350 万个网站下线，而这一切发生在 OVH 启动了 IPO 计划两天之后。OVH 表示将在接下来的 1-2 周对服务器进行紧急修复，完全恢复时间待定。

看来没有多地备份，都放在一个数据中心有点风险啊，不过这么大规模的失火也实属罕见，预见 OVH 的 IPO 不会很顺利。

### 佳士得以近 7000 万美元拍卖出一枚 NFT 加密艺术品

3 月 11 日，世界知名艺术品拍卖行佳士得挂出的艺术家 Beeple 的数字化艺术作品《The First 5000 Days》投标截止，最终显示的价格为 6934.625 万美元。此次网上拍卖成为了加密艺术品发展的里程碑。

2007 年 5 月 1 日，Beeple 开始每天创作艺术作品，历时 13 年，这幅拍品汇集了该艺术家在前 5000 天创作的画作。

艺术品的市场一般人不懂，加密艺术品就更不是一般人能理解的了。能拍卖到如此令人瞠目结舌的价格，其背后揭示了加密艺术品市场的潜力和火爆！


如何更新 openSUSE Linux 系统

Summary: 随着我对 openSUSE 的不断探索，我不断发现 SUSE 中略有不同的东西，并打算在教程中介绍它们。

期待博主更多关于openSUSE的教程，我也是刚接触openSUSE Leap 15.3，请教一下，怎样把 Leap-15.3 的系统内核升级到 5.15 新版内核？

# 如何更新 openSUSE Linux 系统

就我记忆所及，我一直是 Ubuntu 的用户。我曾经转向过其他发行版，但最终还是一次次回到 Ubuntu。但最近，我开始使用 openSUSE 来尝试一些非 Debian 的东西。

随着我对 [openSUSE](https://www.opensuse.org/) 的不断探索，我不断发现 SUSE 中略有不同的东西，并打算在教程中介绍它们。

第一篇我写的是更新 openSUSE 系统。有两种方法可以做到：

* 使用终端（适用于 openSUSE 桌面和服务器）
* 使用图形工具（适用于 openSUSE 桌面）

### 通过命令行更新 openSUSE

更新 openSUSE 的最简单方法是使用 `zypper` 命令。它提供了补丁和更新管理的全部功能。它可以解决文件冲突和依赖性问题。更新也包括 Linux 内核。

如果你正在使用 openSUSE Leap，请使用这个命令：

```
sudo zypper update

```

你也可以用 `up` 代替 `update`，但我觉得 `update` 更容易记住。

如果你正在使用 openSUSE Tumbleweed，请使用 `dist-upgrade` 或者 `dup`（简称）。Tumbleweed 是[滚动发行版](https://itsfoss.com/rolling-release/)，因此建议使用 `dist-upgrade` 选项。

```
sudo zypper dist-upgrade

```

它将显示要升级、删除或安装的软件包列表。

如果你的系统需要重启，你会得到通知。

如果你只是想刷新仓库（像 `sudo apt update` 一样），你可以使用这个命令：

```
sudo zypper refresh

```

如果你想列出可用的更新，也可以这样做：

```
sudo zypper list-updates

```

### 以图形方式更新 openSUSE

如果你使用 openSUSE 作为桌面，你可以选择使用 GUI 工具来安装更新。这个工具可能会根据 [你使用的桌面环境](https://itsfoss.com/find-desktop-environment/) 而改变。

例如，KDE 有自己的软件中心，叫做 “Discover”。你可以用它来搜索和安装新的应用。你也可以用它来安装系统更新。

事实上，KDE 会在通知区通知你可用的系统更新。你必须打开 Discover，因为点击通知不会自动进入 Discover。

如果你觉得这很烦人，你可以使用这些命令禁用它：

```
sudo zypper remove plasma5-pk-updates
sudo zypper addlock plasma5-pk-updates

```

不过我不推荐。最好是获取可用的更新通知。

还有一个 YAST 软件管理 [GUI 工具](https://itsfoss.com/gui-cli-tui/)，你可以用它来对软件包管理进行更精细的控制。

就是这些了。这是一篇简短的文章。在下一篇 SUSE 教程中，我将通过实例向大家展示一些常用的 `zypper` 命令。敬请期待。

---

via: <https://itsfoss.com/update-opensuse/>

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


6 个最佳的 Git 仓库管理实践

Summary: 抵制在 Git 中添加一些会增加管理难度的东西的冲动；这里有替代方法。

抵制在 Git 中添加一些会增加管理难度的东西的冲动；这里有替代方法。

# 6 个最佳的 Git 仓库管理实践

>
> 抵制在 Git 中添加一些会增加管理难度的东西的冲动；这里有替代方法。
>
>
>

有权访问源代码使对安全性的分析以及应用程序的安全成为可能。但是，如果没有人真正看过代码，问题就不会被发现，即使人们主动地看代码，通常也要看很多东西。幸运的是，GitHub 拥有一个活跃的安全团队，最近，他们 [发现了已提交到多个 Git 仓库中的特洛伊木马病毒](https://securitylab.github.com/research/octopus-scanner-malware-open-source-supply-chain/)，甚至仓库的所有者也偷偷溜走了。尽管我们无法控制其他人如何管理自己的仓库，但我们可以从他们的错误中吸取教训。为此，本文回顾了将文件添加到自己的仓库中的一些最佳实践。

### 了解你的仓库

这对于安全的 Git 仓库来可以说是头号规则。作为项目维护者，无论是你自己创建的还是采用别人的，你的工作是了解自己仓库中的内容。你可能无法记住代码库中每一个文件，但是你需要了解你所管理的内容的基本组成部分。如果在几十个合并后出现一个游离的文件，你会很容易地发现它，因为你不知道它的用途，你需要检查它来刷新你的记忆。发生这种情况时，请查看该文件，并确保准确了解为什么它是必要的。

### 禁止二进制大文件

Git 是为文本而生的，无论是用纯文本编写的 C 或 Python 还是 Java 文本，亦或是 JSON、YAML、XML、Markdown、HTML 或类似的文本。Git 对于二进制文件不是很理想。

两者之间的区别是：

```
$ cat hello.txt
This is plain text.
It's readable by humans and machines alike.
Git knows how to version this.

$ git diff hello.txt
diff --git a/hello.txt b/hello.txt
index f227cc3..0d85b44 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1,2 +1,3 @@
 This is plain text.
+It's readable by humans and machines alike.
 Git knows how to version this.

```

和

```
$ git diff pixel.png
diff --git a/pixel.png b/pixel.png
index 563235a..7aab7bc 100644
Binary files a/pixel.png and b/pixel.png differ

$ cat pixel.png
�PNG
▒
IHDR7n�$gAMA��
              �abKGD݊�tIME�

                          -2R��
IDA�c`�!�3%tEXtdate:create2020-06-11T11:45:04+12:00��r.%tEXtdate:modify2020-06-11T11:45:04+12:00��ʒIEND�B`�

```

二进制文件中的数据不能像纯文本一样被解析，因此，如果二进制文件发生任何更改，则必须重写整个内容。一个版本与另一个版本之间唯一的区别就是全部不同，这会快速增加仓库大小。

更糟糕的是，Git 仓库维护者无法合理地审计二进制数据。这违反了头号规则：应该对仓库的内容了如指掌。

除了常用的 [POSIX](https://opensource.com/article/19/7/what-posix-richard-stallman-explains) 工具之外，你还可以使用 `git diff` 检测二进制文件。当你尝试使用 `--numstat` 选项来比较二进制文件时，Git 返回空结果：

```
$ git diff --numstat /dev/null pixel.png | tee
-     -   /dev/null => pixel.png
$ git diff --numstat /dev/null file.txt | tee
5788  0   /dev/null => list.txt

```

如果你正在考虑将二进制大文件（BLOB）提交到仓库，请停下来先思考一下。如果它是二进制文件，那它是由什么生成的。是否有充分的理由不在构建时生成它们，而是将它们提交到仓库？如果你认为提交二进制数据是有意义的，请确保在 `README` 文件或类似文件中指明二进制文件的位置、为什么是二进制文件的原因以及更新它们的协议是什么。必须谨慎对其更新，因为你每提交一个二进制大文件的变化，它的存储空间实际上都会加倍。

### 让第三方库留在第三方

第三方库也不例外。尽管它是开源的众多优点之一，你可以不受限制地重用和重新分发不是你编写的代码，但是有很多充分的理由不把第三方库存储在你自己的仓库中。首先，除非你自己检查了所有代码（以及将来的合并），否则你不能为第三方完全担保。其次，当你将第三方库复制到你的 Git 仓库中时，会将焦点从真正的上游源代码中分离出来。从技术上讲，对库有信心的人只对该库的主副本有把握，而不是对随机仓库的副本有把握。如果你需要锁定特定版本的库，请给开发者提供一个合理的项目所需的发布 URL，或者使用 [Git 子模块](https://git-scm.com/book/en/v2/Git-Tools-Submodules)。

### 抵制盲目的 git add

如果你的项目已编译，请抵制住使用 `git add .` 的冲动（其中 `.` 是当前目录或特定文件夹的路径），因为这是一种添加任何新东西的简单方法。如果你不是手动编译项目，而是使用 IDE 为你管理项目，这一点尤其重要。用 IDE 管理项目时，跟踪添加到仓库中的内容会非常困难，因此仅添加你实际编写的内容非常重要，而不是添加项目文件夹中出现的任何新对象。

如果你使用了 `git add .`，请在推送之前检查暂存区里的内容。如果在运行 `make clean` 或等效命令后，执行 `git status` 时在项目文件夹中看到一个陌生的对象，请找出它的来源，以及为什么仍然在项目的目录中。这是一种罕见的构建工件，不会在编译期间重新生成，因此在提交前请三思。

### 使用 Git ignore

许多为程序员打造的便利也非常杂乱。任何项目的典型项目目录，无论是编程的，还是艺术的或其他的，到处都是隐藏的文件、元数据和遗留的工件。你可以尝试忽略这些对象，但是 `git status` 中的提示越多，你错过某件事的可能性就越大。

你可以通过维护一个良好的 `gitignore` 文件来为你过滤掉这种噪音。因为这是使用 Git 的用户的共同要求，所以有一些入门级的 `gitignore` 文件。[Github.com/github/gitignore](https://github.com/github/gitignore) 提供了几个专门创建的 `gitignore` 文件，你可以下载这些文件并将其放置到自己的项目中，[Gitlab.com](https://about.gitlab.com/releases/2016/05/22/gitlab-8-8-released) 在几年前就将`gitignore` 模板集成到了仓库创建工作流程中。使用这些模板来帮助你为项目创建适合的 `gitignore` 策略并遵守它。

### 查看合并请求

当你通过电子邮件收到一个合并/拉取请求或补丁文件时，不要只是为了确保它能正常工作而进行测试。你的工作是阅读进入代码库的新代码，并了解其是如何产生结果的。如果你不同意这个实现，或者更糟的是，你不理解这个实现，请向提交该实现的人发送消息，并要求其进行说明。质疑那些希望成为版本库永久成员的代码并不是一种社交失误，但如果你不知道你把什么合并到用户使用的代码中，那就是违反了你和用户之间的社交契约。

### Git 责任

社区致力于开源软件良好的安全性。不要鼓励你的仓库中不良的 Git 实践，也不要忽视你克隆的仓库中的安全威胁。Git 功能强大，但它仍然只是一个计算机程序，因此要以人为本，确保每个人的安全。

---

via: <https://opensource.com/article/20/7/git-repos-best-practices>

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


硬核观察 | 美国佛州一女子在海滩上遛波士顿动力开发的机器狗

Summary: 更多：• 比特币触及 6 万美元关口再创新高 • Linux 内核发现三个从 2006 就存在的本地提权漏洞

按理非root用户应该没有权限加载驱动模块吧？

# 硬核观察 | 美国佛州一女子在海滩上遛波士顿动力开发的机器狗

### 美国佛州一女子在海滩上遛波士顿动力开发的机器狗

这只机器狗由波士顿动力学工程公司设计，被命名为“大狗”，此前被用在医院、犯罪现场、火箭测试等地方。但自从去年机器狗以每只 7.5 万美元（约合人民币 48.8万）出售后，它成了家庭宠物。

“大狗”机器人的内部安装有一台计算机，可根据环境的变化调整行进姿态。“大狗”既可以自行沿着预先设定的简单路线行进，也可以进行远程控制。大狗机器人被称为“当前世界上适应崎岖地形的最先进的机器人”。

到底是狗需要溜，还是人需要溜？或许将来不久，我们身边会有很多智能机器人。

### 比特币触及 6 万美元关口再创新高

受益于金融市场的乐观情绪和美国总统拜登签署了 1.9 万亿美元的刺激法案，比特币从 2 月底创下前一个峰值后的暴跌中反弹。比特币 24 小时上涨约 6%，而一年前的今天才约 3850 美元，累计上涨了约 1400%。

已经对比特币的不断破关感到了麻木，现在整个加密货币市场一片燥热，当然，也不乏爆仓者。

### Linux 内核发现三个从 2006 就存在的本地提权漏洞

这三个漏洞，已经 [存在了 15 年](https://blog.grimm-co.com/2021/03/new-old-bugs-in-linux-kernel.html) 了，从它们一开始被写出来就没有被发现。它们位于用于访问共享数据存储设施的 iSCSI 模块中，可允许任何拥有用户账户的人获得 root 权限。所有的 Linux 发行版都存在这些漏洞，即便是该驱动程序默认情况下没有被加载，也可以由用户加载它从而被利用。最新的内核都已经修复了该问题，而已经过了支持期的内核则不会收到补丁。

所以，“群众的眼睛是雪亮的”理论，在面对 Linux 内核日益暴涨的代码量，有些力不从心了。


如何在 Fedora 上使用 Poetry 来管理你的 Python 项目？

# 如何在 Fedora 上使用 Poetry 来管理你的 Python 项目？

<img src="content_image/album_202103_14_065917wquzrh2orvvug4mn.jpg" alt="Python & Poetry on Fedora" title="Python & Poetry on Fedora">

Python 开发人员经常创建一个新的虚拟环境来分离项目依赖，然后用 `pip`、`pipenv` 等工具来管理它们。Poetry 是一个简化 Python 中依赖管理和打包的工具。这篇文章将向你展示如何在 Fedora 上使用 Poetry 来管理你的 Python 项目。

与其他工具不同，Poetry 只使用一个配置文件来进行依赖管理、打包和发布。这消除了对不同文件的需求，如 `Pipfile`、`MANIFEST.in`、`setup.py` 等。这也比使用多个工具更快。

下面详细介绍一下开始使用 Poetry 时使用的命令。

### 在 Fedora 上安装 Poetry

如果你已经使用 Fedora 32 或以上版本，你可以使用这个命令直接从命令行安装 Poetry：

```
$ sudo dnf install poetry

```

编者注：在 Fedora Silverblue 或 CoreOs上，Python 3.9.2 是核心提交的一部分，你可以用下面的命令安装 Poetry：

```
rpm-ostree install poetry

```

### 初始化一个项目

使用 `new` 命令创建一个新项目：

```
$ poetry new poetry-project

```

用 Poetry 创建的项目结构是这样的：

```
├── poetry_project
│   └── init.py
├── pyproject.toml
├── README.rst
└── tests
    ├── init.py
    └── test_poetry_project.py

```

Poetry 使用 `pyproject.toml` 来管理项目的依赖。最初，这个文件看起来类似于这样：

```
[tool.poetry]
name = "poetry-project"
version = "0.1.0"
description = ""
authors = ["Kadermiyanyedi <kadermiyanyedi@hotmail.com>"]

[tool.poetry.dependencies]
python = "^3.9"

[tool.poetry.dev-dependencies]
pytest = "^5.2"

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

```

这个文件包含 4 个部分：

* 第一部分包含描述项目的信息，如项目名称、项目版本等。
* 第二部分包含项目的依赖。这些依赖是构建项目所必需的。
* 第三部分包含开发依赖。
* 第四部分描述的是符合 [PEP 517](https://www.python.org/dev/peps/pep-0517/) 的构建系统。

如果你已经有一个项目，或者创建了自己的项目文件夹，并且你想使用 Poetry，请在你的项目中运行 `init` 命令。

```
$ poetry init

```

在这个命令之后，你会看到一个交互式的 shell 来配置你的项目。

### 创建一个虚拟环境

如果你想创建一个虚拟环境或激活一个现有的虚拟环境，请使用以下命令：

```
$ poetry shell

```

Poetry 默认在 `/home/username/.cache/pypoetry` 项目中创建虚拟环境。你可以通过编辑 Poetry 配置来更改默认路径。使用下面的命令查看配置列表：

```
$ poetry config --list

cache-dir = "/home/username/.cache/pypoetry"
virtualenvs.create = true
virtualenvs.in-project = true
virtualenvs.path = "{cache-dir}/virtualenvs"

```

修改 `virtualenvs.in-project` 配置变量，在项目目录下创建一个虚拟环境。Poetry 命令是：

```
$ poetry config virtualenv.in-project true

```

### 添加依赖

使用 `poetry add` 命令为项目安装一个依赖：

```
$ poetry add django

```

你可以使用带有 `--dev` 选项的 `add` 命令来识别任何只用于开发环境的依赖：

```
$ poetry add black --dev

```

`add` 命令会创建一个 `poetry.lock` 文件，用来跟踪软件包的版本。如果 `poetry.lock` 文件不存在，那么会安装 `pyproject.toml` 中所有依赖项的最新版本。如果 `poetry.lock` 存在，Poetry 会使用文件中列出的确切版本，以确保每个使用这个项目的人的软件包版本是一致的。

使用 `poetry install` 命令来安装当前项目中的所有依赖：

```
$ poetry install

```

通过使用 `--no-dev` 选项防止安装开发依赖：

```
$ poetry install --no-dev

```

### 列出软件包

`show` 命令会列出所有可用的软件包。`--tree` 选项将以树状列出软件包：

```
$ poetry show --tree

django 3.1.7 A high-level Python Web framework that encourages rapid development and clean, pragmatic design.
├── asgiref >=3.2.10,<4
├── pytz *
└── sqlparse >=0.2.2

```

包含软件包名称，以列出特定软件包的详细信息：

```
$ poetry show requests

name         : requests
version      : 2.25.1
description  : Python HTTP for Humans.

dependencies
 - certifi >=2017.4.17
 - chardet >=3.0.2,<5
 - idna >=2.5,<3
 - urllib3 >=1.21.1,<1.27

```

最后，如果你想知道软件包的最新版本，你可以通过 `--latest` 选项：

```
$ poetry show --latest

idna     2.10      3.1    Internationalized Domain Names in Applications
asgiref  3.3.1     3.3.1  ASGI specs, helper code, and adapters

```

### 更多信息

Poetry 的更多详情可在[文档](https://python-poetry.org/docs/)中获取。

---

via: <https://fedoramagazine.org/how-to-use-poetry-to-manage-your-python-projects-on-fedora/>

作者：[Kader Miyanyedi](https://fedoramagazine.org/author/moonkat/) 选题：[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/) 荣誉推出


学习使用 GDB 调试代码

Summary: 使用 GNU 调试器来解决你的代码问题。

使用 GNU 调试器来解决你的代码问题。

# 学习使用 GDB 调试代码

>
> 使用 GNU 调试器来解决你的代码问题。
>
>
>

<img src="content_image/album_202103_14_210547k3q5lek8j9qspkks.jpg" alt="" title="magnifying glass on computer screen, finding a bug in the code">

GNU 调试器常以它的命令 `gdb` 称呼它，它是一个交互式的控制台，可以帮助你浏览源代码、分析执行的内容，其本质上是对错误的应用程序中出现的问题进行逆向工程。

故障排除的麻烦在于它很复杂。[GNU 调试器](https://www.gnu.org/software/gdb/) 并不是一个特别复杂的应用程序，但如果你不知道从哪里开始，甚至不知道何时和为何你可能需要求助于 GDB 来进行故障排除，那么它可能会让人不知所措。如果你一直使用 `print`、`echo` 或 [printf 语句](https://opensource.com/article/20/8/printf)来调试你的代码，当你开始思考是不是还有更强大的东西时，那么本教程就是为你准备的。

### 有错误的代码

要开始使用 GDB，你需要一些代码。这里有一个用 C++ 写的示例应用程序（如果你一般不使用 C++ 编写程序也没关系，在所有语言中原理都是一样的），其来源于 [猜谜游戏系列](/article-12985-1.html) 中的一个例子。

```
#include <iostream>
#include <stdlib.h> //srand
#include <stdio.h>  //printf

using namespace std;

int main () {

srand (time(NULL));
int alpha = rand() % 8;
cout << "Hello world." << endl;
int beta = 2;

printf("alpha is set to is %s\n", alpha);
printf("kiwi is set to is %s\n", beta);

 return 0;
} // main

```

这个代码示例中有一个 bug，但它确实可以编译（至少在 GCC 5 的时候）。如果你熟悉 C++，你可能已经看到了，但这是一个简单的问题，可以帮助新的 GDB 用户了解调试过程。编译并运行它就可以看到错误：

```
$ g++ -o buggy example.cpp
$ ./buggy
Hello world.
Segmentation fault

```

### 排除段故障

从这个输出中，你可以推测变量 `alpha` 的设置是正确的，因为否则的话，你就不会看到它*后面*的那行代码执行。当然，这并不总是正确的，但这是一个很好的工作理论，如果你使用 `printf` 作为日志和调试器，基本上也会得出同样的结论。从这里，你可以假设 bug 在于成功打印的那一行之后的*某行*。然而，不清楚错误是在下一行还是在几行之后。

GNU 调试器是一个交互式的故障排除工具，所以你可以使用 `gdb` 命令来运行错误的代码。为了得到更好的结果，你应该从包含有*调试符号*的源代码中重新编译你的错误应用程序。首先，看看 GDB 在不重新编译的情况下能提供哪些信息：

```
$ gdb ./buggy
Reading symbols from ./buggy...done.
(gdb) start
Temporary breakpoint 1 at 0x400a44
Starting program: /home/seth/demo/buggy

Temporary breakpoint 1, 0x0000000000400a44 in main ()
(gdb)

```

当你以一个二进制可执行文件作为参数启动 GDB 时，GDB 会加载该应用程序，然后等待你的指令。因为这是你第一次在这个可执行文件上运行 GDB，所以尝试重复这个错误是有意义的，希望 GDB 能够提供进一步的见解。很直观，GDB 用来启动它所加载的应用程序的命令就是 `start`。默认情况下，GDB 内置了一个*断点*，所以当它遇到你的应用程序的 `main` 函数时，它会暂停执行。要让 GDB 继续执行，使用命令 `continue`：

```
(gdb) continue
Continuing.
Hello world.

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff71c0c0b in vfprintf () from /lib64/libc.so.6
(gdb)

```

毫不意外：应用程序在打印 “Hello world” 后不久就崩溃了，但 GDB 可以提供崩溃发生时正在发生的函数调用。这有可能就足够你找到导致崩溃的 bug，但为了更好地了解 GDB 的功能和一般的调试过程，想象一下，如果问题还没有变得清晰，你想更深入地挖掘这段代码发生了什么。

### 用调试符号编译代码

要充分利用 GDB，你需要将调试符号编译到你的可执行文件中。你可以用 GCC 中的 `-g` 选项来生成这个符号：

```
$ g++ -g -o debuggy example.cpp
$ ./debuggy
Hello world.
Segmentation fault

```

将调试符号编译到可执行文件中的结果是得到一个大得多的文件，所以通常不会分发它们，以增加便利性。然而，如果你正在调试开源代码，那么用调试符号重新编译测试是有意义的：

```
$ ls -l *buggy* *cpp
-rw-r--r--    310 Feb 19 08:30 debug.cpp
-rwxr-xr-x  11624 Feb 19 10:27 buggy*
-rwxr-xr-x  22952 Feb 19 10:53 debuggy*

```

### 用 GDB 调试

加载新的可执行文件（本例中为 `debuggy`）以启动 GDB：

```
$ gdb ./debuggy
Reading symbols from ./debuggy...done.
(gdb) start
Temporary breakpoint 1 at 0x400a44
Starting program: /home/seth/demo/debuggy

Temporary breakpoint 1, 0x0000000000400a44 in main ()
(gdb)

```

如前所述，使用 `start` 命令进行：

```
(gdb) start
Temporary breakpoint 1 at 0x400a48: file debug.cpp, line 9.
Starting program: /home/sek/demo/debuggy

Temporary breakpoint 1, main () at debug.cpp:9
9       srand (time(NULL));
(gdb)

```

这一次，自动的 `main` 断点可以指明 GDB 暂停的行号和该行包含的代码。你可以用 `continue` 恢复正常操作，但你已经知道应用程序在完成之前就会崩溃，因此，你可以使用 `next` 关键字逐行步进检查你的代码：

```
(gdb) next
10  int alpha = rand() % 8;
(gdb) next
11  cout << "Hello world." << endl;
(gdb) next
Hello world.
12  int beta = 2;
(gdb) next
14      printf("alpha is set to is %s\n", alpha);
(gdb) next

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff71c0c0b in vfprintf () from /lib64/libc.so.6
(gdb)

```

从这个过程可以确认，崩溃不是发生在设置 `beta` 变量的时候，而是执行 `printf` 行的时候。这个 bug 在本文中已经暴露了好几次（破坏者：向 `printf` 提供了错误的数据类型），但暂时假设解决方案仍然不明确，需要进一步调查。

### 设置断点

一旦你的代码被加载到 GDB 中，你就可以向 GDB 询问到目前为止代码所产生的数据。要尝试数据自省，通过再次发出 `start` 命令来重新启动你的应用程序，然后进行到第 11 行。一个快速到达 11 行的简单方法是设置一个寻找特定行号的断点：

```
(gdb) start
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Temporary breakpoint 2 at 0x400a48: file debug.cpp, line 9.
Starting program: /home/sek/demo/debuggy

Temporary breakpoint 2, main () at debug.cpp:9
9       srand (time(NULL));
(gdb) break 11
Breakpoint 3 at 0x400a74: file debug.cpp, line 11.

```

建立断点后，用 `continue` 继续执行：

```
(gdb) continue
Continuing.

Breakpoint 3, main () at debug.cpp:11
11      cout << "Hello world." << endl;
(gdb)

```

现在暂停在第 11 行，就在 `alpha` 变量被设置之后，以及 `beta` 被设置之前。

### 用 GDB 进行变量自省

要查看一个变量的值，使用 `print` 命令。在这个示例代码中，`alpha` 的值是随机的，所以你的实际结果可能与我的不同：

```
(gdb) print alpha
$1 = 3
(gdb)

```

当然，你无法看到一个尚未建立的变量的值：

```
(gdb) print beta
$2 = 0

```

### 使用流程控制

要继续进行，你可以步进代码行来到达将 `beta` 设置为一个值的位置：

```
(gdb) next
Hello world.
12  int beta = 2;
(gdb) next
14  printf("alpha is set to is %s\n", alpha);
(gdb) print beta
$3 = 2

```

另外，你也可以设置一个观察点，它就像断点一样，是一种控制 GDB 执行代码流程的方法。在这种情况下，你知道 `beta` 变量应该设置为 `2`，所以你可以设置一个观察点，当 `beta` 的值发生变化时提醒你：

```
(gdb) watch beta > 0
Hardware watchpoint 5: beta > 0
(gdb) continue
Continuing.

Breakpoint 3, main () at debug.cpp:11
11      cout << "Hello world." << endl;
(gdb) continue
Continuing.
Hello world.

Hardware watchpoint 5: beta > 0

Old value = false
New value = true
main () at debug.cpp:14
14      printf("alpha is set to is %s\n", alpha);
(gdb)

```

你可以用 `next` 手动步进完成代码的执行，或者你可以用断点、观察点和捕捉点来控制代码的执行。

### 用 GDB 分析数据

你可以以不同格式查看数据。例如，以八进制值查看 `beta` 的值：

```
(gdb) print /o beta
$4 = 02

```

要查看其在内存中的地址：

```
(gdb) print /o &beta
$5 = 0x2

```

你也可以看到一个变量的数据类型：

```
(gdb) whatis beta
type = int

```

### 用 GDB 解决错误

这种自省不仅能让你更好地了解什么代码正在执行，还能让你了解它是如何执行的。在这个例子中，对变量运行的 `whatis` 命令给了你一个线索，即你的 `alpha` 和 `beta` 变量是整数，这可能会唤起你对 `printf` 语法的记忆，使你意识到在你的 `printf` 语句中，你必须使用 `%d` 来代替 `%s`。做了这个改变，就可以让应用程序按预期运行，没有更明显的错误存在。

当代码编译后发现有 bug 存在时，特别令人沮丧，但最棘手的 bug 就是这样，如果它们很容易被发现，那它们就不是 bug 了。使用 GDB 是猎取并消除它们的一种方法。

### 下载我们的速查表

生活的真相就是这样，即使是最基本的编程，代码也会有 bug。并不是所有的错误都会导致应用程序无法运行（甚至无法编译），也不是所有的错误都是由错误的代码引起的。有时，bug 是基于一个特别有创意的用户所做的意外的选择组合而间歇性发生的。有时，程序员从他们自己的代码中使用的库中继承了 bug。无论原因是什么，bug 基本上无处不在，程序员的工作就是发现并消除它们。

GNU 调试器是一个寻找 bug 的有用工具。你可以用它做的事情比我在本文中演示的要多得多。你可以通过 GNU Info 阅读器来了解它的许多功能：

```
$ info gdb

```

无论你是刚开始学习 GDB 还是专业人员的，提醒一下你有哪些命令是可用的，以及这些命令的语法是什么，都是很有帮助的。

* [下载 GDB 速查表](https://opensource.com/downloads/gnu-debugger-cheat-sheet)

---

via: <https://opensource.com/article/21/3/debug-code-gdb>

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

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