用 Lua 操作文件中的数据

Summary: 了解 Lua 如何处理数据的读写。

了解 Lua 如何处理数据的读写。

>
> 了解 Lua 如何处理数据的读写。
>
>
>

![](/data/attachment/album/202104/05/102424yczwucc3xcuyzkgw.jpg "Person standing in front of a giant computer screen with numbers, data")

有些数据是临时的，存储在 RAM 中，只有在应用运行时才有意义。但有些数据是要持久的，存储在硬盘上供以后使用。当你编程时，无论是简单的脚本还是复杂的工具套件，通常都需要读取和写入文件。有时文件可能包含配置选项，而另一些时候这个文件是你的用户用你的应用创建的数据。每种语言都会以不同的方式处理这项任务，本文将演示如何使用 Lua 处理文件数据。

### 安装 Lua

如果你使用的是 Linux，你可以从你的发行版软件库中安装 Lua。在 macOS 上，你可以从 [MacPorts](https://opensource.com/article/20/11/macports) 或 [Homebrew](https://opensource.com/article/20/6/homebrew-mac) 安装 Lua。在 Windows 上，你可以从 [Chocolatey](https://opensource.com/article/20/3/chocolatey) 安装 Lua。

安装 Lua 后，打开你最喜欢的文本编辑器并准备开始。

### 用 Lua 读取文件

Lua 使用 `io` 库进行数据输入和输出。下面的例子创建了一个名为 `ingest` 的函数来从文件中读取数据，然后用 `:read` 函数进行解析。在 Lua 中打开一个文件时，有几种模式可以启用。因为我只需要从这个文件中读取数据，所以我使用 `r`（代表“读”）模式：

```
function ingest(file)
   local f = io.open(file, "r")
   local lines = f:read("*all")
   f:close()
   return(lines)
end

myfile=ingest("example.txt")
print(myfile)

```

在这段代码中，注意到变量 `myfile` 是为了触发 `ingest` 函数而创建的，因此，它接收该函数返回的任何内容。`ingest` 函数返回文件的行数（从一个称为 `lines` 的变量中0。当最后一步打印 `myfile` 变量的内容时，文件的行数就会出现在终端中。

如果文件 `example.txt` 中包含了配置选项，那么我会写一些额外的代码来解析这些数据，可能会使用另一个 Lua 库，这取决于配置是以 INI 文件还是 YAML 文件或其他格式存储。如果数据是 SVG 图形，我会写额外的代码来解析 XML，可能会使用 Lua 的 SVG 库。换句话说，你的代码读取的数据一旦加载到内存中，就可以进行操作，但是它们都需要加载 `io` 库。

### 用 Lua 将数据写入文件

无论你是要存储用户用你的应用创建的数据，还是仅仅是关于用户在应用中做了什么的元数据（例如，游戏保存或最近播放的歌曲），都有很多很好的理由来存储数据供以后使用。在 Lua 中，这是通过 `io` 库实现的，打开一个文件，将数据写入其中，然后关闭文件：

```
function exgest(file)
   local f = io.open(file, "a")
   io.output(f)
   io.write("hello world\n")
   io.close(f)
end

exgest("example.txt")

```

为了从文件中读取数据，我以 `r` 模式打开文件，但这次我使用 `a` （用于”追加“）将数据写到文件的末尾。因为我是将纯文本写入文件，所以我添加了自己的换行符（`/n`）。通常情况下，你并不是将原始文本写入文件，你可能会使用一个额外的库来代替写入一个特定的格式。例如，你可能会使用 INI 或 YAML 库来帮助编写配置文件，使用 XML 库来编写 XML，等等。

### 文件模式

在 Lua 中打开文件时，有一些保护措施和参数来定义如何处理文件。默认值是 `r`，允许你只读数据：

* `r` 只读
* `w` 如果文件不存在，覆盖或创建一个新文件。
* `r+` 读取和覆盖。
* `a` 追加数据到文件中，或在文件不存在的情况下创建一个新文件。
* `a+` 读取数据，将数据追加到文件中，或文件不存在的话，创建一个新文件。

还有一些其他的(例如，`b` 代表二进制格式)，但这些是最常见的。关于完整的文档，请参考 [Lua.org/manual](http://lua.org/manual) 上的优秀 Lua 文档。

### Lua 和文件

和其他编程语言一样，Lua 有大量的库支持来访问文件系统来读写数据。因为 Lua 有一个一致且简单语法，所以很容易对任何格式的文件数据进行复杂的处理。试着在你的下一个软件项目中使用 Lua，或者作为 C 或 C++ 项目的 API。

---

via: <https://opensource.com/article/21/3/lua-files>

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


硬核观察 | 研究人员教会机器人如何逃离熊孩子殴打

Summary: 更多：• Node.js 的竞争对手 Deno 成立商业公司 • 微软的 Linux 版 Edge 浏览器现在支持跨设备同步功能

不知道edge啥时候才能在insider通道发布

说错了，beta通道，现在一直是dev通道感觉不太敢用

![](/data/attachment/album/202104/05/123229t75v8xl3zx3vc7py.jpg)

### 研究人员教会机器人如何逃离熊孩子殴打

![](/data/attachment/album/202104/05/123257uffk6ty1dk1kd5nz.jpg)

在日本的一家商场里，一帮没有人监管的熊孩子反复对机器人拳打脚踢、摇晃……

日本一个研究小组开发了一个计算机模拟和统计模型，显示熊孩子们对机器人的虐待主要发生在他们成群结队且附近没有成年人的时候。他们设计了[一种躲避虐待的算法](https://spectrum.ieee.org/automaton/robotics/artificial-intelligence/children-beating-up-robot)，帮助机器人避免这些熊孩子可能结伙攻击它的情况。机器人会计算出被虐待的概率。如果机器人在统计上处于危险之中，它就会改变路线，走向更拥挤的区域或更高的人。

根据阿西莫夫三定律，机器人不能伤害人类，而随着各种智能机器人出现在我们的身边，我们是时候教会机器人如何保护自己了。

### Node.js 的竞争对手 Deno 成立商业公司

![](/data/attachment/album/202104/05/123318qzs9dwsgpd42cupk.jpg)

Deno 的创建者们已经[成立了 Deno 公司](https://www.infoworld.com/article/3613709/deno-company-forms-to-back-nodejs-rival.html)，这是一家围绕 JavaScript/TypeScript 运行时的商业企业，也是 Node.js 的竞争对手。他们表示，虽然他们计划追求 Deno 的商业应用，但 Deno 本身仍将保持 MIT 授权。Deno 的创始人们认为，服务器端 JavaScript 被委员会统治，没有创新的动力，停滞不前。他们希望能够为不同的应用程序创建自定义运行时环境。

我认为，Deno 的出现和商业化，会有力的推动 JavaScript 的发展。

### 微软的 Linux 版 Edge 浏览器现在支持跨设备同步功能

![](/data/attachment/album/202104/05/123334d9wu9v54l41nng7z.jpg)

微软最近在开发通道发布的 Linux 版 Edge 浏览器，可以让 Linux 用户在设备之间[同步](https://www.omgubuntu.co.uk/2021/03/microsoft-edge-linux-sync-now-works)他们的书签、扩展、设置和历史记录。

微软决定放弃支持自己的 Edge 浏览器引擎，而选择开源的 Chromium 浏览器引擎，至少在支持 Linux 上，有着先天的优势，因为 Chromium 浏览器引擎已经在 Linux 上证明了自己。


如何使用 Linux anacron 命令

Summary: 与其手动执行重复性的任务，不如让 Linux 为你做。

与其手动执行重复性的任务，不如让 Linux 为你做。

>
> 与其手动执行重复性的任务，不如让 Linux 为你做。
>
>
>

![](/data/attachment/album/202104/06/084133bphrxxeolhoyqr0o.jpg "Command line prompt")

在 2021 年，人们有更多的理由喜欢 Linux。在这个系列中，我将分享使用 Linux 的 21 个不同理由。自动化是使用 Linux 的最佳理由之一。

我最喜欢 Linux 的一个原因是它愿意为我做工作。我不想执行重复性的任务，这些任务会占用我的时间，或者容易出错，或者我可能会忘记，我安排 Linux 为我做这些工作。

### 为自动化做准备

“自动化”这个词既让人望而生畏，又让人心动。我发现用模块化的方式来处理它是有帮助的。

#### 1、你想实现什么？

首先，要知道你想产生什么结果。你是要给图片加水印吗？从杂乱的目录中删除文件？执行重要数据的备份？为自己明确定义任务，这样你就知道自己的目标是什么。如果有什么任务是你发现自己每天都在做的，甚至一天一次以上，那么它可能是自动化的候选者。

#### 2、学习你需要的应用

将大的任务分解成小的组件，并学习如何手动但以可重复和可预测的方式产生每个结果。在 Linux 上可以做的很多事情都可以用脚本来完成，但重要的是要认识到你当前的局限性。学习如何自动调整几张图片的大小，以便可以方便地通过电子邮件发送，与使用机器学习为你的每周通讯生成精心制作的艺术品之间有天壤之别。有的事你可以在一个下午学会，而另一件事可能要花上几年时间。然而，我们都必须从某个地方开始，所以只要从小做起，并时刻注意改进的方法。

#### 3、自动化

在 Linux 上使用一个自动化工具来定期实现它。这就是本文介绍的步骤!

要想自动化一些东西，你需要一个脚本来自动化一个任务。在测试时，最好保持简单，所以本文自动化的任务是在 `/tmp` 目录下创建一个名为 `hello` 的文件。

```
#!/bin/sh

touch /tmp/hello

```

将这个简单的脚本复制并粘贴到一个文本文件中，并将其命名为 `example`。

### Cron

每个安装好的 Linux 系统都会有的内置自动化解决方案就是 cron 系统。Linux 用户往往把 cron 笼统地称为你用来安排任务的方法（通常称为 “cron 作业”），但有多个应用程序可以提供 cron 的功能。最通用的是 [cronie](https://github.com/cronie-crond/cronie)；它的优点是，它不会像历史上为系统管理员设计的 cron 应用程序那样，假设你的计算机总是开着。

验证你的 Linux 发行版提供的是哪个 cron 系统。如果不是 cronie，你可以从发行版的软件仓库中安装 cronie。如果你的发行版没有 cronie 的软件包，你可以使用旧的 anacron 软件包来代替。`anacron` 命令是包含在 cronie 中的，所以不管你是如何获得它的，你都要确保在你的系统上有 `anacron` 命令，然后再继续。anacron 可能需要管理员 root 权限，这取决于你的设置。

```
$ which anacron
/usr/sbin/anacron

```

anacron 的工作是确保你的自动化作业定期执行。为了做到这一点，anacron 会检查找出最后一次运行作业的时间，然后检查你告诉它运行作业的频率。

假设你将 anacron 设置为每五天运行一次脚本。每次你打开电脑或从睡眠中唤醒电脑时，anacron都会扫描其日志以确定是否需要运行作业。如果一个作业在五天或更久之前运行，那么 anacron 就会运行该作业。

### Cron 作业

许多 Linux 系统都捆绑了一些维护工作，让 cron 来执行。我喜欢把我的工作与系统工作分开，所以我在我的主目录中创建了一个目录。具体来说，有一个叫做 `~/.local` 的隐藏文件夹（“local” 的意思是它是为你的用户账户定制的，而不是为你的“全局”计算机系统定制的），所以我创建了子目录 `etc/cron.daily` 来作为 cron 在我的系统上的家目录。你还必须创建一个 spool 目录来跟踪上次运行作业的时间。

```
$ mkdir -p ~/.local/etc/cron.daily ~/.var/spool/anacron

```

你可以把任何你想定期运行的脚本放到 `~/.local/etc/cron.daily` 目录中。现在把 `example` 脚本复制到目录中，然后 [用 chmod 命令使其可执行](https://opensource.com/article/19/8/linux-chmod-command)。

```
$ cp example ~/.local/etc/cron.daily
# chmod +x ~/.local/etc/cron.daily/example

```

接下来，设置 anacron 来运行位于 `~/.local/etc/cron.daily` 目录下的任何脚本。

### anacron

默认情况下，cron 系统的大部分内容都被认为是系统管理员的领域，因为它通常用于重要的底层任务，如轮换日志文件和更新证书。本文演示的配置是为普通用户设置个人自动化任务而设计的。

要配置 anacron 来运行你的 cron 作业，请在 `/.local/etc/anacrontab` 创建一个配置文件：

```
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
1  0  cron.mine    run-parts /home/tux/.local/etc/cron.daily/

```

这个文件告诉 anacron 每到新的一天（也就是每日），延迟 0 分钟后，就运行（`run-parts`）所有在 `~/.local/etc/cron.daily` 中找到的可执行脚本。有时，会使用几分钟的延迟，这样你的计算机就不会在你登录后就被所有可能的任务冲击。不过这个设置适合测试。

`cron.mine` 值是进程的一个任意名称。我称它为 `cron.mine`，但你也可以称它为 `cron.personal` 或 `penguin` 或任何你想要的名字。

验证你的 `anacrontab` 文件的语法：

```
$ anacron -T -t ~/.local/etc/anacrontab \
  -S /home/tux/.var/spool/anacron

```

沉默意味着成功。

### 在 .profile 中添加 anacron

最后，你必须确保 anacron 以你的本地配置运行。因为你是以普通用户而不是 root 用户的身份运行 anacron，所以你必须将它引导到你的本地配置：告诉 anacron 要做什么的 `anacrontab` 文件，以及帮助 anacron 跟踪每一个作业最后一次执行是多少天的 spool 目录：

```
anacron -fn -t /home/tux/.local/etc/anacrontab \
  -S /home/tux/.var/spool/anacron

```

`-fn` 选项告诉 anacron *忽略* 时间戳，这意味着你强迫它无论如何都要运行你的 cron 作业。这完全是为了测试的目的。

### 测试你的 cron 作业

现在一切都设置好了，你可以测试作业了。从技术上讲，你可以在不重启的情况下进行测试，但重启是最有意义的，因为这就是设计用来处理中断和不规则的登录会话的。花点时间重启电脑、登录，然后寻找测试文件：

```
$ ls /tmp/hello
/tmp/hello

```

假设文件存在，那么你的示例脚本已经成功执行。现在你可以从 `~/.profile` 中删除测试选项，留下这个作为你的最终配置。

```
anacron -t /home/tux/.local/etc/anacrontab \
  -S /home/tux/.var/spool/anacron

```

### 使用 anacron

你已经配置好了你的个人自动化基础设施，所以你可以把任何你想让你的计算机替你管理的脚本放到 `~/.local/etc/cron.daily` 目录下，它就会按计划运行。

这取决于你希望作业运行的频率。示例脚本是每天执行一次。很明显，这取决于你的计算机在任何一天是否开机和醒着。如果你在周五使用电脑，但把它设置在周末，脚本就不会在周六和周日运行。然而，在周一，脚本会执行，因为 anacron 会知道至少有一天已经过去了。你可以在 `~/.local/etc` 中添加每周、每两周、甚至每月的目录，以安排各种各样的间隔。

要添加一个新的时间间隔：

1. 在 `~/.local/etc` 中添加一个目录（例如 `cron.weekly`）。
2. 在 `~/.local/etc/anacrontab` 中添加一行，以便在新目录下运行脚本。对于每周一次的间隔，其配置如下。`7 0 cron.mine run-parts /home/tux/.local/etc/cron.weekly/`（`0` 的值可以选择一些分钟数，以适当地延迟脚本的启动）。
3. 把你的脚本放在 `cron.weekly` 目录下。

欢迎来到自动化的生活方式。它不会让人感觉到，但你将会变得更有效率。

---

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

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


值得现在就去尝试的四款开源聊天应用软件

>
> 现在，远程协作已作为一项必不可少的能力，让开源实时聊天成为你工具箱中必不可少的一部分吧。
>
>
>

![](/data/attachment/album/202104/06/103454xundd858446u08r0.jpg "Chat bubbles")

清晨起床后，我们通常要做的第一件事是检查手机，看看是否有同事和朋友发来的重要信息。无论这是否是一个好习惯，但这种行为早已成为我们日常生活的一部分。

>
> 人是理性动物。他可以为任何他想相信的事情想出一个理由。 – 阿纳托尔·法朗士
>
>
>

无论理由是否合理，我们每天都在使用的一系列的通讯工具，例如电子邮件、电话、网络会议工具或社交网络。甚至在 COVID-19 之前，居家办公就已经使这些通信工具成为我们生活中的重要部分。随着疫情出现，居家办公成为新常态，我们交流方式的方方面面正面临着前所未有的改变，这让这些工具变得不可或缺。

### 为什么需要聊天？

作为全球团队的一部分进行远程工作时，我们必须要有一个相互协作的环境。聊天应用软件在帮助我们保持相互联系中起着至关重要的作用。与电子邮件相比，聊天应用软件可提供与全球各地的同事快速、实时的通信。

选择一款聊天应用软件需要考虑很多因素。为了帮助你选择最适合你的应用软件，在本文中，我将探讨四款开源聊天应用软件，和一个当你需要与同事“面对面”时的开源视频通信工具，然后概述在高效的通讯应用软件中，你应当考虑的一些功能。

### 四款开源聊天软件

#### Rocket.Chat

![Rocket.Chat](/data/attachment/album/202104/06/103543xet5herrrfftvlff.png "Rocket.Chat")

[Rocket.Chat](https://rocket.chat/) 是一个综合性的通讯平台，其将频道分为公开房间（任何人都可以加入）和私有房间（仅受邀请）。你还可以直接将消息发送给已登录的人员。其能共享文档、链接、照片、视频和<ruby> 动态图 <rt>  GIF </rt></ruby>，以及进行视频通话，并可以在平台中发送语音信息。

Rocket.Chat 是自由开源软件，但是其独特之处在于其可自托管的聊天系统。你可以将其下载到你的服务器上，无论它是本地服务器或是在公有云上的虚拟专用服务器。

Rocket.Chat 是完全免费，其 [源码](https://github.com/RocketChat/Rocket.Chat) 可在 Github 获得。许多开源项目都使用 Rocket.Chat 作为他们官方交流平台。该软件在持续不断的发展且不断更新和改进新功能。

我最喜欢 Rocket.Chat 的地方是其能够根据用户需求来进行自定义操作，并且它使用机器学习在用户通讯间进行自动的、实时消息翻译。你也可以下载适用于你移动设备的 Rocket.Chat，以便能随时随地使用。

#### IRC

![IRC on WeeChat 0.3.5](/data/attachment/album/202104/06/103543d4io1pc3qaxrgowl.png "IRC on WeeChat 0.3.5")

IRC（<ruby> <a href="https://en.wikipedia.org/wiki/Internet_Relay_Chat">  互联网中继聊天 </a> <rt>  Internet Relay Chat </rt></ruby>）是一款实时、基于文本格式的通信软件。尽管其是最古老的电子通讯形式之一，但在许多知名的软件项目中仍受欢迎。

IRC 频道是单独的聊天室。它可以让你在一个开放的频道中与多人进行聊天或与某人私下一对一聊天。如果频道名称以 `#` 开头，则可以假定它是官方的聊天室，而以 `##` 开头的聊天室通常是非官方的聊天室。

[上手 IRC](https://opensource.com/article/16/6/getting-started-irc) 很容易。你的 IRC 昵称可以让人们找到你，因此它必须是唯一的。但是，你可以完全自主地选择 IRC 客户端。如果你需要比标准 IRC 客户端更多功能的应用程序，则可以使用 [Riot.im](https://opensource.com/article/17/5/introducing-riot-IRC) 连接到 IRC。

考虑到它悠久的历史，你为什么还要继续使用 IRC？出于一个原因是，其仍是我们所依赖的许多自由及开源项目的家园。如果你想参于开源软件开发和社区，可以选择用 IRC。

#### Zulip

![Zulip](/data/attachment/album/202104/06/103544o0d1an1c1ofcssyq.png "Zulip")

[Zulip](https://zulipchat.com/) 是十分流行的群聊应用程序，它遵循基于话题线索的模式。在 Zulip 中，你可以订阅<ruby> 流 <rt>  stream </rt></ruby>，就像在 IRC 频道或 Rocket.Chat 中一样。但是，每个 Zulip 流都会拥有一个唯一的<ruby> 话题 <rt>  topic </rt></ruby>，该话题可帮助你以后查找对话，因此其更有条理。

与其他平台一样，它支持表情符号、内嵌图片、视频和推特预览。它还支持 LaTeX 来分享数学公式或方程式、支持 Markdown 和语法高亮来分享代码。

Zulip 是跨平台的，并提供 API 用于编写你自己的程序。我特别喜欢 Zulip 的一点是它与 GitHub 的集成整合功能：如果我正在处理某个<ruby> 议题 <rt>  issue </rt></ruby>，则可以使用 Zulip 的标记回链某个<ruby> 拉取请求 <rt>  pull request </rt></ruby> ID。

Zulip 是开源的（你可以在 GitHub 上访问其 [源码](https://github.com/zulip/zulip)）并且免费使用，但它有提供预置支持、[LDAP](https://en.wikipedia.org/wiki/Lightweight_Directory_Access_Protocol) 集成和更多存储类型的付费产品。

#### Let's Chat

![Let's Chat](/data/attachment/album/202104/06/103544y0nvnwwt7qqqnhee.png "Let's Chat")

[Let's Chat](https://sdelements.github.io/lets-chat/) 是一个面向小型团队的自托管的聊天解决方案。它使用 Node.js 和 MongoDB 编写运行，只需鼠标点击几下即可将其部署到本地服务器或云服务器。它是自由开源软件，可以在 GitHub 上查看其 [源码](https://github.com/sdelements/lets-chat)。

Let's Chat 与其他开源聊天工具的不同之处在于其企业功能：它支持 LDAP 和 [Kerberos](https://en.wikipedia.org/wiki/Kerberos_(protocol)) 身份验证。它还具有新用户想要的所有功能：你可以在历史记录中搜索过往消息，并使用 @username 之类的标签来标记人员。

我喜欢 Let's Chat 的地方是它拥有私人的受密码保护的聊天室、发送图片、支持 GIPHY 和代码粘贴。它不断更新，不断增加新功能。

### 附加：开源视频聊天软件 Jitsi

![Jitsi](/data/attachment/album/202104/06/103544t0axe4ggbbgh6urb.jpg "Jitsi")

有时，文字聊天还不够，你还可能需要与某人面谈。在这种情况下，如果不能选择面对面开会交流，那么视频聊天是最好的选择。[Jitsi](https://jitsi.org/) 是一个完全开源的、支持多平台且兼容 WebRTC 的视频会议工具。

Jitsi 从 Jitsi Desktop 开始，已经发展成为许多 [项目](https://jitsi.org/projects/)，包括 Jitsi Meet、Jitsi Videobridge、jibri 和 libjitsi，并且每个项目都在 GitHub 上开放了 [源码](https://github.com/jitsi)。

Jitsi 是安全且可扩展的，并支持诸如<ruby> 联播 <rt>  simulcast </rt></ruby>和<ruby> 带宽预估 <rt>  bandwidth estimation </rt></ruby>之类的高级视频路由的概念，还包括音频、录制、屏幕共享和拨入功能等经典功能。你可以来为你的视频聊天室设置密码以保护其不受干扰，并且它还支持通过 YouTube 进行直播。你还可以搭建自己的 Jitsi 服务器，并将其托管在本地或<ruby> 虚拟专用服务器 <rt>  virtual private server </rt></ruby>（例如 Digital Ocean Droplet）上。

我最喜欢 Jitsi 的是它是免费且低门槛的。任何人都可以通过访问 [meet.jit.si](http://meet.jit.si) 来立即召开会议，并且用户无需注册或安装即可轻松参加会议。（但是，注册的话能拥有日程安排功能。）这种入门级低门槛的视频会议服务让 Jitsi 迅速普及。

### 选择一个聊天应用软件的建议

各种各样的开源聊天应用软件可能让你很难抉择。以下是一些选择一款聊天应用软件的一般准则。

* 最好具有交互式的界面和简单的导航工具。
* 最好寻找一种功能强大且能让人们以各种方式使用它的工具。
* 如果与你所使用的工具有进行集成整合的话，可以重点考虑。一些工具与 GitHub 或 GitLab 以及某些应用程序具有良好的无缝衔接，这将是一个非常有用的功能。
* 有能托管到云主机的工具将十分方便。
* 应考虑到聊天服务的安全性。在私人服务器上托管服务的能力对许多组织和个人来说是必要的。
* 最好选择那些具有丰富的隐私设置，并拥有私人聊天室和公共聊天室的通讯工具。

由于人们比以往任何时候都更加依赖在线服务，因此拥有备用的通讯平台是明智之举。例如，如果一个项目正在使用 Rocket.Chat，则必要之时，它还应具有跳转到 IRC 的能力。由于这些软件在不断更新，你可能会发现自己已经连接到多个渠道，因此集成整合其他应用将变得非常有价值。

在各种可用的开源聊天服务中，你喜欢和使用哪些？这些工具又是如何帮助你进行远程办公？请在评论中分享你的想法。

---

via: <https://opensource.com/article/20/4/open-source-chat>

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

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


硬核观察 | 谷歌赢得十年之久的甲骨文版权战

Summary: 更多：• 有公司为勒索软件支付了数百万美元后没有及时补救，又被再次勒索 • 开车即可挖矿，智己汽车正式公布了用户数字资产“原石”挖矿方式

原石=积分

积分就积分，整这些忽悠人的新词，看来就是来忽悠人的

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

里程式开采我笑了。。以后挖矿不但费电还得费油啊？

![](/data/attachment/album/202104/06/132906alqqn666hqo5o56n.jpg)

### 谷歌赢得十年之久的甲骨文版权战

![](/data/attachment/album/202104/06/132919xynh3n6udzpy39qm.jpg)

在甲骨文以 72 亿美元收购了 Sun 微系统公司之后，就对谷歌发起了高达 60 亿美元的诉讼，这一数字后来增加到 90 亿美元。甲骨文认为，谷歌将 37 个 Java API 的“结构、顺序和组织”复制到 Android 中，侵犯了甲骨文的版权。这大约涉及到 11500 行代码。

这场打了十年之久的版权诉讼，已经在巡回法庭和基层法庭之间来回拉锯多次。周一，美国最高法院最终裁定，谷歌在 Android 操作系统中使用甲骨文的编程代码时，[并没有侵犯版权](https://www.bloomberg.com/news/articles/2021-04-05/supreme-court-overturns-oracle-s-copyright-win-over-google)。法院[表示](https://www.zdnet.com/article/google-beats-oracle-in-biggest-programming-copyright-supreme-court-case-ever/)，“谷歌复制 API 来重新实现用户界面，只取其所需，让用户将其积累的才能投入到一个新的、变革性的程序中，构成了对该材料的合理使用。”

很多人担心甲骨文胜诉或造成 API 版权问题，因而对软件行业造成极大破坏。但是，事实上这次裁决是在[假定 API 具有版权](https://www.zdnet.com/article/google-beats-oracle-in-biggest-programming-copyright-supreme-court-case-ever/)的前提下，裁定谷歌属于合理使用而已。

因此，虽然这个决定并没有直接排除 API 可以受版权保护的可能性，但它明确了根据合理使用原则，你不能阻止其他开发者自由使用你的 API 来构建新程序。换句话说，程序员可以继续在他们的项目中使用 API，就像之前几十年一样。

### 有公司为勒索软件支付了数百万美元后没有及时补救，又被再次勒索

![](/data/attachment/album/202104/06/132938b2pzvketek8e9zzy.jpg)

英国国家网络安全中心披露了一则警示性的[故事](https://www.ncsc.gov.uk/blog-post/rise-of-ransomware)：这家未提及名字的公司成为勒索软件攻击的受害者，以比特币支付了赎金（以当前汇率接近 650 万英镑），以恢复网络和文件。然而，该公司就这样不了了之，没有分析网络犯罪分子是如何渗透到网络中的。不到两周后，当同一个勒索软件团伙用同样的勒索软件感染网络时，该公司最终第二次支付了赎金。

对于大多数受害者来说，他们的首要任务是拿回他们的数据。然而，真正的问题是，勒索软件往往只是一个更严重的网络入侵的可见症状。为了安装勒索软件，网络犯罪分子可能已经能够获得网络的后门访问权。因此，如果没有亡羊补牢的话，他们可以随时回来部署另外一次勒索。

### 开车即可挖矿，智己汽车正式公布了用户数字资产“原石”挖矿方式

![](/data/attachment/album/202104/06/133003kfzjrcyfmdp0fjif.jpg)

由上汽集团、浦东新区和阿里巴巴集团三方联合投资超过 100 亿元的智己汽车，发布了它的“原石”挖矿方式。购车用户将通过“里程式开采”和“养成式开采”两种方式获取“原石”。所谓的“里程式开采”是指，购车用户基于日常用车产生授权使用的“车辆与驾驶行为数据”获取“原石”。而“养成式开采”是指用户参与 APP 互动任务、品牌共创任务等任务获得抽取“盲盒”。“原石”可被用于兑换各种硬件升级或软件空中升级服务，乃至金融及保险产品；还可享有公司升值的巨大红利。

虽然理论上，通过授权数据使用权而换得一定权益是符合逻辑的，但是这种在危险边缘试探的举动，很难说会不会被喊停。


《代码英雄》第四季（2）：大型机 GE-225 和 BASIC 的诞生

Summary: 通用电气（GE）的 CEO 拒绝进入这个市场。但一小队反叛的员工不顾规则，秘密进取。他们创造了 GE 225。这是工程上的一次巨大飞跃，它将计算从一个小众市场推向了主流，为今天的科技行业播下了种子。

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

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

![](/data/attachment/album/202104/07/091725dffoh0odu3oxnw3w.jpg)

本文是《[代码英雄](https://www.redhat.com/en/command-line-heroes)》系列播客[《代码英雄》第四季（2）：大型机: GE-225 和 BASIC 的诞生](https://www.redhat.com/en/command-line-heroes/season-4/mainframes)的[音频](https://cdn.simplecast.com/audio/a88fbe/a88fbe81-5614-4834-8a78-24c287debbe6/d27b7b80-6530-4f0a-b6df-a237c6939687/clh-s4-ep2-mainframe-the-ge-225-vfinal_tc.mp3)脚本。

>
> 导语：二战后，计算机行业开始蓬勃发展。<ruby> 通用电气 <rt>  General Electric </rt></ruby>（GE）的 CEO 拒绝进入这个市场。但一小队反叛的员工不顾规则，秘密进取。他们创造了 GE 225。这是工程上的一次巨大飞跃，它将计算从一个小众市场推向了主流，为今天的科技行业播下了种子。
>
>
> 在创建通用的<ruby> 大型机 <rt>  mainframe </rt></ruby>之前，计算机通常是为了执行单一功能而制造的。William Ocasio 回忆了 GE 的第一台专用计算机 ERMA 是如何帮助银行每天处理成千上万的交易的。John Joseph 讲述了 GE 的几名关键员工是如何蒙骗他们的 CEO 建立一个计算机部门的。Tomas Kellner 解释了他们的工作如何产生了一台革命性的机器：GE 225。而 Joy Lisi Rankin 则介绍了<ruby> 达特茅斯学院 <rt>  Dartmouth College </rt></ruby>的工程师们如何对 GE 225 用于<ruby> 分时 <rt>  time-sharing </rt></ruby>计算，并利用它创建了 BASIC —— 使计算变得更加方便的重要里程碑。
>
>
>

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

让我们回到几十年前，回到 40 年代末、50 年代初，当时计算机行业有“白雪公主和七个小矮人”的说法。众所周知，“白雪公主”指的是 IBM，而<ruby> 通用电气公司 <rt>  General Electric </rt></ruby>便是“七个小矮人”之一。这是一家偶尔生产定制机器，但从没在公开市场售卖计算机的公司。

**00:00:32**：

通用计算机是 IBM 的地盘，而 IBM 是 GE 的第二大客户（第一是美国政府）。IBM 经常采购 GE 生产的真空管、电机、变压器和开关等设备，GE 时任总裁 Ralph Cordiner 对此非常满意。所以，每当 GE 的部门主管将转向计算机业务的计划书提交到总裁办公室时，收到的答复都是封面上大写的橙色字母：RJC，Ralph Cordiner 一次又一次地拒绝他们。

**00:01:19**：

事实上，在 Cordiner 担任 GE 总裁兼首席执行官的 13 年时间里，GE 的态度从未改变。即使研究指出计算机是电子工业中增长最快的领域，但 Cordiner 总是用愤怒回应挑战他底线的员工们。然而，一小群叛逆的员工看到了制造大型机的机会，他们不想错失良机。然而他们不知道的是，这台大型机将拯救银行业，打开分时系统的大门，并孕育出新的编程语言。在上一季，我们听了 John Kemeny 和 Thomas Kurtz 在<ruby> 达特茅斯学院 <rt>  Dartmouth College </rt></ruby>创造 BASIC 的故事，了解到因为 BASIC 是解释型语言，早期的计算机没有足够的资源运行它。像 BASIC 这么好的点子，正等待着像 GE-225 这样合适的设备出现，让它大放异彩。这一章，让我们一起揭开那台差点被扼杀在摇篮中的大型机，那鲜为人知的故事。这台房间大小的机器打开了新世界的大门，它鼓舞了像<ruby> 史蒂夫•沃兹尼亚克 <rt>  Steve Wozniak </rt></ruby>和<ruby> 比尔•盖茨 <rt>  Bill Gates </rt></ruby>这样有远见的代码英雄，鼓舞他们推动个人电脑革命，它的创造在今天仍然意义非凡。我是 Saron Yitbarek，欢迎收听<ruby> 代码英雄 <rt>  Command Line Heros </rt></ruby>，Red Hat 的原创播客第四季：硬件设备。

>
> **00:03:05 - 话音 1**：
>
>
> Adams 先生觉得他的新支票账户很好用。与其他公司直接从<ruby> 埃姆维尔国家银行 <rt>  Elmvale National Bank </rt></ruby>兑现不同，用这个账号可以从自家银行兑现。与其他银行一样，自家银行把支票送到<ruby> 联邦储备银行 <rt>  Federal Reserve Bank </rt></ruby>去执行兑现。联邦储备银行正是为处理每天来自数百家银行的数千张支票而设立的。
>
>
>

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

1947 年，支票开始流行，银行工作人员的时间耗费在无穷无尽的支票当中。战后经济的蓬勃发展，更是让银行被铺天盖地的支票所淹没。为了腾出时间手工填写账簿，他们被迫下午 2 点就早早关门，但即使这样，他们仍然赶不上进度。他们迫切的希望，能有一台快速、强大的机器，让银行跟上商业发展的步伐。当时<ruby> 美国银行 <rt>  Bank of America </rt></ruby>每天要处理数百万张支票。下面有请<ruby> 西北大学凯洛格管理学院 <rt>  Kellogg School of Management at Northwestern University </rt></ruby>的教授 William Ocasio。

**00:04:12 - Will Ocasio**：

难以想象，银行如果没有电脑可用会是什么样子。银行本身就是繁重、文书密集型的行业，美国银行分支机构又那么多。有这么多的信息，他们想要能够快速的传递和处理这些信息。这对于这样一个大公司来说真的很重要。他们知道计算机才是未来的方向。

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

所以，1950 美国银行与<ruby> 斯坦福研究院 <rt>  Stanford Research Institute </rt></ruby>（SRI）签约，希望找到自动处理这些支票的方法。SRI 花了五年时间制造了一台原型机，并将其命名为<ruby> 电子记录会计机 <rt>  electronic recording machine accounting </rt></ruby>简称 ERMA。ERMA 有超过 100 万英尺的电线，8000 个真空管，重约 25 吨，每天可以处理 5 万笔交易。

**00:05:11**：

美国银行希望 ERMA 马上投入生产。于是向电子制造商们发出<ruby> 招标请求 <rt>  request for proposal </rt></ruby>（RFP），让它们竞标。当然，所有人都认为赢家将是行业巨头，被称作“白雪公主”的 IBM。Baker 博士是通用电气电子部门的副总裁，他知道他的老板 Cordiner 不想涉足 IBM 的领域，也知道计算机是公司的禁区，但当听到美国银行 RFP 的风声时，Baker 看到了其中的机会。他找到了 GE 位于<ruby> 帕洛阿尔托 <rt>  Palo Alto </rt></ruby>的微波实验室的经理 Barney Oldfield。在这个离 SRI 最近的地方向 Oldfield 提出了一个建议。下面有请<ruby> 加州大学欧文分校 <rt>  University of California, Irvine </rt></ruby>的战略副教授 John Joseph。

**00:06:09 - John Joseph**：

我认为他是一位成功、进取的企业家，也是精明的经理和商人，他认为这是部门发展的巨大机会。

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

Baker 和 Oldfield 成功说服了他们的老板 Cordiner，这是一台定制的生产控制系统，不是通用计算机，生产它不会让 IBM 不快。并且向他保证，GE 不会涉足计算机行业。

**00:06:45 - John Joseph**：

我觉得 Cordiner 最终屈服的原因是，他给他们提出了一个附加条件：仅此一份合同，不要继续深入商用机市场，只能参与这一次竞标。如果能做到，那你们去竞标吧。

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

尽管 Cordiner 不对竞标抱有任何希望，但还是让他们着手进行 RFP。就让他们发泄一下自己的创造力吧。随后 Oldfield 把他们的提案送到旧金山的银行办公室，等待着他们的答复。

**00:07:26**：

出人意料的事情发生了，IBM 忽然放弃竞标，更出乎意料的是，GE 的提案从所有制造商中脱颖而出。这个不被看好的提案赢得了百万美元的合同。美国银行董事会在 1956 年 4 月 9 日正式接受了这个方案。Baker 在没有经过他的老板 Cordiner 审核的情况下签下了这份价值 3100 万美元的合同，把不可能变成了可能。Oldfield 可以找个地方生产 ERMA 了，当然，他得先成立一个实际的计算机部门。

**00:08:19 - John Joseph**：

接下来轮到他们大显身手了。首先，他们确实成立了计算机部门，虽然听上去只是发一份声明就能搞定的事情。但是在这么大的公司内，把公司的资源和人力调动起来成立一个新部门，真的是一件很了不起的事情。

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

Barney Oldfield 成为计算机部门的主管。这个新部门很像 GE 的另一个制造定制机器的部门：<ruby> 军事系统部 <rt>  Military Systems Division </rt></ruby>。挑战 IBM 之前，两个部门要先分出胜负。

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

新成立的部门想要低调行事，而 GE 的分权管理方式，刚好适合这样偷偷摸摸的搞事情。只要部门是盈利的，就不会有太多的监管。没人知道他们在做什么。

**00:09:26 - John Joseph**：

当时的情况是，想要在 GE 发展你的小领地，就必须走出去寻找发展的机会。公司没有任何这方面的计划，他是个有冲劲的人，看到了这个机会。他干劲十足，想引领公司走出这重要的一步。

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

更大的挑战还在后头，在哪建立工厂好呢？Palo Alto 的团队想要搬到 Stanford 的工业园区，无奈加州劳动法太严和税收太高，所以这不是个好点子。最终他们选择了 Phoenix。虽然 Phoenix 不是吸引资深工程师的最佳地点，但自有它的优势。

**00:10:26 - John Joseph**：

GE 的总部远在纽约，选择 Phoenix 能让他们远离 GE。在这里，他们可以避开高层的监督，野蛮生长。事关大把钞票，远离 Cordiner 才能获得更大的自主权。

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

Oldfield 在 Phoenix 组建了一支可靠的工程师团队。团队成员有：Bob Johnson、George Snively、Gene Evans 还有 George Jacobi 等人。还有 John Pivoden 负责硬件、Henry Harold 是逻辑设计师、Jay Levinthal 是系统架构师。在这个与世隔绝的桃园胜地，团队氛围非常融洽。他们不仅能担起秘密制造 ERMA 的大任，还能幽默的看待自己的工作。我们找到了他们表演过的一个小短剧，他们称之为“进步的前沿”，这个小短剧某种程度上展示了项目的进展。下面大家一起欣赏一段摘录：

>
> **00:11:39 - 话音 2**：
>
>
> 好了，我们到凤凰城了。
>
>
> **00:11:41 - 话音 3**：
>
>
> 你终于来了。欢迎来到计算机部门。
>
>
> **00:11:45 - 合音**：
>
>
> 啥部门？
>
>
> **00:11:46 - 话音 3**：
>
>
> 计算机部门。
>
>
> **00:11:47 - 话音 4**:
>
>
> 计算机是啥？
>
>
> **00:11:49 - 话音 3**：
>
>
> 哦，有点像是带有圣诞树灯的涡轮机，可以播放音乐。
>
>
> **00:11:53 - 话音 5**：
>
>
> 是一种快速执行运算的机器。
>
>
> **00:11:56 - 话音 2**：
>
>
> 我们没必要用它记账，对吧？
>
>
> **00:11:58 - 话音 3**：
>
>
> 不，但我们得给 Van 一台让他玩，假装我们在用。
>
>
> **00:12:01 - 话音 4**:
>
>
> 噢，计算机是啥？
>
>
>

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

对美国银行而言，计算机是可以一天处理 55000 笔交易的机器，这台机器需要对各种大小和状况的支票进行分拣和分发，需要更新客户帐户和余额，需要能识别支票。他们要的不是 1 台，而是 36 台计算机。

**00:12:34**：

项目初期，团队就决定 GE 版本的 ERMA 将使用晶体管来实现。在 50 年代，虽然晶体管比真空管更昂贵，但体积小，与逻辑板的连接器也更简单。原型机的每个真空管和触发器被两个晶体管所取代，使用额外的电阻和电容将它们连接在一起。将 ERMA 设计成软件编程设备，而不是硬件编程设备，是对原型机的另一个重大改变。这样可以简化机器设计，方便以后轻松修改。鉴于大多数 GE 的开发人员都从事硬件工作，他们得再聘请一名程序员。他们选择了一位几年前从纳粹德国逃出，以难民身份来到美国的男子。这名男子名叫 Joseph Weizenbaum。

**00:13:34**：

Weizenbaum 曾在一家名为 Bendix 的公司为 G-15 电脑编程。他甚至为它开发了一种名为 Intercom 100 的伪机器编程语言。尽管除了兑现支票之外，Weizenbaum 没有任何银行相关经验，但他还是领导小小的编程团队，开始编写支持晶体管硬件的软件。该团队还为所有的外围设备编程，包括支票排序器，还有被他们称做 MICR 阅读器的东西。MICR 的意思是“<ruby> 磁性墨水字符识别 <rt>  magnetic ink character recognition </rt></ruby>”。你知道支票底部的那行数字吗？那就是 MICR。这行数字由三部分组成，分别表示银行账户、路由号码和支票号码。直到今天，支票上仍有 Weizenbaum 和他的团队在凤凰城的杰作。

**00:14:28**：

值得一提的是。Weizenbaum 后来被认为是 AI（人工智能）的奠基人之一。1958 年 12 月 28 日，在 GE 赢得合同近三年后，<ruby> 美国银行圣何塞分行 <rt>  San Jose Branch of Bank of America </rt></ruby>实装了第一台 ERMA 机器。虽然这台机器每天只能处理 100 笔交易，但这是朝着正确方向迈出的一步。接下来，他们要兑现每天处理 55000 笔交易的承诺。

**00:15:04**：

到了次年 3 月，该团队不仅兑现了 5.5 万交易的的承诺，还增加了分拣机和打印机，使整个系统每天可以处理 200 万笔交易。美国银行兴奋不已。位于 Phoenix 的电脑部门交付了 32 台命名为 GE-100 的机器，还有更多的订单正在准备中，是时候庆祝了。

**00:15:32 - Will Ocasio**：

美国银行邀请 Cordiner 参加计算机的揭幕仪式。他们甚至邀请了曾在通用电气工作过的<ruby> 罗纳德•里根 <rt>  Ronald Reagan </rt></ruby>作为他们的电视发言人，这太了不起了。然而，Cordiner 来到揭幕式后，忽然想到：“等一下，这跟之前说的不一样”，然后他生气的开除了 Barney Oldfield。

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

额，Oldfield 就这么被开除了？Phoenix 的团队的明明超额完成了任务，完成了不可思议的壮举，他们的领袖得到的奖励却是被开除？更可气的是，Cordiner 重新任命了部门的负责人，Baker 博士的继任者 Harold Strickland 对电脑并不感兴趣。因为担心会惹 IBM 生气，Cordiner 给 Strickland 下了明确的指示，要他务必管好计算机团队。一个叫 Claire Lasher 的公司职员接替了 Oldfield 的工作。可 Cordiner 不知道的是，Lasher 骨子里也是个反叛者。

**00:16:47**：

通用电气总裁 Cordiner 想要远离商用计算机行业，他从一开始就不想进入这个行业。他想让通用电气尽快回到老样子。他允许生产已有的订单，但用他的话来说：“下不为例！”。后来，当 Cordiner 听到自己银行界的朋友向他称赞 GE-100 的创新时，他的态度发生了转变。所以好吧，他们可以继续在自己创造的沙盒中自由发挥，唯一的限制就是：“不要和 IBM 正面交锋”。

**00:17:24**：

Claire Lasher 的专长是市场营销。他看到了通用计算机市场的蓝海，借鉴了 Oldfield 的经验，制定了自己的计划。那就是两用计算机 200 系列。这个系列既是定制机器，又是通用机器。Claire 将他的商业计划命名为<ruby> 大观 <rt>  The Big Look </rt></ruby>，他为 Phoenix 团队招募了更多的工程师，其中包括一位曾在纽约从事 GE-312 和 412 过程控制计算机的人，他的名字叫 Arnold Spielberg，是新团队的领导。

**00:18:05**：

看完技术规格后，Arnold 说：“嘿，如果我们调整一下硬件设计方案，我们就能造出通用机器界的大杀器“。于是，Arnold 增加了读卡器、打印机和磁带处理程序等外围设备。仅用 5 个月就完成了原型机，这款新机器被称为 GE-225。有趣的是，Arnold Spielberg 是<ruby> 史蒂文•斯皮尔伯格 <rt>  Steven Spielberg </rt></ruby>的父亲。为了了解更多关于 Spielberg，以及他在创造 GE-225 这台高层从来不想要的机器中所扮演的角色，我采访了通用电气的<ruby> 首席故事官 <rt>  chief storyteller </rt></ruby> Tomas Kellner。

**00:18:51 - Tomas Kelner**：

Arnold 和他的同事 Chuck Prosper 是这台电脑的设计者，他们一起制造了它。有趣的是，和 GE 以前的计算机不同，GE-225 是商用计算机，它实际上有一个存储系统，并且能够处理数据的输入和输出。

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

GE-225 的哪些技术进步可以归功于 Arnold 呢？

**00:19:21 - Tomas Kelner**：

最有趣的是，这台电脑有自己的内存，能够记录和输出信息。这种存储器可以存储 8000 到 16000 个 <ruby> 20 位字 <rt>  20-bit word </rt></ruby>。它还有一个辅助存储器，大约可以存储 32000 个 20 位字。他之前也用过一些<ruby> 硬件编程 <rt>  wire software </rt></ruby>设备，它们真的很难使用。这些设备只能编程一次，然后就不能再修改了。GE-225 的进步之处在于，有了数据存储的能力。

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

GE-225 长什么样子？

**00:20:02 - Tomas Kelner**：

说实话，GE-225 看起来不怎么好看，它像一堆盒子。它有存储信息的磁带，有输入终端和输出终端。尽管它被称为小型计算机，但它能占满整个地下室。

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

它能完成哪些其他计算机无法完成的任务呢？

**00:20:30 - Tomas Kelner**：

GE-225 计算机的新特性是支持分时操作。支持多个远程终端访问计算机，多个用户能够同时在上边工作、写代码。据我所知，当时其他的计算机没这种能力。

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

那么谁买了 GE-225？GE-225 的目标客户是哪些人呢？

**00:21:02 - Tomas Kelner**：

通用电气公司内部肯定使用了这些计算机，但全国各地的一些银行也使用了它们，还有<ruby> 克利夫兰布朗队 <rt>  Cleveland Browns </rt></ruby>也用它们来管理季票销售。有人甚至用其中一台电脑预测了一场全州范围的选举，当然，预测的很准。人们似乎对这台机器非常着迷。Cordiner 让团队在 18 个月内退出计算机行业，但是因为这台计算机的成功，他们搁置了这个计划。

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

重点是，GE-225 不仅是一个银行解决方案。还记得 BASIC 的创始人 John Kemeny 和 Thomas Kurtz 吗？BASIC 就是他们在 GE-225 上创造的。还有另一位代码英雄，他发现了 GE-225 上的编程漏洞。

**00:22:03**：

尽管那时他还在上高中。接下来让 Tomas 告诉你，GE-225 在 BASIC 的开发中起到了什么作用？

**00:22:14 - Tomas Kelner**：

GE-225 上开发了很多有趣的项目，达特茅斯学院的科学家们开发的 BASIC 语言便是其中之一。当时，他们想发明一种使程序员在不同的终端上同时工作的工具。这个工具，就是后来的 BASIC。关于 BASIC 另一件趣事是，通用电气以最快的速度从达特茅斯学院获得了 BASIC 的授权，并开始在内部使用它和预装在 GE-225 上。<ruby> 史蒂夫•沃兹尼亚克 <rt>  Steve Wozniak </rt></ruby>就是通过 GE-225 接触到 BASIC。当他接触到了一个连接到 GE-225 计算机上运行 BASIC 的终端时，他瞬间就爱上了这个工具，实际上他的处女作就是在上面完成的。

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

那么当你和 Arnold 交谈时，他意识到他对计算机世界的影响了吗？

**00:23:18 - Tomas Kelner**：

对 Arnold Spielberg 的采访真是令人难以置信。那时，他已经 99 岁了。

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

哇哦。

**00:23:24 - John Joseph**：

他记得所有的事情，我们谈到了互联网，我清楚的记得，他说，在 1960 年代，畅想过计算机的未来，但是他从没想到，有一天人们可以通过家用电脑和智能手机，连接到互联网这个庞大的网络中。没想到人们可以随时随地获取信息，航空公司通过计算机控制飞机，控制机器工作。一方面，他对该领域的发展非常感兴趣。另一方面，他也非常谦虚地承认，该领域的发展超过了他在 20 世纪 60 年代的想像。

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

你认为这一切对<ruby> 史蒂芬•斯皮尔伯格 <rt>  Steven Spielberg </rt></ruby>和他的事业有什么影响？

**00:24:18 - Tomas Kelner**：

史蒂芬还记得曾拜访过 GE 在他们的家乡亚利桑那州 Phoenix 建的工厂，他的父亲带他来工作的地方参观。他当时一头雾水，他爸试图向他解释电脑是什么，能做什么。他的原话是：“这一切对我来说都像是希腊语。”可见他当时是真的听不懂。我问 Arnold 对自己儿子的印象。他说：“我想让他学习工程学，培养他的技术热情，但他却只对电影感兴趣”。

>
> **00:25:00 - 话音 6**：
>
>
> 随后银行业进入电子时代。今天，这种磁性油墨计算机系统让银行能够提供世界上最快、最有效的服务。保险公司、百货公司和公用事业公司也陆续开始使用类似的系统。事实上，所有文书工作都开始使用计算机。但谁知道呢，也许将来，会有更好的解决方案。
>
>
>

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

到 1962 年，GE-225 全面投产，并在推出一年后，迅速成为公司的重磅产品。它不仅为公司盈利，还在商界赢得了很高的声誉。在之后的几个月里，Cordiner 收到了来自全国各地的祝贺信息，他最终改变了他的想法，打算投身计算机行业。他终于正式认可了通用电气计算机部门。

**00:26:13**：

让我们回到与 Tomas 对话中提到的一些事情，我们在上一季的《[C 语言之巨变](/article-13066-1.html)》那一期中也有提到。当达特茅斯学院使用 GE-225 开发一个工具，让程序员可以在不同的终端上同时工作 —— 换句话说，分时系统 —— GE 并没意识到分时的潜力。

**00:26:38 - Joy Lisi Rankin**：

达特茅斯学院使用 GE-225 和 GE DATANET 30 实现了分时系统，此前通用电气从未考虑使用这两种设备来实现这一功能。

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

Joy Lisi Rankin 是一名技术历史学家。

**00:26:57 - Joy Lisi Rankin**：

分时系统的关键在于电脑需要某种方式来停止自己的时钟。分时不是指人们在计算机上共享时间，而是指计算机共享自己的时间来处理多个计算请求。达特茅斯学院的师生们决定，使用 DATANET 30（这是一台 GE 的通信计算机）和 GE-225 共同开发分时系统。

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

因为大型机在 60 年代非常昂贵，批量运行是使用大型机最高效的方法。当时的人编写程序，然后做成打孔卡片以运行程序，他们将卡片交给操作员，然后他们就得等着它和其他程序一起被分批运行。有时要等几个小时，甚至几天。

**00:27:58 - Joy Lisi Rankin**：

在社交电脑和社交网络出现之前，在 Facebook 出现之前，分时系统、BASIC 还有达特茅斯学院和 GE，对开启个人电脑时代发挥了重要作用。通用电气从达特茅斯学院建立的分时系统中吸取经验，将其应用到自己的业务中，迅速建立起了全球分时服务行业。1970 年的某个时候，仅欧洲就有 10 万分时用户。在 20 世纪 70 年代到 80 年代，分时是他们的重要业务。

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

尽管 GE-225 和随后的 200 系列计算机取得了成功，通用电气公司还是在 1970 年将其大型机部门卖给了 Honeywell。但他们仍然决定保持分时共享业务，并在未来几年保持盈利。

**00:29:08**：

Ralph Cordiner 的故事讲完了，就像我们在上一期，数据通用公司发明小型机的故事中看到的，下一代伟大机器，它往往需要一个由顽固的、有远见的叛逆者和一些前瞻的执行官组成的团队来建造。人算不如天算，集思广益往往会有意想不到的收获。

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

下一期，我们将从 GE-225 结束的地方开始，来谈谈大型机如何启发新一代程序员展开个人计算机革命，谈一谈他们对我们的启发。《代码英雄》是红帽的原创播客。访问我们的网站 [redhat.com/commandlineheroes](https://www.redhat.com/commandlineheroes%22redhat.com/commandlineheroes%22) 了解更多有关 GE-225 的资料。我是 Saron Yitbarek，下期之前，编码不止！

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

---

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

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

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


在 Linux 中把多个 Markdown 文件转换成 HTML 或其他格式

Summary: 我用 pandoc 来转换文件，它可以一次性地转换所有 Markdown 文件。

![](/data/attachment/album/202104/07/095441bztj6cz68j89568u.jpg)

很多时候我与 Markdown 打交道的方式是，先写完一个文件，然后把它转换成 HTML 或其他格式。也有些时候，需要创建一些新的文件。当我要写多个 Markdown 文件时，通常要把他们全部写完之后才转换它们。

我用 `pandoc` 来转换文件，它可以一次性地转换所有 Markdown 文件。

Markdown 格式的文件可以转换成 .html 文件，有时候我需要把它转换成其他格式，如 epub，这个时候 [pandoc](https://pandoc.org/) 就派上了用场。我更喜欢用命令行，因此本文我会首先介绍它，然而你还可以使用 [VSCodium](https://vscodium.com/) 在非命令行下完成转换。后面我也会介绍它。

### 使用 pandoc 把多个 Markdown 文件转换成其他格式（命令行方式）

你可以在 Ubuntu 及其他 Debian 系发行版本终端输入下面的命令来快速开始：

```
sudo apt-get install pandoc

```

本例中，在名为 `md_test` 目录下我有四个 Markdown 文件需要转换。

```
[email protected]:~/Documents/md_test$ ls -l *.md
-rw-r--r-- 1 bdyer bdyer 3374 Apr  7  2020 file01.md
-rw-r--r-- 1 bdyer bdyer  782 Apr  2 05:23 file02.md
-rw-r--r-- 1 bdyer bdyer 9257 Apr  2 05:21 file03.md
-rw-r--r-- 1 bdyer bdyer 9442 Apr  2 05:21 file04.md
[email protected]:~/Documents/md_test$

```

现在还没有 HTML 文件。现在我要对这些文件使用 `pandoc`。我会运行一行命令来实现：

* 调用 `pandoc`
* 读取 .md 文件并导出为 .html

下面是我要运行的命令：

```
for i in *.md ; do echo "$i" && pandoc -s $i -o $i.html ; done

```

如果你不太理解上面的命令中的 `;`，可以参考 [在 Linux 中一次执行多个命令](https://itsfoss.com/run-multiple-commands-linux/)。

我执行命令后，运行结果如下：

```
[email protected]:~/Documents/md_test$ for i in *.md ; do echo "$i" && pandoc -s $i -o $i.html ; done
file01.md
file02.md
file03.md
file04.md
[email protected]:~/Documents/md_test$

```

让我再使用一次 `ls` 命令来看看是否已经生成了 HTML 文件:

```
[email protected]:~/Documents/md_test$ ls -l *.html
-rw-r--r-- 1 bdyer bdyer  4291 Apr  2 06:08 file01.md.html
-rw-r--r-- 1 bdyer bdyer  1781 Apr  2 06:08 file02.md.html
-rw-r--r-- 1 bdyer bdyer 10272 Apr  2 06:08 file03.md.html
-rw-r--r-- 1 bdyer bdyer 10502 Apr  2 06:08 file04.md.html
[email protected]:~/Documents/md_test$

```

转换很成功，现在你已经有了四个 HTML 文件，它们可以用在 Web 服务器上。

pandoc 功能相当多，你可以通过指定输出文件的扩展名来把 Markdown 文件转换成其他支持的格式。不难理解它为什么会被认为是[最好的写作开源工具](https://itsfoss.com/open-source-tools-writers/)。

### 使用 VSCodium 把 Markdown 文件转换成 HTML（GUI 方式）

就像我们前面说的那样，我通常使用命令行，但是对于批量转换，我不会使用命令行，你也不必。VSCode 或 [VSCodium](https://itsfoss.com/vscodium/) 可以完成批量操作。你只需要安装一个 Markdown-All-in-One 扩展，就可以在一次运行中转换多个 Markdown 文件。

有两种方式安装这个扩展：

* VSCodium 的终端
* VSCodium 的插件管理器

通过 VSCodium 的终端安装该扩展：

1. 点击菜单栏的 `终端`。会打开终端面板
2. 输入，或[复制下面的命令并粘贴到终端](https://itsfoss.com/copy-paste-linux-terminal/)：

```
codium --install-extension yzhang.markdown-all-in-one

```

**注意**：如果你使用的 VSCode 而不是 VSCodium，那么请把上面命令中的 `codium` 替换为 `code`

![](/data/attachment/album/202104/07/095532nmz18hxed6dxldqr.jpg)

第二种安装方式是通过 VSCodium 的插件/扩展管理器：

1. 点击 VSCodium 窗口左侧的块区域。会出现一个扩展列表，列表最上面有一个搜索框。
2. 在搜索框中输入 “Markdown All in One”。在列表最上面会出现该扩展。点击 “安装” 按钮来安装它。如果你已经安装过，在安装按钮的位置会出现一个齿轮图标。

![](/data/attachment/album/202104/07/095533wp55yjpxx322u25h.jpg)

安装完成后，你可以打开含有需要转换的 Markdown 文件的文件夹。

点击 VSCodium 窗口左侧的纸张图标。你可以选择文件夹。打开文件夹后，你需要打开至少一个文件。你也可以打开多个文件，但是最少打开一个。

当打开文件后，按下 `CTRL+SHIFT+P` 唤起命令面板。然后，在出现的搜索框中输入 `Markdown`。当你输入时，会出现一列 Markdown 相关的命令。其中有一个是 `Markdown All in One: Print documents to HTML` 命令。点击它：

![](/data/attachment/album/202104/07/095533wohb4vq7ph1qqq6m.jpg)

你需要选择一个文件夹来存放这些文件。它会自动创建一个 `out` 目录，转换后的 HTML 文件会存放在 `out` 目录下。从下面的图中可以看到，Markdown 文档被转换成了 HTML 文件。在这里，你可以打开、查看、编辑这些 HTML 文件。

![](/data/attachment/album/202104/07/095534g25m4i2ws5554i5w.jpg)

在等待转换 Markdown 文件时，你可以更多地集中精力在写作上。当你准备好时，你就可以把它们转换成 HTML —— 你可以通过两种方式转换它们。

---

via: <https://itsfoss.com/convert-markdown-files/>

作者：[Bill Dyer](https://itsfoss.com/author/bill/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[lxbwolf](https://github.com/lxbwolf) 校对：[wxy](https://github.com/wxy)

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


硬核观察 | 50 岁大叔用 FaceApp 冒充“超人气美少女骑手”，揭穿后却得到了更多支持

Summary: 更多：• 谷歌支持使用 Rust 编写安卓代码 • 苹果向 FreeBSD 基金会捐赠了不到 250 美元

"看到这篇新闻，想到我主持的“硬核观察”寥寥无几的数据，我不禁陷入了深深的思考。"

硬核老王太惨了

AI女装解决一切问题（doge

老王，我也想看你在bilibili的视频，但是看不下去。为了开源理念的传播，你赶紧鼓捣一下换脸吧，哈哈哈哈

老王变身超人气美少女主播，一周新增8000 粉。

![](/data/attachment/album/202104/07/132122mrbbwqr9g951qb9a.jpg)

### 50 岁大叔用 FaceApp 冒充“超人气美少女骑手”，揭穿后却得到了更多支持

![](/data/attachment/album/202104/07/132133d012ocozicmkfs14.jpg)

一位日本车手“宗谷の苍氷”经常在 [Twitter](https://twitter.com/azusagakuyuki/status "https://twitter.com/azusagakuyuki/status") 上晒自己的“超人气美少女骑手”照片，“她”在几个月内收获了 1.7 万粉丝。然而，最近“她”参加了一期综艺节目，揭穿了自己其实是一位 50 岁的大叔，所贴出来的照片都是使用著名的换脸应用 FaceApp 处理过的。原因是他一直在 Twitter 分享自己玩机车的照片，但是关注寥寥。在发现 FaceApp 后，他想，人们应该更爱看一个“年轻美丽的女人”，而不是一个“中年大叔”。于是就在几个月内变身成了一位“超人气美少女骑手”，获得了大量关注和互动，有的推文能获得上千点赞。

或许你会觉得被揭穿后，这位“超人气美少女骑手”会被网友们唾弃取关。不料，该节目播出后不仅没有引起观众反感，粉丝数还增加了，一周就新增了 8000 粉丝。网友们表示，这属于 Deepfake 技术的“善意”使用。

看到这篇新闻，想到我主持的“硬核观察”寥寥无几的数据，我不禁陷入了深深的思考。

### 谷歌支持使用 Rust 编写安卓代码

![](/data/attachment/album/202104/07/132145ut9brct0rqyimuvi.jpg)

安卓操作系统大量使用了 Java，有效地保护了安卓平台的大部分内存错误。但是，对于操作系统的下层来说，Java 和 Kotlin 并不适用。虽然谷歌投入了大量精力，防止了大量的 bug 进入安卓操作系统，而适用于此场景的 C 和 C++ 中的内存安全漏洞仍然是最难解决的不正确性来源。

因此，谷歌刚刚[宣布](https://security.googleblog.com/2021/04/rust-in-android-platform.html "https://security.googleblog.com/2021/04/rust-in-android-platform.html")，Android 开源项目（AOSP）现在支持 Rust 编程语言来开发操作系统本身。Rust 在实现这种安全性的同时，还能提供与 C 和 C++ 相当的性能。当然，这并不意味着谷歌会用 Rust 重写数百万行安卓代码，而是会逐渐使用 Rust 编写新的代码，因为随着时间的推移，旧代码中的 bug 也在逐渐减少。

看来 Rust 进一步蚕食 C/C++ 领域的机会已经出现了，C/C++ 程序员们，是时候考虑学习 Rust 了。

### 苹果向 FreeBSD 基金会捐赠了不到 250 美元

![](/data/attachment/album/202104/07/132155ycbfc6ibznm4z4ni.jpg)

根据 FreeBSD 基金会的[记录](https://freebsdfoundation.org/our-donors/donors/?donationType=individual&donationYear=2021 "https://freebsdfoundation.org/our-donors/donors/?donationType=individual&donationYear=2021")，苹果公司在 2021 年向该基金会捐赠了 100 到 249 美元。而微软捐赠了 500 到 999 美元，思科、Google、英特尔和 NetFlix 捐赠了 1000 到 4999 美元。

为什么世界市值最高的企业只捐赠如此少的钱？苹果的做法其实是基于一项政策：匹配雇员的捐赠。有很多公司采用类似的政策，苹果是其中之一。

感觉 FreeBSD 基金会没有得到应有的关注。


如何解决 Windows-Linux 双启动设置中显示时间错误的问题

Summary: 如果你 双启动 Windows 和 Ubuntu 或任何其他 Linux 发行版，你可能会注意到两个操作系统之间的时间差异。

这个时钟问题当时困扰了我好久。虽然现在已经不用双系统了，但是看好解决方案还是很欣慰。

哪个不常用改哪个

固态U盘里的系统也使用这种方法吗

![](/data/attachment/album/202104/08/102102xaup3iofozn2uvbf.jpg)

如果你 [双启动 Windows 和 Ubuntu](https://itsfoss.com/install-ubuntu-1404-dual-boot-mode-windows-8-81-uefi/) 或任何其他 Linux 发行版，你可能会注意到两个操作系统之间的时间差异。

当你 [使用 Linux](https://itsfoss.com/why-use-linux/) 时，它会显示正确的时间。但当你进入 Windows 时，它显示的时间是错误的。有时，情况正好相反，Linux 显示的是错误的时间，而 Windows 的时间是正确的。

特别奇怪的是，因为你已连接到互联网，并且已将日期和时间设置为自动使用。

别担心！你并不是唯一一个遇到这种问题的人。你可以在 Linux 终端上使用以下命令来解决这个问题：

```
timedatectl set-local-rtc 1

```

同样，不要担心。我会解释为什么你在双启动设置中会遇到时间差。我会向你展示上面的命令是如何修复 Windows 双启动后的时间错误问题的。

### 为什么 Windows 和 Linux 在双启动时显示不同的时间？

一台电脑有两个主要时钟：系统时钟和硬件时钟。

硬件时钟也叫 RTC（[实时时钟](https://www.computerhope.com/jargon/r/rtc.htm)）或 CMOS/BIOS 时钟。这个时钟在操作系统之外，在电脑的主板上。即使在你的系统关机后，它也会继续运行。

系统时钟是你在操作系统内看到的。

当计算机开机时，硬件时钟被读取并用于设置系统时钟。之后，系统时钟被用于跟踪时间。如果你的操作系统对系统时钟做了任何改变，比如改变时区等，它就会尝试将这些信息同步到硬件时钟上。

默认情况下，Linux 认为硬件时钟中存储的时间是 UTC，而不是本地时间。另一方面，Windows 认为硬件时钟上存储的时间是本地时间。这就是问题的开始。

让我用例子来解释一下。

你看我在加尔各答 UTC+5:30 时区。安装后，当我把 [Ubuntu 中的时区](https://itsfoss.com/change-timezone-ubuntu/) 设置为加尔各答时区时，Ubuntu 会把这个时间信息同步到硬件时钟上，但会有 5:30 的偏移，因为对于 Linux 来说它必须是 UTC。

假设加尔各答时区的当前时间是 15:00，这意味着 UTC 时间是 09:30。

现在当我关闭系统并启动到 Windows 时，硬件时钟有 UTC 时间（本例中为 09:30）。但是 Windows 认为硬件时钟已经存储了本地时间。因此，它改变了系统时钟（应该显示为 15:00），而使用 UTC 时间（09:30）作为本地时间。因此，Windows 显示时间为 09:30，这比实际时间（我们的例子中为 15:00）早了 5:30。

![](/data/attachment/album/202104/08/102110ur1v5rn33a5z131l.jpg)

同样，如果我在 Windows 中通过自动时区和时间按钮来设置正确的时间，你知道会发生什么吗？现在它将在系统上显示正确的时间（15:00），并将此信息（注意图片中的“同步你的时钟”选项）同步到硬件时钟。

如果你启动到 Linux，它会从硬件时钟读取时间，而硬件时钟是当地时间（15:00），但由于 Linux 认为它是 UTC 时间，所以它在系统时钟上增加了 5:30 的偏移。现在 Linux 显示的时间是 20:30，比实际时间超出晚了 5:30。

现在你了解了双启动中时差问题的根本原因，是时候看看如何解决这个问题了。

### 修复 Windows 在 Linux 双启动设置中显示错误时间的问题

有两种方法可以处理这个问题：

* 让 Windows 将硬件时钟作为 UTC 时间
* 让 Linux 将硬件时钟作为本地时间

在 Linux 中进行修改是比较容易的，因此我推荐使用第二种方法。

现在 Ubuntu 和大多数其他 Linux 发行版都使用 systemd，因此你可以使用 `timedatectl` 命令来更改设置。

你要做的是告诉你的 Linux 系统将硬件时钟（RTC）作为本地时间。你可以通过 `set-local-rtc` （为 RTC 设置本地时间）选项来实现：

```
timedatectl set-local-rtc 1

```

如下图所示，RTC 现在使用本地时间。

![](/data/attachment/album/202104/08/102111gzvrupq2e2yogavg.png)

现在如果你启动 Windows，它把硬件时钟当作本地时间，而这个时间实际上是正确的。当你在 Linux 中启动时，你的 Linux 系统知道硬件时钟使用的是本地时间，而不是 UTC。因此，它不会尝试添加这个时间的偏移。

这就解决了 Linux 和 Windows 双启动时的时差问题。

你会看到一个关于 RTC 不使用本地时间的警告。对于桌面设置，它不应该引起任何问题。至少，我想不出有什么问题。

希望我把事情给你讲清楚了。如果你还有问题，请在下面留言。

---

via: <https://itsfoss.com/wrong-time-dual-boot/>

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


为什么我喜欢使用 IPython shell 和 Jupyter 笔记本

Summary: Jupyter 笔记本将 IPython shell 提升到一个新的高度。

>
> Jupyter 笔记本将 IPython shell 提升到一个新的高度。
>
>
>

![](/data/attachment/album/202104/08/125206uvglkoqzukhfk3uv.jpg "Computer laptop in space")

Jupyter 项目最初是以 IPython 和 IPython 笔记本的形式出现的。它最初是一个专门针对 Python 的交互式 shell 和笔记本环境，后来扩展为不分语言的环境，支持 Julia、Python 和 R 以及其他任何语言。

![Jupyter](/data/attachment/album/202104/08/125333wz2wm11z59m4wlq3.png "Jupyter")

IPython 是一个 Python shell，类似于你在命令行输入 `python` 或者 `python3` 时看到的，但它更聪明、更有用。如果你曾经在 Python shell 中输入过多行命令，并且想重复它，你就会理解每次都要一行一行地滚动浏览历史记录的挫败感。有了 IPython，你可以一次滚动浏览整个块，同时还可以逐行浏览和编辑这些块的部分内容。

![iPython](/data/attachment/album/202104/08/125333bzmuc2na0ezvzgvk.png "iPython")

它具有自动补全，并提供上下文感知的建议：

![iPython offers suggestions](/data/attachment/album/202104/08/125333n75uz5fu11o7m2s7.png "iPython offers suggestions")

它默认会整理输出：

![iPython pretty prints](/data/attachment/album/202104/08/125334odi5f9fc3fox107z.png "iPython pretty prints")

它甚至允许你运行 shell 命令：

![IPython shell commands](/data/attachment/album/202104/08/125334b2wl5dlwhwu5w3cc.png "IPython shell commands")

它还提供了一些有用的功能，比如将 `?` 添加到对象中，作为运行 `help()` 的快捷方式，而不会破坏你的流程：

![IPython help](/data/attachment/album/202104/08/125334m66zqolanj6clowi.png "IPython help")

如果你使用的是虚拟环境（参见我关于 [virtualenvwrapper](https://opensource.com/article/21/2/python-virtualenvwrapper) 的帖子），可以在环境中用 `pip` 安装：

```
pip install ipython

```

要在全系统范围内安装，你可以在 Debian、Ubuntu 或树莓派上使用 `apt`：

```
sudo apt install ipython3

```

或使用 `pip`：

```
sudo pip3 install ipython

```

### Jupyter 笔记本

Jupyter 笔记本将 IPython shell 提升到了一个新的高度。首先，它们是基于浏览器的，而不是基于终端的。要开始使用，请安装 `jupyter`。

如果你使用的是虚拟环境，请在环境中使用 `pip` 进行安装：

```
pip install jupyter

```

要在全系统范围内安装，你可以在 Debian、Ubuntu 或树莓派上使用 `apt`：

```
sudo apt install jupyter-notebook

```

或使用 `pip`：

```
sudo pip3 install jupyter

```

启动笔记本：

```
jupyter notebook

```

这将在你的浏览器中打开：

![Jupyter Notebook](/data/attachment/album/202104/08/125334rp855dmgb889hrzp.png "Jupyter Notebook")

你可以使用 “New” 下拉菜单创建一个新的 Python 3 笔记本：

![Python 3 in Jupyter Notebook](/data/attachment/album/202104/08/125335ojn29jvz2zs72nl2.png "Python 3 in Jupyter Notebook")

现在你可以在 `In[ ]` 字段中编写和执行命令。使用 `Enter` 在代码块中换行，使用 `Shift+Enter` 来执行：

![Executing commands in Jupyter](/data/attachment/album/202104/08/125335nf9nibgb3f0zq55j.png "Executing commands in Jupyter")

你可以编辑和重新运行代码块，你可以重新排序、删除，复制/粘贴，等等。你可以以任何顺序运行代码块，但是要注意的是，任何创建的变量的作用域都将根据执行的时间而不是它们在笔记本中出现的顺序。你可以在 “Kernel” 菜单中重启并清除输出或重启并运行所有的代码块。

使用 `print` 函数每次都会输出。但是如果你有一条没有分配的语句，或者最后一条语句没有分配，那么它总是会输出：

![Jupyter output](/data/attachment/album/202104/08/125335zbsfblvumf1szrhg.png "Jupyter output")

你甚至可以把 `In` 和 `Out` 作为可索引对象：

![Jupyter output](/data/attachment/album/202104/08/125335v66y2qfbowfe65n9.png "Jupyter output")

所有的 IPython 功能都可以使用，而且通常也会表现得更漂亮一些：

![Jupyter supports IPython features](/data/attachment/album/202104/08/125336v21phmzqj14mp1ce.png "Jupyter supports IPython features")

你甚至可以使用 [Matplotlib](https://matplotlib.org/) 进行内联绘图：

![Graphing in Jupyter Notebook](/data/attachment/album/202104/08/125336vfzfreirrycpmplq.png "Graphing in Jupyter Notebook")

最后，你可以保存你的笔记本，并将其包含在 Git 仓库中，如果你将其推送到 GitHub，它们将作为已完成的笔记本被渲染：输出、图形和所有一切（如 [本例](https://github.com/piwheels/stats/blob/master/2020.ipynb)）：

![Saving Notebook to GitHub](/data/attachment/album/202104/08/125336lpttdoyk918odzp1.png "Saving Notebook to GitHub")

---

本文原载于 Ben Nuttall 的 [Tooling Tuesday 博客](https://tooling.bennuttall.com/the-ipython-shell-and-jupyter-notebooks/)，经许可后重用。

---

via: <https://opensource.com/article/21/3/ipython-shell-jupyter-notebooks>

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


硬核观察 | Redis Labs 最新一轮融资估值突破 20 亿美元

Summary: 更多：• 特斯拉否认使用摄像头监控车主 • 超 5 亿用户信息遭泄露，但 Facebook 并不打算通知相关用户

![](/data/attachment/album/202104/08/154342offzzglmzlauwvbf.jpg)

### Redis Labs 最新一轮融资估值突破 20 亿美元

![](/data/attachment/album/202104/08/154354nwzl7lilngygiipi.jpg)

这个流行的开源数据库背后的公司 Redis Labs 周三宣布完成 G 轮融资，获得 1.1 亿美元的融资，使其[估值超过 20 亿美元](https://www.zdnet.com/article/redis-labs-surpasses-2b-valuation-with-latest-funding-round/)。Redis Labs 成立于 2011 年，目前已净融资 3.47 亿美元。本轮融资后，较去年 8 月的融资后估值翻了一倍。Redis Labs 目前拥有超过 8000 家付费客户，其中包括 31% 的财富 100 强企业。

在基础软件领域，几个开源企业都显得非常有活力，其公司估值也非常可观。

### 特斯拉否认使用摄像头监控车主

![](/data/attachment/album/202104/08/154424dtw36l6rif0ndjtd.jpg)

针对近日流传特斯拉通过车内摄像头监控车主的讨论，特斯拉周三回应称，驾驶室内的摄像头目前在北美以外的市场并没有激活；即使在美国，车主也可以自由选择是否开启使用。特斯拉官方微博账号[表示](https://weibo.com/7401083165/K9KZQ6FmY)，特斯拉用户使用的车辆不存在通过车内摄像头侵犯用户个人隐私的行为。所有中国市场上的特斯拉用户车辆均未开启车内摄像头，也不涉及 FSD Beta 的测试。

用户被采集什么数据、数据存放在哪里和对数据的控制权，缺少足够的透明度，这是问题的症结所在。

### 超 5 亿用户信息遭泄露，但 Facebook 并不打算通知相关用户

![](/data/attachment/album/202104/08/154446gskbttqdodjcmzsy.jpg)

上周，据[报道](https://news.appypie.com/04/05/1658221638/04-05-1658221638-04-05-1658221638-stolen-personal-data-533-million-facebook-users-leaks-online/)，大量 Facebook 用户的电话号码及其他个人信息被公布于一个公共数据库中。随后 Facebook 承认，黑客通过同步联系人工具中的一个漏洞获取了 2019 年 9 月之前的用户数据，Facebook 已于在 2019 年修复了该漏洞。但 Facebook 表示，考虑到这不是用户可以自行修补的漏洞，而且这些用户的数据已经被公布于网络，因此[决定](https://www.reuters.com/article/us-facebook-data-leak/facebook-does-not-plan-to-notify-half-billion-users-affected-by-data-leak-idUSKBN2BU2ZY)不再专门通知相关用户。

现在的互联网简直就是筛子，所有在网络上活动的人的个人信息，都被泄露了一遍又一遍。虽然说出现这样的问题也是 Facebook 所不乐见的，但是这样的反应态度也确实让网民心寒。


使用这个开源工具来监控 Python 中的变量

>
> Watchpoints 是一个简单但功能强大的工具，可以帮助你在调试 Python 时监控变量。
>
>
>

![](/data/attachment/album/202104/08/231614imw8zqfncz5qwwow.jpg "Looking back with binoculars")

在调试代码时，你经常面临着要弄清楚一个变量何时发生变化。如果没有任何高级工具，那么可以选择使用打印语句在期望它们更改时输出变量。然而，这是一种非常低效的方法，因为变量可能在很多地方发生变化，并且不断地将其打印到终端上会产生很大的干扰，而将它们打印到日志文件中则变得很麻烦。

这是一个常见的问题，但现在有一个简单而强大的工具可以帮助你监控变量：[watchpoints](https://github.com/gaogaotiantian/watchpoints)。

[“监视点”的概念在 C 和 C++ 调试器中很常见](https://opensource.com/article/21/3/debug-code-gdb)，用于监控内存，但在 Python 中缺乏相应的工具。`watchpoints` 填补了这个空白。

### 安装

要使用它，你必须先用 `pip` 安装它：

```
$ python3 -m pip install watchpoints

```

### 在Python中使用 watchpoints

对于任何一个你想监控的变量，使用 `watch` 函数对其进行监控。

```
from watchpoints import watch

a = 0
watch(a)
a = 1

```

当变量发生变化时，它的值就会被打印到**标准输出**：

```
====== Watchpoints Triggered ======

Call Stack (most recent call last):
  <module> (my_script.py:5):
> a = 1
a:
0
->
1

```

信息包括：

* 变量被改变的行。
* 调用栈。
* 变量的先前值/当前值。

它不仅适用于变量本身，也适用于对象的变化：

```
from watchpoints import watch

a = []
watch(a)
a = {} # 触发
a["a"] = 2 # 触发

```

当变量 `a` 被重新分配时，回调会被触发，同时当分配给 `a` 的对象发生变化时也会被触发。

更有趣的是，监控不受作用域的限制。你可以在任何地方观察变量/对象，而且无论程序在执行什么函数，回调都会被触发。

```
from watchpoints import watch

def func(var):
    var["a"] = 1

a = {}
watch(a)
func(a)

```

例如，这段代码打印出：

```
====== Watchpoints Triggered ======

Call Stack (most recent call last):

  <module> (my_script.py:8):
> func(a)
  func (my_script.py:4):
> var["a"] = 1
a:
{}
->
{'a': 1}

```

`watch` 函数不仅可以监视一个变量，它也可以监视一个字典或列表的属性和元素。

```
from watchpoints import watch

class MyObj:
    def __init__(self):
        self.a = 0

obj = MyObj()
d = {"a": 0}
watch(obj.a, d["a"]) # 是的，你可以这样做
obj.a = 1 # 触发
d["a"] = 1 # 触发

```

这可以帮助你缩小到一些你感兴趣的特定对象。

如果你对输出格式不满意，你可以自定义它。只需定义你自己的回调函数：

```
watch(a, callback=my_callback)

# 或者全局设置

watch.config(callback=my_callback)

```

当触发时，你甚至可以使用 `pdb`：

```
watch.config(pdb=True)

```

这与 `breakpoint()` 的行为类似，会给你带来类似调试器的体验。

如果你不想在每个文件中都导入这个函数，你可以通过 `install` 函数使其成为全局：

```
watch.install() # 或 watch.install("func_name") ，然后以 func_name() 方式使用

```

我个人认为，`watchpoints` 最酷的地方就是使用直观。你对一些数据感兴趣吗？只要“观察”它，你就会知道你的变量何时发生变化。

### 尝试 watchpoints

我在 [GitHub](https://github.com/gaogaotiantian/watchpoints) 上开发维护了 `watchpoints`，并在 Apache 2.0 许可下发布了它。安装并使用它，当然也欢迎大家做出贡献。

---

via: <https://opensource.com/article/21/4/monitor-debug-python>

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


你可能是 Rust 程序员的五个迹象

Summary: 在我学习 Rust 的过程中，我注意到了 Rust 一族的一些常见行为。

“‘基金会’一词将不再与艾萨克·阿西莫夫关联在一起”，基地系列的梗哈哈

在我学习 Rust 的过程中，我注意到了 Rust 一族的一些常见行为。

>
> 在我学习 Rust 的过程中，我注意到了 Rust 一族的一些常见行为。
>
>
>

![](/data/attachment/album/202104/08/233233asbjasbfuiuosiha.jpg "name tag that says hello my name is open source")

我是最近才 [皈依 Rust](https://opensource.com/article/20/6/why-rust) 的，我大约在是 2020 年 4 月底开始学习的。但是，像许多皈依者一样，我还是一个热情的布道者。说实话，我也不是一个很好的 Rust 人，因为我的编码风格不是很好，我写的也不是特别符合 Rust 习惯。我猜想这一方面是因为我在写大量代码之前还没有没有真正学完 Rust（其中一些代码又困扰了我），另一方面是因为我并不是那么优秀的程序员。

但我喜欢 Rust，你也应该喜欢吧。它很友好，比 C 或 C++ 更友好；它为低级系统任务做好了准备，这比 Python 做的更好；而且结构良好，这要超过 Perl；而且，最重要的是，从设计层面开始，它就是完全开源的，这要比 Java 那些语言好得多。

尽管我缺乏专业知识，但我注意到了一些我认为是许多 Rust 爱好者和程序员的共同点。如果你对以下五个迹象点头（其中第一个迹象是由最近的一些令人兴奋的新闻引发的），那么你也可能是一个 Rust 程序员。

### 1、“基金会”一词会使你兴奋

对于 Rust 程序员来说，“基金会”一词将不再与<ruby> 艾萨克·阿西莫夫 <rt>  Isaac Asimov </rt></ruby>关联在一起，而是与新成立的 [Rust 基金会](https://foundation.rust-lang.org/) 关联。微软、华为、谷歌、AWS 和Mozilla 为该基金会提供了董事（大概也提供了大部分初始资金），该基金会将负责该语言的各个方面，“预示着 Rust 成为企业生产级技术的到来”，[根据临时执行董事](https://foundation.rust-lang.org/posts/2021-02-08-hello-world/) Ashley Williams 说。（顺便说一句，很高兴看到一位女士领导这样一项重大的行业计划。）

该基金会似乎致力于维护 Rust 的理念，并确保每个人都有参与的机会。在许多方面，Rust 都是开源项目的典型示例。并不是说它是完美的（无论是语言还是社区），而是因为似乎有足够的爱好者致力于维护高参与度、低门槛的社区方式，我认为这是许多开源项目的核心。我强烈欢迎此举，我认为这只会帮助促进 Rust 在未来数年和数月内的采用和成熟。

### 2、你会因为新闻源中提到 Rust 游戏而感到沮丧

还有一款和电脑有关的东西，也叫做“Rust”，它是一款“只限多玩家生存类的电子游戏”。它比 Rust 这个语言更新一些（2013 年宣布，2018 年发布），但我曾经在搜索 Rust 相关的内容时，犯了一个错误，用这个名字搜索了游戏。互联网络就是这样的，这意味着我的新闻源现在被这个另类的 Rust 野兽感染了，我现在会从它的影迷和公关人员那里随机得到一些更新消息。这是个低调的烦恼，但我很确定在 Rust（语言）社区中并不是就我一个人这样。我强烈建议，如果你确实想了解更多关于这个计算世界的后起之秀的信息，你可以使用一个提高隐私（我拒绝说 "保护隐私"）的 [开源浏览器](https://opensource.com/article/19/7/open-source-browsers) 来进行研究。

### 3、“不安全”这个词会让你感到恐惧。

Rust（语言，再次强调）在帮助你做**正确的事情**™方面做得非常好，当然，在内存安全方面，这是 C 和 C++ 内部的主要关注点（不是因为不可能做到，而是因为真的很难持续正确）。Dave Herman 在 2016 年写了一篇文章《[Safety is Rust's fireflower](https://www.thefeedbackloop.xyz/safety-is-rusts-fireflower/)》，讲述了为什么安全是 Rust 语言的一个积极属性。安全性（内存、类型安全）可能并不赏心悦目，但随着你写的 Rust 越多，你就会习惯并感激它，尤其是当你参与任何系统编程时，这也是 Rust 经常擅长的地方。

现在，Rust 并不能阻止你做**错误的事情**™，但它确实通过让你使用 `unsafe` 关键字，让你在希望超出安全边界的时候做出一个明智的决定。这不仅对你有好处，因为它（希望）会让你非常、非常仔细地思考你在任何使用它的代码块中放入了什么；它对任何阅读你的代码的人也有好处，这是一个触发词，它能让任何不太清醒的 Rust 人至少可以稍微打起精神，在椅子上坐直，然后想：“嗯，这里发生了什么？我需要特别注意。”如果幸运的话，读你代码的人也许能想到重写它的方法，使它利用到 Rust 的安全特性，或者至少减少提交和发布的不安全代码的数量。

### 4、你想知道为什么没有 `?;`、`{:?}` 、`::<>` 这样的表情符号

人们喜欢（或讨厌）涡轮鱼（`::<>`），但在 Rust 代码中你经常还会看到其他的语义结构。特别是 `{:?}` （用于字符串格式化）和 `?;`（`?` 是向调用栈传播错误的一种方式，`;` 则是行/块的结束符，所以你经常会看到它们在一起）。它们在 Rust 代码中很常见，你只需边走边学，边走边解析，而且它们也很有用，我有时会想，为什么它们没有被纳入到正常对话中，至少可以作为表情符号。可能还有其他的。你有什么建议？

### 5、Clippy 是你的朋友（而不是一个动画回形针）

微软的动画回形针 Clippy 可能是 Office 用户很快就觉得讨厌的“功能”，并成为许多 [模因](https://knowyourmeme.com/memes/clippy) 的起点。另一方面，`cargo clippy` 是那些 [很棒的 Cargo 命令](https://opensource.com/article/20/11/commands-rusts-cargo) 之一，应该成为每个 Rust 程序员工具箱的一部分。Clippy 是一个语言<ruby> 整洁器 <rt>  Linter </rt></ruby>，它可以帮助改进你的代码，使它更干净、更整洁、更易读、更惯用，让你与同事或其他人分享 Rust 代码时，不会感到尴尬。Cargo 可以说是让 “Clippy” 这个名字恢复了声誉，虽然我不会选择给我的孩子起这个名字，但现在每当我在网络上遇到这个词的时候，我不会再有一种不安的感觉。

---

这篇文章最初发表在 [Alice, Eve, and Bob] [9](https://aliceevebob.com/2021/02/09/5-signs-that-you-may-be-a-rust-programmer/)上，经作者许可转载。

---

via: <https://opensource.com/article/21/3/rust-programmer>

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


硬核观察 | 外媒呼吁美国不要打压中国智能电话

Summary: 更多：• AWS 可以帮你清理你糟糕的 Python，但是要收费 • 曾经的容器编排三巨头 Mesos 项目落幕

![](/data/attachment/album/202104/09/103817sx0phhouzvzv4igc.jpg)

### 外媒呼吁美国不要打压中国智能电话

![](/data/attachment/album/202104/09/103827l7occ07jhj7lz00h.jpg)

在美国，消费者购买的手机主要是 iPhone 和三星手机。而这些产品往往也是在中国生产的。但是由于美国的政策，中国的华为、OPPO、小米等手机在美国的市场受到了打压，而与此同时，这些中国手机在欧洲、中东和非洲拥有大量的用户群。

[外媒 ZDnet](https://www.zdnet.com/article/dear-biden-administration-allow-chinese-phone-brands-to-compete-fairly-in-the-us/) 对中国智能手机取得的技术优势表示了欣赏，比如 Oppo 在其 Find X3 Pro 屏幕上的显示屏不仅引入了 120Hz 刷新频率，而且还引入了精确的 10 位色彩表现，以及一个“微透镜”。在叹息美国消费者不能享受到这些新产品的同时，作者也认为华为和中兴的情况对多个方面都是不幸的，因为不能使用这些价格较低且极具竞争力的产品的不仅仅是消费者，还有那些试图在更多农村地区建设 5G 网络的运营商。

从全球化到对抗，受伤的不仅仅是中国人民。

### AWS 可以帮你清理糟糕的 Python 代码，但是要收费

![](/data/attachment/album/202104/09/103841hhs9spsvgp7vxh7n.jpg)

AWS 表示，其自动代码审查工具 CodeGuru 可以通过检测难以发现的缺陷来提高源代码质量，已经更新了[对 Python 编程语言的支持](https://aws.amazon.com/blogs/devops/raising-code-quality-for-python-applications-using-amazon-codeguru/)。该服务使用 AWS 的机器学习算法来寻找应用程序开发过程中的错误，目前支持 Python 和 Java。在这个版本中，CodeGuru 增加了代码可维护性和输入验证的检测器，同时改进了资源泄漏的检测器。CodeGuru 定价是根据仓库的大小按代码行数计算的。前 10 万行代码的费用是每月 10 美元。每增加 10 万行代码，每月费用为 30 美元。

所以，代码写的烂不要紧，只要花点钱就行了。以后估计连烂代码也没得写了，AI 就可以帮你写好了。

### 曾经的容器编排三巨头 Mesos 项目落幕

![](/data/attachment/album/202104/09/103911chrpf5nk2fzq5kaa.jpg)

4 月 7 日，Apache 基金会宣布开始[投票](https://news.ycombinator.com/item?id=26713082)，准备将 Mesos 项目移至 [Attic](http://attic.apache.org/) 下。Mesos 项目起源于 Google 的数据中心资源管理系统 Borg，曾经解决了 Twitter 面临的可伸缩性和性能上的挑战。但是在后来的容器编排系统之战中，Mesos 和 Docker Swarm 不敌谷歌的 Kubernetes，纷纷落败。

Mesos 落败的原因有很多，无论是技术、战略还是大公司的倾轧，总之，短短不到十年，曾经红极一时的 Mesos 落下了帷幕。


开源、开放、使能，看华为如何为中国基础软件带来新变化

Summary: 华为能够在计算领域和与之相关联的基础软件领域有如此成就与其设计的“三个开源、三个开放、三个使能”紧密相关。而开源、开放、使能的背后，是华为对于机制创新的理解

![](/data/attachment/album/202104/09/161629b9rrxzb41z3xr93x.jpg)

软件产业的发展非一朝一夕而来。在如今的信息时代，虽然中国的软件产业也取得了不菲的成就，但是从全球范围来看，尚有薄弱之处，这其中尤以基础设施软件为短板。开源软件和开源文化滥觞以来，一方面加速了中国的信息技术产业的发展，缩短了中国和世界领先水平的差距，但是另外一方面，商业的成功也让不少肯埋头于投入大、见效慢、技术难度高的基础设施层面的软件工程和软件理论方面的机构、企业和个人越来越少。

而最近发布的十四五规划，“开源”被首次列入国家规划纲要，数字经济、自主创新得到进一步强调。这对于中国计算产业来说，是机遇，也是挑战。

在挑战面前，才知道谁才是那个更靠谱的人，国内在自主创新方面取得卓越建树的企业并不算太多，大多也是人们耳熟能详的企业，而真正在基础软件领域深耕的企业，更是寥寥。 这其中，华为算是值得一书的一家。**这背后，华为每年招募大量的高端人才，则是投入基础设施软件的重兵；除了人才以外，华为丰富的行业经验也让华为更有可能成为做好基础软件创新的企业。**这些投入，也正是华为敢于投入精力在基础计算领域的底气。能在面临挑战前做好准备，就能在面对挑战之时，游刃有余。

不仅如此，华为为了让整个基础计算领域蓬勃发展，更是提出了「开源、开放、使能」的口号，来推进整个行业的进步。

### 开源、开放、使能

在刚刚结束的中国软件产业年会上，华为公司副总裁、计算产品线总裁邓泰华发表了“繁荣软件产业生态，推动数字经济高质量发展”的主题演讲，向广大的软件行业从业者，介绍了华为过去数年的在计算领域进行基础软件开发经验。

整个演讲，一言以概之，便是“**三个开源、三个开放、三个使能**”，这背后正是华为计算战略在软件产业的落地。

### 三个开源，打下软件基础

三个开源是指华为在操作系统、企业级数据库和 AI计算框架等三个领域开放的三款产品 —— openEuler、openGauss和 MindSpore。

虽然过去几十年来，基础设施软件从封闭的企业开发方式逐渐演变成了如今的开源、开放方式，但是，我们可以看到，一些重要的基础设施软件，比如 Windows、Oracle 数据库等依旧采用闭源专有的开发和商业模式。随着开源之风东渐，在基础设施领域采用开源方式成为了一种领先的生产力方式，成为了弯道超车的重要动力。长期深耕企业级软件领域的华为，前瞻性地选择了以开源的方式来重兵压上基础软件战线。以开源的方式和企业庞大的资金和人力，推进社区开发者和企业参与到基础软件的研发，打造从底到顶的全产业链软件生态。

以操作系统 openEuler 为例，自2019年3月31日 openEuler 开源以来，社区已有 60 多家企业、机构和组织，3000 多位贡献者，成立了 80 多个 SIG，已有 8 家合作伙伴推出基于 openEuler 的商业发行版，在金融、政府、运营商和电力等各行业得到了广泛商用。在去年，openEuler 社区理事会正式成立、技术委员会升级；今年，又新成立了用户委员会和品牌宣传委员会，社区治理逐步完善，走向“共建、共享、共治”。

借助于开源，openEuler 获得了骄人的成绩。而开源的力量，也同样表现在了开源数据库 openGauss 以及全场景AI计算框架MindSpore 上。目前，已有6家 openGauss 伙伴企业推出基于 openGauss 的商业发行版，超过 16 家企业和机构加入 openGauss 社区，共同打造“高性能、高可靠、高安全”的数据库内核版本。MindSpore 则已经拥有超过 17 万的开发者和超过 22 万的下载量。

这些成绩，不仅仅是软件本身的优秀，更是开源战略所带来的新气象。这些数据，让人很难想象是一年来取得的成就，不过，如果考虑到华为大量的资源、资金、技术、研发等投入，也就不足为奇了。

### 三个开放，加速软件研发

除了构建一个好的社区，华为还通过开放通用计算鲲鹏应用使能套件 BoostKit、人工智能昇腾应用使能套件 MindX，以及面向开发者开放支持全研发作业流程的完整工具链来实现让开发者可以以更低的成本来完成更高效的软件开发。

鲲鹏应用使能套件 BoostKit 中集成的大量开源组件和加速库，将过去需要通过不断积累才能获得的宝贵的架构经验和最佳实践，得以提供给开发者，帮助开发者用更简单的方式从传统架构迁移至鲲鹏架构。

而昇腾应用使能套件 MindX 则更是提供了大量的人工智能场景所需的模型、行业 SDK 等，其中不仅自带了质检、目标分类、目标检测等 20 多种行业场景，对于开发者来说，可以通过简单的调用 SDK ，实现更加丰富能力的调用。

这样，过去实现成本十分高的研发流程，可以在这两个套件之上更加简单快捷的完成开发，实属难得。而且，鲲鹏和昇腾全栈的开放，也让开发者们可以针对架构进行优化，从而让应用获得一个更好的性能，为后续的体验优化提供燃料。

### 三个使能，推进产业变革

计算产品中的基础设施类软件从来不是一个简单的问题，往往包含着上游、下游和周边的生态，想要推动一个基础软件的普及，需要长期付出大量的时间和精力来执行相关的工作。而华为在这件事情中，也投入了大量的时间、精力、资金和人力成本，使能上下游，构建整个产品的生态。

一方面，华为积极参与业界主流开源社区，在各个主流开源社区中已经实现 80% 的场景原生支持鲲鹏架构，这使得软件开发企业开箱即用即可完成软件的开发。避免重复造轮子，或开发的功能对特定的架构有需求，有效降低了企业参与的成本。

另一方面，华为还积极地使能软件合作伙伴，为合作伙伴提供了工具、社区、区域资源等多方面支持。不仅是提供软件产品和研发平台，更是帮助合作伙伴取得商业层面的成功。

此外，华为还和教育部联合启动了 “智能基座” 产教融合协同育人基地，目前覆盖超过 70 所高校，并将在未来的五年里，逐步覆盖超过 2700 所高校、高职、高专院校。华为通过在人才培养方面的大量投入来推动产业人才进步和发展，也为中国软件产业的可持续发展打了一剂强心剂。

过去的中国软件产业企业不愿做、不敢做、不想做基础软件，而华为所提供的这些资源、资料、人才以及商业机会，让中国软件产业企业开始试着走上基础软件研发的这条路。也正是华为所付出的这些资源，可以让产业界的众多企业参与到基础软件的研发过程中，共同研发、共同奉献，最终促进中国基础软件领域的蓬勃发展。

不仅如此，通过机制创新的方式，华为还为后续的企业探寻出了一条可行的基础软件发展的道路，让广大生态内的企业可以看到，基础软件并非不能做。过去的企业内部闭源开发已经跟不上时代的发展，成本高昂，而以开源的方式来构建基础软件生态，可以让企业以更低的成本，来研发出好用、能用、易用的基础软件。

无论最终华为的基础软件能取得什么成就，它所走出的这条机制创新的路，都将造福后续的软件研发企业。目前，鲲鹏、昇腾开发者已经超过 50 万，软件合作伙伴超过 2000 家，4500 个行业主流应用完成解决方案认证。这些数字每一天、每一周都在快速增加。

### 众智合力，走过“无人区”

鲲鹏、昇腾是全栈开放形态，特别是在当前世界大变局的形式下，华为在走一条走“无人”走过的路。从通用计算、AI 计算这两个领域以开放、开源的方式同时发力，华为更是一位领先探索者。

华为通过鲲鹏众智计划和昇腾众智计划，让社区和企业的开发者参与到整个软件生态的进步当中。通过这两个众智计划面向企业、高校、科研院所发起邀请，以项目合作的方式基于鲲鹏、昇腾基础软硬件平台开发加速库、工具插件、算子、网络模型及行业参考设计等，共同完成项目。一方面，可以让高校的学子得到锻炼，另一方面，也建立起了高校、企业、研究所之间的良好合作关系和合作的可能，促进产学研融合共进。

其中，昇腾众智活动启动以来，已有浙江大学、上海交通大学、西安交通大学、中国科学院等超过 40 所高校和科研机构参与。这些高校的参与，为整个行业的发展提供了新血液和新动力，让行业得以进步和升华。而对于每一个参与在众智计划中的个人而言，能够以一个不那么痛苦的方式参与到中国的计算产业变更之中，毫无疑问是一种人生使命的升华。

![](/data/attachment/album/202104/09/160649z0pdtokx9m39qh7h.jpg)

无论是开源，还是开放，抑或是使能，看起来是不同的方向，但回归到最底层的问题的时候，这三者都解决了一个问题 —— 华为要积极通过和开源社区的合作和开发者的合作、和全球的软件行业从业者合作，共同打造一个良好的企业生态。而这些，正印证了邓泰华在中国软件产业年会上说的那句 ——

>
> **最强的智是众智，最大的力是合力。**
>
>
>


Plausible：注重隐私的 Google Analytics 替代方案

![](/data/attachment/album/202104/10/110720jc8hckngaqr6wch1.jpg)

[Plausible](https://plausible.io/)是一款简单的、对隐私友好的分析工具。它可以帮助你分析独立访客数量、页面浏览量、跳出率和访问时间。

如果你有一个网站，你可能会理解这些术语。作为一个网站所有者，它可以帮助你了解你的网站是否随着时间的推移获得更多的访问者，流量来自哪里，如果你对这些事情有一定的了解，你可以努力改进你的网站，以获得更多的访问量。

说到网站分析，统治这个领域的一个服务就是谷歌的免费工具 Google Analytics。就像 Google 是事实上的搜索引擎一样，Google Analytics 是事实上的分析工具。但你不必再忍受它，尤其是当你无法信任大科技公司使用你和你的网站访问者的数据的时候。

Plausible 让你摆脱 Google Analytics 的束缚，我将在本文中讨论这个开源项目。

请注意，如果你从来没有管理过网站或对分析感兴趣，文章中的一些技术术语可能对你来说是陌生的。

### Plausible 是隐私友好的网站分析工具

Plausible 使用的分析脚本是非常轻量级的，大小不到 1KB。

其重点在于保护隐私，因此你可以在不影响访客隐私的情况下获得有价值且可操作的统计数据。Plausible 是为数不多的不需要 cookie 横幅或 GDP 同意的分析工具之一，因为它在隐私方面已经符合 [GDPR 标准](https://gdpr.eu/compliance/)。这是超级酷的。

在功能上，它没有 Google Analytics 那样的粒度和细节。Plausible 靠的是简单。它显示的是你过去 30 天的流量统计图。你也可以切换到实时视图。

![](/data/attachment/album/202104/10/110728vgoqoovbogomvl51.png)

你还可以看到你的流量来自哪里，以及你网站上的哪些页面访问量最大。来源也可以显示 UTM 活动。

![](/data/attachment/album/202104/10/110728zye1t6l134azkz56.png)

你还可以选择启用 GeoIP 来了解网站访问者的地理位置。你还可以检查有多少访问者使用桌面或移动设备访问你的网站。还有一个操作系统的选项，正如你所看到的，[Linux Handbook](https://linuxhandbook.com/) 有 48% 的访问者来自 Windows 设备。很奇怪，对吧？

![](/data/attachment/album/202104/10/110729wy99eenxrunbb3bp.png)

显然，提供的数据与 Google Analytics 的数据相差甚远，但这是有意为之。Plausible 意图是为你提供简单的模式。

### 使用 Plausible：选择付费托管或在你的服务器上自行托管

使用 Plausible 有两种方式：注册他们的官方托管服务。你必须为这项服务付费，这最终会帮助 Plausible 项目的发展。它们有 30 天的试用期，甚至不需要你这边提供任何支付信息。

定价从每月 1 万页浏览量 6 美元开始。价格会随着页面浏览量的增加而增加。你可以在 Plausible 网站上计算价格。

* [Plausible 价格](https://plausible.io/#pricing)

你可以试用 30 天，看看你是否愿意向 Plausible 开发者支付服务费用，并拥有你的数据。

如果你觉得定价不合理，你可以利用 Plausible 是开源的优势，自己部署。如果你有兴趣，请阅读我们的 [使用 Docker 自助托管 Plausible 实例的深度指南](https://linuxhandbook.com/plausible-deployment-guide/)。

我们自行托管 Plausible。我们的 Plausible 实例添加了我们的三个网站。

![Plausble dashboard for It’s FOSS websites](/data/attachment/album/202104/10/110729k6kxhvuxuihvrs6y.png)

如果你维护一个开源项目的网站，并且想使用 Plausible，你可以通过我们的 [High on Cloud 项目](https://highoncloud.com/) 联系我们。通过 High on Cloud，我们帮助小企业在其服务器上托管和使用开源软件。

### 总结

如果你不是超级痴迷于数据，只是想快速了解网站的表现，Plausible 是一个不错的选择。我喜欢它，因为它是轻量级的，而且遵守隐私。这也是我在 Linux Handbook，我们 [教授 Linux 服务器相关的门户网站](https://linuxhandbook.com/about/#ethical-web-portal) 上使用它的主要原因。

总的来说，我对 Plausible 相当满意，并向其他网站所有者推荐它。

你也经营或管理一个网站吗？你是用什么工具来做分析，还是根本不关心这个？

---

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

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


选择 Linux 的五大好处

Arch yes !

ubuntu yes

>
> Linux 的一大优点是多样化选择，选择激发了用户之间自由分享想法和解决方案。Linux 将如何激发你为这个社区做出贡献呢？
>
>
>

![](/data/attachment/album/202104/10/131305ei6yyuyujui9fkkr.jpg "Hand putting a Linux file folder into a drawer")

到了 2021 年，人们比以往任何时候都更有理由喜欢 Linux。在本系列中，我将分享 21 个使用 Linux 的理由。本文讨论选择 Linux 带来的好处。

*选择* 是 Linux 中被误解最深的特性之一。这种误解从可被选择的 Linux 发行版数量就开始了。[Distrowatch.org](http://Distrowatch.org) 报告了数百种可用的和活跃的 Linux 发行版。当然，在这些发行版当中，许多都是业余爱好项目或者针对某些晦涩需求的特别版。因为是开源的，所以实际上，任何人都可以“重新设计”或“重新混搭”现有的 Linux 发行版，赋予一个新名称，提供一个新的默认墙纸，然后称其为自己的作品。尽管这些修改似乎微不足道，但我认为这显示了 Linux 的一些特别之处。

### 灵感

Linux 似乎一直在启迪着人们，从了解它的那一刻起，到创造出自己的版本。

有数十家公司花费数百万美元来从他们自己的产品中获取灵感。商业技术广告试着强硬地说服你，只要你购买某种产品，你就会与所关心的人建立更多的联系，更具创造力、更加充满活力。这些广告用 4k 视频拍摄，焦点柔和，并在欢快振奋的音乐节奏下播放，试图说服人们不仅购买而且还要支持和宣传该公司的产品。

当然，Linux 基本没有营销预算，因为 Linux 是个形形色色的大集合，*没有固定实体*。然而，当人们发现它的存在时候，他们似乎就被启发着去构建属于自己的版本。

灵感的数量很难量化，但是它显然很有价值，要不然那些公司不会花钱来尝试创造灵感。

### 革新

灵感，无论给它标价有多难，它都因它的生产创造而有价值。许多 Linux 用户受启发来为各种奇怪问题定制解决方案。我们解决的大多数问题，对于其他大部分人而言，似乎微不足道：也许你使用 [Seeed 微控制器](https://opensource.com/article/19/12/seeeduino-nano-review) 来监控番茄植株土壤的水分含量；或者你使用脚本来搜索 Python 软件包的索引，因为你总是会忘记每天导入的库的名称；或者设置了自动清理下载文件夹，因为将文件图标拖进回收站这个活儿干太多了。不管你在使用 Linux 的过程中，为自己解决过什么问题，都是这个平台包含的特性之一，你被这个正在运行中的开放的技术所启发，使其更好地服务于你自己。

### 开放策略

诚然，不论是灵感，还是创新，都不能算 Linux 独有的属性。其他平台也确实让我们激发灵感，我们也以或大或小的方式进行创新。运算能力已在很大程度上拉平了操作系统的竞争领域，你在一个操作系统上可以完成的任何事，在另一个操作系统上或许都能找到对应的方法来完成。

但是，许多用户发现，Linux 操作系统保留了坚定的开放策略，当你尝试可能无人想到过的尝试时，Linux 不会阻挡你。这种情况不会也不可能发生在专有的操作系统上，因为无法进入系统层级的某些区域，因为它们本身就是被设计为不开放源码的。有各种独断的封锁。当你完全按照操作系统的期望进行操作时，你不会碰到那些看不见的墙，但是当你心里想着要做一些只对你有意义的事情的时候，你的系统环境可能变得无从适应。

### 小小的选择，大大的意义

并非所有创新都是大的或重要的，但总的来说，它们带来的变化并不小。如今，数百万用户的那些疯狂想法在 Linux 的各个部分中愈发显现。它们存在于 KDE 或 GNOME 桌面的工作方式中，存在于 [31 种不同的文本编辑器](https://opensource.com/article/21/1/text-editor-roundup) 中 —— 每一种都有人喜爱，存在于不计其数的浏览器插件和多媒体应用程序中，存在于文件系统和扩展属性中，以及数以百万行计的 Linux 内核代码中。而且，如果上述功能中的哪怕仅其中一项，能让你每天额外节省下一小时时间，陪家人、朋友或用在自己的业余爱好上，那么按照定义，套用一句老话就是，“改变生活”。

### 在社区中交流

开源的重要组成部分之一是共享工作。共享代码是开源软件中显而易见的、普遍流行的事务，但我认为，分享，可不仅仅是在 Gitlab 做一次提交那么简单。当人们彼此分享着自己的奇思妙想，除了获得有用的代码贡献作为回报外，再无其他动机，我们都认为这是一种馈赠。这与你花钱从某公司购买软件时的感觉非常不同，甚至与得到某公司对外分享他们自己生产的开源代码时的感觉也有很大不同。开源的实质是，由全人类创造，服务于全人类。当知识和灵感可以被自由地分享时，人与人之间就建立了连接，这是市场营销活动无法复制的东西，我认为我们都认同这一点。

### 选择

Linux 并不是唯一拥有很多选择的平台。无论使用哪种操作系统，你都可以找到针对同一问题的多种解决方案，尤其是在深入研究开源软件的时候。但是，Linux 明显的选择水准指示了推动 Linux 前进的因素：诚邀协作。在 Linux 上，有些创造会很快消失，有些会在你家用电脑中保留数年 —— 即便只是执行一些不起眼的自动化任务，然而有一些则非常成功，以至于被其他系统平台借鉴并变得司空见惯。没关系，无论你在 Linux 上创作出什么，都请毫不犹豫地把它加入千奇百怪的选择之中，你永远都不知道它可能会激发到谁的灵感。

---

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

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

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


硬核观察 | 近三分之一的英国人使用宠物或家庭成员的名字作为密码

Summary: 更多：• DuckDuckGo 发布扩展程序阻止谷歌 FLoC 跟踪 • Linux 5.13 考虑为每次系统调用引入随机化的内核堆栈偏移量

![](/data/attachment/album/202104/10/152430zyp5f0toy0fj0jvj.jpg)

### 近三分之一的英国人使用宠物或家庭成员的名字作为密码

![](/data/attachment/album/202104/10/152442c1zgu6z76q170sk3.jpg)

英国国家网络安全中心对一千多名英国成年人的调查显示，15% 的人使用宠物的名字，而 14% 的人使用家庭成员的名字作为密码。而 “123456” 和 “password” 仍然各占英国人使用的登录短语的 6%。英国国家网络安全中心说，“我们可能是一个动物爱好者的国家，但使用你的宠物的名字作为密码，可能会使你很容易成为冷酷的网络罪犯的目标。”他们建议使用由三个随机词组成的密码。

当然，我觉得最好的实践还是使用密码管理器。

### DuckDuckGo 发布扩展程序阻止谷歌 FLoC 跟踪

![](/data/attachment/album/202104/10/152508uliotoqnqorlw6tt.jpg)

隐私搜索引擎 DuckDuckGo 刚刚更新了面向 Chrome 浏览器用户的 Privacy Essentials 扩展，以阻止谷歌新推出的基于 FLoC 的跟踪方法。FLoC 的全称为“<ruby> 联合队列学习 <rt>  Federated Learning of Cohorts </rt></ruby>”，但这套旨在取代第三方 Cookie 的追踪系统还是引发了极大的争议。DuckDuckGo 称，“这种不经过任何人同意就强加上去的追踪机制根本不利于隐私，因为 FLoC 会在默认情况下开展行为跟踪。”不过，该扩展目前仍在等待谷歌扩展商店的审批才能被用户下载。

本质上，谷歌就是一个广告商，所以，这个会“伤害”谷歌的 FLoC 的扩展能不能得到通过，还尚未可知。

### Linux 5.13 考虑为每次系统调用引入随机化的内核堆栈偏移量

![](/data/attachment/album/202104/10/152526diw894t4tq8zaqi4.jpg)

该功能可以增强内核安全性、以阻止依赖内核堆栈确定性的漏洞利用。该功能已经经历了十轮的代码审查，预计会在 Linux 5.13 中发布。若这项功能顺利完成交付，那未来针对 Linux 内核堆栈的攻击将变得更加困难。不过在默认情况下，这项特性仍处于关闭的状态。因为即便在 x86\_64 平台上，该选项仍会造成约 1% 的系统资源开销。

相对于在安全方面更激进的 FreeBSD 内核，以及一些专门针对 Linux 内核安全强化的项目，Linux 内核在安全方面的举措更加保守。


查看 Git 提交中发生了什么变化

Summary: Git 提供了几种方式可以帮你快速查看提交中哪些文件被改变。

Git 提供了几种方式可以帮你快速查看提交中哪些文件被改变。

>
> Git 提供了几种方式可以帮你快速查看提交中哪些文件被改变。
>
>
>

![](/data/attachment/album/202104/11/093421yuololouo66woulu.jpg "Code going into a computer.")

如果你每天使用 Git，应该会提交不少改动。如果你每天和其他人在一个项目中使用 Git，假设 *每个人* 每天的提交都是安全的，你会意识到 Git 日志会变得多么混乱，似乎永恒地滚动着变化，却没有任何迹象表明修改了什么。

那么，你该怎样查看指定提交中文件发生哪些变化？这比你想的容易。

### 查看提交中文件发生的变化

要想知道指定提交中哪些文件发生变化，可以使用 `git log --raw` 命令。这是发现一个提交影响了哪些文件的最快速、最方便的方法。`git log` 命令一般都没有被充分利用，主要是因为它有太多的格式化选项，许多用户在面对很多选择以及在一些情况下不明所以的文档时，会望而却步。

然而，Git 的日志机制非常灵活，`--raw` 选项提供了当前分支中的提交日志，以及更改的文件列表。

以下是标准的 `git log` 输出：

```
$ git log
commit fbbbe083aed75b24f2c77b1825ecab10def0953c (HEAD -> dev, origin/dev)
Author: tux <tux@example.com>
Date:   Sun Nov 5 21:40:37 2020 +1300

    exit immediately from failed download

commit 094f9948cd995acfc331a6965032ea0d38e01f03 (origin/master, master)
Author: Tux <tux@example.com>
Date:   Fri Aug 5 02:05:19 2020 +1200

    export makeopts from etc/example.conf

commit 76b7b46dc53ec13316abb49cc7b37914215acd47
Author: Tux <tux@example.com>
Date:   Sun Jul 31 21:45:24 2020 +1200

    fix typo in help message

```

即使作者在提交消息中指定了哪些文件发生变化，日志也相当简洁。

以下是 `git log --raw` 输出：

```
$ git log --raw
commit fbbbe083aed75b24f2c77b1825ecab10def0953c (HEAD -> dev, origin/dev)
Author: tux <tux@example.com>
Date:   Sun Nov 5 21:40:37 2020 +1300

    exit immediately from failed download

:100755 100755 cbcf1f3 4cac92f M        src/example.lua

commit 094f9948cd995acfc331a6965032ea0d38e01f03 (origin/master, master)
Author: Tux <tux@example.com>
Date:   Fri Aug 5 02:05:19 2020 +1200

    export makeopts from etc/example.conf

:100755 100755 4c815c0 cbcf1f3 M     src/example.lua
:100755 100755 71653e1 8f5d5a6 M     src/example.spec
:100644 100644 9d21a6f e33caba R100  etc/example.conf  etc/example.conf-default

commit 76b7b46dc53ec13316abb49cc7b37914215acd47
Author: Tux <tux@example.com>
Date:   Sun Jul 31 21:45:24 2020 +1200

    fix typo in help message

:100755 100755 e253aaf 4c815c0 M        src/example.lua

```

这会准确告诉你哪个文件被添加到提交中，哪些文件发生改变（`A` 是添加，`M` 是修改，`R` 是重命名，`D` 是删除）。

### Git whatchanged

`git whatchanged` 命令是一个遗留命令，它的前身是日志功能。文档说用户不应该用该命令替代 `git log --raw`，并且暗示它实质上已经被废弃了。不过，我还是觉得它是一个很有用的捷径，可以得到同样的输出结果（尽管合并提交的内容不包括在内），如果它被删除的话，我打算为它创建一个别名。如果你只想查看已更改的文件，不想在日志中看到合并提交，可以尝试 `git whatchanged` 作为简单的助记符。

### 查看变化

你不仅可以看到哪些文件发生更改，还可以使用 `git log` 显示文件中发生了哪些变化。你的 Git 日志可以生成一个内联差异，用 `--patch` 选项可以逐行显示每个文件的所有更改：

```
commit 62a2daf8411eccbec0af69e4736a0fcf0a469ab1 (HEAD -> master)
Author: Tux <Tux@example.com>
Date:   Wed Mar 10 06:46:58 2021 +1300

    commit

diff --git a/hello.txt b/hello.txt
index 65a56c3..36a0a7d 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1,2 +1,2 @@
 Hello
-world
+opensource.com

```

在这个例子中，“world” 这行字从 `hello.txt` 中删掉，“[opensource.com](http://opensource.com)” 这行字则添加进去。

如果你需要在其他地方手动进行相同的修改，这些<ruby> 补丁 <rt>  patch </rt></ruby>可以与常见的 Unix 命令一起使用，例如 [diff 与 patch](https://opensource.com/article/18/8/diffs-patches)。补丁也是一个好方法，可以总结指定提交中引入新信息的重要部分内容。当你在冲刺阶段引入一个 bug 时，你会发现这里的内容就是非常有价值的概述。为了更快地找到错误的原因，你可以忽略文件中没有更改的部分，只检查新代码。

### 用简单命令得到复杂的结果

你不必理解引用、分支和提交哈希，就可以查看提交中更改了哪些文件。你的 Git 日志旨在向你报告 Git 的活动，如果你想以特定方式格式化它或者提取特定的信息，通常需要费力地浏览许多文档来组合出正确的命令。幸运的是，关于 Git 历史记录最常用的请求之一只需要一两个选项：`--raw` 与 `--patch`。如果你不记得 `--raw`，就想想“Git，什么改变了？”，然后输入 `git whatchanged`。

---

via: <https://opensource.com/article/21/4/git-whatchanged>

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

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


GNOME OS：一个并不是适合所有人的 Linux 发行版

Summary: 每当 GNOME 的一个重要版本到来时，总是很想尽快试用它。

每当 GNOME 的一个重要版本到来时，总是很想尽快试用它。

![](/data/attachment/album/202104/11/103205t34lcaa3t0a3xjjw.jpg)

每当 GNOME 的一个重要版本到来时，总是很想尽快试用它。但是，要想第一时间进行测试，主要还是得依靠 [Fedora Rawhide](https://fedoraproject.org/wiki/Releases/Rawhide) 开发分支。

然而，开发分支并不总是让人放心的，所以，用来尝试最新的 GNOME 并不是最方便的解决方案。这里，我所说的测试，并不仅仅是指用户的测试，同时也能够用于开发者对设计变更进行测试。

所以，最近来了个大救星 GNOME OS，让测试的过程变得轻松起来。但是，它到底是什么，怎么安装呢？让我们一起来看看吧。

### 什么是 GNOME OS？

GNOME OS 并不是一个独立完整的 Linux 发行版。事实上，它根本不基于任何东西。它是一个不完整的参考系统，只是为了让 GNOME 桌面工作。它仅仅是一个可启动的虚拟机镜像，在 GNOME 进入任何发行版的仓库之前，为调试和测试功能而量身定做的。

在 GNOME 的博客中，有一篇提到了它：

>
> GNOME OS 旨在通过提供一个用于开发、设计和用户测试的工作系统，来更好地促进 GNOME 的开发。
>
>
>

如果你好奇的话，你可以看看 GNOME 星球上的一篇 [博客文章](https://blogs.gnome.org/alatiera/2020/10/07/what-is-gnome-os/) 来了解关于 GNOME OS 的更多信息。

### 如果它不是一个成熟的 Linux 发行版，那么它是用来干什么的？

![](/data/attachment/album/202104/11/103303yix2s7i67y66rerr.png)

值得注意的是，每一次新的提交都可以创建一个新的 GNOME OS 镜像，所以它应该会使测试过程变得高效，并帮助你在开发周期的早期测试并发现问题。

不要忘了，设计者不再需要自己构建软件来测试 GNOME Shell 或任何其他核心模块。这为他们节省了时间和整个 GNOME 开发周期。

当然，不仅限于开发者和技术测试人员，它还可以让记者们拿到最新的和最棒的东西，来报道 GNOME 下一个版本或它是如何成型的。

媒体和 GNOME 团队也得到了一个很好的机会，借助于 GNOME OS，他们可以准备视频、图片两种形式的视觉资料来宣传此次发布。

### 如何安装 GNOME OS？

要轻松安装 GNOME OS，你需要先安装 GNOME Boxes 应用程序。

#### 安装 GNOME Boxes

Boxes 是一款简单的虚拟化软件，它不提供任何高级选项，但可以让你轻松安装操作系统镜像来快速测试。它是专门针对桌面终端用户的，所以使用起来也很方便。

要在任何 Linux 发行版上安装它，你可以利用 [Flathub](https://flathub.org/apps/details/org.gnome.Boxes) 的 [Flatpak](https://itsfoss.com/what-is-flatpak/) 包。如果你不知道 Flatpak，你可能需要阅读我们的《[在 Linux 中安装和使用 Flatpak](https://itsfoss.com/flatpak-guide/)》指南。

你也可以在任何基于 Ubuntu 的发行版上直接在终端上输入以下内容进行安装：

```
sudo apt install gnome-boxes

```

一旦你安装了 Boxes，从这里安装 GNOME OS 就相当容易了。

#### 安装 GNOME OS

安装好 Boxes 后，你需要启动程序。接下来，点击窗口左上角的 “+” 标志，然后点击 “操作系统下载”，如下图所示。

![](/data/attachment/album/202104/11/103304jqqpyhlpc5y0wylb.jpg)

这个选项可以让你直接下载镜像文件，然后就可以继续安装它。

你所需要做的就是搜索 “GNOME”，然后你应该会找到可用的每夜构建版。这可以确保你正在尝试最新和最优秀的 GNOME 开发版本。

另外，你也可以前往 [GNOME OS 每夜构建网站](https://os.gnome.org/) 下载系统镜像，然后在 Boxes 应用中选择 “运行系统镜像文件” 选择该 ISO，如上图截图所示，继续安装。

![](/data/attachment/album/202104/11/103304jbfqbgwggbzg44gq.jpg)

考虑到你没有单独下载镜像。当你点击后，应该会开始下载，并且会出现一个进度条。

![](/data/attachment/album/202104/11/103304bfupyxuppxhyfa7p.jpg)

完成后，如果需要，它会要求你自定义配置，让你创建虚拟机，如下图所示。

![](/data/attachment/album/202104/11/103305ktqumtrjqj5uel5f.png)

你可以根据你可用的系统资源来定制资源分配，但应该可以使用默认设置。

点击 “创建”，就会直接开始 GNOME OS 的安装。

![](/data/attachment/album/202104/11/103305hx0n0n8274muv2v6.jpg)

选择“使用现有的版本”，然后继续。接下来，你必须选择磁盘（保持原样），然后同意擦除你所有的文件和应用程序（它不会删除本地计算机上的任何东西）。

![](/data/attachment/album/202104/11/103305h2lnj5rg5dckyarq.jpg)

现在，它将简单地重新格式化并安装它。然后就完成了。它会提示你重启，重启后，你会发现 GNOME OS 已经安装好了。

它会像其他 Linux 发行版一样简单地启动，并要求你设置一些东西，包括用户名和密码。然后，你就可以开始探索了。

如果你想知道它的样子，它基本上就是最新的 GNOME 桌面环境。在 GNOME 40 正式发布之前，我用 GNOME OS 做了一个 GNOME 40 的概述视频。

### 结束语

GNOME OS 绝对是对开发者、设计师和媒体有用的东西。它可以让你轻松地测试最新的 GNOME 开发版本，而无需投入大量的时间。

我可以很快地测试 [GNOME 40](https://news.itsfoss.com/gnome-40-release/)，就是因为这个。当然，你要记住，这并不是一个可以在物理设备上安装的完整功能的操作系统。他们有计划让它可以在物理机器上运行，但就目前而言，它只是为虚拟机量身定做的，尤其是使用 GNOME Boxes。

GNOME Boxes 并没有提供任何高级选项，所以设置和使用它变得相当容易。如果体验太慢的话，你可能要调整一下资源，但在我的情况下，总体来说是一个不错的体验。

你试过 GNOME OS 了吗？欢迎在下面的评论中告诉我你的想法。

---

via: <https://itsfoss.com/gnome-os/>

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


硬核观察 | 苹果高管表示，iMessage 是人们不给孩子用安卓手机的原因

Summary: 更多：• 微软开源了一个红蓝队网络攻防软件，以培养 AI 来进行网络防御 • arm64 成为 FreeBSD 的一级支持架构

![](/data/attachment/album/202104/11/151916szt7tq6y7knfthrq.jpg)

### 苹果高管表示，iMessage 是人们不给孩子用安卓手机的原因

![](/data/attachment/album/202104/11/151925cu4glz0nwtuzu4e5.jpg)

在 Epic Games 和苹果之间的法律战相关的[法庭文件](https://www.courtlistener.com/recap/gov.uscourts.cand.364265/gov.uscourts.cand.364265.407.0.pdf)中，披露了苹果认为 iMessage 只存在于 iOS、iPadOS 和 macOS 平台上对于苹果有多重要。苹果软件工程高级副总裁、负责 iOS 系统的高管表示，“iMessage 移植到安卓上就会消除 iPhone 家庭给孩子使用安卓手机的障碍。”而负责 App Store 的苹果高管称，“将 iMessage 转移到安卓系统对我们的伤害大于帮助。”

可能在国外他们会依赖于 iMessage 吧，在国内，有多少人用这个呢？

### 微软开源了一个红蓝队网络攻防软件，以培养 AI 来进行网络防御

![](/data/attachment/album/202104/11/151949hcco4247b9ymk999.jpg)

微软[开源](https://github.com/microsoft/CyberBattleSim)了一款软件 CyberBattleSim，可以让机器学习驱动的网络入侵者与虚拟网络内的自动防御者展开对决。该软件设置了装满漏洞和其他弱点的伪装网络，AI 攻击者会学习如何找到并利用漏洞在网络中传播，而 AI 防御者则试图检测恶意活动并缓解攻击。在过去的一年里，微软一直在运行该系统来模拟攻击。

这是一个很有意思的尝试，以后的网络攻击会越来越由 AI 驱动而不是由经验丰富的人类驱动，相应的，防御也会由 AI 接手，我们离科幻小说里面的场景越来越近了。

### arm64 成为 FreeBSD 的一级支持架构

![](/data/attachment/album/202104/11/152005zo8zvhdp48m7qbwo.jpg)

FreeBSD 项目[宣布](https://lists.freebsd.org/pipermail/freebsd-announce/2021-April/002030.html)，从 FreeBSD 13 起 arm64 升级为一级支持架构，这意味着在 FreeBSD 13 的整个生命期内项目都将为 arm64 架构提供发布镜像、二进制包、安全和勘误更新。FreeBSD 项目最早是在 2014 年启动对 FreeBSD/arm64 的开发，2016 年发布的 FreeBSD 11 中正式引入对 arm64 架构的支持。

ARM 芯片引来前所未有的高光时刻，BSD、Linux 纷纷对它抛出橄榄枝。


使用 CPUFetch 在 Linux 终端中漂亮地显示 CPU 细节

Summary: 处理器制造商的 ASCII 艺术使它看起来很酷。

处理器制造商的 ASCII 艺术使它看起来很酷。

![](/data/attachment/album/202104/12/093818iie270mi8am6ttk7.jpg)

Linux 上有 [检查 CPU 信息的方法](https://linuxhandbook.com/check-cpu-info-linux/)。最常见的可能是 `lscpu` 命令，它可以提供大量的系统上所有 CPU 核心的信息。

![lscpu command output](/data/attachment/album/202104/12/093846z7vxfz8dcv1jlssx.png)

你可以在那里找到 CPU 信息，而无需安装任何额外的包。当然这是可行的。然而，我最近偶然发现了一个新的工具，它以一种漂亮的方式显示 Linux 中的 CPU 细节。

处理器制造商的 ASCII 艺术使它看起来很酷。

![](/data/attachment/album/202104/12/093847qkyta4srk2uwttai.png)

这看起来很美，不是吗？这类似于 [Neoftech 或者 Screenfetch，在 Linux 中用漂亮的 ASCII 艺术来展示系统信息](https://itsfoss.com/display-linux-logo-in-ascii/)。与这些工具类似，如果你要展示你的桌面截图，可以使用 CPUFetch。

该工具可以输出处理器制造商的 ASCII 艺术，它的名称、微架构、频率、核心、线程、峰值性能、缓存大小、[高级向量扩展](https://software.intel.com/content/www/us/en/develop/articles/introduction-to-intel-advanced-vector-extensions.html) 等等。

除了它提供的一些主题外，你还可以使用自定义颜色。当你在整理桌面，并希望对 Linux 环境中的所有元素进行颜色匹配时，这给了你更多的自由度。

### 在 Linux 上安装 CPUFetch

不幸的是，CPUFetch 是一个相当新的软件，而且它并不包含在你的发行版的软件库中，甚至没有提供现成的 DEB/RPM 二进制文件、PPA、Snap 或 Flatpak 包。

Arch Linux 用户可以在 [AUR](https://itsfoss.com/aur-arch-linux/) 中 [找到](https://aur.archlinux.org/packages/cpufetch-git) 它，但对于其他人来说，唯一的出路是 [从源代码构建](https://itsfoss.com/install-software-from-source-code/)。

不要担心。安装以及删除并不是那么复杂。让我来告诉你步骤。

我使用的是 Ubuntu，你会 [需要先在 Ubuntu 上安装 Git](https://itsfoss.com/install-git-ubuntu/)。一些发行版会预装 Git，如果没有，请使用你的发行版的包管理器来安装。

现在，把 Git 仓库克隆到你想要的地方。家目录也可以。

```
git clone https://github.com/Dr-Noob/cpufetch

```

切换到你刚才克隆的目录：

```
cd cpufetch

```

你会在这里看到一个 Makefile 文件。用它来编译代码。

```
make

```

![CPUFetch Installation](/data/attachment/album/202104/12/093848ytzplqlteqq6y6qi.png)

现在你会看到一个新的可执行文件，名为 `cpufetch`。你运行这个可执行文件来显示终端的 CPU 信息。

```
./cpufetch

```

这是我系统的显示。AMD 的徽标用 ASCII 码看起来更酷，你不觉得吗？

![](/data/attachment/album/202104/12/093848dz5eg33uu2gweg0g.png)

如何删除 CPUFetch？这很简单。当你编译代码时，它只产生了一个文件，而且也和其他代码在同一个目录下。

所以，要想从系统中删除 CPUFetch，只需删除它的整个文件夹即可。你知道 [在 Linux 终端中删除一个目录](https://linuxhandbook.com/remove-files-directories/) 的方法吧？从 `cpufetch` 目录中出来，然后使用 `rm` 命令。

```
rm -rf cpufetch

```

这很简单，值得庆幸的是，因为从源代码中删除安装的软件有时真的很棘手。

说回 CPUFetch。我想这是一个实用工具，适合那些喜欢在各种 Linux 群里炫耀自己桌面截图的人。既然发行版有了 Neofetch，CPU 有了 CPUFetch，不知道能不能也来个 Nvidia ASCII 艺术的 GPUfetch？

---

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

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


用 Hedy 教人编程

Summary: Hedy 是一种专门为教人编程而设计的新型编程语言。

Hedy 是一种专门为教人编程而设计的新型编程语言。

>
> Hedy 是一种专门为教人编程而设计的新型编程语言。
>
>
>

![](/data/attachment/album/202104/12/111814w62da2sannsd2q76.jpg "Teacher or learner?")

学习编程既要学习编程逻辑，又要学习特定编程语言的语法。我在大学上第一堂编程课的时候，教的语言是 C++。第一个代码例子是基本的 “Hello World” 程序，就像下面的例子。

```
#include <iostream>

int main() {
    std::cout << "Hello World!";
    return 0;
}

```

老师直到几节课后才会解释大部分的代码。我们的期望是，我们只需输入代码，并最终了解为什么需要这些东西以及它们如何工作。

C++（以及其他类似的语言）的复杂语法是为什么 Python 经常被建议作为一种更容易的编程教学语言。下面是 Python 中的同一个例子：

```
print("Hello World!")

```

虽然 Python 中的 “Hello World” 基础例子要简单得多，但它仍然有复杂而精确的语法规则。`print` 函数需要在字符串周围加括号和引号。这对于没有编程经验的人来说，还是会感到困惑。Python 比 C++ 少了 “我以后再解释” 的语法问题，但还是有一些。

[Hedy](https://www.hedycode.com/) 是一种专门为编码教学而设计的新语言，它通过在语言中将复杂性分成多个关卡来解决语法复杂性的问题。Hedy 没有马上提供语言的全部功能，而是采取循序渐进的方式，随着学生在 Hedy 的学习的通关，慢慢变得更加复杂。随着关卡的进展，该语言获得了新的功能，最终变得更像 Python。目前有七个关卡，但更多的关卡正在计划中。

在第 1 关，Hedy 程序除了打印（`print`）一条语句（不需要引号或括号），提出（`ask`）一个问题，并回传（`echo`）一个答案外，不能做任何事情。第 1 关没有变量，没有循环，结构极精简。回传的工作原理几乎和变量一样，但只针对用户的最后一个输入。这可以让学生对基本概念感到舒适，而不必一下子学习所有的东西。

这是一个第 1 关的 Hedy “Hello World” 程序：

```
print Hello World

```

第 2 关引入了变量，但由于 `print` 函数没有使用引号，可能会出现一些有趣的结果。如果用来存储一个人的名字的变量是 `name`，那么就不可能打印输出 `Your name is [name]`，因为 `name` 的第一次使用（本意是字符串）和第二次使用（是变量）都被解释为变量。如果将 `name` 设置为（`is`） `John Doe`，那么 `print Your name is name.` 的输出就会是 `Your John Doe is John Doe`。虽然这听起来很奇怪，但这是一个引入变量概念的好方法，这恰好是第 3 关中增加的一个功能。

第 3 关要求在字符串周围加引号，这使得变量的功能就像在 Python 中一样。现在可以输出与变量相结合的字符串，做出复杂的语句，而不用担心变量名和字符串中的单词之间的冲突。这个级别取消了 “回传”（`echo`）函数，这看起来确实是一个可能会让一些学习者感到沮丧的东西。他们应该使用变量，这是更好的代码，但如果一个 `ask`/`echo` 代码块变成无效语法，可能会让人感到困惑。

第 4 关增加了基本的 `if`/`else` 功能。学生可以从简单的问/答代码转向复杂的交互。例如，一个问“你最喜欢的颜色是什么？”的提示可以根据用户输入的内容接受不同的回复。如果他们输入绿色，回答可以是“绿色！这也是我最喜欢的颜色。”如果他们输入其他的东西，回复可以是不同的。`if`/`else` 块是一个基本的编程概念，Hedy 引入了这个概念，而不必担心复杂的语法或过于精确的格式。

第 5 关有一个 `repeat` 函数，在现有的功能上增加了一个基本的循环。这个循环只能多次重复同一个命令，所以它没有 Python 中的循环那么强大，但它让学生习惯了重复命令的一般概念。这是多介绍了一个编程概念，而不会用无谓的复杂来拖累。学生们可以先掌握概念的基础知识，然后再继续学习同一事物的更强大、更复杂的版本。

在第 6 关，Hedy 现在可以进行基本的数学计算。加法、减法、乘法和除法都支持，但更高级的数学功能不支持。不能使用指数、模数或其他任何 Python 和其他语言能处理的东西。目前，Hedy 还没有更高关卡的产品增加更复杂的数学功能。

第 7 关引入了 Python 风格的缩进，这意味着 `repeat` 可以处理多行代码。学生在这之前都是逐行处理代码，但现在他们可以处理代码块。这个 Hedy 关卡与非教学型编程语言能做的事情相比还是有很大的差距，但它可以教会学生很多东西。

开始学习 Hedy 最简单的方法是访问 Hedy 网站上的 [课程](https://www.hedycode.com/hedy?lang=en)，目前有荷兰语、英语、法语、德语、葡萄牙语和西班牙语。这样一来，任何有网页浏览器的人都可以进入学习过程。也可以从 [GitHub](https://github.com/felienne/hedy) 下载 Hedy，并从命令行运行解释器，或者运行 Hedy 网站的本地副本及其交互式课程。基于网页的版本更容易使用，但网页版本和命令行版本都支持运行针对不同复杂程度的 Hedy 程序。

Hedy 永远不会与 Python、C++ 或其他语言竞争，成为现实世界项目编码的首选语言，但它是编码教学的绝佳方式。作为学习过程的一部分，学生编写的程序是真实的，甚至可能是复杂的。Hedy 可以促进学生的学习和创造力，而不会让学生在学习过程中过早地被过多的信息所迷惑。就像数学课一样，在进入微积分之前很久要从学习计数、相加等开始（这个过程需要数年时间），编程也不必一开始就对编程语言的语法问题“我稍后再解释”、精确地遵循这些语法问题，才能产生哪怕是最基本的语言程序。

---

via: <https://opensource.com/article/21/4/hedy-teach-code>

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


硬核观察 | C# 还有什么是可以开源的？

Summary: 更多：• CPU 算法训练深度神经网络可比 GPU 快 15 倍 •  美国得州男子策划炸毁亚马逊数据中心

![](/data/attachment/album/202104/12/145628i9fziht9tvu9fvfv.jpg)

### C# 还有什么是可以开源的？

![](/data/attachment/album/202104/12/145643vue4578404nce5q5.jpg)

微软正在将 [C# 语言的标准化工作](https://www.infoworld.com/article/3614352/microsoft-open-sources-csharp-standards-work.html)转移到 .NET 基金会的公共资源库中，为正在进行的标准工作提供一个公共空间。C# 6 及以后版本的 ECMA [标准](https://github.com/dotnet/csharpstandard)的工作将在 GitHub 上的公共工作空间中进行。从语言创新和功能设计到实现和标准化，一切都将在“开放”中进行，对话也将公开。微软表示，这将使标准化工作更加容易。

这是继 2014 年开源 C# 编译器、将 C# 语言设计放到 GitHub 上之后的开放 C# 的又一举措。

我觉得现在微软对开源、开放的追求已经到了不开放不舒服的阶段。即便是这种“真爱”背后有着完整的商业逻辑和诉求，也很难想象这样的一个软件巨头能改变的如此彻底。dotnet 也许改名做 dotopen 更合适了。

### CPU 算法训练深度神经网络可比 GPU 快 15 倍

![](/data/attachment/album/202104/12/145703uj3j1x5wj1s9k1hv.jpg)

深度神经网络（DNN）的训练通常是一系列矩阵乘法操作，这是 GPU 非常擅长的工作。Rice 大学的计算机科学家和英特尔的研究人员从 2019 年就开始探讨使用 CPU 训练深度神经网络，他们采取的方法是将 DNN 训练转变成能用哈希表解决的搜索问题，这非常适合 CPU 进行处理，他们的 SLIDE 算法是设计运行在商业 CPU 上的。

他们在 2019 年的研究显示，SLIDE 训练所需时间为 GPU 的 2/7。现在，研究人员利用现代 CPU 的向量化和内存优化加速器[改进](https://arxiv.org/abs/2103.10891)了 SLIDE 的性能，用 CPU 算法训练深度神经网络比 GPU 快 15 倍。他们的[代码](https://github.com/RUSH-LAB/SLIDE)发布在 GitHub 上。

除了硬件的提升，在算法和数学上的突破，可能更能取得意想不到的进步。

### 美国得州男子策划炸毁亚马逊数据中心

![](/data/attachment/album/202104/12/145724nfh2ki52hjk2j5vz.jpg)

美国 FBI 逮捕了一名策划炸毁亚马逊弗吉尼亚州数据中心的得州男子。他试图从卧底 FBI 特工手中购买用于炸毁建筑物的 C4 塑料炸药，他认为炸毁这个亚马逊数据中心将会摧毁七成的互联网。他在和卧底特工接头时得到了哑弹，随即被捕。

这对数据中心的“真•物理攻击”。


使用 Elixir 语言编写一个小游戏

>
> 通过编写“猜数字”游戏来学习 Elixir 编程语言，并将它与一个你熟知的语言做对比。
>
>
>

![](/data/attachment/album/202104/12/223351t68886wmza1m9jnt.jpg "A die with rainbow color background")

为了更好的学习一门新的编程语言，最好的方法是去关注主流语言的一些共有特征：

* 变量
* 表达式
* 语句

这些概念是大多数编程语言的基础。因为这些相似性，只要你通晓了一门编程语言，你可以通过对比差异来熟知另一门编程语言。

另外一个学习新编程语言的好方法是开始编写一个简单标准的程序。它可以让你集中精力在语言上而非程序的逻辑本身。在这个系列的文章中，我们使用“猜数字”程序来实现，在这个程序中，计算机会选择一个介于 1 到 100 之间的数字，并要求你来猜测它。程序会循环执行，直到你正确猜出该数字为止。

“猜数字”这个程序使用了编程语言的以下概念：

* 变量
* 输入
* 输出
* 条件判断
* 循环

这是一个学习新编程语言的绝佳实践。

### 猜数字的 Elixir 实现

[Elixir](https://elixir-lang.org/) 是一门被设计用于构建稳定可维护应用的动态类型的函数式编程语言。它与 [Erlang](https://www.erlang.org/) 运行于同一虚拟机之上，吸纳了 Erlang 的众多长处的同时拥有更加简单的语法。

你可以编写一个 Elixir 版本的“猜数字”游戏来体验这门语言。

这是我的实现方法：

```
defmodule Guess do
  def guess() do
     random = Enum.random(1..100)
     IO.puts "Guess a number between 1 and 100"
     Guess.guess_loop(random)
  end
  def guess_loop(num) do
    data = IO.read(:stdio, :line)
    {guess, _rest} = Integer.parse(data)
    cond do
      guess < num ->
        IO.puts "Too low!"
        guess_loop(num)
      guess > num ->
        IO.puts "Too high!"
        guess_loop(num)
      true ->
        IO.puts "That's right!"
    end
  end
end

Guess.guess()

```

Elixir 通过列出变量的名称后面跟一个 `=` 号来为了给变量分配一个值。举个例子，表达式 `random = 0` 给 `random` 变量分配一个数值 0。

代码以定义一个模块开始。在 Elixir 语言中，只有模块可以包含命名函数。

紧随其后的这行代码定义了入口函数 `guess()`，这个函数：

* 调用 `Enum.random()` 函数来获取一个随机整数
* 打印游戏提示
* 调用循环执行的函数

剩余的游戏逻辑实现在 `guess_loop()` 函数中。

`guess_loop()` 函数利用 [尾递归](https://en.wikipedia.org/wiki/Tail_call) 来实现循环。Elixir 中有好几种实现循环的方法，尾递归是比较常用的一种方式。`guess_loop()` 函数做的最后一件事就是调用自身。

`guess_loop()` 函数的第一行读取用户输入。下一行调用 `parse()` 函数将输入转换成一个整数。

`cond` 表达式是 Elixir 版本的多重分支表达式。与其他语言中的 `if/elif` 或者 `if/elsif` 表达式不同，Elixir 对于的首个分支或者最后一个没有分支并没有区别对待。

这个 `cond` 表达式有三路分支：猜测的结果可以比随机数大、小或者相等。前两个选项先输出不等式的方向然后递归调用 `guess_loop()`，循环返回至函数开始。最后一个选项输出 `That's right`，然后这个函数就完成了。

### 输出例子

现在你已经编写了你的 Elixir 代码，你可以运行它来玩“猜数字”的游戏。每次你执行这个程序，Elixir 会选择一个不同的随机数，你可以一直猜下去直到你找到正确的答案：

```
$ elixir guess.exs
Guess a number between 1 and 100
50
Too high
30
Too high
20
Too high
10
Too low
15
Too high
13
Too low
14
That's right!

```

“猜数字”游戏是一个学习一门新编程语言的绝佳入门程序，因为它用了非常直接的方法实践了常用的几个编程概念。通过用不同语言实现这个简单的小游戏，你可以实践各个语言的核心概念并且比较它们的细节。

你是否有你最喜爱的编程语言？你将怎样用它来编写“猜数字”这个游戏？关注这个系列的文章来看看其他你可能感兴趣的语言实现。

---

via: <https://opensource.com/article/20/12/elixir>

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

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


git stash 命令实用指南

Summary: 学习如何使用 git stash 命令，以及何时应该使用它。

学习如何使用 git stash 命令，以及何时应该使用它。

>
> 学习如何使用 `git stash` 命令，以及何时应该使用它。
>
>
>

![](/data/attachment/album/202104/12/232830chuyr6lkzevrfuzr.jpg "young woman working on a laptop")

版本控制是软件开发人员日常生活中不可分割的一部分。很难想象有哪个团队在开发软件时不使用版本控制工具。同样也很难想象有哪个开发者没有使用过（或没有听说过）Git。在 2018 年 Stackoverflow 开发者调查中，74298 名参与者中有 87.2% 的人 [使用 Git](https://insights.stackoverflow.com/survey/2018#work-_-version-control) 进行版本控制。

Linus Torvalds 在 2005 年创建了 Git 用于开发 Linux 内核。本文将介绍 `git stash` 命令，并探讨一些有用的暂存变更的选项。本文假定你对 [Git 概念](https://opensource.com/downloads/cheat-sheet-git) 有基本的了解，并对工作树、暂存区和相关命令有良好的理解。

### 为什么 git stash 很重要？

首先要明白为什么在 Git 中暂存变更很重要。假设 Git 没有暂存变更的命令。当你正在一个有两个分支（A 和 B）的仓库上工作时，这两个分支已经分叉了一段时间，并且有不同的头。当你正在处理 A 分支的一些文件时，你的团队要求你修复 B 分支的一个错误。你迅速将你的修改保存到 A 分支（但没有提交），并尝试用 `git checkout B` 来签出 B 分支。Git 会立即中止了这个操作，并抛出错误：“你对以下文件的本地修改会被该签出覆盖……请在切换分支之前提交你的修改或将它们暂存起来。”

在这种情况下，有几种方法可以启用分支切换：

* 在分支 A 中创建一个提交，提交并推送你的修改，以修复 B 中的错误，然后再次签出 A，并运行 `git reset HEAD^` 来恢复你的修改。
* 手动保留不被 Git 跟踪的文件中的改动。

第二种方法是个馊主意。第一种方法虽然看起来很传统，但却不太灵活，因为保存未完成工作的修改会被当作一个检查点，而不是一个仍在进行中的补丁。这正是设计 `git stash` 的场景。

`git stash` 将未提交的改动保存在本地，让你可以进行修改、切换分支以及其他 Git 操作。然后，当你需要的时候，你可以重新应用这些存储的改动。暂存是本地范围的，不会被 `git push` 推送到远程。

### 如何使用 git stash

下面是使用 `git stash` 时要遵循的顺序：

1. 将修改保存到分支 A。
2. 运行 `git stash`。
3. 签出分支 B。
4. 修正 B 分支的错误。
5. 提交并（可选）推送到远程。
6. 查看分支 A
7. 运行 `git stash pop` 来取回你的暂存的改动。

`git stash` 将你对工作目录的修改存储在本地（在你的项目的 `.git` 目录内，准确的说是 `/.git/refs/stash`），并允许你在需要时检索这些修改。当你需要在不同的上下文之间切换时，它很方便。它允许你保存以后可能需要的更改，是让你的工作目录干净同时保持更改完整的最快方法。

### 如何创建一个暂存

暂存你的变化的最简单的命令是 `git stash`：

```
$ git stash
Saved working directory and index state WIP on master; d7435644 Feat: configure graphql endpoint

```

默认情况下，`git stash` 存储（或称之为“暂存”）未提交的更改（已暂存和未暂存的文件），并忽略未跟踪和忽略的文件。通常情况下，你不需要暂存未跟踪和忽略的文件，但有时它们可能会干扰你在代码库中要做的其他事情。

你可以使用附加选项让 `git stash` 来处理未跟踪和忽略的文件：

* `git stash -u` 或 `git stash --includ-untracked` 储存未追踪的文件。
* `git stash -a` 或 `git stash --all` 储存未跟踪的文件和忽略的文件。

要存储特定的文件，你可以使用 `git stash -p` 或 `git stash -patch` 命令：

```
$ git stash --patch
diff --git a/.gitignore b/.gitignore
index 32174593..8d81be6e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
 # dependencies
 node_modules/
 /.pnp
+f,fmfm
 .pnp.js

 # testing
(1/1) Stash this hunk [y,n,q,a,d,e,?]?

```

### 列出你的暂存

你可以用 `git stash list` 命令查看你的暂存。暂存是后进先出（LIFO）方式保存的：

```
$ git stash list
stash@{0}: WIP on master: d7435644 Feat: configure graphql endpoint

```

默认情况下，暂存会显示在你创建它的分支和提交的顶部，被标记为 `WIP`。然而，当你有多个暂存时，这种有限的信息量并没有帮助，因为很难记住或单独检查它们的内容。要为暂存添加描述，可以使用命令 `git stash save <description>`：

```
$ git stash save "remove semi-colon from schema"
Saved working directory and index state On master: remove semi-colon from schema

$ git stash list
stash@{0}: On master: remove semi-colon from schema
stash@{1}: WIP on master: d7435644 Feat: configure graphql endpoint

```

### 检索暂存起来的变化

你可以用 `git stash apply` 和 `git stash pop` 这两个命令来重新应用暂存的变更。这两个命令都会重新应用最新的暂存（即 `stash@{0}`）中的改动。`apply` 会重新应用变更；而 `pop` 则会将暂存的变更重新应用到工作副本中，并从暂存中删除。如果你不需要再次重新应用被暂存的更改，则首选 `pop`。

你可以通过传递标识符作为最后一个参数来选择你想要弹出或应用的储藏：

```
$ git stash pop stash@{1}

```

或

```
$ git stash apply stash@{1}

```

### 清理暂存

删除不再需要的暂存是好的习惯。你必须用以下命令手动完成：

* `git stash clear` 通过删除所有的暂存库来清空该列表。
* `git stash drop <stash_id>` 从暂存列表中删除一个特定的暂存。

### 检查暂存的差异

命令 `git stash show <stash_id>` 允许你查看一个暂存的差异：

```
$ git stash show stash@{1}
console/console-init/ui/.graphqlrc.yml        |   4 +-
console/console-init/ui/generated-frontend.ts | 742 +++++++++---------
console/console-init/ui/package.json          |   2 +-

```

要获得更详细的差异，需要传递 `--patch` 或 `-p` 标志：

```
$ git stash show stash@{0} --patch
diff --git a/console/console-init/ui/package.json b/console/console-init/ui/package.json
index 755912b97..5b5af1bd6 100644
--- a/console/console-init/ui/package.json
+++ b/console/console-init/ui/package.json
@@ -1,5 +1,5 @@
 {
- "name": "my-usepatternfly",
+ "name": "my-usepatternfly-2",
  "version": "0.1.0",
  "private": true,
  "proxy": "http://localhost:4000"
diff --git a/console/console-init/ui/src/AppNavHeader.tsx b/console/console-init/ui/src/AppNavHeader.tsx
index a4764d2f3..da72b7e2b 100644
--- a/console/console-init/ui/src/AppNavHeader.tsx
+++ b/console/console-init/ui/src/AppNavHeader.tsx
@@ -9,8 +9,8 @@ import { css } from "@patternfly/react-styles";

interface IAppNavHeaderProps extends PageHeaderProps {
- toolbar?: React.ReactNode;
- avatar?: React.ReactNode;
+ toolbar?: React.ReactNode;
+ avatar?: React.ReactNode;
}

export class AppNavHeader extends React.Component<IAppNavHeaderProps>{
  render()

```

### 签出到新的分支

你可能会遇到这样的情况：一个分支和你的暂存中的变更有分歧，当你试图重新应用暂存时，会造成冲突。一个简单的解决方法是使用 `git stash branch <new_branch_name stash_id>` 命令，它将根据创建暂存时的提交创建一个新分支，并将暂存中的修改弹出：

```
$ git stash branch test_2 stash@{0}
Switched to a new branch 'test_2'
On branch test_2
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: .graphqlrc.yml
modified: generated-frontend.ts
modified: package.json
no changes added to commit (use "git add" and/or "git commit -a")
Dropped stash@{0} (fe4bf8f79175b8fbd3df3c4558249834ecb75cd1)

```

### 在不打扰暂存参考日志的情况下进行暂存

在极少数情况下，你可能需要创建一个暂存，同时保持暂存参考日志（`reflog`）的完整性。这些情况可能出现在你需要一个脚本作为一个实现细节来暂存的时候。这可以通过 `git stash create` 命令来实现；它创建了一个暂存条目，并返回它的对象名，而不将其推送到暂存参考日志中：

```
$ git stash create "sample stash"
63a711cd3c7f8047662007490723e26ae9d4acf9

```

有时，你可能会决定将通过 `git stash create` 创建的暂存条目推送到暂存参考日志：

```
$ git stash store -m "sample stash testing.." "63a711cd3c7f8047662007490723e26ae9d4acf9"
$ git stash list
stash @{0}: sample stash testing..

```

### 结论

我希望你觉得这篇文章很有用，并学到了新的东西。如果我遗漏了任何有用的使用暂存的选项，请在评论中告诉我。

---

via: <https://opensource.com/article/21/4/git-stash>

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


硬核观察 | 华为将投资 10 亿美元研发汽车技术，称在自动驾驶技术上超过了特斯拉

Summary: 更多：• 亚马逊发布 Elasticsearch 分支 OpenSearch • 合肥本源量子的国产量子芯片生产线即将落地

华为汽车是不是要自主发动机啊

上次叫哄懵，这才叫轰隆？

电动车不需要发动机了，电动机就行。华为让你用鸿蒙就可以了。

![](/data/attachment/album/202104/13/170834gnaaf4751jss4ff7.jpg)

### 华为将投资 10 亿美元研发汽车技术，称在自动驾驶技术上超过了特斯拉

![](/data/attachment/album/202104/13/170847u14q6iz5nppip041.jpg)

华为轮值董事长徐直军周一在深圳[告诉](https://www.bloomberg.com/news/articles/2021-04-12/huawei-to-invest-1-billion-on-car-tech-it-says-surpasses-tesla)分析师，华为将与北汽集团、重庆长安汽车和广汽集团合作，生产自动驾驶汽车，将华为的名字作为子品牌。

徐直军说，“今年将在汽车零部件研发上投入超过 10 亿美元。中国每年新增 3000 万辆汽车，而且这个数字还在增长。即使我们不开拓中国以外的市场，如果我们能从中国每卖出一辆汽车平均赚取 1 万元人民币，这对华为来说已经是非常大的生意了。”

徐直军表示，“我的团队说，他们可以让汽车在没有人为干预的情况下自行行驶 1000 公里。这比特斯拉要好得多。”

汽车行业如此多金，引各大厂商纷纷入局。

### 亚马逊发布 Elasticsearch 分支 OpenSearch

![](/data/attachment/album/202104/13/170912s9yrsnsszttojksn.jpg)

今年 1 月，开发 Elasticsearch 和 Kibana 的公司 Elastic 宣布[更改许可证](/article-13035-1.html)，新版本将不再使用 Apache 2.0 许可证，而是使用 Elastic 许可证和服务器端公共许可证（SSPL），此举是为了禁止类似亚马逊等云服务商使用它的软件作为一种服务提供给客户。但同时，新的许可证不再符合开源许可证的定义，意味着 Elasticsearch 和 Kibana 不再是开源软件了。

然后，亚马逊[宣布](/article-13042-1.html)要创建它的 Elasticsearch 分支 [OpenSearch](https://github.com/opensearch-project/OpenSearch) 和 Kibana 分支 [OpenSearch Dashboards](https://github.com/opensearch-project/OpenSearch-Dashboards)，并与昨日[发布](https://aws.amazon.com/cn/blogs/opensource/introducing-opensearch/)了。源代码托管在 GitHub 上，采用 Apache 2.0 许可证。亚马逊表示以后所有的更新将通过 OpenSearch 项目发布。Red Hat、SAP 等表达了对 OpenSearch 项目的支持。

如果不是 Elastic 等厂商被云厂商吸血到忍无可忍，怎么会有开源的 OpenSearch？如今反过来指责 Elasticsearch 不开源。

### 合肥本源量子的国产量子芯片生产线即将落地

![](/data/attachment/album/202104/13/170936rgmd82msk8mgmskc.jpg)

合肥本源量子计算科技有限责任公司与合肥晶合集成电路股份有限公司日前签订合作协议，双方宣布共同建设国内第一家面向产业化和应用的量子芯片实验室“本源-晶合量子芯片联合实验室”，将在极低温集成电路领域进行工艺合作开发以及工程流片验证，实现从量子芯片设计到封装测试全链条开发。

[据本源量子称](https://www.cnbeta.com/articles/tech/1114153.htm)，该实验室在超导的技术路线上，将对标 IBM、谷歌等国际巨头，在半导体技术线上则对标英特尔的 22nm FinFET 等。本源量子已先后推出了多种超导量子芯片，其保真度、相干时间等多项技术指标达到国内领先、国际一流水准。

虽然不太了解，但是似乎听起来是不错的进展。


什么是 Git 遴选（cherry-pick）？

Summary: 了解 git cherry-pick 命令是什么，为什么用以及如何使用。

抓个虫：最后一节的第一段第一句，“通常不鼓励所以遴选”中的“所以”明显有误，似应删去或换成“使用”？

了解 git cherry-pick 命令是什么，为什么用以及如何使用。

>
> 了解 `git cherry-pick` 命令是什么，为什么用以及如何使用。
>
>
>

![](/data/attachment/album/202104/14/131735o63v3ow6y2wc281o.jpg "Measuring and baking a cherry pie recipe")

当你和一群程序员一起工作时，无论项目大小，处理多个 Git 分支之间的变更都会变得很困难。有时，你不想将整个 Git 分支合并到另一个分支，而是想选择并移动几个特定的提交。这个过程被称为 “<ruby> 遴选 <rt>  cherry-pick </rt></ruby>”。

本文将介绍“遴选”是什么、为何使用以及如何使用。

那么让我们开始吧。

### 什么是遴选？

使用遴选（`cherry-pick`）命令，Git 可以让你将任何分支中的个别提交合并到你当前的 [Git HEAD](https://acompiler.com/git-head/) 分支中。

当执行 `git merge` 或者 `git rebase` 时，一个分支的所有提交都会被合并。`cherry-pick` 命令允许你选择单个提交进行整合。

### 遴选的好处

下面的情况可能会让你更容易理解遴选功能。

想象一下，你正在为即将到来的每周冲刺实现新功能。当你的代码准备好了，你会把它推送到远程分支，准备进行测试。

然而，客户并不是对所有修改都满意，要求你只呈现某些修改。因为客户还没有批准下次发布的所有修改，所以 `git rebase` 不会有预期的结果。为什么会这样？因为 `git rebase` 或者 `git merge` 会把上一个冲刺的每一个调整都纳入其中。

遴选就是答案！因为它只关注在提交中添加的变更，所以遴选只会带入批准的变更，而不添加其他的提交。

还有其他几个原因可以使用遴选：

* 这对于 bug 修复是必不可少的，因为 bug 是出现在开发分支中对应的提交的。
* 你可以通过使用 `git cherry-pick` 来避免不必要的工作，而不用使用其他选项例如 `git diff` 来应用特定变更。
* 如果因为不同 Git 分支的版本不兼容而无法将整个分支联合起来，那么它是一个很有用的工具。

### 使用 cherry-pick 命令

在 `cherry-pick` 命令的最简单形式中，你只需使用 [SHA](https://en.wikipedia.org/wiki/Secure_Hash_Algorithms) 标识符来表示你想整合到当前 HEAD 分支的提交。

要获得提交的哈希值，可以使用 `git log` 命令：

```
$ git log --oneline

```

当你知道了提交的哈希值后，你就可以使用 `cherry-pick` 命令。

语法是：

```
$ git cherry-pick <commit sha>

```

例如：

```
$ git cherry-pick 65be1e5

```

这将会把指定的修改合并到当前已签出的分支上。

如果你想做进一步的修改，也可以让 Git 将提交的变更内容添加到你的工作副本中。

语法是：

```
$ git cherry-pick <commit sha> --no-commit

```

例如：

```
$ git cherry-pick 65be1e5 --no-commit

```

如果你想同时选择多个提交，请将它们的提交哈希值用空格隔开：

```
$ git cherry-pick hash1 hash3

```

当遴选提交时，你不能使用 `git pull` 命令，因为它能获取一个仓库的提交**并**自动合并到另一个仓库。`cherry-pick` 是一个专门不这么做的工具；另一方面，你可以使用 `git fetch`，它可以获取提交，但不应用它们。毫无疑问，`git pull` 很方便，但它不精确。

### 自己尝试

要尝试这个过程，启动终端并生成一个示例项目：

```
$ mkdir fruit.git
$ cd fruit.git
$ git init .

```

创建一些数据并提交：

```
$ echo "Kiwifruit" > fruit.txt
$ git add fruit.txt
$ git commit -m 'First commit'

```

现在，通过创建一个项目的复刻来代表一个远程开发者：

```
$ mkdir ~/fruit.fork
$ cd !$
$ echo "Strawberry" >> fruit.txt
$ git add fruit.txt
$ git commit -m 'Added a fruit"

```

这是一个有效的提交。现在，创建一个不好的提交，代表你不想合并到你的项目中的东西：

```
$ echo "Rhubarb" >> fruit.txt
$ git add fruit.txt
$ git commit -m 'Added a vegetable that tastes like a fruit"

```

返回你的仓库，从你的假想的开发者那里获取提交的内容：

```
$ cd ~/fruit.git
$ git remote add dev ~/fruit.fork
$ git fetch dev
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done...

```

```
$ git log –oneline dev/master
e858ab2 Added a vegetable that tastes like a fruit
0664292 Added a fruit
b56e0f8 First commit

```

你已经从你想象中的开发者那里获取了提交的内容，但你还没有将它们合并到你的版本库中。你想接受第二个提交，但不想接受第三个提交，所以使用 `cherry-pick`。

```
$ git cherry-pick 0664292

```

第二次提交现在在你的仓库里了：

```
$ cat fruit.txt
Kiwifruit
Strawberry

```

将你的更改推送到远程服务器上，这就完成了！

### 避免使用遴选的原因

在开发者社区中，通常不鼓励所以遴选。主要原因是它会造成重复提交，而你也失去了跟踪你的提交历史的能力。

如果你不按顺序地遴选了大量的提交，这些提交会被记录在你的分支中，这可能会在 Git 分支中导致不理想的结果。

遴选是一个强大的命令，如果没有正确理解可能发生的情况，它可能会导致问题。不过，当你搞砸了，提交到错误的分支时，它可能会救你一命（至少是你当天的工作）。

---

via: <https://opensource.com/article/21/4/cherry-picking-git>

作者：[Rajeev Bera](https://opensource.com/users/acompiler) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


在 Linux 上创建一个加密文件保险库

>
> 使用 Linux 统一密钥设置（LUKS）为物理驱动器或云存储上的敏感文件创建一个加密保险库。
>
>
>

![](/data/attachment/album/202104/14/151220l5zkkxiukgzix54k.jpg "Secure safe")

最近，我演示了如何在 Linux 上使用<ruby> 统一密钥设置 <rt>  Linux Unified Key Setup </rt></ruby>（[LUKS](https://gitlab.com/cryptsetup/cryptsetup/blob/master/README.md)）和 `cryptsetup` 命令 [实现全盘加密](https://opensource.com/article/21/3/encryption-luks)。虽然加密整个硬盘在很多情况下是有用的，但也有一些原因让你不想对整个硬盘进行加密。例如，你可能需要让一个硬盘在多个平台上工作，其中一些平台可能没有集成 [LUKS](https://gitlab.com/cryptsetup/cryptsetup/blob/master/README.md)。此外，现在是 21 世纪，由于云的存在，你可能不会使用物理硬盘来处理所有的数据。

几年前，有一个名为 [TrueCrypt](https://en.wikipedia.org/wiki/TrueCrypt) 的系统，允许用户创建加密的文件保险库，可以通过 TrueCrypt 解密来提供读/写访问。这是一项有用的技术，基本上提供了一个虚拟的便携式、完全加密的驱动器，你可以在那里存储重要数据。TrueCrypt 项目关闭了，但它可以作为一个有趣的模型。

幸运的是，LUKS 是一个灵活的系统，你可以使用它和 `cryptsetup` 在一个独立的文件中创建一个加密保险库，你可以将其保存在物理驱动器或云存储中。

下面就来介绍一下怎么做。

### 1、建立一个空文件

首先，你必须创建一个预定大小的空文件。就像是一种保险库或保险箱，你可以在其中存储其他文件。你使用的命令是 `util-linux` 软件包中的 `fallocate`：

```
$ fallocate --length 512M vaultfile.img

```

这个例子创建了一个 512MB 的文件，但你可以把你的文件做成任何你想要的大小。

### 2、创建一个 LUKS 卷

接下来，在空文件中创建一个 LUKS 卷：

```
$ cryptsetup --verify-passphrase \
    luksFormat vaultfile.img

```

### 3、打开 LUKS 卷

要想创建一个可以存储文件的文件系统，必须先打开 LUKS 卷，并将其挂载到电脑上：

```
$ sudo cryptsetup open \
    --type luks vaultfile.img myvault
$ ls /dev/mapper
myvault

```

### 4、建立一个文件系统

在你打开的保险库中建立一个文件系统：

```
$ sudo mkfs.ext4 -L myvault /dev/mapper/myvault

```

如果你现在不需要它做什么，你可以关闭它：

```
$ sudo cryptsetup close myvault

```

### 5、开始使用你的加密保险库

现在一切都设置好了，你可以在任何需要存储或访问私人数据的时候使用你的加密文件库。要访问你的保险库，必须将其挂载为一个可用的文件系统：

```
$ sudo cryptsetup open \
    --type luks vaultfile.img myvault
$ ls /dev/mapper
myvault
$ sudo mkdir /myvault
$ sudo mount /dev/mapper/myvault /myvault

```

这个例子用 `cryptsetup` 打开保险库，然后把保险库从 `/dev/mapper` 下挂载到一个叫 `/myvault` 的新目录。和 Linux 上的任何卷一样，你可以把 LUKS 卷挂载到任何你想挂载的地方，所以除了 `/myvault`，你可以用 `/mnt` 或 `~/myvault` 或任何你喜欢的位置。

当它被挂载后，你的 LUKS 卷就会被解密。你可以像读取和写入文件一样读取和写入它，就像它是一个物理驱动器一样。

当使用完你的加密保险库时，请卸载并关闭它：

```
$ sudo umount /myvault
$ sudo cryptsetup close myvault

```

### 加密的文件保险库

你用 LUKS 加密的镜像文件和其他文件一样，都是可移动的，因此你可以将你的保险库存储在硬盘、外置硬盘，甚至是互联网上。只要你可以使用 LUKS，就可以解密、挂载和使用它来保证你的数据安全。轻松加密，提高数据安全性，不妨一试。

---

via: <https://opensource.com/article/21/4/linux-encryption>

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


硬核观察 | 安全研究人员根据修复补丁，直接在网上公开了 Chrome 漏洞

Summary: 更多：• FreeBSD 13.0 发布 • Apache 软件基金会撤下了大量的 Hadoop 相关项目

![](/data/attachment/album/202104/14/164941xpciib0c8p6j4q6z.jpg)

### 安全研究人员根据修复补丁，直接在网上公开了 Chrome 漏洞

![](/data/attachment/album/202104/14/164950p29ez9b2gwgte7jb.jpg)

一名印度安全研究人员[公布](https://therecord.media/security-researcher-drops-chrome-and-edge-zero-day-on-twitter/)了一个最近发现的漏洞的概念验证利用代码，该漏洞存在于 V8 JavaScript 引擎中，影响了谷歌 Chrome、微软 Edge 以及 Opera 和 Brave 等其他基于 Chromium 的浏览器。

该漏洞在上周举行的 Pwn2Own 黑客大赛中被使用，参赛选手因此赢得了 10 万美元的奖金。根据比赛规则，关于这个漏洞的细节被交给了 Chrome 安全团队，谷歌将修复补丁提交到了 V8 引擎，但尚未及时发布到 Chromium 浏览器中（本文发布时已更新修复）。结果，另外一位安全研究人员根据该补丁重现了该漏洞，并将其发布到了 GitHub 上，并通过 Twitter 公之于众。

研究人员所发布的并非完全武器化的漏洞，利用也需要一定的条件。但这件事凸显了“开源补丁间隙”问题，在安全补丁传递到下游之前的空隙期间，可能带来更大的安全风险。

### FreeBSD 13.0 发布

![](/data/attachment/album/202104/14/165003mmlluymuolmlfly5.jpg)

[新版本](https://www.freebsd.org/releases/13.0R/relnotes/)包含了大量的软件更新；64 位 ARM 架构现在与 x86\_64 并列成为一级架构；ZFS 采用 OpenZFS 实现；LLVM Clang 11 成为默认的编译器工具链；移除了各种过时的老版本工具，如旧版的 GDB、GCC 和 Binutils；以及因为质量原因，这次对 WireGuard 的支持未能加入。其它[亮点可参见基金会文章](https://freebsdfoundation.org/blog/freebsd-release-13-0-highlights/)。

这是一个值得关注的大版本，可惜的是 WireGuard 没能进入。

### Apache 软件基金会撤下了大量的 Hadoop 相关项目

![](/data/attachment/album/202104/14/165017yupo7fh93t6tzv9p.jpg)

从 4 月 1 日开始，Apache 软件基金会（ASF）宣布至少有 19 个开源项目退居“<ruby> 阁楼 <rt>  Attic </rt></ruby>”，其中 [13 个与大数据相关](https://www.zdnet.com/article/apache-software-foundation-retires-slew-of-hadoop-related-projects/)，10 个是 Hadoop 生态系统的一部分。ASF 表示这是常规的项目退役高峰，经过了项目管理委员会到董事会的投票，这些项目被放到了“阁楼”。

这或许是 ASF 内部进行清仓，但是似乎也能表明，Hadoop 已经在优胜劣汰中处于劣势，让位于 Spark 了。


6 个提升 Linux 服务器安全的开源工具和技巧

Summary: 使用开源工具来保护你的 Linux 环境不被入侵。

使用开源工具来保护你的 Linux 环境不被入侵。

>
> 使用开源工具来保护你的 Linux 环境不被入侵。
>
>
>

![](/data/attachment/album/202104/15/082334ltqtgg40tu7l80rd.jpg "People work on a computer server with devices")

如今我们的许多个人和专业数据都可以在网上获得，因此无论是专业人士还是普通互联网用户，学习安全和隐私的基本知识是非常重要的。作为一名学生，我通过学校的 CyberPatriot 活动获得了这方面的经验，在那里我有机会与行业专家交流，了解网络漏洞和建立系统安全的基本步骤。

本文基于我作为初学者迄今所学的知识，详细介绍了六个简单的步骤，以提高个人使用的 Linux 环境的安全性。在我的整个旅程中，我利用开源工具来加速我的学习过程，并熟悉了与提升 Linux 服务器安全有关的更高层次的概念。

我使用我最熟悉的 Ubuntu 18.04 版本测试了这些步骤，但这些步骤也适用于其他 Linux 发行版。

### 1、运行更新

开发者们不断地寻找方法，通过修补已知的漏洞，使服务器更加稳定、快速、安全。定期运行更新是一个好习惯，可以最大限度地提高安全性。运行它们：

```
sudo apt-get update && apt-get upgrade

```

### 2、启用防火墙保护

[启用防火墙](https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd) 可以更容易地控制服务器上的进站和出站流量。在 Linux 上有许多防火墙应用程序可以使用，包括 [firewall-cmd](https://opensource.com/article/20/2/firewall-cheat-sheet) 和 <ruby> 简单防火墙 <rt>  Uncomplicated Firewall </rt></ruby>（[UFW](https://wiki.ubuntu.com/UncomplicatedFirewall)）。我使用 UFW，所以我的例子是专门针对它的，但这些原则适用于你选择的任何防火墙。

安装 UFW：

```
sudo apt-get install ufw

```

如果你想进一步保护你的服务器，你可以拒绝传入和传出的连接。请注意，这将切断你的服务器与世界的联系，所以一旦你封锁了所有的流量，你必须指定哪些出站连接是允许从你的系统中发出的：

```
sudo ufw default deny incoming
sudo ufw default allow outgoing

```

你也可以编写规则来允许你个人使用所需要的传入连接：

```
ufw allow <service>

```

例如，允许 SSH 连接：

```
ufw allow ssh

```

最后，启用你的防火墙：

```
sudo ufw enable

```

### 3、加强密码保护

实施强有力的密码政策是保持服务器安全、防止网络攻击和数据泄露的一个重要方面。密码策略的一些最佳实践包括强制要求最小长度和指定密码年龄。我使用 libpam-cracklib 软件包来完成这些任务。

安装 libpam-cracklib 软件包：

```
sudo apt-get install libpam-cracklib

```

强制要求密码的长度：

* 打开 `/etc/pam.d/common-password` 文件。
* 将 `minlen=12` 行改为你需要的任意字符数，从而改变所有密码的最小字符长度要求。

为防止密码重复使用：

* 在同一个文件（`/etc/pam.d/common-password`）中，添加 `remember=x` 行。
* 例如，如果你想防止用户重复使用他们最后 5 个密码中的一个，使用 `remember=5`。

要强制要求密码年龄：

* 在 `/etc/login.defs` 文件中找到以下几行，并用你喜欢的时间（天数）替换。例如：

```
PASS_MIN_AGE: 3
PASS_MAX_AGE: 90
PASS_WARN_AGE: 14

```

强制要求字符规格：

* 在密码中强制要求字符规格的四个参数是 `lcredit`（小写）、`ucredit`（大写）、`dcredit`（数字）和 `ocredit`（其他字符）。
* 在同一个文件（`/etc/pam.d/common-password`）中，找到包含 `pam_cracklib.so` 的行。
	+ 在该行末尾添加以下内容：`lcredit=-a ucredit=-b dcredit=-c ocredit=-d`。
	+ 例如，下面这行要求密码必须至少包含一个每种字符。你可以根据你喜欢的密码安全级别来改变数字。`lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1`。

### 4、停用容易被利用的非必要服务。

停用不必要的服务是一种最好的做法。这样可以减少开放的端口，以便被利用。

安装 systemd 软件包：

```
sudo apt-get install systemd

```

查看哪些服务正在运行：

```
systemctl list-units

```

[识别](http://www.yorku.ca/infosec/Administrators/UNIX_disable.html) 哪些服务可能会导致你的系统出现潜在的漏洞。对于每个服务可以：

* 停止当前正在运行的服务：`systemctl stop <service>`。
* 禁止服务在系统启动时启动：`systemctl disable <service>`。
* 运行这些命令后，检查服务的状态：`systemctl status <service>`。

### 5、检查监听端口

开放的端口可能会带来安全风险，所以检查服务器上的监听端口很重要。我使用 [netstat](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/netstat) 命令来显示所有的网络连接：

```
netstat -tulpn

```

查看 “address” 列，确定 [端口号](https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers)。一旦你找到了开放的端口，检查它们是否都是必要的。如果不是，[调整你正在运行的服务](https://opensource.com/article/20/5/systemd-units)，或者调整你的防火墙设置。

### 6、扫描恶意软件

杀毒扫描软件可以有用的防止病毒进入你的系统。使用它们是一种简单的方法，可以让你的服务器免受恶意软件的侵害。我首选的工具是开源软件 [ClamAV](https://www.clamav.net/)。

安装 ClamAV：

```
sudo apt-get install clamav

```

更新病毒签名：

```
sudo freshclam

```

扫描所有文件，并打印出被感染的文件，发现一个就会响铃：

```
sudo clamscan -r --bell -i /

```

你可以而且应该设置为自动扫描，这样你就不必记住或花时间手动进行扫描。对于这样简单的自动化，你可以使用 [systemd 定时器](https://opensource.com/article/20/7/systemd-timers) 或者你的 [喜欢的 cron](https://opensource.com/article/21/2/linux-automation) 来做到。

### 保证你的服务器安全

我们不能把保护服务器安全的责任只交给一个人或一个组织。随着威胁环境的不断迅速扩大，我们每个人都应该意识到服务器安全的重要性，并采用一些简单、有效的安全最佳实践。

这些只是你提升 Linux 服务器的安全可以采取的众多步骤中的一部分。当然，预防只是解决方案的一部分。这些策略应该与严格监控拒绝服务攻击、用 [Lynis](https://opensource.com/article/20/5/linux-security-lynis) 做系统分析以及创建频繁的备份相结合。

你使用哪些开源工具来保证服务器的安全？在评论中告诉我们它们的情况。

---

via: <https://opensource.com/article/21/4/securing-linux-servers>

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