互动小说及其开源简史

Summary: 了解开源如何促进互动小说的成长和发展。

很好的资料

了解开源如何促进互动小说的成长和发展。

>
> 了解开源如何促进互动小说的成长和发展。
>
>
>

![](/data/attachment/album/201908/27/142657ryf4pa2lym6fe6f1.jpg)

<ruby>   互动小说技术基金会  <rt>  Interactive Fiction Technology Foundation </rt></ruby>（IFTF） 是一个非营利组织，致力于保护和改进那些用来生成我们称之为<ruby> 互动小说 <rt>  interactive fiction </rt></ruby>的数字艺术形式的技术。当 Opensource.com 的一位社区版主提出一篇关于 IFTF、它支持的技术与服务，以及它如何与开源相交织的文章时，我发现这对于我讲了数几十年的开源故事来说是个新颖的视角。互动小说的历史比<ruby> 自由及开源软件 <rt>  Free and Open Source Software </rt></ruby>（FOSS）运动的历史还要长，但同时也与之密切相关。希望你们能喜欢我在这里的分享。

### 定义和历史

对于我来说，互动小说这个术语涵盖了读者主要通过文本与之交互的任何视频游戏或数字化艺术作品。这个术语起源于 20 世纪 80 年代，当时由语法解析器驱动的文本冒险游戏确立了什么是家用电脑娱乐，在美国主要以 [魔域](https://en.wikipedia.org/wiki/Zork)、[银河系漫游指南](https://en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy_(video_game)) 和 [Infocom](https://en.wikipedia.org/wiki/Infocom) 公司的其它佳作为代表。在 20 世纪 90 年代，它的主流商业价值被挖掘殆尽，但在线爱好者社区接过了该传统，继续发布这类游戏和游戏创建工具。

在四分之一个世纪之后的今天，互动小说包括了品种繁多并且妙趣橫生的作品，如从充满谜题的文字冒险游戏到衍生改良的超文本类型。定期举办的在线竞赛和节日为品鉴和试玩新作品提供了个好地方—英语互动小说世界每年都会举办一些活动，包括 [Spring Thing](http://www.springthing.net/) 和 [IFComp](http://ifcomp.org/)。后者是自 1995 年以来现代互动小说的核心活动，这也使它成为在同类型活动中持续举办时间最长的游戏展示活动。[IFComp 从 2017 年开始的评选和排名记录](https://ifcomp.org/comp/2017) 显示了如今基于文本的游戏在形式、风格和主题方面的惊人多样性。

（作者注：以上我特指英语，因为可能出于写作方面的技术原因，互动小说社区倾向于按语言进行区分。例如也有 [法语](http://www.fiction-interactive.fr/) 或 [意大利语](http://www.oldgamesitalia.net/content/marmellata-davventura-2018) 的互动小说年度活动，我就听说过至少一届的中文互动小说节。幸运的是，这些边界易于打破。在我管理 IFComp 的四年中，我们很欢迎来自国际社区的所有英语翻译工作。）

![“假冒的猴子”游戏截图](/data/attachment/album/201908/27/143200dmhffy912cflgfql.jpg)

*在解释器 Lectrote 上启动 Emily Short 的“假冒的猴子”新游戏（二者皆为开源软件）。*

此外由于互动小说专注于文本，它为玩家和作者都提供了最方便的平台。几乎所有能阅读数字化文本的人（包括能通过文字转语音软件等辅助技术阅读的用户）都能玩大部分的互动小说作品。同样，互动小说的创作对所有愿意学习和使用其工具和技术的作家开放。

这使我们了解了互动小说与开源的长期关系，以及从它的全盛时期以来，对于艺术形式可用性的积极影响。接下来我将概述当代开源互动小说创建工具，并讨论共享源代码的互动小说作品古老且有点稀奇的传统。

### 开源互动小说工具的世界

一些开发平台（其中大部分是开源的）可用于创建传统的语法解析器驱动互动小说，其中用户可通过输入命令（如 `向北走`、`拾取提灯`、`收养小猫` 或 `向 Zoe 询问量子机械学`）来与游戏世界交互。20 世纪 90 年代初期出现了几个<ruby> 适于魔改 <rt>  hacker-friendly </rt></ruby>的语法解析器游戏开发工具，其中目前还在使用的有 [TADS](http://tads.org/)、[Alan](https://www.alanif.se/) 和 [Quest](http://textadventures.co.uk/quest/)，它们都是开源的，并且后两者兼容 FOSS 许可证。

其中最出名的是 [Inform](http://inform7.com/)，1993 年 Graham Nelson 发布了第一个版本，目前由 Nelson 领导的一个团队进行维护。Inform 的源代码是不太寻常的半开源：Inform 6 是前一个主要版本，[它通过 Artistic 许可证开放源码](https://github.com/DavidKinder/Inform6)。这其中蕴涵着比我们所看到的更直接的相关性，因为它专有的 Inform 7 将 Inform 6 作为其核心，可以让它在将作品编译为机器码之前，将其 [杰出的自然语言语法](http://inform7.com/learn/man/RB_4_1.html#e307) （LCTT 译注：此链接已遗失）翻译为其前一代的那种更类似 C 的代码。

![inform 7 集成式开发环境截图](/data/attachment/album/201908/27/143225f3s8s28ptotxl8n3.jpg)

*Inform 7 集成式开发环境，打开了文档以及一个示例项目*

Inform 游戏运行在虚拟机上，这是 Infocom 时代的遗留产物。当时的发行者为了让同一个游戏可以运行在 Apple II、Commodore 4、Atari 800 以及其它种类的“[家用计算机](https://www.youtube.com/watch?v=bu55q_3YtOY)”上，将虚拟机作为解决方案。这些原本流行的操作系统中只有少数至今仍存在，但 Inform 的虚拟机使得它创建的作品能够通过 Inform 解释器运行在任何的计算机上。这些虚拟机包括相对现代的 [Glulx](http://ifwiki.org/index.php/Glulx)，或者通过对 Infocom 过去的虚拟机进行逆向工程克隆得到的可爱的古董 [Z-machine](http://ifwiki.org/index.php/Z-machine)。现在，流行的跨平台解释器包括如 [lectrote](https://github.com/erkyrath/lectrote) 和 [Gargoyle](https://github.com/garglk/garglk/) 等桌面程序，以及如 [Quixe](http://eblong.com/zarf/glulx/quixe/) 和 [Parchment](https://github.com/curiousdannii/parchment) 等基于浏览器的程序。以上所有均为开源软件。

如其它的流行开源项目一样，如果 Inform 的发展进程随着它的成熟而逐渐变缓，它为我们留下的最重要的财富就是其活跃透明的生态环境。对于 Inform 来说，（这些财富）包括前面提到的解释器、[一套语言扩展](https://github.com/i7/extensions)（通常混合使用 Inform 6 和 Inform 7 写成），当然也包括所有用它们写成并分享于全世界的作品，有的时候也包括那些源代码。（在这篇文章的后半部分我会回到这个话题）

互动小说创建工具发明于 21 世纪，力求在传统的语法解析器之外探索一种新的玩家交互方式，即创建任何现代 Web 浏览器都能加载的超文本驱动作品。其中的领头羊是 [Twine](http://twinery.org/)，原本由 Klimas 在 2009 年开发，目前是 [GNU 许可证开源项目](https://github.com/klembot/twinejs)，有许多贡献者正在积极开发。（事实上，[Twine](https://opensource.com/article/18/7/twine-vs-renpy-interactive-fiction) 的开源软件血统可追溯到 [TiddlyWiki](https://tiddlywiki.com/)，Klimas 的项目最初是从该项目衍生而来的）

对于互动小说开发来说，Twine 代表着一系列最开放及最可用的方法。由于它天生的 FOSS 属性，它将其输出渲染为一个自包含的网站，不依赖于需要进一步特殊解析的机器码，而是使用开放并且成熟的 HTML、CSS 和 JavaScript 标准。作为一个创建工具，Twine 能够根据创建者的技能等级，展示出与之相匹配的复杂度。拥有很少或没有编程知识的用户能够创建简单但是可玩的互动小说作品，但那些拥有更多编码和设计技能（包括通过开发 Twine 游戏获得的技能提升）的用户能够创建更复杂的项目。这也难怪近几年 Twine 在教育领域的曝光率和流行度有不小的提升。

另一些值得注意的开源互动小说开发项目包括由 Ian Millington 开发的以 MIT 许可证发布的 [Undum](https://github.com/idmillington/undum)，以及由 Dan Fabulich 和 [Choice of Games](https://www.choiceofgames.com/) 团队开发的 [ChoiceScript](https://github.com/dfabulich/choicescript)，两者也专注于将 Web 浏览器作为游戏平台。除了以上专用的开发系统以外，基于 Web 的互动小说也呈现给我们以开源作品的丰富、变幻的生态。比如 Furkle 的 [Twine 扩展工具集](https://github.com/furkle)，以及 Liza Daly 为自己的互动小说游戏创建的名为 [Windrift](https://github.com/lizadaly/windrift) 的 JavaScript 框架。

### 程序、游戏，以及游戏程序

Twine 受益于 [一个致力于提供支持的长期 IFTF 计划](http://iftechfoundation.org/committees/twine/)，公众可以为其维护和发展提供资助。IFTF 还直接支持两个长期公共服务：IFComp 和<ruby> 互动小说归档 <rt>  IF Archive </rt></ruby>，这两个服务都依赖并回馈开源软件和技术。

![Harmonia 开场截图](/data/attachment/album/201908/27/143254u7gt1mhqoeexa9ba.jpg)

*由 Liza Daly 开发的“Harmonia”的开场画面，该游戏使用 Windrift 开源互动小说创建框架创建。*

自 2014 年以来，用于运行 IFComp 网站的基于 Perl 和 JavaScript 的应用程序一直是 [一个共享源代码项目](https://github.com/iftechfoundation/ifcomp)，它反映了 [互动小说特有子组件使用的 FOSS 许可证是个大杂烩](https://github.com/iftechfoundation/ifcomp/blob/master/LICENSE.md)，其中包括那些可以让以语法解析器驱动的竞争项目在 Web 浏览器中运行的各式各样的代码库。在 1992 年上线并 [在 2017 年成为一个 IFTF 项目](http://blog.iftechfoundation.org/2017-06-30-iftf-is-adopting-the-if-archive.html) 的 <ruby>   互动小说归档  <rt>  IF Archive </rt></ruby>，是一套完全基于古老且稳定的互联网标准的镜像仓库，只使用了 [一点开源 Pyhon 脚本](https://github.com/iftechfoundation/ifarchive-ifmap-py) 用来处理索引。

### 最后，也是最有趣的部分，让我们聊聊开源文字游戏

互动小说归档的主体 [由游戏组成](https://www.ifarchive.org/indexes/if-archiveXgames)，当然，是那些历经岁月的游戏。它们反映了数十年来不断发展的游戏设计趋势和互动小说工具发展。

许多互动小说作品都共享其源代码，要快速找到它们的快速很简单 —— [在 IFDB 中搜索标签 “source available”](http://ifdb.tads.org/search?sortby=ratu&searchfor=%22source+available%22)。IFDB 是另一个长期运行的互动小说社区服务，由 TADS 的创立者 Mike Roberts 私人运营。对更加简单的界面感到舒适的用户，也可以浏览互动小说归档的 [games/source 目录](https://www.ifarchive.org/indexes/if-archiveXgamesXsource.html)，该目录按开发平台和编写语言对内容运行分组（也有很多作品，由于太繁杂或太古老而无法分类，只能浮于顶级目录）。

对这些代码共享游戏随机抽取的几个样本，揭示了一个有趣的窘境：与更广阔的开源软件世界不同，互动小说社区缺少一种普遍认同的方式来授权它生成的所有代码。与软件工具（包括我们用来创建互动小说的所有工具）不同的是，从字面意思上讲，交互式小说游戏是一件艺术作品。这意味着，将面向软件的开源许可证用于交互式小说游戏，并不会比将其用于其它像散文或诗歌作品更适合。但同样，互动小说游戏也是一个软件，它展示了创建者希望合法地与世界分享的源代码模式和技术。一个拥有开源意识的互动小说创建者会怎么做呢？

有些游戏通过将其代码放到公共领域来解决这一问题，或者通过明确的许可证，亦或者如 [42 年前由 Crowther 和 Woods 开发的“<ruby> 冒险之旅 <rt>  Adventure </rt></ruby>”](http://ifdb.tads.org/viewgame?id=fft6pu91j85y4acv) 一样通过社区发布。一些人试图将其中的不同部分分开，应用他们自己的许可证，允许免费复用游戏公开的业务逻辑，但禁止针对其散文内容的再创作。这是我在开源自己的游戏 <ruby>   莺巢  <rt>  The Warbler’s Nest </rt></ruby> 时采取的策略。天知道这是否能在法律上站得住脚，但我当时没有更好的主意。

当然，你会发现一些作品对所有部分使用单一的许可证，而不介意反对者。一个突出的例子就是 [Emily Short 的史诗作品“<ruby> 假冒的猴子 <rt>  Counterfeit Monkey </rt></ruby>”](https://github.com/i7/counterfeit-monkey)，其全部采用 Creative Commons 4.0 许可证发布。[CC 对其应用于代码感到不满](https://creativecommons.org/faq/#can-i-apply-a-creative-commons-license-to-software)，但你可以认为 [Inform 7 源码这种不寻常的散文风格特性](https://github.com/i7/counterfeit-monkey/blob/master/Counterfeit%20Monkey.materials/Extensions/Counterfeit%20Monkey/Liquids.i7x) 至少比传统的软件项目更适合 CC 许可证。

### 接下来要做什么呢，冒险者？

如果你希望开始探索互动小说的世界，这里有几个链接可供你参考：

* 如上所述，[IFDB](http://ifdb.tads.org/) 和[互动小说归档](https://ifarchive.org/)都提供了可浏览的界面，用于浏览超过 40 年价值的互动小说作品。其中大部分可以在 Web 浏览器中玩，但有些需要额外的解释器程序。IFDB 能帮助你找到并安装它们。[IFComp 的年度结果页面](https://ifcomp.org/comp/last_comp)展现了另一个视图，帮助你了解最佳的免费和归档可用作品。
* [互动小说技术基金会](http://iftechfoundation.org/)是一个非营利组织，主要帮助并支持 Twine、IFComp 和互动小说归档的发展，以及提升互动小说的无障碍功能、探索互动小说在教育领域中的应用等等。加入其[邮件列表](http://iftechfoundation.org/cgi-bin/mailman/listinfo/friends)，可以接收 IFTF 的每月资讯，浏览其[博客](http://blog.iftechfoundation.org/)，亦或浏览[一些主题商品](http://blog.iftechfoundation.org/2017-12-20-the-iftf-gift-shop-is-now-open.html)。
* 在今年的早些时候，John Paul Wohlscheid 写了这篇[关于开源互动小说工具](https://itsfoss.com/create-interactive-fiction/)的文章。它涵盖了一些这里没有提及的平台，所以如果你还想了解更多，请看一看这篇文章。

---

via: <https://opensource.com/article/18/7/interactive-fiction-tools>

作者：[Jason Mclntosh](https://opensource.com/users/jmac) 选题：[lujun9972](https://github.com/lujun9972) 译者：[cycoe](https://github.com/cycoe) 校对：[wxy](https://github.com/wxy)

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


Linux 文件系统类型导览

Summary: Linux 文件系统多年来在不断发展，让我们来看一下文件系统类型。

Linux 文件系统多年来在不断发展，让我们来看一下文件系统类型。

>
> Linux 文件系统多年来在不断发展，让我们来看一下文件系统类型。
>
>
>

![](/data/attachment/album/201908/27/175516vzrp4j4zevcqr66c.jpg)

虽然对于普通用户来说可能并不明显，但在过去十年左右的时间里，Linux 文件系统已经发生了显著的变化，这使它们能够更好对抗损坏和性能问题。

如今大多数 Linux 系统使用名为 ext4 的文件系统。 “ext” 代表“<ruby> 扩展 <rt>  extended </rt></ruby>”，“4” 表示这是此文件系统的第 4 代。随着时间的推移添加的功能包括：能够提供越来越大的文件系统（目前大到 1,000,000 TiB）和更大的文件（高达 16 TiB），更抗系统崩溃，更少碎片（将单个文件分散为存在多个位置的块）以提高性能。

ext4 文件系统还带来了对性能、可伸缩性和容量的其他改进。实现了元数据和日志校验和以增强可靠性。时间戳现在可以跟踪纳秒级变化，以便更好地对文件打戳（例如，文件创建和最后更新时间）。并且，在时间戳字段中增加了两个位，2038 年的问题（存储日期/时间的字段将从最大值翻转到零）已被推迟到了 400 多年之后（到 2446）。

### 文件系统类型

要确定 Linux 系统上文件系统的类型，请使用 `df` 命令。下面显示的命令中的 `-T` 选项显示文件系统类型。 `-h` 显示“易读的”磁盘大小。换句话说，调整报告的单位（如 M 和 G），使人们更好地理解。

```
$ df -hT | head -10
Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  2.9G     0  2.9G   0% /dev
tmpfs          tmpfs     596M  1.5M  595M   1% /run
/dev/sda1      ext4      110G   50G   55G  48% /
/dev/sdb2      ext4      457G  642M  434G   1% /apps
tmpfs          tmpfs     3.0G     0  3.0G   0% /dev/shm
tmpfs          tmpfs     5.0M  4.0K  5.0M   1% /run/lock
tmpfs          tmpfs     3.0G     0  3.0G   0% /sys/fs/cgroup
/dev/loop0     squashfs   89M   89M     0 100% /snap/core/7270
/dev/loop2     squashfs  142M  142M     0 100% /snap/hexchat/42
```

请注意，`/`（根）和 `/apps` 的文件系统都是 ext4，而 `/dev` 是 devtmpfs 文件系统（一个由内核填充的自动化设备节点）。其他的文件系统显示为 tmpfs（驻留在内存和/或交换分区中的临时文件系统）和 squashfs（只读压缩文件系统的文件系统，用于快照包）。

还有 proc 文件系统，用于存储正在运行的进程的信息。

```
$ df -T /proc
Filesystem     Type 1K-blocks  Used Available Use% Mounted on
proc           proc         0     0         0    - /proc
```

当你在整个文件系统中游览时，可能会遇到许多其他文件系统类型。例如，当你移动到目录中并想了解它的文件系统时，可以运行以下命令：

```
$ cd /dev/mqueue; df -T .
Filesystem     Type   1K-blocks  Used Available Use% Mounted on
mqueue         mqueue         0     0         0    - /dev/mqueue
$ cd /sys; df -T .
Filesystem     Type  1K-blocks  Used Available Use% Mounted on
sysfs          sysfs         0     0         0    - /sys
$ cd /sys/kernel/security; df -T .
Filesystem     Type       1K-blocks  Used Available Use% Mounted on
securityfs     securityfs         0     0         0    - /sys/kernel/security
```

与其他 Linux 命令一样，这里的 `.` 代表整个文件系统的当前位置。

这些和其他独特的文件系统提供了一些特殊功能。例如，securityfs 提供支持安全模块的文件系统。

Linux 文件系统需要能够抵抗损坏，能够承受系统崩溃并提供快速、可靠的性能。由几代 ext 文件系统和新一代专用文件系统提供的改进使 Linux 系统更易于管理和更可靠。

---

via: <https://www.networkworld.com/article/3432990/a-guided-tour-of-linux-file-system-types.html>

作者：[Sandra Henry-Stocker](https://www.networkworld.com/author/Sandra-Henry_Stocker/) 选题：[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/) 荣誉推出


区块链 2.0：Hyperledger 项目简介（八）

Summary: 多年来，Linux 基金会已经在旗下开展了许多项目。Hyperledger 项目是迄今为止发展最快的项目。

![](/data/attachment/album/201908/27/232148vi6jiveiu2svceut.png)

一旦一个新技术平台在积极发展和商业利益方面达到了一定程度的受欢迎程度，全球的主要公司和小型的初创企业都急于抓住这块蛋糕。在当时 Linux 就是这样的一个平台。一旦实现了其应用程序的普及，个人、公司和机构就开始对其表现出兴趣，到 2000 年，Linux 基金会就成立了。

Linux 基金会旨在通过赞助他们的开发团队来将 Linux 作为一个平台来标准化和发展。Linux 基金会是一个由软件和 IT 巨头（[如微软、甲骨文、三星、思科、 IBM 、英特尔等](https://www.theinquirer.net/inquirer/news/2182438/samsung-takes-seat-intel-ibm-linux-foundation)）支持的非营利组织。这不包括为改进该平台而提供服务的数百名个人开发者。多年来，Linux 基金会已经在旗下开展了许多项目。**Hyperledger** 项目是迄今为止发展最快的项目。

在将技术推进至可用且有用的方面上，这种联合主导的开发具有很多优势。为大型项目提供开发标准、库和所有后端协议既昂贵又耗费资源，而且不会从中产生丝毫收入。因此，对于公司来说，通过支持这些组织来汇集他们的资源来开发常见的那些 “烦人” 部分是有很意义的，以及随后完成这些标准部分的工作以简单地即插即用和定制他们的产品。除了这种模型的经济性之外，这种合作努力还产生了标准，使其容易使用和集成到优秀的产品和服务中。

上述联盟模式，在曾经或当下的创新包括 WiFi（Wi-Fi 联盟）、移动电话等标准。

### Hyperledger 项目（HLP）简介

Hyperledger 项目（HLP）于 2015 年 12 月由 Linux 基金会启动，目前是其孵化的增长最快的项目之一。它是一个<ruby> 伞式组织 <rt>  umbrella organization </rt></ruby>，用于合作开发和推进基于[区块链](/article-10650-1.html)的分布式账本技术 (DLT) 的工具和标准。支持该项目的主要行业参与者包括 IBM、英特尔 和 SAP Ariba [等](https://www.hyperledger.org/members)。HLP 旨在为个人和公司创建框架，以便根据需要创建共享和封闭的区块链，以满足他们自己的需求。其设计原则是开发一个专注于隐私和未来可审计性的全球可部署、可扩展、强大的区块链平台。   1  同样要注意的是大多数提出的区块链及其框架。

### 开发目标和构造：即插即用

虽然面向企业的平台有以太坊联盟之类的产品，但根据定义，HLP 是面向企业的，并得到行业巨头的支持，他们在 HLP 旗下的许多模块中做出贡献并进一步发展。HLP 还孵化开发的周边项目，并这些创意项目推向公众。HLP 的成员贡献了他们自己的力量，例如 IBM 为如何协作开发贡献了他们的 Fabric 平台。该代码库由 IBM 在其项目组内部研发，并开源出来供所有成员使用。

这些过程使得 HLP 中的模块具有高度灵活的插件框架，这将支持企业环境中的快速开发和部署。此外，默认情况下，其他对比的平台是开放的<ruby> 免许可链 <rt>  permission-less blockchain </rt></ruby>或是<ruby> 公有链 <rt>  public blockchain </rt></ruby>，甚至可以将它们应用到特定应用当中。HLP 模块本身支持该功能。

有关公有链和私有链的差异和用例更多地涵盖在[这篇](/article-11080-1.html)比较文章当中。

根据该项目执行董事 Brian Behlendorf 的说法，Hyperledger 项目的使命有四个。

分别是：

1. 创建企业级 DLT 框架和标准，任何人都可以移植以满足其特定的行业或个人需求。
2. 创建一个强大的开源社区来帮助生态系统发展。
3. 促进所述的生态系统的行业成员（如成员公司）的参与。
4. 为 HLP 社区提供中立且无偏见的基础设施，以收集和分享相关的更新和发展。

可以在这里访问[原始文档](http://www.hitachi.com/rev/archive/2017/r2017_01/expert/index.html)。

### HLP 的架构

HLP 由 12 个项目组成，这些项目被归类为独立的模块，每个项目通常都是结构化的，可以独立开发其模块的。在孵化之前，首先对它们的能力和活力进行研究。该组织的任何成员都可以提出附加建议。在项目孵化后，就会进行积极开发，然后才会推出。这些模块之间的互操作性具有很高的优先级，因此这些组之间的定期通信由社区维护。目前，这些项目中有 4 个被归类为活跃项目。被标为活跃意味着它们已经准备好使用，但还没有准备好发布主要版本。这 4 个模块可以说是推动区块链革命的最重要或相当基本的模块。稍后，我们将详细介绍各个模块及其功能。然而，Hyperledger Fabric 平台的简要描述，可以说是其中最受欢迎的。

### Hyperledger Fabric

Hyperledger Fabric 是一个完全开源的、基于区块链的许可 (非公开) DLT 平台，设计时考虑了企业的使用。该平台提供了适合企业环境的功能和结构。它是高度模块化的，允许开发人员在不同的共识协议、链上代码协议（[智能合约](/article-10956-1.html)）或身份管理系统等中进行选择。这是一个基于区块链的许可平台，它利用身份管理系统，这意味着参与者将知道彼此在企业环境中的身份。Fabric 允许以各种主流编程语言 (包括 Java、Javascript、Go 等) 开发智能合约（“<ruby> 链码 <rt>  chaincode </rt></ruby>”，是 Hyperledger 团队使用的术语）。这使得机构和企业可以利用他们在该领域的现有人才，而无需雇佣或重新培训开发人员来开发他们自己的智能合约。与标准订单验证系统相比，Fabric 还使用<ruby> 执行顺序验证 <rt>  execute-order-validate </rt></ruby>系统来处理智能合约，以提供更好的可靠性，这些系统由提供智能合约功能的其他平台使用。与标准订单验证系统相比，Fabric还使用执行顺序验证系统来处理智能合约，以提供更好的可靠性，这些系统由提供智能合约功能的其他平台使用。Fabric 的其他功能还有可插拔性能、身份管理系统、数据库管理系统、共识平台等，这些功能使它在竞争中保持领先地位。

### 结论

诸如 Hyperledger Fabric 平台这样的项目能够在主流用例中更快地采用区块链技术。Hyperledger 社区结构本身支持开放治理原则，并且由于所有项目都是作为开源平台引导的，因此这提高了团队在履行承诺时表现出来的安全性和责任感。

由于此类项目的主要应用涉及与企业合作及进一步开发平台和标准，因此 Hyperledger 项目目前在其他类似项目前面处于有利地位。

---

1. E. Androulaki et al., “Hyperledger Fabric: A Distributed Operating System for Permissioned Blockchains,” 2018. [↩](#fnref1)

---

via: <https://www.ostechnix.com/blockchain-2-0-an-introduction-to-hyperledger-project-hlp/>

作者：[ostechnix](https://www.ostechnix.com/author/editor/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[zionfuo](https://github.com/zionfuo) 校对：[wxy](https://github.com/wxy)

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


如何使用 sed 命令删除文件中的行

Summary: sed 命令是 Linux 中的重要命令之一，在文件处理方面有着重要作用。可用于删除或移动与给定模式匹配的特定行。

感觉不如Ctrl+F好用啊，sed功能复杂，万一删除错了就gg了

![](/data/attachment/album/201908/28/100204ei6v98sa69hdf3zf.jpg)

Sed 代表<ruby> 流编辑器 <rt>  Stream Editor </rt></ruby>，常用于 Linux 中基本的文本处理。`sed` 命令是 Linux 中的重要命令之一，在文件处理方面有着重要作用。可用于删除或移动与给定模式匹配的特定行。

它还可以删除文件中的特定行，它能够从文件中删除表达式，文件可以通过指定分隔符（例如逗号、制表符或空格）进行标识。

本文列出了 15 个使用范例，它们可以帮助你掌握 `sed` 命令。

如果你能理解并且记住这些命令，在你需要使用 `sed` 时，这些命令就能派上用场，帮你节约很多时间。

注意：为了方便演示，我在执行 `sed` 命令时，不使用 `-i` 选项（因为这个选项会直接修改文件内容），被移除了行的文件内容将打印到 Linux 终端。

但是，如果你想在实际环境中从源文件中删除行，请在 `sed` 命令中使用 `-i` 选项。

演示之前，我创建了 `sed-demo.txt` 文件，并添加了以下内容和相应行号以便更好地理解。

```
# cat sed-demo.txt

1 Linux Operating System
2 Unix Operating System
3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE
```

### 1) 如何删除文件的第一行？

使用以下语法删除文件首行。

`N` 表示文件中的第 N 行，`d` 选项在 `sed` 命令中用于删除一行。

语法：

```
sed 'Nd' file
```

使用以下 `sed` 命令删除 `sed-demo.txt` 中的第一行。

```
# sed '1d' sed-demo.txt

2 Unix Operating System
3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE
```

### 2) 如何删除文件的最后一行？

使用以下语法删除文件最后一行。

`$` 符号表示文件的最后一行。

使用以下 `sed` 命令删除 `sed-demo.txt` 中的最后一行。

```
# sed '$d' sed-demo.txt

1 Linux Operating System
2 Unix Operating System
3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux
7 CentOS
8 Debian
9 Ubuntu
```

### 3) 如何删除指定行？

使用以下 `sed` 命令删除 `sed-demo.txt` 中的第 3 行。

```
# sed '3d' sed-demo.txt

1 Linux Operating System
2 Unix Operating System
4 Red Hat
5 Fedora
6 Arch Linux
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE
```

### 4) 如何删除指定范围内的行？

使用以下 `sed` 命令删除 `sed-demo.txt` 中的第 5 到 7 行。

```
# sed '5,7d' sed-demo.txt

1 Linux Operating System
2 Unix Operating System
3 RHEL
4 Red Hat
8 Debian
9 Ubuntu
10 openSUSE
```

### 5) 如何删除多行内容？

`sed` 命令能够删除给定行的集合。

本例中，下面的 `sed` 命令删除了第 1 行、第 5 行、第 9 行和最后一行。

```
# sed '1d;5d;9d;$d' sed-demo.txt

2 Unix Operating System
3 RHEL
4 Red Hat
6 Arch Linux
7 CentOS
8 Debian
```

### 5a) 如何删除指定范围以外的行？

使用以下 `sed` 命令删除 `sed-demo.txt` 中第 3 到 6 行范围以外的所有行。

```
# sed '3,6!d' sed-demo.txt

3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux
```

### 6) 如何删除空行？

使用以下 `sed` 命令删除 `sed-demo.txt` 中的空行。

```
# sed '/^$/d' sed-demo.txt

1 Linux Operating System
2 Unix Operating System
3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE
```

### 7) 如何删除包含某个模式的行？

使用以下 `sed` 命令删除 `sed-demo.txt` 中匹配到 `System` 模式的行。

```
# sed '/System/d' sed-demo.txt

3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE
```

### 8) 如何删除包含字符串集合中某个字符串的行？

使用以下 `sed` 命令删除 `sed-demo.txt` 中匹配到 `System` 或 `Linux` 表达式的行。

```
# sed '/System\|Linux/d' sed-demo.txt

3 RHEL
4 Red Hat
5 Fedora
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE
```

### 9) 如何删除以指定字符开头的行？

为了测试，我创建了 `sed-demo-1.txt` 文件，并添加了以下内容。

```
# cat sed-demo-1.txt

Linux Operating System
Unix Operating System
RHEL
Red Hat
Fedora
debian
ubuntu
Arch Linux - 1
2 - Manjaro
3 4 5 6
```

使用以下 `sed` 命令删除以 `R` 字符开头的所有行。

```
# sed '/^R/d' sed-demo-1.txt

Linux Operating System
Unix Operating System
Fedora
debian
ubuntu
Arch Linux - 1
2 - Manjaro
3 4 5 6
```

使用以下 `sed` 命令删除 `R` 或者 `F` 字符开头的所有行。

```
# sed '/^[RF]/d' sed-demo-1.txt

Linux Operating System
Unix Operating System
debian
ubuntu
Arch Linux - 1
2 - Manjaro
3 4 5 6
```

### 10) 如何删除以指定字符结尾的行？

使用以下 `sed` 命令删除 `m` 字符结尾的所有行。

```
# sed '/m$/d' sed-demo.txt

3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE
```

使用以下 `sed` 命令删除 `x` 或者 `m` 字符结尾的所有行。

```
# sed '/[xm]$/d' sed-demo.txt

3 RHEL
4 Red Hat
5 Fedora
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE
```

### 11) 如何删除所有大写字母开头的行？

使用以下 `sed` 命令删除所有大写字母开头的行。

```
# sed '/^[A-Z]/d' sed-demo-1.txt

debian
ubuntu
2 - Manjaro
3 4 5 6
```

### 12) 如何删除指定范围内匹配模式的行？

使用以下 `sed` 命令删除第 1 到 6 行中包含 `Linux` 表达式的行。

```
# sed '1,6{/Linux/d;}' sed-demo.txt

2 Unix Operating System
3 RHEL
4 Red Hat
5 Fedora
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE
```

### 13) 如何删除匹配模式的行及其下一行？

使用以下 `sed` 命令删除包含 `System` 表达式的行以及它的下一行。

```
# sed '/System/{N;d;}' sed-demo.txt

3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE
```

### 14) 如何删除包含数字的行？

使用以下 `sed` 命令删除所有包含数字的行。

```
# sed '/[0-9]/d' sed-demo-1.txt

Linux Operating System
Unix Operating System
RHEL
Red Hat
Fedora
debian
ubuntu
```

使用以下 `sed` 命令删除所有以数字开头的行。

```
# sed '/^[0-9]/d' sed-demo-1.txt

Linux Operating System
Unix Operating System
RHEL
Red Hat
Fedora
debian
ubuntu
Arch Linux - 1
```

使用以下 `sed` 命令删除所有以数字结尾的行。

```
# sed '/[0-9]$/d' sed-demo-1.txt

Linux Operating System
Unix Operating System
RHEL
Red Hat
Fedora
debian
ubuntu
2 - Manjaro
```

### 15) 如何删除包含字母的行？

使用以下 `sed` 命令删除所有包含字母的行。

```
# sed '/[A-Za-z]/d' sed-demo-1.txt

3 4 5 6
```

---

via: <https://www.2daygeek.com/linux-remove-delete-lines-in-file-sed-command/>

作者：[Magesh Maruthamuthu](https://www.2daygeek.com/author/magesh/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[hello-wn](https://github.com/hello-wn) 校对：[wxy](https://github.com/wxy)

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


使用 KeePassXC 管理凭据

Summary: KeePassXC，这是一个简单的多平台开源软件，它使用本地文件作为数据库。

KeePassXC，这是一个简单的多平台开源软件，它使用本地文件作为数据库。

![](/data/attachment/album/201908/28/235054p88cqs1n088qunuv.png)

[上一篇文章](/article-11181-1.html)我们讨论了使用服务器端技术的密码管理工具。这些工具非常有趣而且适合云安装。在本文中，我们将讨论 KeePassXC，这是一个简单的多平台开源软件，它使用本地文件作为数据库。

这种密码管理软件的主要优点是简单。无需服务器端技术专业知识，因此可供任何类型的用户使用。

### 介绍 KeePassXC

KeePassXC 是一个开源的跨平台密码管理器：它是作为 KeePassX 的一个分支开始开发的，这是个不错的产品，但开发不是非常活跃。它使用 256 位密钥的 AES 算法将密钥保存在加密数据库中，这使得在云端设备（如 pCloud 或 Dropbox）中保存数据库相当安全。

除了密码，KeePassXC 还允许你在加密皮夹中保存各种信息和附件。它还有一个有效的密码生成器，可以帮助用户正确地管理他的凭据。

### 安装

这个程序在标准的 Fedora 仓库和 Flathub 仓库中都有。不幸的是，在沙箱中运行的程序无法使用浏览器集成，所以我建议通过 dnf 安装程序：

```
sudo dnf install keepassxc
```

### 创建你的皮夹

要创建新数据库，有两个重要步骤：

* 选择加密设置：默认设置相当安全，增加转换轮次也会增加解密时间。
* 选择主密钥和额外保护：主密钥必须易于记忆（如果丢失它，你的皮夹就会丢失！）而足够强大，一个至少有 4 个随机单词的密码可能是一个不错的选择。作为额外保护，你可以选择密钥文件（请记住：你必须始终都有它，否则无法打开皮夹）和/或 YubiKey 硬件密钥。

![](/data/attachment/album/201908/28/235055l75s737xg5skazax.png)

![](/data/attachment/album/201908/28/235056q8s8iedfmcdqs6my.png)

数据库文件将保存到文件系统。如果你想与其他计算机/设备共享，可以将它保存在 U 盘或 pCloud 或 Dropbox 等云存储中。当然，如果你选择云存储，建议使用特别强大的主密码，如果有额外保护则更好。

### 创建你的第一个条目

创建数据库后，你可以开始创建第一个条目。对于 Web 登录，请在“条目”选项卡中输入用户名、密码和 URL。你可以根据个人策略指定凭据的到期日期，也可以通过按右侧的按钮下载网站的 favicon 并将其关联为条目的图标，这是一个很好的功能。

![](/data/attachment/album/201908/28/235056xq6mror77mpbp7do.png)

![](/data/attachment/album/201908/28/235057e8zhb568qnlboa1b.png)

KeePassXC 还提供了一个很好的密码/口令生成器，你可以选择长度和复杂度，并检查对暴力攻击的抵抗程度：

![](/data/attachment/album/201908/28/235058yvg15aax2u9yp5a6.png)

### 浏览器集成

KeePassXC 有一个适用于所有主流浏览器的扩展。该扩展允许你填写所有已指定 URL 条目的登录信息。

必须在 KeePassXC（工具菜单 -> 设置）上启用浏览器集成，指定你要使用的浏览器：

![](/data/attachment/album/201908/28/235059cox1m2xjrrr1qkhl.png)

安装扩展后，必须与数据库建立连接。要执行此操作，请按扩展按钮，然后按“连接”按钮：如果数据库已打开并解锁，那么扩展程序将创建关联密钥并将其保存在数据库中，该密钥对于浏览器是唯一的，因此我建议对它适当命名：

![](/data/attachment/album/201908/28/235059fuvn8hblq7h4zbzn.png)

当你打开 URL 字段中的登录页并且数据库是解锁的，那么这个扩展程序将为你提供与该页面关联的所有凭据：

![](/data/attachment/album/201908/28/235100d85z8c8w5m5wm8fm.png)

通过这种方式，你可以通过 KeePassXC 获取互联网凭据，而无需将其保存在浏览器中。

### SSH 代理集成

KeePassXC 的另一个有趣功能是与 SSH 集成。如果你使用 ssh 代理，KeePassXC 能够与之交互并添加你上传的 ssh 密钥到条目中。

首先，在常规设置（工具菜单 -> 设置）中，你必须启用 ssh 代理并重启程序：

![](/data/attachment/album/201908/28/235100ev8ram8n85r4ybxq.png)

此时，你需要以附件方式上传你的 ssh 密钥对到条目中。然后在 “SSH 代理” 选项卡中选择附件下拉列表中的私钥，此时会自动填充公钥。不要忘记选择上面的两个复选框，以便在数据库打开/解锁时将密钥添加到代理，并在数据库关闭/锁定时删除：

![](/data/attachment/album/201908/28/235101nwhbfbrl9xiifuun.png)

现在打开和解锁数据库，你可以使用皮夹中保存的密钥登录 ssh。

唯一的限制是可以添加到代理的最大密钥数：ssh 服务器默认不接受超过 5 次登录尝试，出于安全原因，建议不要增加此值。

---

via: <https://fedoramagazine.org/managing-credentials-with-keepassxc/>

作者：[Marco Sarti](https://fedoramagazine.org/author/msarti/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

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


学习 Python 的 12 个方式

Summary: 这些资源将帮助你入门并熟练掌握 Python。

这些资源将帮助你入门并熟练掌握 Python。

>
> 这些资源将帮助你入门并熟练掌握 Python。
>
>
>

![](/data/attachment/album/201908/29/083446r00gdsohb7lwxdxy.jpg)

Python 是世界上[最受欢迎的](https://insights.stackoverflow.com/survey/2019#most-popular-technologies)编程语言之一，它受到了全世界各地的开发者和创客的欢迎。大多数 Linux 和 MacOS 计算机都预装了某个版本的 Python，现在甚至一些 Windows 计算机供应商也开始安装 Python 了。

也许你尚未学会它，想学习但又不知道在哪里入门。这里的 12 个资源将帮助你入门并熟练掌握 Python。

### 课程、书籍、文章和文档

1、[Python 软件基金会](https://www.python.org/)提供了出色的信息和文档，可帮助你迈上编码之旅。请务必查看 [Python 入门指南](https://www.python.org/about/gettingstarted/)。它将帮助你得到最新版本的 Python，并提供有关编辑器和开发环境的有用提示。该组织还有可以来进一步指导你的[优秀文档](https://docs.python.org/3/)。

2、我的 Python 旅程始于[海龟模块](https://opensource.com/life/15/8/python-turtle-graphics)。我首先在 Bryson Payne 的《[教你的孩子编码](https://opensource.com/education/15/9/review-bryson-payne-teach-your-kids-code)》中找到了关于 Python 和海龟的内容。这本书是一个很好的资源，购买这本书可以让你看到几十个示例程序，这将激发你的编程好奇心。Payne 博士还在 [Udemy](https://www.udemy.com/teach-your-kids-to-code/) 上以相同的名称开设了一门便宜的课程。

3、Payne 博士的书激起了我的好奇心，我渴望了解更多。这时我发现了 Al Sweigart 的《[用 Python 自动化无聊的东西](https://automatetheboringstuff.com/)》。你可以购买这本书，也可以使用它的在线版本，它与印刷版完全相同且可根据知识共享许可免费获得和分享。Al 的这本书让我学习到了 Python 的基础知识、函数、列表、字典和如何操作字符串等等。这是一本很棒的书，我已经购买了许多本捐赠给了当地图书馆。Al 还提供 [Udemy](https://www.udemy.com/automate/?couponCode=PAY_10_DOLLARS) 课程；使用他的网站上的优惠券代码，只需 10 美元即可参加。

4、Eric Matthes 撰写了《[Python 速成](https://nostarch.com/pythoncrashcourse2e)》，这是由 No Starch Press 出版的 Python 的逐步介绍（如同上面的两本书）。Matthes 还有一个很棒的[伴侣网站](https://ehmatthes.github.io/pcc/)，其中包括了如何在你的计算机上设置 Python 以及一个用以简化学习曲线的[速查表](https://ehmatthes.github.io/pcc/cheatsheets/README.html)。

5、[Python for Everybody](https://www.py4e.com/) 是另一个很棒的 Python 学习资源。该网站可以免费访问 [Charles Severance](http://www.dr-chuck.com/dr-chuck/resume/bio.htm) 的 Coursera 和 edX 认证课程的资料。该网站分为入门、课程和素材等部分，其中 17 个课程按从安装到数据可视化的主题进行分类组织。Severance（[@drchuck on Twitter](https://twitter.com/drchuck/)），是密歇根大学信息学院的临床教授。

6、[Seth Kenlon](https://opensource.com/users/seth)，我们 Opensource.com 的 Python 大师，撰写了大量关于 Python 的文章。Seth 有很多很棒的文章，包括“[用 JSON 保存和加载 Python 数据](/article-11133-1.html)”，“[用 Python 学习面向对象编程](https://opensource.com/article/19/7/get-modular-python-classes)”，“[在 Python 游戏中用 Pygame 放置平台](/article-10902-1.html)”，等等。

### 在设备上使用 Python

7、最近我对 [Circuit Playground Express](https://opensource.com/article/19/7/circuit-playground-express) 非常感兴趣，这是一个运行 [CircuitPython](https://circuitpython.org/) 的设备，CircuitPython 是为微控制器设计的 Python 编程语言的子集。我发现 Circuit Playground Express 和 CircuitPython 是向学生介绍 Python（以及一般编程）的好方法。它的制造商 Adafruit 有一个很好的[系列教程](https://learn.adafruit.com/welcome-to-circuitpython)，可以让你快速掌握 CircuitPython。

8、[BBC:Microbit](https://opensource.com/article/19/8/getting-started-bbc-microbit) 是另一种入门 Python 的好方法。你可以学习如何使用 [MicroPython](https://micropython.org/) 对其进行编程，这是另一种用于编程微控制器的 Python 实现。

9、学习 Python 的文章如果没有提到[树莓派](https://www.raspberrypi.org/)单板计算机那是不完整的。一旦你有了[舒适](https://projects.raspberrypi.org/en/pathways/getting-started-with-raspberry-pi)而强大的树莓派，你就可以在 Opensource.com 上找到[成吨的](https://opensource.com/sitewide-search?search_api_views_fulltext=Raspberry%20Pi)使用它的灵感，包括“[7 个值得探索的树莓派项目](https://opensource.com/article/19/3/raspberry-pi-projects)”，“[在树莓派上复活 Amiga](https://opensource.com/article/19/3/amiga-raspberry-pi)”，和“[如何使用树莓派作为 VPN 服务器](https://opensource.com/article/19/6/raspberry-pi-vpn-server)”。

10、许多学校为学生提供了 iOS 设备以支持他们的教育。在尝试帮助这些学校的老师和学生学习用 Python 编写代码时，我发现了 [Trinket.io](https://trinket.io/)。Trinket 允许你在浏览器中编写和执行 Python 3 代码。 Trinket 的 [Python 入门](https://docs.trinket.io/getting-started-with-python#/welcome/where-we-ll-go)教程将向你展示如何在 iOS 设备上使用 Python。

### 播客

11、我喜欢在开车的时候听播客，我在 Kelly Paredes 和 Sean Tibor 的 [Teaching Python](https://www.teachingpython.fm/) 播客上找到了大量的信息。他们的内容很适合教育领域。

12、如果你正在寻找一些更通用的东西，我推荐 Michael Kennedy 的 [Talk Python to Me](https://talkpython.fm/) 播客。它提供了有关 Python 及相关技术的最佳信息。

你学习 Python 最喜欢的资源是什么？请在评论中分享。

计算机编程可能是一个有趣的爱好，正如我以前在 Apple II 计算机上编程时所学到的……

---

via: <https://opensource.com/article/19/8/dozen-ways-learn-python>

作者：[Don Watkins](https://opensource.com/users/don-watkins) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


如何在 Ubuntu 上安装 VirtualBox

>
> 本新手教程解释了在 Ubuntu 和其他基于 Debian 的 Linux 发行版上安装 VirtualBox 的各种方法。
>
>
>

![](/data/attachment/album/201908/30/072113uzitwinnt9betilt.jpg)

Oracle 公司的自由开源产品 [VirtualBox](https://www.virtualbox.org) 是一款出色的虚拟化工具，专门用于桌面操作系统。与另一款虚拟化工具 [Linux 上的 VMWare Workstation](https://itsfoss.com/install-vmware-player-ubuntu-1310/) 相比起来，我更喜欢它。

你可以使用 VirtualBox 等虚拟化软件在虚拟机中安装和使用其他操作系统。

例如，你可以[在 Windows 上的 VirtualBox 中安装 Linux](https://itsfoss.com/install-linux-in-virtualbox/)。同样地，你也可以[用 VirtualBox 在 Linux 中安装 Windows](https://itsfoss.com/install-windows-10-virtualbox-linux/)。

你也可以用 VirtualBox 在你当前的 Linux 系统中安装别的 Linux 发行版。事实上，这就是我用它的原因。如果我听说了一个不错的 Linux 发行版，我会在虚拟机上测试它，而不是安装在真实的系统上。当你想要在安装之前尝试一下别的发行版时，用虚拟机会很方便。

![Linux installed inside Linux using VirtualBox](/data/attachment/album/201908/30/072130kbmodg4aimlorlyr.png)

*安装在 Ubuntu 18.04 内的 Ubuntu 18.10*

在本新手教程中，我将向你展示在 Ubuntu 和其他基于 Debian 的 Linux 发行版上安装 VirtualBox 的各种方法。

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

这里提出的安装方法也适用于其他基于 Debian 和 Ubuntu 的 Linux 发行版，如 Linux Mint、elementar OS 等。

#### 方法 1：从 Ubuntu 仓库安装 VirtualBox

**优点**：安装简便

**缺点**：较旧版本

在 Ubuntu 上下载 VirtualBox 最简单的方法可能是从软件中心查找并下载。

![VirtualBox in Ubuntu Software Center](/data/attachment/album/201908/30/072131ch9j0c880jhjw738.jpg)

*VirtualBox 在 Ubuntu 软件中心提供*

你也可以使用这条命令从命令行安装：

```
sudo apt install virtualbox
```

然而，如果[在安装前检查软件包版本](https://itsfoss.com/know-program-version-before-install-ubuntu/)，你会看到 Ubuntu 仓库提供的 VirtualBox 版本已经很老了。

举个例子，在写下本教程时 VirtualBox 的最新版本是 6.0，但是在软件中心提供的是 5.2。这意味着你无法获得[最新版 VirtualBox](https://itsfoss.com/oracle-virtualbox-release/) 中引入的新功能。

#### 方法 2：使用 Oracle 网站上的 Deb 文件安装 VirtualBox

**优点**：安装简便，最新版本

**缺点**：不能更新

如果你想要在 Ubuntu 上使用 VirtualBox 的最新版本，最简单的方法就是[使用 Deb 文件](https://itsfoss.com/install-deb-files-ubuntu/)。

Oracle 为 VirtiualBox 版本提供了开箱即用的二进制文件。如果查看其下载页面，你将看到为 Ubuntu 和其他发行版下载 deb 安装程序的选项。

![VirtualBox Linux Download](/data/attachment/album/201908/30/072133lry2zkcs8ggj22mf.jpg)

你只需要下载 deb 文件并双击它即可安装。就是这么简单。

* [下载 virtualbox for Ubuntu](https://www.virtualbox.org/wiki/Linux_Downloads)

然而，这种方法的问题在于你不能自动更新到最新的 VirtualBox 版本。唯一的办法是移除现有版本，下载最新版本并再次安装。不太方便，是吧？

#### 方法 3：用 Oracle 的仓库安装 VirtualBox

**优点**：自动更新

**缺点**：安装略微复杂

现在介绍的是命令行安装方法，它看起来可能比较复杂，但与前两种方法相比，它更具有优势。你将获得 VirtualBox 的最新版本，并且未来它还将自动更新到更新的版本。我想那就是你想要的。

要通过命令行安装 VirtualBox，请在你的仓库列表中添加 Oracle VirtualBox 的仓库。添加 GPG 密钥以便你的系统信任此仓库。现在，当你安装 VirtualBox 时，它会从 Oracle 仓库而不是 Ubuntu 仓库安装。如果发布了新版本，本地 VirtualBox 将跟随一起更新。让我们看看怎么做到这一点：

首先，添加仓库的密钥。你可以通过这一条命令下载和添加密钥：

```
wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -
```

>
> Mint 用户请注意：
>
>
> 下一步只适用于 Ubuntu。如果你使用的是 Linux Mint 或其他基于 Ubuntu 的发行版，请将命令行中的 `$(lsb_release -cs)` 替换成你当前版本所基于的 Ubuntu 版本。例如，Linux Mint 19 系列用户应该使用 bionic，Mint 18 系列用户应该使用 xenial，像这样：
>
>
>
> ```
> sudo add-apt-repository “deb [arch=amd64] <http://download.virtualbox.org/virtualbox/debian> **bionic** contrib“`
> ```
>
>

现在用以下命令来将 Oracle VirtualBox 仓库添加到仓库列表中：

```
sudo add-apt-repository "deb [arch=amd64] http://download.virtualbox.org/virtualbox/debian $(lsb_release -cs) contrib"
```

如果你有读过我的文章[检查 Ubuntu 版本](https://itsfoss.com/how-to-know-ubuntu-unity-version/)，你大概知道 `lsb_release -cs` 将打印你的 Ubuntu 系统的代号。

**注**：如果你看到 “[add-apt-repository command not found](https://itsfoss.com/add-apt-repository-command-not-found/)” 错误，你需要下载 `software-properties-common` 包。

现在你已经添加了正确的仓库，请通过此仓库刷新可用包列表并安装 VirtualBox:

```
sudo apt update && sudo apt install virtualbox-6.0
```

**提示**：一个好方法是输入 `sudo apt install virtualbox-` 并点击 `tab` 键以查看可用于安装的各种 VirtualBox 版本，然后通过补全命令来选择其中一个版本。

![Install VirtualBox via terminal](/data/attachment/album/201908/30/072134ayk88mgmk8772882.png)

### 如何从 Ubuntu 中删除 VirtualBox

现在你已经学会了如何安装 VirtualBox，我还想和你提一下删除它的步骤。

如果你是从软件中心安装的，那么删除它最简单的方法是从软件中心下手。你只需要在[已安装的应用程序列表](https://itsfoss.com/list-installed-packages-ubuntu/)中找到它，然后单击“删除”按钮。

另一种方式是使用命令行：

```
sudo apt remove virtualbox virtualbox-*
```

请注意，这不会删除你用 VirtualBox 安装的操作系统关联的虚拟机和文件。这并不是一件坏事，因为你可能希望以后或在其他系统中使用它们是安全的。

### 最后…

我希望你能在以上方法中选择一种安装 VirtualBox。我还将在另一篇文章中写到如何有效地使用 VirtualBox。目前，如果你有点子、建议或任何问题，请随时在下面发表评论。

---

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

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

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


如何在 Ubuntu 中修复 VirtualBox 的 “Kernel driver not installed (rc=-1908)” 错

Summary: 仔细阅读这两个错误消息后，我意识到我应该更新 Virtualbox 程序。

我也是遇到相同的情况，但是更新之后，仍旧存在相同的情况。。没法解决

看了很多文章，就你这个有效！万分感谢！

仔细阅读这两个错误消息后，我意识到我应该更新 Virtualbox 程序。

![](/data/attachment/album/201908/30/073055amfn5ihxzicuiew3.jpg)

我使用 Oracle VirtualBox 来测试各种 Linux 和 Unix 发行版。到目前为止，我已经在 VirtualBox 中测试了上百个虚拟机。今天，我在我的 Ubuntu 18.04 桌面上启动了 Ubuntu 18.04 服务器版虚拟机，我收到了以下错误。

```
Kernel driver not installed (rc=-1908)

The VirtualBox Linux kernel driver (vboxdrv) is either not loaded or there is a permission problem with /dev/vboxdrv. Please reinstall virtualbox-dkms package and load the kernel module by executing

'modprobe vboxdrv'

as root.

where: suplibOsInit what: 3 VERR_VM_DRIVER_NOT_INSTALLED (-1908) - The support driver is not installed. On linux, open returned ENOENT.
```

![](/data/attachment/album/201908/30/073109gi5icjrtrtahtrj0.png)

*Ubuntu 中的 “Kernel driver not installed (rc=-1908)” 错误*

我点击了 OK 关闭消息框，然后在后台看到了另一条消息。

```
Failed to open a session for the virtual machine Ubuntu 18.04 LTS Server.

The virtual machine 'Ubuntu 18.04 LTS Server' has terminated unexpectedly during startup with exit code 1 (0x1).

Result Code:
NS_ERROR_FAILURE (0x80004005)
Component:
MachineWrap
Interface:
IMachine {85cd948e-a71f-4289-281e-0ca7ad48cd89}
```

![](/data/attachment/album/201908/30/073110qnbkel88kjevvmlz.png)

*启动期间虚拟机意外终止，退出代码为 1（0x1）*

我不知道该先做什么。我运行以下命令来检查是否有用。

```
$ sudo modprobe vboxdrv
```

我收到了这个错误：

```
modprobe: FATAL: Module vboxdrv not found in directory /lib/modules/5.0.0-23-generic
```

仔细阅读这两个错误消息后，我意识到我应该更新 Virtualbox 程序。

如果你在 Ubuntu 及其衍生版（如 Linux Mint）中遇到此错误，你只需使用以下命令重新安装或更新 `virtualbox-dkms` 包：

```
$ sudo apt install virtualbox-dkms
```

或者，最好更新整个系统：

```
$ sudo apt upgrade
```

错误消失了，我可以正常在 VirtualBox 中启动虚拟机了。

---

via: <https://www.ostechnix.com/how-to-fix-kernel-driver-not-installed-rc-1908-virtualbox-error-in-ubuntu/>

作者：[sk](https://www.ostechnix.com/author/sk/) 选题：[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/) 荣誉推出


如何转职为 DevOps 工程师

>
> 无论你是刚毕业的大学生，还是想在职业中寻求进步的经验丰富的 IT 专家，这些提示都可以帮你成为 DevOps 工程师。
>
>
>

![](/data/attachment/album/201908/30/171751rodhw6wko6fkkwkq.jpg)

DevOps 工程是一个备受称赞的热门职业。不管你是刚毕业正在找第一份工作，还是在利用之前的行业经验的同时寻求学习新技能的机会，本指南都能帮你通过正确的步骤成为 [DevOps 工程师](https://opensource.com/article/19/7/devops-vs-sysadmin)。

### 让自己沉浸其中

首先学习 [DevOps](https://opensource.com/resources/devops) 的基本原理、实践以及方法。在使用工具之前，先了解 DevOps 背后的“为什么”。DevOps 工程师的主要目标是在整个软件开发生命周期（SDLC）中提高速度并保持或提高质量，以提供最大的业务价值。阅读文章、观看 YouTube 视频、参加当地小组聚会或者会议 —— 成为热情的 DevOps 社区中的一员，在那里你将从先行者的错误和成功中学习。

### 考虑你的背景

如果你有从事技术工作的经历，例如软件开发人员、系统工程师、系统管理员、网络运营工程师或者数据库管理员，那么你已经拥有了广泛的见解和有用的经验，它们可以帮助你在未来成为 DevOps 工程师。如果你在完成计算机科学或任何其他 STEM（LCTT 译注：STEM 是<ruby> 科学 <rt>  Science </rt></ruby>、<ruby> 技术 <rt>  Technology </rt></ruby>、<ruby> 工程 <rt>  Engineering </rt></ruby>和<ruby> 数学 <rt>  Math </rt></ruby>四个学科的首字母缩略字）领域的学业后刚开始职业生涯，那么你将拥有在这个过渡期间需要的一些基本踏脚石。

DevOps 工程师的角色涵盖了广泛的职责。以下是企业最有可能使用他们的三种方向：

* **偏向于开发（Dev）的 DevOps 工程师**，在构建应用中扮演软件开发的角色。他们日常工作的一部分是利用持续集成 / 持续交付（CI/CD）、共享仓库、云和容器，但他们不一定负责构建或实施工具。他们了解基础架构，并且在成熟的环境中，能将自己的代码推向生产环境。
* **偏向于运维技术（Ops）的 DevOps 工程师**，可以与系统工程师或系统管理员相比较。他们了解软件的开发，但并不会把一天的重心放在构建应用上。相反，他们更有可能支持软件开发团队实现手动流程的自动化，并提高人员和技术系统的效率。这可能意味着分解遗留代码，并用不太繁琐的自动化脚本来运行相同的命令，或者可能意味着安装、配置或维护基础结构和工具。他们确保为任何有需要的团队安装可使用的工具。他们也会通过教团队如何利用 CI / CD 和其他 DevOps 实践来帮助他们。
* **网站可靠性工程师（SRE）**，就像解决运维和基础设施的软件工程师。SRE 专注于创建可扩展、高可用且可靠的软件系统。

在理想的世界中，DevOps 工程师将了解以上所有领域；这在成熟的科技公司中很常见。然而，顶级银行和许多财富 500 强企业的 DevOps 职位通常会偏向开发（Dev）或运营（Ops）。

### 要学习的技术

DevOps 工程师需要了解各种技术才能有效完成工作。无论你的背景如何，请从作为 DevOps 工程师需要使用和理解的基本技术开始。

#### 操作系统

操作系统是一切运行的地方，拥有相关的基础知识十分重要。[Linux](https://opensource.com/resources/linux) 是你最有可能每天使用的操作系统，尽管有的组织会使用 Windows 操作系统。要开始使用，你可以在家中安装 Linux，在那里你可以随心所欲地中断，并在此过程中学习。

#### 脚本

接下来，选择一门语言来学习脚本编程。有很多语言可供选择，包括 Python、Go、Java、Bash、PowerShell、Ruby 和 C / C++。我建议[从 Python 开始](https://opensource.com/resources/python)，因为它相对容易学习和解释，是最受欢迎的语言之一。Python 通常是遵循面向对象编程（OOP）的准则编写的，可用于 Web 开发、软件开发以及创建桌面 GUI 和业务应用程序。

#### 云

学习了 [Linux](https://opensource.com/resources/linux) 和 [Python](https://opensource.com/resources/python) 之后，我认为下一个该学习的是云计算。基础设施不再只是“运维小哥”的事情了，因此你需要接触云平台，例如 AWS 云服务、Azure 或者谷歌云平台。我会从 AWS 开始，因为它有大量免费学习工具，可以帮助你降低作为开发人员、运维人员，甚至面向业务的部门的任何障碍。事实上，你可能会被它提供的东西所淹没。考虑从 EC2、S3 和 VPC 开始，然后看看你从其中想学到什么。

#### 编程语言

如果你对 DevOps 的软件开发充满热情，请继续提高你的编程技能。DevOps 中的一些优秀和常用的编程语言和你用于脚本编程的相同：Python、Go、Java、Bash、PowerShell、Ruby 和 C / C++。你还应该熟悉 Jenkins 和 Git / Github，你将会在 CI / CD 过程中经常使用到它们。

#### 容器

最后，使用 Docker 和编排平台（如 Kubernetes）等工具开始学习[容器化](https://opensource.com/article/18/8/sysadmins-guide-containers)。网上有大量的免费学习资源，大多数城市都有本地的线下小组，你可以在友好的环境中向有经验的人学习（还有披萨和啤酒哦！）。

#### 其他的呢？

如果你缺乏开发经验，你依然可以通过对自动化的热情，提高效率，与他人协作以及改进自己的工作来[参与 DevOps](https://opensource.com/resources/devops)。我仍然建议学习上述工具，但重点不要放在编程 / 脚本语言上。了解基础架构即服务、平台即服务、云平台和 Linux 会非常有用。你可能会设置工具并学习如何构建具有弹性和容错能力的系统，并在编写代码时利用它们。

### 找一份 DevOps 的工作

求职过程会有所不同，具体取决于你是否一直从事技术工作，是否正在进入 DevOps 领域，或者是刚开始职业生涯的毕业生。

#### 如果你已经从事技术工作

如果你正在从一个技术领域转入 DevOps 角色，首先尝试在你当前的公司寻找机会。你能通过和其他的团队一起工作来重新掌握技能吗？尝试跟随其他团队成员，寻求建议，并在不离开当前工作的情况下获得新技能。如果做不到这一点，你可能需要换另一家公司。如果你能从上面列出的一些实践、工具和技术中学习，你将能在面试时展示相关知识从而占据有利位置。关键是要诚实，不要担心失败。大多数招聘主管都明白你并不知道所有的答案；如果你能展示你一直在学习的东西，并解释你愿意学习更多，你应该有机会获得 DevOps 的工作。

#### 如果你刚开始职业生涯

申请雇用初级 DevOps 工程师的公司的空缺机会。不幸的是，许多公司表示他们希望寻找更富有经验的人，并建议你在获得经验后再申请该职位。这是“我们需要经验丰富的人”的典型，令人沮丧的场景，并且似乎没人愿意给你第一次机会。

然而，并不是所有求职经历都那么令人沮丧；一些公司专注于培训和提升刚从大学毕业的学生。例如，我工作的 [MThree](https://www.mthreealumni.com/) 会聘请应届毕业生并且对其进行 8 周的培训。当完成培训后，参与者们可以充分了解到整个 SDLC，并充分了解它在财富 500 强公司环境中的运用方式。毕业生被聘为 MThree 的客户公司的初级 DevOps 工程师 —— MThree 在前 18 - 24 个月内支付全职工资和福利，之后他们将作为直接雇员加入客户。这是弥合从大学到技术职业的间隙的好方法。

### 总结

转职成 DevOps 工程师的方法有很多种。这是一条非常有益的职业路线，可能会让你保持繁忙和挑战 — 并增加你的收入潜力。

---

via: <https://opensource.com/article/19/7/how-transition-career-devops-engineer>

作者：[Conor Delanbanque](https://opensource.com/users/cdelanbanquehttps://opensource.com/users/daniel-ohhttps://opensource.com/users/herontheclihttps://opensource.com/users/marcobravohttps://opensource.com/users/cdelanbanque) 选题：[lujun9972](https://github.com/lujun9972) 译者：[beamrolling](https://github.com/beamrolling) 校对：[wxy](https://github.com/wxy)

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


如何在 Debian 10 上安装 Ansible

在如今的 IT 领域，自动化一个是热门话题，每个组织都开始采用自动化工具，像 Puppet、Ansible、Chef、CFEngine、Foreman 和 Katello。在这些工具中，Ansible 是几乎所有 IT 组织中管理 UNIX 和 Linux 系统的首选。在本文中，我们将演示如何在 Debian 10 Sever 上安装和使用 Ansible。

![](/data/attachment/album/201908/31/101921hgqygxrycigjquqi.jpg)

我的实验室环境：

* Debian 10 – Ansible 服务器/ 控制节点 – 192.168.1.14
* CentOS 7 – Ansible 主机 （Web 服务器）– 192.168.1.15
* CentOS 7 – Ansible 主机（DB 服务器）– 192.169.1.17

我们还将演示如何使用 Ansible 服务器管理 Linux 服务器

### 在 Debian 10 Server 上安装 Ansible

我假设你的 Debian 10 中有一个拥有 root 或 sudo 权限的用户。在我这里，我有一个名为 `pkumar` 的本地用户，它拥有 sudo 权限。

Ansible 2.7 包存在于 Debian 10 的默认仓库中，在命令行中运行以下命令安装 Ansible，

```
root@linuxtechi:~$ sudo apt update
root@linuxtechi:~$ sudo apt install ansible -y
```

运行以下命令验证 Ansible 版本，

```
root@linuxtechi:~$ sudo ansible --version
```

![ansible-version](/data/attachment/album/201908/31/101950enoqa0qgt58010qp.jpg)

要安装最新版本的 Ansible 2.8，首先我们必须设置 Ansible 仓库。

一个接一个地执行以下命令，

```
root@linuxtechi:~$ echo "deb http://ppa.launchpad.net/ansible/ansible/ubuntu bionic main" | sudo tee -a /etc/apt/sources.list
root@linuxtechi:~$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367
root@linuxtechi:~$ sudo apt update
root@linuxtechi:~$ sudo apt install ansible -y
root@linuxtechi:~$ sudo ansible --version
```

![latest-ansible-version](/data/attachment/album/201908/31/101952aqywoqq4kwwntwqk.jpg)

### 使用 Ansible 管理 Linux 服务器

请参考以下步骤，使用 Ansible 控制器节点管理 Linux 类的服务器，

#### 步骤 1：在 Ansible 服务器及其主机之间交换 SSH 密钥

在 Ansible 服务器生成 ssh 密钥并在 Ansible 主机之间共享密钥。

```
root@linuxtechi:~$ sudo -i
root@linuxtechi:~# ssh-keygen
root@linuxtechi:~# ssh-copy-id root@linuxtechi
root@linuxtechi:~# ssh-copy-id root@linuxtechi
```

#### 步骤 2：创建 Ansible 主机清单

安装 Ansible 后会自动创建 `/etc/ansible/hosts`，在此文件中我们可以编辑 Ansible 主机或其客户端。我们还可以在家目录中创建自己的 Ansible 主机清单，

运行以下命令在我们的家目录中创建 Ansible 主机清单。

```
root@linuxtechi:~$ vi $HOME/hosts
[Web]
192.168.1.15

[DB]
192.168.1.17
```

保存并退出文件。

注意：在上面的主机文件中，我们也可以使用主机名或 FQDN，但为此我们必须确保 Ansible 主机可以通过主机名或者 FQDN 访问。

#### 步骤 3：测试和使用默认的 Ansible 模块

Ansible 附带了许多可在 `ansible` 命令中使用的默认模块，示例如下所示。

语法：

```
# ansible -i <host_file> -m <module> <host>
```

这里：

* `-i ~/hosts`：包含 Ansible 主机列表
* `-m`：在之后指定 Ansible 模块，如 ping 和 shell
* `<host>`：我们要运行 Ansible 模块的 Ansible 主机

使用 Ansible ping 模块验证 ping 连接，

```
root@linuxtechi:~$ sudo ansible -i ~/hosts -m ping all
root@linuxtechi:~$ sudo ansible -i ~/hosts -m ping Web
root@linuxtechi:~$ sudo ansible -i ~/hosts -m ping DB
```

命令输出如下所示：

![Ansible-ping-module-examples](/data/attachment/album/201908/31/101952gkyyl9bwb2vfl9cy.jpg)

使用 shell 模块在 Ansible 主机上运行 shell 命令

语法：

```
ansible -i <hosts_file> -m shell -a <shell_commands>  <host>
```

例子：

```
root@linuxtechi:~$ sudo ansible -i ~/hosts -m shell -a "uptime" all
192.168.1.17 | CHANGED | rc=0 >>
 01:48:34 up  1:07,  3 users,  load average: 0.00, 0.01, 0.05

192.168.1.15 | CHANGED | rc=0 >>
 01:48:39 up  1:07,  3 users,  load average: 0.00, 0.01, 0.04

root@linuxtechi:~$
root@linuxtechi:~$ sudo ansible -i ~/hosts -m shell -a "uptime ; df -Th / ; uname -r" Web
192.168.1.15 | CHANGED | rc=0 >>
 01:52:03 up  1:11,  3 users,  load average: 0.12, 0.07, 0.06
Filesystem              Type  Size  Used Avail Use% Mounted on
/dev/mapper/centos-root xfs    13G 1017M   12G   8% /
3.10.0-327.el7.x86_64

root@linuxtechi:~$
```

上面的命令输出表明我们已成功设置 Ansible 控制器节点。

让我们创建一个安装 nginx 的示例剧本，下面的剧本将在所有服务器上安装 nginx，这些服务器是 Web 主机组的一部分，但在这里，我的主机组下只有一台 centos 7 机器。

```
root@linuxtechi:~$ vi nginx.yaml
---
- hosts: Web
  tasks:
    - name: Install latest version of nginx on CentOS 7 Server
      yum: name=nginx state=latest
    - name: start nginx
      service:
          name: nginx
          state: started
```

现在使用以下命令执行剧本。

```
root@linuxtechi:~$ sudo ansible-playbook -i ~/hosts  nginx.yaml
```

上面命令的输出类似下面这样，

![nginx-installation-playbook-debian10](/data/attachment/album/201908/31/101954q05013030v0vvjoj.jpg)

这表明 Ansible 剧本成功执行了。

本文就是这些了，请分享你的反馈和评论。

---

via: <https://www.linuxtechi.com/install-ansible-automation-tool-debian10/>

作者：[Pradeep Kumar](https://www.linuxtechi.com/author/pradeep/) 选题：[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/) 荣誉推出


Hexdump 如何工作

>
> Hexdump 能帮助你查看二进制文件的内容。让我们来学习 Hexdump 如何工作。
>
>
>

![](/data/attachment/album/201908/31/111531h9kzcqooluooqoo7.jpg)

Hexdump 是个用十六进制、十进制、八进制数或 ASCII 码显示二进制文件内容的工具。它是个用于检查的工具，也可用于[数据恢复](https://www.redhat.com/sysadmin/find-lost-files-scalpel)、逆向工程和编程。

### 学习基本用法

Hexdump 让你毫不费力地得到输出结果，依你所查看文件的尺寸，输出结果可能会非常多。本文中我们会创建一个 1x1 像素的 PNG 文件。你可以用图像处理应用如 [GIMP](http://gimp.org) 或 [Mtpaint](https://opensource.com/article/17/2/mtpaint-pixel-art-animated-gifs) 来创建该文件，或者也可以在终端内用 [ImageMagick](https://opensource.com/article/17/8/imagemagick) 创建。

用 ImagiMagick 生成 1x1 像素 PNG 文件的命令如下：

```
$ convert -size 1x1 canvas:black pixel.png
```

你可以用 `file` 命令确认此文件是 PNG 格式：

```
$ file pixel.png
pixel.png: PNG image data, 1 x 1, 1-bit grayscale, non-interlaced
```

你可能好奇 `file` 命令是如何判断文件是什么类型。巧的是，那正是 `hexdump` 将要揭示的原理。眼下你可以用你常用的图像查看软件来看看你的单一像素图片（它看上去就像这样：`.`），或者你可以用 `hexdump` 查看文件内部：

```
$ hexdump pixel.png
0000000 5089 474e 0a0d 0a1a 0000 0d00 4849 5244
0000010 0000 0100 0000 0100 0001 0000 3700 f96e
0000020 0024 0000 6704 4d41 0041 b100 0b8f 61fc
0000030 0005 0000 6320 5248 004d 7a00 0026 8000
0000040 0084 fa00 0000 8000 00e8 7500 0030 ea00
0000050 0060 3a00 0098 1700 9c70 51ba 003c 0000
0000060 6202 474b 0044 dd01 138a 00a4 0000 7407
0000070 4d49 0745 07e3 081a 3539 a487 46b0 0000
0000080 0a00 4449 5441 d708 6063 0000 0200 0100
0000090 21e2 33bc 0000 2500 4574 7458 6164 6574
00000a0 633a 6572 7461 0065 3032 3931 302d 2d37
00000b0 3532 3254 3a30 3735 353a 2b33 3231 303a
00000c0 ac30 5dcd 00c1 0000 7425 5845 6474 7461
00000d0 3a65 6f6d 6964 7966 3200 3130 2d39 3730
00000e0 322d 5435 3032 353a 3a37 3335 312b 3a32
00000f0 3030 90dd 7de5 0000 0000 4549 444e 42ae
0000100 8260
0000102
```

透过一个你以前可能从未用过的视角，你所见的是该示例 PNG 文件的内容。它和你在图像查看软件中看到的是完全一样的数据，只是用一种你或许不熟悉的方式编码。

### 提取熟悉的字符串

尽管默认的数据输出结果看上去毫无意义，那并不意味着其中没有有价值的信息。你可以用 `--canonical` 选项将输出结果，或至少是其中可翻译的部分，翻译成更加熟悉的字符集：

```
$ hexdump --canonical foo.png
00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|
00000010  00 00 00 01 00 00 00 01  01 00 00 00 00 37 6e f9  |.............7n.|
00000020  24 00 00 00 04 67 41 4d  41 00 00 b1 8f 0b fc 61  |$....gAMA......a|
00000030  05 00 00 00 20 63 48 52  4d 00 00 7a 26 00 00 80  |.... cHRM..z&...|
00000040  84 00 00 fa 00 00 00 80  e8 00 00 75 30 00 00 ea  |...........u0...|
00000050  60 00 00 3a 98 00 00 17  70 9c ba 51 3c 00 00 00  |`..:....p..Q<...|
00000060  02 62 4b 47 44 00 01 dd  8a 13 a4 00 00 00 07 74  |.bKGD..........t|
00000070  49 4d 45 07 e3 07 1a 08  39 35 87 a4 b0 46 00 00  |IME.....95...F..|
00000080  00 0a 49 44 41 54 08 d7  63 60 00 00 00 02 00 01  |..IDAT..c`......|
00000090  e2 21 bc 33 00 00 00 25  74 45 58 74 64 61 74 65  |.!.3...%tEXtdate|
000000a0  3a 63 72 65 61 74 65 00  32 30 31 39 2d 30 37 2d  |:create.2019-07-|
000000b0  32 35 54 32 30 3a 35 37  3a 35 33 2b 31 32 3a 30  |25T20:57:53+12:0|
000000c0  30 ac cd 5d c1 00 00 00  25 74 45 58 74 64 61 74  |0..]....%tEXtdat|
000000d0  65 3a 6d 6f 64 69 66 79  00 32 30 31 39 2d 30 37  |e:modify.2019-07|
000000e0  2d 32 35 54 32 30 3a 35  37 3a 35 33 2b 31 32 3a  |-25T20:57:53+12:|
000000f0  30 30 dd 90 e5 7d 00 00  00 00 49 45 4e 44 ae 42  |00...}....IEND.B|
00000100  60 82                                             |`.|
00000102
```

在右侧的列中，你看到的是和左侧一样的数据，但是以 ASCII 码展现的。如果你仔细看，你可以从中挑选出一些有用的信息，如文件格式（PNG）以及文件创建、修改日期和时间（向文件底部寻找一下）。

`file` 命令通过头 8 个字节获取文件类型。程序员会参考 [libpng 规范](http://www.libpng.org/pub/png/spec/1.2/PNG-Structure.html) 来知晓需要查看什么。具体而言，那就是你能在该图像文件的头 8 个字节中看到的字符串 `PNG`。这个事实显而易见，因为它揭示了 `file` 命令是如何知道要报告的文件类型。

你也可以控制 `hexdump` 显示多少字节，这在处理大于一个像素的文件时很实用：

```
$ hexdump --length 8 pixel.png
0000000 5089 474e 0a0d 0a1a
0000008
```

`hexdump` 不只限于查看 PNG 或图像文件。你也可以用 `hexdump` 查看你日常使用的二进制文件，如 [ls](https://opensource.com/article/19/7/master-ls-command)、[rsync](https://opensource.com/article/19/5/advanced-rsync)，或你想检查的任何二进制文件。

### 用 hexdump 实现 cat 命令

阅读 PNG 规范的时候你可能会注意到头 8 个字节中的数据与 `hexdump` 提供的结果看上去不一样。实际上，那是一样的数据，但以一种不同的转换方式展现出来。所以 `hexdump` 的输出是正确的，但取决于你在寻找的信息，其输出结果对你而言不总是直接了当的。出于这个原因，`hexdump` 有一些选项可供用于定义格式和转化其转储的原始数据。

转换选项可以很复杂，所以用无关紧要的东西练习会比较实用。下面这个简易的介绍，通过重新实现 [cat](https://opensource.com/article/19/2/getting-started-cat-command) 命令来演示如何格式化 `hexdump` 的输出。首先，对一个文本文件运行 `hexdump` 来查看其原始数据。通常你可以在硬盘上某处找到 <ruby> <a href="https://en.wikipedia.org/wiki/GNU_General_Public_License">  GNU 通用许可证 </a> <rt>  GNU General Public License </rt></ruby>（GPL）的一份拷贝，也可以用你手头的任何文本文件。你的输出结果可能不同，但下面是如何在你的系统中找到一份 GPL（或至少其部分）的拷贝：

```
$ find /usr/share/doc/ -type f -name "COPYING" | tail -1
/usr/share/doc/libblkid-devel/COPYING
```

对其运行 `hexdump`：

```
$ hexdump /usr/share/doc/libblkid-devel/COPYING
0000000 6854 7369 6c20 6269 6172 7972 6920 2073
0000010 7266 6565 7320 666f 7774 7261 3b65 7920
0000020 756f 6320 6e61 7220 6465 7369 7274 6269
0000030 7475 2065 7469 6120 646e 6f2f 0a72 6f6d
0000040 6964 7966 6920 2074 6e75 6564 2072 6874
0000050 2065 6574 6d72 2073 666f 7420 6568 4720
0000060 554e 4c20 7365 6573 2072 6547 656e 6172
0000070 206c 7550 6c62 6369 4c0a 6369 6e65 6573
0000080 6120 2073 7570 6c62 7369 6568 2064 7962
[...]
```

如果该文件输出结果很长，用 `--length`（或短选项 `-n`）来控制输出长度使其易于管理。

原始数据对你而言可能没什么意义，但你已经知道如何将其转换为 ASCII 码：

```
hexdump --canonical /usr/share/doc/libblkid-devel/COPYING
00000000  54 68 69 73 20 6c 69 62  72 61 72 79 20 69 73 20  |This library is |
00000010  66 72 65 65 20 73 6f 66  74 77 61 72 65 3b 20 79  |free software; y|
00000020  6f 75 20 63 61 6e 20 72  65 64 69 73 74 72 69 62  |ou can redistrib|
00000030  75 74 65 20 69 74 20 61  6e 64 2f 6f 72 0a 6d 6f  |ute it and/or.mo|
00000040  64 69 66 79 20 69 74 20  75 6e 64 65 72 20 74 68  |dify it under th|
00000050  65 20 74 65 72 6d 73 20  6f 66 20 74 68 65 20 47  |e terms of the G|
00000060  4e 55 20 4c 65 73 73 65  72 20 47 65 6e 65 72 61  |NU Lesser Genera|
00000070  6c 20 50 75 62 6c 69 63  0a 4c 69 63 65 6e 73 65  |l Public.License|
[...]
```

这个输出结果有帮助但太累赘且难于阅读。要将 `hexdump` 的输出结果转换为其选项不支持的其他格式，可组合使用 `--format`（或 `-e`）和专门的格式代码。用来自定义格式的代码和 `printf` 命令使用的类似，所以如果你熟悉 `printf` 语句，你可能会觉得 `hexdump` 自定义格式不难学会。

在 `hexdump` 中，字符串 `%_p` 告诉 `hexdump` 用你系统的默认字符集输出字符。`--format` 选项的所有格式符号必须以*单引号*包括起来：

```
$ hexdump -e'"%_p"' /usr/share/doc/libblkid-devel/COPYING
This library is fre*
 software; you can redistribute it and/or.modify it under the terms of the GNU Les*
er General Public.License as published by the Fre*
 Software Foundation; either.version 2.1 of the License, or (at your option) any later.version..*
The complete text of the license is available in the..*
/Documentation/licenses/COPYING.LGPL-2.1-or-later file..
```

这次的输出好些了，但依然不方便阅读。传统上 UNIX 文本文件假定 80 个字符的输出宽度（因为很久以前显示器一行只能显示 80 个字符）。

尽管这个输出结果未被自定义格式限制输出宽度，你可以用附加选项强制 `hexdump` 一次处理 80 字节。具体而言，通过 80 除以 1 这种形式，你可以告诉 `hexdump` 将 80 字节作为一个单元对待：

```
$ hexdump -e'80/1 "%_p"' /usr/share/doc/libblkid-devel/COPYING
This library is free software; you can redistribute it and/or.modify it under the terms of the GNU Lesser General Public.License as published by the Free Software Foundation; either.version 2.1 of the License, or (at your option) any later.version...The complete text of the license is available in the.../Documentation/licenses/COPYING.LGPL-2.1-or-later file..
```

现在该文件被分割成 80 字节的块处理，但没有任何换行。你可以用 `\n` 字符自行添加换行，在 UNIX 中它代表换行：

```
$ hexdump -e'80/1 "%_p""\n"'
This library is free software; you can redistribute it and/or.modify it under th
e terms of the GNU Lesser General Public.License as published by the Free Softwa
re Foundation; either.version 2.1 of the License, or (at your option) any later.
version...The complete text of the license is available in the.../Documentation/
licenses/COPYING.LGPL-2.1-or-later file..
```

现在你已经（大致上）用 `hexdump` 自定义格式实现了 `cat` 命令。

### 控制输出结果

实际上自定义格式是让 `hexdump` 变得有用的方法。现在你已经（至少是原则上）熟悉 `hexdump` 自定义格式，你可以让 `hexdump -n 8` 的输出结果跟 `libpng` 官方规范中描述的 PNG 文件头相匹配了。

首先，你知道你希望 `hexdump` 以 8 字节的块来处理 PNG 文件。此外，你可能通过识别这些整数从而知道 PNG 格式规范是以十进制数表述的，根据 `hexdump` 文档，十进制用 `%d` 来表示：

```
$ hexdump -n8 -e'8/1 "%d""\n"' pixel.png
13780787113102610
```

你可以在每个整数后面加个空格使输出结果变得完美：

```
$ hexdump -n8 -e'8/1 "%d ""\n"' pixel.png
137 80 78 71 13 10 26 10
```

现在输出结果跟 PNG 规范完美匹配了。

### 好玩又有用

Hexdump 是个迷人的工具，不仅让你更多地领会计算机如何处理和转换信息，而且让你了解文件格式和编译的二进制文件如何工作。日常工作时你可以随机地试着对不同文件运行 `hexdump`。你永远不知道你会发现什么样的信息，或是什么时候具有这种洞察力会很实用。

---

via: <https://opensource.com/article/19/8/dig-binary-files-hexdump>

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

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


你可能意识不到的使用 Linux 的 11 种方式

>
> 什么技术运行在 Linux 上？你可能会惊讶于日常生活中使用 Linux 的频率。
>
>
>

![](/data/attachment/album/201909/01/000003dsqf45rbavr5vzja.jpg)

现在 Linux 几乎可以运行每样东西，但很多人都没有意识到这一点。有些人可能知道 Linux，可能听说过超级计算机运行着这个操作系统。根据 [Top500](https://www.top500.org/)，Linux 现在驱动着世界上最快的 500 台计算机。你可以转到他们的网站并[搜索“Linux”](https://www.top500.org/statistics/sublist/)自己查看一下结果。

### NASA 运行在 Linux 之上

你可能不知道 Linux 为 NASA（美国国家航空航天局）提供支持。NASA 的 [Pleiades](https://www.nas.nasa.gov/hecc/resources/pleiades.html) 超级计算机运行着 Linux。由于操作系统的可靠性，国际空间站六年前[从 Windows 切换到了 Linux](https://www.extremetech.com/extreme/155392-international-space-station-switches-from-windows-to-linux-for-improved-reliability)。NASA 甚至最近给国际空间站部署了三台[运行着 Linux](https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20180003515.pdf) 的“Astrobee”机器人。

### 电子书运行在 Linux 之上

我读了很多书，我的首选设备是亚马逊 Kindle Paperwhite，它运行 Linux（虽然大多数人完全没有意识到这一点）。如果你使用亚马逊的任何服务，从[亚马逊弹性计算云（Amazon EC2）](https://aws.amazon.com/amazon-linux-ami/) 到 Fire TV，你就是在 Linux 上运行。当你问 Alexa 现在是什么时候，或者你最喜欢的运动队得分时，你也在使用 Linux，因为 Alexa 由 [Fire OS](https://en.wikipedia.org/wiki/Fire_OS)（基于 Android 的操作系统）提供支持。实际上，[Android](https://en.wikipedia.org/wiki/Android_(operating_system)) 是由谷歌开发的用于移动手持设备的 Linux，而且占据了当今移动电话的[76％ 的市场](https://gs.statcounter.com/os-market-share/mobile/worldwide/)。

### 电视运行在 Linux 之上

如果你有一台 [TiVo](https://tivo.pactsafe.io/legal.html#open-source-software)，那么你也在运行 Linux。如果你是 Roku 用户，那么你也在使用 Linux。[Roku OS](https://en.wikipedia.org/wiki/Roku) 是专为 Roku 设备定制的 Linux 版本。你可以选择使用在 Linux 上运行的 Chromecast 看流媒体。不过，Linux 不只是为机顶盒和流媒体设备提供支持。它也可能运行着你的智能电视。LG 使用 webOS，它是基于 Linux 内核的。Panasonic 使用 Firefox OS，它也是基于 Linux 内核的。三星、菲利普斯以及更多厂商都使用基于 Linux 的操作系统支持其设备。

### 智能手表和平板电脑运行在 Linux 之上

如果你拥有智能手表，它可能正在运行 Linux。世界各地的学校系统一直在实施[一对一系统](https://en.wikipedia.org/wiki/One-to-one_computing)，让每个孩子都有自己的笔记本电脑。越来越多的机构为学生配备了 Chromebook。这些轻巧的笔记本电脑使用 [Chrome OS](https://en.wikipedia.org/wiki/Chrome_OS)，它基于 Linux。

### 汽车运行在 Linux 之上

你驾驶的汽车可能正在运行 Linux。 [汽车级 Linux（AGL）](https://opensource.com/life/16/8/agl-provides-common-open-code-base) 是一个将 Linux 视为汽车标准代码库的项目，它列入了丰田、马自达、梅赛德斯-奔驰和大众等汽车制造商。你的[车载信息娱乐（IVI）](https://opensource.com/business/16/5/interview-alison-chaiken-steven-crumb)系统也可能运行 Linux。[GENIVI 联盟](https://www.genivi.org/faq)在其网站称，它开发了“用于集成在集中连接的车辆驾驶舱中的操作系统和中间件的标准方法”。

### 游戏运行在 Linux 之上

如果你是游戏玩家，那么你可能正在使用 [SteamOS](https://store.steampowered.com/steamos/)，这是一个基于 Linux 的操作系统。此外，如果你使用 Google 的众多服务，那么你也运行在 Linux上。

### 社交媒体运行在 Linux 之上

当你刷屏和评论时，你可能会意识到这些平台正在做的很多工作。也许 Instagram、Facebook、YouTube 和 Twitter 都在 Linux 上运行并不令人惊讶。

此外，社交媒体的新浪潮，去中心化的联合社区的联盟节点，如 [Mastodon](https://opensource.com/article/17/4/guide-to-mastodon)、[GNU Social](https://www.gnu.org/software/social/)、[Nextcloud](https://apps.nextcloud.com/apps/social)（类似 Twitter 的微博平台）、[Pixelfed](https://pixelfed.org/)（分布式照片共享）和[Peertube](https://joinpeertube.org/en/)（分布式视频共享）至少默认情况下在 Linux 上运行。由于开源，它们可以在任何平台上运行，这本身就是一个强大的优先级。

### 商业和政务运行在 Linux 之上

与五角大楼一样，纽约证券交易所也在 Linux 上运行。美国联邦航空管理局每年处理超过 1600 万次航班，他们在 Linux 上运营。美国国会图书馆、众议院、参议院和白宫都使用 Linux。

### 零售运行在 Linux 之上

最新航班座位上的娱乐系统很可能在 Linux 上运行。你最喜欢的商店的 POS 机可能正运行在 Linux 上。基于 Linux 的 [Tizen OS](https://wiki.tizen.org/Devices) 为智能家居和其他智能设备提供支持。许多公共图书馆现在在 [Evergreen](https://evergreen-ils.org/) 和 [Koha](https://koha-community.org/) 上托管他们的综合图书馆系统。这两个系统都在 Linux 上运行。

### Apple 运行在 Linux 之上

如果你是使用 [iCloud](https://toolbar.netcraft.com/site_report?url=https://www.icloud.com/) 的 iOS 用户，那么你也在使用运行在 Linux 上的系统。Apple 公司的网站在 Linux 上运行。如果你想知道在 Linux 上运行的其他网站，请务必使用 [Netcraft](https://www.netcraft.com/) 并检查“该网站运行在什么之上？”的结果。

### 路由器运行在 Linux 之上

在你家里将你连接到互联网的路由器可能正运行在 Linux 上。如果你当前的路由器没有运行 Linux 而你想改变它，那么这里有一个[优秀的方法](https://opensource.com/life/16/6/why-i-built-my-own-linux-router)。

如你所见，Linux 从许多方面为今天的世界提供动力。还有什么运行在 Linux 之上的东西是人们还没有意识到的？请让我们在评论中知道。

---

via: <https://opensource.com/article/19/8/everyday-tech-runs-linux>

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


Just For Fun：评台湾开源人之精神面貌

Summary: 2019 年 8 月 17 - 18 日，我参加了心念已久的在台湾连续举办了 14 届的 COSCUP 2019。这次的台湾之行，也让我看到了两岸在开源之间的差异，因此，希望能够通过这一篇文章，让更多的大陆开源人，看到不同的世界，了解多元的开源世界。

![](/data/attachment/album/201909/01/091201wgd9egdbdpge9gww.jpg)

2019 年 8 月 17 - 18 日，我[参加](https://www.ixiqin.com/2019/08/coscup-2019/)了心念已久的在台湾连续举办了 14 届的 [COSCUP 2019](https://coscup.org)，并在会后，进行了一系列的开源访谈，以期促进两岸的开源软件、开源社群、开源人的交流。

这次的台湾之行，也让我看到了两岸在开源之间的差异，因此，希望能够通过这一篇文章，让更多的大陆开源人，看到不同的世界，了解多元的开源世界。

![源自长荣航空广告](/data/attachment/album/201909/01/090113l00hjazf1zv0olzn.jpg)

### Just For Fun 的开源事业

Linux 之父 Linus Torvalds 有一本书 《Just For Fun》，在中国大陆的书名是 《只是为了好玩》（也有译作《一生只为寻欢笑》），这一句话，在我看来，很好的表现出台湾开源人的精神风貌。

在台湾参会期间，令我印象最为深刻的，莫过于所有议程结束后的 Lighting Talk。

Lighting Talk，闪电演讲，每个人都只有 5 分钟完成自己的演讲，如果没有完成，就会被主持人拔掉电源，强制停止演讲。在这五分钟里，每一个演讲者都竭尽所能，将自己的演讲内容完成。

现在听起来似乎还很正常？但是当你看到演讲者的题目，就会觉得不那么正常了。

今年的 COSCUP 的 Lighting Talk 的主题是这样的

* 聖家堂與軟體開發 by hlb
* 開源與 COSCUP 起源圖文 by 唐唐
* 不務正業工程師成長之路 by 聽風
* How to get beer using Pinpoint by HyunGil Jeong
* HackMD feat. XXX by 黃鈺凱
* 如何(物理上的)延長你的工程師生涯 by LSChyi
* 機房監控酷炫上手 by Haraguroicha Hsu
* 我在Taipei Ethereum Meetup的跳坑滅頂全記錄 by Jerry Ho
* 基於數據科學的房地產價格預測，做成Chat bot應用，最後如何被政府一句話終止開發 - 柯克
* 如何才能做好自己的工作Side Project by 白宦成
* 4分鐘看Free list的演進 by Julian
* 報到 App - OPass 專案回顧及展望 by Denny Huang

你会看到，大家提供的议题并不像我们在大陆所提交的议题那样，高端大气上档次，反而是十分的接地气，大家在起标题时，选择的也是尽可能有意思的话题，并以此来吸引参会者来听。

![](/data/attachment/album/201909/01/090855xn2yd2kdjj2tdk72.jpg)

或许你会想，只是一个 Lighting Talk，随意一点也正常，正式的议题肯定就很正经了，然而，并不是。

正式的议题是这样的：

* 懶惰鬼的函數式爬蟲 ー 以 Tezos 應用需求為例
* 當 Rails 遇上 Docker，環境部署原來是這樣！？
* 開拓者們建立鐵道的辛酸血淚史
* 前端開發的再次典範轉移 - 如何走出混亂並讓複雜變的可掌控
* 你媽知道你在用 PostgreSQL 看 PTT 嗎？
* …

是的，正式议题也并不那么正式，也带有一丝戏谑和玩笑。回过头来看我们的大会的议题，*支撑亿级 XX 的 XX 平台架构实践*、*XXX 面对亿级并发场景的组件体系设计*，此类型的议题数不胜数。一场大会，从头到尾都是亿级流量，如今的架构师，如果没有扛过亿级流量，都没有资格上大会。

这种差异，使得两岸的开源会议的参与者完全不同。大陆的会议主题大多高端大气上档次，其门票也一样的高端大气上档次，使得大家根本提不起兴趣来自费参会，加上会议总是会在工作日举办，导致如果你想要自费参会，所要付出的成本是极高的。而台湾的会议主题则相对更加的接地气，门票一样接地气，针对开源贡献者，更是提供的免费的门票，让你可以开开心心参会。

![](/data/attachment/album/201909/01/090044g48r88888vk8r88o.jpg)

台湾开源推崇的便是 “**Just For Fun**”，首先先要让开发者 Happy ，然后才是考虑产品的商业利益，让爱好，变为财富。首先学会快乐，再学会成功。

而大陆开源推崇的更多是“**利益至上**”，我如何让我的产品击败别人的产品？开发者先要考虑商业的利益，再去考虑自己的爱好。从一开始，便与利益挂钩，后续，便再也难于利益脱钩。

当然，我不能只是一味的说，台湾的开源更活泼、更有生机，我们也需要看到其后的原因，并提出相应的解决方案。

**台湾之所以更活跃，首先应当是开源项目主要由个人及小企业主导**。对于个人主导的开源项目来说，因为没有重重的 KPI，所以拥有更多的活力，开发者会大量投入自己的精力去完成、完善、推广一个项目。对于小企业主导的项目，则是希望帮助小企业在残酷的商业竞争中获取一定的竞争优势，有一个社区所认可的开源项目显然比没有要好。此外，这些小企业的团队领导人大多是从工程师起来的，所以对于开源社区、开源贡献是有认同感的，他们会思考，我的项目能够活下来，是得益于开源社区的贡献，因此，我需要也为社区做一些贡献。

**而大陆的开源项目则更多是以企业主导，背负着特定的 KPI，大家做开源的动力难免不足**。一方面，工作的压力使得不少人在工作之余，根本没有时间去做开源项目。另一方面，企业主导的开源项目因为也会背负一些从开源到业务引流的 KPI，也使得整个过程失去了快乐与活力。同时，大陆的企业领导者大多不是工程师，而是产品、商务等岗位，这会使得他们对于开源社区、开源软件没有认同感，他们也不会觉得，自己使用了开源软件，就需要为开源社区做出贡献。此外，大陆的开源教育也做的并不好，**我们太过于看重成败，使得原本一些不错的项目，可能因为惧怕失败而放弃开源**，如果我们不去看重成败，而是将更多的心思放在开源本身的价值，或许我们可以做的更好。

就像前面的长荣航空的广告中所言，在学会赢之前，先学会享受了玩的乐趣，也因此，才有了“乐在其中，才会无限精彩”。对于大陆的我们，或许需要找回自己最初的初心，享受生活、享受工作，让自己的工作不再是抑制成长的压力，而是推动我们前进的动力。

当然， Just For Fun 并非全然没有问题的，就如 Skywalking 的创始人吴晟老师所言，开源不能仅仅是 Just For Fun ，如果没有一个好的商业目标，一个好的开源项目可能随时因为创始人的离去而失去维护者。相比之下，一个好的商业目标虽然看起来与起初的目标相冲突，但是终归确保了开源项目的长期运转，也不失是一种贡献。

（题图来自：[2019！開源久酒！](https://coscup2019.kktix.cc/events/welcomeparty-2019)）


开源新闻综述：谷歌开源 Android 语音转录和手势追踪、Twitter 的遥测工具

Summary: 不要错过两周以来最大的开源头条新闻。

不要错过两周以来最大的开源头条新闻。

>
> 不要错过两周以来最大的开源头条新闻。
>
>
>

![Weekly news roundup with TV](/data/attachment/album/201909/01/105129ynlzk0yvrr66fr6v.png "Weekly news roundup with TV")

在本期的开源新闻综述中，我们来看看谷歌发布的两个开源软件、Twitter 的最新可观测性工具、动漫工作室对 Blender 的采用在增多等等新闻！

### 谷歌的开源双响炮

搜索引擎巨头谷歌的开发人员最近一直忙于开源。在过去的两周里，他们以开源的方式发布了两个截然不同的软件。

第一个是 Android 的语音识别和转录工具 Live Transcribe 的[语音引擎](https://venturebeat.com/2019/08/16/google-open-sources-live-transcribes-speech-engine/)，它可以“在移动设备上使用机器学习算法将音频变成实时字幕”。谷歌的声明称，它正在开源 Live Transcribe 以“让所有开发人员可以为长篇对话提供字幕”。你可以[在 GitHub 上](https://github.com/google/live-transcribe-speech-engine)浏览或下载 Live Transcribe 的源代码。

谷歌还为 Android 和 iOS 开源了[手势跟踪软件](https://venturebeat.com/2019/08/19/google-open-sources-gesture-tracking-ai-for-mobile-devices/)，它建立在其 [MediaPipe](https://github.com/google/mediapipe) 机器学习框架之上。该软件结合了三种人工智能组件：手掌探测器、“返回 3D 手点”的模型和手势识别器。据谷歌研究人员称，其目标是改善“跨各种技术领域和平台的用户体验”。该软件的源代码和文档[可在 GitHub 上获得](https://github.com/google/mediapipe/blob/master/mediapipe/docs/hand_tracking_mobile_gpu.md)。

### Twitter 开源 Rezolus 遥测工具

当想到网络中断时，我们想到的是影响站点或服务性能的大崩溃或减速。让我们感到惊讶的是性能慢慢被吃掉的小尖峰的重要性。为了更容易地检测这些尖峰，Twitter 开发了一个名为 Rezolus 的工具，该公司[已将其开源](https://blog.twitter.com/engineering/en_us/topics/open-source/2019/introducing-rezolus.html)。

>
> 我们现有的按分钟采样的遥测技术未能反映出这些异常现象。这是因为相对于该异常发生的长度，较低的采样率掩盖了这些持续时间大约为 10 秒的异常。这使得很难理解正在发生的事情并调整系统以获得更高的性能。
>
>
>

Rezolus 旨在检测“非常短暂但有时显著的性能异常”——仅持续几秒钟。Twitter 已经运行了 Rezolus 大约一年，并且一直在使用它收集的内容“与后端服务日志来确定峰值的来源”。

如果你对将 Rezolus 添加到可观测性堆栈中的结果感到好奇，请查看 Twitter 的 [GitHub 存储库](https://github.com/twitter/rezolus)中的源代码。

### 日本的 Khara 动画工作室采用 Blender

Blender 被认为是开源的动画和视觉效果软件的黄金标准。它被几家制作公司采用，其中最新的是[日本动漫工作室 Khara](https://www.neowin.net/news/anime-studio-khara-is-planning-to-use-open-source-blender-software/)。

Khara 正在使用 Blender 开发 Evangelion: 3.0+1.0，这是基于流行动漫系列《Neon Genesis Evangelion》的电影系列的最新版本。虽然该电影的工作不能在 Blender 中全部完成，但 Khara 的员工“将从 2020 年 6 月开始使用 Blender 进行大部分工作”。为了强调其对 Blender 和开源的承诺，“Khara 宣布它将作为企业会员加入 Blender 基金会的发展基金。“

### NSA 分享其固件安全工具

继澳大利亚同行[共享他们的一个工具](/article-11241-1.html)之后，美国国家安全局（NSA）正在[提供](https://www.cyberscoop.com/nsa-firmware-open-source-coreboot-stm-pe-eugene-myers/)的一个项目的成果“可以更好地保护机器免受固件攻击“。这个最新的软件以及其他保护固件的开源工作可以在 [Coreboot Gerrit 存储库](https://review.coreboot.org/admin/repos)下找到。

这个名为“具有受保护执行的 SMI 传输监视器”（STM-PE）的软件“将与运行 Coreboot 的 x86 处理器配合使用”以防止固件攻击。根据 NSA 高级网络安全实验室的 Eugene Meyers 的说法，STM-PE 采用低级操作系统代码“并将其置于一个盒子中，以便它只能访问它需要访问的设备系统”。这有助于防止篡改，Meyers 说，“这将提高系统的安全性。”

### 其它新闻

* [Linux 内核中的 exFAT？是的！](https://cloudblogs.microsoft.com/opensource/2019/08/28/exfat-linux-kernel/)
* [瓦伦西亚继续支持 Linux 学校发行版](https://joinup.ec.europa.eu/collection/open-source-observatory-osor/news/120000-lliurex-desktops)
* [西班牙首个开源卫星](https://hackaday.com/2019/08/15/spains-first-open-source-satellite/)
* [Western Digital 从开放标准到开源芯片的长途旅行](https://www.datacenterknowledge.com/open-source/western-digitals-long-trip-open-standards-open-source-chips)
* [用于自动驾驶汽车多模传感器的 Waymo 开源数据集](https://venturebeat.com/2019/08/21/waymo-open-sources-data-set-for-autonomous-vehicle-multimodal-sensors/)

一如既往地感谢 Opensource.com 的工作人员和主持人本周的帮助。

---

via: <https://opensource.com/19/8/news-august-31>

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


在 Fedora 上开启 Go 语言之旅

Summary: Go 越来越受欢迎的原因是性能好、易于编写高并发的程序、语法简单和编译快。

标题改下吧

Go 越来越受欢迎的原因是性能好、易于编写高并发的程序、语法简单和编译快。

![](/data/attachment/album/201909/01/223741e3ltmt9jmiiyayva.jpg)

[Go](https://golang.org/) 编程语言于 2009 年首次公开发布，此后被广泛使用。特别是，Go 已经成为云基础设施领域的一种代表性语言，例如 [Kubernetes](https://kubernetes.io/)、[OpenShift](https://www.openshift.com/) 或 [Terraform](https://www.terraform.io/) 等大型项目都使用了 Go。

Go 越来越受欢迎的原因是性能好、易于编写高并发的程序、语法简单和编译快。

让我们来看看如何在 Fedora 上开始 Go 语言编程吧。

### 在 Fedora 上安装 Go

Fedora 可以通过官方库简单快速地安装 Go 语言。

```
$ sudo dnf install -y golang
$ go version
go version go1.12.7 linux/amd64
```

既然装好了 Go ，让我们来写个简单的程序，编译并运行。

### 第一个 Go 程序

让我们来用 Go 语言写一波 “Hello, World!”。首先创建 `main.go` 文件，然后输入或者拷贝以下内容。

```
package main

import "fmt"

func main() {
     fmt.Println("Hello, World!")
}
```

运行这个程序很简单。

```
$ go run main.go
Hello, World!
```

Go 会在临时目录将 `main.go` 编译成二进制文件并执行，然后删除临时目录。这个命令非常适合在开发过程中快速运行程序，它还凸显了 Go 的编译速度。

编译一个可执行程序就像运行它一样简单。

```
$ go build main.go
$ ./main
Hello, World!
```

### 使用 Go 的模块

Go 1.11 和 1.12 引入了对模块的初步支持。模块可用于管理应用程序的各种依赖包。Go 通过 `go.mod` 和 `go.sum` 这两个文件，显式地定义依赖包的版本。

为了演示如何使用模块，让我们为 `hello world` 程序添加一个依赖。

在更改代码之前，需要初始化模块。

```
$ go mod init helloworld
go: creating new go.mod: module helloworld
$ ls
go.mod main  main.go
```

然后按照以下内容修改 `main.go` 文件。

```
package main

import "github.com/fatih/color"

func main () {
     color.Blue("Hello, World!")
}
```

在修改后的 `main.go` 中，不再使用标准库 `fmt` 来打印 “Hello, World!” ，而是使用第三方库打印出有色字体。

让我们来跑一下新版的程序吧。

```
$ go run main.go
Hello, World!
```

因为程序依赖于 `github.com/fatih/color` 库，它需要在编译前下载所有依赖包。 然后把依赖包都添加到 `go.mod` 中，并将它们的版本号和哈希值记录在 `go.sum` 中。

---

via: <https://fedoramagazine.org/getting-started-with-go-on-fedora/>

作者：[Clément Verna](https://fedoramagazine.org/author/cverna/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[hello-wn](https://github.com/hello-wn) 校对：[wxy](https://github.com/wxy)

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


Emacs 注释中的拼写检查

Summary: 我出了名的容易拼错单词（特别是在播客当中）。谢天谢地 Emacs 内置了一个名为 flyspell 的超棒模式来帮助像我这样的可怜的打字员。

![](/data/attachment/album/201909/01/230303eqkpq2oktt15898r.jpg)

我出了名的容易拼错单词（特别是在播客当中）。谢天谢地 Emacs 内置了一个名为 `flyspell` 的超棒模式来帮助像我这样的可怜的打字员。flyspell 会在你输入时突出显示拼错的单词 (也就是实时的) 并提供有用的快捷键来快速修复该错误。

大多输入通常会对派生自 `text-mode`（比如 `markdown-mode`，`adoc-mode` ）的主模式启用 `flyspell`，但是它对程序员也有所帮助，可以指出他在注释中的错误。所需要的只是启用 `flyspell-prog-mode`。我通常在所有的编程模式中（至少在 `prog-mode` 派生的模式中）都启用它：

```
(add-hook 'prog-mode-hook #'flyspell-prog-mode)
```

现在当你在注释中输入错误时，就会得到即时反馈了。要修复单词只需要将光标置于单词后，然后按下 `C-c $` （`M-x flyspell-correct-word-before-point`）。（还有许多其他方法可以用 `flyspell` 来纠正拼写错误的单词，但为了简单起见，我们暂时忽略它们。）

![](/data/attachment/album/201909/01/230347dgrbogrsgb19go2l.gif)

今天的分享就到这里！我要继续修正这些讨厌的拼写错误了！

---

via: <https://emacsredux.com/blog/2019/05/24/spell-checking-comments/>

作者：[Bozhidar Batsov](https://emacsredux.com) 选题：[lujun9972](https://github.com/lujun9972) 译者：[lujun9972](https://github.com/lujun9972) 校对：[wxy](https://github.com/wxy)

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


使用 Python 函数进行模块化

Summary: 使用 Python 函数来最大程度地减少重复任务编码工作量。

Python 现在是真火~

使用 Python 函数来最大程度地减少重复任务编码工作量。

>
> 使用 Python 函数来最大程度地减少重复任务编码工作量。
>
>
>

![](/data/attachment/album/201909/01/234309ja7ooanopazo3o2m.jpg)

你是否对函数、类、方法、库和模块等花哨的编程术语感到困惑？你是否在与变量作用域斗争？无论你是自学成才的还是经过正式培训的程序员，代码的模块化都会令人困惑。但是类和库鼓励模块化代码，因为模块化代码意味着只需构建一个多用途代码块集合，就可以在许多项目中使用它们来减少编码工作量。换句话说，如果你按照本文对 [Python](https://www.python.org/) 函数的研究，你将找到更聪明的工作方法，这意味着更少的工作。

本文假定你对 Python 很熟（LCTT 译注：稍微熟悉就可以），并且可以编写和运行一个简单的脚本。如果你还没有使用过 Python，请首先阅读我的文章：[Python 简介](https://opensource.com/article/17/10/python-10)。

### 函数

函数是迈向模块化过程中重要的一步，因为它们是形式化的重复方法。如果在你的程序中，有一个任务需要反复执行，那么你可以将代码放入一个函数中，根据需要随时调用该函数。这样，你只需编写一次代码，就可以随意使用它。

以下一个简单函数的示例：

```
#!/usr/bin/env python3
import time

def Timer():
    print("Time is " + str(time.time() ))
```

创建一个名为 `mymodularity` 的目录，并将以上函数代码保存为该目录下的 `timestamp.py`。

除了这个函数，在 `mymodularity` 目录中创建一个名为 `__init__.py` 的文件，你可以在文件管理器或 bash shell 中执行此操作：

```
$ touch mymodularity/__init__.py
```

现在，你已经创建了属于你自己的 Python 库（Python 中称为“模块”），名为 `mymodularity`。它不是一个特别有用的模块，因为它所做的只是导入 `time` 模块并打印一个时间戳，但这只是一个开始。

要使用你的函数，像对待任何其他 Python 模块一样对待它。以下是一个小应用，它使用你的 `mymodularity` 软件包来测试 Python `sleep()` 函数的准确性。将此文件保存为 `sleeptest.py`，注意要在 `mymodularity` 文件夹 *之外*，因为如果你将它保存在 `mymodularity` *里面*，那么它将成为你的包中的一个模块，你肯定不希望这样。

```
#!/usr/bin/env python3

import time
from mymodularity import timestamp

print("Testing Python sleep()...")

# modularity
timestamp.Timer()
time.sleep(3)
timestamp.Timer()
```

在这个简单的脚本中，你从 `mymodularity` 包中调用 `timestamp` 模块两次。从包中导入模块时，通常的语法是从包中导入你所需的模块，然后使用 *模块名称 + 一个点 + 要调用的函数名*（例如 `timestamp.Timer()`）。

你调用了两次 `Timer()` 函数，所以如果你的 `timestamp` 模块比这个简单的例子复杂些，那么你将节省大量重复代码。

保存文件并运行：

```
$ python3 ./sleeptest.py
Testing Python sleep()...
Time is 1560711266.1526039
Time is 1560711269.1557732
```

根据测试，Python 中的 `sleep` 函数非常准确：在三秒钟等待之后，时间戳成功且正确地增加了 3，在微秒单位上差距很小。

Python 库的结构看起来可能令人困惑，但其实它并不是什么魔法。Python *被编程* 为一个包含 Python 代码的目录，并附带一个 `__init__.py` 文件，那么这个目录就会被当作一个包，并且 Python 会首先在当前目录中查找可用模块。这就是为什么语句 `from mymodularity import timestamp` 有效的原因：Python 在当前目录查找名为 `mymodularity` 的目录，然后查找 `timestamp.py` 文件。

你在这个例子中所做的功能和以下这个非模块化的版本是一样的：

```
#!/usr/bin/env python3

import time
from mymodularity import timestamp

print("Testing Python sleep()...")

# no modularity
print("Time is " + str(time.time() ) )
time.sleep(3)
print("Time is " + str(time.time() ) )
```

对于这样一个简单的例子，其实没有必要以这种方式编写测试，但是对于编写自己的模块来说，最佳实践是你的代码是通用的，可以将它重用于其他项目。

通过在调用函数时传递信息，可以使代码更通用。例如，假设你想要使用模块来测试的不是 *系统* 的 `sleep` 函数，而是 *用户自己实现* 的 `sleep` 函数，更改 `timestamp` 代码，使它接受一个名为 `msg` 的传入变量，它将是一个字符串，控制每次调用 `timestamp` 时如何显示：

```
#!/usr/bin/env python3

import time

# 更新代码
def Timer(msg):
    print(str(msg) + str(time.time() ) )
```

现在函数比以前更抽象了。它仍会打印时间戳，但是它为用户打印的内容 `msg` 还是未定义的。这意味着你需要在调用函数时定义它。

`Timer` 函数接受的 `msg` 参数是随便命名的，你可以使用参数 `m`、`message` 或 `text`，或是任何对你来说有意义的名称。重要的是，当调用 `timestamp.Timer` 函数时，它接收一个文本作为其输入，将接收到的任何内容放入 `msg` 变量中，并使用该变量完成任务。

以下是一个测试测试用户正确感知时间流逝能力的新程序：

```
#!/usr/bin/env python3

from mymodularity import timestamp

print("Press the RETURN key. Count to 3, and press RETURN again.")

input()
timestamp.Timer("Started timer at ")

print("Count to 3...")

input()
timestamp.Timer("You slept until ")
```

将你的新程序保存为 `response.py`，运行它：

```
$ python3 ./response.py
Press the RETURN key. Count to 3, and press RETURN again.

Started timer at 1560714482.3772075
Count to 3...

You slept until 1560714484.1628013
```

### 函数和所需参数

新版本的 `timestamp` 模块现在 *需要* 一个 `msg` 参数。这很重要，因为你的第一个应用程序将无法运行，因为它没有将字符串传递给 `timestamp.Timer` 函数：

```
$ python3 ./sleeptest.py
Testing Python sleep()...
Traceback (most recent call last):
  File "./sleeptest.py", line 8, in <module>
    timestamp.Timer()
TypeError: Timer() missing 1 required positional argument: 'msg'
```

你能修复你的 `sleeptest.py` 应用程序，以便它能够与更新后的模块一起正确运行吗？

### 变量和函数

通过设计，函数限制了变量的范围。换句话说，如果在函数内创建一个变量，那么这个变量 *只* 在这个函数内起作用。如果你尝试在函数外部使用函数内部出现的变量，就会发生错误。

下面是对 `response.py` 应用程序的修改，尝试从 `timestamp.Timer()` 函数外部打印 `msg` 变量：

```
#!/usr/bin/env python3

from mymodularity import timestamp

print("Press the RETURN key. Count to 3, and press RETURN again.")

input()
timestamp.Timer("Started timer at ")

print("Count to 3...")

input()
timestamp.Timer("You slept for ")

print(msg)
```

试着运行它，查看错误：

```
$ python3 ./response.py
Press the RETURN key. Count to 3, and press RETURN again.

Started timer at 1560719527.7862902
Count to 3...

You slept for 1560719528.135406
Traceback (most recent call last):
  File "./response.py", line 15, in <module>
    print(msg)
NameError: name 'msg' is not defined
```

应用程序返回一个 `NameError` 消息，因为没有定义 `msg`。这看起来令人困惑，因为你编写的代码定义了 `msg`，但你对代码的了解比 Python 更深入。调用函数的代码，不管函数是出现在同一个文件中，还是打包为模块，都不知道函数内部发生了什么。一个函数独立地执行它的计算，并返回你想要它返回的内容。这其中所涉及的任何变量都只是 *本地的*：它们只存在于函数中，并且只存在于函数完成其目的所需时间内。

#### Return 语句

如果你的应用程序需要函数中特定包含的信息，那么使用 `return` 语句让函数在运行后返回有意义的数据。

时间就是金钱，所以修改 `timestamp` 函数，以使其用于一个虚构的收费系统：

```
#!/usr/bin/env python3

import time

def Timer(msg):
    print(str(msg) + str(time.time() ) )
    charge = .02
    return charge
```

现在，`timestamp` 模块每次调用都收费 2 美分，但最重要的是，它返回每次调用时所收取的金额。

以下一个如何使用 `return` 语句的演示：

```
#!/usr/bin/env python3

from mymodularity import timestamp

print("Press RETURN for the time (costs 2 cents).")
print("Press Q RETURN to quit.")

total = 0

while True:
    kbd = input()
    if kbd.lower() == "q":
        print("You owe $" + str(total) )
        exit()
    else:
        charge = timestamp.Timer("Time is ")
        total = total+charge
```

在这个示例代码中，变量 `charge` 为 `timestamp.Timer()` 函数的返回，它接收函数返回的任何内容。在本例中，函数返回一个数字，因此使用一个名为 `total` 的新变量来跟踪已经进行了多少更改。当应用程序收到要退出的信号时，它会打印总花费：

```
$ python3 ./charge.py
Press RETURN for the time (costs 2 cents).
Press Q RETURN to quit.

Time is 1560722430.345412

Time is 1560722430.933996

Time is 1560722434.6027434

Time is 1560722438.612629

Time is 1560722439.3649364
q
You owe $0.1
```

#### 内联函数

函数不必在单独的文件中创建。如果你只是针对一个任务编写一个简短的脚本，那么在同一个文件中编写函数可能更有意义。唯一的区别是你不必导入自己的模块，但函数的工作方式是一样的。以下是时间测试应用程序的最新迭代：

```
#!/usr/bin/env python3

import time

total = 0

def Timer(msg):
    print(str(msg) + str(time.time() ) )
    charge = .02
    return charge

print("Press RETURN for the time (costs 2 cents).")
print("Press Q RETURN to quit.")

while True:
    kbd = input()
    if kbd.lower() == "q":
        print("You owe $" + str(total) )
        exit()
    else:
        charge = Timer("Time is ")
        total = total+charge
```

它没有外部依赖（Python 发行版中包含 `time` 模块），产生与模块化版本相同的结果。它的优点是一切都位于一个文件中，缺点是你不能在其他脚本中使用 `Timer()` 函数，除非你手动复制和粘贴它。

#### 全局变量

在函数外部创建的变量没有限制作用域，因此它被视为 *全局* 变量。

全局变量的一个例子是在 `charge.py` 中用于跟踪当前花费的 `total` 变量。`total` 是在函数之外创建的，因此它绑定到应用程序而不是特定函数。

应用程序中的函数可以访问全局变量，但要将变量传入导入的模块，你必须像发送 `msg` 变量一样将变量传入模块。

全局变量很方便，因为它们似乎随时随地都可用，但也很难跟踪它们，很难知道哪些变量不再需要了但是仍然在系统内存中停留（尽管 Python 有非常好的垃圾收集机制）。

但是，全局变量很重要，因为不是所有的变量都可以是函数或类的本地变量。现在你知道了如何向函数传入变量并获得返回，事情就变得容易了。

### 总结

你已经学到了很多关于函数的知识，所以开始将它们放入你的脚本中 —— 如果它不是作为单独的模块，那么作为代码块，你不必在一个脚本中编写多次。在本系列的下一篇文章中，我将介绍 Python 类。

---

via: <https://opensource.com/article/19/7/get-modular-python-functions>

作者：[Seth Kenlon](https://opensource.com/users/seth/users/xd-deng/users/nhuntwalker/users/don-watkins) 选题：[lujun9972](https://github.com/lujun9972) 译者：[MjSeven](https://github.com/MjSeven) 校对：[wxy](https://github.com/wxy)

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


《代码英雄》第一季（2）：操作系统战争（下）Linux 崛起

Summary: 代码英雄（Command Line Heroes）是世界领先的企业开源软件解决方案供应商红帽（Red Hat）精心制作的音频播客，讲述开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。该音频博客邀请到了谷歌、NASA等重量级企业的众多技术大牛共同讲述开源、操作系统、容器、DevOps、混合云等发展过程中的动人故事。点击链接https://www.redhat.com/en/command-line-heroes查 看更多信息。

>
> <ruby> 代码英雄 <rp>  （ </rp> <rt>  Command Line Heroes </rt> <rp>  ） </rp></ruby>是世界领先的企业开源软件解决方案供应商<ruby> 红帽 <rp>  （ </rp> <rt>  Red Hat </rt> <rp>  ） </rp></ruby>精心制作的音频播客，讲述开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。该音频博客邀请到了谷歌、NASA 等重量级企业的众多技术大牛共同讲述开源、操作系统、容器、DevOps、混合云等发展过程中的动人故事。点击链接<https://www.redhat.com/en/command-line-heroes> 查看更多信息。
>
>
>

![](/data/attachment/album/201909/02/101857zmmh1an1mzhhj3kc.png)

本文是《[代码英雄](https://www.redhat.com/en/command-line-heroes)》系列播客[第一季（2）：操作系统战争（下）](https://www.redhat.com/en/command-line-heroes/season-1/os-wars-part-2-rise-of-linux) 的[音频](https://dts.podtrac.com/redirect.mp3/audio.simplecast.com/2199861a.mp3)脚本。

>
> 微软帝国控制着 90％ 的用户。操作系统的完全标准化似乎是板上钉钉的事了。但是一个不太可能的英雄出现在开源反叛组织中。戴着眼镜，温文尔雅的<ruby> 林纳斯·托瓦兹 <rt>  Linus Torvalds </rt></ruby>免费发布了他的 Linux® 程序。微软打了个趔趄，并且开始重整旗鼓而来，战场从个人电脑转向互联网。
>
>
>

**Saron Yitbarek:** 这玩意开着的吗？让我们进一段史诗般的星球大战的开幕吧，开始了。

配音：第二集：Linux® 的崛起。微软帝国控制着 90% 的桌面用户。操作系统的全面标准化似乎是板上钉钉的事了。然而，互联网的出现将战争的焦点从桌面转向了企业，在该领域，所有商业组织都争相构建自己的服务器。*[00:00:30]*与此同时，一个不太可能的英雄出现在开源反叛组织中。固执、戴着眼镜的 <ruby> 林纳斯·托瓦兹 <rt>  Linus Torvalds </rt></ruby>免费发布了他的 Linux 系统。微软打了个趔趄，并且开始重整旗鼓而来。

**Saron Yitbarek:** 哦，我们书呆子就是喜欢那样。上一次我们讲到哪了？苹果和微软互相攻伐，试图在一场争夺桌面用户的战争中占据主导地位。*[00:01:00]* 在第一集的结尾，我们看到微软获得了大部分的市场份额。很快，由于互联网的兴起以及随之而来的开发者大军，整个市场都经历了一场地震。互联网将战场从在家庭和办公室中的个人电脑用户转移到拥有数百台服务器的大型商业客户中。

这意味着巨量资源的迁移。突然间，所有相关企业不仅被迫为服务器空间和网站建设付费，而且还必须集成软件来进行资源跟踪和数据库监控等工作。*[00:01:30]* 你需要很多开发人员来帮助你。至少那时候大家都是这么做的。

在操作系统之战的第二部分，我们将看到优先级的巨大转变，以及像林纳斯·托瓦兹和<ruby> 理查德·斯托尔曼 <rt>  Richard Stallman </rt></ruby>这样的开源反逆者是如何成功地在微软和整个软件行业的核心地带引发恐惧的。

我是 Saron Yitbarek，你现在收听的是代码英雄，一款红帽公司原创的播客节目。*[00:02:00]* 每一集，我们都会给你带来“从码开始”改变技术的人的故事。

好。想象一下你是 1991 年时的微软。你自我感觉良好，对吧？满怀信心。确立了全球主导的地位感觉不错。你已经掌握了与其他企业合作的艺术，但是仍然将大部分开发人员、程序员和系统管理员排除在联盟之外，而他们才是真正的步兵。*[00:02:30]* 这时出现了个叫林纳斯·托瓦兹的芬兰极客。他和他的开源程序员团队正在开始发布 Linux，这个操作系统内核是由他们一起编写出来的。

坦白地说，如果你是微软公司，你并不会太在意 Linux，甚至不太关心开源运动，但是最终，Linux 的规模变得如此之大，以至于微软不可能不注意到。*[00:03:00]* Linux 第一个版本出现在 1991 年，当时大概有 1 万行代码。十年后，变成了 300 万行代码。如果你想知道，今天则是 2000 万行代码。

*[00:03:30]* 让我们停留在 90 年代初一会儿。那时 Linux 还没有成为我们现在所知道的庞然大物。这个奇怪的病毒式的操作系统只是正在这个星球上蔓延，全世界的极客和黑客都爱上了它。那时候我还太年轻，但有点希望我曾经经历过那个时候。在那个时候，发现 Linux 就如同进入了一个秘密社团一样。就像其他人分享地下音乐混音带一样，程序员与朋友们分享 Linux CD 集。

开发者 Tristram Oaten *[00:03:40]* 讲讲你 16 岁时第一次接触 Linux 的故事吧。

**Tristram Oaten:** 我和我的家人去了红海的 Hurghada 潜水度假。那是一个美丽的地方，强烈推荐。第一天，我喝了自来水。也许，我妈妈跟我说过不要这么做。我整个星期都病得很厉害，没有离开旅馆房间。*[00:04:00]* 当时我只带了一台新安装了 Slackware Linux 的笔记本电脑，我听说过这玩意并且正在尝试使用它。所有的东西都在 8 张 cd 里面。这种情况下，我只能整个星期都去了解这个外星一般的系统。我阅读手册，摆弄着终端。我记得当时我甚至不知道一个点（表示当前目录）和两个点（表示前一个目录）之间的区别。

*[00:04:30]* 我一点头绪都没有。犯过很多错误，但慢慢地，在这种强迫的孤独中，我突破了障碍，开始理解并明白命令行到底是怎么回事。假期结束时，我没有看过金字塔、尼罗河等任何埃及遗址，但我解锁了现代世界的一个奇迹。我解锁了 Linux，接下来的事大家都知道了。

**Saron Yitbarek:** 你会从很多人那里听到关于这个故事的不同说法。访问 Linux 命令行是一种革命性的体验。

**David Cantrell:** *[00:05:00]* 它给了我源代码。我当时的感觉是，“太神奇了”。

**Saron Yitbarek:** 我们正在参加一个名为 Flock to Fedora 的 2017 年 Linux 开发者大会。

**David Cantrell:** ……非常有吸引力。我觉得我对这个系统有了更多的控制力，它越来越吸引我。我想，从 1995 年我第一次编译 Linux 内核那时起，我就迷上了它。

**Saron Yitbarek:** 开发者 David Cantrell 与 Joe Brockmire。

**Joe Brockmeier:** *[00:05:30]* 我在 Cheap Software 转的时候发现了一套四张 CD 的 Slackware Linux。它看起来来非常令人兴奋而且很有趣，所以我把它带回家，安装在第二台电脑上，开始摆弄它，有两件事情让我感到很兴奋：一个是，我运行的不是 Windows，另一个是 Linux 的开源特性。

**Saron Yitbarek:** *[00:06:00]* 某种程度上来说，对命令行的使用总是存在的。在开源真正开始流行还要早的几十年前，人们（至少在开发人员中是这样）总是希望能够做到完全控制。让我们回到操作系统大战之前的那个时代，在苹果和微软为他们的 GUI 而战之前。那时也有代码英雄。<ruby> 保罗·琼斯 <rt>  Paul Jones </rt></ruby>教授（在线图书馆 ibiblio.org 的负责人）在那个古老的时代，就是一名开发人员。

**Paul Jones:** *[00:06:30]* 从本质上讲，互联网在那个时候客户端-服务器架构还是比较少的，而更多的是点对点架构的。确实，我们会说，某种 VAX 到 VAX 的连接（LCTT 译注：DEC 的一种操作系统），某种科学工作站到科学工作站的连接。这并不意味着没有客户端-服务端的架构及应用程序，但这的确意味着，最初的设计是思考如何实现点对点，*[00:07:00]* 它与 IBM 一直在做的东西相对立。IBM 给你的只有哑终端，这种终端只能让你管理用户界面，却无法让你像真正的终端一样为所欲为。

**Saron Yitbarek:** 图形用户界面在普通用户中普及的同时，在工程师和开发人员中总是存在着一股相反的力量。早在 Linux 出现之前的二十世纪七八十年代，这股力量就存在于 Emacs 和 GNU 中。有了斯托尔曼的自由软件基金会后，总有某些人想要使用命令行，但上世纪 90 年代的 Linux 提供了前所未有的东西。

*[00:07:30]* Linux 和其他开源软件的早期爱好者是都是先驱。我正站在他们的肩膀上。我们都是。

你现在收听的是代码英雄，一款由红帽公司原创的播客。这是操作系统大战的第二部分：Linux 崛起。

**Steven Vaughan-Nichols:** 1998 年的时候，情况发生了变化。

**Saron Yitbarek:** *[00:08:00]* Steven Vaughan-Nichols 是 zdnet.com 的特约编辑，他已经写了几十年关于技术商业方面的文章了。他将向我们讲述 Linux 是如何慢慢变得越来越流行，直到自愿贡献者的数量远远超过了在 Windows 上工作的微软开发人员的数量的。不过，Linux 从未真正追上微软桌面客户的数量，这也许就是微软最开始时忽略了 Linux 及其开发者的原因。Linux 真正大放光彩的地方是在服务器机房。当企业开始线上业务时，每个企业都需要一个满足其需求的独特编程解决方案。

*[00:08:30]* WindowsNT 于 1993 年问世，当时它已经在与其他的服务器操作系统展开竞争了，但是许多开发人员都在想，“既然我可以通过 Apache 构建出基于 Linux 的廉价系统，那我为什么要购买 AIX 设备或大型 Windows 设备呢？”关键点在于，Linux 代码已经开始渗透到几乎所有网上的东西中。

**Steven Vaughan-Nichols:** *[00:09:00]* 令微软感到惊讶的是，它开始意识到，Linux 实际上已经开始有一些商业应用，不是在桌面环境，而是在商业服务器上。因此，他们发起了一场运动，我们称之为 FUD - <ruby> 恐惧、不确定和怀疑 <rt>  fear, uncertainty and double </rt></ruby>。他们说，“哦，Linux 这玩意，真的没有那么好。它不太可靠。你一点都不能相信它”。

**Saron Yitbarek:** 这种软宣传式的攻击持续了一段时间。微软也不是唯一一个对 Linux 感到紧张的公司。这其实是整个行业在对抗这个奇怪新人的挑战。*[00:09:30]* 例如，任何与 UNIX 有利害关系的人都可能将 Linux 视为篡夺者。有一个案例很著名，那就是 SCO 组织（它发行过一种 UNIX 版本）在过去 10 多年里发起一系列的诉讼，试图阻止 Linux 的传播。SCO 最终失败而且破产了。与此同时，微软一直在寻找机会，他们必须要采取动作，只是不清楚具体该怎么做。

**Steven Vaughan-Nichols:** *[00:10:00]* 让微软真正担心的是，第二年，在 2000 年的时候，IBM 宣布，他们将于 2001 年投资 10 亿美元在 Linux 上。现在，IBM 已经不再涉足个人电脑业务。（那时）他们还没有走出去，但他们正朝着这个方向前进，他们将 Linux 视为服务器和大型计算机的未来，在这一点上，剧透警告，IBM 是正确的。*[00:10:30]* Linux 将主宰服务器世界。

**Saron Yitbarek:** 这已经不再仅仅是一群黑客喜欢他们对命令行的绝地武士式的控制了。金钱的投入对 Linux 助力极大。<ruby> Linux 国际 <rt>  Linux International </rt></ruby>的执行董事 John “Mad Dog” Hall 有一个故事可以解释为什么会这样。我们通过电话与他取得了联系。

**John Hall:** *[00:11:00]* 我有一个名叫 Dirk Holden 的朋友，他是德国德意志银行的系统管理员，他也参与了个人电脑上早期 X Windows 系统图形项目的工作。有一天我去银行拜访他，我说：“Dirk，你银行里有 3000 台服务器，用的都是 Linux。为什么不用 Microsoft NT 呢？”*[00:11:30]* 他看着我说：“是的，我有 3000 台服务器，如果使用微软的 Windows NT 系统，我需要 2999 名系统管理员。”他继续说道：“而使用 Linux，我只需要四个。”这真是完美的答案。

**Saron Yitbarek:** 程序员们着迷的这些东西恰好对大公司也极具吸引力。但由于 FUD 的作用，一些企业对此持谨慎态度。*[00:12:00]* 他们听到开源，就想：“开源。这看起来不太可靠，很混乱，充满了 BUG”。但正如那位银行经理所指出的，金钱有一种有趣的方式，可以说服人们克服困境。甚至那些只需要网站的小公司也加入了 Linux 阵营。与一些昂贵的专有选择相比，使用一个廉价的 Linux 系统在成本上是无法比拟的。如果你是一家雇佣专业人员来构建网站的商店，那么你肯定想让他们使用 Linux。

让我们快进几年。Linux 运行每个人的网站上。Linux 已经征服了服务器世界，然后智能手机也随之诞生。*[00:12:30]* 当然，苹果和他们的 iPhone 占据了相当大的市场份额，而且微软也希望能进入这个市场，但令人惊讶的是，Linux 也在那，已经做好准备了，迫不及待要大展拳脚。

作家兼记者 James Allworth。

**James Allworth:** 肯定还有容纳第二个竞争者的空间，那本可以是微软，但是实际上却是 Android，而 Andrid 基本上是基于 Linux 的。众所周知，Android 被谷歌所收购，现在运行在世界上大部分的智能手机上，谷歌在 Linux 的基础上创建了 Android。*[00:13:00]* Linux 使他们能够以零成本从一个非常复杂的操作系统开始。他们成功地实现了这一目标，最终将微软挡在了下一代设备之外，至少从操作系统的角度来看是这样。

**Saron Yitbarek:** *[00:13:30]* 这可是个大地震，很大程度上，微软有被埋没的风险。John Gossman 是微软 Azure 团队的首席架构师。他还记得当时困扰公司的困惑。

**John Gossman:** 像许多公司一样，微软也非常担心知识产权污染。他们认为，如果允许开发人员使用开源代码，那么他们可能只是将一些代码复制并粘贴到某些产品中，就会让某种病毒式的许可证生效从而引发未知的风险……他们也很困惑，*[00:14:00]* 我认为，这跟公司文化有关，很多公司，包括微软，都对开源开发的意义和商业模式之间的分歧感到困惑。有一种观点认为，开源意味着你所有的软件都是免费的，人们永远不会付钱。

**Saron Yitbarek:** 任何投资于旧的、专有软件模型的人都会觉得这里发生的一切对他们构成了威胁。当你威胁到像微软这样的大公司时，是的，他们一定会做出反应。*[00:14:30]* 他们推动所有这些 FUD —— 恐惧、不确定性和怀疑是有道理的。当时，商业运作的方式基本上就是相互竞争。不过，如果是其他公司的话，他们可能还会一直怀恨在心，抱残守缺，但到了 2013 年的微软，一切都变了。

微软的云计算服务 Azure 上线了，令人震惊的是，它从第一天开始就提供了 Linux 虚拟机。*[00:15:00]* <ruby> 史蒂夫·鲍尔默 <rt>  Steve Ballmer </rt></ruby>，这位把 Linux 称为癌症的首席执行官，已经离开了，代替他的是一位新的有远见的首席执行官<ruby> 萨提亚·纳德拉 <rt>  Satya Nadella </rt></ruby>。

**John Gossman:** 萨提亚有不同的看法。他属于另一个世代。比保罗、比尔和史蒂夫更年轻的世代，他对开源有不同的看法。

**Saron Yitbarek:** 还是来自微软 Azure 团队的 John Gossman。

**John Gossman:** *[00:15:30]* 大约四年前，处于实际需要，我们在 Azure 中添加了 Linux 支持。如果访问任何一家企业客户，你都会发现他们并不会才试着决定是使用 Windows 还是使用 Linux、 使用 .net 还是使用 Java <sup> TM</sup> 。他们在很久以前就做出了决定 —— 大约 15 年前才有这样的一些争论。*[00:16:00]* 现在，我见过的每一家公司都混合了 Linux 和 Java、Windows 和 .net、SQL Server、Oracle 和 MySQL —— 基于专有源代码的产品和开放源代码的产品。

如果你打算运维一个云服务，允许这些公司在云上运行他们的业务，那么你根本不能告诉他们，“你可以使用这个软件，但你不能使用那个软件。”

**Saron Yitbarek:** *[00:16:30]* 这正是萨提亚·纳德拉采纳的哲学思想。2014 年秋季，他站在舞台上，希望传递一个重要信息。“微软爱 Linux”。他接着说，“20% 的 Azure 业务量已经是 Linux 了，微软将始终对 Linux 发行版提供一流的支持。”没有哪怕一丝对开源的宿怨。

为了说明这一点，在他们的背后有一个巨大的标志，上面写着：“Microsoft ❤ Linux”。哇噢。对我们中的一些人来说，这种转变有点令人震惊，但实际上，无需如此震惊。下面是 Steven Levy，一名科技记者兼作家。

**Steven Levy:** *[00:17:00]* 当你在踢足球的时候，如果草坪变滑了，那么你也许会换一种不同的鞋子。他们当初就是这么做的。*[00:17:30]* 他们不能否认现实，而且他们里面也有聪明人，所以他们必须意识到，这就是这个世界的运行方式，不管他们早些时候说了什么，即使他们对之前的言论感到尴尬，但是让他们之前关于开源多么可怕的言论影响到现在明智的决策那才真的是疯了。

**Saron Yitbarek:** 微软低下了它高傲的头。你可能还记得苹果公司，经过多年的孤立无援，最终转向与微软构建合作伙伴关系。现在轮到微软进行 180 度转变了。*[00:18:00]* 经过多年的与开源方式的战斗后，他们正在重塑自己。要么改变，要么死亡。Steven Vaughan-Nichols。

**Steven Vaughan-Nichols:** 即使是像微软这样规模的公司也无法与数千个开发着包括 Linux 在内的其它大项目的开源开发者竞争。很长时间以来他们都不愿意这么做。前微软首席执行官史蒂夫·鲍尔默对 Linux 深恶痛绝。*[00:18:30]* 由于它的 GPL 许可证，他视 Linux 为一种癌症，但一旦鲍尔默被扫地出门，新的微软领导层说，“这就好像试图命令潮流不要过来，但潮水依然会不断涌进来。我们应该与 Linux 合作，而不是与之对抗。”

**Saron Tiebreak:** 事实上，互联网技术史上最大的胜利之一就是微软最终决定做出这样的转变。*[00:19:00]* 当然，当微软出现在开源圈子时，老一代的铁杆 Linux 支持者是相当怀疑的。他们不确定自己是否能接受这些家伙，但正如 Vaughan-Nichols 所指出的，今天的微软已经不是以前的微软了。

**Steven Vaughan-Nichols:** 2017 年的微软既不是史蒂夫·鲍尔默的微软，也不是比尔·盖茨的微软。这是一家完全不同的公司，有着完全不同的方法，而且，一旦使用了开源，你就无法退回到之前。*[00:19:30]* 开源已经吞噬了整个技术世界。从未听说过 Linux 的人可能对它并不了解，但是每次他们访问 Facebook，他们都在运行 Linux。每次执行谷歌搜索时，你都在运行 Linux。

*[00:20:00]* 每次你用 Android 手机，你都在运行 Linux。它确实无处不在，微软无法阻止它，而且我认为以为微软能以某种方式接管它的想法，太天真了。

**Saron Yitbarek:** 开源支持者可能一直担心微软会像混入羊群中的狼一样，但事实是，开源软件的本质保护了它无法被完全控制。*[00:20:30]* 没有一家公司能够拥有 Linux 并以某种特定的方式控制它。Greg Kroah-Hartman 是 Linux 基金会的一名成员。

**Greg Kroah-Hartman:** 每个公司和个人都以自私的方式为 Linux 做出贡献。他们之所以这样做是因为他们想要解决他们所面临的问题，可能是硬件无法工作，或者是他们想要添加一个新功能来做其他事情，又或者想在他们的产品中使用它。这很棒，因为他们会把代码贡献回去，此后每个人都会从中受益，这样每个人都可以用到这份代码。正是因为这种自私，所有的公司，所有的人都能从中受益。

**Saron Yitbarek:** *[00:21:00]* 微软已经意识到，在即将到来的云战争中，与 Linux 作战就像与空气作战一样。Linux 和开源不是敌人，它们是空气。如今，微软以白金会员的身份加入了 Linux 基金会。他们成为 GitHub 开源项目的头号贡献者。*[00:21:30]* 2017 年 9 月，他们甚至加入了<ruby> 开源促进联盟 <rt>  Open Source Initiative </rt></ruby>。现在，微软在开源许可证下发布了很多代码。微软的 John Gossman 描述了他们开源 .net 时所发生的事情。起初，他们并不认为自己能得到什么回报。

**John Gossman:** 我们本没有指望来自社区的贡献，然而，三年后，超过 50% 的对 .net 框架库的贡献来自于微软之外。这包括大量的代码。*[00:22:00]* 三星为 .net 提供了 ARM 支持。Intel 和 ARM 以及其他一些芯片厂商已经为 .net 框架贡献了特定于他们处理器的代码生成，以及数量惊人的修复、性能改进等等 —— 既有单个贡献者也有社区。

**Saron Yitbarek:** 直到几年前，今天的这个微软，这个开放的微软，还是不可想象的。

*[00:22:30]* 我是 Saron Yitbarek，这里是代码英雄。好吧，我们已经看到了为了赢得数百万桌面用户的爱而战的激烈场面。我们已经看到开源软件在专有软件巨头的背后悄然崛起，并攫取了巨大的市场份额。*[00:23:00]* 我们已经看到了一批批的代码英雄将编程领域变成了我你今天看到的这个样子。如今，大企业正在吸收开源软件，通过这一切，每个人都从他人那里受益。

在技术的西部荒野，一贯如此。苹果受到施乐的启发，微软受到苹果的启发，Linux 受到 UNIX 的启发。进化、借鉴、不断成长。如果比喻成大卫和歌利亚（LCTT 译注：西方经典的以弱胜强战争中的两个主角）的话，开源软件不再是大卫，但是，你知道吗？它也不是歌利亚。*[00:23:30]* 开源已经超越了传统。它已经成为其他人战斗的战场。随着开源道路变得不可避免，新的战争，那些在云计算中进行的战争，那些在开源战场上进行的战争正在加剧。

这是 Steven Levy，他是一名作者。

**Steven Levy:** 基本上，到目前为止，包括微软在内，有四到五家公司，正以各种方式努力把自己打造成为全方位的平台，比如人工智能领域。你能看到智能助手之间的战争，你猜怎么着？*[00:24:00]* 苹果有一个智能助手，叫 Siri。微软有一个，叫 Cortana。谷歌有谷歌助手。三星也有一个智能助手。亚马逊也有一个，叫 Alexa。我们看到这些战斗遍布各地。也许，你可以说，最热门的人工智能平台将控制我们生活中所有的东西，而这五家公司就是在为此而争斗。

**Saron Yitbarek:** *[00:24:30]* 如果你正在寻找另一个反叛者，它们就像 Linux 奇袭微软那样，偷偷躲在 Facebook、谷歌或亚马逊身后，你也许要等很久，因为正如作家 James Allworth 所指出的，成为一个真正的反叛者只会变得越来越难。

**James Allworth:** 规模一直以来都是一种优势，但规模优势本质上……怎么说呢，我认为以前它们在本质上是线性的，现在它们在本质上是指数型的了，所以，一旦你开始以某种方法走在前面，另一个新玩家要想赶上来就变得越来越难了。*[00:25:00]* 我认为在互联网时代这大体来说来说是正确的，无论是因为规模，还是数据赋予组织的竞争力的重要性和优势。一旦你走在前面，你就会吸引更多的客户，这就给了你更多的数据，让你能做得更好，这之后，客户还有什么理由选择排名第二的公司呢，难道是因为因为他们落后了这么远么？*[00:25:30]* 我认为在云的时代这个逻辑也不会有什么不同。

**Saron Yitbarek:** 这个故事始于史蒂夫·乔布斯和比尔·盖茨这样的非凡的英雄，但科技的进步已经呈现出一种众包、有机的感觉。我认为据说我们的开源英雄林纳斯·托瓦兹在第一次发明 Linux 内核时甚至没有一个真正的计划。他无疑是一位才华横溢的年轻开发者，但他也像潮汐前的一滴水一样。*[00:26:00]* 变革是不可避免的。据估计，对于一家专有软件公司来说，用他们老式的、专有的方式创建一个 Linux 发行版将花费他们超过 100 亿美元。这说明了开源的力量。

最后，这并不是一个专有模型所能与之竞争的东西。成功的公司必须保持开放。这是最大、最终极的教训。*[00:26:30]* 还有一点要记住：当我们连接在一起的时候，我们在已有基础上成长和建设的能力是无限的。不管这些公司有多大，我们都不必坐等他们给我们更好的东西。想想那些为了纯粹的创造乐趣而学习编码的新开发者，那些自己动手丰衣足食的人。

未来的优秀程序员无管来自何方，只要能够访问代码，他们就能构建下一个大项目。

*[00:27:00]* 以上就是我们关于操作系统战争的两个故事。这场战争塑造了我们的数字生活。争夺主导地位的斗争从桌面转移到了服务器机房，最终进入了云计算领域。过去的敌人难以置信地变成了盟友，众包的未来让一切都变得开放。*[00:27:30]* 听着，我知道，在这段历史之旅中，还有很多英雄我们没有提到，所以给我们写信吧。分享你的故事。[Redhat.com/commandlineheroes](https://www.redhat.com/commandlineheroes) 。我恭候佳音。

在本季剩下的时间里，我们将学习今天的英雄们在创造什么，以及他们要经历什么样的战斗才能将他们的创造变为现实。让我们从壮丽的编程一线回来看看更多的传奇故事吧。我们每两周放一集新的博客。几周后，我们将为你带来第三集：敏捷革命。

*[00:28:00]* 代码英雄是一款红帽公司原创的播客。要想免费自动获得新一集的代码英雄，请订阅我们的节目。只要在苹果播客、Spotify、 谷歌 Play，或其他应用中搜索“Command Line Heroes”。然后点击“订阅”。这样你就会第一个知道什么时候有新剧集了。

我是 Saron Yitbarek。感谢收听。继续编码。

---

via: <https://www.redhat.com/en/command-line-heroes/season-1/os-wars-part-2-rise-of-linux>

作者：[redhat](https://www.redhat.com) 选题：[lujun9972](https://github.com/lujun9972) 译者：[lujun9972](https://github.com/lujun9972) 校对：[wxy](https://github.com/wxy)

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


如何升级 Linux Mint 19.1 为 Linux Mint 19.2

![](/data/attachment/album/201909/02/231523na40npunm88z68ka.jpg)

Linux Mint 19.2 “Tina” 在 2019 年 8 月 2 日发布，它是一个基于 Ubuntu 18.04 LTS (Bionic Beaver) 的长期支持版本。它将被支持到 2023 年。它带来更新的软件和精细的改进和很多新的特色来使你的桌面使用地更舒适。

Linux Mint 19.2 特色有 Cinnamon 4.2 、Linux 内核 4.15 和 Ubuntu 18.04 基础软件包。

**注意：** 不要忘记备份你的重要数据。如果一些东西出错，在最新的安装后，你可以从备份中恢复数据。

备份可以通过 rsnapshot 或 timeshift 完成。

Linux Mint 19.2 “Tina” 发布日志可以在下面的链接中找到。

* [Linux Mint 19.2 (Tina) 发布日志](https://www.linuxtechnews.com/linux-mint-19-2-tina-released-check-what-is-new-feature/)

这里有三种方法，能让我们升级为 Linux Mint 19.2 “Tina”。

* 使用本地方法升级 Linux Mint 19.2 (Tina)
* 使用 Mintupgrade 实用程序方法升级 Linux Mint 19.2 (Tina)
* 使用 GUI 升级 Linux Mint 19.2 (Tina)

### 如何从 Linux Mint 19.1 (Tessa) 升级为 Linux Mint 19.2 (Tina)？

升级 Linux Mint 系统是一项简单轻松的任务。有三种方法可以完成。

### 方法-1：使用本地方法升级 Linux Mint 19.2 (Tina)

这是执行升级 Linux Mint 系统的本地和标准的方法之一。为做到这点，遵循下面的程序步骤。

确保你当前 Linux Mint 系统是最新的。使用下面的命令来更新你现在的软件为最新可用版本。

#### 步骤-1：

通过运行下面的命令来刷新存储库索引。

```
$ sudo apt update
```

运行下面的命令来在系统上安装可用的更新。

```
$ sudo apt upgrade
```

运行下面的命令来在版本中执行可用的次要更新。

```
$ sudo apt full-upgrade
```

默认情况下，它将通过上面的命令来移除过时的软件包。但是，我建议你运行下面的命令。

```
$ sudo apt autoremove
$ sudo apt clean
```

如果安装一个新的内核，你可能需要重启系统。如果是这样，运行下面的命令。

```
$ sudo shutdown -r now
```

最后检查当前安装的版本。

```
$ lsb_release -a

No LSB modules are available.
Distributor ID: Linux Mint
Description:    Linux Mint 19.1 (Tessa)
Release:        19.1
Codename:       Tessa
```

#### 步骤-2：更新/修改 /etc/apt/sources.list 文件

在重启后，修改 `sources.list` 文件，并从 Linux Mint 19.1 (Tessa) 指向 Linux Mint 19.2 (Tina)。

首先，使用 `cp` 命令备份下面的配置文件。

```
$ sudo cp  /etc/apt/sources.list /root
$ sudo cp -r /etc/apt/sources.list.d/ /root
```

修改 `sources.list` 文件，并指向 Linux Mint 19.2 (Tina)。

```
$ sudo sed -i 's/tessa/tina/g' /etc/apt/sources.list
$ sudo sed -i 's/tessa/tina/g' /etc/apt/sources.list.d/*
```

通过运行下面的命令来刷新存储库索引。

```
$ sudo apt update
```

运行下面的命令来在系统上安装可用的更新。在升级过程中，你可用需要确认服务重启和配置文件替换，因此，只需遵循屏幕上的指令。

升级可能花费一些时间，具体依赖于更新的数量和你的网络速度。

```
$ sudo apt upgrade
```

运行下面的命令来执行一次完整的系统升级。

```
$ sudo apt full-upgrade
```

默认情况下，上面的命令将移除过时的软件包。但是，我建议你再次运行下面的命令。

```
$ sudo apt autoremove
$ sudo apt clean
```

最后重启系统来启动 Linux Mint 19.2 (Tina)。

```
$ sudo shutdown -r now
```

升级后的 Linux Mint 版本可以通过运行下面的命令验证。

```
$ lsb_release -a

No LSB modules are available.
Distributor ID: Linux Mint
Description:    Linux Mint 19.2 (Tina)
Release:        19.2
Codename:       Tina
```

### 方法-2：使用 Mintupgrade 实用程序升级 Linux Mint 19.2 (Tina)

这是 Mint 官方实用程序，它允许我们对 Linux Mint 系统执行平滑升级。

使用下面的命令来安装 mintupgrade 软件包。

```
$ sudo apt install mintupgrade
```

确保你已经安装 mintupgrade 软件包的最新版本。

```
$ apt version mintupgrade
```

以一个普通用户来运行下面的命令以模拟一次升级，遵循屏幕上的指令。

```
$ mintupgrade check
```

使用下面的命令来下载需要的软件包来升级为 Linux Mint 19.2 (Tina) ，遵循屏幕上的指令。

```
$ mintupgrade download
```

运行下面的命令来运用升级，最新屏幕上的指令。

```
$ mintupgrade upgrade
```

在成功升级后，重启系统，并检查升级后的版本。

```
$ lsb_release -a

No LSB modules are available.
Distributor ID: Linux Mint
Description:    Linux Mint 19.2 (Tina)
Release:        19.2
Codename:       Tina
```

### 方法-3：使用 GUI 升级 Linux Mint 19.2 (Tina)

或者，我们可以通过 GUI 执行升级。

#### 步骤-1：

通过 Timeshift 创建一个系统快照。如果一些东西出错，你可以简单地恢复你的操作系统到它先前状态。

#### 步骤-2:

打开更新管理器，单击刷新按钮来检查 mintupdate 和 mint-upgrade-info 的任何新版本。如果有这些软件包的更新，应用它们。

通过单击 “编辑-> 升级到 Linux Mint 19.2 Tina”来启动系统升级。

![](/data/attachment/album/201909/02/231542ack7q7p664umkqfc.png)

遵循屏幕上的指令。如果被询问是否保留或替换配置文件，选择替换它们。

![](/data/attachment/album/201909/02/231545kolm8bkwolba6aau.png)

#### 步骤-3:

在升级完成后，重启你的电脑。

---

via: <https://www.2daygeek.com/upgrade-linux-mint-19-1-tessa-to-linux-mint-19-2-tina/>

作者：[2daygeek](http://www.2daygeek.com/author/2daygeek/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[robsean](https://github.com/robsean) 校对：[wxy](https://github.com/wxy)

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


五大物联网网络安全错误

>
> IT 供应商兄弟国际公司分享了五种最常见的物联网安全错误，这是从它们的打印机和多功能设备买家中看到的。
>
>
>

![Getty Images](/data/attachment/album/201909/03/002615nrk3xqq32lqbg94q.jpg)

尽管[兄弟国际公司](https://www.brother-usa.com/business)是许多 IT 产品的供应商，从[机床](https://www.brother-usa.com/machinetool/default?src=default)到[头戴式显示器](https://www.brother-usa.com/business/hmd#sort=%40productcatalogsku%20ascending)再到[工业缝纫机](https://www.brother-usa.com/business/industrial-sewing)，但它最知名的产品是打印机。在当今世界，这些打印机不再是独立的设备，而是物联网的组成部分。

这也是我为什么对罗伯特•伯内特提供的这份列表感兴趣的原因。伯内特是兄弟公司的总监，负责 B2B 产品和提供解决方案。基本上是该公司负责大客户实施的关键人物。所以他对打印机相关的物联网安全错误非常关注，并且分享了兄弟国际公司对于处理这五大错误的建议。

### #5：不控制访问和授权

伯内特说：“过去，成本控制是管理谁可以使用机器、何时结束工作背后的推动力。”当然，这在今天也仍然很重要，但他指出安全性正迅速成为管理控制打印和扫描设备的关键因素。这不仅适用于大型企业，也适用于各种规模的企业。

### #4：无法定期更新固件

让我们来面对这一现实，大多数 IT 专业人员都忙于保持服务器和其他网络基础设施设备的更新，确保其基础设施尽可能的安全高效。“在这日常的流程中，像打印机这样的设备经常被忽视。”但过时的固件可能会使基础设施面临新的威胁。

### #3：设备意识不足

伯内特说：“正确理解谁在使用什么设备，以及整套设备中所有连接设备的功能是什么，这是至关重要的。使用端口扫描技术、协议分析和其他检测技术检查这些设备应作为你的网络基础设施整体安全审查中的一部分。 他常常提醒人们说：“处理打印设备的方法是：如果没有损坏，就不要修理！”但即使是可靠运行多年的设备也应该成为安全审查的一部分。这是因为旧设备可能无法提供更强大的安全设置，或者可能需要更新其配置才能满足当今更高的安全要求，这其中包括设备的监控/报告功能。

### #2：用户培训不足

“应该把培训团队在工作过程中管理文档的最佳实践作为强有力的安全计划中的一部分。”伯内特说道，“然而，事实却是，无论你如何努力地去保护物联网设备，人为因素通常是一家企业在保护重要和敏感信息方面最薄弱的环节。像这些简单的事情，如无意中将重要文件留在打印机上供任何人查看，或者将文件扫描到错误的目的地，不仅会给企业带来经济损失和巨大的负面影响，还会影响企业的知识产权、声誉，引起合规性/监管问题。”

### #1：使用默认密码

“只是因为它很方便并不意味着它不重要！”伯内特说，“保护打印机和多功能设备免受未经授权的管理员访问不仅有助于保护敏感的机器配置设置和报告信息，还可以防止访问个人信息，例如，像可能用于网络钓鱼攻击的用户名。”

---

via: <https://www.networkworld.com/article/3433476/top-5-iot-networking-security-mistakes.html>

作者：[Fredric Paul](https://www.networkworld.com/author/Fredric-Paul/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[Morisun029](https://github.com/Morisun029) 校对：[wxy](https://github.com/wxy)

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


如何在 Linux 上重命名一组文件

>
> 要用单个命令重命名一组文件，请使用 rename 命令。它需要使用正则表达式，并且可以在开始前告诉你会有什么更改。
>
>
>

![](/data/attachment/album/201909/03/005333hfm8yf90m2gm800g.jpg)

几十年来，Linux 用户一直使用 `mv` 命令重命名文件。它很简单，并且能做到你要做的。但有时你需要重命名一大组文件。在这种情况下，`rename` 命令可以使这个任务更容易。它只需要一些正则表达式的技巧。

与 `mv` 命令不同，`rename` 不允许你简单地指定旧名称和新名称。相反，它使用类似于 Perl 中的正则表达式。在下面的例子中，`s` 指定我们将第一个字符串替换为第二个字符串（旧的），从而将 `this.new` 变为 `this.old`。

```
$ rename 's/new/old/' this.new
$ ls this*
this.old
```

使用 `mv this.new this.old` 可以更容易地进行更改一个，但是将字符串 `this` 变成通配符 `*`，你可以用一条命令将所有的 `*.new` 文件重命名为 `*.old`：

```
$ ls *.new
report.new  schedule.new  stats.new  this.new
$ rename 's/new/old/' *.new
$ ls *.old
report.old  schedule.old  stats.old  this.old
```

正如你所料，`rename` 命令不限于更改文件扩展名。如果你需要将名为 `report.*` 的文件更改为 `review.*`，那么可以使用以下命令做到：

```
$ rename 's/report/review/' *
```

正则表达式中的字符串可以更改文件名的任何部分，无论是文件名还是扩展名。

```
$ rename 's/123/124/' *
$ ls *124*
status.124  report124.txt
```

如果你在 `rename` 命令中添加 `-v` 选项，那么该命令将提供一些反馈，以便你可以看到所做的更改，或许会包含你没注意的。这让你注意到并按需还原更改。

```
$ rename -v 's/123/124/' *
status.123 renamed as status.124
report123.txt renamed as report124.txt
```

另一方面，使用 `-n`（或 `--nono`）选项会使 `rename` 命令告诉你将要做的但不会实际做的更改。这可以让你免于执行不不想要的操作，然后再还原更改。

```
$ rename -n 's/old/save/' *
rename(logger.man-old, logger.man-save)
rename(lyrics.txt-old, lyrics.txt-save)
rename(olderfile-, saveerfile-)
rename(oldfile, savefile)
rename(review.old, review.save)
rename(schedule.old, schedule.save)
rename(stats.old, stats.save)
rename(this.old, this.save)
```

如果你对这些更改满意，那么就可以运行不带 `-n` 选项的命令来更改文件名。

但请注意，正则表达式中的 `.` **不会**被视为句点，而是作为匹配任何字符的通配符。上面和下面的示例中的一些更改可能不是输入命令的人希望的。

```
$ rename -n 's/.old/.save/' *
rename(logger.man-old, logger.man.save)
rename(lyrics.txt-old, lyrics.txt.save)
rename(review.old, review.save)
rename(schedule.old, schedule.save)
rename(stats.old, stats.save)
rename(this.old, this.save)
```

为确保句点按照字面意思执行，请在它的前面加一个反斜杠。这将使其不被解释为通配符并匹配任何字符。请注意，进行此更改时，仅选择了 `.old` 文件。

```
$ rename -n 's/\.old/.save/' *
rename(review.old, review.save)
rename(schedule.old, schedule.save)
rename(stats.old, stats.save)
rename(this.old, this.save)
```

下面的命令会将文件名中的所有大写字母更改为小写，除了使用 `-n` 选项来确保我们在命令执行之前检查将做的修改。注意在正则表达式中使用了 `y`，这是改变大小写所必需的。

```
$ rename -n 'y/A-Z/a-z/' W*
rename(WARNING_SIGN.pdf, warning_sign.pdf)
rename(Will_Gardner_buttons.pdf, will_gardner_buttons.pdf)
rename(Wingding_Invites.pdf, wingding_invites.pdf)
rename(WOW-buttons.pdf, wow-buttons.pdf)
```

在上面的例子中，我们将所有大写字母更改为了小写，但这仅对以大写字母 `W` 开头的文件名。

### 总结

当你需要重命名大量文件时，`rename` 命令非常有用。请注意不要做比预期更多的更改。请记住，`-n`（或者 `--nono`）选项可以帮助你避免耗时的错误。

---

via: <https://www.networkworld.com/article/3433865/how-to-rename-a-group-of-files-on-linux.html>

作者：[Sandra Henry-Stocker](https://www.networkworld.com/author/Sandra-Henry_Stocker/) 选题：[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/) 荣誉推出


如何发现截断的数据项

![](/data/attachment/album/201909/03/174406g4vn4wq9f9wa4peq.jpg)

**截断**（形容词）：缩写、删节、缩减、剪切、剪裁、裁剪、修剪……

数据项被截断的一种情况是将其输入到数据库字段中，该字段的字符限制比数据项的长度要短。例如，字符串：

```
Yarrow Ravine Rattlesnake Habitat Area, 2 mi ENE of Yermo CA
```

是 60 个字符长。如果你将其输入到具有 50 个字符限制的“位置”字段，则可以获得：

```
Yarrow Ravine Rattlesnake Habitat Area, 2 mi ENE #末尾带有一个空格
```

截断也可能导致数据错误，比如你打算输入：

```
Sally Ann Hunter (aka Sally Cleveland)
```

但是你忘记了闭合的括号：

```
Sally Ann Hunter (aka Sally Cleveland
```

这会让使用数据的用户觉得 Sally 是否有被修剪掉了数据项的其它的别名。

截断的数据项很难检测。在审核数据时，我使用三种不同的方法来查找可能的截断，但我仍然可能会错过一些。

**数据项的长度分布。**第一种方法是捕获我在各个字段中找到的大多数截断的数据。我将字段传递给 `awk` 命令，该命令按字段宽度计算数据项，然后我使用 `sort` 以宽度的逆序打印计数。例如，要检查以 `tab` 分隔的文件 `midges` 中的第 33 个字段：

```
awk -F"\t" 'NR>1 {a[length($33)]++} \
    END {for (i in a) print i FS a[i]}' midges | sort -nr
```

![distro1](/data/attachment/album/201909/03/174437f5ivu02uamrjru54.png)

最长的条目恰好有 50 个字符，这是可疑的，并且在该宽度处存在数据项的“凸起”，这更加可疑。检查这些 50 个字符的项目会发现截断：

![distro2](/data/attachment/album/201909/03/174444t9xzme1m4vnque47.png)

我用这种方式检查的其他数据表有 100、200 和 255 个字符的“凸起”。在每种情况下，这种“凸起”都包含明显的截断。

**未匹配的括号。**第二种方法查找类似 `...(Sally Cleveland` 的数据项。一个很好的起点是数据表中所有标点符号的统计。这里我检查文件 `mag2`：

```
grep -o "[[:punct:]]" file | sort | uniqc
```

![punct](/data/attachment/album/201909/03/174524miy5465qi9z4nv61.png)

请注意，`mag2` 中的开括号和闭括号的数量不相等。要查看发生了什么，我使用 `unmatched` 函数，它接受三个参数并检查数据表中的所有字段。第一个参数是文件名，第二个和第三个是开括号和闭括号，用引号括起来。

```
unmatched()
{
    awk -F"\t" -v start="$2" -v end="$3" \
        '{for (i=1;i<=NF;i++) \
            if (split($i,a,start) != split($i,b,end)) \
                print "line "NR", field "i":\n"$i}' "$1"
}
```

如果在字段中找到开括号和闭括号之间不匹配，则 `unmatched` 会报告行号和字段号。这依赖于 `awk` 的 `split` 函数，它返回由分隔符分隔的元素数（包括空格）。这个数字总是比分隔符的数量多一个：

![split](/data/attachment/album/201909/03/174452gq655q8kw7cnkmmc.png)

这里 `ummatched` 检查 `mag2` 中的圆括号并找到一些可能的截断：

![unmatched](/data/attachment/album/201909/03/174456pfgfdg96y0dxa3ga.png)

我使用 `unmatched` 来找到不匹配的圆括号 `()`、方括号 `[]`、花括号 `{}` 和尖括号 `<>`，但该函数可用于任何配对的标点字符。

**意外的结尾。**第三种方法查找以尾随空格或非终止标点符号结尾的数据项，如逗号或连字符。这可以在单个字段上用 `cut` 用管道输入到 `grep` 完成，或者用 `awk` 一步完成。在这里，我正在检查以制表符分隔的表 `herp5` 的字段 47，并提取可疑数据项及其行号：

```
cut -f47 herp5 | grep -n "[ ,;:-]$"
或
awk -F"\t" '$47 ~ /[ ,;:-]$/ {print NR": "$47}' herp5
```

![herps5](/data/attachment/album/201909/03/174502zlnneertxtxroj1r.png)

用于制表符分隔文件的 awk 命令的全字段版本是：

```
awk -F"\t" '{for (i=1;i<=NF;i++) if ($i ~ /[ ,;:-]$/) \
    print "line "NR", field "i":\n"$i}' file
```

**谨慎的想法。**在我对字段进行的验证测试期间也会出现截断。例如，我可能会在“年”的字段中检查合理的 4 位数条目，并且有个 `198` 可能是 198n？还是 1898 年？带有丢失字符的截断数据项是个谜。 作为数据审计员，我只能报告（可能的）字符损失，并建议数据编制者或管理者恢复（可能）丢失的字符。

---

via: <https://www.polydesmida.info/BASHing/2018-07-04.html>

作者：[polydesmida](https://www.polydesmida.info/) 选题：[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/) 荣誉推出