Linux 平台上的写作者必备工具

# Linux 平台上的写作者必备工具

我从事作家已有 20 多年了。我撰写了数千篇有关各种技术主题的文章和指南，并撰写了 40 多本小说。因此，书面文字不仅对我很重要，还很熟悉，成为了我的第二种自然交流的方式。在过去的二十年中（而且还在继续），我几乎都是在 Linux 平台上完成的所有工作。我必须承认，在早期，这并不总是那么容易。格式并不总是与编辑器所需要的相吻合，在某些情况下，开源平台根本没有完成工作所需的必要工具。

那时已经过去，现在已经不同了。

Linux 演进和基于 Web 的工具的相得益彰使得它可以让任何写作者都能在 Linux 上完成工作（并且做得很好）。但是你需要什么工具？你可能会惊讶地发现，在某些情况下，使用 100％ 开源的工具无法有效完成这项工作。不过即使如此，工作总是可以完成的。让我们来看看我作为技术作家和小说作者一直使用的工具。我将通过小说和非小说类的写作过程来概述这一点（因为过程不同，需要特定的工具）。

对认真的 Linux 硬核用户预先做个预警。很久以前，我就放弃了使用 LaTeX 和 DocBook 之类的工具进行写作。为什么？因为对我而言，重点必须放在内容上，而不是过程上。当你面临最后期限时，必须以效率为先。

### 非小说类

我们将从非虚构写作入手，因为这是两者中较简单的过程。为了编写技术指南，我与不同的编辑人员合作，并且在某些情况下，必须将内容复制/粘贴到 CMS 中。但是就像我的小说一样，整个过程总是从 Google 云端硬盘开始。在这一点上，许多开源纯粹主义者会转身走开。不用担心，你始终可以选择将所有文件保存在本地，也可以使用更开放友好的云服务（例如 [Zoho](https://www.zoho.com/) 或 [nextCloud](https://nextcloud.com/)）。

为什么要从云端开始？多年来，我发现我需要能够随时随地访问那些内容。最简单的解决方案是迁移到云上。我对丢失工作成果这件事也很偏执。为此，我使用了 [Insync](https://www.insynchq.com) 之类的工具来使我的 Google 云端硬盘与桌面保持同步。有了桌面同步功能，我知道我的工作成果总是有备份，以防万一 Google 云端硬盘出了问题。

对于那些我必须与之一起将内容输入到内容管理系统（CMS）的客户，该过程到此结束。我可以直接从 Google 文档复制/粘贴到 CMS 中，并完成此操作。当然，对于技术内容，总是涉及到屏幕截图。为此，我使用 [Gimp](https://www.gimp.org/)，它使得截取屏幕截图变得简单：

*图 1：使用 Gimp 截屏。*

1. 打开 Gimp。
2. 单击“文件>创建>屏幕快照”。
3. 选择单个窗口、整个屏幕或要抓取的区域（图 1）。
4. 单击“抓取”。

我的大多数客户倾向于使用 Google 文档，因为我可以共享文件夹，以便他们可以可靠地访问该内容。我有一些无法使用 Google 文档的客户，因此我必须将文件下载为可以使用的格式。为此，我要做的是下载 .odt 格式，以 [LibreOffice](https://www.libreoffice.org/) 打开文档（图 2），根据需要设置格式，保存为客户所需的格式，然后发送文档。

*图 2：在 LibreOffice 中打开我下载的 Google 文档。*

非小说类作品这样就行了。

### 小说类

这里会稍微变得有点复杂。开始的步骤是相同的，因为我总是在 Google 文档中写小说的每个初稿。完成后，我将文件下载到 Linux 桌面，在 LibreOffice 中打开文件，根据需要设置格式，然后另存为编辑器支持的文件类型（不幸的是，这意味着是 .docx）。

该过程的下一步变得有些琐碎。我的编辑更喜欢使用注释来跟踪更改（因为这使我们俩阅读文档和做出更改一样容易）。因此，一个 60k 的 word 文档可以包含成百上千的注释，这会使 LibreOffice 慢的像爬一样。从前，你可以增加用于文档的内存，但是从 LibreOffice 6 开始，这不再可行。这意味着任何较大的、像小说一样长的、带有大量注释的文档都将无法使用。因此，我不得不采取一些极端的措施，使用 [WPS Office](https://www.wps.com/en-US/)（图 3）。尽管这不是开源解决方案，但 WPS Office 在文档中包含大量注释的情况下做得很好，因此无需处理 LibreOffice 所带来的麻烦（当处理带有数百个注释的大型文件时）。

*图 3：WPS 可以轻松处理大量注释。*

一旦我和我的编辑完成了对书的编辑（所有评论都已删除），我就可以在 LibreOffice 中打开文件进行最终格式化。格式化完成后，我将文件保存为 .html 格式，然后以 [Calibre](https://calibre-ebook.com/) 打开文件以将文件导出为 .mobi 和 .epub 格式。

对于希望在 Amazon、Barnes＆Noble、Smashwords 或其他平台上出版的任何人，Calibre 都是必备工具。Caliber 比其他类似解决方案更好地方是，它使你可以直接编辑 .epub 文件（图 4）。对于 Smashword 来说，这是绝对必要的（因为导出过程将添加 Smashwords 转换工具上不接受的元素）。

*图 4：直接在 Calibre 中编辑 epub 文件。*

写作过程结束后（或有时在等待编辑完成一校时），我将开始为书制作封面。该任务完全在 Gimp 中处理（图 5）。

*图 5：在 Gimp 中创建 POTUS 的封面。*

这样就完成了在 Linux 平台上创建小说的过程。由于文档的篇幅以及某些编辑人员的工作方式，与创建非小说类的过程相比，它可能会变得有些复杂，但这远没有挑战性。实际上，在 Linux 上创建小说与其他平台一样简单（并且更可靠）。

### 希望这可以帮助你

我希望这可以帮助有抱负的作家有信心在 Linux 平台上进行写作。还有许多其他工具可供使用，但是多年来我在这里列出的工具很好地服务了我。而且，尽管我确实使用了几个专有的工具，但只要它们在 Linux 上都能正常运行，我觉得是可以的。

---

via: <https://www.linux.com/learn/2018/11/must-have-tools-writers-linux-platform>

作者：[Jack Wallen](https://www.linux.com/users/jlwallen) 选题：[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/) 荣誉推出


awk 中的字段、记录和变量

Summary: 这个系列的第二篇，我们会学习字段，记录和一些非常有用的 Awk 变量。

这个系列的第二篇，我们会学习字段，记录和一些非常有用的 Awk 变量。

# awk 中的字段、记录和变量

>
> 这个系列的第二篇，我们会学习字段，记录和一些非常有用的 Awk 变量。
>
>
>

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

Awk 有好几个变种：最早的 `awk`，是 1977 年 AT&T 贝尔实验室所创。它还有一些重构版本，例如 `mawk`、`nawk`。在大多数 Linux 发行版中能见到的，是 GNU awk，也叫 `gawk`。在大多数 Linux 发行版中，`awk` 和 `gawk` 都是指向 GNU awk 的软链接。输入 `awk`，调用的是同一个命令。[GNU awk 用户手册](https://www.gnu.org/software/gawk/manual/html_node/History.html#History)中，能看到 `awk` 和 `gawk` 的全部历史。

这一系列的[第一篇文章](/article-11543-1.html) 介绍了 `awk` 命令的基本格式：

```
$ awk [选项] '模式 {动作}' 输入文件
```

`awk` 是一个命令，后面要接选项 （比如用 `-F` 来定义字段分隔符）。想让 `awk` 执行的部分需要写在两个单引号之间，至少在终端中需要这么做。在 `awk` 命令中，为了进一步强调你想要执行的部分，可以用 `-e` 选项来突出显示（但这不是必须的）：

```
$ awk -F, -e '{print $2;}' colours.txt
yellow
blue
green
[...]
```

### 记录和字段

`awk` 将输入数据视为一系列*记录*，通常是按行分割的。换句话说，`awk` 将文本中的每一行视作一个记录。每一记录包含多个*字段*。一个字段由*字段分隔符*分隔开来，字段是记录的一部分。

默认情况下，`awk` 将各种空白符，如空格、制表符、换行符等视为分隔符。值得注意的是，在 `awk` 中，多个*空格*将被视为一个分隔符。所以下面这行文本有两个字段：

```
raspberry red
```

这行也是：

```
tuxedo                  black
```

其他分隔符，在程序中不是这么处理的。假设字段分隔符是逗号，如下所示的记录，就有三个字段。其中一个字段可能会是 0 个字节（假设这一字段中不包含隐藏字符）

```
a,,b
```

### awk 程序

`awk` 命令的*程序部分*是由一系列规则组成的。通常来说，程序中每个规则占一行（尽管这不是必须的）。每个规则由一个模式，或一个或多个动作组成：

```
模式 { 动作 }
```

在一个规则中，你可以通过定义模式，来确定动作是否会在记录中执行。模式可以是简单的比较条件、正则表达式，甚至两者结合等等。

这个例子中，程序*只会*显示包含单词 “raspberry” 的记录：

```
$ awk '/raspberry/ { print $0 }' colours.txt
raspberry red 99
```

如果没有文本符合模式，该动作将会应用到所有记录上。

并且，在一条规则只包含模式时，相当于对整个记录执行 `{ print }`，全部打印出来。

Awk 程序本质上是*数据驱动*的，命令执行结果取决于数据。所以，与其他编程语言中的程序相比，它还是有些区别的。

### NF 变量

每个字段都有指定变量，但针对字段和记录，也存在一些特殊变量。`NF` 变量，能存储 `awk` 在当前记录中找到的字段数量。其内容可在屏幕上显示，也可用于测试。下面例子中的数据，来自上篇文章[文本](/article-11543-1.html)：

```
$ awk '{ print $0 " (" NF ")" }' colours.txt
name       color  amount (3)
apple      red    4 (3)
banana     yellow 6 (3)
[...]
```

`awk` 的 `print` 函数会接受一系列参数（可以是变量或者字符串），并将它们拼接起来。这就是为什么在这个例子里，每行结尾处，`awk` 会以一个被括号括起来的整数表示字段数量。

### NR 变量

另外，除了统计每个记录中的字段数，`awk` 也统计输入记录数。记录数被存储在变量 `NR` 中，它的使用方法和其他变量没有任何区别。例如，为了在每一行开头显示行号：

```
$ awk '{ print NR ": " $0 }' colours.txt
1: name       color  amount
2: apple      red    4
3: banana     yellow 6
4: raspberry  red    3
5: grape      purple 10
[...]
```

注意，写这个命令时可以不在 `print` 后的多个参数间添加空格，尽管这样会降低可读性：

```
$ awk '{print NR": "$0}' colours.txt
```

### printf() 函数

为了让输出结果时格式更灵活，你可以使用 `awk` 的 `printf()` 函数。 它与 C、Lua、Bash 和其他语言中的 `printf` 相类似。它也接受以逗号分隔的*格式*参数。参数列表需要写在括号里。

```
$ printf 格式, 项目1, 项目2, ...
```

格式这一参数（也叫*格式符*）定义了其他参数如何显示。这一功能是用*格式修饰符*实现的。`%s` 输出字符，`%d` 输出十进制数字。下面的 `printf` 语句，会在括号内显示字段数量：

```
$ awk 'printf "%s (%d)\n",$0,NF}' colours.txt
name       color  amount (3)
raspberry  red    4 (3)
banana     yellow 6 (3)
[...]
```

在这个例子里，`%s (%d)` 确定了每一行的输出格式，`$0,NF` 定义了插入 `%s` 和 `%d` 位置的数据。注意，和 `print` 函数不同，在没有明确指令时，输出不会转到下一行。出现转义字符 `\n` 时才会换行。

### Awk 脚本编程

这篇文章中出现的所有 `awk` 代码，都在 Bash 终端中执行过。面对更复杂的程序，将命令放在文件（*脚本*）中会更容易。`-f FILE` 选项（不要和 `-F` 弄混了，那个选项用于字段分隔符），可用于指明包含可执行程序的文件。

举个例子，下面是一个简单的 awk 脚本。创建一个名为 `example1.awk` 的文件，包含以下内容：

```
/^a/ {print "A: " $0}
/^b/ {print "B: " $0}
```

如果一个文件包含 `awk` 程序，那么在给文件命名时，最好写上 `.awk` 的扩展名。 这样命名不是强制的，但这么做，会给文件管理器、编辑器（和你）一个关于文件内容的很有用的提示。

执行这一脚本：

```
$ awk -f example1.awk colours.txt
A: raspberry  red    4
B: banana     yellow 6
A: apple      green  8
```

一个包含 `awk` 命令的文件，在最开头一行加上释伴 `#!`，就能变成可执行脚本。创建一个名为 `example2.awk` 的文件，包含以下内容：

```
#!/usr/bin/awk -f
#
# 除了第一行，在其他行前显示行号
#

NR > 1 {
    printf "%d: %s\n",NR,$0
}
```

可以说，脚本中只有一行，大多数情况下没什么用。但在某些情况下，执行一个脚本，比记住，然后打一条命令要容易的多。一个脚本文件，也提供了一个记录命令具体作用的好机会。以 `#` 号开头的行是注释，`awk` 会忽略它们。

给文件可执行权限：

```
$ chmod u+x example2.awk
```

执行脚本：

```
$ ./example2.awk colours.txt
2: apple      red    4
2: banana     yellow 6
4: raspberry red    3
5: grape      purple 10
[...]
```

将 `awk` 命令放在脚本文件中，有一个好处就是，修改和格式化输出会更容易。在终端中，如果能用一行执行多条 `awk` 命令，那么输入多行，才能达到同样效果，就显得有些多余了。

### 试一试

你现在已经足够了解，`awk` 是如何执行指令的了。现在你应该能编写复杂的 `awk` 程序了。试着编写一个 awk 脚本，它需要: 至少包括一个条件模式，以及多个规则。如果你想使用除 `print` 和 `printf` 以外的函数，可以参考在线 [gawk 手册](https://www.gnu.org/software/gawk/manual/)。

下面这个例子是个很好的切入点：

```
#!/usr/bin/awk -f
#
#  显示所有记录 除了出现以下情况
#  如果第一个记录 包含 “raspberry”
#  将 “red” 替换成 “pi”

$1 == "raspberry" {
        gsub(/red/,"pi")
}

{ print }
```

试着执行这个脚本，看看输出是什么。接下来就看你自己的了。

这一系列的下一篇文章，将会介绍更多，能在更复杂(更有用!) 脚本中使用的函数。

这篇文章改编自 [Hacker Public Radio](http://hackerpublicradio.org/eps.php?id=2129) 系列，一个技术社区博客。

---

via: <https://opensource.com/article/19/11/fields-records-variables-awk>

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

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


如何在 Linux 上使用 pkgsrc

Summary: NetBSD 的软件包管理器通用、灵活又容易。下面是如何使用它。

NetBSD 的软件包管理器通用、灵活又容易。下面是如何使用它。

# 如何在 Linux 上使用 pkgsrc

>
> NetBSD 的软件包管理器通用、灵活又容易。下面是如何使用它。
>
>
>

NetBSD 以能在几乎所有平台上运行而闻名，但你知道它*第二*有名的 [pkgsrc](http://pkgsrc.org) 包管理器吗？像 NetBSD 一样，pkgsrc 基本上可以在任何系统上运行，或者至少在任意 Unix 和类 Unix 的系统上上运行。你可以在 BSD、Linux、Illumos、Solaris 和 Mac 上安装 pkgsrc。它总共支持 20 多种操作系统。

### 为什么使用 pkgsrc？

除了 MacOS 之外，所有 Unix 操作系统均自带包管理器。你不一定*需要* pkgsrc，但这可能是你想尝试的三个重要原因：

* **打包**。如果你对打包感到好奇，但尚未尝试自己创建一个软件包，那么 pkgsrc 是一个相对简单的系统，尤其是如果你已经熟悉 Makefile 和类似 [GNU Autotools](https://opensource.com/article/19/7/introduction-gnu-autotools) 之类的构建系统时。
* **通用**。如果你使用多个操作系统或发行版，那么可能会遇到每个系统的包管理器。你可以在不同的系统上使用 pkgsrc，以便你为一个系统打包了程序，就为所有系统打包了。
* **灵活**。在许多打包系统中，如何选择二进制包或源码包并不总是很明显。使用 pkgsrc，区别很明显，两种安装方法都一样容易，并且都可以为你解决依赖关系。

### 如何安装 pkgsrc

无论你使用的是 BSD、Linux、Illumos、Solaris 还是 MacOS，安装过程都基本相同：

1. 使用 CVS 检出 pkgsrc 树
2. 引导 pkgsrc 系统
3. 安装软件包

#### 使用 CVS 检出 pkgsrc 树

在 Git 和 Subversion 之前，就有了 [CVS](http://www.netbsd.org/developers/cvs-repos/cvs_intro.html#intro)。要检出代码你无需了解 CVS 太多，如果你习惯 Git，那么可以将<ruby> 检出 <rt>  checkout </rt></ruby>称为<ruby> 克隆 <rt>  clone </rt></ruby>。当你用 CVS 检出 pkgsrc 时，你就下载了详细说明如何构建每个软件包的“<ruby> 配方 <rt>  recipes </rt></ruby>”。它有很多文件，但是它们都很小，因为你实际上并没有拉取每个包的源码，而只有按需构建时需要的构建基础架构和 Makefile。使用 CVS，你可以轻松地在新版本发布时更新 pkgsrc 检出。

pkgsrc 文档建议将其源码树放在 `/usr` 目录下，因此你必须使用 `sudo`（或成为 root）运行此命令：

```
$ cd /usr
$ sudo cvs -q -z2 -d anoncvs@anoncvs.NetBSD.org:/cvsroot checkout -r pkgsrc-2019Q3 -P pkgsrc
```

在我撰写本文时，最新版本是 2019Q3。请检查 [pkgsrc.org](http://pkgsrc.org/) 主页的新闻部分或 [NetBSD文档](http://www.netbsd.org/docs/pkgsrc/getting.html)，以确定最新版本。

#### 引导 pkgsrc

pkgsrc 树复制到你的计算机后，你会看到一个充满构建脚本的 `/usr/pkgsrc` 目录。在使用之前，你必须引导 pkgsrc，以便你可以轻松地访问构建和安装软件所需的相关命令。

引导 pkgsrc 的方式取决于你所使用操作系统。

对于 NetBSD，你只需使用捆绑的引导器：

```
# cd pkgsrc/bootstrap
# ./bootstrap
```

在其他系统上，还有更好的方法，包括一些自定义功能，它是由 Joyent 提供的。要了解运行的确切命令，请访问 [pkgsrc.joyent.com](http://pkgsrc.joyent.com/)。比如，在 Linux（Fedora、Debian、Slackware 等）上：

```
$ curl -O https://pkgsrc.joyent.com/packages/Linux/el7/bootstrap/bootstrap-trunk-x86_64-20170127.tar.gz
$ BOOTSTRAP_SHA="eb0d6911489579ca893f67f8a528ecd02137d43a"
```

尽管路径暗示文件适用于 RHEL 7，但二进制文件往往与所有（最前沿的 Linux 发行版）兼容。如果你发现二进制文件与你的发行版不兼容，你可以选择从源码构建。

验证 SHA1 校验和：

```
$ echo "${BOOTSTRAP_SHA}" bootstrap-trunk*gz > check-shasum
sha1sum -c check-shasum
```

你还可以验证 PGP 签名：

```
$ curl -O https://pkgsrc.joyent.com/packages/Linux/el7/bootstrap/bootstrap-trunk-x86_64-20170127.tar.gz.asc
$ curl -sS https://pkgsrc.joyent.com/pgp/56AAACAF.asc | gpg --import
$ gpg --verify ${BOOTSTRAP_TAR}{.asc,}
```

当你确认你已有正确的引导套件，将其安装到 `/usr/pkg`：

```
sudo tar -zxpf ${BOOTSTRAP_TAR} -C /
```

它为你提供了通常的 pkgsrc 命令。将这些位置添加到[你的 PATH 环境变量中](https://opensource.com/article/17/6/set-path-linux)：

```
$ echo "PATH=/usr/pkg/sbin:/usr/pkg/bin:$PATH" >> ~/.bashrc
$ echo "MANPATH=/usr/pkg/man:$MANPATH" >> ~/.bashrc
```

如果你宁愿使用 pkgsrc 而不依赖于 Joyent 的构建，那么只需运行 pkgsrc 源码树的引导脚本即可。在运行特定于系统的脚本之前，请先阅读 `bootstrap` 目录中相关 `README` 文件。

### 如何使用 pkgsrc 安装软件

使用 pkgsrc 安装预编译的二进制文件（就像使用 DNF 或 Apt 一样）是很容易的。二进制安装的命令是 `pgkin`，它有自己的专门网站 [pkgin.net](http://pkgin.net)。对于任何用过 Linux 的人来说，这个过程应该感觉相当熟悉。

要搜索 `tmux` 包：

```
$ pkgin search tmux
```

要安装 tmux 包：

```
$ sudo pkgin install tmux
```

`pkgin` 命令的目的是模仿典型的 Linux 包管理器的行为，因此有选项可以列出可用的包、查找包提供的特定可执行文件，等等。

### 如何使用 pkgsrc 从源码构建

然而，pkgsrc 真正强大的地方是方便地从源码构建包。你在第一步中检出了所有 20000 多个构建脚本，你可以直接进入 pkgsrc 源码树来访问这些脚本。

例如，要从源码构建 `tcsh`，首先找到构建脚本：

```
$ find /usr/pkgsrc -type d -name "tcsh"
/usr/pkgsrc/shells/tcsh
```

接下来，进入源码目录：

```
$ cd /usr/pgksrc/shells/tcsh
```

构建脚本目录包含许多文件来帮助在你的系统上构建应用，但值得注意的是，这里面有包含了软件说明的 `DESCR` 文件，以及触发构建的 `Makefile`。

```
$ ls
CVS    DESCR     Makefile
PLIST  distinfo  patches
$ cat DESCR
TCSH is an extended C-shell with many useful features like
filename completion, history editing, etc.
$
```

准备就绪后，构建并安装：

```
$ sudo bmake install
```

pkgsrc 系统使用 `bmake` 命令（在第一步检出 pkgsrc 后提供），因此请务必使用 `bmake`（而不是出于习惯使用 `make`）。

如果要为多个系统构建，那么你可以创建一个包，而不是立即安装：

```
$ cd /usr/pgksrc/shells/tcsh
$ sudo bmake package
[...]
=> Creating binary package in /usr/pkgsrc/packages/All/tcsh-X.Y.Z.tgz
```

pkgsrc 创建的包是标准的 tarball，但它可以方便地通过 `pkg_add` 安装：

```
$ sudo pkg_add /usr/pkgsrc/packages/All/tcsh-X.Y.Z.tgz
tcsh-X.Y.Z: adding /usr/pkg/bin/tcsh to /etc/shells
$ tcsh
localhost%
```

pkgsrc 的 pkgtools 集合提供 `pkg_add`、`pkg_info`、`pkg_admin`、`pkg_create` 和 `pkg_delete` 命令，来帮助管理你在系统上构建和维护软件包。

### pkgsrc，易于管理

pkgsrc 系统提供了直接，容易上手的软件包管理方法。如果你正在寻找一个不妨碍你并且可以定制的包管理器，请在任何运行 Unix 或类 Unix 的系统上试试 pkgsrc。

---

via: <https://opensource.com/article/19/11/pkgsrc-netbsd-linux>

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

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


如何在 Linux 上安装 Java

Summary: 在桌面上拥抱 Java 应用程序，然后在所有桌面上运行它们。

在桌面上拥抱 Java 应用程序，然后在所有桌面上运行它们。

# 如何在 Linux 上安装 Java

>
> 在桌面上拥抱 Java 应用程序，然后在所有桌面上运行它们。
>
>
>

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

无论你运行的是哪种操作系统，通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序，或者使用 Fedora 上的 DNF 或 Mac 上的 Brew 这样的软件包管理器进行安装，而有时你可能会从网站上下载可执行文件或安装程序。因为 Java 是这么多流行的应用程序的后端，所以最好了解安装它的不同方法。好消息是你有很多选择，本文涵盖了所有这些内容。

坏消息是 Java *太大*，我说的不仅仅是文件大小。Java 是一种开放源代码语言和规范，这意味着从理论上讲，任何人都可以创建它的实现版本。这意味着，在安装任何东西之前，必须确定要安装的 Java 发行版。

### 我需要 JVM 还是 JRE 或者 JDK？

Java 大致分为两个下载类别。<ruby> Java 虚拟机 <rt>  Java Virtual Machine </rt></ruby>（JVM）是运行时组件；它是使 Java 应用程序能够在计算机上启动和运行的“引擎”。它包含在 <ruby> Java 运行时环境 <rt>  Java Runtime Environment </rt></ruby>（JRE）中。

<ruby> Java 开发工具包 <rt>  Java Development Kit </rt></ruby>（JDK）是一个开发工具包：你可以将其视为一个车库，修理工可以坐在那里进行调整、修理和改进。JDK 包含 Java 运行时环境（JRE）。

以下载来说，这意味着：

* 如果你是希望运行 Java 应用程序的用户，则只需 JRE（包括了 JVM）。
* 如果你是希望使用 Java 进行编程的开发人员，则需要 JDK（包括 JRE 库，而 JRE 库又包括 JVM）。 ### OpenJDK、IcedTea 和 OracleJDK 有什么不同？

当<ruby> 太阳微系统 <rt>  Sun Microsystems </rt></ruby>被 Oracle 收购时，Java 是该交易的主要部分。幸运的是，Java 是一种开源技术，因此，如果你对 Oracle 维护该项目的方式不满意，则可以选择其他方法。Oracle 将专有组件与 Java 下载捆绑在一起，而 OpenJDK 项目是完全开源的。

IcedTea 项目本质上是 OpenJDK，但其目标是使用户在使用完全自由开源的工具时更容易构建和部署 OpenJDK。

（LCTT 译注：阿里巴巴也有一个它自己维护的 Open JDK 发行版“<ruby> 龙井 <rt>  Dragonwell </rt></ruby>”。以下引自其官网：“Alibaba Dragonwell 是一款免费的，生产就绪型 Open JDK 发行版，提供长期支持，包括性能增强和安全修复。……Alibaba Dragonwell 作为 Java 应用的基石，支撑了阿里经济体内所有的 Java 业务。Alibaba Dragonwell 完全兼容 Java SE 标准，……”）

### 我应该安装哪个 Java？

如果你对这些选择感到不知所措，那么简单的答案就是你应该安装的 Java 实现应该是最容易安装的那个。当应用程序告诉你需要 Java 12，但你的存储库中只有 Java 8 时，可以安装可以从可靠来源中找到的 Java 12 的任何实现。在 Linux 上，你可以一次安装几个不同版本的 Java，它们不会互相干扰。

如果你是需要选择使用哪个版本的开发人员，则应考虑所需的组件。如果选择 Oracle 的版本，请注意，软件包中包含专有的插件和字体，可能会[影响你分发你的应用程序](https://www.oracle.com/technetwork/java/javase/overview/oracle-jdk-faqs.html)。在 IcedTea 或 OpenJDK 上进行开发是最安全的。

### 从存储库安装 OpenJDK？

现在，你已经知道要选择什么了，你可以使用软件包管理器搜索 OpenJDK 或 IcedTea，然后安装所需的版本。有些发行版使用关键字 `latest` 来指示最新版本，这通常是你要运行的应用程序所需要的。根据你使用的软件包管理器，你甚至可以考虑使用 `grep` 过滤搜索结果以仅包括最新版本。例如，在 Fedora 上：

```
$ sudo dnf search openjdk | grep latest | cut -f1 -d':'

java-latest-openjdk-demo.x86_64
java-openjdk.i686
java-openjdk.x86_64
java-latest-openjdk-jmods.x86_64
java-latest-openjdk-src.x86_64
java-latest-openjdk.x86_64
[...]
```

只有当你尝试运行的应用程序坚持要求你使用 Java 的旧版本时，你才应该看看 `latest` 之前的版本。

在 Fedora 或类似系统上安装 Java：

```
$ sudo dnf install java-latest-openjdk
```

如果你的发行版不使用 `latest` 标签，则可以使用其他关键字，例如 `default`。以下是在 Debian 上搜索 OpenJDK 的信息：

```
$ sudo apt search openjdk | less
default-jdk
  Standard Java development kit

default-jre
  Standard Java runtime

openjdk-11-jdk
  OpenJDK development kit (JDK)

[...]
```

在这种情况下，`default-jre` 软件包适合用户，而 `default-jdk` 则适合开发人员。

例如，要在 Debian 上安装 JRE：

```
$ sudo apt install default-jre
```

现在已安装好 Java。

你的存储库中可能有*许多*与 Java 相关的软件包。要搜索 OpenJDK，如果你是用户，则查找最新的 JRE 或 JVM，如果你是开发人员，则查找最新的 JDK。

### 从互联网上安装 Java

如果在存储库中找不到 JRE 或 JDK，或者找不到满足你需求的 JRE 或 JDK，则可以从互联网上下载开源的 Java 软件包。你可以在 [openjdk.java.net](http://openjdk.java.net) 中找到需要手动安装的 tar 形式的 OpenJDK 下载文件，或者可以从 Azul 下载 tar 形式的 [Zulu 社区版](https://www.azul.com/downloads/zulu-community)或其可安装的 RPM 或 DEB 软件包。

#### 从 TAR 文件安装 Java

如果从 Java.net 或 Azul 下载 TAR 文件，则必须手动安装。这通常称为“本地”安装，因为你没有将 Java 安装到“全局”位置。你可以在 `PATH` 中选择一个合适的位置。

如果你不知道 `PATH` 中包含什么，请查看一下以找出：

```
$ echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/home/seth/bin
```

在此示例 `PATH` 中，位置 `/usr/local/bin` 和 `/home/seth/bin` 是不错的选择。如果你是计算机上的唯一用户，那么你自己的家目录就很有意义。如果你的计算机上有很多用户，则最好选择一个通用位置，例如 `/usr/local` 或 `/opt`。

如果你无权访问需要 `sudo` 权限的 `/usr/local` 之类的系统级目录，则可以在你自己的家目录中创建一个本地 `bin`（意思是 “<ruby> 二进制 <rt>  binary </rt></ruby>”，而不是“<ruby> 垃圾箱 <rt>  waste bin </rt></ruby>”）或 `Applications` 文件夹：

```
$ mkdir ~/bin
```

如果它不在你的 `PATH` 中，请将其添加到其中：

```
$ echo PATH=$PATH:$HOME/bin >> ~/.bashrc
$ source ~/.bashrc
```

最后，将压缩包解压缩到你选择的目录中。

```
$ tar --extract --file openjdk*linux-x64_bin.tar.gz --directory=$HOME/bin
```

Java 现在安装好了。

#### 从 RPM 或 DEB 安装 Java

如果从 Azul.com 下载 RPM 或 DEB 文件，则可以使用软件包管理器进行安装。

对于 Fedora、CentOS、RHEL 等，请下载 RPM 并使用 DNF 进行安装：

```
$ sudo dnf install zulu*linux.x86_64.rpm
```

对于 Debian、Ubuntu、Pop\_OS 和类似发行版，请下载 DEB 软件包并使用 Apt 安装它：

```
$ sudo dpkg -i zulu*linux_amd64.deb
```

Java 现在安装好了。

#### 用 alternatives 安装你的 Java 版本

一些应用程序是为特定版本的 Java 开发的，不能与其他任何版本一起使用。这种情况很少见，但确实会发生，在 Linux 上，你可以使用本地安装方法（请参阅上面“从 TAR 文件安装 Java”一节）或使用 `alternatives` 应用程序来解决此冲突。

`alternatives` 命令会查找 Linux 系统上安装的应用程序，并让你选择要使用的版本。有些发行版，例如 Slackware，不提供 `alternatives` 命令，因此你必须使用本地安装方法。在 Fedora、CentOS 和类似的发行版上，该命令是 `alternatives`。在 Debian、Ubuntu 和类似的系统上，该命令是 `update-alternatives`。

要获取当前已安装在 Fedora 系统上的应用程序的可用版本列表：

```
$ alternatives --list
```

在 Debian 上，你必须指定可供替代的应用程序：

```
$ update-alternatives --list java
```

在 Fedora 上选择要使系统将哪个版本作为默认版本：

```
$ sudo alternatives --config java
```

在 Debian 上：

```
$ sudo updates-alternatives --config java
```

你可以根据需要运行的应用程序，根据需要更改默认的 Java 版本。

### 运行 Java 应用

Java 应用程序通常以 JAR 文件的形式分发。根据你安装 Java 的方式，你的系统可能已经为运行 Java 应用程序配置好了，这使你只需双击应用程序图标（或从应用程序菜单中选择它）即可运行。如果必须执行未与系统其余部分集成的本地 Java 安装，则可以直接从终端启动 Java 应用程序：

```
$ java -jar ~/bin/example.jar &
```

### Java 是个好东西

Java 是少数将跨平台开发放在首位的编程环境之一。没有什么比问一个应用程序是否能在你的平台上运行然后发现该应用程序是用 Java 编写要让人感到松一口气的了。它是如此简单，无论你是开发人员还是用户，你都可以摆脱任何平台上的焦虑。在桌面上拥抱 Java 应用程序，然后在*所有*桌面上运行它们吧。

---

via: <https://opensource.com/article/19/11/install-java-linux>

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

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


谷歌为安卓添加主线 Linux 内核支持

Android Police 指出谷歌正在开发其 Fuchsia 操作系统，这似乎是为了有一天取代谷歌。<br />
很显然,应该是为了取代Android,而非谷歌.

# 谷歌为安卓添加主线 Linux 内核支持

当前的安卓生态系统被数百种不同版本的安卓所污染，每种版本都运行着 Linux 内核的不同变体。每个版本均针对不同的手机和不同的配置而设计。谷歌试图通过将主线 Linux 内核添加到安卓来解决该问题。

### 当前在安卓中是如何处理 Linux 内核的

在到达你的手机之前，你手机上的 Linux 内核经历了[三个主要步骤](https://arstechnica.com/gadgets/2019/11/google-outlines-plans-for-mainline-linux-kernel-support-in-android/)。

首先，谷歌采用了 Linux 内核的 LTS（长期支持）版本，并添加了所有的安卓专用代码。这将成为“安卓通用内核”。

然后，谷歌将此代码发送给创建可运行在手机的片上系统（SoC）的公司。这通常是高通公司。

SoC 制造商添加了支持 CPU 和其他芯片的代码后，便会将该内核传递给实际的设备制造商，例如三星和摩托罗拉。然后，设备制造商添加代码以支持手机的其余部分，例如显示屏和摄像头。

每个步骤都需要一段时间才能完成，并且会导致该内核无法与其他任何设备一起使用。这也意味着内核会非常旧，通常是大约两年前的内核。例如，上个月交付的谷歌 Pixel 4 带有来自 2017 年 11 月的内核，而且它将永远不会得到更新。

谷歌承诺会为较旧的设备创建安全补丁，这意味着他们会一直盯着大量的旧代码。

### 将来

<img src="content_image/album_201911_27_085706ec16q899q5uzflj9.png" alt="" title="">

去年，谷歌宣布[计划](https://lwn.net/Articles/771974/)解决此问题。今年，他们在 2019 Linux Plumbers Conference 上展示了他们取得的进展。

>
> “我们知道运行安卓需要什么，但不一定是在任何给定的硬件上。因此，我们的目标是从根本上找出所有这些，然后将其交给上游，并尝试尽可能接近主线。”
>
>
> Sandeep Patil，[安卓内核团队负责人](https://arstechnica.com/gadgets/2019/11/google-outlines-plans-for-mainline-linux-kernel-support-in-android/)
>
>
>

他们确实炫耀了运行带有合适的 Linux 内核的小米 Poco F1。但是，有些东西[似乎没有工作](https://www.androidpolice.com/2019/11/19/google-wants-android-to-use-regular-linux-kernel-potentially-improving-updates-and-security/)，例如电池电量百分比一直留在 0％。

那么，谷歌计划如何使其工作呢？从他们的 [Treble 项目](https://www.computerworld.com/article/3306443/what-is-project-treble-android-upgrade-fix-explained.html)计划中摘录。在 Treble 项目之前，与设备和安卓本身交互的底层代码是一大堆代码。Treble 项目将两者分开，并使它们模块化，以便可以更快地交付安卓更新，并且在更新时，这些低级代码可以保持不变。

谷歌希望为内核带来同样的模块化。他们的[计划](https://arstechnica.com/gadgets/2019/11/google-outlines-plans-for-mainline-linux-kernel-support-in-android/)“涉及稳定 Linux 的内核 ABI，并为 Linux 内核和硬件供应商提供稳定的接口来进行写入。谷歌希望将 Linux 内核与其硬件支持脱钩。”

因此，这意味着谷歌将交付一个内核，而硬件驱动程序将作为内核模块加载。目前，这只是一个草案。仍然有很多技术问题有待解决。因此，这不会很快有结果。

### 来自开源的反对意见

开源社区不会对将专有代码放入内核的想法感到满意。[Linux 内核准则](https://www.kernel.org/doc/Documentation/process/stable-api-nonsense.rst)指出，驱动程序必须具有 GPL 许可证才能包含在内核中。他们还指出，如果驱动程序的更改导致错误，应由导致该错误的人来解决。从长远来看，这意味着设备制造商的工作量将减少。

### 关于将主线内核包含到安卓中的最终想法

到目前为止，这只是一个草案。谷歌有很大的可能会开始进行该项目，除非他们意识到这将需要多少工作后才会放弃。看看谷歌[已经放弃](https://killedbygoogle.com/)了多少个项目！

[Android Police](https://www.androidpolice.com/2019/11/19/google-wants-android-to-use-regular-linux-kernel-potentially-improving-updates-and-security/) 指出谷歌正在开发其 [Fuchsia 操作系统](https://itsfoss.com/fuchsia-os-what-you-need-to-know/)，这似乎是为了有一天取代谷歌。

那么，问题是谷歌会尝试完成那些艰巨的任务，使安卓以主线 Linux 内核运行，还是完成他们统一的安卓替代产品的工作？只有时间可以回答。

你对此话题有何看法？请在下面的评论中告诉我们。

---

via: <https://itsfoss.com/mainline-linux-kernel-android/>

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


bauh：在一个界面中管理 Snap、Flatpak 和 AppImage

Summary: 幸运的是，我偶然发现了一个支持这几种通用包格式的应用程序。

我使用manjaro或Arco安装后，打开bauh需要输入密码，然后点击继续，无响应。无法进入软件主界面。

幸运的是，我偶然发现了一个支持这几种通用包格式的应用程序。

# bauh：在一个界面中管理 Snap、Flatpak 和 AppImage

[Snap](https://snapcraft.io/)、[Flatpak](https://flatpak.org/) 和 [AppImage](https://appimage.org/) 等通用软件包的最大问题之一就是管理它们。大多数内置的软件包管理器都不能全部支持这些新格式。

幸运的是，我偶然发现了一个支持这几种通用包格式的应用程序。

### bauh：多包装需求的管理器

[bauh](https://github.com/vinifmor/bauh)（LCTT：我给该软件建议一个中文名：“包豪”）最初名为 fpakman，旨在处理 Flatpak、Snap、[AppImage](https://itsfoss.com/use-appimage-linux/) 和 [AUR](https://itsfoss.com/best-aur-helpers/) 软件包。创建者 [vinifmor](https://github.com/vinifmor) 在 2019 年 6 月启动了该项目，[意图](https://forum.manjaro.org/t/bauh-formerly-known-as-fpakman-a-gui-for-flatpak-and-snap-management/96180)“为 Manjaro 用户提供管理 Flatpak 的图形界面”。此后，他扩展了该应用程序，以添加对基于 Debian 的系统的支持。

首次打开 bauh 时，它将扫描已安装的应用程序并检查更新。如果有任何需要更新的内容，它们将列在前面并居中。更新所有软件包后，你将看到已安装的软件包列表。你可以取消选择不需要更新的软件包，以防止其被更新。你也可以选择安装该应用程序的早期版本。

你也可以搜索应用程序。bauh 提供了有关已安装和已搜索软件包的详细信息。如果你对一种（或多种）软件包类型不感兴趣，则可以在设置中取消选择它们。

### 在你的 Linux 发行版上安装 bauh

让我们看看如何安装 bauh。

#### 基于 Arch 的发行版

如果你安装的是最近的 [Manjaro](https://manjaro.org/)，则应该一切已经就绪。bauh 默认情况下已安装。如果你安装的是较早版本的 Manjaro（如我一样）或其他基于 Arch 的发行版，则可以在终端中输入以下内容从 [AUR](https://aur.archlinux.org/packages/bauh) 中进行安装：

```
sudo pacman -S bauh
```

#### 基于 Debian/Ubuntu 的发行版

如果你拥有基于 Debian 或 Ubuntu 的 Linux 发行版，则可以使用 `pip` 安装 bauh。首先，请确保[在 Ubuntu 上安装了 pip](https://itsfoss.com/install-pip-ubuntu/)。

```
sudo apt install python3-pip
```

然后使用它来安装 bauh：

```
pip3 install bauh
```

但是，该软件的创建者建议[手动](https://github.com/vinifmor/bauh#manual-installation)安装它，以避免弄乱系统的库。

要手动安装 bauh，你必须先下载其[最新版本](https://github.com/vinifmor/bauh/releases)。下载后，可以[使用图形工具](https://itsfoss.com/unzip-linux/)或 [unzip 命令](https://linuxhandbook.com/unzip-command/)解压缩。接下来，在终端中打开该文件夹。你将需要使用以下步骤来完成安装。

首先，在名为 `env` 的文件夹中创建一个虚拟环境：

```
python3 -m venv env
```

现在在该环境中安装该应用程序的代码：

```
env/bin/pip install .
```

启动该应用程序：

```
env/bin/bauh
```

一旦完成了 bauh 的安装，就可以通过更改环境设置和参数来对其进行[微调](https://github.com/vinifmor/bauh#general-settings)。

### bauh 的未来之路

bauh 在短短的几个月中增长了很多。它有计划继续增长。当前的[路线图](https://github.com/vinifmor/bauh#roadmap)包括：

* 支持其他打包技术
* 每种打包技术一个单独模块
* 内存和性能改进
* 改善用户体验

### 结语

当我尝试 bauh 时，遇到了两个问题。当我第一次打开它时，它告诉我尚未安装 Snap，如果要使用 Snap 软件包，则必须安装它。我知道我已经安装了 Snap，因为我在终端中运行了 `snap list`，并且可以正常工作。我重新启动系统，Snap 才工作正常。

我遇到的另一个问题是我的一个 AUR 软件包无法更新。我可以用 `yay` 更新软件包，而没有任何问题。可能是我的 Manjaro 有问题，我已经使用了它 3 到 4 年。

总体而言，bauh 可以工作。它做到了宣称的功能。我不能要求更多。

你有没有用过 hauh？如果有的话，你最喜欢的用于管理不同打包格式的工具是什么？在下面的评论中让我们知道。

---

via: <https://itsfoss.com/bauh-package-manager/>

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


如何使用 TimeShift 备份和还原 Ubuntu Linux

# 如何使用 TimeShift 备份和还原 Ubuntu Linux

你是否曾经想过如何备份和还原 Ubuntu 或 Debian 系统？Timeshift 是一款自由开源工具，可让你创建文件系统的增量快照。你可以使用 RSYNC 或 BTRFS 两种方式创建快照。

让我们深入研究并安装 Timeshift。在本教程，我们将安装在 Ubuntu 18.04 LTS 系统上。

### 在 Ubuntu / Debian Linux 上安装 TimeShift

TimeShift 尚未正式托管在 Ubuntu 和 Debian 仓库中。考虑到这一点，我们将运行以下命令来添加 PPA：

```
# add-apt-repository -y ppa:teejee2008/ppa
```

接下来，使用以下命令更新系统软件包：

```
# apt update
```

成功更新系统后，使用以下 `apt` 命令安装 Timeshift：

```
# apt install timeshift
```

### 准备备份存储设备

最佳实践要求我们将系统快照保存在系统硬盘之外的单独的存储卷上。对于本指南，我们将使用 16GB 闪存作为第二个驱动器，并在该驱动器上保存快照。

```
# lsblk | grep sdb
```

为了将闪存用作快照的备份位置，我们需要在设备上创建一个分区表。运行以下命令：

```
# parted /dev/sdb  mklabel gpt
# parted /dev/sdb  mkpart primary 0% 100%
# mkfs.ext4  /dev/sdb1
```

在 USB 闪存上创建分区表后，我们可以开始创建文件系统的快照！

### 使用 Timeshift 创建快照

要启动 Timeshift，使用应用程序菜单搜索 “Timeshift”。

单击 Timeshift 图标，系统将提示你输入管理员密码。提供密码，然后单击验证。

接下来，选择你喜欢的快照类型。

点击 “Next”。选择快照的目标驱动器。在这里，我的位置是标记为 `/dev/sdb` 的外部 USB 驱动器。

接下来，定义快照级别。级别是指创建快照的时间间隔。你可以选择每月、每周、每天或每小时的快照级别。

点击 “Finish”。

在下一个窗口中，单击 “Create” 按钮开始创建快照。此后，系统将开始创建快照。

最后，你的快照将显示如下：

### 从快照还原 Ubuntu / Debian

创建系统快照后，现在让我们看看如何从同一快照还原系统。在同一个 Timeshift 中，单击快照，然后单击 “Restore” 按钮，如图所示。

接下来，将提示你选择目标设备。保留默认选择，然后点击 “Next”。

恢复过程开始之前，Timeshift 将会试运行。

在下一个窗口中，点击 “Next” 按钮确认显示的操作。

如图所示，你会看到警告和免责声明。点击 “Next” 初始化恢复过程。

此后，将开始还原过程，最后，系统之后将重新启动到快照定义的早期版本。

### 总结

如你所见，使用 TimeShift 从快照还原系统非常容易。在备份系统文件时，它非常方便，并允许你在系统故障时进行恢复。因此，不要害怕修改系统或弄乱系统。TimeShift 使你能够返回到一切运行平稳的时间点。

---

via: <https://www.linuxtechi.com/timeshift-backup-restore-ubuntu-linux/>

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


给新手 Java 开发者的 7 点提示

Summary: 如果你才刚开始学习 Java 编程，这里有七个你需要知道的基础知识。

如果你才刚开始学习 Java 编程，这里有七个你需要知道的基础知识。

# 给新手 Java 开发者的 7 点提示

>
> 如果你才刚开始学习 Java 编程，这里有七个你需要知道的基础知识。
>
>
>

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

Java 是一个多功能的编程语言，在某种程度上，它用在几乎所有可能涉及计算机的行业了里。Java 的最大优势是，它运行在一个 Java 虚拟机（JVM）中，这是一个翻译 Java 代码为与操作系统兼容的字节码的层。只要有 JVM 存在于你的操作系统上 —— 不管这个操作系统是在一个服务器（或“[无服务器](https://www.redhat.com/en/resources/building-microservices-eap-7-reference-architecture)”，也是同样的）、桌面电脑、笔记本电脑、移动设备，或嵌入式设备 —— 那么，Java 应用程序就可以运行在它上面。

这使得 Java 成为程序员和用户的一种流行语言。程序员知道，他们只需要写一个软件版本就能最终得到一个可以运行在任何平台上的应用程序；用户知道，应用程序可以运行在他们的计算机上，而不用管他们使用的是什么样的操作系统。

很多语言和框架是跨平台的，但是没有实现同样的抽象层。使用 Java，你针对的是 JVM，而不是操作系统。对于程序员，当面对一些编程难题时，这是阻力最小的线路，但是它仅在当你知道如何编程 Java 时有用。如果你刚开始学习 Java 编程，这里有你需要知道的七个基础的提示。

但是，首先，如果你不确定是否你安装了 Java ，你可以在一个终端（例如 [Bash](https://www.gnu.org/software/bash/) 或 [PowerShell](https://docs.microsoft.com/en-us/powershell/scripting/install/installing-powershell?view=powershell-6)）中找出来，通过运行：

```
$ java --version
openjdk 12.0.2 2019-07-16
OpenJDK Runtime Environment 19.3 (build 12.0.2+9)
OpenJDK 64-Bit Server VM 19.3 (build 12.0.2+9, mixed mode, sharing)
```

如果你得到一个错误，或未返回任何东西，那么你应该安装 [Java 开发套件](http://openjdk.java.net/)（JDK）来开始 Java 开发。或者，安装一个 Java 运行时环境（JRE），如果你只是需要来运行 Java 应用程序。

### 1、Java 软件包

在 Java 语言中，相关的类被分组到一个*软件包*中。当你下载 JDK 时所获得的 Java 基础库将被分组到以 `java` 或 `javax` 开头的软件包中。软件包提供一种类似于计算机上的文件夹的功能：它们为相关的元素提供结构和定义（以编程术语说，*命名空间*）。额外的软件包可以从独立开发者、开源项目和商业供应商获得，就像可以为任何编程语言获得库一样。

当你写一个 Java 程序时，你应该在你的代码是顶部声明一个软件包名称。如果你只是编写一个简单的应用程序来入门 Java，你的软件包名称可以简单地用你的项目名称。如果你正在使用一个 Java 集成开发环境，如 [Eclipse](http://www.eclipse.org/)，当你启动一个新的项目时，它为你生成一个合乎情理的软件包名称。

```
package helloworld;

/**
 * @author seth
 * An application written in Java.
 */
```

除此之外，你可以通过查找它相对于你的项目整体的路径来确定你的软件包名称。例如，如果你正在写一组类来帮助游戏开发，并且该集合被称为 `jgamer`，那么你可能在其中有一些唯一的类。

```
package jgamer.avatar;

/**
 * @author seth
 * An imaginary game library.
 */
```

你的软件包的顶层是 `jgamer`，并且在其内部中每个软件包都是一个独立的派生物，例如 `jgamer.avatar` 和 `jgamer.score` 等等。在你的文件系统里，其目录结构反映了这一点，`jgamer` 是包含文件 `avatar.java` 和 `score.java` 的顶级目录。

### 2、Java 导入

作为一名通晓多种语言的程序员，最大的乐趣是找出是否用 `include`、`import`、`use`、`require`，或一些其它术语来引入你不管使用何种编程语言编写的库。在 Java 中，顺便说一句，当导入你的代码的需要的库时，使用 `import` 关键字。

```
package helloworld;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
 * @author seth
 * A GUI hello world.
 */
```

导入是基于该环境的 Java 路径。如果 Java 不知道 Java 库存储在系统上的何处，那么，就不能成功导入。只要一个库被存储在系统的 Java 路径中，那么导入能够成功，并且库能够被用于构建和运行一个 Java 应用程序。

如果一个库并不在 Java 路径中（因为，例如，你正在写你自己的库），那么该库可以与你的应用程序绑定在一起（协议许可），以便导入可以按预期地工作。

### 3、Java 类

Java 类使用关键字 `public class` 声明，以及一个唯一的对应于它的文件名的类名。例如，在项目 `helloworld` 中的一个文件 `Hello.java` 中：

```
package helloworld;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
 * @author seth
 * A GUI hello world.
 */

public class Hello {
        // this is an empty class
}
```

你可以在一个类内部声明变量和函数。在 Java 中，在一个类中的变量被称为*字段*。

### 4、Java 方法

Java 的方法本质上是对象中的函数。基于预期返回的数据类型（例如 `void`、`int`、`float` 等等），它们被定义为 `public`（意味着它们可以被任何其它类访问）或 `private`（限制它们的使用）。

```
    public void helloPrompt(ActionEvent event) {
        String salutation = "Hello %s";

        string helloMessage = "World";
        message = String.format(salutation, helloMessage);
        JOptionPane.showMessageDialog(this, message);
    }

    private int someNumber (x) {
        return x*2;
    }
```

当直接调用一个方法时，以其类和方法名称来引用。例如，`Hello.someNumber` 指向在 `Hello` 类中的 `someNumber` 方法。

### 5、static

Java 中的 `static` 关键字使代码中的成员可以独立于包含其的对象而被访问。

在面向对象编程中，你编写的代码用作“对象”的模板，这些对象在应用程序运行时产生。例如，你不需要编写一个具体的窗口，而是编写基于 Java 中的窗口类的窗口实例（并由你的代码修改）。由于在应用程序生成它的实例之前，你编写的所有代码都不会“存在”，因此在创建它们所依赖的对象之前，大多数方法和变量（甚至是嵌套类）都无法使用。

然而，有时，在对象被通过应用程序创建前，你需要访问或使用其中的数据。（例如，除非事先知道球是红色时，应用程序无法生成一个红色的球）。对于这些情况，请使用 `static` 关键字。

### 6、try 和 catch

Java 擅长捕捉错误，但是，只有你告诉它遇到错误时该做什么，它才能优雅地恢复。在 Java 中，尝试执行一个动作的级联层次结构以 `try` 开头，出现错误时回落到 `catch`，并以 `finally` 结束。如果 `try` 子句失败，则将调用 `catch`，最后，不管结果如何，总是由 `finally` 来执行一些合理的动作。这里是一个示例：

```
try {
        cmd = parser.parse(opt, args);

        if(cmd.hasOption("help")) {
                HelpFormatter helper = new HelpFormatter();
                helper.printHelp("Hello <options>", opt);
                System.exit(0);
                }
        else {
                if(cmd.hasOption("shell") || cmd.hasOption("s")) {
                String target = cmd.getOptionValue("tgt");
                } // else
        } // fi
} catch (ParseException err) {
        System.out.println(err);
        System.exit(1);
        } //catch
        finally {
                new Hello().helloWorld(opt);
        } //finally
} //try
```

这是一个健壮的系统，它试图避免无法挽回的错误，或者，至少，为你提供让用户提交有用的反馈的选项。经常使用它，你的用户将会感谢你！

### 7、运行 Java 应用程序

Java 文件，通常以 `.java` 结尾，理论上说，可以使用 `java` 命令运行。然而，如果一个应用程序很复杂，运行一个单个文件是否会产生有意义的结果是另外一个问题。

来直接运行一个 `.java` 文件：

```
$ java ./Hello.java
```

通常，Java 应用程序以 Java 存档（JAR）文件的形式分发，以 `.jar` 结尾。一个 JAR 文件包含一个清单文件（可以指定主类、项目结构的一些元数据），以及运行应用程序所需的所有代码部分。

要运行一个 JAR 文件，你可以双击它的图标（取决于你的操作系统设置），你也可以从终端中启动它：

```
$ java -jar ./Hello.jar
```

### 适合所有人的 Java

Java 是一种强大的语言，由于有了 [OpenJDK](https://openjdk.java.net/) 项目及其它的努力，它是一种开放式规范，允许像 [IcedTea](https://icedtea.classpath.org/wiki/Main_Page)、[Dalvik](https://source.android.com/devices/tech/dalvik/) 和 [Kotlin](https://kotlinlang.org/) 项目的茁壮成长。学习 Java 是一种准备在各种行业中工作的好方法，而且，[使用 Java 的理由很多](https://opensource.com/article/19/9/why-i-use-java)。

---

via: <https://opensource.com/article/19/10/java-basics>

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

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


在终端里按你的方式显示日期和时间

# 在终端里按你的方式显示日期和时间

>
> Linux 的 date 命令提供了很多显示日期和时间的选项，要比你想的还要多。这是一些有用的选择。
>
>
>

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

在 Linux 系统上，`date` 命令非常简单。你键入 `date`，日期和时间将以一种有用的方式显示。它包括星期几、日期、时间和时区：

```
$ date
Tue 26 Nov 2019 11:45:11 AM EST
```

只要你的系统配置正确，你就会看到日期和当前时间以及时区。

但是，该命令还提供了许多选项来以不同方式显示日期和时间信息。例如，如果要显示日期以便进行排序，则可能需要使用如下命令：

```
$ date "+%Y-%m-%d"
2019-11-26
```

在这种情况下，年、月和日按该顺序排列。请注意，我们使用大写字母 `Y` 来获得四位数的年份。如果我们使用小写的 `y`，则只会看到两位数字的年份（例如 19）。不要让这种做法使你错误地联想到如果 `％m` 给你一个数字月份，`％M` 可能会给你月份的名称。不，`％M` 将给你分钟数。要以缩写名称格式获得月份，你要使用 `％b`，而对于完全拼写的月份，则要使用 `％B`。

```
$ date "+%b %B"
Nov November
```

或者，你可能希望以这种常用格式显示日期：

```
$ date "+%D"
11/26/19
```

如果你需要四位数的年份，则可以执行以下操作：

```
$ date "+%x"
11/26/2019
```

下面是一个可能有用的示例。假设你需要创建一个每日报告并在文件名中包含日期，则可以使用以下命令来创建文件（可能用在脚本中）：

```
$ touch Report-`date "+%Y-%m-%d"`
```

当你列出你的报告时，它们将按日期顺序或反向日期顺序（如果你添加 `-r`）列出。

```
$ ls -r Report*
Report-2019-11-26
Report-2019-11-25
Report-2019-11-22
Report-2019-11-21
Report-2019-11-20
```

你还可以在日期字符串中添加其他详细信息。可用的各种选项多得令人惊讶。你可以使用 `date "+%q"` 来显示你所在的一年中的哪个季度，或使用类似以下命令来显示两个月前的日期：

```
$ date --date="2 months ago"
Thu 26 Sep 2019 09:02:43 AM EDT
```

是否想知道下周四的日期？你可以使用类似 `date --date="next thu"` 的命令，但是要理解，对于Linux，下个周四意味着今天之后的周四。如果今天是星期三，那就是明天，而不是下周的星期四。但是，你可以像下面的第二个命令一样指定下周的星期四。

```
$ date --date="next thu"
Thu 28 Nov 2019 12:00:00 AM EST
$ date --date="next week thu"
Thu 05 Dec 2019 12:00:00 AM EST
```

`date` 命令的手册页列出了其所有选项。该列表多得令人难以置信，但是你可能会发现一些日期/时间显示选项非常适合你。以下是一些你可能会发现有趣的东西。

世界标准时间（UTC）：

```
$ date -u
Tue 26 Nov 2019 01:13:59 PM UTC
```

自 1970 年 1 月 1 日以来的秒数（与 Linux 系统上日期的存储方式有关）：

```
$ date +%s
1574774137
```

以下是 `date` 命令选项的完整列表。正如我所说，它比我们大多数人想象的要广泛得多。

* `%%` 显示字母 ％
* `％a` 本地语言环境的缩写星期名称（例如，日 / Sun）
* `％A` 本地语言环境的完整星期名称（例如，星期日 / Sunday）
* `％b` 本地语言环境的缩写月份名称（例如 一 / Jan）
* `％B` 本地语言环境的完整月份名称（例如，一月 / January）
* `％c` 本地语言环境的日期和时间（例如 2005年3月3日 星期四 23:05:25 / Thu Mar 3 23:05:25 2005）
* `％C` 世纪；类似于 `％Y`，但省略了后两位数字（例如，20）
* `%d` 月份的天（例如，01）
* `％D` 日期；与 `％m/％d/％y` 相同
* `％e` 月份的天，填充前缀空格；与 `％_d` 相同
* `％F` 完整日期；与 `％Y-％m-％d` 相同
* `％g` ISO 周号的年份的后两位数字（请参见 `％G`）
* `%G` ISO 周号的年份（请参阅 `％V`）；通常仅配合 `％V` 使用
* `％h` 与 `％b` 相同
* `％H` 24 小时制的小时（00..23）
* `％I` 12 小时制的小时（01..12）
* `%j` 一年的天（001..366）
* `％k` 24 小时制的小时，填充前缀空格（ 0..23）；与 `％_H` 相同
* `％l` 12 小时制的小时，填充前缀空格（ 1..12）；与 `％_I` 相同
* `％m` 月份（01..12）
* `％M` 分钟（00..59）
* `％n` 换行符
* `％N` 纳秒（000000000..999999999）
* `%p` 本地语言环境中等同于 AM 或 PM 的字符串；如果未知，则为空白
* `％P` 像 `％p`，但使用小写
* `％q` 季度（1..4）
* `％r` 本地语言环境的 12 小时制时间（例如，晚上 11:11:04 / 11:11:04 PM）
* `％R` 24 小时制的小时和分钟；与 `％H:％M` 相同
* `%s` 自 1970-01-01 00:00:00 UTC 以来的秒数
* `％S` 秒（00..60）
* `％t` 制表符
* `％T` 时间；与 `％H:％M:％S` 相同
* `％u` 星期（1..7）；1 是星期一
* `％U` 年的周号，以星期日为一周的第一天，从 00 开始（00..53）
* `％V` ISO 周号，以星期一为一周的第一天，从 01 开始（01..53）
* `％w` 星期（0..6）；0 是星期日
* `％W` 年的周号，星期一为一周的第一天，从 00 开始（00..53）
* `％x` 本地语言环境的日期表示形式（例如，1999年12月31日 / 12/31/99）
* `％X` 本地语言环境的时间表示形式（例如，23:13:48）
* `％y` 年的最后两位数字（00..99）
* `％Y` 年份
* `％z` +hhmm 格式的数字时区（例如，-0400）
* `％:z` +hh:mm 格式的数字时区（例如，-04:00）
* `％::z` +hh:mm:ss 格式的数字时区（例如，-04:00:00）
* `％:::z` 数字时区，`:` 指明精度（例如，-04, +05:30）
* `％Z` 字母时区缩写（例如，EDT）

---

via: <https://www.networkworld.com/article/3481602/displaying-dates-and-times-your-way-with-linux.html>

作者：[Sandra Henry-Stocker](https://www.networkworld.com/author/Sandra-Henry_Stocker/) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[校对者ID](https://github.com/%E6%A0%A1%E5%AF%B9%E8%80%85ID)

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


如何使用 Sphinx 给 Python 代码写文档

# 如何使用 Sphinx 给 Python 代码写文档

>
> 最好将文档作为开发过程的一部分。Sphinx 加上 Tox，让文档可以轻松书写，并且外观漂亮。
>
>
>

<img src="content_image/album_201911_29_163803d0a1ev3f40p4pk61.jpg" alt="Python in a coffee cup." title="Python in a coffee cup.">

Python 代码可以在源码中包含文档。这种方式默认依靠 **docstring**，它以三引号格式定义。虽然文档的价值是很大的，但是没有充足的文档的代码还是很常见。让我们演练一个场景，了解出色的文档的强大功能。

经历了太多在白板技术面试上要求你实现斐波那契数列，你已经受够了。你回家用 Python 写了一个可重用的斐波那契计算器，使用浮点技巧来实现 `O(1)` 复杂度。

代码很简单：

```
# fib.py
import math

_SQRT_5 = math.sqrt(5)
_PHI = (1 + _SQRT_5) / 2

def approx_fib(n):
    return round(_PHI**(n+1) / _SQRT_5)
```

（该斐波那契数列是四舍五入到最接近的整数的几何序列，这是我最喜欢的鲜为人知的数学事实之一。）

作为一个好人，你可以将代码开源，并将它放在 [PyPI](https://pypi.org/) 上。`setup.py` 文件很简单：

```
import setuptools

setuptools.setup(
    name='fib',
    version='2019.1.0',
    description='Fibonacci',
    py_modules=["fib"],
)
```

但是，没有文档的代码是没有用的。因此，你可以向函数添加 docstring。我最喜欢的 docstring 样式之一是 [“Google” 样式](http://google.github.io/styleguide/pyguide.html#381-docstrings)。标记很轻量，当它放在源代码中时很好。

```
def approx_fib(n):
    """
    Approximate Fibonacci sequence

    Args:
        n (int): The place in Fibonacci sequence to approximate

    Returns:
        float: The approximate value in Fibonacci sequence
    """
    # ...
```

但是函数的文档只是成功的一半。普通文档对于情境化代码用法很重要。在这种情况下，情景是恼人的技术面试。

有一种添加更多文档的方式，专业 Python 人的方式通常是在 `docs/` 添加 rst 文件（ [reStructuredText](http://docutils.sourceforge.net/rst.html) 的缩写）。因此 `docs/index.rst` 文件最终看起来像这样：

```
Fibonacci
=========

Are you annoyed at tech interviewers asking you to implement
the Fibonacci sequence?
Do you want to have some fun with them?
A simple
:code:`pip install fib`
is all it takes to tell them to,
um,
fib off.

.. automodule:: fib
   :members:
```

我们完成了，对吧？我们已经将文本放在了文件中。人们应该会看的。

### 使 Python 文档更漂亮

为了使你的文档看起来更漂亮，你可以利用 [Sphinx](http://www.sphinx-doc.org/en/master/)，它旨在制作漂亮的 Python 文档。这三个 Sphinx 扩展特别有用：

* `sphinx.ext.autodoc`：从模块内部获取文档
* `sphinx.ext.napoleon`：支持 Google 样式的 docstring
* `sphinx.ext.viewcode`：将 ReStructured Text 源码与生成的文档打包在一起

为了告诉 Sphinx 该生成什么以及如何生成，我们在 `docs/conf.py` 中配置一个辅助文件：

```
extensions = [
    'sphinx.ext.autodoc',
    'sphinx.ext.napoleon',
    'sphinx.ext.viewcode',
]
# 该入口点的名称，没有 .rst 扩展名。
# 惯例该名称是 index
master_doc = "index"
# 这些值全部用在生成的文档当中。
# 通常，发布（release）与版本（version）是一样的，
# 但是有时候我们会有带有 rc 标签的发布。
project = "Fib"
copyright = "2019, Moshe Zadka"
author = "Moshe Zadka"
version = release = "2019.1.0"
```

此文件使我们可以使用所需的所有元数据来发布代码，并注意扩展名（上面的注释说明了方式）。最后，要确保生成我们想要的文档，请使用 [Tox](https://tox.readthedocs.io/en/latest/) 管理虚拟环境以确保我们顺利生成文档：

```
[tox]
# 默认情况下，`.tox` 是该目录。
# 将其放在非点文件中可以从
# 文件管理器或浏览器的
# 打开对话框中打开生成的文档，
# 这些对话框有时会隐藏点文件。
toxworkdir = {toxinidir}/build/tox

[testenv:docs]
# 从 `docs` 目录内运行 `sphinx`，
# 以确保它不会拾取任何可能进入顶层目录下的
# 虚拟环境或 `build/` 目录下的其他工件的杂散文件。
changedir = docs
# 唯一的依赖关系是 `sphinx`。
# 如果我们使用的是单独打包的扩展程序，
# 我们将在此处指定它们。
# 更好的做法是指定特定版本的 sphinx。
deps =
    sphinx
# 这是用于生成 HTML 的 `sphinx` 命令。
# 在其他情况下，我们可能想生成 PDF 或电子书。
commands =
    sphinx-build -W -b html -d {envtmpdir}/doctrees . {envtmpdir}/html
# 我们使用 Python 3.7。
# Tox 有时会根据 testenv 的名称尝试自动检测它，
# 但是 `docs` 没有给出有用的线索，因此我们必须明确它。
basepython = python3.7
```

现在，无论何时运行 Tox，它都会为你的 Python 代码生成漂亮的文档。

### 在 Python 中写文档很好

作为 Python 开发人员，我们可以使用的工具链很棒。我们可以从 **docstring** 开始，添加 .rst 文件，然后添加 Sphinx 和 Tox 来为用户美化结果。

你对好的文档有何评价？你还有其他喜欢的方式么？请在评论中分享它们！

---

via: <https://opensource.com/article/19/11/document-python-sphinx>

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


官方源下载速度很慢，不知道有无有国内镜像

# 如何在 CentOS 8 / RHEL 8 上安装 VirtualBox 6.0

VirtualBox 是一款自由开源的虚拟化工具，它允许技术人员同时运行多个不同风格的虚拟机（VM）。它通常用于运行桌面（Linux 和 Windows），当人们尝试探索新的 Linux 发行版的功能或希望在 VM 中安装 OpenStack、Ansible 和 Puppet 等软件时，它会非常方便，在这种情况下，我们可以使用 VirtualBox 启动 VM。

VirtualBox 被分类为 2 类虚拟机管理程序，这意味着它需要一个现有的操作系统，在上面安装 VirtualBox 软件。VirtualBox 提供功能来创建本机网络或 NAT 网络。在本文中，我们将演示如何在 CentOS 8 和 RHEL 8 系统上安装最新版本的 VirtualBox 6.0，并演示如何安装 VirtualBox 扩展。

### 在 CentOS 8 / RHEL 8 上安装 VirtualBox 6.0 的安装步骤

#### 步骤 1： 启用 VirtualBox 和 EPEL 仓库

登录到你的 CentOS 8 或 RHEL 8 系统并打开终端，执行以下命令并启用 VirtualBox 和 EPEL 包仓库：

```
[root@linuxtechi ~]# dnf config-manager --add-repo=https://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo
```

使用以下 `rpm` 命令导入 Oracle VirtualBox 公钥：

```
[root@linuxtechi ~]# rpm --import https://www.virtualbox.org/download/oracle_vbox.asc
```

使用以下 `dnf` 命令启用 EPEL 仓库：

```
[root@linuxtechi ~]# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y
```

#### 步骤 2： 安装 VirtualBox 构建工具和依赖项

运行以下命令来安装所有 VirtualBox 构建工具和依赖项：

```
[root@linuxtechi ~]# dnf install binutils kernel-devel kernel-headers libgomp make patch gcc glibc-headers glibc-devel dkms -y
```

成功安装上面的依赖项和构建工具后，使用 `dnf` 命令继续安装 VirtualBox。

#### 步骤 3： 在 CentOS 8 / RHEL 8 上安装 VirtualBox 6.0

如果希望在安装之前列出 VirtualBox 的可用版本，请执行以下 dnf 命令：

```
[root@linuxtechi ~]# dnf search virtualbox
Last metadata expiration check: 0:14:36 ago on Sun 17 Nov 2019 04:13:16 AM GMT.
=============== Summary & Name Matched: virtualbox =====================
VirtualBox-5.2.x86_64 : Oracle VM VirtualBox
VirtualBox-6.0.x86_64 : Oracle VM VirtualBox
[root@linuxtechi ~]#
```

让我们使用以下 `dnf` 命令安装最新版本的 VirtualBox 6.0：

```
[root@linuxtechi ~]# dnf install VirtualBox-6.0 -y
```

如果有本地用户希望将 usb 设备连接到 VirtualBox VM，那么他/她应该是 `vboxusers` 组的一员，请使用下面的 `usermod` 命令将本地用户添加到 `vboxusers` 组。

```
[root@linuxtechi ~]# usermod -aG vboxusers pkumar
```

#### 步骤 4： 访问 CentOS 8 / RHEL 8 上的 VirtualBox

有两种方法可以访问 VirtualBox，在命令行输入 `virtualbox` 然后回车：

```
[root@linuxtechi ~]# virtualbox
```

在桌面环境中，在搜索框中搜索 “VirtualBox”。

单击 VirtualBox 图标：

这确认 VirtualBox 6.0 已成功安装，让我们安装它的扩展包。

#### 步骤 5： 安装 VirtualBox 6.0 扩展包

顾名思义，VirtualBox 扩展包用于扩展 VirtualBox 的功能。它添加了以下功能：

* USB 2.0 和 USB 3.0 支持
* 虚拟 RDP（VRDP）
* 磁盘镜像加密
* Intel PXE 启动
* 主机网络摄像头

使用下面的 `wget` 命令下载 Virtualbox 扩展包到下载文件夹中：

```
[root@linuxtechi ~]$ cd Downloads/
[root@linuxtechi Downloads]$ wget https://download.virtualbox.org/virtualbox/6.0.14/Oracle_VM_VirtualBox_Extension_Pack-6.0.14.vbox-extpack
```

下载后，打开 VirtualBox 并依次点击 “File -> Preferences -> Extension”，然后点击 “+” 号图标添加下载的扩展包：

单击 “Install” 开始安装扩展包：

单击 “I Agree” 接受 VirtualBox 扩展包许可证。

成功安装 VirtualBox 扩展包后，我们将看到下面的页面，单击 “OK” 并开始使用 VirtualBox。

本文就是这些了，我希望这些步骤可以帮助你在 CentOS 8 和 RHEL 8 系统上安装 VirtualBox 6.0。请分享你的宝贵的反馈和意见。

---

via: <https://www.linuxtechi.com/install-virtualbox-6-centos-8-rhel-8/>

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


揭开 Kubernetes 的神秘面纱

# 揭开 Kubernetes 的神秘面纱

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

>
> Kubernetes 是一款生产级的开源系统，用于容器化应用程序的自动部署、扩展和管理。本文关于使用 Kubernetes 来管理容器。
>
>
>

“容器”已成为最新的流行语之一。但是，这个词到底意味着什么呢？说起“容器”，人们通常会把它和 Docker 联系起来，Docker 是一个被定义为软件的标准化单元容器。该容器将软件和运行软件所需的环境封装到一个易于交付的单元中。

容器是一个软件的标准单元，用它来打包代码及其所有依赖项，这样应用程序就可以从一个计算环境到另一个计算环境快速可靠地运行。容器通过创建类似于 ISO 镜像的方式来实现此目的。容器镜像是一个轻量级的、独立的、可执行的软件包，其中包含运行应用程序所需的所有信息，包括代码、运行时、系统工具、系统库和设置。

容器镜像在运行时变成容器，对于 Docker 容器，镜像在 Docker 引擎上运行时变成容器。容器将软件与环境隔离开来，确保不同环境下的实例，都可以正常运行。

### 什么是容器管理？

容器管理是组织、添加或替换大量软件容器的过程。容器管理使用软件来自动化创建、部署和扩展容器。这一过程就需要容器编排，容器编排是一个自动对基于容器的应用程序进行部署、管理、扩展、联网和提供可用性的工具。

### Kubernetes

Kubernetes 是一个可移植的、可扩展的开源平台，用于管理容器化的工作负载和服务，它有助于配置和自动化。它最初由 Google 开发，拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、技术支持和工具得到广泛应用。

Google 在 2014 年开源了 Kubernetes 项目。Kubernetes 建立在 Google 十五年大规模运行生产工作负载的经验基础上，并结合了社区中最好的想法和实践以及声明式句法的使用。

下面列出了与Kubernetes生态系统相关的一些常用术语。

**Pod**：Pod 是 Kubernetes 应用程序的基本执行单元，是你创建或部署的 Kubernetes 对象模型中的最小和最简单的单元。Pod 代表在 Kubernetes 集群上运行的进程。

Pod 将运行中的容器、存储、网络 IP（唯一）和控制容器应如何运行的命令封装起来。它代表 Kubernetes 生态系统内的单个部署单元，代表一个应用程序的单个实例，该程序可能包含一个或多个紧密耦合并共享资源的容器。

Kubernetes 集群中的 Pod 有两种主要的使用方式。第一种是运行单个容器。即“一个容器一个 Pod”，这种方式是最常见的。第二种是运行多个需要一起工作的容器。

Pod 可能封装一个由紧密关联且需要共享资源的多个同位容器组成的应用程序。

<ruby> 副本集 <rt>  ReplicaSet </rt></ruby>：副本集的目的是维护在任何给定时间运行的一组稳定的副本容器集。 副本集包含有关一个特定 Pod 应该运行多少个副本的信息。为了创建多个 Pod 以匹配副本集条件，Kubernetes 使用 Pod 模板。副本集与其 Pod 的链接是通过后者的 `metas.ownerReferences` 字段实现，该字段指定哪个资源拥有当前对象。

<ruby> 服务 <rt>  Services </rt></ruby>：服务是一种抽象，用来公开一组 Pod 功能。使用 Kubernetes，你无需修改应用程序即可使用陌生服务发现机制。Kubernetes 给 Pod 提供了其自己的 IP 地址和一组 Pod 的单个 DNS 名称，并且可以在它们之间负载平衡。

服务解决的一个主要问题是 Web 应用程序前端和后端的集成。由于 Kubernetes 将幕后的 IP 地址提供给 Pod，因此当 Pod 被杀死并复活时，IP 地址会更改。这给给定的后端 IP 地址连接到相应的前端 IP 地址带来一个大问题。服务通过在 Pod 上提供抽象来解决此问题，类似于负载均衡器。

<ruby> 卷 <rt>  Volumes </rt></ruby>： Kubernetes 卷具有明确的生命周期，与围绕它的 Pod 相同。 因此，卷超过了 Pod 中运行的任何容器的寿命，并且在容器重新启动后保留了数据。当然，当 Pod 不存在时，该卷也将不再存在。也许比这更重要的是 Kubernetes 支持多种类型的卷，并且 Pod 可以同时使用任意数量的卷。

卷的核心只是一个目录，其中可能包含一些数据，Pod 中的容器可以访问该目录。该目录是如何产生的，它后端基于什么存储介质，其中的数据内容是什么，这些都由使用的特定卷类型来决定的。

### 为什么选择 Kubernetes？

容器是捆绑和运行应用程序的好方法。在生产环境中，你需要管理运行应用程序的容器，并确保没有停机时间。例如，如果一个容器发生故障，则需要启动另一个容器。如果由系统自动实现这一操作，岂不是更好？ Kubernetes 就是来解决这个问题的！Kubernetes 提供了一个框架来弹性运行分布式系统。该框架负责扩展需求、故障转移、部署模式等。例如，Kubernetes 可以轻松管理系统的金丝雀部署。

Kubernetes 为用户提供了:

1. 服务发现和负载平衡
2. 存储编排
3. 自动退出和回退
4. 自动打包
5. 自我修复
6. 秘密配置管理

### Kubernetes 可以做什么？

在本文中，我们将会看到一些从头构建 Web 应用程序时如何使用 Kubernetes 的代码示例。我们将在 Python 中使用 Flask 创建一个简单的后端服务器。

对于那些想从头开始构建 Web 应用程序的人，有一些前提条件，即：

1. 对 Docker、Docker 容器和 Docker 镜像的基本了解。可以访问[这里](https://www.docker.com/sites/default/files/Docker_CheatSheet_08.09.2016_0.pdf)快速了解。
2. 系统中应该安装 Docker。
3. 系统中应该安装 Kubernetes，有关如何在本地计算机上安装的说明，请访问[这里](https://kubernetes.io/docs/setup/learning-environment/minikube/)。

现在，创建一个目录，如下代码片段所示：

```
mkdir flask-kubernetes/app && cd flask-kubernetes/app
```

接下来，在 `flask-kubernetes/app` 目录中，创建一个名为 `main.py` 的文件，如下面的代码片段所示：

```
touch main.py
```

在新创建的 `main.py` 文件中，粘贴下面代码：

```
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello from Kubernetes!"

if __name__ == "__main__":
    app.run(host='0.0.0.0')
```

使用下面命令在本地安装 Flask：

```
pip install Flask==0.10.1
```

Flask 安装后，执行下面的命令：

```
python app.py
```

应该在本地 5000 端口运行 Flask 服务器，这是 Flask 应用程序的默认端口，并且你可以在 <http://localhost:5000> 上看到输出 “Hello from Kubernetes!”。服务器在本地运行之后，我们创建一个供 Kubernetes 使用的 Docker 镜像。创建一个名为 `Dockerfile` 的文件，并将以下代码片段粘贴到其中：

```
FROM python:3.7

RUN mkdir /app
WORKDIR /app
ADD . /app/
RUN pip install -r requirements.txt

EXPOSE 5000
CMD ["python", "/app/main.py"]
```

`Dockerfile` 文件的说明如下：

1. Docker 将从 DockerHub 获取 Python 3.7 镜像。
2. 将在镜像中创建一个应用程序目录。
3. 它将一个 `/app` 目录设置为工作目录。
4. 将内容从主机中的应用程序目录复制到镜像应用程序目录。
5. 发布端口 5000。
6. 最后，它运行命令，启动 Flask 服务器。

接下来，我们将使用以下命令创建 Docker 镜像：

```
docker build -f Dockerfile -t flask-kubernetes:latest .
```

创建 Docker 镜像后，我们可以使用以下命令在本地运行该镜像进行测试：

```
docker run -p 5001:5000 flask-kubernetes
```

通过运行容器在本地完成测试之后，我们需要在 Kubernetes 中部署它。我们将首先使用 `kubectl` 命令验证 Kubernetes 是否正在运行。如果没有报错，则说明它正在工作。如果有报错，请参考[该信息](https://kubernetes.io/docs/setup/learning-environment/minikube/)。

接下来，我们创建一个部署文件。这是一个 Yaml 文件，其中包含有关 Kubernetes 的说明，该说明涉及如何以声明性的方式创建 Pod 和服务。因为我们有 Flask Web 应用程序，我们将创建一个 `deployment.yaml` 文件，并在其中包含 Pod 和服务声明。

创建一个名为 `deployment.yaml` 的文件并向其中添加以下内容，然后保存：

```
apiVersion: v1
kind: Service
metadata:
  name: flask-kubernetes -service
spec:
  selector:
    app: flask-kubernetes
  ports:
  - protocol: "TCP"
    port: 6000
    targetPort: 5000
  type: LoadBalancer

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: flask-kubernetes
spec:
  replicas: 4
  template:
    metadata:
      labels:
        app: flask-kubernetes
    spec:
      containers:
      - name: flask-kubernetes
        image: flask-kubernetes:latest
        imagePullPolicy: Never
        ports:
          - containerPort: 5000
```

使用以下命令将 yaml 文件发送到 Kubernetes：

```
kubectl apply -f deployment.yaml
```

如果执行以下命令，你会看到 Pod 正在运行：

```
kubectl get pods
```

现在，导航至 [http://localhost:6000，你应该会看到](http://localhost:6000%EF%BC%8C%E4%BD%A0%E5%BA%94%E8%AF%A5%E4%BC%9A%E7%9C%8B%E5%88%B0) “Hello from Kubernetes!”消息。成功了！ 该应用程序现在正在 Kubernetes 中运行！

### Kubernetes 做不了什么？

Kubernetes 不是一个传统的，包罗万象的 PaaS（平台即服务）系统。 由于 Kubernetes 运行在容器级别而非硬件级别，因此它提供了 PaaS 产品共有的一些普遍适用功能，如部署、扩展、负载平衡、日志记录和监控。Kubernetes 为开发人员平台提供了构建块，但在重要的地方保留了用户的选择和灵活性。

* Kubernetes 不限制所支持的应用程序的类型。如果应用程序可以在容器中运行，那么它应该可以在 Kubernetes 上更好地运行。
* 它不部署和构建源代码。
* 它不决定日志记录、监视或警报解决方案。
* 它不提供或不要求配置语言/系统。它提供了一个声明式的 API 供所有人使用。
* 它不提供或不采用任何全面的机器配置、维护、管理或自我修复系统。

---

via: <https://opensourceforu.com/2019/11/demystifying-kubernetes/>

作者：[Abhinav Nath Gupta](https://opensourceforu.com/author/abhinav-gupta/) 选题：[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/) 荣誉推出


从 Python 2 切换到 Python 3 你所需要了解的

# 从 Python 2 切换到 Python 3 你所需要了解的

>
> Python 2 将在几周内走到生命终点，这篇文章是你迁移到 Python 3 之前应该知道的。
>
>
>

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

从 2020 年 1 月 1 日开始，Python 2.7 将不再得到正式支持。在此日期之后，将会发布一个[最终错误修复](https://www.python.org/dev/peps/pep-0373/#maintenance-releases)计划，但是仅此而已。

Python 2 的生命终点（EOL）对你意味着什么？如果正在运行着 Python 2，你需要迁移。

### 是谁决定 Python 2 的生命终点？

在 [2012](https://github.com/python/peps/commit/a733bc927acbca16bfa3de486fb2c7d3f767a748) 年，维护 Python 编程语言的团队审查了其选项。有两个越来越不同的代码库，Python 2 和 Python 3。这两者都很流行，但是较新的版本并未得到广泛采用。

除了 Python 3 中完全重写的 Unicode 支持改变了处理数据的底层方式造成的断层，这个主要版本的变化还一次性出现了一些非向后兼容的更改。这种断层的决定成文于 [2006 年](https://www.python.org/dev/peps/pep-3000/#compatibility-and-transition)。为了减轻该断层的影响，Python 2 继续保持了维护，并向后移植了一些 Python 3 的功能。为了进一步帮助社区过渡，EOL 日期[从 2015 年延长至 2020 年](https://github.com/python/peps/commit/f82462002b86feff36215b4230be28967039b0cc)，又延长了五年。

该团队知道，维护不同的代码库是必须解决的麻烦。最终，他们[宣布了](https://www.python.org/doc/sunset-python-2/)一项决定：

>
> “我们是制作和照料 Python 编程语言的志愿者。我们已决定 2020 年 1 月 1 日将是我们停止使用 Python 2 的日子。这意味着在这一天之后，即使有人发现其中存在安全问题，我们也将不再对其进行改进。你应尽快升级到 Python 3。”
>
>
>

[Nick Coghlan](https://twitter.com/ncoghlan_dev) 是 CPython 的核心开发人员，也是 Python 指导委员会的现任成员，[在他的博客中添加了更多信息](http://python-notes.curiousefficiency.org/en/latest/python3/questions_and_answers.html)。由 [Barry Warsaw](https://twitter.com/pumpichank)（也是 Python 指导委员会的成员）撰写的 [PEP 404](https://www.python.org/dev/peps/pep-0404/) 详细说明了 Python 2.8 永远不会面世的原因。

### 有人还在支持 Python 2 吗？

提供者和供应商对 Python 2 的支持会有所不同。[Google Cloud 宣布了](https://cloud.google.com/python/docs/python2-sunset/?utm_source=osdc&utm_medium=blog&utm_campaign=pysunset)它计划未来如何支持 Python 2。红帽还[宣布了红帽企业 Linux（RHEL）的计划](https://access.redhat.com/solutions/4455511)，而 AWS 宣布了 AWS 命令行界面和 [SDK](https://aws.amazon.com/sdk-for-python/) 的[次要版本更新要求](https://aws.amazon.com/blogs/developer/deprecation-of-python-2-6-and-python-3-3-in-botocore-boto3-and-the-aws-cli/)。

你还可以阅读 [Vicki Boykis](https://twitter.com/vboykis) 在 Stack Overflow 撰写的博客文章“[为什么迁移到 Python 3 需要这么长时间？](https://stackoverflow.blog/2019/11/14/why-is-the-migration-to-python-3-taking-so-long/)”，其中她指出了采用 Python 3 缓慢的三个原因。

### 使用 Python 3 的原因

不管是否有持续的支持，尽快迁移到 Python 3 是一个好主意。Python 3 将继续受到支持，它具有 Python 2 所没有的一些非常优雅的东西。

最近发布的 [Python 3.8](https://www.python.org/downloads/) 包含 [海象运算符](https://docs.python.org/3.8/whatsnew/3.8.html#assignment-expressions)、[位置参数](https://docs.python.org/3.8/whatsnew/3.8.html#positional-only-parameters)和[自描述的格式化字符串](https://docs.python.org/3.8/whatsnew/3.8.html#f-strings-support-for-self-documenting-expressions-and-debugging)等[功能](https://docs.python.org/3.8/whatsnew/3.8.html)。Python 3 的早期版本引入的[功能](https://docs.python.org/3.8/whatsnew/index.html)，例如 [异步 IO](https://docs.python.org/3.8/library/asyncio.html#module-asyncio)、[格式化字符串](https://docs.python.org/3.7/whatsnew/3.6.html#pep-498-formatted-string-literals)、[类型提示](https://docs.python.org/3.7/whatsnew/3.5.html#pep-484-type-hints) 和 [pathlib](https://docs.python.org/3.8/library/pathlib.html#module-pathlib)，这里只提及了一点点。

下载最多的前 360 个软件包[已迁移到 Python 3](http://py3readiness.org/)。你可以使用 [caniusepython3](https://pypi.org/project/caniusepython3/) 软件包检查你的 `requirements.txt` 文件，以查看你依赖的任何软件包是否尚未迁移。

### 将 Python 2 移植到 Python 3 的参考资源

有许多参考资源可简化你向 Python 3 的迁移。例如，“[将 Python 2 移植到 Python 3 指南](https://docs.python.org/3/howto/pyporting.html)”列出了许多工具和技巧，可帮助你实现与 Python 2/3 单一源代码的兼容性。在 [Python3statement.org](https://python3statement.org/practicalities/) 上也有一些有用的技巧。

[Dustin Ingram](https://twitter.com/di_codes) 和 [Chris Wilcox](https://twitter.com/chriswilcox47) 在 [Cloud Next ‘19](https://www.youtube.com/watch?v=Bye7Rms0Vgw&utm_source=osdc&utm_medium=blog&utm_campaign=pysunset)上作了一个演讲，详细介绍了向 Python 3 过渡的一些动机和迁移模式。[Trey Hunner](https://twitter.com/treyhunner) 在 [PyCon 2018 演讲](https://www.youtube.com/watch?v=klaGx9Q_SOA)上介绍了 Python 3 最有用的功能，鼓励你进行迁移，以便你可以利用它们。

### 加入我们！

距 2020 年 1 月 1 日仅有几周了。如果你需要每天提醒一下它即将到来的时间（并且你使用 Twitter 的话），请关注 [Python 2 日落倒计时](https://twitter.com/python2sunset) Twitter 机器人。

---

via: <https://opensource.com/article/19/11/end-of-life-python-2>

作者：[Katie McLaughlin](https://opensource.com/users/glasnt) 选题：[lujun9972](https://github.com/lujun9972) 译者：[wxy](https://github.com/wxy) 校对：[wxy](https://github.com/wxy)

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


Summary: 在这篇文章中，我们将看看如何在 Fedora 30 Server 上安装 LEMP

E?

原来 NginX 是 Engine X 的缩写。。。

# 如何在 Fedora 30 Server 上安装 LEMP（Linux、Nginx、MariaDB、PHP）

在这篇文章中，我们将看看如何在 Fedora 30 Server 上安装 **LEMP** 。LEMP 代表：

* L -> Linux
* E -> Nginx
* M -> Maria DB
* P -> PHP

我假设 [Fedora 30](https://www.linuxtechi.com/fedora-30-workstation-installation-guide/) 已经安装在你的电脑系统上。

LEMP 是一组强大的软件设置集合，它安装在一个 Linux 服务器上以帮助使用流行的开发平台来构建网站，LEMP 是 LAMP 的一个变种，在其中不是 Apache ，而是使用 EngineX（Nginx），此外，使用 MariaDB 代替 MySQL。这篇入门指南是一个安装 Nginx、Maria DB 和 PHP 的独立指南的作品集合。

### 在 Fedora 30 Server 上安装 Nginx、PHP 7.3 和 PHP-FPM

让我们看看如何在 Fedora 30 Server 上安装 Nginx 和 PHP 以及 PHP FPM。

#### 步骤 1) 切换到 root 用户

在系统上安装 Nginx 的第一步是切换到 root 用户。使用下面的命令：

```
root@linuxtechi ~]$ sudo -i
[sudo] password for pkumar:
[root@linuxtechi ~]#
```

#### 步骤 2) 使用 dnf 命令安装 Nginx、PHP 7.3 和 PHP FPM

使用下面的 `dnf` 命令安装 Nginx：

```
[root@linuxtechi ~]# dnf install nginx php php-fpm php-common -y
```

#### 步骤 3) 安装额外的 PHP 模块

PHP 的默认安装仅自带基本模块和最需要的模块，如果你需要额外的模块，像 PHP 支持的 GD、XML、命令行接口、Zend OPCache 功能等等，你总是能够选择你的软件包，并一次性安装所有的东西。查看下面的示例命令：

```
[root@linuxtechi ~]# sudo dnf install php-opcache php-pecl-apcu php-cli php-pear php-pdo php-pecl-mongodb php-pecl-redis php-pecl-memcache php-pecl-memcached php-gd php-mbstring php-mcrypt php-xml -y
```

#### 步骤 4) 开始 & 启用 Nginx 和 PHP-fpm 服务

使用下面的命令来开始并启用 Nginx 服务：

```
[root@linuxtechi ~]# systemctl start nginx && systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@linuxtechi ~]#
```

使用下面的命令来开始并启用 PHP-FPM 服务：

```
[root@linuxtechi ~]# systemctl start php-fpm && systemctl enable php-fpm
Created symlink /etc/systemd/system/multi-user.target.wants/php-fpm.service → /usr/lib/systemd/system/php-fpm.service.
[root@linuxtechi ~]#
```

#### 步骤 5) 核实 Nginx (Web 服务) 和 PHP 安装

注意：假使操作系统防火墙是启用的，并运行在你的 Fedora 30 系统上，那么使用下面的命令来准许 80 和 443 端口：

```
[root@linuxtechi ~]# firewall-cmd --permanent --add-service=http
success
[root@linuxtechi ~]#
[root@linuxtechi ~]# firewall-cmd --permanent --add-service=https
success
[root@linuxtechi ~]# firewall-cmd --reload
success
[root@linuxtechi ~]#
```

打开网页浏览器，输入下面的 URL： http:// 。

上面的屏幕证实 Nginx 已经成功地安装。

现在，让我们核实 PHP 安装，使用下面的命令创建一个测试 php 页（`info.php`）：

```
[root@linuxtechi ~]# echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/info.php
[root@linuxtechi ~]#
```

在网页浏览器中输入下面的 URL， http:///info.php

上面的页面验证 PHP 7.3.5 已经被成功地安装。现在，让我们安装 MariaDB 数据库服务器。

### 在 Fedora 30 上安装 MariaDB

MariaDB 是 MySQL 数据库的一个极好的替代品，因为它的工作方式与 MySQL 非常类似，并且兼容性也与 MySQL 一致。让我们看看在 Fedora 30 Server 上安装 MariaDB 的步骤。

#### 步骤 1) 切换到 root 用户

在系统上安装 MariaDB 的第一步是切换到 root 用户，或者你可以使用有 root 权限的本地用户。使用下面的命令：

```
[root@linuxtechi ~]# sudo -i
[root@linuxtechi ~]#
```

#### 步骤 2) 使用 dnf 命令安装 MariaDB（10.3）的最新版本

在 Fedora 30 Server 上使用下面的命令来安装 MariaDB：

```
[root@linuxtechi ~]# dnf install mariadb-server -y
```

#### 步骤 3) 开启并启用 MariaDB 服务

在步骤 2 中成功地安装 MariaDB 后，接下来的步骤是开启 MariaDB 服务。使用下面的命令：

```
[root@linuxtechi ~]# systemctl start mariadb.service ; systemctl enable mariadb.service
```

#### 步骤 4) 保护安装好的 MariaDB

当我们安装 MariaDB 服务器时，因为默认情况下没有 root 密码，在数据库中也会创建匿名用户。因此，要保护安装好的 MariaDB，运行下面的 `mysql_secure_installation` 命令：

```
[root@linuxtechi ~]# mysql_secure_installation
```

接下来你将被提示一些问题，仅回答下面展示的问题：

#### 步骤 5) 测试 MariaDB 安装

在你安装后，你总是能够测试是否 MariaDB 被成功地安装在 Fedora 30 Server 上。使用下面的命令：

```
[root@linuxtechi ~]# mysql -u root -p
Enter password:
```

接下来，你将被提示一个密码。输入在保护安装好的 MariaDB 期间你设置的密码，接下来你可以看到 MariaDB 欢迎屏幕。

```
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 17
Server version: 10.3.12-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
```

最后，我们已经在你的 Fedora 30 Server 上成功地完成安装 LEMP（Linux、Nginx、MariaDB 和 PHP）的所有工作。请在下面的反馈部分发布你的评论和建议，我们将尽快在后面回应。

---

via: <https://www.linuxtechi.com/install-lemp-stack-fedora-30-server/>

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


在 Fedora 上使用 GIMP 轻松编辑图像

# 在 Fedora 上使用 GIMP 轻松编辑图像

GIMP（GNU Image Manipulation Program 的缩写）是自由开源的图像处理软件。它有很多的功能，从简单的图像编辑，到复杂的滤镜、脚本，甚至是动画，它是流行的商业同类软件的一款很好的替代品。

继续阅读来学习如何在 Fedora 上安装和使用 GIMP。这篇文章涉及基本的日常图像编辑工作。

### 安装 GIMP

GIMP 在官方 Fedora 存储库中可获得。为安装它，运行：

```
sudo dnf install gimp
```

### 单窗口模式

在你打开应用程序后，它显示带有工具箱和主编辑区的暗色主题窗口。注意，它有两种窗口模式，你可以通过选择“<ruby> 窗口 <rt>  Windows </rt></ruby> -> <ruby> 单窗口模式 <rt>  Single Window Mode </rt></ruby>”在其中切换。通过选中这个选项，用户界面的所有组件将显示在单个窗口中。否则，它们将是分离的。

### 加载图像

为加载图像，转到“<ruby> 文件 <rt>  File </rt></ruby> -> <ruby> 打开 <rt>  Open </rt></ruby>”，然后选择你的文件并选择你的图像文件。

### 重新调整一个图像的大小

为重新调整图像大小，你可以基于一对参数重新调整大小，包括像素和百分比 —— 在编辑图像时，这两个参数很方便。

让我们假使我们需要缩小 Fedora 30 背景图像到它当前大小的 75%。为此，选择“<ruby> 图像 <rt>  Image </rt></ruby> -> <ruby> 比例 <rt>  Scale </rt></ruby>”，然后在比例对话框上，在单位下拉列表中选择“<ruby> 百分比 <rt>  percentage </rt></ruby>”。接下来，输入 “75” 作为宽度或高度，然后按 Tab 键。默认情况下，其它尺寸将自动地调整大小，以相应地与更改的尺寸保持纵横比。现在，保存其它选项不变，并按比例。

该图像缩小到其原始尺寸的 75%。

### 旋转图像

旋转是一种变换操作，因此，你可以从主菜单下的“<ruby> 图像 <rt>  Image </rt></ruby> -> <ruby> 变换 <rt>  Transform </rt></ruby>”下找到它，其中有图像旋转 90° 或 180° 的选项。在上述选项下也有垂直或水平翻转图像的选项。

让我们假使我们需要旋转图像 90°。在应用一次 90° 顺时针旋转和水平翻转后，我们的图像将看起来像这样：

### 添加文本

添加文本非常简单。只需要从工具箱中选择 “A” 图标，然后，在你的图像上，单击你想要添加文本的位置。如果工具箱不可见，从“<ruby> 窗口 <rt>  Windows </rt></ruby> -> <ruby> 新建工具箱 <rt>  New Toolbox </rt></ruby>”打开它。

当你编辑文本时，你可能注意到，文本对话框有字体自定义选项，包括字体系列、字体大小等等。

### 保存和导出

你可以从“<ruby> 文件 <rt>  File </rt></ruby> -> <ruby> 保存 <rt>  Save </rt></ruby>”或通过按 `Ctrl+S` 来将你的编辑保存为一个带有 `.xcf` 扩展名的 GIMP 工程。或者，你可以导出你的图像，例如，以 PNG 或 JPEG 格式。为导出图像，转到“<ruby> 文件 <rt>  File </rt></ruby> -> <ruby> 导出为 <rt>  Export As </rt></ruby>”或按 `Ctrl+Shift+E`，接下来，在你面前将产生一个你可以选择输出图像和名称的对话框。

---

via: <https://fedoramagazine.org/edit-images-on-fedora-easily-with-gimp/>

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


如何在 CentOS 8/RHEL 8 上安装 Ansible（自动化工具）

# 如何在 CentOS 8/RHEL 8 上安装 Ansible（自动化工具）

Ansible 是给 Linux 系统管理员使用的出色自动化工具。它是一种开源配置工具，能让系统管理员可以从一个中心节点（即 Ansible 服务器）管理数百台服务器。将 Ansible 与 Puppet、Chef 和 Salt 等类似工具进行比较时，它是首选的配置工具，因为它不需要任何代理，并且可以工作在 SSH 和 python 上。

在本教程中，我们将学习如何在 CentOS 8 和 RHEL 8 系统上安装和使用 Ansble。

Ansible 实验环境信息：

* 最小化安装的 CentOS 8 / RHEL 8 服务器（192.168.1.10），且有互联网连接
* 两个 Ansible 节点 - Ubuntu 18.04 LTS （192.168.1.20） 和 CentOS 7 （192.168.1.30）

### CentOS 8 上的 Ansible 安装步骤

Ansible 包不在 CentOS 8 默认的软件包仓库中。因此，我们需要执行以下命令启用 [EPEL 仓库](http://www.linuxtechi.com/enable-epel-repo-centos8-rhel8-server/)：

```
[root@linuxtechi ~]$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y
```

启用 epel 仓库后，执行以下 `dnf` 命令安装 Ansible：

```
[root@linuxtechi ~]$ sudo dnf install ansible
```

上面命令的输出：

成功安装 Ansible 后，运行以下命令验证它的版本：

```
[root@linuxtechi ~]$ sudo ansible --version
```

上面的输出确认在 CentOS 8 上安装完成。

让我们看下 RHEL 8 系统。

### RHEL 8 上的 Ansible 安装步骤

如果你有有效的 RHEL 8 订阅，请使用以下订阅管理器命令启用 Ansble 仓库：

```
[root@linuxtechi ~]$ sudo subscription-manager repos --enable ansible-2.8-for-rhel-8-x86_64-rpms
```

启用仓库后，执行以下 `dnf` 命令安装 Ansible：

```
[root@linuxtechi ~]$ sudo dnf install ansible -y
```

安装 Ansible 及其依赖包后，执行以下命令来验证它的版本：

```
[root@linuxtechi ~]$ sudo ansible --version
```

### 在 CentOS 8 / RHEL 8 上通过 pip3 安装 Ansible 的可选方法

如果你希望使用 `pip`（Python 的包管理器）安装 Ansible，请首先使用以下命令安装 pyhton3 和 python3-pip 包：

```
[root@linuxtechi ~]$ sudo dnf install python3 python3-pip -y
```

安装 python3 后，运行以下命令来验证它的版本：

```
[root@linuxtechi ~]$ python3 -V
Python 3.6.8
[root@linuxtechi ~]$
```

用下面的 `pip3` 命令安装 Ansible：

```
[root@linuxtechi ~]$ pip3 install ansible --user
```

输出：

上面的输出确认 Ansible 已成功使用 `pip3` 安装。让我们看下如何使用 Ansible。

### 如何使用 Ansible 自动化工具？

当我们使用 `yum` 或 `dnf` 命令安装 Ansible 时，它的配置文件、清单文件和角色目录会自动在 `/etc/ansible` 文件夹下创建。

让我们添加一个名称为 `labservers` 的组，并在 `/etc/ansible/hosts` 文件中给该组添加上述的 Ubuntu 18.04 和 CentOS 7 系统的 IP 地址：

```
[root@linuxtechi ~]$ sudo vi /etc/ansible/hosts
…
[labservers]
192.168.1.20
192.168.1.30
…
```

保存并退出文件。

更新清单文件（`/etc/ansible/hosts`）后，将用户的 ssh 公钥放到属于 `labservers` 组的远程系统。

让我们首先使用 `ssh-keygen` 命令生成本地用户的公钥和私钥：

```
[root@linuxtechi ~]$ ssh-keygen
```

现在使用以下命令在 Ansible 服务器及其客户端之间交换公钥：

```
[root@linuxtechi ~]$ ssh-copy-id root@linuxtechi
[root@linuxtechi ~]$ ssh-copy-id root@linuxtechi
```

现在，让我们尝试几个 Ansible 命令，首先使用 `ping` 模块验证 Ansible 服务器与客户端的连接：

```
[root@linuxtechi ~]$ ansible -m ping "labservers"
```

注意： 如果我们没有在上面的命令中指定清单文件，那么它将引用默认主机文件（即 `/etc/ansible/hosts`）。

输出：

让我们使用 Ansible shell 命令检查每个客户端的内核版本：

```
[root@linuxtechi ~]$ ansible -m command -a "uname -r" "labservers"
192.168.1.30 | CHANGED | rc=0 >>
4.15.0-20-generic
192.168.1.20 | CHANGED | rc=0 >>
3.10.0-327.el7.x86_64
[root@linuxtechi ~]$
```

使用以下命令列出清单文件中的所有主机：

```
[root@linuxtechi ~]$ ansible all -i /etc/ansible/hosts --list-hosts
  hosts (4):
    192.168.100.1
    192.168.100.10
    192.168.1.20
    192.168.1.30
[root@linuxtechi ~]$
```

使用以下 Ansible 命令仅列出 `labservers` 组中的主机：

```
root@linuxtechi ~]$ ansible labservers -i /etc/ansible/hosts --list-hosts
  hosts (2):
    192.168.1.20
    192.168.1.30
[root@linuxtechi ~]$
```

本文就是这些了，我们成功演示了如何在 CentOS 8 和 RHEL 8 系统中安装和使用 Ansible。请分享你的反馈和意见。

---

via: <https://www.linuxtechi.com/install-ansible-centos-8-rhel-8/>

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


Linux 资深用户的 6 大特征

Summary: 如果你是 Linux 资深用户，则可能会有这些共同倾向。

当我打开Windows操作系统时，手情不自禁的找起了power shell~

使用windows总有种手足无措的感觉

如果你是 Linux 资深用户，则可能会有这些共同倾向。

# Linux 资深用户的 6 大特征

>
> 如果你是 Linux 资深用户，则可能会有这些共同倾向。
>
>
>

Linux 用户千差万别，但是我们许多人都有一些相同的习惯。你可能没有本文列出的任何特征，而且如果你是个 Linux 新用户，你可能还不能理解这些特征……

下面是你可能是 Linux 用户的六个特征。

### 1、理所当然，纪元始于 1970 年 1 月 1 日

关于 Unix 计算机时钟为何在重置时总是将其设置回 1970-01-01 的传闻有很多。但有点令人感到乏味的事实是，Unix “纪元”是用于同步的通用且简单的参考点。例如，万圣节在儒略历中是今年的 304 日，但我们通常将该节日称为 “31 号”。我们知道指的是哪个月的 31 号，因为我们有个共同的参考点：我们知道万圣节在 10 月庆祝，而 10 月是一年中的第十个月，并且我们知道前面每一个月包含多少天。没有这些值，虽然我们可以使用传统的计时方法（如月相）来跟踪特殊的季节性事件，但是计算机显然不具备这种能力。

计算机需要确定且明确定义的值，因此将值 `1970-01-01T00:00:00Z` 选择为 Unix 纪元的开始。每当 [POSIX](https://opensource.com/article/19/7/what-posix-richard-stallman-explains) 计算机的时间不准确时，诸如网络时间协议（NTP）之类的服务就可以向其提供自 `1970-01-01T00:00:00Z` 以来的秒数，计算机可以将其转换为人类易于识别的日期。

日期和时间是在计算中要追踪的著名的复杂事物，主要是因为几乎所有标准都有例外。一个月并不总是有 30 天，一年也不总是有 365 天，甚至每年有多少秒钟也往往会有所不同。如果你正在寻找一个有趣而令人沮丧的编程练习，那么请尝试编程一个可靠的日历应用程序！

### 2、输入超过两个字母你就会觉得麻烦

众所周知，最常见的 Unix 命令都超简短。除了 `cd`、`ls` 和 `mv` 之类的命令外，还有一个命令简直不能再短了：`w`（它根据 `/var/run/utmp` 文件显示当前谁登录了）。

一方面，极短的命令似乎很不直观。新用户可能不会猜测到键入 `ls` 会<ruby> 列出 <rt>  list </rt></ruby>目录。但是，一旦学习命令，它们肯定是越短越好。如果你整天都在终端上度过，那么你键入的击键次数越少就意味着你可以有更多的时间来完成工作。

幸运的是，单字母命令并不太多，因此你可以使用大多数字母作为别名。例如，我经常使用 Emacs，以至于我觉得 `emacs` 的输入时间太长，因此通过将下面这行添加到 `.bashrc` 文件中，将其别名为 `e`：

```
alias e='emacs'
```

你也可以临时为命令添加别名。例如，如果你在解决网络问题时发现自己反复运行 [firewall-cmd](https://opensource.com/article/19/7/make-linux-stronger-firewalls)，则可以为当前会话创建别名：

```
$ alias f='firewall-cmd'
$ f
usage: see firewall-cmd man page
No option specified.
```

只要你打开着终端，你的别名就会一直存在。当终端一旦关闭，它便会被遗忘。

### 3、做任何事都不应该单击两次以上

Linux 用户喜欢效率。尽管并非每个 Linux 用户都总是急于完成工作，但 Linux 桌面中有一些旨在减少完成任务所需的操作数量的惯例。这里有些例子。

* 在 KDE 文件管理器 Dolphin 中，单击即可打开文件或目录。假定如果要选择一个文件，则可以单击并拖动，也可以 `Ctrl + 点击`。这可能会使习惯于双击所有内容的用户感到困惑，但是一旦你尝试了单击操作，通常就无法返回费力的双击操作。
* 在大多数 Linux 桌面上，单击鼠标中键可粘贴剪贴板的最新内容。
* 在许多 Linux 桌面上，可以通过按 `Alt`、`Ctrl` 或 `Shift` 键来修改拖动动作。例如，`Alt + 拖动` 在 KDE 中移动窗口，而 GNOME 中的 `Ctrl + 拖动` 会复制文件而不是移动。

### 4、任何操作你都不会执行三次以上，因为第三次时你已经将它自动化了

请原谅我有点夸张，但是许多 Linux 用户期望他们的计算机比他们更努力地工作。虽然学习如何自动执行常见任务需要花费时间，但在 Linux 上它往往比在其它平台上更容易，因为 Linux 终端和 Linux 操作系统是如此紧密地集成在一起。最容易自动化的是你在终端中已经执行的操作，因为命令只是你在解释器中键入的字符串，而该解释器（终端）不会在乎你是手动键入字符串还是将其指向一个脚本。

例如，如果你发现自己经常将一组文件从一个位置移动到另一个位置，则或许可以将相同的指令序列用作一个脚本，你可以使用单个命令来触发该脚本。假设你每天早上手动执行此操作：

```
$ cd Documents
$ trash reports-latest.txt
$ wget myserver.local/reports/daily/report-latest.txt
$ cp report-latest.txt reports_daily/2019-31-10.log
```

这是一个简单的序列，但是每天重复一次并不是消磨时间的最有效方法。做一点点抽象，你可以使用一个简单的脚本将其自动化：

```
#!/bin/sh

trash $HOME/Documents/reports-latest.txt

wget myserver.local/reports/daily/report-latest.txt \
  -P $HOME/Documents/udpates_daily/`date --iso-8601`.log

cp $HOME/Documents/udpates_daily/`date --iso-8601`.log \
  $HOME/Documents/reports-latest.txt
```

你可以把你的脚本叫做 `get-reports.sh` 并在每天早晨手动启动它，或者甚至可以将其输入到 crontab 中，以便计算机可以执行此任务而无需你进行任何干预。

对于新用户来说，这可能会有点困扰，因为什么和什么是一体的并不总是很明显。例如，如果你经常发现自己打开图像并将其按比例缩小 50％，那么你可能习惯于执行以下操作：

1. 打开你的照片查看器或编辑器
2. 缩放图像
3. 将图像导出为修改后的文件
4. 关闭应用程序

如果你一天要做几次，你可能会对这种重复感到厌倦。但是，由于你是在图形用户界面（GUI）中执行这些操作的，因此你需要知道如何对 GUI 编写脚本以使其自动化。某些应用程序，例如 [GIMP](https://www.gimp.org/)，具有丰富的脚本接口，但是其过程显然不同于仅修改一堆命令并将其存储到文件中那么简单。

再说一次，有时在命令行中有与你在 GUI 中所做的等效的操作。将文档从一种文本格式转换为另一种格式可以使用 [Pandoc](https://opensource.com/article/19/5/convert-markdown-to-word-pandoc)，处理图像可以使用 [Image Magick](https://opensource.com/article/17/8/imagemagick)，音乐和视频也可以通过命令行进行编辑和转换，等等。最大的问题是你需要知道要查找什么，通常是学习新的（有时是复杂的）命令。但是，在终端中按比例缩小图像比在 GUI 中显然更简单：

```
#!/bin/sh

convert "${1}" -scale 50% `basename "${1}" .jpg`_50.jpg
```

这些麻烦、重复的任务值得研究。你永远不知道你的工作让计算机做起来是有多么的简单和快捷！

### 5、发行版之间跳来跳去

我在家里是一个热情的 Slackware 用户，而在工作时是一个 RHEL 用户。实际上，这不是事实，我现在在工作时是 Fedora 用户。除了有时候我使用 CentOS，偶尔我还会运行 [Mageia](http://mageia.org)。

*运行在 PowerPC64 机器上的 Debian*

发行版好不好无关紧要，成为 Linux 用户的极致乐趣之一是可以自由决定运行哪个发行版。乍一看，它们基本相同，令人耳目一新。但是根据你的心情，你可能更喜欢 CentOS 的稳定性而不是 Fedora 的不断更新，或者你可能有一天会真正享受 Mageia 的集中控制中心，然后又对原始的 [Debian](http://debian.org) 配置文件进行模块化乐在其中，而有时你又会完全转向其他操作系统。

*OpenBSD，不是 Linux 发行版*

关键是，Linux 发行版是激情项目，成为其他人的开源激情的一部分很有趣。

### 6、你对开源充满热情

无论你的经验如何，如果你是 Linux 用户，那么你无疑会对开源充满热情。无论你是每天通过[共创艺术品](http://freesvg.org)还是代码来表达你的热情，还是将其升华到只在自由而自在的环境中完成工作，你都生活并构筑于开源之上。因为有了千千万万个你，所以有了开源社区，社区因你而变得更加丰富。

有太多的东西我没有提到。作为 Linux 用户，还有什么可以出卖你的身份？让我们在评论中知道！

---

via: <https://opensource.com/article/19/10/signs-linux-user>

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

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


在 awk 中怎么使用循环

Summary: 来学习一下多次执行同一条命令的不同类型的循环。

来学习一下多次执行同一条命令的不同类型的循环。

# 在 awk 中怎么使用循环

>
> 来学习一下多次执行同一条命令的不同类型的循环。
>
>
>

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

`awk` 脚本有三个主要部分：`BEGIN` 和 `END` 函数（都可选），用户自己写的每次要执行的函数。某种程度上，`awk` 的主体部分就是一个循环，因为函数中的命令对每一条记录都会执行一次。然而，有时你希望对于一条记录执行多次命令，那么你就需要用到循环。

有多种类型的循环，分别适合不同的场景。

### while 循环

一个 `while` 循环检测一个表达式，如果表达式为 `true` 就执行命令。当表达式变为 `false` 时，循环中断。

```
#!/bin/awk -f

BEGIN {
        # Loop through 1 to 10

    i=1;
    while (i <= 10) {
        print i, " to the second power is ", i*i;
        i = i+1;
    }
exit;
}
```

在这个简单实例中，`awk` 打印了放在变量 `i` 中的整数值的平方。`while (i <= 10)` 语句告诉 `awk` 仅在 `i` 的值小于或等于 10 时才执行循环。在循环最后一次执行时（`i` 的值是 10），循环终止。

### do-while 循环

do-while 循环执行在关键字 `do` 之后的命令。在每次循环结束时检测一个测试表达式来决定是否终止循环。仅在测试表达式返回 `true` 时才会重复执行命令（即还没有到终止循环的条件）。如果测试表达式返回 `false`，因为到了终止循环的条件所以循环被终止。

```
#!/usr/bin/awk -f
BEGIN {

        i=2;
        do {
                print i, " to the second power is ", i*i;
                i = i + 1
        }
        while (i < 10)

exit;
}
```

### for 循环

`awk` 中有两种 `for` 循环。

一种 `for` 循环初始化一个变量，检测一个测试表达式，执行变量递增，当表达式的结果为 `true` 时循环就会一直执行。

```
#!/bin/awk -f

BEGIN {
    for (i=1; i <= 10; i++) {
        print i, " to the second power is ", i*i;
    }
exit;
}
```

另一种 `for` 循环设置一个有连续索引的数组变量，对每一个索引执行一个命令集。换句话说，它用一个数组“收集”每一条命令执行后的结果。

本例实现了一个简易版的 Unix 命令 `uniq`。通过把一系列字符串作为键加到数组 `a` 中，当相同的键再次出现时就增加键值，可以得到某个字符串出现的次数（就像 `uniq` 的 `--count` 选项）。如果你打印该数组的所有键，将会得到出现过的所有字符串。

用演示文件 `colours.txt`（前一篇文章中的文件）来举例：

```
name       color  amount
apple      red    4
banana     yellow 6
raspberry  red    99
strawberry red    3
grape      purple 10
apple      green  8
plum       purple 2
kiwi       brown  4
potato     brown  9
pineapple  yellow 5
```

这是 `awk` 版的简易 `uniq -c`：

```
#! /usr/bin/awk -f

NR != 1 {
    a[$2]++
}
END {
    for (key in a) {
                print a[key] " " key
    }
}
```

示例数据文件的第三列是第一列列出的条目的计数。你可以用一个数组和 `for` 循环来按颜色统计第三列的条目。

```
#! /usr/bin/awk -f

BEGIN {
    FS=" ";
    OFS="\t";
    print("color\tsum");
}
NR != 1 {
    a[$2]+=$3;
}
END {
    for (b in a) {
        print b, a[b]
    }
}
```

你可以看到，在处理文件之前也需要在 `BEFORE` 函数（仅仅执行一次）中打印一列表头。

### 循环

在任何编程语言中循环都是很重要的一部分，`awk` 也不例外。使用循环你可以控制 `awk` 脚本怎样去运行，它可以统计什么信息，还有它怎么去处理你的数据。我们下一篇文章会讨论 `switch`、`continue` 和 `next` 语句。

---

via: <https://opensource.com/article/19/11/loops-awk>

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

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


5 个用于在 Linux 终端中查找域名 IP 地址的命令

# 5 个用于在 Linux 终端中查找域名 IP 地址的命令

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

本教程介绍了如何在 Linux 终端验证域名或计算机名的 IP 地址。本教程将允许你一次检查多个域。你可能已经使用过这些命令来验证信息。但是，我们将教你如何有效使用这些命令在 Linux 终端中识别多个域的 IP 地址信息。

可以使用以下 5 个命令来完成此操作。

* `dig` 命令：它是一个用于查询 DNS 名称服务器的灵活命令行工具。
* `host` 命令：它是用于执行 DNS 查询的简单程序。
* `nslookup` 命令：它用于查询互联网域名服务器。
* `fping` 命令：它用于向网络主机发送 ICMP ECHO\_REQUEST 数据包。
* `ping` 命令：它用于向网络主机发送 ICMP ECHO\_REQUEST 数据包。

为了测试，我们创建了一个名为 `domains-list.txt` 的文件，并添加了以下域。

```
# vi /opt/scripts/domains-list.txt

2daygeek.com
magesh.co.in
linuxtechnews.com
```

### 方法 1：如何使用 dig 命令查找域的 IP 地址

[dig 命令](https://www.2daygeek.com/dig-command-check-find-dns-records-lookup-linux/)代表 “<ruby> 域名信息抓手 <rt>  Domain Information Groper </rt></ruby>”，它是一个功能强大且灵活的命令行工具，用于查询 DNS 名称服务器。

它执行 DNS 查询，并显示来自查询的名称服务器的返回信息。大多数 DNS 管理员使用 `dig` 命令来解决 DNS 问题，因为它灵活、易用且输出清晰。

它还有批处理模式，可以从文件读取搜索请求。

```
# dig 2daygeek.com | awk '{print $1,$5}'

2daygeek.com. 104.27.157.177
2daygeek.com. 104.27.156.177
```

使用以下 bash 脚本查找多个域的 IP 地址。

```
# vi /opt/scripts/dig-command.sh

#!/bin/bash
for server in `cat /opt/scripts/domains-list.txt`
do echo $server "-"
dig $server +short
done | paste -d " " - - -
```

添加以上内容到脚本后，给 `dig-command.sh` 文件设置可执行权限。

```
# chmod +x /opt/scripts/dig-command.sh
```

最后运行 bash 脚本获得输出。

```
# sh /opt/scripts/dig-command.sh

2daygeek.com - 104.27.156.177 104.27.157.177
magesh.co.in - 104.18.35.52 104.18.34.52
linuxtechnews.com - 104.27.144.3 104.27.145.3
```

如果要在一行中运行上面的脚本，请使用以下脚本。

```
# for server in 2daygeek.com magesh.co.in linuxtechnews.com; do echo $server "-"; dig $server +short; done | paste -d " " - - -
```

或者，你可以使用以下 Shell 脚本查找多个域的 IP 地址。

```
# for server in 2daygeek.com magesh.co.in linuxtechnews.com; do dig $server | awk '{print $1,$5}'; done

2daygeek.com. 104.27.157.177
2daygeek.com. 104.27.156.177
magesh.co.in. 104.18.34.52
magesh.co.in. 104.18.35.52
linuxtechnews.com. 104.27.144.3
linuxtechnews.com. 104.27.145.3
```

### 方法 2：如何使用 host 命令查找域的 IP 地址

[host 命令](https://www.2daygeek.com/linux-host-command-check-find-dns-records-lookup/)是一个简单的命令行程序，用于执行 [DNS 查询](https://www.2daygeek.com/category/dns-lookup/)。它通常用于将名称转换为 IP 地址，反之亦然。如果未提供任何参数或选项，`host` 将打印它的命令行参数和选项摘要。

你可以在 `host` 命令中添加特定选项或记录类型来查看域中的所有记录类型。

```
# host 2daygeek.com | grep "has address" | sed 's/has address/-/g'

2daygeek.com - 104.27.157.177
2daygeek.com - 104.27.156.177
```

使用以下 bash 脚本查找多个域的 IP 地址。

```
# vi /opt/scripts/host-command.sh

for server in `cat /opt/scripts/domains-list.txt`
do host $server | grep "has address" | sed 's/has address/-/g'
done
```

添加以上内容到脚本后，给 `host-command.sh` 文件设置可执行权限。

```
# chmod +x /opt/scripts/host-command.sh
```

最后运行 bash 脚本获得输出。

```
# sh /opt/scripts/host-command.sh

2daygeek.com - 104.27.156.177
2daygeek.com - 104.27.157.177
magesh.co.in - 104.18.35.52
magesh.co.in - 104.18.34.52
linuxtechnews.com - 104.27.144.3
linuxtechnews.com - 104.27.145.3
```

### 方法 3：如何使用 nslookup 命令查找域的 IP 地址

[nslookup 命令](https://www.2daygeek.com/nslookup-command-check-find-dns-records-lookup-linux/)是用于查询互联网[域名服务器（DNS）](https://www.2daygeek.com/check-find-dns-records-of-domain-in-linux-terminal/)的程序。

`nslookup` 有两种模式，分别是交互式和非交互式。交互模式允许用户查询名称服务器以获取有关各种主机和域的信息，或打印域中的主机列表。非交互模式用于仅打印主机或域的名称和请求的信息。

它是一个网络管理工具，可以帮助诊断和解决 DNS 相关问题。

```
# nslookup -q=A 2daygeek.com | tail -n+4 | sed -e '/^$/d' -e 's/Address://g' | grep -v 'Name|answer' | xargs -n1

104.27.157.177
104.27.156.177
```

使用以下 bash 脚本查找多个域的 IP 地址。

```
# vi /opt/scripts/nslookup-command.sh

#!/bin/bash
for server in `cat /opt/scripts/domains-list.txt`
do echo $server "-"
nslookup -q=A $server | tail -n+4 | sed -e '/^$/d' -e 's/Address://g' | grep -v 'Name|answer' | xargs -n1 done | paste -d " " - - -
```

添加以上内容到脚本后，给 `nslookup-command.sh` 文件设置可执行权限。

```
# chmod +x /opt/scripts/nslookup-command.sh
```

最后运行 bash 脚本获得输出。

```
# sh /opt/scripts/nslookup-command.sh

2daygeek.com - 104.27.156.177 104.27.157.177
magesh.co.in - 104.18.35.52 104.18.34.52
linuxtechnews.com - 104.27.144.3 104.27.145.3
```

### 方法 4：如何使用 fping 命令查找域的 IP 地址

[fping 命令](https://www.2daygeek.com/how-to-use-ping-fping-gping-in-linux/)是类似 `ping` 之类的程序，它使用互联网控制消息协议（ICMP）echo 请求来确定目标主机是否响应。

`fping` 与 `ping` 不同，因为它允许用户并行 ping 任意数量的主机。另外，它可以从文本文件输入主机。

`fping` 发送 ICMP echo 请求，并以循环方式移到下一个目标，并且不等到目标主机做出响应。

如果目标主机答复，那么将其标记为活动主机并从要检查的目标列表中删除；如果目标在特定时间限制和/或重试限制内未响应，那么将其指定为不可访问。

```
# fping -A -d 2daygeek.com magesh.co.in linuxtechnews.com

104.27.157.177 (104.27.157.177) is alive
104.18.35.52 (104.18.35.52) is alive
104.27.144.3 (104.27.144.3) is alive
```

### 方法 5：如何使用 ping 命令查找域的 IP 地址

[ping 命令](https://www.2daygeek.com/how-to-use-ping-fping-gping-in-linux/)（<ruby> 数据包互联网抓手 <rt>  Packet Internet Groper </rt></ruby>）是一个网络程序，用于测试 Internet 协议（IP）网络上主机的可用性/连接性。

通过向目标主机发送互联网控制消息协议（ICMP）Echo 请求数据包并等待 ICMP Echo 应答来验证主机的可用性。

它基于发送的数据包、接收的数据包、丢失的数据包，通常包含最小/平均/最大时间来汇总统计结果。

```
# ping -c 2 2daygeek.com | head -2 | tail -1 | awk '{print $5}' | sed 's/[(:)]//g'

104.27.157.177
```

使用以下 bash 脚本查找多个域的 IP 地址。

```
# vi /opt/scripts/ping-command.sh

#!/bin/bash
for server in `cat /opt/scripts/domains-list.txt`
do echo $server "-"
ping -c 2 $server | head -2 | tail -1 | awk '{print $5}' | sed 's/[(:)]//g'
done | paste -d " " - -
```

添加以上内容到脚本后，给 `ping-command.sh` 文件设置可执行权限。

```
# chmod +x /opt/scripts/ping-command.sh
```

最后运行 bash 脚本获得输出。

```
# sh /opt/scripts/ping-command.sh

2daygeek.com - 104.27.156.177
magesh.co.in - 104.18.35.52
linuxtechnews.com - 104.27.144.3
```

---

via: <https://www.2daygeek.com/linux-command-find-check-domain-ip-address/>

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


年末测验：阿里云交出新答案

# 年末测验：阿里云交出新答案

>
> 12 月 3 日，在 2019 阿里云广东峰会上，阿里云又“答完”了一份新试卷。
>
>
>

在 12 月 3 日举办的 2019 阿里云广东峰会上，阿里云智能总裁张建锋还表示，“全面迈入数字经济时代，数据成为社会经济发展的新生产要素，云智能是新基础设施。”

数据显示，数字经济已经成为中国经济增长的主要力量。据中国信息通信研究院，2018 年中国数字经济规模达到 31.3 万亿元，占 GDP 比重达 34.8%，对中国 GDP 的贡献率超过 67.9%。 近期，数据首次增列为生产要素，反映了随着经济活动数字化转型加快，数据对提高生产效率的乘数作用凸现，成为最具时代特征新生产要素的重要变化。未来，随着新型基础设施的普及，每一个城市、每一个工厂、每一条道路、每一个下水道都将实现数据化、智能化。


Nvidia 悄悄推出更快、更低功耗的 Tesla GPU 加速器

# Nvidia 悄悄推出更快、更低功耗的 Tesla GPU 加速器

>
> Nvidia 升级了其 Volta 系列的 Tesla GPU 加速卡，使其能够以旧型号的相同功率更快地工作。
>
>
>

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

Nvidia 上周举行了 Supercomputing 19 大会，不出意外的是公布了很多新闻，这些我们将稍后提到。但被忽略的一条或许是其中最有趣的：一张更快、功耗更低的新一代图形加速卡。

多名与会者与多个新闻站点发现了这点，Nvidia 向我证实这确实是一张新卡。Nvidia 的 “Volta” 这代 Tesla GPU 加速卡在 2017 年就已淘汰，因此升级工作应该早已过期。

V100S 目前仅提供 PCI Express 3 接口，但有望最终支持 Nvidia 的 SXM2 接口。SXM 是 Nvidia 的双插槽卡设计，与 PCIe 卡不同，它不需要连接电源。SXM2 允许 GPU 通过 Nvidia 的 NVLink（一种高带宽、节能的互连）相互之间或与 CPU 进行通信，其数据传输速度比 PCIe 快十倍。

借助此卡，Nvidia 声称拥有单精度 16.4 TFLOPS，双精度 8.2 TFLOPS 并且 Tensor Core 性能高达 130 TFLOPS。这仅比 V100 SXM2 设计提高了 4％ 至 5％，但比 PCIe V100 变体提高了 16％ 至 17％。

内存容量保持在 32 GB，但 Nvidia 添加了 High Bandwidth Memory 2（HBM2），以将内存性能提高到 1,134 GB/s，这比 PCIe 和 SXM2 都提高了 26％。

通常情况下，性能提升将同时导致功率增加，但在这里，PCIe 卡的总体功率为 250 瓦，与上一代 PCIe 卡相同。因此，在相同功耗下，该卡可额外提供 16-17％ 的计算性能，并增加 26％ 的内存带宽。

### 其他新闻

Nvidia 在会上还发布了其他新闻：

* 其 GPU 加速的基于 Arm 的高性能计算参考服务器的新参考设计和生态系统支持。该公司表示，它得到了 HPE/Cray、Marvell、富士通和 Ampere 的支持，Ampere 是 Intel 前高管勒尼·詹姆斯（Renee James）领导的一家初创公司，它希望建立基于 Arm 的服务器处理器。
* 这些公司将使用 Nvidia 的参考设计（包括硬件和软件组件）来使用 GPU 构建从超大规模云提供商到高性能存储和百亿亿次超级计算等。该设计还带来了 CUDA-X，这是 Nvidia 用于 Arm 处理器的 CUDA GPU 的特殊版本开发语言。
* 推出 Nvidia Magnum IO 套件，旨在帮助数据科学家和 AI 以及高性能计算研究人员在几分钟而不是几小时内处理大量数据。它经过优化，消除了存储和 I/O 瓶颈，可为多服务器、多 GPU 计算节点提供高达 20 倍的数据处理速度。
* Nvidia 和 DDN （AI 以及多云数据管理开发商）宣布将 DDN 的 A3ITM 数据管理系统与 Nvidia 的 DGX SuperPOD 系统捆绑在一起，以便客户能够以最小的复杂性和更短的时限部署 HPC 基础架构。SuperPOD 还带有新的 NVIDIA Magnum IO 软件栈。
* DDN 表示，SuperPOD 能够在数小时内部署，并且单个设备可扩展至 80 个节点。不同的深度学习模型的基准测试表明，DDN 系统可以使 DGXSuperPOD 系统完全保持数据饱和。

---

via: <https://www.networkworld.com/article/3482097/nvidia-quietly-unveils-faster-lower-power-tesla-gpu-accelerator.html>

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


23 款开源的声音、视觉生产工具

# 23 款开源的声音、视觉生产工具

>
> 无论你是要进行音频、图形、视频、动画还是它们的任意组合，都有一个开源工具可以帮助你产生专业水平的结果。
>
>
>

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

“开源”在云基础设施、网站托管、嵌入式设备和其他领域已经建立的相当完善。很少数人知道开源在生产专业级的声音视觉素材上也是一个不错的选择。

作为一名产品经理（有时候也是市场支持），我为终端用户提供很多内容：文档、文章、视频教学，甚至是展台物料、白皮书、采访等等。我找到了很多可以帮我制作音频、视频、排版、截屏的开源软件。人们选择开源软件而不是专有软件的[原因](https://opensource.com/resources/what-open-source)有很多，而我也为以下人群编制了一份开源音视频工具清单：

* 想要入坑 GNU/Linux，但需要在原来的操作系统上慢慢从使用跨平台软件开始
* 热爱开源，但对音视频开源软件所知甚少，不知道该如何选择
* 想要为创造力充电而探索新的工具，并且不想使用其他人使用过的方法工具
* 存在某些其他的原因使用开源音视频解决方案（如果是你，不妨在评论里分享一下）

幸运的是，存在着很多开源的音视频创作软件，也存在着很多硬件来支持这些应用。本文清单里的所有软件都符合以下标准：

* 跨平台
* 开源（软件和驱动）
* 稳定
* 积极维护
* 良好的文档与技术支持

我将清单中的解决方案划分为图形、音频、视频和动画。注意，本文中提到的应用程序并不完全等同于一些有名的私有软件，它们需要花时间来学习，并且可能需要改变你的工作流程，但是学习新的工具能够让体验全新的创造方式。

### 图形

我制作过很多出版和网站使用的图形，包括徽标、横幅、视频节目、草图。这里是一些我用过的开源应用，也包括一同使用的硬件。

#### 软件

**1、[Inkscape](https://inkscape.org/)**（矢量图）

Inkscape 是一款不错的矢量图编辑器，用来制作 RGB 颜色空间下的 SVG 和 PDF 文件。（它可以制作 CMYK 图像，但不是主要用途）它是为 web 应用制作 SVG 格式的地图和图表的人的救命稻草。你不仅可以使用集成的 XML 编辑器打开文件，也可以用它查看对象的所有参数。但有一个缺点：它在 Mac 上的优化不是很好。有很多样例，可以看[Inkscape 画廊](https://inkscape.org/en/gallery/)。

**2、[GIMP](https://www.gimp.org/)**（图片编辑器）

GIMP 是我最喜欢的图片编辑程序，它包括了色彩调整、裁剪和拉伸，并且（尤其是）对于网页使用的文件大小进行了优化（很多使用 Photoshop 的同事让我帮他们做这最后一步）。你也可以从头制作并绘制一张图片，但 GIMP 并不是我最喜欢用来做这件事的工具。在 [GIMP Artists on DevianArt](https://gimp-artists.deviantart.com/gallery/) 上查看众多的样例。

**3、[Krita](https://krita.org/)**（数字绘画）

当你桌子上摆着一个漂亮的 Wacom 数位板，你肯定想试试真正的数字绘画应用。Krita 就是你创作漂亮插画所需要的工具。在 [Krita 画廊](https://krita.org/en/features/gallery/) 里看看我说的东西吧。

**4、[Scribus](https://www.scribus.net/)**（桌面印刷系统）

你可以使用 Scribus 来创建一个完整的文档，或者只是把用 Inkscape 或 Libre Office 制作的 PDF 从 RGB 转换到 CMYK。有一个功能我非常喜欢：你可以试着模拟视觉障碍人士使用 Scribus 时的体验。当我发送 PDF 文件给商业印刷公司时全指望 Scribus。尽管出版社可能使用像 InDesign 这样的私有软件创建文档，但如果你用 Scribus 正确的完成一份文档，那么打印时就不会出现任何问题。免费建议：第一次发送文件给印刷公司时，不要告诉印刷公司创建该文档所使用的软件。你可以在 [Scribus 教程](https://www.scribus.net/category/made-with-scribus/)中寻找创建文档的例子。

**5、[RawTherapee](http://rawtherapee.com/)**（RAW 图像开发工具）

RawTherapee 是我所知道唯一跨平台可替代 Lightroom 的软件。你可以将相机调整到 RAW 模式，然后使用 RawTherapee 来修图。它提供了非常强大的引擎和对图片没有破坏的编辑器。例如，可以见 [Raw Therapee 截图](http://rawtherapee.com/blog/screenshots)。

**6、[LibreOffice Draw](https://www.libreoffice.org/discover/draw/)**（桌面印刷系统）

尽管你可能认为 LibraOffice Draw 不是一款专业的桌面印刷解决方案，但它仍然能够在很多情况下帮助你。例如，制作其他人（尽管是那些不懂图形软件的人）以后可以修改的白皮书、图表或海报。它不仅方便使用，而且当创建有趣的文档时也是 Impress 或 PowerPoint 的绝佳替代软件。

#### 图形硬件

**绘图板**

[Wacom](http://www.wacom.com/en-us) 数位板（和兼容设备）通常支持所有的操作系统。

**颜色校正**

颜色校正产品通常可用于所有操作系统，也包括了 GNU/Linux。Datacolor 生产的 [Spyder](http://www.datacolor.com/photography-design/product-overview/#workflow_2) 在所有平台上都有应用程序的支持。

**扫描仪和打印机**

图形艺术家需要输出（无论是打印还是电子版）的颜色是精确的。但是真正跨平台的设备，以及所有平台都易于安装的驱动，并不像你想的那样普遍。你的最佳选择是兼容 TWAIN 的扫描仪和兼容 Postscript 的打印机。以我的经验，Epson 和 Xerox 的专业级扫描仪和打印机更不容易出现驱动问题，并且它们通常也是开箱即用，拥有漂亮精确的颜色。

### 音频

有许多可供音乐家、视频制作者、游戏制作者、音乐出版商等等人群选择的开源音频软件。这里有一些我曾经用来进行内容创作与声音录制时所使用的软件。

#### 软件

**7、**[**Ardour**](https://www.ardour.org/)（数字音频录制）

对录音与编辑来说，最专业级的工具选择当然是唾手可得的 Ardour。听起来很棒，它的混音部分非常的完整灵活，能够提供给你喜欢的插件，并且易于回放、编辑、对比修改。我经常用它进行声音录制和视频混音。要找出一些使用 Ardour 录制好的音乐并不容易，因为音乐家们很少表明他们使用的软件。然而，你可以查看它的[截图](http://ardour.org/features.html)和一些特性来了解它的功能。

（如果你在寻求一种声音制作方面的“模拟体验”，你可以试试 [Harrison Mixbus](http://harrisonconsoles.com/site/mixbus.html)，它并不是一个开源项目，但是高度基于 Ardour，拥有模拟显示的终端。我非常喜欢用它进行工作，我的客户也喜欢用它制作的声音。Mixbus 也是跨平台的）

**8、[Audacity](http://www.audacityteam.org/)** （声音编辑）

Audacity 属于“瑞士军刀”级的声音制作软件。它并不完美，但你几乎可以用它做所有的事情。加上非常易于使用，任何人都能在几分钟之内上手。像 Ardour 一样，很难找到一份归功于 Audacity 的作品，但你可以从这些[截图](http://www.audacityteam.org/about/screenshots/)中了解如何使用它。

**9、[LMMS](https://lmms.io/)** （音乐制作）

LMMS，设计作为 FL Studio 的替代品，也许使用并不那么广泛，但它非常完整并易于使用。你可以使用自己最喜欢的插件，使用“钢琴键”编辑乐器，使用<ruby> 步定序器 <rt>  step sequencer </rt></ruby>播放鼓点，混合音轨…几乎能做任何事情。在我没有时间为音乐家录音的时候我就使用它为视频创建声音片段。查看[最好的 LMMS](https://lmms.io/showcase/) 榜单来看看一些例子。

**10、[Mixxx](https://www.mixxx.org/)** （DJ，音乐混音）

如果你需要强大的混音和播放 DJ 软件，Mixxx 就可以满足你的需求。它与大多数 MIDI 控制器、唱片、专用声卡所兼容。你可以用它管理音乐库、添加音效，做一些有趣的事情。查看它的[功能](https://www.mixxx.org/features/)来了解它是如何工作的。

#### 音频接口硬件

尽管你可以使用任何一个计算机的声卡录制音频，但要录制的很好，就需要一个音频接口——一个录制高质量音频输入的专用的外部声卡。对于跨平台兼容性来说，大多数“兼容 USB”和“兼容 iOS”的音频接口设备应该都能录制 MIDI 或其他音频。下面是一些我用过的一些有名气的跨平台设备。

**[Behringer U-PHORIA UMC22](http://www.musictri.be/Categories/Behringer/Computer-Audio/Interfaces/UMC22/p/P0AUX)**

UMC22 是你可以考虑的最便宜的选择。但它的前置放大器噪音太大，<ruby> 音腔 <rt>  box </rt></ruby>质量也比较低。

**[Presonus AudioBox USB](https://www.presonus.com/products/audiobox-usb)**

AudioBox USB 是第一个兼容 USB（因此也跨平台）的录音系统。它非常的耐用，经常在二手市场也能见到。

**[Focusrite Scarlett](https://us.focusrite.com/scarlett-range)**

Scarlett 在我看来是目前最高质量的跨平台声卡。不同种类的设备可以涵盖 2-18 个输入/输出端口。你可以在二手市场找到它的最初版本，而最新的第二代具有更好的前置放大器与规格。[2i2](https://us.focusrite.com/usb-audio-interfaces/scarlett-2i2) 型号是我经常使用的那一款。

**[Arturia AudioFuse](https://www.arturia.com/products/audio/audiofuse/overview)**

AudioFuse 几乎可以让你接入任何设备，从麦克风到黑胶唱片机再到各种数字输入设备。它具有优质的声音与良好的设计，也是我目前用的最多的一款设备。它是跨平台的，但目前配置软件还不能在 GUN/Linux 上使用。即使我把它从 Windows 电脑上断开，它仍然保留着我的配置。但是讲真，Arturia，劳烦认真考虑做一个 Linux 的软件。

#### MIDI 控制器

MIDI 控制器是一种乐器——例如电子琴、鼓垫等等。可以让你控制音乐软件或者硬件。现有的大多数 USB MIDI 控制器都跨平台并兼容主流的录音编辑软件。基于网页的教程可以帮你对不同的软件进行配置。尽管找到有关在 GNU/Linux 上配置的信息可能比较困难，但它们仍然是可以使用的。我用过许多 Akai 和 M-Audio 设备，没有任何问题。在买乐器之前最好先试一下，至少去听一下它们的音质或体验一下按键触感。

#### 音频编解码器

音频编解码器压缩或解压数字音频，用尽可能小的文件大小获得最佳质量的声音。幸运的是，用于收听或流媒体播放的编解码器恰好是开源的：[FLAC](https://en.wikipedia.org/wiki/FLAC)。[Ogg Vorbis](https://xiph.org/vorbis/) 是另一个值得了解的开源音频编解码器；在相同的比特率下比 MP3 好的多。如果你需要输出不同的音频格式，我建议通常存档最好质量的音频，然后再压缩成特定的版本。

### 视频

视频对于品牌的传播是影响巨大的。即使你不是一个视频专家，学习一些基础的东西也是非常明智的。

#### 软件

**11、[VLC](https://www.videolan.org/)** （视频播放器与转换器）

最初是为流媒体而开发的，VLC 现在因能够在所有设备上读取所有的视频格式被人们熟知。它非常的实用，例如，你可以使用它将视频转换成其他编解码格式或容器，也可以用来恢复破损的视频。

**12、[OpenShot](https://www.openshot.org/)** （视频编辑）

OpenShot 是一个简单的软件，但它却可以制作出很好的效果，尤其是在短视频上。（在编辑或改善音质方面有一定的限制，但它也能够完成）我非常喜欢它的移动、拉伸、裁剪工具；用它创建视频的开头或结尾，导出之后使用更复杂的编辑器进行编辑，非常的完美。你可以在 OpenShot 的网站上看这些[例子](https://www.openshot.org/videos/)（并获取更多信息）。

**13、[Shotcut](https://shotcut.com/)** （视频编辑）

我认为 Shotcut 是比 OpenShot 更完整一些的工具——它在你的操作系统上比起其他较为基础的编辑器更具有竞争力，并且它支持 4K 分辨率，具有专业的解码器。尝试一下，我相信你会爱上它的。你可以在这些[视频教程](https://shotcut.org/tutorials/)里看一些范例。

**14、[Blender Velvets](http://blendervelvets.org/)** （视频编辑、合成、特效）

尽管这一章节不是本文的学习重点，但 Blender Velvets 是你能找到的最强大的解决方案之一。它是由一些视频创作者所制作的一系列扩展工具和脚本的合集，是通过 Blender 3D 制作软件转换成的 2D 视频编辑器。尽管它的复杂度意味着不是我的首选视频编辑器，但你仍可以在 YouTube 和其他网站上找到它的教程，并且一旦你学习了它，你就能通过它做任何事情。观看这个[视频教程](http://blendervelvets.org/video-tutorial-new-functions-for-the-blender-velvets/)来了解它的功能与运作方式。

**15、[Natron](https://natron.fr/)**（合成）

我不使用 Natron，但我听说它广受好评。它是 Adobe After Effects 的替代品，但运作方式并不同。想了解更多可以观看一些视频教程，比如这些 Natron 的 [YouTube 频道](https://www.youtube.com/playlist?list=PL2n8LbT_b5IeMwi3AIzqG4Rbg8y7d6Amk)。

**16、[OBS](https://obsproject.com/)** （实时编辑、录制、流媒体）

Open Broadcaster Software（OBS）是一个领先的在 YouTube 或 Twitch 上进行现场录制或现场直播电子竞技、电视游戏的解决方案。我经常使用它记录用户的屏幕、会议和聚会。要获取更多信息，查看我曾经在 Opensource.com 上写的关于录制现场汇报的教程，[第一部分：选择你的设备](https://opensource.com/article/17/9/equipment-recording-presentations)和[第二部分：软件安装](https://opensource.com/article/17/9/equipment-setup-live-presentations)。

#### 视频硬件

结论先行：你需要一个强大的工作站以及快速的硬盘和更新的软件和驱动。

**图形处理单元（GPU）**

一部分包含在清单里的软件比如 Blender 和 Shotcut 使用 OpenGL 和硬件加速，这些都高度依赖 GPU。我建议你使用可以负担起的最强大的 GPU。我所使用过的 AMD 和 Nvidia 都有着良好的体验，这取决于使用的平台。不要忘记安装最新的驱动。

**硬盘**

大体上来说，越快越大的硬盘，对视频越好。不要忘记在软件里配置好正确的路径。

**视频录制硬件**

* [Blackmagic Design](https://www.blackmagicdesign.com/): Blackmagic 提供了非常好的、专业级的视频录制和回放硬件。驱动支持 Mac、Windows 和 GNU/Linux（但不是所有的发行版）
* [Epiphan](https://www.epiphan.com/): 在 Epiphan 的专业级 USB 视频录制设备中有一款新型产品，它适用于 HDMI 和高分辨率的屏幕。然而，你也可以在二手市场找到旧的 VGA 设备，因为他们还在继续为 GNU/Linux 和 Windows 上提供专用的驱动程序。

#### 视频编解码

不幸的是，使用开源的编解码器仍然很困难。例如，许多相机使用专有的编解码器录制 H.264 的视频和 AC3 的音频，组成称为 AVCHD 的格式。因此，我们必须务实，尽可能利用现有资源。

好消息是内容产业正在步向开源的编解码器来避免一些费用，并使用开源标准。对于出版和流媒体，[谷歌](https://www.webmproject.org/)的 [WebM](https://www.webmproject.org/) 便是一款优秀的开源编解码器，并且大多数视频编辑器可以导入这种格式。同样地， [GoPro](https://fr.gopro.com/news/gopro-open-sources-the-cineform-codec)的超高分辨率和 360° 视频编解码器 [Cineform](https://fr.gopro.com/news/gopro-open-sources-the-cineform-codec) 现在也进行了开源。希望更多的设备和供应商将会在不久之后使用它。

### 2D 和 3D 动画

动画不是我的专业领域，因此我问了从事于动画内容生产的朋友一些建议并加入到清单中，他的工作包含儿童电影和连续剧。

#### 软件

**17、[Blender](https://www.blender.org/)** （3D 模型和渲染）

Blender 是顶级的开源跨平台 3D 建模和渲染软件。你可以直接在 Blender 中完成整个项目的工作，或者使用它为电影或视频创建 3D 效果。你能够在网上找到许多视频教程，因此即使它不是一个简单的软件，但也非常容易上手。Blender 是一个非常活跃的项目，经常还会制作一些微电影来展示他们的技术。你可以在 [Blender Open Movies](https://www.blender.org/about/projects/) 上观看。

**18、[Synfig Studio](https://www.synfig.org/)** （2D 动画）

第一次用 Synfig 时，它让我想起了那个不错的 Macromedia 老式 Flash 编辑器。在那之后，它已经发展成一个全功能的 2D 动画工作室。你可以使用它制作宣传故事、商业广告、演示、开场或结尾动画以及视频中的转场，或者甚至用它制作全动画的电影。见 [Synfig 作品集](https://www.synfig.org/#portfolio)。

**19、[TupiTube](https://maefloresta.com/)** （定格 2D 动画）

使用 TupiTube 是一个学习基本 2D 动画的极好方法。你可以将一系列绘画或其他图片转换成一个视频或者创建一个 GIF 循环动画。它是一个相当简单的软件，但非常完整。查看 [TupiTude 的 YouTube](https://www.youtube.com/channel/UCBavSfmoZDnqZalr52QZRDw) 频道获取一些教程和范例。

#### 硬件

动画制作使用与图形设计相同的硬件，因此查看第一小结中的硬件清单获取一些建议。

有一点需要注意：你要用一个强大的 GPU 来进行 3D 建模和渲染。选择可能有些限制，因为这取决于你使用的平台或电脑制造商，但是不要忘记安装最新的驱动。谨慎选择你的显卡：它们非常昂贵，并且在大型的 3D 项目中至关重要，尤其是在渲染步骤中。

### Linux 上的选择

如果你是 GUN/Linux 用户，那么我为你提供了更多不错的选择。它们并不是完全跨平台的，但部分拥有 Windows 版本，还有一些可以在 Mac 上使用 Macports 安装。

**20、[Kdenlive](https://kdenlive.org/)** （视频编辑）

伴随着最新版本的发布（几个月之前），Kdenlive 成为了我最喜欢的视频编辑器，尤其是当我在 Linux 机器上处理一些长视频的时候。如果你经常使用流行的非线性视频编辑器，Kdenlive（全称是 <ruby> KDE 非线性视频编辑器 <rt>  KDE Non-Linear Video Editor </rt></ruby>）对你来说将非常简单。它拥有很棒的视频和音频特效，强大的细节处理能力。并且在 BSD 和 MacOS（尽管它对准的是 GNU/Linux）都能使用，还有望移植到 Windows 上。

**21、[Darktable](https://www.darktable.org/)** （RAW 图像开发）

Darktable 是一款由摄影师制作的非常完整的 DxO PhotoLab 替代品。一些研究型项目使用它当做开发平台并测试一些图像处理算法。它是一个非常活跃的项目，我已经等不及的见到它的跨平台版本了。

**22、[MyPaint](http://mypaint.org/)** （digital painting数字绘画）

MyPaint 就像数字绘画领域的 light table（LCTT 译注：集成开发环境）。它在 Wacom 设备上表现良好，并且它的笔刷引擎尤其值得赞赏，因此 GIMP 开发人员正在密切的关注它。

**23、[Shutter](http://shutter-project.org/)** （桌面截图）

当我写这篇教程的时候，我使用了许多截图来进行展示。我最喜欢的 GNU/Linux 截图工具就是 Shutter。事实上，我都找不到在 Windows 或 Mac 上能与之抗衡的一些功能。有一点小遗憾：我很期待 Shutter 在将来能够增加新的功能来创建几秒动态的 GIF 截图。

我希望这些足以说服你开源软件是一种非常卓越且可行的音视频内容生产解决方案。如果你正在使用其他开源软件，或者对于使用跨平台软件和硬件进行音视频项目有好的建议，请在评论中分享你的观点。

---

via: <https://opensource.com/article/18/2/open-source-audio-visual-production-tools>

作者：[Antoine Thomas](https://opensource.com/users/ttoine) 译者：[LuuMing](https://github.com/LuuMing) 校对：[wxy](https://github.com/wxy)

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


在 Linux 上使用 Multitail

Summary: 当你想同时查看多个文件（尤其是日志文件）的活动时，multitail 命令会非常有用。它的工作方式类似于多窗口形式的 tail -f 命令。

# 在 Linux 上使用 Multitail

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

当你想同时查看多个文件（尤其是日志文件）的活动时，`multitail` 命令会非常有用。它的工作方式类似于多窗口形式的 `tail -f` 命令。也就是说，它显示这些文件的底部和添加的新行。虽然通常使用简单，但是 `multitail` 提供了一些命令行和交互式选项，在开始使用它之前，你应该了解它们。

### 基本 multitail 使用

`multitail` 的最简单用法是在命令行中列出你要查看的文件名称。此命令水平分割屏幕（即顶部和底部），并显示每个文件的底部以及更新。

```
$ multitail /var/log/syslog /var/log/dmesg
```

显示内容将像这样拆分：

```
+-----------------------+
|                       |
|                       |
+-----------------------|
|                       |
|                       |
+-----------------------+
```

每个文件都有一行显示该文件的文件编号（从 00 开始）、文件名、文件大小、最新内容的添加日期和时间。每个文件将被分配一半空间，而不论它的大小和活动情况。比如：

```
content lines from my1.log
more content
more lines

00] my1.log                                    59KB - 2019/10/14 12:12:09
content lines from my2.log
more content
more lines

01] my2.log                                   120KB - 2019/10/14 14:22:29
```

请注意，如果你要求 `multitail` 显示非文本文件或者你无权查看的文件，它不会报错。你只是看不到内容。

你还可以使用通配符指定要查看的文件：

```
$ multitail my*.log
```

要记住的一件事是，`multitail` 将平均分割屏幕。如果指定的文件太多，那么除非你采取额外的步骤查看之后的文件（参考下面的滚动选项），否则你将只会看到前面 7 个文件的前面几行。确切的结果取决于终端窗口中有多少行可用。

按 `q` 退出 `multitail` 并返回到正常的屏幕视图。

### 分割屏幕

如果你愿意，`multitail` 也可以垂直分割你的终端窗口（即，左和右）。为此，请使用 `-s` 选项。如果指定了三个文件，那么屏幕右侧的窗口将会水平分隔。四个文件的话，你将拥有四个大小相等的窗口。

```
+-----------+-----------+     +-----------+-----------+     +-----------+-----------+
|           |           |     |           |           |     |           |           |
|           |           |     |           |           |     |           |           |
|           |           |     |           +-----------+     +-----------+-----------+
|           |           |     |           |           |     |           |           |
|           |           |     |           |           |     |           |           |
+-----------+-----------+     +-----------+-----------+     +-----------+-----------+
         2 个文件                       3 个文件                       4 个文件
```

如果要将屏幕分为三列，请使用 `multitail -s 3 file1 file2 file3`。

```
+-------+-------+-------+
|       |       |       |
|       |       |       |
|       |       |       |
|       |       |       |
|       |       |       |
+-------+-------+-------+
  3 个文件带上 -s 3 选项
```

### 滚动

你可以上下滚动文件，但是需要按下 `b` 弹出选择菜单，然后使用向上和向下箭头按钮选择要滚动浏览的文件。然后按下回车键。然后，你可以再次使用向上和向下箭头在放大的区域中滚动浏览各行。完成后按下 `q` 返回正常视图。

### 获得帮助

在 `multitail` 中按下 `h` 将打开一个帮助菜单，其中描述了一些基本操作，但是手册页提供了更多信息，如果莫想了解更多有关使用此工具的信息，请仔细阅读。

默认情况下，你的系统上不会安装 `multitail`，但是使用 `apt-get` 或 `yum` 可以使你轻松安装。该工具提供了许多功能，不过它是基于字符显示的，窗口边框只是 `q` 和 `x` 的字符串组成的。当你需要关注文件更新时，它非常方便。

---

via: <https://www.networkworld.com/article/3445228/using-multitail-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/) 荣誉推出


多语言编程必备的十大 Vim 插件

Summary: 使用这 10 个 Vim 插件，可以让你在写代码或运维时，感觉更棒。

使用这 10 个 Vim 插件，可以让你在写代码或运维时，感觉更棒。

# 多语言编程必备的十大 Vim 插件

>
> 使用这 10 个 Vim 插件，可以让你在写代码或运维时，感觉更棒。
>
>
>

我使用 [Vim](https://www.vim.org/) 文本编辑器大约 20 年了。有一段时间，我一直在定制我的 Vim 配置，但在只有在最近两年我才会使用插件。

最近，当我重新安装系统时（就像我经常做的那样），我觉得这是一次好的机会，我想找出多种编程语言环境下的最佳 Vim 插件，以及如何将这些插件和每种语言结合起来。

有时，我会为特定的语言和配置使用特定的插件（例如，我只在 Ansible 配置中安装 Rocannon），在此不细讲了。不过下面介绍的 10 个 Vim 插件都是我的最爱，无论使用哪种编程语言，我几乎都会使用它们。

### 1、Volt

我的首选并不是一个插件，但是它可以替换类似于 [Vundle](https://github.com/VundleVim/Vundle.vim) 的插件，所以在此介绍。

[Volt](https://github.com/vim-volt/volt) 是一个不依存于 Vim 的 Vim 插件管理器。你可以用它安装插件，并创建名为“profile”的插件组合。你可以使用一个简单的命令 `volt profile set myprofile` 启用新的配置。这样我可以做到这样的事情，如为 Python 配置单独启用 [indentpython](https://github.com/vim-scripts/indentpython.vim) 插件。Volt 还提供了一种针对每个插件配置的简单方法，这些配置会在“profile”之间共享，因此只需要安装一次插件，就可以在多个“profile”之间使用。

Volt 还是相对较新且不够完美（比如，不管你想要使用多少个“profile”，每个插件只能有一个配置文件），但除此之外，我发现它非常方便、快速和简单。

### 2、Vim-Rainbow

除了 Python，几乎所有的主流编程语言都使用括号（小括号、方括号和大括号）。通常，它们会嵌套使用多对括号，因此很难搞清楚某个括号的开闭区间。我发现自己经常要数小括号，尤其是在复杂的 Bash 脚本中，以确保无误。

这时候就需要 [vim-rainbow](http://github.com/frazrepo/vim-rainbow) 插件！它为每对括号设置不同的颜色，因此很容易识别出哪些括号是一对括号。它非常有用而且五彩斑斓。

### 3、lightline

Vim 有很多这种插件，例如 [Powerline](https://github.com/powerline/powerline)，它会在底部栏显示你正在处理的文件、光标所在的文件位置以及文件类型等信息。这些插件各有利弊，在简单比较后，我选择了 [lightline](http://github.com/itchyny/lightline.vim)。它相对较小，便于安装和扩展，并且不依赖于其他工具或插件。

### 4、NERDTree

[NERDTree](http://github.com/scrooloose/nerdtree) 是一个很经典的插件。在大型项目中，你可能很难找到想要编辑的内容所在文件的确切名称和路径。使用快捷键（我使用的是 `F7`，因为我在 `.vimrc` 中配置了这个快捷键），搜索窗会以垂直分屏的方式打开，就可以轻松找到所需文件并打开它。对于大型项目，这是必备插件。对于那些经常忘记文件名的人也很有用，比如我。

### 5、NERD Commenter

程序员们在写代码时，有时会遇到一些难以调试的问题，导致他们想要注释或不执行某段代码。这时候就需要 [NERD Commenter](http://github.com/scrooloose/nerdcommenter) 出场了。选择代码段，按 `Leader 键 + cc`，代码就会被注释掉。（标准的 Vim Leader 键 是 `/` 字符。）按 `Leader 键 + cn`，取消注释。对于大多数文件类型，NERD Commenter 会自动使用正确的注释符。例如，如果你正在编辑 [BIND 区域文件](https://en.wikipedia.org/wiki/Zone_file#File_format)，并将文件类型设置为 BIND 区域文件，Vim 会正确地使用 `;`（分号）字符进行注释。

### 6、Solarized

我喜欢我的 Vim 主题配色。我也喜欢终端的主题色。我一直在 Vim 上使用 [Solarized](https://github.com/altercation/vim-colors-solarized) 配色，并且将我的终端、文件夹配色和 Vim 设为一致。

但是，有时我会根据周边环境、屏幕亮度以及是否需要分享投屏，来切换明暗模式。

显然，你可以选择自己喜欢的任何配色方案，但我喜欢 `Solarized`，因为它有明暗模式功能，它可以简单快捷地切换两种模式。我的第二个选择是 [Monokai](https://github.com/sickill/vim-monokai)。Volt 插件管理器让我可以轻松地在两者之间切换，因此我在 Python 编程时，使用 Monokai；Bash 编程时，使用 Solarized。

我没有给 Solarized 找相应的图片，因为本文中的所有其他图片都使用了 Solarized 中的浅色或深色效果，可以确认一下这些图片。

### 7、fzf

当寻找一个文件时，有时你想要一个文件浏览器，有时你只想在键盘上敲打出与文件名模糊匹配的内容，对吗？

[fzf](https://github.com/junegunn/fzf.vim)（全称 “模糊查找器”）插件提供了这一功能。打出 `:FZF` 并输入文件名内容。不断缩短的列表将显示出与你输入的文件名内容相匹配的一些文件。我经常使用它，最近使用它的频率估计比使用 NERDTree 还多。缺点是这个插件依赖于 `fzf binary`，因此也必须安装这个依赖包。它适用于 Fedora、Debian 和 Arch，据我所知并不在 EPEL 中。

### 8、ack

有时，你需要搜索包含特定行或特定单词的文件。我真的很喜欢使用 [ack](https://github.com/mileszs/ack.vim) 插件，最好与 `ag` 结合使用，它俩的组合又被称为 “[silver searcher](https://github.com/ggreer/the_silver_searcher)”。这一组合的速度非常快，覆盖了 `grep` 或 `vimgrep` 的绝大多数使用场景。缺点是你需要安装 `ack` 或 `ag` 才能正常运行。好消息是 Fedora 和 EPEL7 都可以使用 `ag` 和 `ack`。

### 9、gitgutter

大多数 IT 人员都使用 [Git](https://opensource.com/resources/what-is-git) 和 Git 仓库中的文件进行工作。[gitgutter](https://github.com/airblade/vim-gitgutter) 插件在行号附近添加了一列，通过符号显示该行的状态为：已更改（`~`）、已添加（`+`）或者已删除（`-`）。这有利于跟踪你所做的更改，并且可以使你专注于手头的任务，例如编写补丁来修复一个关键错误。

### 10、Tag List

如果你在一个很大的文件中编写代码，会很容易忘记当前所在的位置，你可能需要上下滚动来查找某个功能。使用 [Tag List](https://github.com/vim-scripts/taglist.vim) 插件，只需要输入 `:Tlist`，就能垂直分屏显示出包含变量、类型、类和函数的代码，你可以轻松跳转到这些变量、类型、类和函数。这个功能对于多语言同样适用，例如 Java、Python 以及任何能够使用 `ctags` 功能的文件类型。

以上介绍的 10 个 Vim 插件使我作为系统管理员和兼职程序员的生活变得更轻松。你正在使用哪些 Vim 插件？请在评论中分享你最爱的插件。

---

via: <https://opensource.com/article/19/11/vim-plugins>

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