`。 例如,要将文件 `example.txt` 移到你的 `Documents` 目录中:
+
+```
+$ touch example.txt
+$ mv example.txt ~/Documents
+$ ls ~/Documents
+example.txt
+```
+
+就像你通过将文件拖放到文件夹图标上来移动文件一样,此命令不会将 `Documents` 替换为 `example.txt`。相反,`mv` 会检测到 `Documents` 是一个文件夹,并将 `example.txt` 文件放入其中。
+
+你还可以方便地在移动文件时重命名该文件:
+
+```
+$ touch example.txt
+$ mv example.txt ~/Documents/foo.txt
+$ ls ~/Documents
+foo.txt
+```
+
+这很重要,这使你不用将文件移动到另一个位置,也可以重命名文件,例如:
+
+```
+$ touch example.txt
+$ mv example.txt foo2.txt
+$ ls foo2.txt`
+```
+
+#### 移动目录
+
+不像 [cp][8] 命令,`mv` 命令处理文件和目录没有什么不同,你可以用同样的格式移动目录或文件:
+
+```
+$ touch file.txt
+$ mkdir foo_directory
+$ mv file.txt foo_directory
+$ mv foo_directory ~/Documents
+```
+
+#### 安全地移动文件
+
+如果你移动一个文件到一个已有同名文件的地方,默认情况下,`mv` 会用你移动的文件替换目标文件。这种行为被称为清除,有时候这就是你想要的结果,而有时则不是。
+
+一些发行版将 `mv` 别名定义为 `mv --interactive`(你也可以[自己写一个][9]),这会提醒你确认是否覆盖。而另外一些发行版没有这样做,那么你可以使用 `--interactive` 或 `-i` 选项来确保当两个文件有一样的名字而发生冲突时让 `mv` 请你来确认。
+
+```
+$ mv --interactive example.txt ~/Documents
+mv: overwrite '~/Documents/example.txt'?
+```
+
+如果你不想手动干预,那么可以使用 `--no-clobber` 或 `-n`。该选项会在发生冲突时静默拒绝移动操作。在这个例子当中,一个名为 `example.txt` 的文件以及存在于 `~/Documents`,所以它不会如命令要求从当前目录移走。
+
+```
+$ mv --no-clobber example.txt ~/Documents
+$ ls
+example.txt
+```
+
+#### 带备份的移动
+
+如果你使用 GNU `mv`,有一个备份选项提供了另外一种安全移动的方式。要为任何冲突的目标文件创建备份文件,可以使用 `-b` 选项。
+
+```
+$ mv -b example.txt ~/Documents
+$ ls ~/Documents
+example.txt example.txt~
+```
+
+这个选项可以确保 `mv` 完成移动操作,但是也会保护目录位置的已有文件。
+
+另外的 GNU 备份选项是 `--backup`,它带有一个定义了备份文件如何命名的参数。
+
+* `existing`:如果在目标位置已经存在了编号备份文件,那么会创建编号备份。否则,会使用 `simple` 方式。
+* `none`:即使设置了 `--backup`,也不会创建备份。当 `mv` 被别名定义为带有备份选项时,这个选项可以覆盖这种行为。
+* `numbered`:给目标文件名附加一个编号。
+* `simple`:给目标文件附加一个 `~`,当你日常使用带有 `--ignore-backups` 选项的 [ls][2] 时,这些文件可以很方便地隐藏起来。
+
+简单来说:
+
+```
+$ mv --backup=numbered example.txt ~/Documents
+$ ls ~/Documents
+-rw-rw-r--. 1 seth users 128 Aug 1 17:23 example.txt
+-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~
+```
+
+可以使用环境变量 `VERSION_CONTROL` 设置默认的备份方案。你可以在 `~/.bashrc` 文件中设置该环境变量,也可以在命令前动态设置:
+
+```
+$ VERSION_CONTROL=numbered mv --backup example.txt ~/Documents
+$ ls ~/Documents
+-rw-rw-r--. 1 seth users 128 Aug 1 17:23 example.txt
+-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~
+-rw-rw-r--. 1 seth users 128 Aug 1 17:22 example.txt.~2~
+```
+
+`--backup` 选项仍然遵循 `--interactive` 或 `-i` 选项,因此即使它在执行备份之前创建了备份,它仍会提示你覆盖目标文件:
+
+```
+$ mv --backup=numbered example.txt ~/Documents
+mv: overwrite '~/Documents/example.txt'? y
+$ ls ~/Documents
+-rw-rw-r--. 1 seth users 128 Aug 1 17:24 example.txt
+-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~
+-rw-rw-r--. 1 seth users 128 Aug 1 17:22 example.txt.~2~
+-rw-rw-r--. 1 seth users 128 Aug 1 17:23 example.txt.~3~
+```
+
+你可以使用 `--force` 或 `-f` 选项覆盖 `-i`。
+
+```
+$ mv --backup=numbered --force example.txt ~/Documents
+$ ls ~/Documents
+-rw-rw-r--. 1 seth users 128 Aug 1 17:26 example.txt
+-rw-rw-r--. 1 seth users 128 Aug 1 17:20 example.txt.~1~
+-rw-rw-r--. 1 seth users 128 Aug 1 17:22 example.txt.~2~
+-rw-rw-r--. 1 seth users 128 Aug 1 17:24 example.txt.~3~
+-rw-rw-r--. 1 seth users 128 Aug 1 17:25 example.txt.~4~
+```
+
+`--backup` 选项在 BSD `mv` 中不可用。
+
+#### 一次性移动多个文件
+
+移动多个文件时,`mv` 会将最终目录视为目标:
+
+```
+$ mv foo bar baz ~/Documents
+$ ls ~/Documents
+foo bar baz
+```
+
+如果最后一个项目不是目录,则 `mv` 返回错误:
+
+```
+$ mv foo bar baz
+mv: target 'baz' is not a directory
+```
+
+GNU `mv` 的语法相当灵活。如果无法把目标目录作为提供给 `mv` 命令的最终参数,请使用 `--target-directory` 或 `-t` 选项:
+
+```
+$ mv --target-directory=~/Documents foo bar baz
+$ ls ~/Documents
+foo bar baz
+```
+
+当从某些其他命令的输出构造 `mv` 命令时(例如 `find` 命令、`xargs` 或 [GNU Parallel][10]),这特别有用。
+
+#### 基于修改时间移动
+
+使用 GNU `mv`,你可以根据要移动的文件是否比要替换的目标文件新来定义移动动作。该方式可以通过 `--update` 或 `-u` 选项使用,在BSD `mv` 中不可用:
+
+```
+$ ls -l ~/Documents
+-rw-rw-r--. 1 seth users 128 Aug 1 17:32 example.txt
+$ ls -l
+-rw-rw-r--. 1 seth users 128 Aug 1 17:42 example.txt
+$ mv --update example.txt ~/Documents
+$ ls -l ~/Documents
+-rw-rw-r--. 1 seth users 128 Aug 1 17:42 example.txt
+$ ls -l
+```
+
+此结果仅基于文件的修改时间,而不是两个文件的差异,因此请谨慎使用。只需使用 `touch` 命令即可愚弄 `mv`:
+
+```
+$ cat example.txt
+one
+$ cat ~/Documents/example.txt
+one
+two
+$ touch example.txt
+$ mv --update example.txt ~/Documents
+$ cat ~/Documents/example.txt
+one
+```
+
+显然,这不是最智能的更新功能,但是它提供了防止覆盖最新数据的基本保护。
+
+### 移动
+
+除了 `mv` 命令以外,还有更多的移动数据的方法,但是作为这项任务的默认程序,`mv` 是一个很好的通用选择。现在你知道了有哪些可以使用的选项,可以比以前更智能地使用 `mv` 了。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/8/moving-files-linux-depth
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/sethhttps://opensource.com/users/doni08521059
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/files_documents_paper_folder.png?itok=eIJWac15 (Files in a folder)
+[2]: https://opensource.com/article/19/7/master-ls-command
+[3]: https://opensource.com/sites/default/files/uploads/gnome-mv.jpg (Moving a file in GNOME.)
+[4]: https://opensource.com/sites/default/files/uploads/kde-mv.jpg (Moving a file in KDE.)
+[5]: https://opensource.com/article/19/7/understanding-file-paths-and-how-use-them
+[6]: https://opensource.com/article/19/7/navigating-filesystem-relative-paths
+[7]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains
+[8]: https://opensource.com/article/19/7/copying-files-linux
+[9]: https://opensource.com/article/19/7/bash-aliases
+[10]: https://opensource.com/article/18/5/gnu-parallel
diff --git a/published/20190823 How To Check Your IP Address in Ubuntu -Beginner-s Tip.md b/published/201909/20190823 How To Check Your IP Address in Ubuntu -Beginner-s Tip.md
similarity index 100%
rename from published/20190823 How To Check Your IP Address in Ubuntu -Beginner-s Tip.md
rename to published/201909/20190823 How To Check Your IP Address in Ubuntu -Beginner-s Tip.md
diff --git a/published/201909/20190823 The Linux kernel- Top 5 innovations.md b/published/201909/20190823 The Linux kernel- Top 5 innovations.md
new file mode 100644
index 0000000000..486270ccfd
--- /dev/null
+++ b/published/201909/20190823 The Linux kernel- Top 5 innovations.md
@@ -0,0 +1,104 @@
+[#]: collector: (lujun9972)
+[#]: translator: (heguangzhi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11368-1.html)
+[#]: subject: (The Linux kernel: Top 5 innovations)
+[#]: via: (https://opensource.com/article/19/8/linux-kernel-top-5-innovations)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+Linux 内核的五大创新
+======
+
+> 想知道什么是 Linux 内核上真正的(不是那种时髦的)创新吗?
+
+
+
+在科技行业,*创新*这个词几乎和*革命*一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux 内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大物。
+
+撇开营销和模式不谈,Linux 可以说是开源世界中最受欢迎的内核,它在近 30 年的生命时光当中引入了一些真正的规则改变者。
+
+### Cgroups(2.6.24)
+
+早在 2007 年,Paul Menage 和 Rohit Seth 就在内核中添加了深奥的[控制组(cgroups)][2]功能(cgroups 的当前实现是由 Tejun Heo 重写的)。这种新技术最初被用作一种方法,从本质上来说,是为了确保一组特定任务的服务质量。
+
+例如,你可以为与你的 WEB 服务相关联的所有任务创建一个控制组定义(cgroup),为例行备份创建另一个 cgroup ,再为一般操作系统需求创建另一个 cgroup。然后,你可以控制每个组的资源百分比,这样你的操作系统和 WEB 服务就可以获得大部分系统资源,而你的备份进程可以访问剩余的资源。
+
+然而,cgroups 如今变得这么著名是因其作为驱动云技术的角色:容器。事实上,cgroups 最初被命名为[进程容器][3]。当它们被 [LXC][4]、[CoreOS][5] 和 Docker 等项目采用时,这并不奇怪。
+
+就像闸门打开后一样,“容器” 一词就像成为了 Linux 的同义词一样,微服务风格的基于云的“应用”概念很快成为了规范。如今,已经很难摆脱 cgroups 了,它们是如此普遍。每一个大规模的基础设施(如果你运行 Linux 的话,可能还有你的笔记本电脑)都以一种合理的方式使用了 cgroups,这使得你的计算体验比以往任何时候都更加易于管理和灵活。
+
+例如,你可能已经在电脑上安装了 [Flathub][6] 或 [Flatpak][7],或者你已经在工作中使用 [Kubernetes][8] 和/或 [OpenShift][9]。不管怎样,如果“容器”这个术语对你来说仍然模糊不清,则可以 [通过 Linux 容器从背后][10]获得对容器的实际理解。
+
+### LKMM(4.17)
+
+2018 年,Jade Alglave、Alan Stern、Andrea Parri、Luc Maranget、Paul McKenney 以及其他几个人的辛勤工作的成果被合并到主线 Linux 内核中,以提供正式的内存模型。Linux 内核内存[一致性]模型(LKMM)子系统是一套描述 Linux 内存一致性模型的工具,同时也产生用于测试的用例(特别命名为 klitmus)。
+
+随着系统在物理设计上变得越来越复杂(增加了更多的中央处理器内核,高速缓存和内存增长,等等),它们就越难知道哪个中央处理器需要哪个地址空间,以及何时需要。例如,如果 CPU0 需要将数据写入内存中的共享变量,并且 CPU1 需要读取该值,那么 CPU0 必须在 CPU1 尝试读取之前写入。类似地,如果值是以一种顺序方式写入内存的,那么期望它们也以同样的顺序被读取,而不管哪个或哪些 CPU 正在读取。
+
+即使在单个处理器上,内存管理也需要特定的任务顺序。像 `x = y` 这样的简单操作需要处理器从内存中加载 `y` 的值,然后将该值存储在 `x` 中。在处理器从内存中读取值之前,是不能将存储在 `y` 中的值放入 `x` 变量的。此外还有地址依赖:`x[n] = 6` 要求在处理器能够存储值 `6` 之前加载 `n`。
+
+LKMM 可以帮助识别和跟踪代码中的这些内存模式。它部分是通过一个名为 `herd` 的工具来实现的,该工具(以逻辑公式的形式)定义了内存模型施加的约束,然后列举了与这些约束一致性的所有可能的结果。
+
+### 低延迟补丁(2.6.38)
+
+很久以前,在 2011 年之前,如果你想[在 Linux 上进行多媒体工作][11],你必须得有一个低延迟内核。这主要适用于[录音][12]时添加了许多实时效果(如对着麦克风唱歌和添加混音,以及在耳机中无延迟地听到你的声音)。有些发行版,如 [Ubuntu Studio][13],可靠地提供了这样一个内核,所以实际上这没有什么障碍,这只不过是当艺术家选择发行版时的一个重要提醒。
+
+然而,如果你没有使用 Ubuntu Studio,或者你需要在你的发行版提供之前更新你的内核,你必须跳转到 rt-patches 网页,下载内核补丁,将它们应用到你的内核源代码,编译,然后手动安装。
+
+后来,随着内核版本 2.6.38 的发布,这个过程结束了。Linux 内核突然像变魔术一样默认内置了低延迟代码(根据基准测试,延迟至少降低了 10 倍)。不再需要下载补丁,不用编译。一切都很顺利,这都是因为 Mike Galbraith 编写了一个 200 行的小补丁。
+
+对于全世界的开源多媒体艺术家来说,这是一个规则改变者。从 2011 年开始事情变得如此美好,到 2016 年我自己做了一个挑战,[在树莓派 v1(型号 B)上建造一个数字音频工作站(DAW)][14],结果发现它运行得出奇地好。
+
+### RCU(2.5)
+
+RCU,即读-拷贝-更新,是计算机科学中定义的一个系统,它允许多个处理器线程从共享内存中读取数据。它通过延迟更新但也将它们标记为已更新来做到这一点,以确保数据读取为最新内容。实际上,这意味着读取与更新同时发生。
+
+典型的 RCU 循环有点像这样:
+
+1. 删除指向数据的指针,以防止其他读操作引用它。
+2. 等待读操作完成它们的关键处理。
+3. 回收内存空间。
+
+将更新阶段划分为删除和回收阶段意味着更新程序会立即执行删除,同时推迟回收直到所有活动读取完成(通过阻止它们或注册一个回调以便在完成时调用)。
+
+虽然 RCU 的概念不是为 Linux 内核发明的,但它在 Linux 中的实现是该技术的一个定义性的例子。
+
+### 合作(0.01)
+
+对于 Linux 内核创新的问题的最终答案永远是协作。你可以说这是一个好时机,也可以称之为技术优势,称之为黑客能力,或者仅仅称之为开源,但 Linux 内核及其支持的许多项目是协作与合作的光辉范例。
+
+它远远超出了内核范畴。各行各业的人都对开源做出了贡献,可以说都是因为 Linux 内核。Linux 曾经是,现在仍然是[自由软件][15]的主要力量,激励人们把他们的代码、艺术、想法或者仅仅是他们自己带到一个全球化的、有生产力的、多样化的人类社区中。
+
+### 你最喜欢的创新是什么?
+
+这个列表偏向于我自己的兴趣:容器、非统一内存访问(NUMA)和多媒体。无疑,列表中肯定缺少你最喜欢的内核创新。在评论中告诉我。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/8/linux-kernel-top-5-innovations
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[heguangzhi](https://github.com/heguangzhi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_penguin_green.png?itok=ENdVzW22 (Penguin with green background)
+[2]: https://en.wikipedia.org/wiki/Cgroups
+[3]: https://lkml.org/lkml/2006/10/20/251
+[4]: https://linuxcontainers.org
+[5]: https://coreos.com/
+[6]: http://flathub.org
+[7]: http://flatpak.org
+[8]: http://kubernetes.io
+[9]: https://www.redhat.com/sysadmin/learn-openshift-minishift
+[10]: https://opensource.com/article/18/11/behind-scenes-linux-containers
+[11]: http://slackermedia.info
+[12]: https://opensource.com/article/17/6/qtractor-audio
+[13]: http://ubuntustudio.org
+[14]: https://opensource.com/life/16/3/make-music-raspberry-pi-milkytracker
+[15]: http://fsf.org
diff --git a/published/20190825 Top 5 IoT networking security mistakes.md b/published/201909/20190825 Top 5 IoT networking security mistakes.md
similarity index 100%
rename from published/20190825 Top 5 IoT networking security mistakes.md
rename to published/201909/20190825 Top 5 IoT networking security mistakes.md
diff --git a/published/20190826 5 ops tasks to do with Ansible.md b/published/201909/20190826 5 ops tasks to do with Ansible.md
similarity index 100%
rename from published/20190826 5 ops tasks to do with Ansible.md
rename to published/201909/20190826 5 ops tasks to do with Ansible.md
diff --git a/published/20190826 How to rename a group of files on Linux.md b/published/201909/20190826 How to rename a group of files on Linux.md
similarity index 100%
rename from published/20190826 How to rename a group of files on Linux.md
rename to published/201909/20190826 How to rename a group of files on Linux.md
diff --git a/published/201909/20190828 Managing Ansible environments on MacOS with Conda.md b/published/201909/20190828 Managing Ansible environments on MacOS with Conda.md
new file mode 100644
index 0000000000..24e8d65fa0
--- /dev/null
+++ b/published/201909/20190828 Managing Ansible environments on MacOS with Conda.md
@@ -0,0 +1,168 @@
+[#]: collector: (lujun9972)
+[#]: translator: (heguangzhi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11356-1.html)
+[#]: subject: (Managing Ansible environments on MacOS with Conda)
+[#]: via: (https://opensource.com/article/19/8/using-conda-ansible-administration-macos)
+[#]: author: (James Farrell https://opensource.com/users/jamesf)
+
+
+使用 Conda 管理 MacOS 上的 Ansible 环境
+=====
+
+> Conda 将 Ansible 所需的一切都收集到虚拟环境中并将其与其他项目分开。
+
+
+
+如果你是一名使用 MacOS 并涉及到 Ansible 管理的 Python 开发人员,你可能希望使用 Conda 包管理器将 Ansible 的工作内容与核心操作系统和其他本地项目分开。
+
+Ansible 基于 Python。要让 Ansible 在 MacOS 上工作,Conda 并不是必须要的,但是它确实让你管理 Python 版本和包依赖变得更加容易。这允许你在 MacOS 上使用升级的 Python 版本,并在你的系统中、Ansible 和其他编程项目之间保持 Python 包的依赖性相互独立。
+
+在 MacOS 上安装 Ansible 还有其他方法。你可以使用 [Homebrew][2],但是如果你对 Python 开发(或 Ansible 开发)感兴趣,你可能会发现在一个独立 Python 虚拟环境中管理 Ansible 可以减少一些混乱。我觉得这更简单;与其试图将 Python 版本和依赖项加载到系统或 `/usr/local` 目录中 ,还不如使用 Conda 帮助我将 Ansible 所需的一切都收集到一个虚拟环境中,并将其与其他项目完全分开。
+
+本文着重于使用 Conda 作为 Python 项目来管理 Ansible,以保持它的干净并与其他项目分开。请继续阅读,并了解如何安装 Conda、创建新的虚拟环境、安装 Ansible 并对其进行测试。
+
+### 序幕
+
+最近,我想学习 [Ansible][3],所以我需要找到安装它的最佳方法。
+
+我通常对在我的日常工作站上安装东西很谨慎。我尤其不喜欢对供应商的默认操作系统安装应用手动更新(这是我多年作为 Unix 系统管理的习惯)。我真的很想使用 Python 3.7,但是 MacOS 的 Python 包是旧的 2.7,我不会安装任何可能干扰核心 MacOS 系统的全局 Python 包。
+
+所以,我使用本地 Ubuntu 18.04 虚拟机上开始了我的 Ansible 工作。这提供了真正意义上的的安全隔离,但我很快发现管理它是非常乏味的。所以我着手研究如何在本机 MacOS 上获得一个灵活但独立的 Ansible 系统。
+
+由于 Ansible 基于 Python,Conda 似乎是理想的解决方案。
+
+### 安装 Conda
+
+Conda 是一个开源软件,它提供方便的包和环境管理功能。它可以帮助你管理多个版本的 Python、安装软件包依赖关系、执行升级和维护项目隔离。如果你手动管理 Python 虚拟环境,Conda 将有助于简化和管理你的工作。浏览 [Conda 文档][4]可以了解更多细节。
+
+我选择了 [Miniconda][5] Python 3.7 安装在我的工作站中,因为我想要最新的 Python 版本。无论选择哪个版本,你都可以使用其他版本的 Python 安装新的虚拟环境。
+
+要安装 Conda,请下载 PKG 格式的文件,进行通常的双击,并选择 “Install for me only” 选项。安装在我的系统上占用了大约 158 兆的空间。
+
+安装完成后,调出一个终端来查看你有什么了。你应该看到:
+
+ * 在你的家目录中的 `miniconda3` 目录
+ * shell 提示符被修改为 `(base)`
+ * `.bash_profile` 文件更新了一些 Conda 特有的设置内容
+
+现在基础已经安装好了,你有了第一个 Python 虚拟环境。运行 Python 版本检查可以证明这一点,你的 `PATH` 将指向新的位置:
+
+```
+(base) $ which python
+/Users/jfarrell/miniconda3/bin/python
+(base) $ python --version
+Python 3.7.1
+```
+
+现在安装了 Conda,下一步是建立一个虚拟环境,然后安装 Ansible 并运行。
+
+### 为 Ansible 创建虚拟环境
+
+我想将 Ansible 与我的其他 Python 项目分开,所以我创建了一个新的虚拟环境并切换到它:
+
+```
+(base) $ conda create --name ansible-env --clone base
+(base) $ conda activate ansible-env
+(ansible-env) $ conda env list
+```
+
+第一个命令将 Conda 库克隆到一个名为 `ansible-env` 的新虚拟环境中。克隆引入了 Python 3.7 版本和一系列默认的 Python 模块,你可以根据需要添加、删除或升级这些模块。
+
+第二个命令将 shell 上下文更改为这个新的环境。它为 Python 及其包含的模块设置了正确的路径。请注意,在 `conda activate ansible-env` 命令后,你的 shell 提示符会发生变化。
+
+第三个命令不是必须的;它列出了安装了哪些 Python 模块及其版本和其他数据。
+
+你可以随时使用 Conda 的 `activate` 命令切换到另一个虚拟环境。这将带你回到基本环境:`conda base`。
+
+### 安装 Ansible
+
+安装 Ansible 有多种方法,但是使用 Conda 可以将 Ansible 版本和所有需要的依赖项打包在一个地方。Conda 提供了灵活性,既可以将所有内容分开,又可以根据需要添加其他新环境(我将在后面演示)。
+
+要安装 Ansible 的相对较新版本,请使用:
+
+```
+(base) $ conda activate ansible-env
+(ansible-env) $ conda install -c conda-forge ansible
+```
+
+由于 Ansible 不是 Conda 默认通道的一部分,因此 `-c` 用于从备用通道搜索和安装。Ansible 现已安装到 `ansible-env` 虚拟环境中,可以使用了。
+
+### 使用 Ansible
+
+既然你已经安装了 Conda 虚拟环境,就可以使用它了。首先,确保要控制的节点已将工作站的 SSH 密钥安装到正确的用户帐户。
+
+调出一个新的 shell 并运行一些基本的 Ansible 命令:
+
+```
+(base) $ conda activate ansible-env
+(ansible-env) $ ansible --version
+ansible 2.8.1
+ config file = None
+ configured module search path = ['/Users/jfarrell/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
+ ansible python module location = /Users/jfarrell/miniconda3/envs/ansibleTest/lib/python3.7/site-packages/ansible
+ executable location = /Users/jfarrell/miniconda3/envs/ansibleTest/bin/ansible
+ python version = 3.7.1 (default, Dec 14 2018, 13:28:58) [Clang 4.0.1 (tags/RELEASE_401/final)]
+(ansible-env) $ ansible all -m ping -u ansible
+192.168.99.200 | SUCCESS => {
+ "ansible_facts": {
+ "discovered_interpreter_python": "/usr/bin/python"
+ },
+ "changed": false,
+ "ping": "pong"
+}
+```
+
+现在 Ansible 工作了,你可以在控制台中抽身,并从你的 MacOS 工作站中使用它们。
+
+### 克隆新的 Ansible 进行 Ansible 开发
+
+这部分完全是可选的;只有当你想要额外的虚拟环境来修改 Ansible 或者安全地使用有问题的 Python 模块时,才需要它。你可以通过以下方式将主 Ansible 环境克隆到开发副本中:
+
+```
+(ansible-env) $ conda create --name ansible-dev --clone ansible-env
+(ansible-env) $ conda activte ansible-dev
+(ansible-dev) $
+```
+
+### 需要注意的问题
+
+偶尔你可能遇到使用 Conda 的麻烦。你通常可以通过以下方式删除不良环境:
+
+```
+$ conda activate base
+$ conda remove --name ansible-dev --all
+```
+
+如果出现无法解决的错误,通常可以通过在 `~/miniconda3/envs` 中找到该环境并删除整个目录来直接删除环境。如果基础环境损坏了,你可以删除整个 `~/miniconda3`,然后从 PKG 文件中重新安装。只要确保保留 `~/miniconda3/envs` ,或使用 Conda 工具导出环境配置并在以后重新创建即可。
+
+MacOS 上不包括 `sshpass` 程序。只有当你的 Ansible 工作要求你向 Ansible 提供 SSH 登录密码时,才需要它。你可以在 SourceForge 上找到当前的 [sshpass 源代码][6]。
+
+最后,基础的 Conda Python 模块列表可能缺少你工作所需的一些 Python 模块。如果你需要安装一个模块,首选命令是 `conda install package`,但是需要的话也可以使用 `pip`,Conda 会识别安装的模块。
+
+### 结论
+
+Ansible 是一个强大的自动化工具,值得我们去学习。Conda 是一个简单有效的 Python 虚拟环境管理工具。
+
+在你的 MacOS 环境中保持软件安装分离是保持日常工作环境的稳定性和健全性的谨慎方法。Conda 尤其有助于升级你的 Python 版本,将 Ansible 从其他项目中分离出来,并安全地使用 Ansible。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/8/using-conda-ansible-administration-macos
+
+作者:[James Farrell][a]
+选题:[lujun9972][b]
+译者:[heguangzhi](https://github.com/heguangzhi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/jamesf
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cicd_continuous_delivery_deployment_gears.png?itok=kVlhiEkc (CICD with gears)
+[2]: https://brew.sh/
+[3]: https://docs.ansible.com/?extIdCarryOver=true&sc_cid=701f2000001OH6uAAG
+[4]: https://conda.io/projects/conda/en/latest/index.html
+[5]: https://docs.conda.io/en/latest/miniconda.html
+[6]: https://sourceforge.net/projects/sshpass/
diff --git a/published/201909/20190829 Getting started with HTTPie for API testing.md b/published/201909/20190829 Getting started with HTTPie for API testing.md
new file mode 100644
index 0000000000..c85c165df5
--- /dev/null
+++ b/published/201909/20190829 Getting started with HTTPie for API testing.md
@@ -0,0 +1,334 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11333-1.html)
+[#]: subject: (Getting started with HTTPie for API testing)
+[#]: via: (https://opensource.com/article/19/8/getting-started-httpie)
+[#]: author: (Moshe Zadka https://opensource.com/users/moshezhttps://opensource.com/users/mkalindepauleduhttps://opensource.com/users/jamesf)
+
+使用 HTTPie 进行 API 测试
+======
+
+> 使用 HTTPie 调试 API,这是一个用 Python 写的易用的命令行工具。
+
+
+
+[HTTPie][2] 是一个非常易用、易于升级的 HTTP 客户端。它的发音为 “aitch-tee-tee-pie” 并以 `http` 命令运行,它是一个用 Python 编写的来用于访问 Web 的命令行工具。
+
+由于这是一篇关于 HTTP 客户端的指导文章,因此你需要一个 HTTP 服务器来试用它。在这里,访问 [httpbin.org][3],它是一个简单的开源 HTTP 请求和响应服务。httpbin.org 网站是一种测试 Web API 的强大方式,并能仔细管理并显示请求和响应内容,不过现在让我们专注于 HTTPie 的强大功能。
+
+### Wget 和 cURL 的替代品
+
+你可能听说过古老的 [Wget][4] 或稍微新一些的 [cURL][5] 工具,它们允许你从命令行访问 Web。它们是为访问网站而编写的,而 HTTPie 则用于访问 Web API。
+
+网站请求发生在计算机和正在阅读并响应它所看到的内容的最终用户之间,这并不太依赖于结构化的响应。但是,API 请求会在两台计算机之间进行*结构化*调用,人并不是该流程内的一部分,像 HTTPie 这样的命令行工具的参数可以有效地处理这个问题。
+
+### 安装 HTTPie
+
+有几种方法可以安装 HTTPie。你可以通过包管理器安装,无论你使用的是 `brew`、`apt`、`yum` 还是 `dnf`。但是,如果你已配置 [virtualenvwrapper][6],那么你可以用自己的方式安装:
+
+
+```
+$ mkvirtualenv httpie
+...
+(httpie) $ pip install httpie
+...
+(httpie) $ deactivate
+$ alias http=~/.virtualenvs/httpie/bin/http
+$ http -b GET https://httpbin.org/get
+{
+ "args": {},
+ "headers": {
+ "Accept": "*/*",
+ "Accept-Encoding": "gzip, deflate",
+ "Host": "httpbin.org",
+ "User-Agent": "HTTPie/1.0.2"
+ },
+ "origin": "104.220.242.210, 104.220.242.210",
+ "url": "https://httpbin.org/get"
+}
+```
+
+通过将 `http` 别名指向为虚拟环境中的命令,即使虚拟环境在非活动状态,你也可以运行它。你可以将 `alias` 命令放在 `.bash_profile` 或 `.bashrc` 中,这样你就可以使用以下命令升级 HTTPie:
+
+
+```
+$ ~/.virtualenvs/httpie/bin/pip install -U pip
+```
+
+### 使用 HTTPie 查询网站
+
+HTTPie 可以简化查询和测试 API。上面使用了一个选项,`-b`(即 `--body`)。没有它,HTTPie 将默认打印整个响应,包括响应头:
+
+```
+$ http GET https://httpbin.org/get
+HTTP/1.1 200 OK
+Access-Control-Allow-Credentials: true
+Access-Control-Allow-Origin: *
+Connection: keep-alive
+Content-Encoding: gzip
+Content-Length: 177
+Content-Type: application/json
+Date: Fri, 09 Aug 2019 20:19:47 GMT
+Referrer-Policy: no-referrer-when-downgrade
+Server: nginx
+X-Content-Type-Options: nosniff
+X-Frame-Options: DENY
+X-XSS-Protection: 1; mode=block
+
+{
+ "args": {},
+ "headers": {
+ "Accept": "*/*",
+ "Accept-Encoding": "gzip, deflate",
+ "Host": "httpbin.org",
+ "User-Agent": "HTTPie/1.0.2"
+ },
+ "origin": "104.220.242.210, 104.220.242.210",
+ "url": "https://httpbin.org/get"
+}
+```
+
+这在调试 API 服务时非常重要,因为大量信息在响应头中发送。例如,查看发送的 cookie 通常很重要。httpbin.org 提供了通过 URL 路径设置 cookie(用于测试目的)的方式。以下设置一个标题为 `opensource`, 值为 `awesome` 的 cookie:
+
+```
+$ http GET https://httpbin.org/cookies/set/opensource/awesome
+HTTP/1.1 302 FOUND
+Access-Control-Allow-Credentials: true
+Access-Control-Allow-Origin: *
+Connection: keep-alive
+Content-Length: 223
+Content-Type: text/html; charset=utf-8
+Date: Fri, 09 Aug 2019 20:22:39 GMT
+Location: /cookies
+Referrer-Policy: no-referrer-when-downgrade
+Server: nginx
+Set-Cookie: opensource=awesome; Path=/
+X-Content-Type-Options: nosniff
+X-Frame-Options: DENY
+X-XSS-Protection: 1; mode=block
+
+
+Redirecting...
+Redirecting...
+You should be redirected automatically to target URL:
+/cookies. If not click the link.
+```
+
+注意 `Set-Cookie: opensource=awesome; Path=/` 的响应头。这表明你预期设置的 cookie 已正确设置,路径为 `/`。另请注意,即使你得到了 `302` 重定向,`http` 也不会遵循它。如果你想要遵循重定向,则需要明确使用 `--follow` 标志请求:
+
+```
+$ http --follow GET https://httpbin.org/cookies/set/opensource/awesome
+HTTP/1.1 200 OK
+Access-Control-Allow-Credentials: true
+Access-Control-Allow-Origin: *
+Connection: keep-alive
+Content-Encoding: gzip
+Content-Length: 66
+Content-Type: application/json
+Date: Sat, 10 Aug 2019 01:33:34 GMT
+Referrer-Policy: no-referrer-when-downgrade
+Server: nginx
+X-Content-Type-Options: nosniff
+X-Frame-Options: DENY
+X-XSS-Protection: 1; mode=block
+
+{
+ "cookies": {
+ "opensource": "awesome"
+ }
+}
+```
+
+但此时你无法看到原来的 `Set-Cookie` 头。为了看到中间响应,你需要使用 `--all`:
+
+
+```
+$ http --headers --all --follow GET https://httpbin.org/cookies/set/opensource/awesome
+HTTP/1.1 302 FOUND
+Access-Control-Allow-Credentials: true
+Access-Control-Allow-Origin: *
+Content-Type: text/html; charset=utf-8
+Date: Sat, 10 Aug 2019 01:38:40 GMT
+Location: /cookies
+Referrer-Policy: no-referrer-when-downgrade
+Server: nginx
+Set-Cookie: opensource=awesome; Path=/
+X-Content-Type-Options: nosniff
+X-Frame-Options: DENY
+X-XSS-Protection: 1; mode=block
+Content-Length: 223
+Connection: keep-alive
+
+HTTP/1.1 200 OK
+Access-Control-Allow-Credentials: true
+Access-Control-Allow-Origin: *
+Content-Encoding: gzip
+Content-Type: application/json
+Date: Sat, 10 Aug 2019 01:38:41 GMT
+Referrer-Policy: no-referrer-when-downgrade
+Server: nginx
+X-Content-Type-Options: nosniff
+X-Frame-Options: DENY
+X-XSS-Protection: 1; mode=block
+Content-Length: 66
+Connection: keep-alive
+```
+
+打印响应体并不有趣,因为你大多数时候只关心 cookie。如果你想看到中间请求的响应头,而不是最终请求中的响应体,你可以使用:
+
+```
+$ http --print hb --history-print h --all --follow GET https://httpbin.org/cookies/set/opensource/awesome
+HTTP/1.1 302 FOUND
+Access-Control-Allow-Credentials: true
+Access-Control-Allow-Origin: *
+Content-Type: text/html; charset=utf-8
+Date: Sat, 10 Aug 2019 01:40:56 GMT
+Location: /cookies
+Referrer-Policy: no-referrer-when-downgrade
+Server: nginx
+Set-Cookie: opensource=awesome; Path=/
+X-Content-Type-Options: nosniff
+X-Frame-Options: DENY
+X-XSS-Protection: 1; mode=block
+Content-Length: 223
+Connection: keep-alive
+
+HTTP/1.1 200 OK
+Access-Control-Allow-Credentials: true
+Access-Control-Allow-Origin: *
+Content-Encoding: gzip
+Content-Type: application/json
+Date: Sat, 10 Aug 2019 01:40:56 GMT
+Referrer-Policy: no-referrer-when-downgrade
+Server: nginx
+X-Content-Type-Options: nosniff
+X-Frame-Options: DENY
+X-XSS-Protection: 1; mode=block
+Content-Length: 66
+Connection: keep-alive
+
+{
+ "cookies": {
+ "opensource": "awesome"
+ }
+}
+```
+
+你可以使用 `--print` 精确控制打印的内容(`h`:响应头;`b`:响应体),并使用 `--history-print` 覆盖中间请求的打印内容设置。
+
+### 使用 HTTPie 下载二进制文件
+
+有时响应体并不是文本形式,它需要发送到可被不同应用打开的文件:
+
+```
+$ http GET https://httpbin.org/image/jpeg
+HTTP/1.1 200 OK
+Access-Control-Allow-Credentials: true
+Access-Control-Allow-Origin: *
+Connection: keep-alive
+Content-Length: 35588
+Content-Type: image/jpeg
+Date: Fri, 09 Aug 2019 20:25:49 GMT
+Referrer-Policy: no-referrer-when-downgrade
+Server: nginx
+X-Content-Type-Options: nosniff
+X-Frame-Options: DENY
+X-XSS-Protection: 1; mode=block
+
+
++-----------------------------------------+
+| NOTE: binary data not shown in terminal |
++-----------------------------------------+
+```
+
+要得到正确的图片,你需要保存到文件:
+
+```
+$ http --download GET https://httpbin.org/image/jpeg
+HTTP/1.1 200 OK
+Access-Control-Allow-Credentials: true
+Access-Control-Allow-Origin: *
+Connection: keep-alive
+Content-Length: 35588
+Content-Type: image/jpeg
+Date: Fri, 09 Aug 2019 20:28:13 GMT
+Referrer-Policy: no-referrer-when-downgrade
+Server: nginx
+X-Content-Type-Options: nosniff
+X-Frame-Options: DENY
+X-XSS-Protection: 1; mode=block
+
+Downloading 34.75 kB to "jpeg.jpe"
+Done. 34.75 kB in 0.00068s (50.05 MB/s)
+```
+
+试一下!图片很可爱。
+
+### 使用 HTTPie 发送自定义请求
+
+你可以发送指定的请求头。这对于需要非标准头的自定义 Web API 很有用:
+
+```
+$ http GET https://httpbin.org/headers X-Open-Source-Com:Awesome
+{
+ "headers": {
+ "Accept": "*/*",
+ "Accept-Encoding": "gzip, deflate",
+ "Host": "httpbin.org",
+ "User-Agent": "HTTPie/1.0.2",
+ "X-Open-Source-Com": "Awesome"
+ }
+}
+```
+
+最后,如果要发送 JSON 字段(尽管可以指定确切的内容),对于许多嵌套较少的输入,你可以使用快捷方式:
+
+
+```
+$ http --body PUT https://httpbin.org/anything open-source=awesome author=moshez
+{
+ "args": {},
+ "data": "{\"open-source\": \"awesome\", \"author\": \"moshez\"}",
+ "files": {},
+ "form": {},
+ "headers": {
+ "Accept": "application/json, */*",
+ "Accept-Encoding": "gzip, deflate",
+ "Content-Length": "46",
+ "Content-Type": "application/json",
+ "Host": "httpbin.org",
+ "User-Agent": "HTTPie/1.0.2"
+ },
+ "json": {
+ "author": "moshez",
+ "open-source": "awesome"
+ },
+ "method": "PUT",
+ "origin": "73.162.254.113, 73.162.254.113",
+ "url": "https://httpbin.org/anything"
+}
+```
+
+下次在调试 Web API 时,无论是你自己的还是别人的,记得放下 cURL,试试 HTTPie 这个命令行工具。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/8/getting-started-httpie
+
+作者:[Moshe Zadka][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/moshezhttps://opensource.com/users/mkalindepauleduhttps://opensource.com/users/jamesf
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/pie-raspberry-bake-make-food.png?itok=QRV_R8Fa (Raspberry pie with slice missing)
+[2]: https://httpie.org/
+[3]: https://github.com/postmanlabs/httpbin
+[4]: https://en.wikipedia.org/wiki/Wget
+[5]: https://en.wikipedia.org/wiki/CURL
+[6]: https://opensource.com/article/19/6/virtual-environments-python-macos
diff --git a/translated/tech/20190829 Three Ways to Exclude Specific-Certain Packages from Yum Update.md b/published/201909/20190829 Three Ways to Exclude Specific-Certain Packages from Yum Update.md
similarity index 66%
rename from translated/tech/20190829 Three Ways to Exclude Specific-Certain Packages from Yum Update.md
rename to published/201909/20190829 Three Ways to Exclude Specific-Certain Packages from Yum Update.md
index 28c317ab83..f0d1ba9087 100644
--- a/translated/tech/20190829 Three Ways to Exclude Specific-Certain Packages from Yum Update.md
+++ b/published/201909/20190829 Three Ways to Exclude Specific-Certain Packages from Yum Update.md
@@ -1,8 +1,8 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11315-1.html)
[#]: subject: (Three Ways to Exclude Specific/Certain Packages from Yum Update)
[#]: via: (https://www.2daygeek.com/redhat-centos-yum-update-exclude-specific-packages/)
[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
@@ -10,53 +10,47 @@
从 Yum 更新中排除特定/某些包的三种方法
======
+
+
作为系统更新的一部分,你也许需要在基于 Red Hat 系统中由于应用依赖排除一些软件包。
-如果是,如何排除?可以采取多少种方式?
+如果是,如何排除?可以采取多少种方式?有三种方式可以做到,我们会在本篇中教你这三种方法。
-有三种方式可以做到,我们会在本篇中教你这三种方法。
+包管理器是一组工具,它允许用户在 Linux 系统中轻松管理包。它能让用户在 Linux 系统中安装、更新/升级、删除、查询、重新安装和搜索软件包。
-包管理器是一组工具,它允许用户在 Linux 系统中轻松管理包。
-
-它能让用户在 Linux 系统中安装、更新/升级、删除、查询、重新安装和搜索软件包。
-
-对于基于 Red Hat 的系统,我们使用 **[yum 包管理器][1]** 和 **[rpm 包管理器][2]** 进行包管理。
+对于基于 Red Hat 的系统,我们使用 [yum 包管理器][1] 和 [rpm 包管理器][2] 进行包管理。
### 什么是 yum?
-yum 代表 Yellowdog Updater,Modified。Yum 是用于 rpm 系统的自动更新程序和包安装/卸载器。
+yum 代表 “Yellowdog Updater, Modified”。Yum 是用于 rpm 系统的自动更新程序和包安装/卸载器。
它在安装包时自动解决依赖关系。
### 什么是 rpm?
-rpm 代表 Red Hat Package Manager ,它是一款用于 Red Hat 系统的功能强大的包管理工具。
+rpm 代表 “Red Hat Package Manager”,它是一款用于 Red Hat 系统的功能强大的包管理工具。
RPM 指的是 `.rpm` 文件格式,它包含已编译的软件和必要的库。
你可能有兴趣阅读以下与本主题相关的文章。如果是的话,请进入相应的链接。
- * ** [如何检查 Red Hat(RHEL)和 CentOS 系统上的可用安全更新] [3] **
- * ** [在 Red Hat(RHEL)和 CentOS 系统上安装安全更新的四种方法] [4] **
- * ** [在 Redhat(RHEL)和 CentOS 系统上检查或列出已安装的安全更新的两种方法] [5] **
-
-
+ * [如何检查 Red Hat(RHEL)和 CentOS 系统上的可用安全更新][3]
+ * [在 Red Hat(RHEL)和 CentOS 系统上安装安全更新的四种方法][4]
+ * [在 Redhat(RHEL)和 CentOS 系统上检查或列出已安装的安全更新的两种方法][5]
### 方法 1:手动或临时用 yum 命令排除包
-我们可以在 yum 中使用 `--exclude 或 -x` 开关来阻止 yum 命令获取特定包的更新。
+我们可以在 yum 中使用 `--exclude` 或 `-x` 开关来阻止 yum 命令获取特定包的更新。
我可以说,这是一种临时方法或按需方法。如果你只想将特定包排除一次,那么我们可以使用此方法。
以下命令将更新除 kernel 之外的所有软件包。
-要排除单个包。
+要排除单个包:
```
# yum update --exclude=kernel
-
或者
-
# yum update -x 'kernel'
```
@@ -64,9 +58,7 @@ RPM 指的是 `.rpm` 文件格式,它包含已编译的软件和必要的库
```
# yum update --exclude=kernel* --exclude=php*
-
或者
-
# yum update --exclude httpd,php
```
@@ -74,9 +66,9 @@ RPM 指的是 `.rpm` 文件格式,它包含已编译的软件和必要的库
这是永久性方法,如果你经常执行修补程序更新,那么可以使用此方法。
-为此,请在 /etc/yum.conf 中添加相应的软件包以永久禁用软件包更新。
+为此,请在 `/etc/yum.conf` 中添加相应的软件包以永久禁用软件包更新。
-添加后,每次运行 yum update 命令时都不需要指定这些包。此外,这可以防止任何意外更新这些包。
+添加后,每次运行 `yum update` 命令时都不需要指定这些包。此外,这可以防止任何意外更新这些包。
```
# vi /etc/yum.conf
@@ -96,11 +88,11 @@ exclude=kernel* php*
### 方法 3:使用 Yum versionlock 插件排除包
-这也是与上面类似的永久方法。Yum versionlock 插件允许用户通过 yum 命令锁定指定包的更新。
+这也是与上面类似的永久方法。Yum versionlock 插件允许用户通过 `yum` 命令锁定指定包的更新。
-为此,请运行以下命令。以下命令将从 yum update 中排除 freetype 包。
+为此,请运行以下命令。以下命令将从 `yum update` 中排除 freetype 包。
-或者,你可以直接在 “/etc/yum/pluginconf.d/versionlock.list” 中添加条目。
+或者,你可以直接在 `/etc/yum/pluginconf.d/versionlock.list` 中添加条目。
```
# yum versionlock add freetype
@@ -112,7 +104,6 @@ versionlock added: 1
运行以下命令来检查被 versionlock 插件锁定的软件包列表。
-
```
# yum versionlock list
@@ -134,7 +125,7 @@ via: https://www.2daygeek.com/redhat-centos-yum-update-exclude-specific-packages
作者:[Magesh Maruthamuthu][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/20190830 Change your Linux terminal color theme.md b/published/201909/20190830 Change your Linux terminal color theme.md
similarity index 100%
rename from published/20190830 Change your Linux terminal color theme.md
rename to published/201909/20190830 Change your Linux terminal color theme.md
diff --git a/published/201909/20190830 How to Create and Use Swap File on Linux.md b/published/201909/20190830 How to Create and Use Swap File on Linux.md
new file mode 100644
index 0000000000..d8db4b5623
--- /dev/null
+++ b/published/201909/20190830 How to Create and Use Swap File on Linux.md
@@ -0,0 +1,254 @@
+[#]: collector: (lujun9972)
+[#]: translator: (heguangzhi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11341-1.html)
+[#]: subject: (How to Create and Use Swap File on Linux)
+[#]: via: (https://itsfoss.com/create-swap-file-linux/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+如何在 Linux 上创建和使用交换文件
+======
+
+本教程讨论了 Linux 中交换文件的概念,为什么使用它以及它相对于传统交换分区的优势。你将学习如何创建交换文件和调整其大小。
+
+### 什么是 Linux 的交换文件?
+
+交换文件允许 Linux 将磁盘空间模拟为内存。当你的系统开始耗尽内存时,它会使用交换空间将内存的一些内容交换到磁盘空间上。这样释放了内存,为更重要的进程服务。当内存再次空闲时,它会从磁盘交换回数据。我建议[阅读这篇文章,了解 Linux 上的交换空间的更多内容][1]。
+
+传统上,交换空间是磁盘上的一个独立分区。安装 Linux 时,只需创建一个单独的分区进行交换。但是这种趋势在最近几年发生了变化。
+
+使用交换文件,你不再需要单独的分区。你会根目录下创建一个文件,并告诉你的系统将其用作交换空间就行了。
+
+使用专用的交换分区,在许多情况下,调整交换空间的大小是一个可怕而不可能的任务。但是有了交换文件,你可以随意调整它们的大小。
+
+最新版本的 Ubuntu 和其他一些 Linux 发行版已经开始 [默认使用交换文件][2]。甚至如果你没有创建交换分区,Ubuntu 也会自己创建一个 1GB 左右的交换文件。
+
+让我们看看交换文件的更多信息。
+
+
+
+### 检查 Linux 的交换空间
+
+在你开始添加交换空间之前,最好检查一下你的系统中是否已经有了交换空间。
+
+你可以用[Linux 上的 free 命令][4]检查它。就我而言,我的[戴尔 XPS][5]有 14GB 的交换容量。
+
+```
+free -h
+ total used free shared buff/cache available
+Mem: 7.5G 4.1G 267M 971M 3.1G 2.2G
+Swap: 14G 0B 14G
+```
+
+`free` 命令给出了交换空间的大小,但它并没有告诉你它是真实的交换分区还是交换文件。`swapon` 命令在这方面会更好。
+
+```
+swapon --show
+NAME TYPE SIZE USED PRIO
+/dev/nvme0n1p4 partition 14.9G 0B -2
+```
+
+如你所见,我有 14.9GB 的交换空间,它在一个单独的分区上。如果是交换文件,类型应该是 `file` 而不是 `partition`。
+
+```
+swapon --show
+NAME TYPE SIZE USED PRIO
+/swapfile file 2G 0B -2
+```
+
+如果你的系统上没有交换空间,它应该显示如下内容:
+
+```
+free -h
+ total used free shared buff/cache available
+Mem: 7.5G 4.1G 267M 971M 3.1G 2.2G
+Swap: 0B 0B 0B
+```
+
+而 `swapon` 命令不会显示任何输出。
+
+
+### 在 Linux 上创建交换文件
+
+如果你的系统没有交换空间,或者你认为交换空间不足,你可以在 Linux 上创建交换文件。你也可以创建多个交换文件。
+
+让我们看看如何在 Linux 上创建交换文件。我在本教程中使用 Ubuntu 18.04,但它也应该适用于其他 Linux 发行版本。
+
+#### 步骤 1:创建一个新的交换文件
+
+首先,创建一个具有所需交换空间大小的文件。假设我想给我的系统增加 1GB 的交换空间。使用`fallocate` 命令创建大小为 1GB 的文件。
+
+```
+sudo fallocate -l 1G /swapfile
+```
+
+建议只允许 `root` 用户读写该交换文件。当你尝试将此文件用于交换区域时,你甚至会看到类似“不安全权限 0644,建议 0600”的警告。
+
+```
+sudo chmod 600 /swapfile
+```
+
+请注意,交换文件的名称可以是任意的。如果你需要多个交换空间,你可以给它任何合适的名称,如 `swap_file_1`、`swap_file_2` 等。它们只是一个预定义大小的文件。
+
+#### 步骤 2:将新文件标记为交换空间
+
+你需要告诉 Linux 系统该文件将被用作交换空间。你可以用 [mkswap][7] 工具做到这一点。
+
+```
+sudo mkswap /swapfile
+```
+
+你应该会看到这样的输出:
+
+```
+Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
+no label, UUID=7e1faacb-ea93-4c49-a53d-fb40f3ce016a
+```
+
+#### 步骤 3:启用交换文件
+
+现在,你的系统知道文件 `swapfile` 可以用作交换空间。但是还没有完成。你需要启用该交换文件,以便系统可以开始使用该文件作为交换。
+
+```
+sudo swapon /swapfile
+```
+
+现在,如果你检查交换空间,你应该会看到你的 Linux 系统会识别并使用它作为交换空间:
+
+```
+swapon --show
+NAME TYPE SIZE USED PRIO
+/swapfile file 1024M 0B -2
+```
+
+#### 步骤 4:让改变持久化
+
+迄今为止你所做的一切都是暂时的。重新启动系统,所有更改都将消失。
+
+你可以通过将新创建的交换文件添加到 `/etc/fstab` 文件来使更改持久化。
+
+对 `/etc/fstab` 文件进行任何更改之前,最好先进行备份。
+
+```
+sudo cp /etc/fstab /etc/fstab.back
+```
+
+现在将以下行添加到 `/etc/fstab` 文件的末尾:
+
+```
+/swapfile none swap sw 0 0
+```
+
+你可以使用[命令行文本编辑器][8]手动操作,或者使用以下命令:
+
+```
+echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
+```
+
+现在一切都准备好了。即使在重新启动你的 Linux 系统后,你的交换文件也会被使用。
+
+### 调整 swappiness 参数
+
+`swappiness` 参数决定了交换空间的使用频率。`swappiness` 值的范围从 0 到 100。较高的值意味着交换空间将被更频繁地使用。
+
+Ubuntu 桌面的默认的 `swappiness` 是 60,而服务器的默认 `swappiness` 是 1。你可以使用以下命令检查 `swappiness`:
+
+```
+cat /proc/sys/vm/swappiness
+```
+
+为什么服务器应该使用低的 `swappiness` 值?因为交换空间比内存慢,为了获得更好的性能,应该尽可能多地使用内存。在服务器上,性能因素至关重要,因此 `swappiness` 应该尽可能低。
+
+你可以使用以下系统命令动态更改 `swappiness`:
+
+```
+sudo sysctl vm.swappiness=25
+```
+
+这种改变只是暂时的。如果要使其永久化,可以编辑 `/etc/sysctl.conf` 文件,并在文件末尾添加`swappiness` 值:
+
+```
+vm.swappiness=25
+```
+
+### 在 Linux 上调整交换空间的大小
+
+在 Linux 上有几种方法可以调整交换空间的大小。但是在你看到这一点之前,你应该了解一些关于它的事情。
+
+当你要求系统停止将交换文件用于交换空间时,它会将所有数据(确切地说是内存页)传输回内存。所以你应该有足够的空闲内存,然后再停止交换。
+
+这就是为什么创建和启用另一个临时交换文件是一个好的做法的原因。这样,当你关闭原来的交换空间时,你的系统将使用临时交换文件。现在你可以调整原来的交换空间的大小。你可以手动删除临时交换文件或留在那里,下次启动时会自动删除(LCTT 译注:存疑?)。
+
+如果你有足够的可用内存或者创建了临时交换空间,那就关闭你原来的交换文件。
+
+```
+sudo swapoff /swapfile
+```
+
+现在你可以使用 `fallocate` 命令来更改文件的大小。比方说,你将其大小更改为 2GB:
+
+```
+sudo fallocate -l 2G /swapfile
+```
+
+现在再次将文件标记为交换空间:
+
+```
+sudo mkswap /swapfile
+```
+
+并再次启用交换文件:
+
+```
+sudo swapon /swapfile
+```
+
+你也可以选择同时拥有多个交换文件。
+
+### 删除 Linux 中的交换文件
+
+你可能有不在 Linux 上使用交换文件的原因。如果你想删除它,该过程类似于你刚才看到的调整交换大小的过程。
+
+首先,确保你有足够的空闲内存。现在关闭交换文件:
+
+```
+sudo swapoff /swapfile
+```
+
+下一步是从 `/etc/fstab` 文件中删除相应的条目。
+
+最后,你可以删除该文件来释放空间:
+
+```
+sudo rm /swapfile
+```
+
+### 你用了交换空间了吗?
+
+我想你现在已经很好地理解了 Linux 中的交换文件概念。现在,你可以根据需要轻松创建交换文件或调整它们的大小。
+
+如果你对这个话题有什么要补充的或者有任何疑问,请在下面留下评论。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/create-swap-file-linux/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[heguangzhi](https://github.com/heguangzhi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/swap-size/
+[2]: https://help.ubuntu.com/community/SwapFaq
+[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/swap-file-linux.png?resize=800%2C450&ssl=1
+[4]: https://linuxhandbook.com/free-command/
+[5]: https://itsfoss.com/dell-xps-13-ubuntu-review/
+[6]: https://itsfoss.com/fix-missing-system-settings-ubuntu-1404-quick-tip/
+[7]: http://man7.org/linux/man-pages/man8/mkswap.8.html
+[8]: https://itsfoss.com/command-line-text-editors-linux/
+[9]: https://itsfoss.com/replace-linux-from-dual-boot/
diff --git a/published/201909/20190830 git exercises- navigate a repository.md b/published/201909/20190830 git exercises- navigate a repository.md
new file mode 100644
index 0000000000..2c7899d172
--- /dev/null
+++ b/published/201909/20190830 git exercises- navigate a repository.md
@@ -0,0 +1,82 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11379-1.html)
+[#]: subject: (git exercises: navigate a repository)
+[#]: via: (https://jvns.ca/blog/2019/08/30/git-exercises--navigate-a-repository/)
+[#]: author: (Julia Evans https://jvns.ca/)
+
+Git 练习:存储库导航
+======
+
+我觉得前几天的 [curl 练习][1]进展顺利,所以今天我醒来后,想尝试编写一些 Git 练习。Git 是一大块需要学习的技能,可能要花几个小时才能学会,所以我分解练习的第一个思路是从“导航”一个存储库开始的。
+
+我本来打算使用一个玩具测试库,但后来我想,为什么不使用真正的存储库呢?这样更有趣!因此,我们将浏览 Ruby 编程语言的存储库。你无需了解任何 C 即可完成此练习,只需熟悉一下存储库中的文件随时间变化的方式即可。
+
+### 克隆存储库
+
+开始之前,需要克隆存储库:
+
+```
+git clone https://github.com/ruby/ruby
+```
+
+与实际使用的大多数存储库相比,该存储库的最大不同之处在于它没有分支,但是它有很多标签,它们与分支相似,因为它们都只是指向一个提交的指针而已。因此,我们将使用标签而不是分支进行练习。*改变*标签的方式和分支非常不同,但*查看*标签和分支的方式完全相同。
+
+### Git SHA 总是引用同一个代码
+
+执行这些练习时要记住的最重要的一点是,如本页面所述,像`9e3d9a2a009d2a0281802a84e1c5cc1c887edc71` 这样的 Git SHA 始终引用同一个的代码。下图摘自我与凯蒂·西勒·米勒撰写的一本杂志,名为《[Oh shit, git!][2]》。(她还有一个名为 的很棒的网站,启发了该杂志。)
+
+
+
+我们将在练习中大量使用 Git SHA,以使你习惯于使用它们,并帮助你了解它们与标签和分支的对应关系。
+
+### 我们将要使用的 Git 子命令
+
+所有这些练习仅使用这 5 个 Git 子命令:
+
+```
+git checkout
+git log (--oneline, --author, and -S will be useful)
+git diff (--stat will be useful)
+git show
+git status
+```
+
+### 练习
+
+1. 查看 matz 从 1998 年开始的 Ruby 提交。提交 ID 为 ` 3db12e8b236ac8f88db8eb4690d10e4a3b8dbcd4`。找出当时 Ruby 的代码行数。
+2. 检出当前的 master 分支。
+3. 查看文件 `hash.c` 的历史记录。更改该文件的最后一个提交 ID 是什么?
+4. 了解最近 20 年来 `hash.c` 的变化:将 master 分支上的文件与提交 `3db12e8b236ac8f88db8eb4690d10e4a3b8dbcd4` 的文件进行比较。
+5. 查找最近更改了 `hash.c` 的提交,并查看该提交的差异。
+6. 对于每个 Ruby 版本,该存储库都有一堆**标签**。获取所有标签的列表。
+7. 找出在标签 `v1_8_6_187` 和标签 `v1_8_6_188` 之间更改了多少文件。
+8. 查找 2015 年的提交(任何一个提交)并将其检出,简单地查看一下文件,然后返回 master 分支。
+9. 找出标签 `v1_8_6_187` 对应的提交。
+10. 列出目录 `.git/refs/tags`。运行 `cat .git/refs/tags/v1_8_6_187` 来查看其中一个文件的内容。
+11. 找出当前 `HEAD` 对应的提交 ID。
+12. 找出已经对 `test/` 目录进行了多少次提交。
+13. 提交 `65a5162550f58047974793cdc8067a970b2435c0` 和 `9e3d9a2a009d2a0281802a84e1c5cc1c887edc71` 之间的 `lib/telnet.rb` 的差异。该文件更改了几行?
+14. 在 Ruby 2.5.1 和 2.5.2 之间进行了多少次提交(标记为 `v2_5_1` 和 `v2_5_3`)(这一步有点棘手,步骤不只一步)
+15. “matz”(Ruby 的创建者)作了多少提交?
+16. 最近包含 “tkutil” 一词的提交是什么?
+17. 检出提交 `e51dca2596db9567bd4d698b18b4d300575d3881` 并创建一个指向该提交的新分支。
+18. 运行 `git reflog` 以查看你到目前为止完成的所有存储库导航操作。
+
+--------------------------------------------------------------------------------
+
+via: https://jvns.ca/blog/2019/08/30/git-exercises--navigate-a-repository/
+
+作者:[Julia Evans][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://jvns.ca/
+[b]: https://github.com/lujun9972
+[1]: https://jvns.ca/blog/2019/08/27/curl-exercises/
+[2]: https://wizardzines.com/zines/oh-shit-git/
diff --git a/published/20190831 Google opens Android speech transcription and gesture tracking, Twitter-s telemetry tooling, Blender-s growing adoption, and more news.md b/published/201909/20190831 Google opens Android speech transcription and gesture tracking, Twitter-s telemetry tooling, Blender-s growing adoption, and more news.md
similarity index 100%
rename from published/20190831 Google opens Android speech transcription and gesture tracking, Twitter-s telemetry tooling, Blender-s growing adoption, and more news.md
rename to published/201909/20190831 Google opens Android speech transcription and gesture tracking, Twitter-s telemetry tooling, Blender-s growing adoption, and more news.md
diff --git a/published/201909/20190901 Best Linux Distributions For Everyone in 2019.md b/published/201909/20190901 Best Linux Distributions For Everyone in 2019.md
new file mode 100644
index 0000000000..4a6e136180
--- /dev/null
+++ b/published/201909/20190901 Best Linux Distributions For Everyone in 2019.md
@@ -0,0 +1,386 @@
+[#]: collector: (lujun9972)
+[#]: translator: (heguangzhi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11411-1.html)
+[#]: subject: (Best Linux Distributions For Everyone in 2019)
+[#]: via: (https://itsfoss.com/best-linux-distributions/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+2019 年最好的 Linux 发行版
+======
+
+> 哪个是最好的 Linux 发行版呢?这个问题是没有明确的答案的。这就是为什么我们按各种分类汇编了这个最佳 Linux 列表的原因。
+
+有许多 Linux 发行版,我甚至想不出一个确切的数量,因为你会发现很多不同的 Linux 发行版。
+
+其中有些只是另外一个的复制品,而有些往往是独一无二的。这虽然有点混乱——但这也是 Linux 的优点。
+
+不用担心,尽管有成千上万的发行版,在这篇文章中,我已经列出了目前最好的 Linux 发行版。当然,这个列表是主观的。但是,在这里,我们试图对发行版进行分类——每个发行版本都有自己的特点的。
+
+* 面向初学者的 Linux 用户的最佳发行版
+* 最佳 Linux 服务器发行版
+* 可以在旧计算机上运行的最佳 Linux 发行版
+* 面向高级 Linux 用户的最佳发行版
+* 最佳常青树 Linux 发行版
+
+**注:** 该列表没有特定的排名顺序。
+
+### 面向初学者的最佳 Linux 发行版
+
+在这个分类中,我们的目标是列出开箱即用的易用发行版。你不需要深度学习,你可以在安装后马上开始使用,不需要知道任何命令或技巧。
+
+#### Ubuntu
+
+![][6]
+
+Ubuntu 无疑是最流行的 Linux 发行版之一。你甚至可以发现它已经预装在很多笔记本电脑上了。
+
+用户界面很容易适应。如果你愿意,你可以根据自己的要求轻松定制它的外观。无论哪种情况,你都可以选择安装一个主题。你可以从了解更多关于[如何在 Ubuntu 安装主题的][7]的信息来起步。
+
+除了它本身提供的功能外,你会发现一个巨大的 Ubuntu 用户在线社区。因此,如果你有问题——可以去任何论坛(或版块)寻求帮助。如果你想直接寻找解决方案,你应该看看我们对 [Ubuntu][8] 的报道(我们有很多关于 Ubuntu 的教程和建议)。
+
+- [Ubuntu][9]
+
+#### Linux Mint
+
+![][10]
+
+Linux Mint Cinnamon 是另一个受初学者欢迎的 Linux 发行版。默认的 Cinnamon 桌面类似于 Windows XP,这就是为什么当 Windows XP 停止维护时许多用户选择它的原因。
+
+Linux Mint 基于 Ubuntu,因此它具有适用于 Ubuntu 的所有应用程序。简单易用是它成为 Linux 新用户首选的原因。
+
+- [Linux Mint][11]
+
+#### elementary OS
+
+![][12]
+
+elementary OS 是我用过的最漂亮的 Linux 发行版之一。用户界面类似于苹果操作系统——所以如果你已经使用了苹果系统,则很容易适应。
+
+该发行版基于 Ubuntu,致力于提供一个用户友好的 Linux 环境,该环境在考虑性能的同时尽可能美观。如果你选择安装 elementary OS,这份[在安装 elementary OS 后要做的 11 件事的清单][13]会派上用场。
+
+- [elementary OS][14]
+
+#### MX Linux
+
+![][15]
+
+大约一年前,MX Linux 成为众人瞩目的焦点。现在(在发表这篇文章的时候),它是 [DistroWatch.com][16] 上最受欢迎的 Linux 发行版。如果你还没有使用过它,那么当你开始使用它时,你会感到惊讶。
+
+与 Ubuntu 不同,MX Linux 是一个基于 Debian 的日益流行的发行版,采用 Xfce 作为其桌面环境。除了无与伦比的稳定性之外,它还配备了许多图形用户界面工具,这使得任何习惯了 Windows/Mac 的用户易于使用它。
+
+此外,软件包管理器还专门针对一键安装进行了量身定制。你甚至可以搜索 [Flatpak][18] 软件包并立即安装它(默认情况下,Flathub 在软件包管理器中是可用的来源之一)。
+
+- [MX Linux][19]
+
+#### Zorin OS
+
+![][20]
+
+Zorin OS 是又一个基于 Ubuntu 的发行版,它又是桌面上最漂亮、最直观的操作系统之一。尤其是在[Zorin OS 15 发布][21]之后——我绝对会向没有任何 Linux 经验的用户推荐它。它也引入了许多基于图形用户界面的应用程序。
+
+你也可以将其安装在旧电脑上,但是,请确保选择“Lite”版本。此外,你还有“Core”、“Education”和 “Ultimate”版本可以选择。你可以选择免费安装 Core 版,但是如果你想支持开发人员并帮助改进 Zorin,请考虑获得 Ultimate 版。
+
+Zorin OS 是由两名爱尔兰的青少年创建的。你可以[在这里阅读他们的故事][22]。
+
+- [Zorin OS][23]
+
+#### Pop!_OS
+
+
+
+Sytem76 的 Pop!_OS 是开发人员或计算机科学专业人员的理想选择。当然,不仅限于编码人员,如果你刚开始使用 Linux,这也是一个很好的选择。它基于 Ubuntu,但是其 UI 感觉更加直观和流畅。除了 UI 外,它还强制执行全盘加密。
+
+你可以通过文章下面的评论看到,我们的许多读者似乎都喜欢(并坚持使用)它。如果你对此感到好奇,也应该查看一下我们关于 Phillip Prado 的 [Pop!_OS 的动手实践](https://itsfoss.com/pop-os-linux-review/)的文章。
+
+(LCTT 译注:这段推荐是原文后来补充的,因为原文下面很多人在评论推荐。)
+
+- [Pop!_OS](https://system76.com/pop)
+
+#### 其他选择
+
+[深度操作系统][24] 和其他的 Ubuntu 变种(如 Kubuntu、Xubuntu)也是初学者的首选。如果你想寻求更多的选择,你可以看看。(LCTT 译注:我知道你们肯定对将深度操作系统列入其它不满意——这个锅归原作者。)
+
+如果你想要挑战自己,你可以试试 Ubuntu 之外的 Fedora —— 但是一定要看看我们关于 [Ubuntu 和 Fedora 对比][25]的文章,从桌面的角度做出更好的选择。
+
+### 最好的服务器发行版
+
+对于服务器来说,选择 Linux 发行版取决于稳定性、性能和企业级支持。如果你只是尝试,则可以尝试任何你想要的发行版。
+
+但是,如果你要为 Web 服务器或任何重要的组件安装它,你应该看看我们的一些建议。
+
+#### Ubuntu 服务器
+
+根据你的需要,Ubuntu 为你的服务器提供了不同的选项。如果你正在寻找运行在 AWS、Azure、谷歌云平台等平台上的优化解决方案,[Ubuntu Cloud][26] 是一个很好的选择。
+
+无论是哪种情况,你都可以选择 Ubuntu 服务器包,并将其安装在你的服务器上。然而,Ubuntu 在云上部署时也是最受欢迎的 Linux 发行版(根据数字判断——[来源1][27]、[来源2][28])。
+
+请注意,除非你有特殊要求,我们建议你选择 LTS 版。
+
+- [Ubuntu Server][29]
+
+#### 红帽企业版 Linux(RHEL)
+
+红帽企业版 Linux(RHEL)是面向企业和组织的顶级 Linux 平台。如果我们按数字来看,红帽可能不是服务器领域最受欢迎的。但是,有相当一部分企业用户依赖于 RHEL (比如联想)。
+
+从技术上讲,Fedora 和红帽企业版是相关联的。无论红帽要支持什么——在出现在 RHEL 之前,都要在 Fedora 上进行测试。我不是定制需求的服务器发行版专家,所以你一定要查看他们的[官方文档][30]以了解它是否适合你。
+
+- [RHEL][31]
+
+#### SUSE Linux 企业服务器(SLES)
+
+![][32]
+
+别担心,不要把这和 OpenSUSE 混淆。一切都以一个共同的品牌 “SUSE” 命名 —— 但是 OpenSUSE 是一个开源发行版,目标是社区,并且由社区维护。
+
+SUSE Linux 企业服务器(SLES)是基于云的服务器最受欢迎的解决方案之一。为了获得管理开源解决方案的优先支持和帮助,你必须选择订阅。
+
+- [SLES][33]
+
+#### CentOS
+
+![][34]
+
+正如我提到的,对于 RHEL 你需要订阅。而 CentOS 更像是 RHEL 的社区版,因为它是从 RHEL 的源代码中派生出来的。而且,它是开源的,也是免费的。尽管与过去几年相比,使用 CentOS 的托管提供商数量明显减少,但这仍然是一个很好的选择。
+
+CentOS 可能没有加载最新的软件包,但它被认为是最稳定的发行版之一,你可以在各种云平台上找到 CentOS 镜像。如果没有,你可以选择 CentOS 提供的自托管镜像。
+
+- [CentOS][35]
+
+#### 其他选择
+
+你也可以尝试 [Fedora Server][36]或[Debian][37]作为上述发行版的替代品。
+
+### 旧电脑的最佳 Linux 发行版
+
+如果你有一台旧电脑,或者你真的不需要升级你的系统,你仍然可以尝试一些最好的 Linux 发行版。
+
+我们已经详细讨论了一些[最好的轻量级 Linux 发行版][42]。在这里,我们将只提到那些真正突出的东西(以及一些新的补充)。
+
+#### Puppy Linux
+
+![][43]
+
+Puppy Linux 实际上是最小的发行版本之一。刚开始使用 Linux 时,我的朋友建议我尝试一下 Puppy Linux,因为它可以轻松地在较旧的硬件配置上运行。
+
+如果你想在你的旧电脑上享受一次爽快的体验,那就值得去看看。多年来,随着一些新的有用特性的增加,用户体验得到了改善。
+
+- [Puppy Linux][44]
+
+#### Solus Budgie
+
+![][45]
+
+在最近的一个主要版本——[Solus 4 Fortitude][46] 之后,它是一个令人印象深刻的轻量级桌面操作系统。你可以选择像 GNOME 或 MATE 这样的桌面环境。然而,Solus Budgie 恰好是我的最爱之一,它是一款适合初学者的功能齐全的 Linux发行版,同时对系统资源要求很少。
+
+- [Solus][47]
+
+#### Bodhi
+
+![][48]
+
+Bodhi Linux 构建于 Ubuntu 之上。然而,与Ubuntu不同,它在较旧的配置上运行良好。
+
+这个发行版的主要亮点是它的 [Moksha 桌面][49](这是 Enlightenment 17 桌面的延续)。用户体验直观且反应极快。即使我个人不用它,你也应该在你的旧系统上试一试。
+
+- [Bodhi Linux][50]
+
+#### antiX
+
+![][51]
+
+antiX 部分担起了 MX Linux 的责任,它是一个轻量级的 Linux 发行版,为新的或旧的计算机量身定制。其用户界面并不令人印象深刻——但它可以像预期的那样工作。
+
+它基于 Debian,可以作为一个现场版 CD 发行版使用,而不需要安装它。antiX 还提供现场版引导加载程序。与其他发行版相比,你可以保存设置,这样就不会在每次重新启动时丢失设置。不仅如此,你还可以通过其“持久保留”功能将更改保存到根目录中。
+
+因此,如果你正在寻找一个可以在旧硬件上提供快速用户体验的现场版 USB 发行版,antiX 是一个不错的选择。
+
+- [antiX][52]
+
+#### Sparky Linux
+
+![][53]
+
+Sparky Linux 基于 Debian,它是理想的低端系统 Linux 发行版。伴随着超快的用户体验,Sparky Linux 为不同的用户提供了几个特殊版本(或变种)。
+
+例如,它提供了针对一组用户的稳定版本(和变种)和滚动版本。Sparky Linux GameOver 版非常受游戏玩家欢迎,因为它包含了一堆预装的游戏。你可以查看我们的[最佳 Linux 游戏发行版][54] —— 如果你也想在你的系统上玩游戏。
+
+#### 其他选择
+
+你也可以尝试 [Linux Lite][55]、[Lubuntu][56]、[Peppermint][57] 等轻量级 Linux 发行版。
+
+### 面向高级用户的最佳 Linux 发行版
+
+一旦你习惯了各种软件包管理器和命令来帮助你解决任何问题,你就可以开始找寻只为高级用户量身定制的 Linux 发行版。
+
+当然,如果你是专业人士,你会有一套具体的要求。然而,如果你已经作为普通用户使用了一段时间——以下发行版值得一试。
+
+#### Arch Linux
+
+![][58]
+
+Arch Linux 本身是一个简单而强大的发行版,具有陡峭的学习曲线。不像其系统,你不会一次就把所有东西都预先安装好。你必须配置系统并根据需要添加软件包。
+
+此外,在安装 Arch Linux 时,必须按照一组命令来进行(没有图形用户界面)。要了解更多信息,你可以按照我们关于[如何安装 Arch Linux][59] 的指南进行操作。如果你要安装它,你还应该知道在[安装 Arch Linux 后需要做的一些基本事情][60]。这会帮助你快速入门。
+
+除了多才多艺和简便性之外,值得一提的是 Arch Linux 背后的社区非常活跃。所以,如果你遇到问题,你不用担心。
+
+- [Arch Linux][61]
+
+#### Gentoo
+
+![][62]
+
+如果你知道如何编译源代码,Gentoo Linux 是你必须尝试的版本。这也是一个轻量级的发行版,但是,你需要具备必要的技术知识才能使它发挥作用。
+
+当然,[官方手册][63]提供了许多你需要知道的信息。但是,如果你不确定自己在做什么——你需要花很多时间去想如何充分利用它。
+
+- [Gentoo Linux][64]
+
+#### Slackware
+
+![][65]
+
+Slackware 是仍然重要的最古老的 Linux 发行版之一。如果你愿意编译或开发软件来为自己建立一个完美的环境 —— Slackware 是一个不错的选择。
+
+如果你对一些最古老的 Linux 发行版感到好奇,我们有一篇关于[最早的 Linux 发行版][66]可以去看看。
+
+尽管使用它的用户/开发人员的数量已经显著减少,但对于高级用户来说,它仍然是一个极好的选择。此外,最近有个新闻是 [Slackware 有了一个 Patreon 捐赠页面][67],我们希望 Slackware 继续作为最好的 Linux 发行版之一存在。
+
+- [Slackware][68]
+
+### 最佳多用途 Linux 发行版
+
+有些 Linux 发行版既可以作为初学者友好的桌面又可以作为高级操作系统的服务器。因此,我们考虑为这样的发行版编辑一个单独的部分。
+
+如果你不同意我们的观点(或者有建议要补充),请在评论中告诉我们。我们认为,这对于每个用户都可以派上用场:
+
+#### Fedora
+
+![][69]
+
+Fedora 提供两个独立的版本:一个用于台式机/笔记本电脑(Fedora 工作站),另一个用于服务器(Fedora 服务器)。
+
+因此,如果你正在寻找一款时髦的桌面操作系统,有点学习曲线,又对用户友好,那么 Fedora 是一个选择。无论是哪种情况,如果你正在为你的服务器寻找一个 Linux 操作系统,这也是一个不错的选择。
+
+- [Fedora][70]
+
+#### Manjaro
+
+![][71]
+
+Manjaro 基于 [Arch Linux][72]。不用担心,虽然 Arch Linux 是为高级用户量身定制的,但Manjaro 让新手更容易上手。这是一个简单且对初学者友好的 Linux 发行版。用户界面足够好,并且内置了一系列有用的图形用户界面应用程序。
+
+下载时,你可以为 Manjaro 选择[桌面环境][73]。就个人而言,我喜欢 Manjaro 的 KDE 桌面。
+
+- [Manjaro Linux][74]
+
+#### Debian
+
+![][75]
+
+嗯,Ubuntu 是基于 Debian 的——所以它本身是一个非常好的发行版本。Debian 是台式机和服务器的理想选择。
+
+这可能不是对初学者最友好的操作系统——但你可以通过阅读[官方文档][76]轻松开始。[Debian 10 Buster][77] 的最新版本引入了许多变化和必要的改进。所以,你必须试一试!
+
+### 总结
+
+总的来说,这些是我们推荐你去尝试的最好的 Linux 发行版。是的,还有许多其他的 Linux 发行版值得一提,但是根据个人喜好,对每个发行版来说,取决于个人喜好,这种选择是主观的。
+
+但是,我们也为 [Windows 用户][78]、[黑客和脆弱性测试人员][41]、[游戏玩家][54]、[程序员][39]和[偏重隐私者][79]提供了单独的发行版列表所以,如果你感兴趣的话请仔细阅读。
+
+如果你认为我们遗漏了你最喜欢的 Linux 发行版,请在下面的评论中告诉我们你的想法,我们将更新这篇文章。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/best-linux-distributions/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[heguangzhi](https://github.com/heguangzhi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: tmp.NoRXbIWHkg#for-beginners
+[2]: tmp.NoRXbIWHkg#for-servers
+[3]: tmp.NoRXbIWHkg#for-old-computers
+[4]: tmp.NoRXbIWHkg#for-advanced-users
+[5]: tmp.NoRXbIWHkg#general-purpose
+[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/install-google-chrome-ubuntu-10.jpg?ssl=1
+[7]: https://itsfoss.com/install-themes-ubuntu/
+[8]: https://itsfoss.com/tag/ubuntu/
+[9]: https://ubuntu.com/download/desktop
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/linux-Mint-19-desktop.jpg?ssl=1
+[11]: https://www.linuxmint.com/
+[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/elementary-os-juno-feat.jpg?ssl=1
+[13]: https://itsfoss.com/things-to-do-after-installing-elementary-os-5-juno/
+[14]: https://elementary.io/
+[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/mx-linux.jpg?ssl=1
+[16]: https://distrowatch.com/
+[17]: https://en.wikipedia.org/wiki/Linux_distribution#Rolling_distributions
+[18]: https://flatpak.org/
+[19]: https://mxlinux.org/
+[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/zorin-os-15.png?ssl=1
+[21]: https://itsfoss.com/zorin-os-15-release/
+[22]: https://itsfoss.com/zorin-os-interview/
+[23]: https://zorinos.com/
+[24]: https://www.deepin.org/en/
+[25]: https://itsfoss.com/ubuntu-vs-fedora/
+[26]: https://ubuntu.com/download/cloud
+[27]: https://w3techs.com/technologies/details/os-linux/all/all
+[28]: https://thecloudmarket.com/stats
+[29]: https://ubuntu.com/download/server
+[30]: https://developers.redhat.com/products/rhel/docs-and-apis
+[31]: https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux
+[32]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/SUSE-Linux-Enterprise.jpg?ssl=1
+[33]: https://www.suse.com/products/server/
+[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/centos.png?ssl=1
+[35]: https://www.centos.org/
+[36]: https://getfedora.org/en/server/
+[37]: https://www.debian.org/distrib/
+[38]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/coding.jpg?ssl=1
+[39]: https://itsfoss.com/best-linux-distributions-progammers/
+[40]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/hacking.jpg?ssl=1
+[41]: https://itsfoss.com/linux-hacking-penetration-testing/
+[42]: https://itsfoss.com/lightweight-linux-beginners/
+[43]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/puppy-linux-bionic.jpg?ssl=1
+[44]: http://puppylinux.com/
+[45]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/solus-4-featured.jpg?resize=800%2C450&ssl=1
+[46]: https://itsfoss.com/solus-4-release/
+[47]: https://getsol.us/home/
+[48]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/bodhi-linux.png?fit=800%2C436&ssl=1
+[49]: http://www.bodhilinux.com/moksha-desktop/
+[50]: http://www.bodhilinux.com/
+[51]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2017/10/antix-linux-screenshot.jpg?ssl=1
+[52]: https://antixlinux.com/
+[53]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/sparky-linux.jpg?ssl=1
+[54]: https://itsfoss.com/linux-gaming-distributions/
+[55]: https://www.linuxliteos.com/
+[56]: https://lubuntu.me/
+[57]: https://peppermintos.com/
+[58]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/arch_linux_screenshot.jpg?ssl=1
+[59]: https://itsfoss.com/install-arch-linux/
+[60]: https://itsfoss.com/things-to-do-after-installing-arch-linux/
+[61]: https://www.archlinux.org
+[62]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/gentoo-linux.png?ssl=1
+[63]: https://wiki.gentoo.org/wiki/Handbook:Main_Page
+[64]: https://www.gentoo.org
+[65]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/slackware-screenshot.jpg?ssl=1
+[66]: https://itsfoss.com/earliest-linux-distros/
+[67]: https://distrowatch.com/dwres.php?resource=showheadline&story=8743
+[68]: http://www.slackware.com/
+[69]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/fedora-overview.png?ssl=1
+[70]: https://getfedora.org/
+[71]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/manjaro-gnome.jpg?ssl=1
+[72]: https://www.archlinux.org/
+[73]: https://itsfoss.com/glossary/desktop-environment/
+[74]: https://manjaro.org/
+[75]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/debian-screenshot.png?ssl=1
+[76]: https://www.debian.org/releases/stable/installmanual
+[77]: https://itsfoss.com/debian-10-buster/
+[78]: https://itsfoss.com/windows-like-linux-distributions/
+[79]: https://itsfoss.com/privacy-focused-linux-distributions/
diff --git a/published/201909/20190901 Different Ways to Configure Static IP Address in RHEL 8.md b/published/201909/20190901 Different Ways to Configure Static IP Address in RHEL 8.md
new file mode 100644
index 0000000000..d67e035961
--- /dev/null
+++ b/published/201909/20190901 Different Ways to Configure Static IP Address in RHEL 8.md
@@ -0,0 +1,237 @@
+[#]: collector: (lujun9972)
+[#]: translator: (heguangzhi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11390-1.html)
+[#]: subject: (Different Ways to Configure Static IP Address in RHEL 8)
+[#]: via: (https://www.linuxtechi.com/configure-static-ip-address-rhel8/)
+[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/)
+
+在 RHEL8 配置静态 IP 地址的不同方法
+======
+
+在 Linux 服务器上工作时,在网卡/以太网卡上分配静态 IP 地址是每个 Linux 工程师的常见任务之一。如果一个人在 Linux 服务器上正确配置了静态地址,那么他/她就可以通过网络远程访问它。在本文中,我们将演示在 RHEL 8 服务器网卡上配置静态 IP 地址的不同方法。
+
+
+
+以下是在网卡上配置静态IP的方法:
+
+ * `nmcli`(命令行工具)
+ * 网络脚本文件(`ifcfg-*`)
+ * `nmtui`(基于文本的用户界面)
+
+### 使用 nmcli 命令行工具配置静态 IP 地址
+
+每当我们安装 RHEL 8 服务器时,就会自动安装命令行工具 `nmcli`,它是由网络管理器使用的,可以让我们在以太网卡上配置静态 IP 地址。
+
+运行下面的 `ip addr` 命令,列出 RHEL 8 服务器上的以太网卡
+
+```
+[root@linuxtechi ~]# ip addr
+```
+
+正如我们在上面的命令输出中看到的,我们有两个网卡 `enp0s3` 和 `enp0s8`。当前分配给网卡的 IP 地址是通过 DHCP 服务器获得的。
+
+假设我们希望在第一个网卡 (`enp0s3`) 上分配静态 IP 地址,具体内容如下:
+
+ * IP 地址 = 192.168.1.4
+ * 网络掩码 = 255.255.255.0
+ * 网关 = 192.168.1.1
+ * DNS = 8.8.8.8
+
+依次运行以下 `nmcli` 命令来配置静态 IP,
+
+使用 `nmcli connection` 命令列出当前活动的以太网卡,
+
+```
+[root@linuxtechi ~]# nmcli connection
+NAME UUID TYPE DEVICE
+enp0s3 7c1b8444-cb65-440d-9bf6-ea0ad5e60bae ethernet enp0s3
+virbr0 3020c41f-6b21-4d80-a1a6-7c1bd5867e6c bridge virbr0
+[root@linuxtechi ~]#
+```
+
+使用下面的 `nmcli` 给 `enp0s3` 分配静态 IP。
+
+**命令语法:**
+
+```
+# nmcli connection modify ipv4.address
+```
+
+**注意:** 为了简化语句,在 `nmcli` 命令中,我们通常用 `con` 关键字替换 `connection`,并用 `mod` 关键字替换 `modify`。
+
+将 IPv4 地址 (192.168.1.4) 分配给 `enp0s3` 网卡上,
+
+```
+[root@linuxtechi ~]# nmcli con mod enp0s3 ipv4.addresses 192.168.1.4/24
+```
+
+使用下面的 `nmcli` 命令设置网关,
+
+```
+[root@linuxtechi ~]# nmcli con mod enp0s3 ipv4.gateway 192.168.1.1
+```
+
+设置手动配置(从 dhcp 到 static),
+
+```
+[root@linuxtechi ~]# nmcli con mod enp0s3 ipv4.method manual
+```
+
+设置 DNS 值为 “8.8.8.8”,
+
+```
+[root@linuxtechi ~]# nmcli con mod enp0s3 ipv4.dns "8.8.8.8"
+```
+
+要保存上述更改并重新加载,请执行如下 `nmcli` 命令,
+
+```
+[root@linuxtechi ~]# nmcli con up enp0s3
+Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
+```
+
+以上命令显示网卡 `enp0s3` 已成功配置。我们使用 `nmcli` 命令做的那些更改都将永久保存在文件 `etc/sysconfig/network-scripts/ifcfg-enp0s3` 里。
+
+```
+[root@linuxtechi ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s3
+```
+
+![ifcfg-enp0s3-file-rhel8][2]
+
+要确认 IP 地址是否分配给了 `enp0s3` 网卡了,请使用以下 IP 命令查看,
+
+```
+[root@linuxtechi ~]#ip addr show enp0s3
+```
+
+### 使用网络脚本文件(ifcfg-*)手动配置静态 IP 地址
+
+我们可以使用配置以太网卡的网络脚本或 `ifcfg-*` 文件来配置以太网卡的静态 IP 地址。假设我们想在第二个以太网卡 `enp0s8` 上分配静态 IP 地址:
+
+* IP 地址 = 192.168.1.91
+* 前缀 = 24
+* 网关 =192.168.1.1
+* DNS1 =4.2.2.2
+
+
+转到目录 `/etc/sysconfig/network-scripts`,查找文件 `ifcfg-enp0s8`,如果它不存在,则使用以下内容创建它,
+
+```
+[root@linuxtechi ~]# cd /etc/sysconfig/network-scripts/
+[root@linuxtechi network-scripts]# vi ifcfg-enp0s8
+TYPE="Ethernet"
+DEVICE="enp0s8"
+BOOTPROTO="static"
+ONBOOT="yes"
+NAME="enp0s8"
+IPADDR="192.168.1.91"
+PREFIX="24"
+GATEWAY="192.168.1.1"
+DNS1="4.2.2.2"
+```
+
+保存并退出文件,然后重新启动网络管理器服务以使上述更改生效,
+
+```
+[root@linuxtechi network-scripts]# systemctl restart NetworkManager
+```
+
+现在使用下面的 `ip` 命令来验证 IP 地址是否分配给网卡,
+
+```
+[root@linuxtechi ~]# ip add show enp0s8
+3: enp0s8: mtu 1500 qdisc fq_codel state UP group default qlen 1000
+ link/ether 08:00:27:7c:bb:cb brd ff:ff:ff:ff:ff:ff
+ inet 192.168.1.91/24 brd 192.168.1.255 scope global noprefixroute enp0s8
+ valid_lft forever preferred_lft forever
+ inet6 fe80::a00:27ff:fe7c:bbcb/64 scope link
+ valid_lft forever preferred_lft forever
+[root@linuxtechi ~]#
+```
+
+以上输出内容确认静态 IP 地址已在网卡 `enp0s8` 上成功配置了。
+
+### 使用 nmtui 实用程序配置静态 IP 地址
+
+`nmtui` 是一个基于文本用户界面的,用于控制网络的管理器,当我们执行 `nmtui` 时,它将打开一个基于文本的用户界面,通过它我们可以添加、修改和删除连接。除此之外,`nmtui` 还可以用来设置系统的主机名。
+
+假设我们希望通过以下细节将静态 IP 地址分配给网卡 `enp0s3` ,
+
+* IP 地址 = 10.20.0.72
+* 前缀 = 24
+* 网关 = 10.20.0.1
+* DNS1 = 4.2.2.2
+
+运行 `nmtui` 并按照屏幕说明操作,示例如下所示,
+
+```
+[root@linuxtechi ~]# nmtui
+```
+
+![nmtui-rhel8][3]
+
+选择第一个选项 “Edit a connection”,然后选择接口为 “enp0s3”,
+
+![Choose-interface-nmtui-rhel8][4]
+
+选择 “Edit”,然后指定 IP 地址、前缀、网关和域名系统服务器 IP,
+
+![set-ip-nmtui-rhel8][5]
+
+选择确定,然后点击回车。在下一个窗口中,选择 “Activate a connection”,
+
+![Activate-option-nmtui-rhel8][6]
+
+选择 “enp0s3”,选择 “Deactivate” 并点击回车,
+
+![Deactivate-interface-nmtui-rhel8][7]
+
+现在选择 “Activate” 并点击回车,
+
+![Activate-interface-nmtui-rhel8][8]
+
+选择 “Back”,然后选择 “Quit”,
+
+![Quit-Option-nmtui-rhel8][9]
+
+使用下面的 `ip` 命令验证 IP 地址是否已分配给接口 `enp0s3`,
+
+```
+[root@linuxtechi ~]# ip add show enp0s3
+2: enp0s3: mtu 1500 qdisc fq_codel state UP group default qlen 1000
+ link/ether 08:00:27:53:39:4d brd ff:ff:ff:ff:ff:ff
+ inet 10.20.0.72/24 brd 10.20.0.255 scope global noprefixroute enp0s3
+ valid_lft forever preferred_lft forever
+ inet6 fe80::421d:5abf:58bd:c47e/64 scope link noprefixroute
+ valid_lft forever preferred_lft forever
+[root@linuxtechi ~]#
+```
+
+以上输出内容显示我们已经使用 `nmtui` 实用程序成功地将静态 IP 地址分配给接口 `enp0s3`。
+
+以上就是本教程的全部内容,我们已经介绍了在 RHEL 8 系统上为以太网卡配置 IPv4 地址的三种不同方法。请在下面的评论部分分享反馈和评论。
+
+--------------------------------------------------------------------------------
+
+via: https://www.linuxtechi.com/configure-static-ip-address-rhel8/
+
+作者:[Pradeep Kumar][a]
+选题:[lujun9972][b]
+译者:[heguangzhi](https://github.com/heguangzhi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linuxtechi.com/author/pradeep/
+[b]: https://github.com/lujun9972
+[1]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Configure-Static-IP-RHEL8.jpg
+[2]: https://www.linuxtechi.com/wp-content/uploads/2019/09/ifcfg-enp0s3-file-rhel8.jpg
+[3]: https://www.linuxtechi.com/wp-content/uploads/2019/09/nmtui-rhel8.jpg
+[4]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Choose-interface-nmtui-rhel8.jpg
+[5]: https://www.linuxtechi.com/wp-content/uploads/2019/09/set-ip-nmtui-rhel8.jpg
+[6]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Activate-option-nmtui-rhel8.jpg
+[7]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Deactivate-interface-nmtui-rhel8.jpg
+[8]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Activate-interface-nmtui-rhel8.jpg
+[9]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Quit-Option-nmtui-rhel8.jpg
diff --git a/published/201909/20190902 Why I use Java.md b/published/201909/20190902 Why I use Java.md
new file mode 100644
index 0000000000..d4ec8d6570
--- /dev/null
+++ b/published/201909/20190902 Why I use Java.md
@@ -0,0 +1,105 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11337-1.html)
+[#]: subject: (Why I use Java)
+[#]: via: (https://opensource.com/article/19/9/why-i-use-java)
+[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen)
+
+我为什么使用 Java
+======
+
+> 根据你的工作需要,可能有比 Java 更好的语言,但是我还没有看到任何能把我拉走的语言。
+
+
+
+我记得我是从 1997 年开始使用 Java 的,就在 [Java 1.1 刚刚发布][2]不久之后。从那时起,总的来说,我非常喜欢用 Java 编程;虽然我得承认,这些日子我经常像在 Java 中编写“严肃的代码”一样编写 [Groovy][3] 脚本。
+
+来自 [FORTRAN][4]、[PL/1][5]、[Pascal][6] 以及最后的 [C 语言][7] 背景,我发现了许多让我喜欢 Java 的东西。Java 是我[面向对象编程][8]的第一次重要实践经验。到那时,我已经编程了大约 20 年,而且可以说我对什么重要、什么不重要有了一些看法。
+
+### 调试是一个关键的语言特性
+
+我真的很讨厌浪费时间追踪由我的代码不小心迭代到数组末尾而导致的模糊错误,特别是在 IBM 大型机上的 FORTRAN 编程时代。另一个不时出现的隐晦问题是调用一个子程序时,该子程序带有一个四字节整数参数,而预期有两个字节;在小端架构上,这通常是一个良性的错误,但在大端机器上,前两个字节的值通常并不总是为零。
+
+在那种批处理环境中进行调试也非常不便,通过核心转储或插入打印语句进行调试,这些语句本身会移动错误的位置甚至使它们消失。
+
+所以我使用 Pascal 的早期体验,先是在 [MTS][9] 上,然后是在 [IBM OS/VS1][10] 上使用相同的 MTS 编译器,让我的生活变得更加轻松。Pascal 的[强类型和静态类型][11]是取得这种胜利的重要组成部分,我使用的每个 Pascal 编译器都会在数组的边界和范围上插入运行时检查,因此错误可以在发生时检测到。当我们在 20 世纪 80 年代早期将大部分工作转移到 Unix 系统时,移植 Pascal 代码是一项简单的任务。
+
+### 适量的语法
+
+但是对于我所喜欢的 Pascal 来说,我的代码很冗长,而且语法似乎要比代码还要多;例如,使用:
+
+```
+if ... then begin ... end else ... end
+```
+
+而不是 C 或类似语言中的:
+
+```
+if (...) { ... } else { ... }
+```
+
+另外,有些事情在 Pascal 中很难完成,在 C 中更容易。但是,当我开始越来越多地使用 C 时,我发现自己遇到了我曾经在 FORTRAN 中遇到的同样类型的错误,例如,超出数组边界。在原始的错误点未检测到数组结束,而仅在程序执行后期才会检测到它们的不利影响。幸运的是,我不再生活在那种批处理环境中,并且手头有很好的调试工具。不过,C 对于我来说有点太灵活了。
+
+当我遇到 [awk][12] 时,我发现它与 C 相比又是另外一种样子。那时,我的很多工作都涉及转换字段数据并创建报告。我发现用 `awk` 加上其他 Unix 命令行工具,如 `sort`、`sed`、`cut`、`join`、`paste`、`comm` 等等,可以做到事情令人吃惊。从本质上讲,这些工具给了我一个像是基于文本文件的关系数据库管理器,这种文本文件具有列式结构,是我们很多字段数据的保存方式。或者,即便不是这种格式,大部分时候也可以从关系数据库或某种二进制格式导出到列式结构中。
+
+`awk` 支持的字符串处理、[正则表达式][13]和[关联数组][14],以及 `awk` 的基本特性(它实际上是一个数据转换管道),非常符合我的需求。当面对二进制数据文件、复杂的数据结构和关键性能需求时,我仍然会转回到 C;但随着我越来越多地使用 `awk`,我发现 C 的非常基础的字符串支持越来越令人沮丧。随着时间的推移,更多的时候我只会在必须时才使用 C,并且在其余的时候里大量使用 `awk`。
+
+### Java 的抽象层级合适
+
+然后是 Java。它看起来相当不错 —— 相对简洁的语法,让人联想到 C,或者这种相似性至少要比 Pascal 或其他任何早期的语言更为明显。它是强类型的,因此很多编程错误会在编译时被捕获。它似乎并不需要过多的面向对象的知识就能起步,这是一件好事,因为我当时对 [OOP 设计模式][15]毫不熟悉。但即使在刚刚开始,我也喜欢它的简化[继承模型][16]背后的思想。(Java 允许使用提供的接口进行单继承,以在某种程度上丰富范例。)
+
+它似乎带有丰富的功能库(即“自备电池”的概念),在适当的水平上直接满足了我的需求。最后,我发现自己很快就会想到将数据和行为在对象中组合在一起的想法。这似乎是明确控制数据之间交互的好方法 —— 比大量的参数列表或对全局变量的不受控制的访问要好得多。
+
+从那以后,Java 在我的编程工具箱中成为了 Helvetic 军刀。我仍然偶尔会在 `awk` 中编写程序,或者使用 Linux 命令行实用程序(如 `cut`、`sort` 或 `sed`),因为它们显然是解决手头问题的直接方法。我怀疑过去 20 年我可能没写过 50 行的 C 语言代码;Java 完全满足了我的需求。
+
+此外,Java 一直在不断改进。首先,它变得更加高效。并且它添加了一些非常有用的功能,例如[可以用 try 来测试资源][17],它可以很好地清理在文件 I/O 期间冗长而有点混乱的错误处理代码;或 [lambda][18],它提供了声明函数并将其作为参数传递的能力,而旧方法需要创建类或接口来“托管”这些函数;或[流][19],它在函数中封装了迭代行为,可以创建以链式函数调用形式实现的高效数据转换管道。
+
+### Java 越来越好
+
+许多语言设计者研究了从根本上改善 Java 体验的方法。对我来说,其中大部分没有引起我的太多兴趣;再次,这更多地反映了我的典型工作流程,并且(更多地)减少了这些语言带来的功能。但其中一个演化步骤已经成为我的编程工具中不可或缺的一部分:[Groovy][20]。当我遇到一个小问题,需要一个简单的解决方案时,Groovy 已经成为了我的首选。而且,它与 Java 高度兼容。对我来说,Groovy 填补了 Python 为许多其他人所提供的相同用处 —— 它紧凑、DRY(不要重复自己)和具有表达性(列表和词典有完整的语言支持)。我还使用了 [Grails][21],它使用 Groovy 为非常高性能和有用的 Java Web 应用程序提供简化的 Web 框架。
+
+### Java 仍然开源吗?
+
+最近,对 [OpenJDK][22] 越来越多的支持进一步提高了我对 Java 的舒适度。许多公司以各种方式支持 OpenJDK,包括 [AdoptOpenJDK、Amazon 和 Red Hat][23]。在我的一个更大、更长期的项目中,我们使用 AdoptOpenJDK [来在几个桌面平台上生成自定义的运行时环境][24]。
+
+有没有比 Java 更好的语言?我确信有,这取决于你的工作需要。但我一直对 Java 非常满意,我还没有遇到任何可能会让我失望的东西。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/why-i-use-java
+
+作者:[Chris Hermansen][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/clhermansen
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/java-coffee-beans.jpg?itok=3hkjX5We (Coffee beans)
+[2]: https://en.wikipedia.org/wiki/Java_version_history
+[3]: https://en.wikipedia.org/wiki/Apache_Groovy
+[4]: https://en.wikipedia.org/wiki/Fortran
+[5]: https://en.wikipedia.org/wiki/PL/I
+[6]: https://en.wikipedia.org/wiki/Pascal_(programming_language)
+[7]: https://en.wikipedia.org/wiki/C_(programming_language)
+[8]: https://en.wikipedia.org/wiki/Object-oriented_programming
+[9]: https://en.wikipedia.org/wiki/Michigan_Terminal_System
+[10]: https://en.wikipedia.org/wiki/OS/VS1
+[11]: https://stackoverflow.com/questions/11889602/difference-between-strong-vs-static-typing-and-weak-vs-dynamic-typing
+[12]: https://en.wikipedia.org/wiki/AWK
+[13]: https://en.wikipedia.org/wiki/Regular_expression
+[14]: https://en.wikipedia.org/wiki/Associative_array
+[15]: https://opensource.com/article/19/7/understanding-software-design-patterns
+[16]: https://www.w3schools.com/java/java_inheritance.asp
+[17]: https://www.baeldung.com/java-try-with-resources
+[18]: https://www.baeldung.com/java-8-lambda-expressions-tips
+[19]: https://www.tutorialspoint.com/java8/java8_streams
+[20]: https://groovy-lang.org/
+[21]: https://grails.org/
+[22]: https://openjdk.java.net/
+[23]: https://en.wikipedia.org/wiki/OpenJDK
+[24]: https://opensource.com/article/19/4/java-se-11-removing-jnlp
diff --git a/translated/tech/20190903 5 open source speed-reading applications.md b/published/201909/20190903 5 open source speed-reading applications.md
similarity index 75%
rename from translated/tech/20190903 5 open source speed-reading applications.md
rename to published/201909/20190903 5 open source speed-reading applications.md
index 8aa2911166..ef922bf1e8 100644
--- a/translated/tech/20190903 5 open source speed-reading applications.md
+++ b/published/201909/20190903 5 open source speed-reading applications.md
@@ -1,20 +1,22 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11316-1.html)
[#]: subject: (5 open source speed-reading applications)
[#]: via: (https://opensource.com/article/19/8/speed-reading-open-source)
[#]: author: (Jaouhari Youssef https://opensource.com/users/jaouhari)
5 个开源的速读应用
======
-使用这五个应用训练自己更快地阅读文本。
-![stack of books][1]
-英国散文家和政治家 [Joseph Addison][2] 曾经说过,“读书益智,运动益体。”如今,我们大多数人(如果不是全部)都是通过计算机显示器、电视屏幕、移动设备、街道标志、报纸、杂志上阅读,以及在工作和学校阅读论文来训练我们的大脑。
+> 使用这五个应用训练自己更快地阅读文本。
-鉴于我们每天都会收到大量的书面信息,通过做一些挑战我们经典阅读习惯并教会我们吸收更多内容和数据的特定练习来训练我们的大脑以便更快地阅读似乎是有利的。学习这些技能的目的不仅仅是浏览文本,因为没有理解的阅读就是浪费精力。目标是提高你的阅读速度,同时仍然达到高水平的理解。
+
+
+英国散文家和政治家 [Joseph Addison][2] 曾经说过,“读书益智,运动益体。”如今,我们大多数人(如果不是全部)都是通过计算机显示器、电视屏幕、移动设备、街道标志、报纸、杂志上阅读,以及在工作场所和学校阅读论文来训练我们的大脑。
+
+鉴于我们每天都会收到大量的书面信息,通过做一些挑战我们经典的阅读习惯并教会我们吸收更多内容和数据的特定练习,来训练我们的大脑以便更快地阅读似乎是有利的。学习这些技能的目的不仅仅是浏览文本,因为没有理解的阅读就是浪费精力。目标是提高你的阅读速度,同时仍然达到高水平的理解。
### 阅读和处理输入
@@ -22,13 +24,11 @@
1. 固定
2. 处理
- 3. [扫视][3]
-
-
+ 3. [扫视][3]
在第一步,我们确定文本中的固定点,称为最佳识别点。在第二步中,我们在眼睛固定的同时引入(处理)新信息。最后,我们改变注视点的位置,这是一种称为扫视的操作,此时未获取任何新信息。
-在实践中,阅读较快读者之间的主要差异是固定时间短于平均值,更长距离扫视,重读更少。
+在实践中,阅读更快的读者之间的主要差异是固定时间短于平均值,更长距离扫视,重读更少。
### 阅读练习
@@ -36,7 +36,7 @@
第一项练习包括减少默读,也被称为无声语音,这是一种在阅读时内部发音的习惯。它是一个减慢阅读速度的自然过程,因为阅读速度限于语速。减少默读的关键是只说出一些阅读的单词。一种方法是用其他任务来占据内部声音,例如用口香糖。
-第二个练习包括减少回归或重读。回归是一种懒惰的机制,因为我们的大脑可以随时重读任何材料,从而降低注意力。
+第二个练习包括减少回归,或称为重读。回归是一种懒惰的机制,因为我们的大脑可以随时重读任何材料,从而降低注意力。
### 5 个开源应用来训练你的大脑
@@ -48,14 +48,13 @@
对于 Android 用户,[Comfort Reader][7] 是一个开源的速读应用。它可以在 [F-droid][8] 和 [Google Play][9] 应用商店中找到。
-我最喜欢的应用是 [Speedread][10],它是一个简单的终端程序,它可以在最佳阅读点逐字显示文本。要安装它,请在你的设备上克隆 Github 仓库,然后输入相应的命令来选择以喜好的每分钟字数 (WPM)来阅读文档。默认速率为 250 WPM。例如,要以 400 WPM 阅读 _your_text_file.txt_,你应该输入:
-
+我最喜欢的应用是 [Speedread][10],它是一个简单的终端程序,它可以在最佳阅读点逐字显示文本。要安装它,请在你的设备上克隆 Github 仓库,然后输入相应的命令来选择以喜好的每分钟字数 (WPM)来阅读文档。默认速率为 250 WPM。例如,要以 400 WPM 阅读 `your_text_file.txt`,你应该输入:
```
`cat your_text_file.txt | ./speedread -w 400`
```
-下面是程序的运行界面:
+下面是该程序的运行界面:
![Speedread demo][11]
@@ -63,7 +62,7 @@
### 其他方案
-开源社区的一个有趣项目是构建一个解决方案,它仅为了通过使用特定练习来提高阅读速度,以此改进如默读和重读。我相信这个项目会非常有益,因为在当今信息丰富的环境中,提高阅读速度非常有价值。
+对于开源社区来说,构建一个解决方案是一个有趣的项目,它仅为了通过使用特定练习来提高阅读速度,以此改进如默读和重读。我相信这个项目会非常有益,因为在当今信息丰富的环境中,提高阅读速度非常有价值。
--------------------------------------------------------------------------------
@@ -72,7 +71,7 @@ via: https://opensource.com/article/19/8/speed-reading-open-source
作者:[Jaouhari Youssef][a]
选题:[lujun9972][b]
译者:[geekpi](https://github.com/geekpi)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/201909/20190903 An introduction to Hyperledger Fabric.md b/published/201909/20190903 An introduction to Hyperledger Fabric.md
new file mode 100644
index 0000000000..3bd8f72221
--- /dev/null
+++ b/published/201909/20190903 An introduction to Hyperledger Fabric.md
@@ -0,0 +1,104 @@
+[#]: collector: (lujun9972)
+[#]: translator: (Morisun029)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11328-1.html)
+[#]: subject: (An introduction to Hyperledger Fabric)
+[#]: via: (https://opensource.com/article/19/9/introduction-hyperledger-fabric)
+[#]: author: (Matt Zand https://opensource.com/users/mattzandhttps://opensource.com/users/ron-mcfarlandhttps://opensource.com/users/wonderchook)
+
+Hyperledger Fabric 介绍
+======
+
+> Hyperledger (超级账本)是一组开源工具,旨在构建一个强大的、业务驱动的区块链框架。
+
+
+
+[Hyperledger][2] (超级账本)是区块链行业中最大的项目之一,它由一组开源工具和多个子项目组成。该项目是由 Linux 基金会主办的一个全球协作项目,其中包括一些不同领域的领导者们,这些领导者们的目标是建立一个强大的、业务驱动的区块链框架。
+
+区块链网络主要有三种类型:公共区块链、联盟或联合区块链,以及私有区块链。Hyperledger 是一个区块链框架,旨在帮助公司建立私人或联盟许可的区块链网络,在该网络中,多个组织可以共享控制和操作网络内节点的权限。
+
+因为区块链是一个透明的,基于不可变模式的安全的去中心化系统,所以它被认为是传统的供应链行业改变游戏规则的一种解决方案。它可以通过以下方式支持有效的供应链系统:
+
+* 跟踪整个区块链中的产品
+* 校验和验证区块链中的产品
+* 在供应链参与者之间共享整个区块链的信息
+* 提供可审核性
+
+本文通过食品供应链的例子来解释 Hyperledger 区块链是如何改变传统供应链系统的。
+
+### 食品行业供应链
+
+传统供应链效率低下的主要原因是由于缺乏透明度而导致报告不可靠和竞争上的劣势。
+
+在传统的供应链模式中,有关实体的信息对该区块链中的其他人来说并不完全透明,这就导致了不准确的报告和缺乏互操作性问题。电子邮件和印刷文档提供了一些信息,但它们不可能包含完整详细的可见性数据,因为很难在整个供应链中去追踪产品。这也使消费者几乎不可能知道产品的真正价值和来源。
+
+食品行业的供应链环境复杂,多个参与者需要协作将货物运送到最终目的地 —— 客户手中。下图显示了食品供应链(多级)网络中的主要参与者。
+
+![典型的食品供应链][3]
+
+该区块链的每个阶段都会引入潜在的安全问题、整合问题和其他低效问题。目前食品供应链中的主要威胁仍然是假冒食品和食品欺诈。
+
+基于 Hyperledger 区块链的食品跟踪系统可实现对食品信息全面的可视性和和可追溯性。更重要的是,它以一种不变但可行的方式来记录产品细节,确保食品信息的真实性。最终用户通过在不可变框架上共享产品的详细信息,可以自我验证产品的真实性。
+
+### Hyperledger Fabric
+
+Hyperledger Fabric 是 Hyperledger 项目的基石。它是基于许可的区块链,或者更准确地说是一种分布式分类帐技术(DLT),该技术最初由 IBM 公司和 Digital Asset 创建。分布式分类帐技术被设计为具有不同组件的模块化框架(概述如下)。它也是提供可插入的共识模型的一种灵活的解决方案,尽管它目前仅提供基于投票的许可共识(假设今天的 Hyperledger 网络在部分可信赖的环境中运行)。
+
+鉴于此,无需匿名矿工来验证交易,也无需用作激励措施的相关货币。所有的参与者必须经过身份验证才能参与到该区块链进行交易。与以太坊一样,Hyperledger Fabric 支持智能合约,在 Hyperledger 中称为 Chaincodes,这些合约描述并执行系统的应用程序逻辑。
+
+然而,与以太坊不同,Hyperledger Fabric 不需要昂贵的挖矿计算来提交交易,因此它有助于构建可以在更短的延迟内进行扩展的区块链。
+
+Hyperledger Fabric 不同于以太坊或比特币这样的区块链,不仅在于它们类型不同,或者说是它与货币无关,而且它们在内部机制方面也不同。以下是典型的 Hyperledger 网络的关键要素:
+
+* 账本:存储了一系列块,这些块保留了所有状态交易的所有不可变历史记录。
+* 节点:区块链的逻辑实体。它有三种类型:
+ * 客户端:是代表用户向网络提交事务的应用程序。
+ * 对等体:是提交交易并维护分类帐状态的实体。
+ * 排序者 在客户端和对等体之间创建共享通信渠道,还将区块链交易打包成块发送给遵从的对等体节点。
+
+除了这些要素,Hyperledger Fabric 还有以下关键设计功能:
+
+* 链码:类似于其它诸如以太坊的网络中的智能合约。它是用一种更高级的语言编写的程序,在针对分类帐当前状态的数据库执行。
+* 通道:用于在多个网络成员之间共享机密信息的专用通信子网。每笔交易都在一个只有经过身份验证和授权的各方可见的通道上执行。
+* 背书人 验证交易,调用链码,并将背书的交易结果返回给调用应用程序。
+* 成员服务提供商(MSP)通过颁发和验证证书来提供身份验证和身份验证过程。MSP 确定信任哪些证书颁发机构(CA)去定义信任域的成员,并确定成员可能扮演的特定角色(成员、管理员等)。
+
+### 如何验证交易
+
+探究一笔交易是如何通过验证的是理解 Hyperledger Fabric 在底层如何工作的好方法。此图显示了在典型的 Hyperledger 网络中处理交易的端到端系统流程:
+
+![Hyperledger 交易验证流程][4]
+
+首先,客户端通过向基于 Hyperledger Fabric 的应用程序客户端发送请求来启动交易,该客户端将交易提议提交给背书对等体。这些对等体通过执行由交易指定的链码(使用该状态的本地副本)来模拟该交易,并将结果发送回应用程序。此时,应用程序将交易与背书相结合,并将其广播给排序服务。排序服务检查背书并为每个通道创建一个交易块,然后将其广播给通道中的其它节点,对的体验证该交易并进行提交。
+
+Hyperledger Fabric 区块链可以通过透明的、不变的和共享的食品来源数据记录、处理数据,及运输细节等信息将食品供应链中的参与者们连接起来。链码由食品供应链中的授权参与者来调用。所有执行的交易记录都永久保存在分类帐中,所有参与者都可以查看此信息。
+
+### Hyperledger Composer
+
+除了 Fabric 或 Iroha 等区块链框架外,Hyperledger 项目还提供了 Composer、Explorer 和 Cello 等工具。 Hyperledger Composer 提供了一个工具集,可帮助你更轻松地构建区块链应用程序。 它包括:
+
+* CTO,一种建模语言
+* Playground,一种基于浏览器的开发工具,用于快速测试和部署
+* 命令行界面(CLI)工具
+
+Composer 支持 Hyperledger Fabric 的运行时和基础架构,在内部,Composer 的 API 使用底层 Fabric 的 API。Composer 在 Fabric 上运行,这意味着 Composer 生成的业务网络可以部署到 Hyperledger Fabric 执行。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/introduction-hyperledger-fabric
+
+作者:[Matt Zand][a]
+选题:[lujun9972][b]
+译者:[Morisun029](https://github.com/Morisun029)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/mattzandhttps://opensource.com/users/ron-mcfarlandhttps://opensource.com/users/wonderchook
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/chain.png?itok=sgAjswFf (Chain image)
+[2]: https://www.hyperledger.org/
+[3]: https://opensource.com/sites/default/files/uploads/foodindustrysupplychain.png (Typical food supply chain)
+[4]: https://opensource.com/sites/default/files/uploads/hyperledger-fabric-transaction-flow.png (Hyperledger transaction validation flow)
+[5]: https://coding-bootcamps.com/ultimate-guide-for-building-a-blockchain-supply-chain-using-hyperledger-fabric-and-composer.html
diff --git a/published/201909/20190903 The birth of the Bash shell.md b/published/201909/20190903 The birth of the Bash shell.md
new file mode 100644
index 0000000000..8102b01097
--- /dev/null
+++ b/published/201909/20190903 The birth of the Bash shell.md
@@ -0,0 +1,102 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11314-1.html)
+[#]: subject: (The birth of the Bash shell)
+[#]: via: (https://opensource.com/19/9/command-line-heroes-bash)
+[#]: author: (Matthew Broberg https://opensource.com/users/mbbroberghttps://opensource.com/users/mbbroberghttps://opensource.com/users/mbbroberghttps://opensource.com/users/mbbroberg)
+
+Bash shell 的诞生
+======
+
+> 本周的《代码英雄》播客深入研究了最广泛使用的、已经成为事实标准的脚本语言,它来自于自由软件基金会及其作者的早期灵感。
+
+![Listen to the Command Line Heroes Podcast][1]
+
+对于任何从事于系统管理员方面的人来说,Shell 脚本编程是一门必不可少的技能,而如今人们编写脚本的主要 shell 是 Bash。Bash 是几乎所有的 Linux 发行版和现代 MacOS 版本的默认配置,也很快就会成为 [Windows 终端][2]的原生部分。你可以说 Bash 无处不在。
+
+那么它是如何做到这一点的呢?本周的《[代码英雄][3]》播客将通过询问编写那些代码的人来深入研究这个问题。
+
+### 肇始于 Unix
+
+像所有编程方面的东西一样,我们必须追溯到 Unix。shell 的简短历史是这样的:1971 年,Ken Thompson 发布了第一个 Unix shell:Thompson shell。但是,脚本用户所能做的存在严重限制,这意味着严重制约了自动化以及整个 IT 运营领域。
+
+这个[奇妙的研究][4]概述了早期尝试脚本的挑战:
+
+> 类似于它在 Multics 中的前身,这个 shell(`/bin/sh`)是一个在内核外执行的独立用户程序。诸如通配(参数扩展的模式匹配,例如 `*.txt`)之类的概念是在一个名为 `glob` 的单独的实用程序中实现的,就像用于计算条件表达式的 `if` 命令一样。这种分离使 shell 变得更小,才不到 900 行的 C 源代码。
+>
+> shell 引入了紧凑的重定向(`<`、`>` 和 `>>`)和管道(`|` 或 `^`)语法,它们已经存在于现代 shell 中。你还可以找到对调用顺序命令(`;`)和异步命令(`&`)的支持。
+>
+> Thompson shell 缺少的是编写脚本的能力。它的唯一目的是作为一个交互式 shell(命令解释器)来调用命令和查看结果。
+
+随着对终端使用的增长,对自动化的兴趣随之增长。
+
+### Bourne shell 前进一步
+
+在 Thompson 发布 shell 六年后,1977 年,Stephen Bourne 发布了 Bourne shell,旨在解决Thompson shell 中的脚本限制。(Chet Ramey 是自 1990 年以来 Bash 语言的主要维护者,在这一集的《代码英雄》中讨论了它)。作为 Unix 系统的一部分,这是这个来自贝尔实验室的技术的自然演变。
+
+Bourne 打算做什么不同的事情?[研究员 M. Jones][4] 很好地概述了它:
+
+> Bourne shell 有两个主要目标:作为命令解释器以交互方式执行操作系统的命令,和用于脚本编程(编写可通过 shell 调用的可重用脚本)。除了替换 Thompson shell,Bourne shell 还提供了几个优于其前辈的优势。Bourne 将控制流、循环和变量引入脚本,提供了更具功能性的语言来(以交互式和非交互式)与操作系统交互。该 shell 还允许你使用 shell 脚本作为过滤器,为处理信号提供集成支持,但它缺乏定义函数的能力。最后,它结合了我们今天使用的许多功能,包括命令替换(使用后引号)和 HERE 文档(以在脚本中嵌入保留的字符串文字)。
+
+Bourne 在[之前的一篇采访中][5]这样描述它:
+
+> 最初的 shell (编程语言)不是一种真正的语言;它是一种记录 —— 一种从文件中线性执行命令序列的方法,唯一的控制流的原语是 `GOTO` 到一个标签。Ken Thompson 所编写的这个最初的 shell 的这些限制非常重要。例如,你无法简单地将命令脚本用作过滤器,因为命令文件本身是标准输入。而在过滤器中,标准输入是你从父进程继承的,不是命令文件。
+>
+> 最初的 shell 很简单,但随着人们开始使用 Unix 进行应用程序开发和脚本编写,它就太有限了。它没有变量、它没有控制流,而且它的引用能力非常不足。
+
+对于脚本编写者来说,这个新 shell 是一个巨大的进步,但前提是你可以使用它。
+
+### 以自由软件来重新构思 Bourne Shell
+
+在此之前,这个占主导地位的 shell 是由贝尔实验室拥有和管理的专有软件。幸运的话,你的大学可能有权访问 Unix shell。但这种限制性访问远非自由软件基金会(FSF)想要实现的世界。
+
+Richard Stallman 和一群志同道合的开发人员那时正在编写所有的 Unix 功能,其带有可以在 GNU 许可证下免费获得的许可。其中一个开发人员的任务是制作一个 shell,那位开发人员是 Brian Fox。他对他的任务的讲述十分吸引我。正如他在播客上所说:
+
+> 它之所以如此具有挑战性,是因为我们必须忠实地模仿 Bourne shell 的所有行为,同时允许扩展它以使其成为一个供人们使用的更好工具。
+
+而那时也恰逢人们在讨论 shell 标准是什么的时候。在这一历史背景和将来的竞争前景下,流行的 Bourne shell 被重新构想,并再次重生。
+
+### 重新打造 Bourne Shell
+
+自由软件的使命和竞争这两个催化剂使重制的 Bourne shell(Bash)具有了生命。和之前不同的是,Fox 并没有把 shell 放到自己的名字之后命名,他专注于从 Unix 到自由软件的演变。(虽然 Fox Shell 这个名字看起来要比 Fish shell 更适合作为 fsh 命令 #missedopportunity)。这个命名选择似乎符合他的个性。正如 Fox 在剧集中所说,他甚至对个人的荣耀也不感兴趣;他只是试图帮助编程文化发展。然而,他并不是一个优秀的双关语。
+
+而 Bourne 也并没有因为他命名 shell 的文字游戏而感到被轻视。Bourne 讲述了一个故事,有人走到他面前,并在会议上给了他一件 Bash T 恤,而那个人是 Brian Fox。
+
+Shell | 发布于 | 创造者
+---|---|---
+Thompson Shell | 1971 | Ken Thompson
+Bourne Shell | 1977 | Stephen Bourne
+Bourne-Again Shell | 1989 | Brian Fox
+
+随着时间的推移,Bash 逐渐成长。其他工程师开始使用它并对其设计进行改进。事实上,多年后,Fox 坚定地认为学会放弃控制 Bash 是他一生中最重要的事情之一。随着 Unix 让位于 Linux 和开源软件运动,Bash 成为开源世界的至关重要的脚本语言。这个伟大的项目似乎超出了单一一个人的愿景范围。
+
+### 我们能从 shell 中学到什么?
+
+shell 是一项技术,它是笔记本电脑日常使用中的一个组成部分,你很容易忘记它也需要发明出来。从 Thompson 到 Bourne 再到 Bash,shell 的故事为我们描绘了一些熟悉的结论:
+
+* 有动力的人可以在正确的使命中取得重大进展。
+* 我们今天所依赖的大部分内容都建立在我们行业中仍然活着的那些传奇人物打下的基础之上。
+* 能够生存下来的软件超越了其原始创作者的愿景。
+
+代码英雄在全部的第三季中讲述了编程语言,并且正在接近它的尾声。[请务必订阅,来了解你想知道的有关编程语言起源的各种内容][3],我很乐意在下面的评论中听到你的 shell 故事。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/19/9/command-line-heroes-bash
+
+作者:[Matthew Broberg][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/mbbroberghttps://opensource.com/users/mbbroberghttps://opensource.com/users/mbbroberghttps://opensource.com/users/mbbroberg
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/commnad_line_hereoes_ep6_blog-header-292x521.png?itok=Bs1RlwoW (Listen to the Command Line Heroes Podcast)
+[2]: https://devblogs.microsoft.com/commandline/introducing-windows-terminal/
+[3]: https://www.redhat.com/en/command-line-heroes
+[4]: https://developer.ibm.com/tutorials/l-linux-shells/
+[5]: https://www.computerworld.com.au/article/279011/-z_programming_languages_bourne_shell_sh
diff --git a/published/201909/20190904 How to build Fedora container images.md b/published/201909/20190904 How to build Fedora container images.md
new file mode 100644
index 0000000000..0ab7ed8684
--- /dev/null
+++ b/published/201909/20190904 How to build Fedora container images.md
@@ -0,0 +1,103 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11327-1.html)
+[#]: subject: (How to build Fedora container images)
+[#]: via: (https://fedoramagazine.org/how-to-build-fedora-container-images/)
+[#]: author: (Clément Verna https://fedoramagazine.org/author/cverna/)
+
+如何构建 Fedora 容器镜像
+======
+
+![][1]
+
+随着容器和容器技术的兴起,现在所有主流的 Linux 发行版都提供了容器基础镜像。本文介绍了 Fedora 项目如何构建其基本镜像。同时还展示了如何使用它来创建分层图像。
+
+### 基础和分层镜像
+
+在看如何构建 Fedora 容器基础镜像之前,让我们定义基础镜像和分层镜像。定义基础镜像的简单方法是没有父镜像层的镜像。但这具体意味着什么呢?这意味着基础镜像通常只包含操作系统的根文件系统基础镜像(rootfs)。基础镜像通常提供安装软件以创建分层镜像所需的工具。
+
+分层镜像在基础镜像上添加了一组层,以便安装、配置和运行应用。分层镜像在 Dockerfile 中使用 `FROM` 指令引用基础镜像:
+
+```
+FROM fedora:latest
+```
+
+### 如何构建基础镜像
+
+Fedora 有一整套用于构建容器镜像的工具。[其中包括 podman][2],它不需要以 root 身份运行。
+
+#### 构建 rootfs
+
+基础镜像主要由一个 [tarball][3] 构成。这个 tarball 包含一个 rootfs。有不同的方法来构建此 rootfs。Fedora 项目使用 [kickstart][4] 安装方式以及 [imagefactory][5] 来创建这些 tarball。
+
+在创建 Fedora 基础镜像期间使用的 kickstart 文件可以在 Fedora 的构建系统 [Koji][6] 中找到。[Fedora-Container-Base][7] 包重新组合了所有基础镜像的构建版本。如果选择了一个构建版本,那么可以访问所有相关文件,包括 kickstart 文件。查看 [示例][8],文件末尾的 `%packages` 部分定义了要安装的所有软件包。这就是让软件放在基础镜像中的方法。
+
+#### 使用 rootfs 构建基础镜像
+
+rootfs 完成后,构建基础镜像就很容易了。它只需要一个包含以下指令的 Dockerfile:
+
+```
+FROM scratch
+ADD layer.tar /
+CMD ["/bin/bash"]
+```
+
+这里的重要部分是 `FROM scratch` 指令,它会创建一个空镜像。然后,接下来的指令将 rootfs 添加到镜像,并设置在运行镜像时要执行的默认命令。
+
+让我们使用 Koji 内置的 Fedora rootfs 构建一个基础镜像:
+
+```
+$ curl -o fedora-rootfs.tar.xz https://kojipkgs.fedoraproject.org/packages/Fedora-Container-Base/Rawhide/20190902.n.0/images/Fedora-Container-Base-Rawhide-20190902.n.0.x86_64.tar.xz
+$ tar -xJvf fedora-rootfs.tar.xz 51c14619f9dfd8bf109ab021b3113ac598aec88870219ff457ba07bc29f5e6a2/layer.tar
+$ mv 51c14619f9dfd8bf109ab021b3113ac598aec88870219ff457ba07bc29f5e6a2/layer.tar layer.tar
+$ printf "FROM scratch\nADD layer.tar /\nCMD [\"/bin/bash\"]" > Dockerfile
+$ podman build -t my-fedora .
+$ podman run -it --rm my-fedora cat /etc/os-release
+```
+
+需要从下载的存档中提取包含 rootfs 的 `layer.tar` 文件。这在 Fedora 生成的镜像已经可以被容器运行时使用才需要。
+
+因此,使用 Fedora 生成的镜像,获得基础镜像会更容易。让我们看看它是如何工作的:
+
+```
+$ curl -O https://kojipkgs.fedoraproject.org/packages/Fedora-Container-Base/Rawhide/20190902.n.0/images/Fedora-Container-Base-Rawhide-20190902.n.0.x86_64.tar.xz
+$ podman load --input Fedora-Container-Base-Rawhide-20190902.n.0.x86_64.tar.xz
+$ podman run -it --rm localhost/fedora-container-base-rawhide-20190902.n.0.x86_64:latest cat /etc/os-release
+```
+
+### 构建分层镜像
+
+要构建使用 Fedora 基础镜像的分层镜像,只需在 `FROM` 行指令中指定 `fedora`:
+
+```
+FROM fedora:latest
+```
+
+`latest` 标记引用了最新的 Fedora 版本(编写本文时是 Fedora 30)。但是可以使用镜像的标签来使用其他版本。例如,`FROM fedora:31` 将使用 Fedora 31 基础镜像。
+
+Fedora 支持将软件作为容器来构建并发布。这意味着你可以维护 Dockerfile 来使其他人可以使用你的软件。关于在 Fedora 中成为容器镜像维护者的更多信息,请查看 [Fedora 容器指南][9]。
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/how-to-build-fedora-container-images/
+
+作者:[Clément Verna][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/cverna/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2019/08/fedoracontainers-816x345.jpg
+[2]: https://linux.cn/article-10156-1.html
+[3]: https://en.wikipedia.org/wiki/Tar_(computing)
+[4]: https://en.wikipedia.org/wiki/Kickstart_(Linux)
+[5]: http://imgfac.org/
+[6]: https://koji.fedoraproject.org/koji/
+[7]: https://koji.fedoraproject.org/koji/packageinfo?packageID=26387
+[8]: https://kojipkgs.fedoraproject.org//packages/Fedora-Container-Base/30/20190902.0/images/koji-f30-build-37420478-base.ks
+[9]: https://docs.fedoraproject.org/en-US/containers/guidelines/guidelines/
diff --git a/published/201909/20190905 How to Change Themes in Linux Mint.md b/published/201909/20190905 How to Change Themes in Linux Mint.md
new file mode 100644
index 0000000000..dd2f69b044
--- /dev/null
+++ b/published/201909/20190905 How to Change Themes in Linux Mint.md
@@ -0,0 +1,97 @@
+[#]: collector: (lujun9972)
+[#]: translator: (qfzy1233)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11359-1.html)
+[#]: subject: (How to Change Themes in Linux Mint)
+[#]: via: (https://itsfoss.com/install-themes-linux-mint/)
+[#]: author: (It's FOSS Community https://itsfoss.com/author/itsfoss/)
+
+如何在 Linux Mint 中更换主题
+======
+
+
+
+一直以来,使用 Cinnamon 桌面环境的 Linux Mint 都是一种卓越的体验。这也是[为何我喜爱 Linux Mint][1]的主要原因之一。
+
+自从 Mint 的开发团队[开始更为严肃的对待设计][2], “桌面主题” 应用便成为了更换新主题、图标、按钮样式、窗口边框以及鼠标指针的重要方式,当然你也可以直接通过它安装新的主题。感兴趣么?让我们开始吧。
+
+### 如何在 Linux Mint 中更换主题
+
+在菜单中搜索主题并打开主题应用。
+
+![Theme Applet provides an easy way of installing and changing themes][3]
+
+在应用中有一个“添加/删除”按钮,非常简单吧。点击它,我们可以看到按流行程度排序的 Cinnamon Spices(Cinnamon 的官方插件库)的主题。
+
+![Installing new themes in Linux Mint Cinnamon][4]
+
+要安装主题,你所要做的就是点击你喜欢的主题,然后等待它下载。之后,主题将在应用第一页的“Desktop”选项中显示可用。只需双击已安装的主题之一就可以开始使用它。
+
+![Changing themes in Linux Mint Cinnamon][5]
+
+下面是默认的 Linux Mint 外观:
+
+![Linux Mint Default Theme][6]
+
+这是在我更换主题之后:
+
+![Linux Mint with Carta Theme][7]
+
+所有的主题都可以在 Cinnamon Spices 网站上获得更多的信息和更大的截图,这样你就可以更好地了解你的系统的外观。
+
+- [浏览 Cinnamon 主题][8]
+
+### 在 Linux Mint 中安装第三方主题
+
+> “我在另一个网站上看到了这个优异的主题,但 Cinnamon Spices 网站上没有……”
+
+Cinnamon Spices 集成了许多优秀的主题,但你仍然会发现,你看到的主题并没有被 Cinnamon Spices 官方网站收录。
+
+这时你可能会想:如果有别的办法就好了,对么?你可能会认为有(我的意思是……当然啦)。首先,我们可以在其他网站上找到一些很酷的主题。
+
+我推荐你去 Cinnamon Look 浏览一下那儿的主题。如果你喜欢什么,就下载吧。
+
+- [在 Cinnamon Look 中获取更多主题][9]
+
+下载了首选主题之后,你现在将得到一个压缩文件,其中包含安装所需的所有内容。提取它并保存到 `~/.themes`。迷糊么? `~` 代表了你的家目录的对应路径:`/home/{YOURUSER}/.themes`。
+
+然后跳转到你的家目录。按 `Ctrl+H` 来[显示 Linux 中的隐藏文件][11]。如果没有看到 `.themes` 文件夹,创建一个新文件夹并命名为 `.themes`。记住,文件夹名称开头的点很重要。
+
+将提取的主题文件夹从下载目录复制到你的家目录中的 `.themes` 文件夹中。
+
+最后,在上面提到的应用中查找已安装的主题。
+
+> 注记
+>
+> 请记住,主题必须是 Cinnamon 相对应的,即使它是一个从 GNOME 复刻的系统也不行,并不是所有的 GNOME 主题都适用于 Cinnamon。
+
+改变主题是 Cinnamon 定制工作的一部分。你还可以[通过更改图标来更改 Linux Mint 的外观][12]。
+
+我希望你现在已经知道如何在 Linux Mint 中更改主题了。快去选取你喜欢的主题吧。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/install-themes-linux-mint/
+
+作者:[It's FOSS][a]
+选题:[lujun9972][b]
+译者:[qfzy1233](https://github.com/qfzy1233)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/itsfoss/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/tiny-features-linux-mint-cinnamon/
+[2]: https://itsfoss.com/linux-mint-new-design/
+[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/install-theme-linux-mint-1.jpg?resize=800%2C625&ssl=1
+[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/install-theme-linux-mint-2.jpg?resize=800%2C625&ssl=1
+[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/install-theme-linux-mint-3.jpg?resize=800%2C450&ssl=1
+[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/linux-mint-default-theme.jpg?resize=800%2C450&ssl=1
+[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/linux-mint-carta-theme.jpg?resize=800%2C450&ssl=1
+[8]: https://cinnamon-spices.linuxmint.com/themes
+[9]: https://www.cinnamon-look.org/
+[10]: https://itsfoss.com/failed-to-start-session-ubuntu-14-04/
+[11]: https://itsfoss.com/hide-folders-and-show-hidden-files-in-ubuntu-beginner-trick/
+[12]: https://itsfoss.com/install-icon-linux-mint/
diff --git a/sources/tech/20190905 How to Get Average CPU and Memory Usage from SAR Reports Using the Bash Script.md b/published/201909/20190905 How to Get Average CPU and Memory Usage from SAR Reports Using the Bash Script.md
similarity index 67%
rename from sources/tech/20190905 How to Get Average CPU and Memory Usage from SAR Reports Using the Bash Script.md
rename to published/201909/20190905 How to Get Average CPU and Memory Usage from SAR Reports Using the Bash Script.md
index c53b7440e3..87c0308360 100644
--- a/sources/tech/20190905 How to Get Average CPU and Memory Usage from SAR Reports Using the Bash Script.md
+++ b/published/201909/20190905 How to Get Average CPU and Memory Usage from SAR Reports Using the Bash Script.md
@@ -1,42 +1,34 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11352-1.html)
[#]: subject: (How to Get Average CPU and Memory Usage from SAR Reports Using the Bash Script)
[#]: via: (https://www.2daygeek.com/linux-get-average-cpu-memory-utilization-from-sar-data-report/)
[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
-How to Get Average CPU and Memory Usage from SAR Reports Using the Bash Script
+如何使用 Bash 脚本从 SAR 报告中获取 CPU 和内存使用情况
======
-Most Linux administrator monitor system performance with **[SAR report][1]** because it collect performance data for a week.
+大多数 Linux 管理员使用 [SAR 报告][1]监控系统性能,因为它会收集一周的性能数据。但是,你可以通过更改 `/etc/sysconfig/sysstat` 文件轻松地将其延长到四周。同样,这段时间可以延长一个月以上。如果超过 28,那么日志文件将放在多个目录中,每月一个。
-But you can easily extend this to four weeks by making changes to the “/etc/sysconfig/sysstat” file.
+要将覆盖期延长至 28 天,请对 `/etc/sysconfig/sysstat` 文件做以下更改。
-Also, this period can be extended beyond one month. If the value exceeds 28, the log files are placed in multiple directories, one for each month.
+编辑 `sysstat` 文件并将 `HISTORY=7` 更改为 `HISTORY=28`。
-To extend the coverage period to 28 days, make the following change to the “/etc/sysconfig/sysstat” file.
+在本文中,我们添加了三个 bash 脚本,它们可以帮助你在一个地方轻松查看每个数据文件的平均值。
-Edit the sysstat file and change HISTORY=7 to HISTORY=28.
+我们过去加过许多有用的 shell 脚本。如果你想查看它们,请进入下面的链接。
-In this article we have added three bash scripts that will help you to easily view each data file averages in one place.
+* [如何使用 shell 脚本自动化日常操作][2]
-We have added many useful shell scripts in the past. If you want to check out that collection, go to the link below.
+这些脚本简单明了。出于测试目的,我们仅包括两个性能指标,即 CPU 和内存。你可以修改脚本中的其他性能指标以满足你的需求。
- * **[How to automate daily operations using shell script][2]**
+### 脚本 1:从 SAR 报告中获取平均 CPU 利用率的 Bash 脚本
+该 bash 脚本从每个数据文件中收集 CPU 平均值并将其显示在一个页面上。
-
-These scripts are simple and straightforward. For testing purposes, we have included only two performance metrics, namely CPU and memory.
-
-You can modify other performance metrics in the script to suit your needs.
-
-### Script-1: Bash Script to Get Average CPU Utilization from SAR Reports
-
-This bash script collects the CPU average from each data file and display it on one page.
-
-Since this is a month end, it shows 28 days data for August 2019.
+由于是月末,它显示了 2019 年 8 月的 28 天数据。
```
# vi /opt/scripts/sar-cpu-avg.sh
@@ -48,21 +40,16 @@ echo "|Average: CPU %user %nice %system %iowait %steal
echo "+----------------------------------------------------------------------------------+"
for file in `ls -tr /var/log/sa/sa* | grep -v sar`
-
do
-
-dat=`sar -f $file | head -n 1 | awk '{print $4}'`
-
-echo -n $dat
-
-sar -f $file | grep -i Average | sed "s/Average://"
-
+ dat=`sar -f $file | head -n 1 | awk '{print $4}'`
+ echo -n $dat
+ sar -f $file | grep -i Average | sed "s/Average://"
done
echo "+----------------------------------------------------------------------------------+"
```
-Once you run the script, you will get an output like the one below.
+运行脚本后,你将看到如下输出。
```
# sh /opt/scripts/sar-cpu-avg.sh
@@ -88,11 +75,11 @@ Once you run the script, you will get an output like the one below.
+----------------------------------------------------------------------------------+
```
-### Script-2: Bash Script to Get Average Memory Utilization from SAR Reports
+### 脚本 2:从 SAR 报告中获取平均内存利用率的 Bash 脚本
-This bash script will collect memory averages from each data file and display it on one page.
+该 bash 脚本从每个数据文件中收集内存平均值并将其显示在一个页面上。
-Since this is a month end, it shows 28 days data for August 2019.
+由于是月末,它显示了 2019 年 8 月的 28 天数据。
```
# vi /opt/scripts/sar-memory-avg.sh
@@ -104,21 +91,16 @@ echo "|Average: kbmemfree kbmemused %memused kbbuffers kbcached kbcommit
echo "+-------------------------------------------------------------------------------------------------------------------+"
for file in `ls -tr /var/log/sa/sa* | grep -v sar`
-
do
-
-dat=`sar -f $file | head -n 1 | awk '{print $4}'`
-
-echo -n $dat
-
-sar -r -f $file | grep -i Average | sed "s/Average://"
-
+ dat=`sar -f $file | head -n 1 | awk '{print $4}'`
+ echo -n $dat
+ sar -r -f $file | grep -i Average | sed "s/Average://"
done
echo "+-------------------------------------------------------------------------------------------------------------------+"
```
-Once you run the script, you will get an output like the one below.
+运行脚本后,你将看到如下输出。
```
# sh /opt/scripts/sar-memory-avg.sh
@@ -144,11 +126,11 @@ Once you run the script, you will get an output like the one below.
+-------------------------------------------------------------------------------------------------------------------+
```
-### Script-3: Bash Script to Get Average CPU & Memory Utilization from SAR Reports
+### 脚本 3:从 SAR 报告中获取 CPU 和内存平均利用率的 Bash 脚本
-This bash script collects the CPU & memory averages from each data file and displays them on a page.
+该 bash 脚本从每个数据文件中收集 CPU 和内存平均值并将其显示在一个页面上。
-This bash script is slightly different compared to the above script. It shows the average of both (CPU & Memory) in one location, not the other data.
+该脚本与上面相比稍微不同。它在同一位置同时显示两者(CPU 和内存)平均值,而不是其他数据。
```
# vi /opt/scripts/sar-cpu-mem-avg.sh
@@ -156,23 +138,16 @@ This bash script is slightly different compared to the above script. It shows th
#!/bin/bash
for file in `ls -tr /var/log/sa/sa* | grep -v sar`
-
do
-
- sar -f $file | head -n 1 | awk '{print $4}'
-
- echo "-----------"
-
- sar -u -f $file | awk '/Average:/{printf("CPU Average: %.2f%\n"), 100 - $8}'
-
- sar -r -f $file | awk '/Average:/{printf("Memory Average: %.2f%\n"),(($3-$5-$6)/($2+$3)) * 100 }'
-
- printf "\n"
-
+ sar -f $file | head -n 1 | awk '{print $4}'
+ echo "-----------"
+ sar -u -f $file | awk '/Average:/{printf("CPU Average: %.2f%\n"), 100 - $8}'
+ sar -r -f $file | awk '/Average:/{printf("Memory Average: %.2f%\n"),(($3-$5-$6)/($2+$3)) * 100 }'
+ printf "\n"
done
```
-Once you run the script, you will get an output like the one below.
+运行脚本后,你将看到如下输出。
```
# sh /opt/scripts/sar-cpu-mem-avg.sh
@@ -221,8 +196,8 @@ via: https://www.2daygeek.com/linux-get-average-cpu-memory-utilization-from-sar-
作者:[Magesh Maruthamuthu][a]
选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/201909/20190905 USB4 gets final approval, offers Ethernet-like speed.md b/published/201909/20190905 USB4 gets final approval, offers Ethernet-like speed.md
new file mode 100644
index 0000000000..ade65f4a5e
--- /dev/null
+++ b/published/201909/20190905 USB4 gets final approval, offers Ethernet-like speed.md
@@ -0,0 +1,53 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11330-1.html)
+[#]: subject: (USB4 gets final approval, offers Ethernet-like speed)
+[#]: via: (https://www.networkworld.com/article/3435113/usb4-gets-final-approval-offers-ethernet-like-speed.html)
+[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/)
+
+USB4 规范获得最终批准,像以太网一样快!
+======
+
+> USB4 会是一个统一的接口,可以淘汰笨重的电缆和超大的插头,并提供满足从笔记本电脑用户到服务器管理员的每个人的吞吐量。
+
+
+
+USB 开发者论坛(USB-IF)是通用串行总线(USB)规范开发背后的行业协会,上周宣布了它已经完成了下一代 USB4 的技术规范。
+
+USB4 最重要的一个方面(它们在此版本中省略了首字母缩略词和版本号之间的空格)是它将 USB 与 Intel 设计的接口 Thunderbolt 3 融合在了一起。Thunderbolt 尽管有潜力,但在除了笔记本之外并未真正流行起来。出于这个原因,Intel 向 USB 联盟提供了 Thunderbolt 规范。
+
+不幸的是,Thunderbolt 3 被列为 USB4 设备的一个可选项,因此有些设备会有,有些则不会。这无疑会让人头疼,希望所有设备制造商都会包括 Thunderbolt 3。
+
+USB4 将使用与 USB type-C 相同的外形尺寸,这个小型插头用在所有现代 Android 手机和 Thunderbolt 3 中。它将向后兼容 USB 3.2、USB 2.0 以及 Thunderbolt。因此,几乎任何现有的USB type-C 设备都可以连接到具有 USB4 总线的机器,但将以连接电缆的额定速度运行。
+
+### USB4:体积更小,速度更快
+
+因为它支持 Thunderbolt 3,所以这种新连接将同时支持数据和显示协议,因此这可能意味着小型 USB-C 端口将取代显示器上庞大的 DVI 端口,而显示器则带有多个 USB4 端口来作为集线器。
+
+新标准的主要内容:它提供双通道 40Gbps 传输速度,是当前 USB 3.2 规格的两倍,是 USB 3 的八倍。这是以太网的速度,应该足够给你的高清显示器以及其他数据传输提供充足带宽。
+
+USB4 也为视频提供了更好的资源分配,因此如果你使用 USB4 端口同时传输视频和数据,端口将相应地分配带宽。这将允许计算机同时使用外部独立的 GPU(因为有 Thunderbolt 3,它已经上市 )和外部 SSD。
+
+这可能会启发各种新的服务器设计,因为大型、笨重的设备,如 GPU 或其他不易放入 1U 或 2U 机箱的卡板,现在可以外部连接并以与内部设备相当的速度运行。
+
+当然,我们看到配备了 USB4 端口的电脑还需要一段时间,更别说服务器了。将 USB 3 用于 PC 花费了数年时间,而 USB-C 的采用速度非常缓慢。USB 2 的 U 盘仍然是这些设备的主要市场,并且主板仍然带有 USB 2 端口。
+
+尽管如此,USB4 还是有可能成为一个统一的接口,可以摆脱拥有超大插头的笨重电缆,并提供满足从笔记本电脑用户到服务器管理员的每个人的吞吐量。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3435113/usb4-gets-final-approval-offers-ethernet-like-speed.html
+
+作者:[Andy Patrizio][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.networkworld.com/author/Andy-Patrizio/
+[b]: https://github.com/lujun9972
+[3]: https://www.facebook.com/NetworkWorld/
+[4]: https://www.linkedin.com/company/network-world
diff --git a/published/201909/20190906 Great News- Firefox 69 Blocks Third-Party Cookies, Autoplay Videos - Cryptominers by Default.md b/published/201909/20190906 Great News- Firefox 69 Blocks Third-Party Cookies, Autoplay Videos - Cryptominers by Default.md
new file mode 100644
index 0000000000..9118ebe1ef
--- /dev/null
+++ b/published/201909/20190906 Great News- Firefox 69 Blocks Third-Party Cookies, Autoplay Videos - Cryptominers by Default.md
@@ -0,0 +1,96 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11346-1.html)
+[#]: subject: (Great News! Firefox 69 Blocks Third-Party Cookies, Autoplay Videos & Cryptominers by Default)
+[#]: via: (https://itsfoss.com/firefox-69/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+Firefox 69 默认阻拦第三方 Cookie、自动播放的视频和加密矿工
+======
+
+如果你使用的是 [Mozilla Firefox][1] 并且尚未更新到最新版本,那么你将错过许多新的重要功能。
+
+### Firefox 69 版本中的一些新功能
+
+首先,Mozilla Firefox 69 会默认强制执行更强大的安全和隐私选项。以下是新版本的一些主要亮点。
+
+#### Firefox 69 阻拦视频自动播放
+
+![][2]
+
+现在很多网站都提供了自动播放视频。无论是弹出视频还是嵌入在文章中设置为自动播放的视频,默认情况下,Firefox 69 都会阻止它(或者可能会提示你)。
+
+这个[阻拦自动播放][3]功能可让用户自动阻止任何视频播放。
+
+#### 禁止第三方跟踪 cookie
+
+默认情况下,作为增强型跟踪保护功能的一部分,它现在将阻止第三方跟踪 Cookie 和加密矿工。这是 Mozilla Firefox 的增强隐私保护功能的非常有用的改变。
+
+Cookie 有两种:第一方的和第三方的。第一方 cookie 由网站本身拥有。这些是“好的 cookie”,可以让你保持登录、记住你的密码或输入字段等来改善浏览体验。第三方 cookie 由你访问的网站以外的域所有。广告服务器使用这些 Cookie 来跟踪你,并在你访问的所有网站上跟踪广告。Firefox 69 旨在阻止这些。
+
+当它发挥作用时,你将在地址栏中看到盾牌图标。你可以选择为特定网站禁用它。
+
+![Firefox Blocking Tracking][4]
+
+#### 禁止加密矿工消耗你的 CPU
+
+![][5]
+
+对加密货币的欲望一直困扰着这个世界。GPU 的价格已经高企,因为专业的加密矿工们使用它们来挖掘加密货币。
+
+人们使用工作场所的计算机秘密挖掘加密货币。当我说工作场所时,我不一定是指 IT 公司。就在今年,[人们在乌克兰的一家核电站抓住了偷挖加密货币的活动][6]。
+
+不仅如此。如果你访问某些网站,他们会运行脚本并使用你的计算机的 CPU 来挖掘加密货币。这在 IT 术语中被称为 [挖矿攻击][7]。
+
+好消息是 Firefox 69 会自动阻止这些加密矿工脚本。因此,网站不再能利用你的系统资源进行挖矿攻击了。
+
+#### Firefox 69 带来的更强隐私保护
+
+![][8]
+
+如果你把隐私保护设置得更严格,那么它也会阻止指纹。因此,当你在 Firefox 69 中选择严格的隐私设置时,你不必担心通过[指纹][9]共享计算机的配置信息。
+
+在[关于这次发布的官方博客文章][10]中,Mozilla 提到,在此版本中,他们希望默认情况下为 100% 的用户提供保护。
+
+#### 性能改进
+
+尽管在更新日志中没有提及 Linux,但它提到了在 Windows 10/mac OS 上运行性能、UI 和电池寿命有所改进。如果你发现任何性能改进,请在评论中提及。
+
+### 总结
+
+除了所有这些之外,还有很多底层的改进。你可以查看[发行说明][11]中的详细信息。
+
+Firefox 69 对于关注其隐私的用户来说是一个令人印象深刻的更新。与我们最近对某些[安全电子邮件服务][12]的建议类似,我们建议你更新浏览器以充分受益。新版本已在大多数 Linux 发行版中提供,你只需要更新你的系统即可。
+
+如果你对阻止广告和跟踪 Cookie 的浏览器感兴趣,请尝试[开源的 Brave 浏览器][13],他们甚至给你提供了加密货币以让你使用他们的浏览器,你可以使用这些加密货币来奖励你最喜爱的发布商。
+
+你觉得这个版本怎么样?请在下面的评论中告诉我们你的想法。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/firefox-69/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/why-firefox/
+[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/auto-block-firefox.png?ssl=1
+[3]: https://support.mozilla.org/en-US/kb/block-autoplay
+[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/firefox-blocking-tracking.png?ssl=1
+[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/firefox-shield.png?ssl=1
+[6]: https://thenextweb.com/hardfork/2019/08/22/ukrainian-nuclear-powerplant-mine-cryptocurrency-state-secrets/
+[7]: https://hackernoon.com/cryptojacking-in-2019-is-not-dead-its-evolving-984b97346d16
+[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/firefox-secure.jpg?ssl=1
+[9]: https://clearcode.cc/blog/device-fingerprinting/
+[10]: https://blog.mozilla.org/blog/2019/09/03/todays-firefox-blocks-third-party-tracking-cookies-and-cryptomining-by-default/
+[11]: https://www.mozilla.org/en-US/firefox/69.0/releasenotes/
+[12]: https://itsfoss.com/secure-private-email-services/
+[13]: https://itsfoss.com/brave-web-browser/
diff --git a/published/201909/20190906 How to change the color of your Linux terminal.md b/published/201909/20190906 How to change the color of your Linux terminal.md
new file mode 100644
index 0000000000..df5bd052bd
--- /dev/null
+++ b/published/201909/20190906 How to change the color of your Linux terminal.md
@@ -0,0 +1,200 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11324-1.html)
+[#]: subject: (How to change the color of your Linux terminal)
+[#]: via: (https://opensource.com/article/19/9/linux-terminal-colors)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+如何改变你的终端颜色
+======
+
+> 使 Linux 变得丰富多彩(或单色)。
+
+
+
+你可以使用特殊的 ANSI 编码设置为 Linux 终端添加颜色,可以在终端命令或配置文件中动态添加,也可以在终端仿真器中使用现成的主题。无论哪种方式,你都可以黑色屏幕上找回怀旧的绿色或琥珀色文本。本文演示了如何使 Linux 变得丰富多彩(或单色)的方法。
+
+### 终端的功能特性
+
+现代系统的终端的颜色配置通常默认至少是 xterm-256color,但如果你尝试为终端添加颜色但未成功,则应检查你的 `TERM` 设置。
+
+从历史上看,Unix 终端从字面上讲是:用户可以输入命令的共享计算机系统上实际的物理端点(终点)。它们专指通常用于远程发出命令的电传打字机(这也是我们今天在 Linux 中仍然使用 `/dev/tty` 设备的原因)。终端内置了 CRT 显示器,因此用户可以坐在办公室的终端上直接与大型机进行交互。CRT 显示器价格昂贵 —— 无论是制造还是使用控制;比担心抗锯齿和现代计算机专家理所当然认为的漂亮信息,让计算机吐出原始 ASCII 文本更容易。然而,即使在那时,技术的发展也很快,很快人们就会发现,随着新的视频显示终端的设计,他们需要新的功能特性来提供可选功能。
+
+例如,1978 年发布的花哨的新 VT100 支持 ANSI 颜色,因此如果用户将终端类型识别为 vt100,则计算机可以提供彩色输出,而基本串行设备可能没有这样的选项。同样的原则适用于今天,它是由 `TERM` [环境变量][2]设定的。你可以使用 `echo` 检查你的 `TERM` 定义:
+
+```
+$ echo $TERM
+xterm-256color
+```
+
+过时的(但在一些系统上仍然为了向后兼容而维护)`/etc/termcap` 文件定义了终端和打印机的功能特性。现代的版本是 `terminfo`,位于 `/etc` 或 `/usr/share` 中,具体取决于你的发行版。 这些文件列出了不同类型终端中可用的功能特性,其中许多都是由历史上的硬件定义的,如 vt100 到 vt220 的定义,以及 xterm 和 Xfce 等现代软件仿真器。大多数软件并不关心你使用的终端类型; 在极少数情况下,登录到检查兼容功能的服务器时,你可能会收到有关错误的终端类型的警告或错误。如果你的终端设置为功能特性很少的配置文件,但你知道你所使用的仿真器能够支持更多功能特性,那么你可以通过定义 `TERM` 环境变量来更改你的设置。你可以通过在 `~/.bashrc` 配置文件中导出 `TERM` 变量来完成此操作:
+
+```
+export TERM=xterm-256color
+```
+
+保存文件并重新载入设置:
+
+```
+$ source ~/.bashrc
+```
+
+### ANSI 颜色代码
+
+现代终端继承了用于“元”特征的 ANSI 转义序列。这些是特殊的字符序列,终端将其解释为操作而不是字符。例如,此序列将清除屏幕,直到下一个提示符:
+
+```
+$ printf '\033[2J'
+```
+
+它不会清除你的历史信息;它只是清除终端仿真器中的屏幕,因此它是一个安全且具有示范性的 ANSI 转义序列。
+
+ANSI 还具有设置终端颜色的序列。例如,键入此代码会将后续文本更改为绿色:
+
+```
+$ printf '\033[32m'
+```
+
+只要你对相同的计算机使用同一个颜色,就可以使用颜色来帮助你记住你登录的系统。例如,如果你经常通过 SSH 连接到服务器,则可以将服务器的提示符设置为绿色,以帮助你一目了然地将其与本地的提示符区分开来。 要设置绿色提示符,请在提示符前使用 ANSI 代码设置为绿色,并使用代表正常默认颜色的代码结束:
+
+
+```
+export PS1=`printf "\033[32m$ \033[39m"`
+```
+
+### 前景色和背景色
+
+你不仅可以设置文本的颜色。使用 ANSI 代码,你还可以控制文本的背景颜色以及做一些基本的样式。
+
+例如,使用 `\033[4m`,你可以为文本加上下划线,或者使用 `\033[5m` 你可以将其设置为闪烁的文本。起初这可能看起来很愚蠢,因为你可能不会将你的终端设置为所有文本带有下划线并整天闪烁, 但它对某些功能很有用。例如,你可以将 shell 脚本生成的紧急错误设置为闪烁(作为对用户的警报),或者你可以为 URL 添加下划线。
+
+作为参考,以下是前景色和背景色的代码。前景色在 30 范围内,而背景色在 40 范围内:
+
+颜色 | 前景色 | 背景色
+---|---|---
+黑色 | \033[30m | \033[40m
+红色 | \033[31m | \033[41m
+绿色 | \033[32m | \033[42m
+橙色 | \033[33m | \033[43m
+蓝色 | \033[34m | \033[44m
+品红 | \033[35m | \033[45m
+青色 | \033[36m | \033[46m
+浅灰 | \033[37m | \033[47m
+回退到发行版默认值 | \033[39m | \033[49m
+
+还有一些可用于背景的其他颜色:
+
+颜色 | 背景色
+---|---
+深灰 | \033[100m
+浅红 | \033[101m
+浅绿 | \033[102m
+黄色 | \033[103m
+浅蓝 | \033[104m
+浅紫 | \033[105m
+蓝绿 | \033[106m
+白色 | \033[107m
+
+### 持久设置
+
+在终端会话中设置颜色只是暂时的,相对无条件的。有时效果会持续几行;这是因为这种设置颜色的方法依赖于 `printf` 语句来设置一种模式,该模式仅持续到其他设置覆盖它。
+
+终端仿真器通常获取使用哪种颜色的指令的方式来自于 `LS_COLORS` 环境变量的设置,该设置又由 `dircolors` 的设置填充。你可以使用 `echo` 语句查看当前设置:
+
+```
+$ echo $LS_COLORS
+rs=0:di=38;5;33:ln=38;5;51:mh=00:pi=40;
+38;5;11:so=38;5;13:do=38;5;5:bd=48;5;
+232;38;5;11:cd=48;5;232;38;5;3:or=48;
+5;232;38;5;9:mi=01;05;37;41:su=48;5;
+196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;
+196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;
+[...]
+```
+
+或者你可以直接使用 `dircolors`:
+
+```
+$ dircolors --print-database
+[...]
+# image formats
+.jpg 01;35
+.jpeg 01;35
+.mjpg 01;35
+.mjpeg 01;35
+.gif 01;35
+.bmp 01;35
+.pbm 01;35
+.tif 01;35
+.tiff 01;35
+[...]
+```
+
+这看起来很神秘。文件类型后面的第一个数字是属性代码,它有六种选择:
+
+* 00 无
+* 01 粗体
+* 04 下划线
+* 05 闪烁
+* 07 反白
+* 08 暗色
+
+下一个数字是简化形式的颜色代码。你可以通过获取 ANSI 代码的最后一个数字来获取颜色代码(绿色前景为 32,绿色背景为 42;红色为 31 或 41,依此类推)。
+
+你的发行版可能全局设置了 `LS_COLORS`,因此系统上的所有用户都会继承相同的颜色。如果你想要一组自定义的颜色,可以使用 `dircolors`。首先,生成颜色设置的本地副本:
+
+```
+$ dircolors --print-database > ~/.dircolors
+```
+
+根据需要编辑本地列表。如果你对自己的选择感到满意,请保存文件。你的颜色设置只是一个数据库,不能由 [ls][3] 直接使用,但你可以使用 `dircolors` 获取可用于设置 `LS_COLORS` 的 shellcode:
+
+```
+$ dircolors --bourne-shell ~/.dircolors
+LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:
+pi=40;33:so=01;35:do=01;35:bd=40;33;01:
+cd=40;33;01:or=40;31;01:mi=00:su=37;41:
+sg=30;43:ca=30;41:tw=30;42:ow=34;
+[...]
+export LS_COLORS
+```
+
+将输出复制并粘贴到 `~/.bashrc` 文件中并重新加载。或者,你可以将该输出直接转储到 `.bashrc` 文件中并重新加载。
+
+```
+$ dircolors --bourne-shell ~/.dircolors >> ~/.bashrc
+$ source ~/.bashrc
+```
+
+你也可以在启动时使 Bash 解析 `.dircolors` 而不是手动进行转换。实际上,你可能不会经常改变颜色,所以这可能过于激进,但如果你打算改变你的配色方案,这是一个选择。在 `.bashrc` 文件中,添加以下规则:
+
+```
+[[ -e $HOME/.dircolors ]] && eval "`dircolors --sh $HOME/.dircolors`"
+```
+
+如果你的主目录中有 `.dircolors` 文件,Bash 会在启动时对其进行评估并相应地设置 `LS_COLORS`。
+
+### 颜色
+
+在终端中使用颜色是一种可以为你自己提供特定信息的快速视觉参考的简单方法。但是,你可能不希望过于依赖它们。毕竟,颜色不是通用的,所以如果其他人使用你的系统,他们可能不会像你那样看懂颜色代表的含义。此外,如果你使用各种工具与计算机进行交互,你可能还会发现某些终端或远程连接无法提供你期望的颜色(或根本不提供颜色)。
+
+除了上述警示之外,颜色在某些工作流程中可能很有用且很有趣,因此创建一个 `.dircolor` 数据库并根据你的想法对其进行自定义吧。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/linux-terminal-colors
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/freedos.png?itok=aOBLy7Ky (4 different color terminal windows with code)
+[2]: https://opensource.com/article/19/8/what-are-environment-variables
+[3]: https://opensource.com/article/19/7/master-ls-command
diff --git a/published/201909/20190906 How to put an HTML page on the internet.md b/published/201909/20190906 How to put an HTML page on the internet.md
new file mode 100644
index 0000000000..8e5e283364
--- /dev/null
+++ b/published/201909/20190906 How to put an HTML page on the internet.md
@@ -0,0 +1,69 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11374-1.html)
+[#]: subject: (How to put an HTML page on the internet)
+[#]: via: (https://jvns.ca/blog/2019/09/06/how-to-put-an-html-page-on-the-internet/)
+[#]: author: (Julia Evans https://jvns.ca/)
+
+如何在互联网放置 HTML 页面
+======
+
+
+
+我喜欢互联网的一点是在互联网放置静态页面是如此简单。今天有人问我该怎么做,所以我想我会快速地写下来!
+
+### 只是一个 HTML 页面
+
+我的所有网站都只是静态 HTML 和 CSS。我的网页设计技巧相对不高( 是我自己开发的最复杂的网站),因此保持我所有的网站相对简单意味着我可以做一些改变/修复,而不会花费大量时间。
+
+因此,我们将在此文章中采用尽可能简单的方式 —— 只需一个 HTML 页面。
+
+### HTML 页面
+
+我们要放在互联网上的网站只是一个名为 `index.html` 的文件。你可以在 找到它,它是一个 Github 仓库,其中只包含一个文件。
+
+HTML 文件中包含一些 CSS,使其看起来不那么无聊,部分复制自 。
+
+### 如何将 HTML 页面放在互联网上
+
+有以下几步:
+
+ 1. 注册 [Neocities][1] 帐户
+ 2. 将 index.html 复制到你自己 neocities 站点的 index.html 中
+ 3. 完成
+
+上面的 `index.html` 页面位于 [julia-example-website.neocities.com][2] 中,如果你查看源代码,你将看到它与 github 仓库中的 HTML 相同。
+
+我认为这可能是将 HTML 页面放在互联网上的最简单的方法(这是一次回归 Geocities,它是我在 2003 年制作我的第一个网站的方式):)。我也喜欢 Neocities (像 [glitch][3],我也喜欢)它能实验、学习,并有乐趣。
+
+### 其他选择
+
+这绝不是唯一简单的方式,在你推送 Git 仓库时,Github pages 和 Gitlab pages 以及 Netlify 都将会自动发布站点,并且它们都非常易于使用(只需将它们连接到你的 GitHub 仓库即可)。我个人使用 Git 仓库的方式,因为 Git 不会让我感到紧张,我想知道我实际推送的页面发生了什么更改。但我想你如果第一次只想将 HTML/CSS 制作的站点放到互联网上,那么 Neocities 就是一个非常好的方法。
+
+如果你不只是玩,而是要将网站用于真实用途,那么你或许会需要买一个域名,以便你将来可以更改托管服务提供商,但这有点不那么简单。
+
+### 这是学习 HTML 的一个很好的起点
+
+如果你熟悉在 Git 中编辑文件,同时想练习 HTML/CSS 的话,我认为将它放在网站中是一个有趣的方式!我真的很喜欢它的简单性 —— 实际上这只有一个文件,所以没有其他花哨的东西需要去理解。
+
+还有很多方法可以复杂化/扩展它,比如这个博客实际上是用 [Hugo][4] 生成的,它生成了一堆 HTML 文件并放在网络中,但从基础开始总是不错的。
+
+--------------------------------------------------------------------------------
+
+via: https://jvns.ca/blog/2019/09/06/how-to-put-an-html-page-on-the-internet/
+
+作者:[Julia Evans][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://jvns.ca/
+[b]: https://github.com/lujun9972
+[1]: https://neocities.org/
+[2]: https://julia-example-website.neocities.org/
+[3]: https://glitch.com
+[4]: https://gohugo.io/
diff --git a/published/201909/20190909 Firefox 69 available in Fedora.md b/published/201909/20190909 Firefox 69 available in Fedora.md
new file mode 100644
index 0000000000..79249a373f
--- /dev/null
+++ b/published/201909/20190909 Firefox 69 available in Fedora.md
@@ -0,0 +1,63 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11354-1.html)
+[#]: subject: (Firefox 69 available in Fedora)
+[#]: via: (https://fedoramagazine.org/firefox-69-available-in-fedora/)
+[#]: author: (Paul W. Frields https://fedoramagazine.org/author/pfrields/)
+
+Firefox 69 已可在 Fedora 中获取
+======
+
+![][1]
+
+当你安装 Fedora Workstation 时,你会发现它包括了世界知名的 Firefox 浏览器。 Mozilla 基金会以开发 Firefox 以及其他促进开放、安全和隐私的互联网项目为己任。Firefox 有快速的浏览引擎和大量的隐私功能。
+
+开发者社区不断改进和增强 Firefox。最新版本 Firefox 69 于最近发布,你可在稳定版 Fedora 系统(30 及更高版本)中获取它。继续阅读以获得更多详情。
+
+### Firefox 69 中的新功能
+
+最新版本的 Firefox 包括[增强跟踪保护][2](ETP)。当你使用带有新(或重置)配置文件的 Firefox 69 时,浏览器会使网站更难以跟踪你的信息或滥用你的计算机资源。
+
+例如,不太正直的网站使用脚本让你的系统进行大量计算来产生加密货币,这称为[加密挖矿][3]。加密挖矿在你不知情或未经许可的情况下发生,因此是对你的系统的滥用。Firefox 69 中的新标准设置可防止网站遭受此类滥用。
+
+Firefox 69 还有其他设置,可防止识别或记录你的浏览器指纹,以供日后使用。这些改进为你提供了额外的保护,免于你的活动被在线追踪。
+
+另一个常见的烦恼是在没有提示的情况下播放视频。视频播放也会占用更多的 CPU,你可能不希望未经许可就在你的笔记本上发生这种情况。Firefox 使用[阻止自动播放][4]这个功能阻止了这种情况的发生。而 Firefox 69 还允许你停止静默开始播放的视频。此功能可防止不必要的突然的噪音。它还解决了更多真正的问题 —— 未经许可使用计算机资源。
+
+新版本中还有许多其他新功能。在 [Firefox 发行说明][5]中阅读有关它们的更多信息。
+
+### 如何获得更新
+
+Firefox 69 存在于稳定版 Fedora 30、预发布版 Fedora 31 和 Rawhide 仓库中。该更新由 Fedora 的 Firefox 包维护者提供。维护人员还确保更新了 Mozilla 的网络安全服务(nss 包)。我们感谢 Mozilla 项目和 Firefox 社区在提供此新版本方面的辛勤工作。
+
+如果你使用的是 Fedora 30 或更高版本,请在 Fedora Workstation 上使用*软件中心*,或在任何 Fedora 系统上运行以下命令:
+
+```
+$ sudo dnf --refresh upgrade firefox
+```
+
+如果你使用的是 Fedora 29,请[帮助测试更新][6],这样它可以变得稳定,让所有用户可以轻松使用。
+
+Firefox 可能会提示你升级个人设置以使用新设置。要使用新功能,你应该这样做。
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/firefox-69-available-in-fedora/
+
+作者:[Paul W. Frields][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/pfrields/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2019/09/firefox-v69-816x345.jpg
+[2]: https://blog.mozilla.org/blog/2019/09/03/todays-firefox-blocks-third-party-tracking-cookies-and-cryptomining-by-default/
+[3]: https://www.webopedia.com/TERM/C/cryptocurrency-mining.html
+[4]: https://support.mozilla.org/kb/block-autoplay
+[5]: https://www.mozilla.org/en-US/firefox/69.0/releasenotes/
+[6]: https://bodhi.fedoraproject.org/updates/FEDORA-2019-89ae5bb576
diff --git a/published/201909/20190909 How to Install Shutter Screenshot Tool in Ubuntu 19.04.md b/published/201909/20190909 How to Install Shutter Screenshot Tool in Ubuntu 19.04.md
new file mode 100644
index 0000000000..fd526ef267
--- /dev/null
+++ b/published/201909/20190909 How to Install Shutter Screenshot Tool in Ubuntu 19.04.md
@@ -0,0 +1,88 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11335-1.html)
+[#]: subject: (How to Install Shutter Screenshot Tool in Ubuntu 19.04)
+[#]: via: (https://itsfoss.com/install-shutter-ubuntu/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+如何在 Ubuntu 19.04 中安装 Shutter 截图工具
+======
+
+Shutter 是我在 [Linux 中最喜欢的截图工具][1]。你可以使用它截图,还可以用它编辑截图或其他图像。它是一个在图像上添加箭头和文本的不错的工具。你也可以使用它在 Ubuntu 或其它你使用的发行版中[调整图像大小][2]。FOSS 上大多数截图教程都使用 Shutter 编辑。
+
+![Install Shutter Ubuntu][8]
+
+
+虽然 [Shutter][4] 一直是一款很棒的工具,但它的开发却停滞了。这几年来一直没有新版本的 Shutter。甚至像 [Shutter 中编辑模式被禁用][5]这样的简单 bug 也没有修复。根本没有开发者的消息。
+
+也许这就是为什么新版本的 Ubuntu 放弃它的原因。在 Ubuntu 18.04 LTS 之前,你可以在软件中心,或者[启用 universe 仓库][7]来[使用 apt-get 命令][6]安装它。但是从 Ubuntu 18.10 及更高版本开始,你就不能再这样做了。
+
+抛开这些缺点,Shutter 是一个很好的工具,我想继续使用它。也许你也是像我这样的 Shutter 粉丝,并且想要使用它。好的方面是你仍然可以在 Ubuntu 19.04 中安装 Shutter,这要归功于非官方 PPA。
+
+### 在 Ubuntu 19.04 上安装 Shutter
+
+![][3]
+
+我希望你了解 PPA 的概念。如果不了解,我强烈建议阅读我的指南,以了解更多关于[什么是 PPA 以及如何使用它][9]。
+
+现在,打开终端并使用以下命令添加新仓库:
+
+```
+sudo add-apt-repository -y ppa:linuxuprising/shutter
+```
+
+不需要再使用 `apt update`,因为从 Ubuntu 18.04 开始,仓库会在添加新条目后自动更新。
+
+现在使用 `apt` 命令安装 Shutter:
+
+```
+sudo apt install shutter
+```
+
+完成。你应该已经安装 Shutter 截图工具。你可从菜单搜索并启动它。
+
+### 删除通过非官方 PPA 安装的 Shutter
+
+最后我以卸载 Shutter 以及删除添加的仓库来结束教程。
+
+首先,从系统中删除 Shutter:
+
+```
+sudo apt remove shutter
+```
+
+接下来,从你的仓库列表中删除 PPA:
+
+```
+sudo add-apt-repository --remove ppa:linuxuprising/shutter
+```
+
+你或许还想了解 [Y PPA Manager][11],这是一款 PPA 图形管理工具。
+
+Shutter 是一个很好的工具,我希望它能被积极开发。我希望它的开发人员没问题,他/她可以找一些时间来处理它。或者是时候让其他人分叉并继续让它变得更棒。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/install-shutter-ubuntu/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/take-screenshot-linux/
+[2]: https://itsfoss.com/resize-images-with-right-click/
+[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/08/shutter-screenshot.jpg?ssl=1
+[4]: http://shutter-project.org/
+[5]: https://itsfoss.com/shutter-edit-button-disabled/
+[6]: https://itsfoss.com/apt-get-linux-guide/
+[7]: https://itsfoss.com/ubuntu-repositories/
+[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/Install-Shutter-ubuntu.jpg?resize=800%2C450&ssl=1
+[9]: https://itsfoss.com/ppa-guide/
+[11]: https://itsfoss.com/y-ppa-manager/
diff --git a/published/201909/20190909 How to Setup Multi Node Elastic Stack Cluster on RHEL 8 - CentOS 8.md b/published/201909/20190909 How to Setup Multi Node Elastic Stack Cluster on RHEL 8 - CentOS 8.md
new file mode 100644
index 0000000000..8838a490d6
--- /dev/null
+++ b/published/201909/20190909 How to Setup Multi Node Elastic Stack Cluster on RHEL 8 - CentOS 8.md
@@ -0,0 +1,462 @@
+[#]: collector: (lujun9972)
+[#]: translator: (heguangzhi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11394-1.html)
+[#]: subject: (How to Setup Multi Node Elastic Stack Cluster on RHEL 8 / CentOS 8)
+[#]: via: (https://www.linuxtechi.com/setup-multinode-elastic-stack-cluster-rhel8-centos8/)
+[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/)
+
+如何在 RHEL8 /CentOS8 上建立多节点 Elastic stack 集群
+======
+
+
+Elastic stack 俗称 ELK stack,是一组包括 Elasticsearch、Logstash 和 Kibana 在内的开源产品。Elastic Stack 由 Elastic 公司开发和维护。使用 Elastic stack,可以将系统日志发送到 Logstash,它是一个数据收集引擎,接受来自可能任何来源的日志或数据,并对日志进行归一化,然后将日志转发到 Elasticsearch,用于分析、索引、搜索和存储,最后使用 Kibana 表示为可视化数据,使用 Kibana,我们还可以基于用户的查询创建交互式图表。
+
+![Elastic-Stack-Cluster-RHEL8-CentOS8][2]
+
+在本文中,我们将演示如何在 RHEL 8 / CentOS 8 服务器上设置多节点 elastic stack 集群。以下是我的 Elastic Stack 集群的详细信息:
+
+**Elasticsearch:**
+
+* 三台服务器,最小化安装 RHEL 8 / CentOS 8
+* IP & 主机名 – 192.168.56.40(`elasticsearch1.linuxtechi.local`)、192.168.56.50 (`elasticsearch2.linuxtechi.local`)、192.168.56.60(elasticsearch3.linuxtechi.local`)
+
+Logstash:**
+
+* 两台服务器,最小化安装 RHEL 8 / CentOS 8
+* IP & 主机 – 192.168.56.20(`logstash1.linuxtechi.local`)、192.168.56.30(`logstash2.linuxtechi.local`)
+
+**Kibana:**
+
+* 一台服务器,最小化安装 RHEL 8 / CentOS 8
+* IP & 主机名 – 192.168.56.10(`kibana.linuxtechi.local`)
+
+**Filebeat:**
+
+* 一台服务器,最小化安装 CentOS 7
+* IP & 主机名 – 192.168.56.70(`web-server`)
+
+让我们从设置 Elasticsearch 集群开始,
+
+### 设置3个节点 Elasticsearch 集群
+
+正如我已经说过的,设置 Elasticsearch 集群的节点,登录到每个节点,设置主机名并配置 yum/dnf 库。
+
+使用命令 `hostnamectl` 设置各个节点上的主机名:
+
+```
+[root@linuxtechi ~]# hostnamectl set-hostname "elasticsearch1.linuxtechi. local"
+[root@linuxtechi ~]# exec bash
+[root@linuxtechi ~]#
+[root@linuxtechi ~]# hostnamectl set-hostname "elasticsearch2.linuxtechi. local"
+[root@linuxtechi ~]# exec bash
+[root@linuxtechi ~]#
+[root@linuxtechi ~]# hostnamectl set-hostname "elasticsearch3.linuxtechi. local"
+[root@linuxtechi ~]# exec bash
+[root@linuxtechi ~]#
+```
+
+对于 CentOS 8 系统,我们不需要配置任何操作系统包库,对于 RHEL 8 服务器,如果你有有效订阅,那么用红帽订阅以获得包存储库就可以了。如果你想为操作系统包配置本地 yum/dnf 存储库,请参考以下网址:
+
+- [如何使用 DVD 或 ISO 文件在 RHEL 8 服务器上设置本地 Yum / DNF 存储库][3]
+
+在所有节点上配置 Elasticsearch 包存储库,在 `/etc/yum.repo.d/` 文件夹下创建一个包含以下内容的 `elastic.repo` 文件:
+
+```
+~]# vi /etc/yum.repos.d/elastic.repo
+
+[elasticsearch-7.x]
+name=Elasticsearch repository for 7.x packages
+baseurl=https://artifacts.elastic.co/packages/7.x/yum
+gpgcheck=1
+gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
+enabled=1
+autorefresh=1
+type=rpm-md
+```
+
+保存文件并退出。
+
+在所有三个节点上使用 `rpm` 命令导入 Elastic 公共签名密钥。
+
+```
+~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
+```
+
+在所有三个节点的 `/etc/hosts` 文件中添加以下行:
+
+```
+192.168.56.40 elasticsearch1.linuxtechi.local
+192.168.56.50 elasticsearch2.linuxtechi.local
+192.168.56.60 elasticsearch3.linuxtechi.local
+```
+
+使用 `yum`/`dnf` 命令在所有三个节点上安装 Java:
+
+```
+[root@linuxtechi ~]# dnf install java-openjdk -y
+[root@linuxtechi ~]# dnf install java-openjdk -y
+[root@linuxtechi ~]# dnf install java-openjdk -y
+```
+
+使用 `yum`/`dnf` 命令在所有三个节点上安装 Elasticsearch:
+
+```
+[root@linuxtechi ~]# dnf install elasticsearch -y
+[root@linuxtechi ~]# dnf install elasticsearch -y
+[root@linuxtechi ~]# dnf install elasticsearch -y
+```
+
+**注意:** 如果操作系统防火墙已启用并在每个 Elasticsearch 节点中运行,则使用 `firewall-cmd` 命令允许以下端口开放:
+
+```
+~]# firewall-cmd --permanent --add-port=9300/tcp
+~]# firewall-cmd --permanent --add-port=9200/tcp
+~]# firewall-cmd --reload
+```
+
+配置 Elasticsearch, 在所有节点上编辑文件 `/etc/elasticsearch/elasticsearch.yml` 并加入以下内容:
+
+```
+~]# vim /etc/elasticsearch/elasticsearch.yml
+
+cluster.name: opn-cluster
+node.name: elasticsearch1.linuxtechi.local
+network.host: 192.168.56.40
+http.port: 9200
+discovery.seed_hosts: ["elasticsearch1.linuxtechi.local", "elasticsearch2.linuxtechi.local", "elasticsearch3.linuxtechi.local"]
+cluster.initial_master_nodes: ["elasticsearch1.linuxtechi.local", "elasticsearch2.linuxtechi.local", "elasticsearch3.linuxtechi.local"]
+```
+
+**注意:** 在每个节点上,在 `node.name` 中填写正确的主机名,在 `network.host` 中填写正确的 IP 地址,其他参数保持不变。
+
+现在使用 `systemctl` 命令在所有三个节点上启动并启用 Elasticsearch 服务:
+
+```
+~]# systemctl daemon-reload
+~]# systemctl enable elasticsearch.service
+~]# systemctl start elasticsearch.service
+```
+
+使用下面 `ss` 命令验证 elasticsearch 节点是否开始监听 9200 端口:
+
+```
+[root@linuxtechi ~]# ss -tunlp | grep 9200
+tcp LISTEN 0 128 [::ffff:192.168.56.40]:9200 *:* users:(("java",pid=2734,fd=256))
+[root@linuxtechi ~]#
+```
+
+使用以下 `curl` 命令验证 Elasticsearch 群集状态:
+
+```
+[root@linuxtechi ~]# curl http://elasticsearch1.linuxtechi.local:9200
+[root@linuxtechi ~]# curl -X GET http://elasticsearch2.linuxtechi.local:9200/_cluster/health?pretty
+```
+
+命令的输出如下所示:
+
+![Elasticsearch-cluster-status-rhel8][3]
+
+以上输出表明我们已经成功创建了 3 节点的 Elasticsearch 集群,集群的状态也是绿色的。
+
+**注意:** 如果你想修改 JVM 堆大小,那么你可以编辑了文件 `/etc/elasticsearch/jvm.options`,并根据你的环境更改以下参数:
+
+* `-Xms1g`
+* `-Xmx1g`
+
+现在让我们转到 Logstash 节点。
+
+### 安装和配置 Logstash
+
+在两个 Logstash 节点上执行以下步骤。
+
+登录到两个节点使用 `hostnamectl` 命令设置主机名:
+
+```
+[root@linuxtechi ~]# hostnamectl set-hostname "logstash1.linuxtechi.local"
+[root@linuxtechi ~]# exec bash
+[root@linuxtechi ~]#
+[root@linuxtechi ~]# hostnamectl set-hostname "logstash2.linuxtechi.local"
+[root@linuxtechi ~]# exec bash
+[root@linuxtechi ~]#
+```
+
+在两个 logstash 节点的 `/etc/hosts` 文件中添加以下条目:
+
+```
+~]# vi /etc/hosts
+192.168.56.40 elasticsearch1.linuxtechi.local
+192.168.56.50 elasticsearch2.linuxtechi.local
+192.168.56.60 elasticsearch3.linuxtechi.local
+```
+
+保存文件并退出。
+
+在两个节点上配置 Logstash 存储库,在文件夹 `/ete/yum.repo.d/` 下创建一个包含以下内容的文件 `logstash.repo`:
+
+```
+~]# vi /etc/yum.repos.d/logstash.repo
+
+[elasticsearch-7.x]
+name=Elasticsearch repository for 7.x packages
+baseurl=https://artifacts.elastic.co/packages/7.x/yum
+gpgcheck=1
+gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
+enabled=1
+autorefresh=1
+type=rpm-md
+```
+
+保存并退出文件,运行 `rpm` 命令导入签名密钥:
+
+```
+~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
+```
+
+使用 `yum`/`dnf` 命令在两个节点上安装 Java OpenJDK:
+
+```
+~]# dnf install java-openjdk -y
+```
+
+从两个节点运行 `yum`/`dnf` 命令来安装 logstash:
+
+```
+[root@linuxtechi ~]# dnf install logstash -y
+[root@linuxtechi ~]# dnf install logstash -y
+```
+
+现在配置 logstash,在两个 logstash 节点上执行以下步骤,创建一个 logstash 配置文件,首先我们在 `/etc/logstash/conf.d/` 下复制 logstash 示例文件:
+
+```
+# cd /etc/logstash/
+# cp logstash-sample.conf conf.d/logstash.conf
+```
+
+编辑配置文件并更新以下内容:
+
+```
+# vi conf.d/logstash.conf
+
+input {
+ beats {
+ port => 5044
+ }
+}
+
+output {
+ elasticsearch {
+ hosts => ["http://elasticsearch1.linuxtechi.local:9200", "http://elasticsearch2.linuxtechi.local:9200", "http://elasticsearch3.linuxtechi.local:9200"]
+ index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
+ #user => "elastic"
+ #password => "changeme"
+ }
+}
+```
+
+在 `output` 部分之下,在 `hosts` 参数中指定所有三个 Elasticsearch 节点的 FQDN,其他参数保持不变。
+
+使用 `firewall-cmd` 命令在操作系统防火墙中允许 logstash 端口 “5044”:
+
+```
+~ # firewall-cmd --permanent --add-port=5044/tcp
+~ # firewall-cmd –reload
+```
+
+现在,在每个节点上运行以下 `systemctl` 命令,启动并启用 Logstash 服务:
+
+```
+~]# systemctl start logstash
+~]# systemctl eanble logstash
+```
+
+使用 `ss` 命令验证 logstash 服务是否开始监听 5044 端口:
+
+```
+[root@linuxtechi ~]# ss -tunlp | grep 5044
+tcp LISTEN 0 128 *:5044 *:* users:(("java",pid=2416,fd=96))
+[root@linuxtechi ~]#
+```
+
+以上输出表明 logstash 已成功安装和配置。让我们转到 Kibana 安装。
+
+### 安装和配置 Kibana
+
+登录 Kibana 节点,使用 `hostnamectl` 命令设置主机名:
+
+```
+[root@linuxtechi ~]# hostnamectl set-hostname "kibana.linuxtechi.local"
+[root@linuxtechi ~]# exec bash
+[root@linuxtechi ~]#
+```
+
+编辑 `/etc/hosts` 文件并添加以下行:
+
+```
+192.168.56.40 elasticsearch1.linuxtechi.local
+192.168.56.50 elasticsearch2.linuxtechi.local
+192.168.56.60 elasticsearch3.linuxtechi.local
+```
+
+使用以下命令设置 Kibana 存储库:
+
+```
+[root@linuxtechi ~]# vi /etc/yum.repos.d/kibana.repo
+[elasticsearch-7.x]
+name=Elasticsearch repository for 7.x packages
+baseurl=https://artifacts.elastic.co/packages/7.x/yum
+gpgcheck=1
+gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
+enabled=1
+autorefresh=1
+type=rpm-md
+
+[root@linuxtechi ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
+```
+
+执行 `yum`/`dnf` 命令安装 kibana:
+
+```
+[root@linuxtechi ~]# yum install kibana -y
+```
+
+通过编辑 `/etc/kibana/kibana.yml` 文件,配置 Kibana:
+
+```
+[root@linuxtechi ~]# vim /etc/kibana/kibana.yml
+…………
+server.host: "kibana.linuxtechi.local"
+server.name: "kibana.linuxtechi.local"
+elasticsearch.hosts: ["http://elasticsearch1.linuxtechi.local:9200", "http://elasticsearch2.linuxtechi.local:9200", "http://elasticsearch3.linuxtechi.local:9200"]
+…………
+```
+
+启用并启动 kibana 服务:
+
+```
+[root@linuxtechi ~]# systemctl start kibana
+[root@linuxtechi ~]# systemctl enable kibana
+```
+
+在系统防火墙上允许 Kibana 端口 “5601”:
+
+```
+[root@linuxtechi ~]# firewall-cmd --permanent --add-port=5601/tcp
+success
+[root@linuxtechi ~]# firewall-cmd --reload
+success
+[root@linuxtechi ~]#
+```
+
+使用以下 URL 访问 Kibana 界面:
+
+![Kibana-Dashboard-rhel8][4]
+
+从面板上,我们可以检查 Elastic Stack 集群的状态。
+
+![Stack-Monitoring-Overview-RHEL8][5]
+
+这证明我们已经在 RHEL 8 /CentOS 8 上成功地安装并设置了多节点 Elastic Stack 集群。
+
+现在让我们通过 `filebeat` 从其他 Linux 服务器发送一些日志到 logstash 节点中,在我的例子中,我有一个 CentOS 7服务器,我将通过 `filebeat` 将该服务器的所有重要日志推送到 logstash。
+
+登录到 CentOS 7 服务器使用 yum/rpm 命令安装 filebeat 包:
+
+```
+[root@linuxtechi ~]# rpm -ivh https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm
+Retrieving https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.1-x86_64.rpm
+Preparing... ################################# [100%]
+Updating / installing...
+ 1:filebeat-7.3.1-1 ################################# [100%]
+[root@linuxtechi ~]#
+```
+
+编辑 `/etc/hosts` 文件并添加以下内容:
+
+```
+192.168.56.20 logstash1.linuxtechi.local
+192.168.56.30 logstash2.linuxtechi.local
+```
+
+现在配置 `filebeat`,以便它可以使用负载平衡技术向 logstash 节点发送日志,编辑文件 `/etc/filebeat/filebeat.yml`,并添加以下参数:
+
+在 `filebeat.inputs:` 部分将 `enabled: false` 更改为 `enabled: true`,并在 `paths` 参数下指定我们可以发送到 logstash 的日志文件的位置;注释掉 `output.elasticsearch` 和 `host` 参数;删除 `output.logstash:` 和 `hosts:` 的注释,并在 `hosts` 参数添加两个 logstash 节点,以及设置 `loadbalance: true`。
+
+```
+[root@linuxtechi ~]# vi /etc/filebeat/filebeat.yml
+
+filebeat.inputs:
+- type: log
+ enabled: true
+ paths:
+ - /var/log/messages
+ - /var/log/dmesg
+ - /var/log/maillog
+ - /var/log/boot.log
+#output.elasticsearch:
+ # hosts: ["localhost:9200"]
+
+output.logstash:
+ hosts: ["logstash1.linuxtechi.local:5044", "logstash2.linuxtechi.local:5044"]
+ loadbalance: true
+```
+
+使用下面的 2 个 `systemctl` 命令 启动并启用 `filebeat` 服务:
+
+```
+[root@linuxtechi ~]# systemctl start filebeat
+[root@linuxtechi ~]# systemctl enable filebeat
+```
+
+现在转到 Kibana 用户界面,验证新索引是否可见。
+
+从左侧栏中选择管理选项,然后单击 Elasticsearch 下的索引管理:
+
+![Elasticsearch-index-management-Kibana][6]
+
+正如我们上面看到的,索引现在是可见的,让我们现在创建索引模型。
+
+点击 Kibana 部分的 “Index Patterns”,它将提示我们创建一个新模型,点击 “Create Index Pattern” ,并将模式名称指定为 “filebeat”:
+
+![Define-Index-Pattern-Kibana-RHEL8][7]
+
+点击下一步。
+
+选择 “Timestamp” 作为索引模型的时间过滤器,然后单击 “Create index pattern”:
+
+![Time-Filter-Index-Pattern-Kibana-RHEL8][8]
+
+![filebeat-index-pattern-overview-Kibana][9]
+
+现在单击查看实时 filebeat 索引模型:
+
+![Discover-Kibana-REHL8][10]
+
+这表明 Filebeat 代理已配置成功,我们能够在 Kibana 仪表盘上看到实时日志。
+
+以上就是本文的全部内容,对这些帮助你在 RHEL 8 / CentOS 8 系统上设置 Elastic Stack 集群的步骤,请不要犹豫分享你的反馈和意见。
+
+--------------------------------------------------------------------------------
+
+via: https://www.linuxtechi.com/setup-multinode-elastic-stack-cluster-rhel8-centos8/
+
+作者:[Pradeep Kumar][a]
+选题:[lujun9972][b]
+译者:[heguangzhi](https://github.com/heguangzhi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linuxtechi.com/author/pradeep/
+[b]: https://github.com/lujun9972
+[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[2]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Elastic-Stack-Cluster-RHEL8-CentOS8.jpg
+[3]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Elasticsearch-cluster-status-rhel8.jpg
+[4]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Kibana-Dashboard-rhel8.jpg
+[5]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Stack-Monitoring-Overview-RHEL8.jpg
+[6]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Elasticsearch-index-management-Kibana.jpg
+[7]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Define-Index-Pattern-Kibana-RHEL8.jpg
+[8]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Time-Filter-Index-Pattern-Kibana-RHEL8.jpg
+[9]: https://www.linuxtechi.com/wp-content/uploads/2019/09/filebeat-index-pattern-overview-Kibana.jpg
+[10]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Discover-Kibana-REHL8.jpg
diff --git a/published/201909/20190909 How to use Terminator on Linux to run multiple terminals in one window.md b/published/201909/20190909 How to use Terminator on Linux to run multiple terminals in one window.md
new file mode 100644
index 0000000000..8121fe2b25
--- /dev/null
+++ b/published/201909/20190909 How to use Terminator on Linux to run multiple terminals in one window.md
@@ -0,0 +1,117 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11409-1.html)
+[#]: subject: (How to use Terminator on Linux to run multiple terminals in one window)
+[#]: via: (https://www.networkworld.com/article/3436784/how-to-use-terminator-on-linux-to-run-multiple-terminals-in-one-window.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+使用 Terminator 在一个窗口中运行多个终端
+======
+
+
+
+> Terminator 为在单窗口中运行多个 GNOME 终端提供了一个选择,让你可以灵活地调整工作空间来适应你的需求。
+
+
+
+如果你曾经希望可以排列多个终端并将它们组织在一个窗口中,那么我们可能会给你带来一个好消息。 Linux 的 Terminator 可以为你做到这一点。没有问题!
+
+### 分割窗口
+
+Terminator 最初打开像是一个单一窗口的终端窗口一样。但是,一旦在该窗口中单击鼠标,它将弹出一个选项,让你可以灵活地进行更改。你可以选择“水平分割”或“垂直分割”,将你当前所在的窗口分为两个较小的窗口。实际上,菜单旁会有小的分割结果图示(类似于 `=` and `||`),你可以根据需要重复拆分窗口。当然,你如果将整个窗口分为六个或九个以上,那么你可能会发现它们太小而无法有效使用。
+
+使用 ASCII 艺术来说明分割窗口的过程,你可能会看到类似以下的样子:
+
+```
++-------------------+ +-------------------+ +-------------------+
+| | | | | |
+| | | | | |
+| | ==> |-------------------| ==> |-------------------|
+| | | | | | |
+| | | | | | |
++-------------------+ +-------------------+ +-------------------+
+ 原始终端 水平分割 垂直分割
+```
+
+另一种拆分窗口的方法是使用控制键组合,例如,使用 `Ctrl+Shift+e` 垂直分割窗口,使用 `Ctrl+Shift+o`(“o” 表示“打开”)水平分割窗口。
+
+在 Terminator 分割完成后,你可以点击任意窗口使用,并根据工作需求在窗口间移动。
+
+### 最大化窗口
+
+如果你想暂时忽略除了一个窗口外的其他窗口而只关注一个,你可以单击该窗口,然后从菜单中选择“最大化”选项。接着该窗口会撑满所有空间。再次单击并选择“还原所有终端”可以返回到多窗口显示。使用 `Ctrl+Shift+x` 将在正常和最大化设置之间切换。
+
+窗口标签上的窗口大小指示(例如 80x15)显示了每行的字符数以及每个窗口的行数。
+
+### 关闭窗口
+
+要关闭任何窗口,请打开 Terminator 菜单,然后选择“关闭”。其他窗口将自行调整占用空间,直到你关闭最后一个窗口。
+
+### 保存你的自定义设置
+
+将窗口分为多个部分后,将自定义的 Terminator 设置设置为默认非常容易。从弹出菜单中选择“首选项”,然后从打开的窗口顶部的选项卡中选择“布局”。接着你应该看到列出了“新布局”。只需单击底部的“保存”,然后单击右下角的“关闭”。Terminator 会将你的设置保存在 `~/.config/terminator/config` 中,然后每次使用到时都会使用该文件。
+
+你也可以通过使用鼠标拉伸来扩大整个窗口。再说一次,如果要保留更改,请从菜单中选择“首选项”,“布局”,接着选择“保存”和“关闭”。
+
+### 在保存的配置之间进行选择
+
+如果愿意,你可以通过维护多个配置文件来设置多种 Terminator 窗口布局,重命名每个配置文件(如 `config-1`、`config-2`),接着在你想使用它时将它移动到 `~/.config/terminator/config`。这有一个类似执行此任务的脚本。它让你在 3 个预配置的窗口布局之间进行选择。
+
+```
+#!/bin/bash
+
+PS3='Terminator options: '
+options=("Split 1" "Split 2" "Split 3" "Quit")
+select opt in "${options[@]}"
+do
+ case $opt in
+ "Split 1")
+ config=config-1
+ break
+ ;;
+ "Split 2")
+ config=config-2
+ break
+ ;;
+ "Split 3")
+ config=config-3
+ break
+ ;;
+ *)
+ exit
+ ;;
+ esac
+done
+
+cd ~/.config/terminator
+cp config config-
+cp $config config
+cd
+terminator &
+```
+
+如果有用的话,你可以给选项一个比 `config-1` 更有意义的名称。
+
+### 总结
+
+Terminator 是设置多窗口处理相关任务的不错选择。如果你从未使用过它,那么可能需要先使用 `sudo apt install terminator` 或 `sudo yum install -y terminator` 之类的命令进行安装。
+
+希望你喜欢使用 Terminator。还有,如另一个同名角色所说,“我会回来的!”
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3436784/how-to-use-terminator-on-linux-to-run-multiple-terminals-in-one-window.html
+
+作者:[Sandra Henry-Stocker][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
+[b]: https://github.com/lujun9972
+[2]: https://www.facebook.com/NetworkWorld/
+[3]: https://www.linkedin.com/company/network-world
diff --git a/published/201909/20190911 How to set up a TFTP server on Fedora.md b/published/201909/20190911 How to set up a TFTP server on Fedora.md
new file mode 100644
index 0000000000..bdd7ab6f0d
--- /dev/null
+++ b/published/201909/20190911 How to set up a TFTP server on Fedora.md
@@ -0,0 +1,175 @@
+[#]: collector: (lujun9972)
+[#]: translator: (amwps290)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11371-1.html)
+[#]: subject: (How to set up a TFTP server on Fedora)
+[#]: via: (https://fedoramagazine.org/how-to-set-up-a-tftp-server-on-fedora/)
+[#]: author: (Curt Warfield https://fedoramagazine.org/author/rcurtiswarfield/)
+
+如何在 Fedora 上建立一个 TFTP 服务器
+======
+
+![][1]
+
+TFTP 即简单文本传输协议,允许用户通过 [UDP][2] 协议在系统之间传输文件。默认情况下,协议使用的是 UDP 的 69 号端口。TFTP 协议广泛用于无盘设备的远程启动。因此,在你的本地网络建立一个 TFTP 服务器,这样你就可以对 [安装好的 Fedora][3] 和其他无盘设备做一些操作,这将非常有趣。
+
+TFTP 仅仅能够从远端系统读取数据或者向远端系统写入数据,而没有列出远端服务器上文件的能力。它也没提供用户身份验证。由于安全隐患和缺乏高级功能,TFTP 通常仅用于局域网内部(LAN)。
+
+### 安装 TFTP 服务器
+
+首先你要做的事就是安装 TFTP 客户端和 TFTP 服务器:
+
+```
+dnf install tftp-server tftp -y
+```
+
+上述的这条命令会在 `/usr/lib/systemd/system` 目录下为 [systemd][4] 创建 `tftp.service` 和 `tftp.socket` 文件。
+
+```
+/usr/lib/systemd/system/tftp.service
+/usr/lib/systemd/system/tftp.socket
+```
+
+接下来,将这两个文件复制到 `/etc/systemd/system` 目录下,并重新命名。
+
+```
+cp /usr/lib/systemd/system/tftp.service /etc/systemd/system/tftp-server.service
+cp /usr/lib/systemd/system/tftp.socket /etc/systemd/system/tftp-server.socket
+```
+
+### 修改文件
+
+当你把这些文件复制和重命名后,你就可以去添加一些额外的参数,下面是 `tftp-server.service` 刚开始的样子:
+
+```
+[Unit]
+Description=Tftp Server
+Requires=tftp.socket
+Documentation=man:in.tftpd
+
+[Service]
+ExecStart=/usr/sbin/in.tftpd -s /var/lib/tftpboot
+StandardInput=socket
+
+[Install]
+Also=tftp.socket
+```
+
+在 `[Unit]` 部分添加如下内容:
+
+```
+Requires=tftp-server.socket
+```
+
+修改 `[ExecStart]` 行:
+
+```
+ExecStart=/usr/sbin/in.tftpd -c -p -s /var/lib/tftpboot
+```
+
+下面是这些选项的意思:
+
+ * `-c` 选项允许创建新的文件
+ * `-p` 选项用于指明在正常系统提供的权限检查之上没有其他额外的权限检查
+ * `-s` 建议使用该选项以确保安全性以及与某些引导 ROM 的兼容性,这些引导 ROM 在其请求中不容易包含目录名。
+
+默认的上传和下载位置位于 `/var/lib/tftpboot`。
+
+下一步,修改 `[Install]` 部分的内容
+
+```
+[Install]
+WantedBy=multi-user.target
+Also=tftp-server.socket
+```
+
+不要忘记保存你的修改。
+
+下面是 `/etc/systemd/system/tftp-server.service` 文件的完整内容:
+
+```
+[Unit]
+Description=Tftp Server
+Requires=tftp-server.socket
+Documentation=man:in.tftpd
+
+[Service]
+ExecStart=/usr/sbin/in.tftpd -c -p -s /var/lib/tftpboot
+StandardInput=socket
+
+[Install]
+WantedBy=multi-user.target
+Also=tftp-server.socket
+```
+
+### 启动 TFTP 服务器
+
+重新启动 systemd 守护进程:
+
+```
+systemctl daemon-reload
+```
+
+启动服务器:
+
+```
+systemctl enable --now tftp-server
+```
+
+要更改 TFTP 服务器允许上传和下载的权限,请使用此命令。注意 TFTP 是一种固有的不安全协议,因此不建议你在与其他人共享的网络上这样做。
+
+```
+chmod 777 /var/lib/tftpboot
+```
+
+配置防火墙让 TFTP 能够使用:
+
+```
+firewall-cmd --add-service=tftp --perm
+firewall-cmd --reload
+```
+
+### 客户端配置
+
+安装 TFTP 客户端
+
+```
+yum install tftp -y
+```
+
+运行 `tftp` 命令连接服务器。下面是一个启用详细信息选项的例子:
+
+```
+[client@thinclient:~ ]$ tftp 192.168.1.164
+tftp> verbose
+Verbose mode on.
+tftp> get server.logs
+getting from 192.168.1.164:server.logs to server.logs [netascii]
+Received 7 bytes in 0.0 seconds [inf bits/sec]
+tftp> quit
+[client@thinclient:~ ]$
+```
+
+记住,因为 TFTP 没有列出服务器上文件的能力,因此,在你使用 `get` 命令之前需要知道文件的具体名称。
+
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/how-to-set-up-a-tftp-server-on-fedora/
+
+作者:[Curt Warfield][a]
+选题:[lujun9972][b]
+译者:[amwps290](https://github.com/amwps290)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/rcurtiswarfield/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2019/09/tftp-server-816x345.jpg
+[2]: https://en.wikipedia.org/wiki/User_Datagram_Protocol
+[3]: https://docs.fedoraproject.org/en-US/fedora/f30/install-guide/advanced/Network_based_Installations/
+[4]: https://fedoramagazine.org/systemd-getting-a-grip-on-units/
+[5]: https://unsplash.com/@laikanotebooks?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
+[6]: https://unsplash.com/search/photos/file-folders?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
diff --git a/published/201909/20190912 An introduction to Markdown.md b/published/201909/20190912 An introduction to Markdown.md
new file mode 100644
index 0000000000..56bf81de5d
--- /dev/null
+++ b/published/201909/20190912 An introduction to Markdown.md
@@ -0,0 +1,153 @@
+[#]: collector: (lujun9972)
+[#]: translator: (qfzy1233)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11402-1.html)
+[#]: subject: (An introduction to Markdown)
+[#]: via: (https://opensource.com/article/19/9/introduction-markdown)
+[#]: author: (Juan Islas https://opensource.com/users/xislas)
+
+一份 Markdown 简介
+======
+
+> 一次编辑便可将文本转换为多种格式。下面是如何开始使用 Markdown。
+
+
+
+在很长一段时间里,我发现我在 GitLab 和 GitHub 上看到的所有文件都带有 **.md** 扩展名,这是专门为开发人员编写的文件类型。几周前,当我开始使用 Markdown 时,我的观念发生了变化。它很快成为我日常工作中最重要的工具。
+
+Markdown 使我的生活更简易。我只需要在已经编写的代码中添加一些符号,并且在浏览器扩展或开源程序的帮助下,即可将文本转换为各种常用格式,如 ODT、电子邮件(稍后将详细介绍)、PDF 和 EPUB。
+
+### 什么是 Markdown?
+
+来自 [维基百科][2]的友情提示:
+
+> Markdown 是一种轻量级标记语言,具有纯文本格式语法。
+
+这意味着通过在文本中使用一些额外的符号,Markdown 可以帮助你创建具有特定结构和格式的文档。当你以纯文本(例如,在记事本应用程序中)做笔记时,没有任何东西表明哪个文本应该是粗体或斜体。在普通文本中,你在写链接时需要将一个链接写为 “http://example.com”,或者写为 “example.com”,又或“访问网站(example.com)”。这样没有内在的一致性。
+
+但是如果你按照 Markdown 的方式编写,你的文本就有了内在的一致性。计算机喜欢一致性,因为这使得它们能够遵循严格的指令而不用担心异常。
+
+相信我;一旦你学会使用 Markdown,每一项写作任务在某种程度上都会比以前更容易、更好。让我们开始吧。
+
+### Markdown 基础
+
+以下是使用 Markdown 的基础语法。
+
+1、创建一个以 **.md** 扩展名结尾的文本文件(例如,`example.md`)。你可以使用任何文本编辑器(甚至像 LibreOffice 或 Microsoft word 这样的文字处理程序亦可),只要记住将其保存为*文本*文件。
+
+![Names of Markdown files][3]
+
+2、想写什么就写什么,就像往常一样:
+
+```
+Lorem ipsum
+
+Consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+De Finibus Bonorum et Malorum
+
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
+Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
+
+ Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
+```
+
+(LCTT 译注:上述这段“Lorem ipsum”,中文又称“乱数假文”,是一篇常用于排版设计领域的拉丁文文章,主要目的为测试文章或文字在不同字型、版型下看起来的效果。)
+
+3、确保在段落之间留有空行。如果你习惯写商务信函或传统散文,这可能会觉得不自然,因为那里段落只有一行,甚至在第一个单词前还有一个缩进。对于 Markdown,空行(一些文字处理程序使用 `¶`,称为Pilcrow 符号)保证在创建一个新段落应用另一种格式(如 HTML)。
+
+4、指定标题和副标题。对于文档的标题,在文本前面添加一个井号或散列符号(`#`)和一个空格(例如 `# Lorem ipsum`)。第一个副标题级别使用两个(`## De Finibus Bonorum et Malorum`),下一个级别使用三个(`### 第三个副标题`),以此类推。注意,在井号和第一个单词之间有一个空格。
+
+```
+# Lorem ipsum
+
+Consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
+Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
+Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+
+## De Finibus Bonorum et Malorum
+
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.
+Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
+
+ Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.
+```
+
+5、如果你想使用**粗体**字符,只需将字母放在两个星号之间,没有空格:`**对应的文本将以粗体显示**`。
+
+![Bold text in Markdown][4]
+
+6、对于**斜体**,将文本放在没有空格的下划线符号之间:`_我希望这个本文以斜体显示_`。(LCTT 译注:有的 Markdown 流派会将用下划线引起来的字符串视作下划线文本,而单个星号 `*` 引用起来的才视作斜体。从兼容性的角度看,使用星号比较兼容。)
+
+![Italics text in Markdown][5]
+
+7、要插入一个链接(像 [Markdown Tutorial][6]),把你想链接的文本放在括号里,URL 放在括号里,中间没有空格:`[Markdown Tutorial]()`。
+
+![Hyperlinks in Markdown][7]
+
+8、块引用是用大于号编写的(`>`)在你要引用的文本前加上大于符号和空格: `> 名言引用`。
+
+![Blockquote text in Markdown][8]
+
+### Markdown 教程和技巧
+
+这些技巧可以帮助你上手 Markdown ,但它涵盖了很多功能,不仅仅是粗体、斜体和链接。学习 Markdown 的最好方法是使用它,但是我建议你花 15 分钟来学习这篇简单的 [Markdown 教程][6],学以致用,勤加练习。
+
+由于现代 Markdown 是对结构化文本概念的许多不同解释的融合,[CommonMark][9] 项目定义了一个规范,其中包含一组严格的规则,以使 Markdown 更加清晰。在编辑时手边准备一份[符合 CommonMark 的快捷键列表][10]可能会有帮助。
+
+### 你能用 Markdown 做什么
+
+Markdown 可以让你写任何你想写的东西,仅需一次编辑,就可以把它转换成几乎任何你想使用的格式。下面的示例演示如何将用 MD 编写简单的文本并转换为不同的格式。你不需要多种格式的文档-你可以仅仅编辑一次…然后拥有无限可能。
+
+1、**简单的笔记**:你可以用 Markdown 编写你的笔记,并且在保存笔记时,开源笔记应用程序 [Turtl][11] 将解释你的文本文件并显示为对应的格式。你可以把笔记存储在任何地方!
+
+![Turtl application][12]
+
+2、**PDF 文件**:使用 [Pandoc][13] 应用程序,你可以使用一个简单的命令将 Markdown 文件转换为 PDF:
+
+```
+pandoc -o
+```
+
+![Markdown text converted to PDF with Pandoc][14]
+
+3、**Email**:你还可以通过安装浏览器扩展 [Markdown Here][15] 将 Markdown 文本转换为 html 格式的电子邮件。要使用它,只需选择你的 Markdown 文本,在这里使用 Markdown 将其转换为 HTML,并使用你喜欢的电子邮件客户端发送消息。
+
+![Markdown text converted to email with Markdown Here][16]
+
+### 现在就开始上手吧
+
+你不需要一个特殊的应用程序来使用 Markdown,你只需要一个文本编辑器和上面的技巧。它与你已有的写作方式兼容;你所需要做的就是使用它,所以试试吧。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/introduction-markdown
+
+作者:[Juan Islas][a]
+选题:[lujun9972][b]
+译者:[qfzy1233](https://github.com/qfzy1233)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/xislas
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming-code-keyboard-laptop-music-headphones.png?itok=EQZ2WKzy (Woman programming)
+[2]: https://en.wikipedia.org/wiki/Markdown
+[3]: https://opensource.com/sites/default/files/uploads/markdown_names_md-1.png (Names of Markdown files)
+[4]: https://opensource.com/sites/default/files/uploads/markdown_bold.png (Bold text in Markdown)
+[5]: https://opensource.com/sites/default/files/uploads/markdown_italic.png (Italics text in Markdown)
+[6]: https://www.markdowntutorial.com/
+[7]: https://opensource.com/sites/default/files/uploads/markdown_link.png (Hyperlinks in Markdown)
+[8]: https://opensource.com/sites/default/files/uploads/markdown_blockquote.png (Blockquote text in Markdown)
+[9]: https://commonmark.org/help/
+[10]: https://opensource.com/downloads/cheat-sheet-markdown
+[11]: https://turtlapp.com/
+[12]: https://opensource.com/sites/default/files/uploads/markdown_turtl_02.png (Turtl application)
+[13]: https://opensource.com/article/19/5/convert-markdown-to-word-pandoc
+[14]: https://opensource.com/sites/default/files/uploads/markdown_pdf.png (Markdown text converted to PDF with Pandoc)
+[15]: https://markdown-here.com/
+[16]: https://opensource.com/sites/default/files/uploads/markdown_mail_02.png (Markdown text converted to email with Markdown Here)
diff --git a/published/201909/20190912 Bash Script to Send a Mail About New User Account Creation.md b/published/201909/20190912 Bash Script to Send a Mail About New User Account Creation.md
new file mode 100644
index 0000000000..849d7c5597
--- /dev/null
+++ b/published/201909/20190912 Bash Script to Send a Mail About New User Account Creation.md
@@ -0,0 +1,116 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11362-1.html)
+[#]: subject: (Bash Script to Send a Mail About New User Account Creation)
+[#]: via: (https://www.2daygeek.com/linux-shell-script-to-monitor-user-creation-send-email/)
+[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
+
+用 Bash 脚本发送新用户帐户创建的邮件
+======
+
+
+
+出于某些原因,你可能需要跟踪 Linux 上的新用户创建信息。同时,你可能需要通过邮件发送详细信息。这或许是审计目标的一部分,或者安全团队出于跟踪目的可能希望对此进行监控。
+
+我们可以通过其他方式进行此操作,正如我们在上一篇文章中已经描述的那样。
+
+* [在系统中创建新用户帐户时发送邮件的 Bash 脚本][1]
+
+Linux 有许多开源监控工具可以使用。但我不认为他们有办法跟踪新用户创建过程,并在发生时提醒管理员。
+
+那么我们怎样才能做到这一点?
+
+我们可以编写自己的 Bash 脚本来实现这一目标。我们过去写过许多有用的 shell 脚本。如果你想了解,请进入下面的链接。
+
+* [如何使用 shell 脚本自动化日常活动?][2]
+
+### 这个脚本做了什么?
+
+这将每天两次(一天的开始和结束)备份 `/etc/passwd` 文件,这将使你能够获取指定日期的新用户创建详细信息。
+
+我们需要添加以下两个 cron 任务来复制 `/etc/passwd` 文件。
+
+```
+# crontab -e
+
+1 0 * * * cp /etc/passwd /opt/scripts/passwd-start-$(date +"%Y-%m-%d")
+59 23 * * * cp /etc/passwd /opt/scripts/passwd-end-$(date +"%Y-%m-%d")
+```
+
+它使用 `diff` 命令来检测文件之间的差异,如果发现与昨日有任何差异,脚本将向指定 email 发送新用户详细信息。
+
+我们不用经常运行此脚本,因为用户创建不经常发生。但是,我们计划每天运行一次此脚本。
+
+这样,你可以获得有关新用户创建的综合报告。
+
+**注意:**我们在脚本中使用了我们的电子邮件地址进行演示。因此,我们要求你用自己的电子邮件地址。
+
+```
+# vi /opt/scripts/new-user-detail.sh
+
+#!/bin/bash
+mv /opt/scripts/passwd-start-$(date --date='yesterday' '+%Y-%m-%d') /opt/scripts/passwd-start
+mv /opt/scripts/passwd-end-$(date --date='yesterday' '+%Y-%m-%d') /opt/scripts/passwd-end
+ucount=$(diff /opt/scripts/passwd-start /opt/scripts/passwd-end | grep ">" | cut -d":" -f6 | cut -d"/" -f3 | wc -l)
+if [ $ucount -gt 0 ]
+then
+ SUBJECT="ATTENTION: New User Account is created on server : `date --date='yesterday' '+%b %e'`"
+ MESSAGE="/tmp/new-user-logs.txt"
+ TO="2daygeek@gmail.com"
+ echo "Hostname: `hostname`" >> $MESSAGE
+ echo -e "\n" >> $MESSAGE
+ echo "The New User Details are below." >> $MESSAGE
+ echo "+------------------------------+" >> $MESSAGE
+ diff /opt/scripts/passwd-start /opt/scripts/passwd-end | grep ">" | cut -d":" -f6 | cut -d"/" -f3 >> $MESSAGE
+ echo "+------------------------------+" >> $MESSAGE
+ mail -s "$SUBJECT" "$TO" < $MESSAGE
+ rm $MESSAGE
+fi
+```
+
+给 `new-user-detail.sh` 文件添加可执行权限。
+
+```
+$ chmod +x /opt/scripts/new-user-detail.sh
+```
+
+最后添加一个 cron 任务来自动执行此操作。它在每天早上 7 点运行。
+
+```
+# crontab -e
+
+0 7 * * * /bin/bash /opt/scripts/new-user.sh
+```
+
+**注意:**你会在每天早上 7 点都会收到一封关于昨日详情的邮件提醒。
+
+**输出:**输出与下面的输出相同。
+
+```
+# cat /tmp/new-user-logs.txt
+
+Hostname: CentOS.2daygeek.com
+
+The New User Details are below.
++------------------------------+
+tuser3
++------------------------------+
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/linux-shell-script-to-monitor-user-creation-send-email/
+
+作者:[Magesh Maruthamuthu][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/magesh/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/linux-bash-script-to-monitor-user-creation-send-email/
+[2]: https://www.2daygeek.com/category/shell-script/
diff --git a/published/201909/20190913 An introduction to Virtual Machine Manager.md b/published/201909/20190913 An introduction to Virtual Machine Manager.md
new file mode 100644
index 0000000000..aa452f418a
--- /dev/null
+++ b/published/201909/20190913 An introduction to Virtual Machine Manager.md
@@ -0,0 +1,99 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11364-1.html)
+[#]: subject: (An introduction to Virtual Machine Manager)
+[#]: via: (https://opensource.com/article/19/9/introduction-virtual-machine-manager)
+[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss)
+
+虚拟机管理器(Virtual Machine Manager)简介
+======
+
+> virt-manager 为 Linux 虚拟化提供了全方位的选择。
+
+
+
+在我关于 [GNOME Boxes][3] 的[系列文章][2]中,我已经解释了 Linux 用户如何能够在他们的桌面上快速启动虚拟机。当你只需要简单的配置时,Box 可以轻而易举地创建虚拟机。
+
+但是,如果你需要在虚拟机中配置更多详细信息,那么你就需要一个工具,为磁盘、网卡(NIC)和其他硬件提供全面的选项。这时就需要 [虚拟机管理器(Virtual Machine Manager)][4](virt-manager)了。如果在应用菜单中没有看到它,你可以从包管理器或命令行安装它:
+
+* 在 Fedora 上:`sudo dnf install virt-manager`
+* 在 Ubuntu 上:`sudo apt install virt-manager`
+
+安装完成后,你可以从应用菜单或在命令行中输入 `virt-manager` 启动。
+
+![Virtual Machine Manager's main screen][5]
+
+为了演示如何使用 virt-manager 创建虚拟机,我将设置一个 Red Hat Enterprise Linux 8 虚拟机。
+
+首先,单击 “文件” 然后点击 “新建虚拟机”。Virt-manager 的开发者已经标记好了每一步(例如,“第 1 步,共 5 步”)来使其变得简单。单击 “本地安装介质” 和 “下一步”。
+
+![Step 1 virtual machine creation][6]
+
+在下个页面中,选择要安装的操作系统的 ISO 文件。(RHEL 8 镜像位于我的下载目录中。)Virt-manager 自动检测操作系统。
+
+![Step 2 Choose the ISO File][7]
+
+在步骤 3 中,你可以指定虚拟机的内存和 CPU。默认值为内存 1,024MB 和一个 CPU。
+
+![Step 3 Set CPU and Memory][8]
+
+我想给 RHEL 充足的配置来运行,我使用的硬件配置也充足,所以我将它们(分别)增加到 4,096MB 和两个 CPU。
+
+下一步为虚拟机配置存储。默认设置是 10GB 硬盘。(我保留此设置,但你可以根据需要进行调整。)你还可以选择现有磁盘镜像或在自定义位置创建一个磁盘镜像。
+
+![Step 4 Configure VM Storage][9]
+
+步骤 5 是命名虚拟机并单击“完成”。这相当于创建了一台虚拟机,也就是 GNOME Boxes 中的一个 Box。虽然技术上讲是最后一步,但你有几个选择(如下面的截图所示)。由于 virt-manager 的优点是能够自定义虚拟机,因此在单击“完成”之前,我将选中“在安装前定制配置”的复选框。
+
+因为我选择了自定义配置,virt-manager 打开了一个有一组设备和设置的页面。这里是重点!
+
+这里你也可以命名该虚拟机。在左侧列表中,你可以查看各个方面的详细信息,例如 CPU、内存、磁盘、控制器和许多其他项目。例如,我可以单击 “CPU” 来验证我在步骤 3 中所做的更改。
+
+![Changing the CPU count][10]
+
+我也可以确认我设置的内存量。
+
+当虚拟机作为服务器运行时,我通常会禁用或删除声卡。为此,请选择 “声卡” 并单击 “移除” 或右键单击 “声卡” 并选择 “移除硬件”。
+
+你还可以使用底部的 “添加硬件” 按钮添加硬件。这会打开 “添加新的虚拟硬件” 页面,你可以在其中添加其他存储设备、内存、声卡等。这就像可以访问一个库存充足的(虚拟)计算机硬件仓库。
+
+![The Add New Hardware screen][11]
+
+对 VM 配置感到满意后,单击 “开始安装”,系统将启动并开始从 ISO 安装指定的操作系统。
+
+![Begin installing the OS][12]
+
+完成后,它会重新启动,你的新虚拟机就可以使用了。
+
+![Red Hat Enterprise Linux 8 running in VMM][13]
+
+Virtual Machine Manager 是桌面 Linux 用户的强大工具。它是开源的,是专有和封闭虚拟化产品的绝佳替代品。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/introduction-virtual-machine-manager
+
+作者:[Alan Formy-Duval][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/alanfdoss
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_keyboard_laptop_development_code_woman.png?itok=vbYz6jjb (A person programming)
+[2]: https://opensource.com/sitewide-search?search_api_views_fulltext=GNOME%20Box
+[3]: https://wiki.gnome.org/Apps/Boxes
+[4]: https://virt-manager.org/
+[5]: https://opensource.com/sites/default/files/1-vmm_main_0.png (Virtual Machine Manager's main screen)
+[6]: https://opensource.com/sites/default/files/2-vmm_step1_0.png (Step 1 virtual machine creation)
+[7]: https://opensource.com/sites/default/files/3-vmm_step2.png (Step 2 Choose the ISO File)
+[8]: https://opensource.com/sites/default/files/4-vmm_step3default.png (Step 3 Set CPU and Memory)
+[9]: https://opensource.com/sites/default/files/6-vmm_step4.png (Step 4 Configure VM Storage)
+[10]: https://opensource.com/sites/default/files/9-vmm_customizecpu.png (Changing the CPU count)
+[11]: https://opensource.com/sites/default/files/11-vmm_addnewhardware.png (The Add New Hardware screen)
+[12]: https://opensource.com/sites/default/files/12-vmm_rhelbegininstall.png
+[13]: https://opensource.com/sites/default/files/13-vmm_rhelinstalled_0.png (Red Hat Enterprise Linux 8 running in VMM)
diff --git a/published/201909/20190913 How to Find and Replace a String in File Using the sed Command in Linux.md b/published/201909/20190913 How to Find and Replace a String in File Using the sed Command in Linux.md
new file mode 100644
index 0000000000..d49a5146b9
--- /dev/null
+++ b/published/201909/20190913 How to Find and Replace a String in File Using the sed Command in Linux.md
@@ -0,0 +1,346 @@
+[#]: collector: (lujun9972)
+[#]: translator: (asche910)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11367-1.html)
+[#]: subject: (How to Find and Replace a String in File Using the sed Command in Linux)
+[#]: via: (https://www.2daygeek.com/linux-sed-to-find-and-replace-string-in-files/)
+[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
+
+使用 sed 命令查找和替换文件中的字符串的 16 个示例
+======
+
+
+
+当你在使用文本文件时,很可能需要查找和替换文件中的字符串。`sed` 命令主要用于替换一个文件中的文本。在 Linux 中这可以通过使用 `sed` 命令和 `awk` 命令来完成。
+
+在本教程中,我们将告诉你使用 `sed` 命令如何做到这一点,然后讨论讨论 `awk` 命令相关的。
+
+### sed 命令是什么
+
+`sed` 命令表示 Stream Editor(流编辑器),用来在 Linux 上执行基本的文本操作。它可以执行各种功能,如搜索、查找、修改、插入或删除文件。
+
+此外,它也可以执行复杂的正则表达式匹配。
+
+它可用于以下目的:
+
+* 查找和替换匹配给定的格式的内容。
+* 在指定行查找和替换匹配给定的格式的内容。
+* 在所有行查找和替换匹配给定的格式的内容。
+* 搜索并同时替换两种不同的模式。
+
+本文列出的十五个例子可以帮助你掌握 `sed` 命令。
+
+如果要使用 `sed` 命令删除文件中的行,去下面的文章。
+
+注意:由于这是一篇演示文章,我们使用不带 `-i` 选项的 `sed` 命令,该选项会在 Linux 终端中删除行并打印文件内容。
+
+但是,在实际环境中如果你想删除源文件中的行,使用带 `-i` 选项的 `sed` 命令。
+
+常见的 `sed` 替换字符串的语法。
+
+```
+sed -i 's/Search_String/Replacement_String/g' Input_File
+```
+
+首先我们需要了解 `sed` 语法来做到这一点。请参阅有关的细节。
+
+* `sed`:这是一个 Linux 命令。
+* `-i`:这是 `sed` 命令的一个选项,它有什么作用?默认情况下,`sed` 打印结果到标准输出。当你使用 `sed` 添加这个选项时,那么它会在适当的位置修改文件。当你添加一个后缀(比如,`-i.bak`)时,就会创建原始文件的备份。
+* `s`:字母 `s` 是一个替换命令。
+* `Search_String`:搜索一个给定的字符串或正则表达式。
+* `Replacement_String`:替换的字符串。
+* `g`:全局替换标志。默认情况下,`sed` 命令替换每一行第一次出现的模式,它不会替换行中的其他的匹配结果。但是,提供了该替换标志时,所有匹配都将被替换。
+* `/`:分界符。
+* `Input_File`:要执行操作的文件名。
+
+让我们来看看文件中用sed命令来搜索和转换文本的一些常用例子。
+
+我们已经创建了用于演示的以下文件。
+
+```
+# cat sed-test.txt
+
+1 Unix unix unix 23
+2 linux Linux 34
+3 linuxunix UnixLinux
+linux /bin/bash CentOS Linux OS
+Linux is free and opensource operating system
+```
+
+### 1) 如何查找和替换一行中“第一次”模式匹配
+
+下面的 `sed` 命令用 `linux` 替换文件中的 `unix`。这仅仅改变了每一行模式的第一个实例。
+
+```
+# sed 's/unix/linux/' sed-test.txt
+
+1 Unix linux unix 23
+2 linux Linux 34
+3 linuxlinux UnixLinux
+linux /bin/bash CentOS Linux OS
+Linux is free and opensource operating system
+```
+
+### 2) 如何查找和替换每一行中“第 N 次”出现的模式
+
+在行中使用`/1`、`/2`……`/n` 等标志来代替相应的匹配。
+
+下面的 `sed` 命令在一行中用 `linux` 来替换 `unix` 模式的第二个实例。
+
+```
+# sed 's/unix/linux/2' sed-test.txt
+
+1 Unix unix linux 23
+2 linux Linux 34
+3 linuxunix UnixLinux
+linux /bin/bash CentOS Linux OS
+Linux is free and opensource operating system
+```
+
+### 3) 如何搜索和替换一行中所有的模式实例
+
+下面的 `sed` 命令用 `linux` 替换 `unix` 格式的所有实例,因为 `g` 是一个全局替换标志。
+
+```
+# sed 's/unix/linux/g' sed-test.txt
+
+1 Unix linux linux 23
+2 linux Linux 34
+3 linuxlinux UnixLinux
+linux /bin/bash CentOS Linux OS
+Linux is free and opensource operating system
+```
+
+### 4) 如何查找和替换一行中从“第 N 个”开始的所有匹配的模式实例
+
+下面的 `sed` 命令在一行中替换从模式的“第 N 个”开始的匹配实例。
+
+```
+# sed 's/unix/linux/2g' sed-test.txt
+
+1 Unix unix linux 23
+2 linux Linux 34
+3 linuxunix UnixLinux
+linux /bin/bash CentOS Linux OS
+Linux is free and opensource operating system
+```
+
+### 5) 在特定的行号搜索和替换模式
+
+你可以替换特定行号中的字符串。下面的 `sed` 命令用 `linux` 仅替换第三行的 `unix` 模式。
+
+```
+# sed '3 s/unix/linux/' sed-test.txt
+
+1 Unix unix unix 23
+2 linux Linux 34
+3 linuxlinux UnixLinux
+linux /bin/bash CentOS Linux OS
+Linux is free and opensource operating system
+```
+
+### 6) 在特定范围行号间搜索和替换模式
+
+你可以指定行号的范围,以替换字符串。
+
+下面的 `sed` 命令在 1 到 3 行间用 `linux` 替换 `Unix` 模式。
+
+```
+# sed '1,3 s/unix/linux/' sed-test.txt
+
+1 Unix linux unix 23
+2 linux Linux 34
+3 linuxlinux UnixLinux
+linux /bin/bash CentOS Linux OS
+Linux is free and opensource operating system
+```
+
+### 7) 如何查找和修改最后一行的模式
+
+下面的 sed 命令允许你只在最后一行替换匹配的字符串。
+
+下面的 `sed` 命令只在最后一行用 `Unix` 替换 `Linux` 模式。
+
+```
+# sed '$ s/Linux/Unix/' sed-test.txt
+
+1 Unix unix unix 23
+2 linux Linux 34
+3 linuxunix UnixLinux
+linux /bin/bash CentOS Linux OS
+Unix is free and opensource operating system
+```
+
+### 8) 在一行中如何只查找和替换正确的模式匹配
+
+你可能已经注意到,子串 `linuxunix` 被替换为在第 6 个示例中的 `linuxlinux`。如果你只想更改正确的匹配词,在搜索串的两端用这个边界符 `\b`。
+
+```
+# sed '1,3 s/\bunix\b/linux/' sed-test.txt
+
+1 Unix linux unix 23
+2 linux Linux 34
+3 linuxunix UnixLinux
+linux /bin/bash CentOS Linux OS
+Linux is free and opensource operating system
+```
+
+### 9) 如何以不区分大小写来搜索与替换模式
+
+大家都知道,Linux 是区分大小写的。为了与不区分大小写的模式匹配,使用 `I` 标志。
+
+```
+# sed 's/unix/linux/gI' sed-test.txt
+
+1 linux linux linux 23
+2 linux Linux 34
+3 linuxlinux linuxLinux
+linux /bin/bash CentOS Linux OS
+Linux is free and opensource operating system
+```
+
+### 10) 如何查找和替换包含分隔符的字符串
+
+当你搜索和替换含分隔符的字符串时,我们需要用反斜杠 `\` 来取消转义。
+
+在这个例子中,我们将用 `/usr/bin/fish` 来替换 `/bin/bash`。
+
+```
+# sed 's/\/bin\/bash/\/usr\/bin\/fish/g' sed-test.txt
+
+1 Unix unix unix 23
+2 linux Linux 34
+3 linuxunix UnixLinux
+linux /usr/bin/fish CentOS Linux OS
+Linux is free and opensource operating system
+```
+
+上述 `sed` 命令按预期工作,但它看起来来很糟糕。 为了简化,大部分的人会用竖线 `|` 作为正则表达式的定位符。 所以,我建议你用它。
+
+```
+# sed 's|/bin/bash|/usr/bin/fish/|g' sed-test.txt
+
+1 Unix unix unix 23
+2 linux Linux 34
+3 linuxunix UnixLinux
+linux /usr/bin/fish/ CentOS Linux OS
+Linux is free and opensource operating system
+```
+
+### 11) 如何以给定的模式来查找和替换数字
+
+类似地,数字可以用模式来代替。下面的 `sed` 命令以 `[0-9]` 替换所有数字为 `number`。
+
+```
+# sed 's/[0-9]/number/g' sed-test.txt
+
+number Unix unix unix numbernumber
+number linux Linux numbernumber
+number linuxunix UnixLinux
+linux /bin/bash CentOS Linux OS
+Linux is free and opensource operating system
+```
+
+### 12) 如何用模式仅查找和替换两个数字
+
+如果你想用模式来代替两位数字,使用下面的 `sed` 命令。
+
+```
+# sed 's/\b[0-9]\{2\}\b/number/g' sed-test.txt
+
+1 Unix unix unix number
+2 linux Linux number
+3 linuxunix UnixLinux
+linux /bin/bash CentOS Linux OS
+Linux is free and opensource operating system
+```
+
+### 13) 如何用 sed 命令仅打印被替换的行
+
+如果你想显示仅更改的行,使用下面的 `sed` 命令。
+
+* `p` - 它在终端上输出替换的行两次。
+* `-n` - 它抑制由 `p` 标志所产生的重复行。
+
+```
+# sed -n 's/Unix/Linux/p' sed-test.txt
+
+1 Linux unix unix 23
+3 linuxunix LinuxLinux
+```
+
+### 14) 如何同时运行多个 sed 命令
+
+以下 `sed` 命令同时检测和置换两个不同的模式。
+
+下面的 `sed` 命令搜索 `linuxunix` 和 `CentOS` 模式,用 `LINUXUNIX` 和 `RHEL8` 一次性更换它们。
+
+```
+# sed -e 's/linuxunix/LINUXUNIX/g' -e 's/CentOS/RHEL8/g' sed-test.txt
+
+1 Unix unix unix 23
+2 linux Linux 34
+3 LINUXUNIX UnixLinux
+linux /bin/bash RHEL8 Linux OS
+Linux is free and opensource operating system
+```
+
+下面的 `sed` 命令搜索替换两个不同的模式,并一次性替换为一个字符串。
+
+以下 `sed` 的命令搜索 `linuxunix` 和 `CentOS` 模式,用 `Fedora30` 替换它们。
+
+```
+# sed -e 's/\(linuxunix\|CentOS\)/Fedora30/g' sed-test.txt
+
+1 Unix unix unix 23
+2 linux Linux 34
+3 Fedora30 UnixLinux
+linux /bin/bash Fedora30 Linux OS
+Linux is free and opensource operating system
+```
+
+### 15) 如果给定的模式匹配,如何查找和替换整个行
+
+如果模式匹配,可以使用 `sed` 命令用新行来代替整行。这可以通过使用 `c` 标志来完成。
+
+```
+# sed '/OS/ c\
+New Line
+' sed-test.txt
+
+1 Unix unix unix 23
+2 linux Linux 34
+3 linuxunix UnixLinux
+New Line
+Linux is free and opensource operating system
+```
+
+### 16) 如何搜索和替换相匹配的模式行
+
+在 `sed` 命令中你可以为行指定适合的模式。在匹配该模式的情况下,`sed` 命令搜索要被替换的字符串。
+
+下面的 `sed` 命令首先查找具有 `OS` 模式的行,然后用 `ArchLinux` 替换单词 `Linux`。
+
+```
+# sed '/OS/ s/Linux/ArchLinux/' sed-test.txt
+
+1 Unix unix unix 23
+2 linux Linux 34
+3 linuxunix UnixLinux
+linux /bin/bash CentOS ArchLinux OS
+Linux is free and opensource operating system
+```
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/linux-sed-to-find-and-replace-string-in-files/
+
+作者:[Magesh Maruthamuthu][a]
+选题:[lujun9972][b]
+译者:[Asche910](https://github.com/asche910)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/magesh/
+[b]: https://github.com/lujun9972
diff --git a/published/201909/20190914 GNOME 3.34 Released With New Features - Performance Improvements.md b/published/201909/20190914 GNOME 3.34 Released With New Features - Performance Improvements.md
new file mode 100644
index 0000000000..69911195d2
--- /dev/null
+++ b/published/201909/20190914 GNOME 3.34 Released With New Features - Performance Improvements.md
@@ -0,0 +1,89 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11345-1.html)
+[#]: subject: (GNOME 3.34 Released With New Features & Performance Improvements)
+[#]: via: (https://itsfoss.com/gnome-3-34-release/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+GNOME 3.34 发布
+======
+
+
+
+最新版本的 GNOME 代号为“塞萨洛尼基”。考虑到这个版本经过了 6 个月的开发,这应该是对 [GNOME 3.32][1] 的一次令人印象深刻的升级。
+
+在此版本中,有许多新功能和显著的性能改进。除了新功能外,可定制的程度也得到了提升。
+
+以下是新的变化:
+
+### GNOME 3.34 的关键改进
+
+你可以观看此视频,了解 GNOME 3.34 中的新功能:
+
+- [视频](https://img.linux.net.cn/static/video/_-qAjPRr5SGoY.mp4)
+
+#### 拖放图标到文件夹
+
+新的 shell 主题允许你拖放应用程序抽屉中的图标以重新排列它们,或将它们组合到一个文件夹中。你可能已经在 Android 或 iOS 智能手机中使用过此类功能。
+
+![You can now drag and drop icons into a folder][2]
+
+#### 改进的日历管理器
+
+改进的日历管理器可以轻松地与第三方服务集成,使你能够直接从 Linux 系统管理日程安排,而无需单独使用其他应用程序。
+
+![GNOME Calendar Improvements][3]
+
+#### 背景选择的设置
+
+现在,更容易为主屏幕和锁定屏幕选择自定义背景,因为它在同一屏幕中显示所有可用背景。为你节省至少一次鼠标点击。
+
+![It’s easier to select backgrounds now][4]
+
+#### 重新排列搜索选项
+
+搜索选项和结果可以手动重新排列。因此,当你要搜索某些内容时,可以决定哪些内容先出现。
+
+#### 响应式设计的“设置”应用
+
+设置菜单 UI 现在具有响应性,因此无论你使用何种类型(或尺寸)的设备,都可以轻松访问所有选项。这肯定对 [Linux 智能手机(如 Librem 5)][5] 上的 GNOME 有所帮助。
+
+除了所有这些之外,[官方公告][6]还提到到开发人员的有用补充(增加了系统分析器和虚拟化改进):
+
+> 对于开发人员,GNOME 3.34 在 Sysprof 中包含更多数据源,使应用程序的性能分析更加容易。对 Builder 的多项改进中包括集成的 D-Bus 检查器。
+
+![Improved Sysprof tool in GNOME 3.34][7]
+
+### 如何获得GNOME 3.34?
+
+虽然新版本已经发布,但它还没有进入 Linux 发行版的官方存储库。所以,我们建议等待它,并在它作为更新包提供时进行升级。不管怎么说,如果你想构建它,你都可以在这里找到[源代码][8]。
+
+嗯,就是这样。如果你感兴趣,可以查看[完整版本说明][10]以了解技术细节。
+
+你如何看待新的 GNOME 3.34?
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/gnome-3-34-release/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://www.gnome.org/news/2019/03/gnome-3-32-released/
+[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/icon-grid-drag-gnome.png?ssl=1
+[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/gnome-calendar-improvements.jpg?ssl=1
+[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/background-panel-GNOME.png?resize=800%2C555&ssl=1
+[5]: https://itsfoss.com/librem-linux-phone/
+[6]: https://www.gnome.org/press/2019/09/gnome-3-34-released/
+[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/sysprof-gnome.jpg?resize=800%2C493&ssl=1
+[8]: https://download.gnome.org/
+[9]: https://itsfoss.com/fedora-26-release/
+[10]: https://help.gnome.org/misc/release-notes/3.34/
diff --git a/published/201909/20190914 Manjaro Linux Graduates From A Hobby Project To A Professional Project.md b/published/201909/20190914 Manjaro Linux Graduates From A Hobby Project To A Professional Project.md
new file mode 100644
index 0000000000..0f5ce59599
--- /dev/null
+++ b/published/201909/20190914 Manjaro Linux Graduates From A Hobby Project To A Professional Project.md
@@ -0,0 +1,78 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11349-1.html)
+[#]: subject: (Manjaro Linux Graduates From A Hobby Project To A Professional Project)
+[#]: via: (https://itsfoss.com/manjaro-linux-business-formation/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+Manjaro Linux 从业余爱好项目成长为专业项目
+======
+
+> Manjaro 正在走专业化路线。虽然 Manjaro 社区将负责项目的开发和其他相关活动,但该团队已成立了一家公司作为其法人实体处理商业协议和专业服务。
+
+Manjaro 是一个相当流行的 Linux 发行版,而它只是由三个人(Bernhard、Jonathan 和 Phili)于 2011 年激情之下创建的项目。现在,它是目前[最好的 Linux 发行版][1]之一,所以它不能真的一直还只是个业余爱好项目了,对吧。
+
+嗯,现在有个好消息:Manjaro 已经建立了一家新公司“[Manjaro GmbH & Co. KG]”,以 [Blue Systems][2] 为顾问,以便能够全职雇佣维护人员,并探索未来的商业机会。
+
+![][3]
+
+### 具体有什么变化?
+
+根据[官方公告][4],Manjaro 项目将保持不变。但是,成立了一家新公司来保护该项目,以允许他们制定法律合同、官方协议和进行其他潜在的商业活动。因此,这使得这个“业余爱好项目”成为了一项专业工作。
+
+除此之外,捐赠资金将转给非营利性的[财政托管][5]([CommunityBridge][6] 和 [OpenCollective][7]),让他们来代表项目接受和管理资金。请注意,这些捐赠没有被用于创建这个公司,因此,将资金转移给非营利的财务托管将在确保捐赠的同时也确保透明度。
+
+### 这会有何改善?
+
+随着这个公司的成立,(如开发者所述)新结构将以下列方式帮助 Manjaro:
+
+* 使开发人员能够全职投入 Manjaro 及其相关项目;
+* 在 Linux 相关的比赛和活动中与其他开发人员进行互动;
+* 保护 Manjaro 作为一个社区驱动项目的独立性,并保护其品牌;
+* 提供更快的安全更新,更有效地响应用户需求;
+* 提供在专业层面上作为公司行事的手段。
+
+Manjaro 团队还阐明了它将如何继续致力于社区:
+
+> Manjaro 的使命和目标将与以前一样 —— 支持 Manjaro 的协作开发及其广泛使用。这项工作将继续通过捐赠和赞助来支持,这些捐赠和赞助在任何情况下都不会被这个成立的公司使用。
+
+### 关于 Manjaro 公司的更多信息
+
+尽管他们提到该项目将独立于公司,但并非所有人都清楚当有了一家具有商业利益的公司时 Manjaro 与“社区”的关系。因此,该团队还在公告中澄清了他们作为一家公司的计划。
+
+> Manjaro GmbH & Co.KG 的成立旨在有效地参与商业协议、建立合作伙伴关系并提供专业服务。有了这个,Manjaro 开发者 Bernhard 和 Philip 现在可以全职工作投入到 Manjaro,而 Blue Systems 将担任顾问。
+
+> 公司将能够正式签署合同并承担职责和保障,而社区不能承担或承担责任。
+
+### 总结
+
+因此,通过这一举措以及商业机会,他们计划全职工作并聘请贡献者。
+
+当然,现在他们的意思是“业务”(我希望不是作为坏人)。对此公告的大多数反应都是积极的,我们都祝他们好运。虽然有些人可能对具有“商业”利益的“社区”项目持怀疑态度(还记得 [FreeOffice 和 Manjaro 的挫败][9]吗?),但我认为这是一个有趣的举措。
+
+你怎么看?请在下面的评论中告诉我们你的想法。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/manjaro-linux-business-formation/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/best-linux-distributions/
+[2]: https://www.blue-systems.com/
+[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/manjaro-gmbh.jpg?ssl=1
+[4]: https://forum.manjaro.org/t/manjaro-is-taking-the-next-step/102105
+[5]: https://en.wikipedia.org/wiki/Fiscal_sponsorship
+[6]: https://communitybridge.org/
+[7]: https://opencollective.com/
+[8]: https://itsfoss.com/linux-mint-hacked/
+[9]: https://itsfoss.com/libreoffice-freeoffice-manjaro-linux/
diff --git a/published/201909/20190915 Sandboxie-s path to-open source, update on the Pentagon-s open source initiative, open source in Hollywood,-and more.md b/published/201909/20190915 Sandboxie-s path to-open source, update on the Pentagon-s open source initiative, open source in Hollywood,-and more.md
new file mode 100644
index 0000000000..e70c9f8832
--- /dev/null
+++ b/published/201909/20190915 Sandboxie-s path to-open source, update on the Pentagon-s open source initiative, open source in Hollywood,-and more.md
@@ -0,0 +1,103 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11351-1.html)
+[#]: subject: (Sandboxie's path to open source, update on the Pentagon's open source initiative, open source in Hollywood, and more)
+[#]: via: (https://opensource.com/article/19/9/news-september-15)
+[#]: author: (Lauren Maffeo https://opensource.com/users/lmaffeo)
+
+开源新闻综述:五角大楼、好莱坞和 Sandboxie 的开源
+======
+
+> 不要错过两周以来最大的开源头条新闻。
+
+![Weekly news roundup with TV][1]
+
+在本期我们的开源新闻综述中有 Sandboxie 的开源之路、五角大楼开源计划的进一步变化、好莱坞开源等等!
+
+### 五角大楼不符合白宫对开源软件的要求
+
+2016 年,美国白宫要求每个美国政府机构必须在三年内开放至少 20% 的定制软件。2017 年有一篇关于这一倡议的[有趣文章][5],其中列出了一些令人激动的事情和面临的挑战。
+
+根据美国政府问责局(GAO)的说法,[美国五角大楼做的还远远不足][6]。
+
+在一篇关于 Nextgov 的文章中,Jack Corrigan 写道,截至 2019 年 7 月,美国五角大楼仅发布了 10% 的代码为开源代码。他们还没有实施的其它白宫任务包括要求制定开源软件政策和定制代码的清单。
+
+根据该报告,一些美国政府官员告诉 GAO,他们担心美国政府部门间共享代码的安全风险。他们还承认没有创建衡量开源工作成功的指标。美国五角大楼的首席技术官将五角大楼的规模列为不执行白宫的开源任务的原因。在周二发布的一份报告中,GAO 表示,“在(美国国防部)完全实施其试点计划并确定完成行政管理和预算局(OMB)要求的里程碑之前,该部门将无法达成显著的成本节约和效率的目的。”
+
+### Sandboxie 在开源的过程中变成了免费软件
+
+一家英国安全公司 Sophos Group plc 发布了[其流行的 Sandboxie 工具的免费版本][2],它用作Windows 的隔离操作环境([可在此下载][2])。
+
+Sophos 表示,由于 Sandboxie 不是其业务的核心,因此更容易做出的决定就是关闭它。但 Sandboxie 因为无需让用户的操作系统冒风险就可以在安全的环境中运行未知软件而[广受赞誉][3],因此该团队正在投入额外的工作将其作为开源软件发布。这个免费但非开源的中间阶段似乎与当前的系统设计有关,因为它需要激活密钥:
+
+> Sandboxie 目前使用许可证密钥来激活和授予仅针对付费客户开放的高级功能的访问权限(与使用免费版本的用户相比)。我们修改了代码,并发布了一个不限制任何功能的免费版本的更新版。换句话说,新的免费许可证将可以访问之前仅供付费客户使用的所有功能。
+
+受此工具的社区影响,Sophos 的高级领导人宣布发布 Sandboxie 版本 5.31.4,这个不受限制的程序版本将保持免费,直到该工具完全开源。
+
+> “Sandboxie 用户群代表了一些最热情、前瞻性和知识渊博的安全社区成员,我们不想让你失望,”[Sophos 的博文说到][4]。“经过深思熟虑后,我们认为让 Sandboxie 走下去的最佳方式是将其交还给用户,将其转换为开源工具。”
+
+### 志愿者团队致力于查找和数字化无版权书籍
+
+1924 年以前在美国出版的所有书籍都是[公有的、可以自由使用/复制的][7]。1964 年及之后出版的图书在出版日期后将保留 95 年的版权。但由于版权漏洞,1923 年至 1964 年间出版的书籍中有高达 75% 可以免费阅读和复制。现在只需要耗时确认那些书是什么。
+
+因此,一些图书馆、志愿者和档案管理员们联合起来了解哪些图书没有版权,然后将其数字化并上传到互联网。由于版权续约记录已经数字化,因此很容易判断 1923 年至 1964 年间出版的书籍是否更新了其版权。但是,由于试图提供的是反证,因此寻找缺乏版权更新的难度要大得多。
+
+参与者包括纽约公共图书馆(NYPL),它[最近解释了][8]为什么这个耗时的项目是值得的。为了帮助更快地找到更多书籍,NYPL 将许多记录转换为 XML 格式。这样可以更轻松地自动执行查找可以将哪些书籍添加到公共域的过程。
+
+### 好莱坞的学院软件基金会获得新成员
+
+微软和苹果公司宣布计划以学院软件基金会(ASWF)的高级会员做出贡献。他们将加入[创始董事会成员][9],其它成员还包括 Netflix、Google Cloud、Disney Studios 和 Sony Pictures。
+
+学院软件基金会于 2018 年作为[电影艺术与科学学院][10]和[Linux 基金会][11]的联合项目而启动。
+
+> 学院软件基金会(ASWF)的使命是提高贡献到内容创作行业的开源软件库的质量和数量;提供一个中立的论坛来协调跨项目的工作;提供通用的构建和测试基础架构;并为个人和组织提供参与推进我们的开源生态系统的明确途径。
+
+在第一年内,该基金会构建了 [OpenTimelineIO][12],这是一种开源 API 和交换格式,可帮助工作室团队跨部门协作。OpenTImelineIO 被该[基金会技术咨询委员会][13]去年 7 月正式接受为第五个托管项目。他们现在将它与 [OpenColorIO][14]、[OpenCue][15]、[OpenEXR][16] 和 [OpenVDB] [17] 并列维护。
+
+### 其它新闻
+
+* [Comcast 将开源网络软件投入生产环境][18]
+* [SD Times 本周开源项目:Ballerina][19]
+* [美国国防部努力实施开源计划][20]
+* [Kong 开源通用服务网格 Kuma][21]
+* [Eclipse 推出 Jakarta EE 8][22]
+
+一如既往地感谢 Opensource.com 的工作人员和主持人本周的帮助。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/news-september-15
+
+作者:[Lauren Maffeo][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/lmaffeo
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/weekly_news_roundup_tv.png?itok=B6PM4S1i (Weekly news roundup with TV)
+[2]: https://www.sandboxie.com/DownloadSandboxie
+[3]: https://betanews.com/2019/09/13/sandboxie-free-open-source/
+[4]: https://community.sophos.com/products/sandboxie/f/forum/115109/major-sandboxie-news-sandboxie-is-now-a-free-tool-with-plans-to-transition-it-to-an-open-source-tool/414522
+[5]: https://medium.com/@DefenseDigitalService/code-mil-an-open-source-initiative-at-the-pentagon-5ae4986b79bc
+[6]: https://www.nextgov.com/analytics-data/2019/09/pentagon-needs-make-more-software-open-source-watchdog-says/159832/
+[7]: https://www.vice.com/en_us/article/a3534j/libraries-and-archivists-are-scanning-and-uploading-books-that-are-secretly-in-the-public-domain
+[8]: https://www.nypl.org/blog/2019/09/01/historical-copyright-records-transparency
+[9]: https://variety.com/2019/digital/news/microsoft-apple-academy-software-foundation-1203334675/
+[10]: https://www.oscars.org/
+[11]: http://www.linuxfoundation.org/
+[12]: https://github.com/PixarAnimationStudios/OpenTimelineIO
+[13]: https://www.linuxfoundation.org/press-release/2019/07/opentimelineio-joins-aswf/
+[14]: https://opencolorio.org/
+[15]: https://www.opencue.io/
+[16]: https://www.openexr.com/
+[17]: https://www.openvdb.org/
+[18]: https://www.fiercetelecom.com/operators/comcast-puts-open-source-networking-software-into-production
+[19]: https://sdtimes.com/os/sd-times-open-source-project-of-the-week-ballerina/
+[20]: https://www.fedscoop.com/open-source-software-dod-struggles/
+[21]: https://sdtimes.com/micro/kong-open-sources-universal-service-mesh-kuma/
+[22]: https://devclass.com/2019/09/11/hey-were-open-source-again-eclipse-unveils-jakarta-ee-8/
diff --git a/published/201909/20190916 How to freeze and lock your Linux system (and why you would want to).md b/published/201909/20190916 How to freeze and lock your Linux system (and why you would want to).md
new file mode 100644
index 0000000000..37b0a31311
--- /dev/null
+++ b/published/201909/20190916 How to freeze and lock your Linux system (and why you would want to).md
@@ -0,0 +1,97 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11384-1.html)
+[#]: subject: (How to freeze and lock your Linux system (and why you would want to))
+[#]: via: (https://www.networkworld.com/article/3438818/how-to-freeze-and-lock-your-linux-system-and-why-you-would-want-to.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+如何冻结和锁定你的 Linux 系统
+======
+
+> 冻结终端窗口并锁定屏幕意味着什么 - 以及如何在 Linux 系统上管理这些活动。
+
+
+
+如何在 Linux 系统上冻结和“解冻”屏幕,很大程度上取决于这些术语的含义。有时“冻结屏幕”可能意味着冻结终端窗口,以便该窗口内的活动停止。有时它意味着锁定屏幕,这样就没人可以在你去拿一杯咖啡时,走到你的系统旁边代替你输入命令了。
+
+在这篇文章中,我们将研究如何使用和控制这些操作。
+
+### 如何在 Linux 上冻结终端窗口
+
+你可以输入 `Ctrl+S`(按住 `Ctrl` 键和 `s` 键)冻结 Linux 系统上的终端窗口。把 `s` 想象成“开始冻结”。如果在此操作后继续输入命令,那么你不会看到输入的命令或你希望看到的输出。实际上,命令将堆积在一个队列中,并且只有在通过输入 `Ctrl+Q` 解冻时才会运行。把它想象成“退出冻结”。
+
+查看其工作的一种简单方式是使用 `date` 命令,然后输入 `Ctrl+S`。接着再次输入 `date` 命令并等待几分钟后再次输入 `Ctrl+Q`。你会看到这样的情景:
+
+```
+$ date
+Mon 16 Sep 2019 06:47:34 PM EDT
+$ date
+Mon 16 Sep 2019 06:49:49 PM EDT
+```
+
+这两次时间显示的差距表示第二次的 `date` 命令直到你解冻窗口时才运行。
+
+无论你是坐在计算机屏幕前还是使用 PuTTY 等工具远程运行,终端窗口都可以冻结和解冻。
+
+这有一个可以派上用场的小技巧。如果你发现终端窗口似乎处于非活动状态,那么可能是你或其他人无意中输入了 `Ctrl+S`。那么,输入 `Ctrl+Q` 来尝试解决不妨是个不错的办法。
+
+### 如何锁定屏幕
+
+要在离开办公桌前锁定屏幕,请按住 `Ctrl+Alt+L` 或 `Super+L`(即按住 `Windows` 键和 `L` 键)。屏幕锁定后,你必须输入密码才能重新登录。
+
+### Linux 系统上的自动屏幕锁定
+
+虽然最佳做法建议你在即将离开办公桌时锁定屏幕,但 Linux 系统通常会在一段时间没有活动后自动锁定。 “消隐”屏幕(使其变暗)并实际锁定屏幕(需要登录才能再次使用)的时间取决于你个人首选项中的设置。
+
+要更改使用 GNOME 屏幕保护程序时屏幕变暗所需的时间,请打开设置窗口并选择 “Power” 然后 “Blank screen”。你可以选择 1 到 15 分钟或从不变暗。要选择屏幕变暗后锁定所需时间,请进入设置,选择 “Privacy”,然后选择 “Blank screen”。设置应包括 1、2、3、5 和 30 分钟或一小时。
+
+### 如何在命令行锁定屏幕
+
+如果你使用的是 GNOME 屏幕保护程序,你还可以使用以下命令从命令行锁定屏幕:
+
+```
+gnome-screensaver-command -l
+```
+
+这里是小写的 L,代表“锁定”。
+
+### 如何检查锁屏状态
+
+你还可以使用 `gnome-screensaver` 命令检查屏幕是否已锁定。使用 `--query` 选项,该命令会告诉你屏幕当前是否已锁定(即处于活动状态)。使用 `--time` 选项,它会告诉你锁定生效的时间。这是一个示例脚本:
+
+```
+#!/bin/bash
+
+gnome-screensaver-command --query
+gnome-screensaver-command --time
+```
+
+运行脚本将会输出:
+
+```
+$ ./check_lockscreen
+The screensaver is active
+The screensaver has been active for 1013 seconds.
+```
+
+#### 总结
+
+如果你记住了正确的控制方式,那么锁定终端窗口是很简单的。对于屏幕锁定,它的效果取决于你自己的设置,或者你是否习惯使用默认设置。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3438818/how-to-freeze-and-lock-your-linux-system-and-why-you-would-want-to.html
+
+作者:[Sandra Henry-Stocker][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
+[b]: https://github.com/lujun9972
+[3]: https://www.facebook.com/NetworkWorld/
+[4]: https://www.linkedin.com/company/network-world
diff --git a/published/201909/20190916 How to start developing with .NET.md b/published/201909/20190916 How to start developing with .NET.md
new file mode 100644
index 0000000000..81233361e9
--- /dev/null
+++ b/published/201909/20190916 How to start developing with .NET.md
@@ -0,0 +1,160 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11397-1.html)
+[#]: subject: (How to start developing with .NET)
+[#]: via: (https://opensource.com/article/19/9/getting-started-net)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+如何在 Linux/Windows/MacOS 上使用 .NET 进行开发
+======
+
+> 了解 .NET 开发平台启动和运行的基础知识。
+
+
+
+.NET 框架由 Microsoft 于 2000 年发布。该平台的开源实现 [Mono][2] 在 21 世纪初成为了争议的焦点,因为微软拥有 .NET 技术的多项专利,并且可能使用这些专利来终止 Mono 项目。幸运的是,在 2014 年,微软宣布 .NET 开发平台从此成为 MIT 许可下的开源平台,并在 2016 年收购了开发 Mono 的 Xamarin 公司。
+
+.NET 和 Mono 已经同时可用于 C#、F#、GTK+、Visual Basic、Vala 等的跨平台编程环境。使用 .NET 和 Mono 创建的程序已经应用于 Linux、BSD、Windows、MacOS、Android,甚至一些游戏机。你可以使用 .NET 或 Mono 来开发 .NET 应用。这两个都是开源的,并且都有活跃和充满活力的社区。本文重点介绍微软的 .NET 环境。
+
+### 如何安装 .NET
+
+.NET 下载被分为多个包:一个仅包含 .NET 运行时,另一个 .NET SDK 包含了 .NET Core 和运行时。根据架构和操作系统版本,这些包可能有多个版本。要开始使用 .NET 进行开发,你必须[安装该 SDK][3]。它为你提供了 [dotnet][4] 终端或 PowerShell 命令,你可以使用它们来创建和生成项目。
+
+#### Linux
+
+要在 Linux 上安装 .NET,首先将微软 Linux 软件仓库添加到你的计算机。
+
+在 Fedora 上:
+
+```
+$ sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
+$ sudo wget -q -O /etc/yum.repos.d/microsoft-prod.repo https://packages.microsoft.com/config/fedora/27/prod.repo
+```
+
+在 Ubuntu 上:
+
+```
+$ wget -q https://packages.microsoft.com/config/ubuntu/19.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
+$ sudo dpkg -i packages-microsoft-prod.deb
+```
+
+接下来,使用包管理器安装 SDK,将 `` 替换为当前版本的 .NET 版本:
+
+在 Fedora 上:
+
+```
+$ sudo dnf install dotnet-sdk-
+```
+
+在 Ubuntu 上:
+
+```
+$ sudo apt install apt-transport-https
+$ sudo apt update
+$ sudo apt install dotnet-sdk-
+```
+
+下载并安装所有包后,打开终端并输入下面命令确认安装:
+
+```
+$ dotnet --version
+X.Y.Z
+```
+
+#### Windows
+
+如果你使用的是微软 Windows,那么你可能已经安装了 .NET 运行时。但是,要开发 .NET 应用,你还必须安装 .NET Core SDK。
+
+首先,[下载安装程序][3]。请认准下载 .NET Core 进行跨平台开发(.NET Framework 仅适用于 Windows)。下载 .exe 文件后,双击该文件启动安装向导,然后单击两下进行安装:接受许可证并允许安装继续。
+
+![Installing dotnet on Windows][5]
+
+然后,从左下角的“应用程序”菜单中打开 PowerShell。在 PowerShell 中,输入测试命令:
+
+```
+PS C:\Users\osdc> dotnet
+```
+
+如果你看到有关 dotnet 安装的信息,那么说明 .NET 已正确安装。
+
+#### MacOS
+
+如果你使用的是 Apple Mac,请下载 .pkg 形式的 [Mac 安装程序][3]。下载并双击该 .pkg 文件,然后单击安装程序。你可能需要授予安装程序权限,因为该软件包并非来自 App Store。
+
+下载并安装所有软件包后,请打开终端并输入以下命令来确认安装:
+
+```
+$ dotnet --version
+X.Y.Z
+```
+
+### Hello .NET
+
+`dotnet` 命令提供了一个用 .NET 编写的 “hello world” 示例程序。或者,更准确地说,该命令提供了示例应用。
+
+首先,使用 `dotnet` 命令以及 `new` 和 `console` 参数创建一个控制台应用的项目目录及所需的代码基础结构。使用 `-o` 选项指定项目名称:
+
+```
+$ dotnet new console -o hellodotnet
+```
+
+这将在当前目录中创建一个名为 `hellodotnet` 的目录。进入你的项目目录并看一下:
+
+```
+$ cd hellodotnet
+$ dir
+hellodotnet.csproj obj Program.cs
+```
+
+`Program.cs` 是一个空的 C# 文件,它包含了一个简单的 Hello World 程序。在文本编辑器中打开查看它。微软的 Visual Studio Code 是一个使用 dotnet 编写的跨平台的开源应用,虽然它不是一个糟糕的文本编辑器,但它会收集用户的大量数据(在它的二进制发行版的许可证中授予了自己权限)。如果要尝试使用 Visual Studio Code,请考虑使用 [VSCodium][6],它是使用 Visual Studio Code 的 MIT 许可的源码构建的版本,而*没有*远程收集(请阅读[此文档][7]来禁止此构建中的其他形式追踪)。或者,只需使用现有的你最喜欢的文本编辑器或 IDE。
+
+新控制台应用中的样板代码为:
+
+```
+using System;
+
+namespace hellodotnet
+{
+ class Program
+ {
+ static void Main(string[] args)
+ {
+ Console.WriteLine("Hello World!");
+ }
+ }
+}
+```
+
+要运行该程序,请使用 `dotnet run` 命令:
+
+```
+$ dotnet run
+Hello World!
+```
+
+这是 .NET 和 `dotnet` 命令的基本工作流程。这里有完整的 [.NET C# 指南][8],并且都是与 .NET 相关的内容。关于 .NET 实战示例,请关注 [Alex Bunardzic][9] 在 opensource.com 中的变异测试文章。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/getting-started-net
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer)
+[2]: https://www.monodevelop.com/
+[3]: https://dotnet.microsoft.com/download
+[4]: https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet?tabs=netcore21
+[5]: https://opensource.com/sites/default/files/uploads/dotnet-windows-install.jpg (Installing dotnet on Windows)
+[6]: https://vscodium.com/
+[7]: https://github.com/VSCodium/vscodium/blob/master/DOCS.md
+[8]: https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/intro-to-csharp/
+[9]: https://opensource.com/users/alex-bunardzic (View user profile.)
diff --git a/published/201909/20190916 Linux Plumbers, Appwrite, and more industry trends.md b/published/201909/20190916 Linux Plumbers, Appwrite, and more industry trends.md
new file mode 100644
index 0000000000..8ca1e16da6
--- /dev/null
+++ b/published/201909/20190916 Linux Plumbers, Appwrite, and more industry trends.md
@@ -0,0 +1,92 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11355-1.html)
+[#]: subject: (Linux Plumbers, Appwrite, and more industry trends)
+[#]: via: (https://opensource.com/article/19/9/conferences-industry-trends)
+[#]: author: (Tim Hildred https://opensource.com/users/thildred)
+
+
+每周开源点评:Linux Plumbers、Appwrite
+======
+
+> 了解每周的开源社区和行业趋势。
+
+![Person standing in front of a giant computer screen with numbers, data][1]
+
+作为采用开源开发模式的企业软件公司的高级产品营销经理,这是我为产品营销人员、经理和其他相关人员发布的有关开源社区、市场和行业趋势的定期更新。以下是本次更新中我最喜欢的五篇文章。
+
+### 《在 Linux Plumbers 会议上解决 Linux 具体细节》
+
+- [文章地址][2]
+
+> Linux 的创建者 Linus Torvalds 告诉我,内核维护者峰会是顶级 Linux 内核开发人员的邀请制聚会。但是,虽然你可能认为这是关于规划 Linux 内核的未来的会议,但事实并非如此。“这个维护者峰会真的与众不同,因为它甚至不谈论技术问题。”相反,“全都谈的是关于创建和维护 Linux 内核的过程。”
+
+**影响**:这就像技术版的 Bilderberg 会议:你们举办的都是各种华丽的流行语会议,而在这里我们做出的才是真正的决定。不过我觉得,可能不太会涉及到私人飞机吧。(LCTT 译注:有关 Bilderberg 请自行搜索)
+
+### 《微软主办第一个 WSL 会议》
+
+- [文章地址][3]
+
+> [Whitewater Foundry][4] 是一家专注于 [Windows 的 Linux 子系统(WSL)][5]的创业公司,它的创始人 Hayden Barnes [宣布举办 WSLconf 1][6],这是 WSL 的第一次社区会议。该活动将于 2020 年 3 月 10 日至 11 日在华盛顿州雷德蒙市的微软总部 20 号楼举行。会议是合办的。我们已经知道将有来自[Pengwin(Whitewater 的 Linux for Windows)][7]、微软 WSL 和 Canonical 的 Ubuntu on WSL 开发人员的演讲和研讨会。
+
+**影响**:微软正在培育社区成长的种子,围绕它越来越多地采用开源软件并作出贡献。这足以让我眼前一亮。
+
+### 《Appwrite 简介:面向移动和 Web 开发人员的开源后端服务器》
+
+- [文章链接][10]
+
+> [Appwrite][11] 是一个新的[开源软件][12],用于前端和移动开发人员的端到端的后端服务器,可以让你更快地构建应用程序。[Appwrite][13] 的目标是抽象和简化 REST API 和工具背后的常见开发任务,以帮助开发人员更快地构建高级应用程序。
+>
+> 在这篇文章中,我将简要介绍一些主要的 [Appwrite][14] 服务,并解释它们的主要功能以及它们的设计方式,相比从头开始编写所有后端 API,这可以帮助你更快地构建下一个项目。
+
+**影响**:随着更多开源中间件变得更易于使用,软件开发越来越容易。Appwrite 声称可将开发时间和成本降低 70%。想象一下这对小型移动开发机构或个人开发者意味着什么。我很好奇他们将如何通过这种方式赚钱。
+
+### 《“不只是 IT”:开源技术专家说协作文化是政府转型的关键》
+
+- [文章链接][15]
+
+> AGL(敏捷的政府领导)正在为那些帮助政府更好地为公众工作的人们提供价值支持网络。该组织专注于我非常热衷的事情:DevOps、数字化转型、开源以及许多政府 IT 领导者首选的类似主题。AGL 为我提供了一个社区,可以了解当今最优秀和最聪明的人所做的事情,并与整个行业的同行分享这些知识。
+
+**影响**:不管你的政治信仰如何,对政府都很容易愤世嫉俗。我发现令人耳目一新的是,政府也是由一个个实际的人组成的,他们大多在尽力将相关技术应用于公益事业。特别是当该技术是开源的!
+
+### 《彭博社如何通过 Kubernetes 实现接近 90-95% 的硬件利用率》
+
+- [文章链接][16]
+
+> 2016 年,彭博社采用了 Kubernetes(当时仍处于 alpha 阶段中),自使用该项目的上游代码以来,取得了显著成果。Rybka 说:“借助 Kubernetes,我们能够非常高效地使用我们的硬件,使利用率接近 90% 到 95%。”Kubernetes 中的自动缩放使系统能够更快地满足需求。此外,Kubernetes “为我们提供了标准化我们构建和管理服务的方法的能力,这意味着我们可以花费更多时间专注于实际使用我们支持的开源工具,”数据和分析基础架构主管 Steven Bower 说,“如果我们想要在世界的另一个位置建立一个新的集群,那么这样做真的非常简单。一切都只是代码。配置就是代码。”
+
+**影响**:没有什么能像利用率统计那样穿过营销的迷雾。我听说过关于 Kube 的一件事是,当人们运行它时,他们不知道用它做什么。像这样的用例可以给他们(和你)一些想要的东西。
+
+*我希望你喜欢这个上周重要内容的清单,请下周回来了解有关开源社区、市场和行业趋势的更多信息。*
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/conferences-industry-trends
+
+作者:[Tim Hildred][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/thildred
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data)
+[2]: https://www.zdnet.com/article/working-on-linuxs-nuts-and-bolts-at-linux-plumbers/
+[3]: https://www.zdnet.com/article/microsoft-hosts-first-windows-subsystem-for-linux-conference/
+[4]: https://github.com/WhitewaterFoundry
+[5]: https://docs.microsoft.com/en-us/windows/wsl/install-win10
+[6]: https://www.linkedin.com/feed/update/urn:li:activity:6574754435518599168/
+[7]: https://www.zdnet.com/article/pengwin-a-linux-specifically-for-windows-subsystem-for-linux/
+[8]: https://canonical.com/
+[9]: https://ubuntu.com/
+[10]: https://medium.com/@eldadfux/introducing-appwrite-an-open-source-backend-server-for-mobile-web-developers-4be70731575d
+[11]: https://appwrite.io
+[12]: https://github.com/appwrite/appwrite
+[13]: https://medium.com/@eldadfux/introducing-appwrite-an-open-source-backend-server-for-mobile-web-developers-4be70731575d?source=friends_link&sk=b6a2be384aafd1fa5b1b6ff12906082c
+[14]: https://appwrite.io/
+[15]: https://medium.com/agile-government-leadership/more-than-just-it-open-source-technologist-says-collaborative-culture-is-key-to-government-c46d1489f822
+[16]: https://www.cncf.io/blog/2019/09/12/how-bloomberg-achieves-close-to-90-95-hardware-utilization-with-kubernetes/
diff --git a/published/201909/20190917 Getting started with Zsh.md b/published/201909/20190917 Getting started with Zsh.md
new file mode 100644
index 0000000000..460ab91c92
--- /dev/null
+++ b/published/201909/20190917 Getting started with Zsh.md
@@ -0,0 +1,215 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11378-1.html)
+[#]: subject: (Getting started with Zsh)
+[#]: via: (https://opensource.com/article/19/9/getting-started-zsh)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+Zsh 入门
+======
+
+> 从 Bash 进阶到 Z-shell,改进你的 shell 体验。
+
+
+
+Z-shell(Zsh)是一种 Bourne 式的交互式 POSIX shell,以其丰富的创新功能而著称。Z-Shell 用户经常会提及它的许多便利之处,赞誉它对效率的提高和丰富的自定义支持。
+
+如果你刚接触 Linux 或 Unix,但你的经验足以让你可以打开终端并运行一些命令的话,那么你可能使用的就是 Bash shell。Bash 可能是最具有代表意义的自由软件 shell,部分是因为它具有的先进的功能,部分是因为它是大多数流行的 Linux 和 Unix 操作系统上的默认 shell。但是,随着使用的次数越多,你可能会开始发现一些细节可能能够做的更好。开源有一个众所周知的地方,那就是选择。所以,许多人选择从 Bash “毕业”到 Z。
+
+### Zsh 介绍
+
+Shell 只是操作系统的接口。交互式 shell 程序允许你通过称为*标准输入*(stdin)的某个东西键入命令,并通过*标准输出*(stdout)和*标准错误*(stderr)获取输出。有很多种 shell,如 Bash、Csh、Ksh、Tcsh、Dash 和 Zsh。每个都有其开发者所认为最适合于 Shell 的功能。而这些功能的好坏,则取决于最终用户。
+
+Zsh 具有交互式制表符补全、自动文件搜索、支持正则表达式、用于定义命令范围的高级速记符,以及丰富的主题引擎等功能。这些功能也包含在你所熟悉的其它 Bourne 式 shell 环境中,这意味着,如果你已经了解并喜欢 Bash,那么你也会熟悉 Zsh,除此以外,它还有更多的功能。你可能会认为它是一种 Bash++。
+
+### 安装 Zsh
+
+用你的包管理器安装 Zsh。
+
+在 Fedora、RHEL 和 CentOS 上:
+
+```
+$ sudo dnf install zsh
+```
+
+在 Ubuntu 和 Debian 上:
+
+```
+$ sudo apt install zsh
+```
+
+在 MacOS 上你可以使用 MacPorts 安装它:
+
+```
+$ sudo port install zsh
+```
+
+或使用 Homebrew:
+
+```
+$ brew install zsh
+```
+
+在 Windows 上也可以运行 Zsh,但是只能在 Linux 层或类似 Linux 的层之上运行,例如 [Windows 的 Linux 子系统][2](WSL)或 [Cygwin][3]。这类安装超出了本文的范围,因此请参考微软的文档。
+
+### 设置 Zsh
+
+Zsh 不是终端模拟器。它是在终端仿真器中运行的 shell。因此,要启动 Zsh,必须首先启动一个终端窗口,例如 GNOME Terminal、Konsole、Terminal、iTerm2、rxvt 或你喜欢的其它终端。然后,你可以通过键入以下命令启动 Zsh:
+
+```
+$ zsh
+```
+
+首次启动 Zsh 时,会要求你选择一些配置选项。这些都可以在以后更改,因此请按 `1` 继续。
+
+```
+This is the Z Shell configuration function for new users, zsh-newuser-install.
+
+(q) Quit and do nothing.
+
+(0) Exit, creating the file ~/.zshrc
+
+(1) Continue to the main menu.
+```
+
+偏好设置分为四类,因此请从顶部开始。
+
+1. 第一个类使你可以选择在 shell 历史记录文件中保留多少个命令。默认情况下,它设置为 1,000 行。
+2. Zsh 补全是其最令人兴奋的功能之一。为了简单起见,请考虑使用其默认选项激活它,直到你习惯了它的工作方式。按 `1` 使用默认选项,按 `2` 手动设置选项。
+3. 选择 Emacs 式键绑定或 Vi 式键绑定。Bash 使用 Emacs 式绑定,因此你可能已经习惯了。
+4. 最后,你可以了解(以及设置或取消设置)Zsh 的一些精妙的功能。例如,当你提供不带命令的非可执行路径时,可以通过让 Zsh 来改变目录而无需你使用 `cd` 命令。要激活这些额外选项之一,请输入选项号并输入 `s` 进行设置。请尝试打开所有选项以获得完整的 Zsh 体验。你可以稍后通过编辑 `~/.zshrc` 取消设置它们。
+
+要完成配置,请按 `0`。
+
+### 使用 Zsh
+
+刚开始,Zsh 的使用感受就像使用 Bash 一样,这无疑是其众多功能之一。例如,Bash 和 Tcsh 之间就存在严重的差异,因此如果你必须在工作中或在服务器上使用 Bash,而 Zsh 就可以在家里轻松尝试和使用,这样在 Bash 和 Zsh 之间轻松切换就是一种便利。
+
+#### 在 Zsh 中改变目录
+
+正是这些微小的差异使 Zsh 变得好用。首先,尝试在没有 `cd` 命令的情况下,将目录更改为 `Documents` 文件夹。简直太棒了,难以置信。如果你输入的是目录路径而没有进一步的指令,Zsh 会更改为该目录:
+
+```
+% Documents
+% pwd
+/home/seth/Documents
+```
+
+而这会在 Bash 或任何其他普通 shell 中导致错误。但是 Zsh 却根本不是普通的 shell,而这仅仅才是开始。
+
+#### 在 Zsh 中搜索
+
+当你想使用普通 shell 程序查找文件时,可以使用 `find` 或 `locate` 命令。最起码,你可以使用 `ls -R` 来递归地列出一组目录。Zsh 内置有允许它在当前目录或任何其他子目录中查找文件的功能。
+
+例如,假设你有两个名为 `foo.txt` 的文件。一个位于你的当前目录中,另一个位于名为 `foo` 的子目录中。在 Bash Shell 中,你可以使用以下命令列出当前目录中的文件:
+
+```
+$ ls
+foo.txt
+```
+
+你可以通过明确指明子目录的路径来列出另一个目录:
+
+```
+$ ls foo
+foo.txt
+```
+
+要同时列出这两者,你必须使用 `-R` 开关,并结合使用 `grep`:
+
+```
+$ ls -R | grep foo.txt
+foo.txt
+foo.txt
+```
+
+但是在 Zsh 中,你可以使用 `**` 速记符号:
+
+```
+% ls **/foo.txt
+foo.txt
+foo.txt
+```
+
+你可以在任何命令中使用此语法,而不仅限于 `ls`。想象一下在这样的场景中提高的效率:将特定文件类型从一组目录中移动到单个位置、将文本片段串联到一个文件中,或对日志进行抽取。
+
+### 使用 Zsh 的制表符补全
+
+制表符补全是 Bash 和其他一些 Shell 中的高级用户功能,它变得司空见惯,席卷了 Unix 世界。Unix 用户不再需要在输入冗长而乏味的路径时使用通配符(例如输入 `/h*/s*h/V*/SCS/sc*/comp*/t*/a*/*9/04/LS*boat*v`,比输入 `/home/seth/Videos/SCS/scenes/composite/takes/approved/109/04/LS_boat-port-cargo-mover.mkv` 要容易得多)。相反,他们只要输入足够的唯一字符串即可按 `Tab` 键。例如,如果你知道在系统的根目录下只有一个以 `h` 开头的目录,则可以键入 `/h`,然后单击 `Tab`。快速、简单、高效。它还会确认路径存在;如果 `Tab` 无法完成任何操作,则说明你在错误的位置或输入了错误的路径部分。
+
+但是,如果你有许多目录有五个或更多相同的首字母,`Tab` 会坚决拒绝进行补全。尽管在大多数现代终端中,它将(至少会)显示阻止其进行猜测你的意思的文件,但通常需要按两次 `Tab` 键才能显示它们。因此,制表符补全通常会变成来回按下键盘上字母和制表符,以至于你好像在接受钢琴独奏会的训练。
+
+Zsh 通过循环可能的补全来解决这个小问题。如果键入 `*ls ~/D` 并按 `Tab`,则 Zsh 首先使用 `Documents` 来完成命令;如果再次按 `Tab`,它将提供 `Downloads`,依此类推,直到找到所需的选项。
+
+### Zsh 中的通配符
+
+在 Zsh 中,通配符的行为不同于 Bash 中用户所习惯的行为。首先,可以对其进行修改。例如,如果要列出当前目录中的所有文件夹,则可以使用修改后的通配符:
+
+```
+% ls
+dir0 dir1 dir2 file0 file1
+% ls *(/)
+dir0 dir1 dir2
+```
+
+在此示例中,`(/)` 限定了通配符的结果,因此 Zsh 仅显示目录。要仅列出文件,请使用 `(.)`。要列出符号链接,请使用 `(@)`。要列出可执行文件,请使用 `(*)`。
+
+```
+% ls ~/bin/*(*)
+fop exify tt
+```
+
+Zsh 不仅仅知道文件类型。它也可以使用相同的通配符修饰符约定根据修改时间列出。例如,如果要查找在过去八个小时内修改的文件,请使用 `mh` 修饰符(即 “modified hours” 的缩写)和小时的负整数:
+
+```
+% ls ~/Documents/*(mh-8)
+cal.org game.org home.org
+```
+
+要查找超过(例如)两天前修改过的文件,修饰符更改为 `md`(即 “modified day” 的缩写),并带上天数的正整数:
+
+```
+% ls ~/Documents/*(+2)
+holiday.org
+```
+
+通配符修饰符和限定符还可以做很多事情,因此,请阅读 [Zsh 手册页][4],以获取全部详细信息。
+
+#### 通配符的副作用
+
+要像在 Bash 中使用通配符一样使用它,有时必须在 Zsh 中对通配符进行转义。例如,如果要在 Bash 中将某些文件复制到服务器上,则可以使用如下通配符:
+
+```
+$ scp IMG_*.JPG seth@example.com:~/www/ph*/*19/09/14
+```
+
+这在 Bash 中有效,但是在 Zsh 中会返回错误,因为它在发出 `scp` 命令之前尝试在远程端扩展该变量(通配符)。为避免这种情况,必须转义远程变量(通配符):
+
+```
+% scp IMG_*.JPG seth@example.com:~/www/ph\*/\*19/09/14
+```
+
+当你切换到新的 shell 时,这些小异常可能会使你感到沮丧。使用 Zsh 时会遇到的问题不多(体验过 Zsh 后切换回 Bash 的可能遇到更多),但是当它们发生时,请保持镇定且坦率。严格遵守 POSIX 的情况很少会出错,但是如果失败了,请查找问题以解决并继续。对于许多在工作中困在一个 shell 上而在家中困在另一个 shell 上的用户来说,[hyperpolyglot.org][5] 已被证明其是无价的。
+
+在我的下一篇 Zsh 文章中,我将向你展示如何安装主题和插件以定制你的 Z-Shell 甚至 Z-ier。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/getting-started-zsh
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background)
+[2]: https://devblogs.microsoft.com/commandline/category/bash-on-ubuntu-on-windows/
+[3]: https://www.cygwin.com/
+[4]: https://linux.die.net/man/1/zsh
+[5]: http://hyperpolyglot.org/unix-shells
diff --git a/published/201909/20190917 How to Check Linux Mint Version Number - Codename.md b/published/201909/20190917 How to Check Linux Mint Version Number - Codename.md
new file mode 100644
index 0000000000..5f102dfa89
--- /dev/null
+++ b/published/201909/20190917 How to Check Linux Mint Version Number - Codename.md
@@ -0,0 +1,139 @@
+[#]: collector: (lujun9972)
+[#]: translator: (Morisun029)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11360-1.html)
+[#]: subject: (How to Check Linux Mint Version Number & Codename)
+[#]: via: (https://itsfoss.com/check-linux-mint-version/)
+[#]: author: (Sergiu https://itsfoss.com/author/sergiu/)
+
+如何查看 Linux Mint 版本号和代号
+======
+
+Linux Mint 每两年发布一次主版本(如 Mint 19),每六个月左右发布一次次版本(如 Mint 19.1、19.2 等)。 你可以自己升级 Linux Mint 版本,而次版本也会自动更新。
+
+在所有这些版本中,你可能想知道你正在使用的是哪个版本。了解 Linux Mint 版本号可以帮助你确定某个特定软件是否适用于你的系统,或者检查你的系统是否已达到使用寿命。
+
+你可能需要 Linux Mint 版本号有多种原因,你也有多种方法可以获取此信息。让我向你展示用图形和命令行的方式获取 Mint 版本信息。
+
+* [使用命令行查看 Linux Mint 版本信息][1]
+* [使用 GUI(图形用户界面)查看 Linux Mint 版本信息][2]
+
+### 使用终端查看 Linux Mint 版本号的方法
+
+![][3]
+
+我将介绍几种使用非常简单的命令查看 Linux Mint 版本号和代号的方法。 你可以从 “菜单” 中打开终端,或按 `CTRL+ALT+T`(默认热键)打开。
+
+本文中的最后两个命令还会输出你当前的 Linux Mint 版本所基于的 Ubuntu 版本。
+
+#### 1、/etc/issue
+
+从最简单的 CLI 方法开始,你可以打印出 `/etc/issue` 的内容来检查你的版本号和代号:
+
+```
+[email protected]:~$ cat /etc/issue
+Linux Mint 19.2 Tina \n \l
+```
+
+#### 2、hostnamectl
+
+![hostnamectl][4]
+
+这一个命令(`hostnamectl`)打印的信息几乎与“系统信息”中的信息相同。 你可以看到你的操作系统(带有版本号)以及你的内核版本。
+
+#### 3、lsb_release
+
+`lsb_release` 是一个非常简单的 Linux 实用程序,用于查看有关你的发行版本的基本信息:
+
+```
+[email protected]:~$ lsb_release -a
+No LSB modules are available.
+Distributor ID: LinuxMint
+Description: Linux Mint 19.2 Tina
+Release: 19.2
+Codename: tina
+```
+
+**注:** 我使用 `–a` 标签打印所有参数, 但你也可以使用 `-s` 作为简写格式,`-d` 用于描述等 (用 `man lsb_release` 查看所有选项)
+
+#### 4、/etc/linuxmint/info
+
+![/etc/linuxmint/info][5]
+
+这不是命令,而是 Linux Mint 系统上的文件。只需使用 `cat` 命令将其内容打印到终端,然后查看你的版本号和代号。
+
+#### 5、使用 /etc/os-release 命令也可以获取到 Ubuntu 代号
+
+![/etc/os-release][7]
+
+Linux Mint 基于 Ubuntu。每个 Linux Mint 版本都基于不同的 Ubuntu 版本。了解你的 Linux Mint 版本所基于的 Ubuntu 版本有助你在必须要使用 Ubuntu 版本号的情况下使用(比如你需要在 [Linux Mint 中安装最新的 Virtual Box][8]添加仓库时)。
+
+`os-release` 则是另一个类似于 `info` 的文件,向你展示 Linux Mint 所基于的 Ubuntu 版本代号。
+
+#### 6、使用 /etc/upstream-release/lsb-release 只获取 Ubuntu 的基本信息
+
+如果你只想要查看有关 Ubuntu 的基本信息,请输出 `/etc/upstream-release/lsb-release`:
+
+```
+[email protected]:~$ cat /etc/upstream-release/lsb-release
+DISTRIB_ID=Ubuntu
+DISTRIB_RELEASE=18.04
+DISTRIB_CODENAME=bionic
+DISTRIB_DESCRIPTION="Ubuntu 18.04 LTS"
+```
+
+特别提示:[你可以使用 uname 命令查看 Linux 内核版本][9]。
+
+```
+[email protected]:~$ uname -r
+4.15.0-54-generic
+```
+
+**注:** `-r` 代表 release,你可以使用 `man uname` 查看其他信息。
+
+### 使用 GUI 查看 Linux Mint 版本信息
+
+如果你对终端和命令行不满意,可以使用图形方法。如你所料,这个非常明了。
+
+打开“菜单” (左下角),然后转到“偏好设置 > 系统信息”:
+
+![Linux Mint 菜单][10]
+
+或者,在菜单中,你可以搜索“System Info”:
+
+![Menu Search System Info][11]
+
+在这里,你可以看到你的操作系统(包括版本号),内核和桌面环境的版本号:
+
+![System Info][12]
+
+### 总结
+
+我已经介绍了一些不同的方法,用这些方法你可以快速查看你正在使用的 Linux Mint 的版本和代号(以及所基于的 Ubuntu 版本和内核)。我希望这个初学者教程对你有所帮助。请在评论中告诉我们你最喜欢哪个方法!
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/check-linux-mint-version/
+
+作者:[Sergiu][a]
+选题:[lujun9972][b]
+译者:[Morisun029](https://github.com/Morisun029)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/sergiu/
+[b]: https://github.com/lujun9972
+[1]: tmp.pL5Hg3N6Qt#terminal
+[2]: tmp.pL5Hg3N6Qt#GUI
+[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/check-linux-mint-version.png?ssl=1
+[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/hostnamectl.jpg?ssl=1
+[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/linuxmint_info.jpg?ssl=1
+[6]: https://itsfoss.com/rid-google-chrome-icons-dock-elementary-os-freya/
+[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/os_release.jpg?ssl=1
+[8]: https://itsfoss.com/install-virtualbox-ubuntu/
+[9]: https://itsfoss.com/find-which-kernel-version-is-running-in-ubuntu/
+[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/linux_mint_menu.jpg?ssl=1
+[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/menu_search_system_info.jpg?ssl=1
+[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/system_info.png?ssl=1
diff --git a/published/201909/20190918 Amid Epstein Controversy, Richard Stallman is Forced to Resign as FSF President.md b/published/201909/20190918 Amid Epstein Controversy, Richard Stallman is Forced to Resign as FSF President.md
new file mode 100644
index 0000000000..e8a658cebc
--- /dev/null
+++ b/published/201909/20190918 Amid Epstein Controversy, Richard Stallman is Forced to Resign as FSF President.md
@@ -0,0 +1,146 @@
+[#]: collector: (lujun9972)
+[#]: translator: (name1e5s)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11358-1.html)
+[#]: subject: (Amid Epstein Controversy, Richard Stallman is Forced to Resign as FSF President)
+[#]: via: (https://itsfoss.com/richard-stallman-controversy/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+Richard Stallman 被迫辞去 FSF 主席的职务
+======
+
+> Richard Stallman,自由软件基金会的创建者以及主席,已经辞去主席及董事会职务。此前,因为 Stallman 对于爱泼斯坦事件中的受害者的观点,一小撮活动家以及媒体人发起了清除 Stallman 的运动。这份声明就是在这些活动后发生的。阅读全文以获得更多信息。
+
+![][1]
+
+### Stallman 事件的背景概述
+
+如果你不知道这次事件发生的前因后果,请看本段的详细信息。
+
+[Richard Stallman][2],66岁,是就职于 [MIT][3] 的计算机科学家。他最著名的成就就是在 1983 年发起了[自由软件运动][4]。他也开发了 GNU 项目旗下的部分软件,比如 GCC 和 Emacs。受自由软件运动影响选择使用 GPL 开源协议的项目不计其数。Linux 是其中最出名的项目之一。
+
+[Jeffrey Epstein][5](爱泼斯坦),美国亿万富翁,金融大佬。其涉嫌为社会上流精英提供性交易服务(其中有未成年少女)而被指控成为性犯罪者。在受审期间,爱泼斯坦在监狱中自杀身亡。
+
+[Marvin Lee Minsky][6],MIT 知名计算机科学家。他在 MIT 建立了人工智能实验室。2016 年,88 岁的 Minsky 逝世。在 Minsky 逝世后,一位名为 Misky 的爱泼斯坦事件受害者声称其在未成年时曾被“诱导”到爱泼斯坦的私人岛屿,与之发生性关系。
+
+但是这些与 Richard Stallman 有什么关系?这要从 Stallman 发给 MIT 计算机科学与人工智能实验室(CSAIL)的学生以及附属机构就爱泼斯坦的捐款提出抗议的邮件列表的邮件说起。邮件全文翻译如下:
+
+> 周五事件的公告对 Marvin Minsky 来说是不公正的。
+>
+> “已故的人工智能 ‘先锋’ Marvin Minsky (被控告侵害了爱泼斯坦事件的受害者之一\[2])”
+>
+> 不公正之处在于 “侵害” 这个用语。“性侵犯” 这个用语非常的糢糊,夸大了指控的严重性:宣称某人做了 X 但误导别人,让别人觉得这个人做了 Y,Y 远远比 X 严重。
+>
+> 上面引用的指控显然就是夸大。报导声称 Minksy 与爱泼斯坦的女眷之一发生了性关系(详见 )。我们假设这是真的(我找不到理由不相信)。
+>
+> “侵害” 这个词,意味着他使用了某种暴力。但那篇报道并没有提到这个,只说了他们发生了性关系。
+>
+> 我们可以想像很多种情况,但最合理的情况是,她在 Marvin 面前表现的像是完全自愿的。假设她是被爱泼斯坦强迫的,那爱泼斯坦有充足的理由让她对大多数人守口如瓶。
+>
+> 从各种的指控夸大事例中,我总结出,在指控时使用“性侵犯”是绝对错误的。
+>
+> 无论你想要批判什么行为,你都应该使用特定的词汇来描述,以此避免批判的本质的道德模糊性。
+
+### “清除 Stallman” 的呼吁
+
+‘爱泼斯坦’在美国是颇具争议的‘话题’。Stallman 对该敏感事件做出如此鲁莽的 “知识陈述” 不会有好结果,事实也是如此。
+
+一位机器人学工程师从她的朋友那里收到了转发的邮件并发起了一个[清除 Stallman 的活动][7]。她要的不是澄清或者道歉,她只想要清除斯托曼,就算这意味着 “将 MIT 夷为平地” 也在所不惜。
+
+> 是,至少 Stallman 没有被控强奸任何人。但这就是我们的最高标准吗?这所声望极高的学院坚持的标准就是这样的吗?如果这是麻省理工学院想要捍卫的、想要代表的标准的话,还不如把这破学校夷为平地…
+>
+> 如果有必要的话,就把所有人都清除出去,之后从废墟中建立出更好的秩序。
+>
+> —— Salem,发起“清除 Stallman“运动的机器人学专业学生
+
+Salem 的声讨最初没有被主流媒体重视。但它还是被反对软件行业内的精英崇拜以及性别偏见的积极分子发现了。
+
+> [#epstein][8] [#MIT][9] 嗨 记者没有回复我我很生气就自己写了这么个故事。作为 MIT 的校友我还真是高兴啊🙃
+>
+> — SZJG (@selamjie) [September 12, 2019][10]
+
+.
+
+> 是不是对于性侵儿童的 “杰出混蛋” 我们也可以辩护说 “万一这是你情我愿的”
+>
+> — Tracy Chou 👩🏻💻 (@triketora) [September 13, 2019][11]
+
+.
+
+> 多年来我就一直发推说 Richard "RMS" Stallman 这人有多恶心 —— 恋童癖、厌女症、还残障歧视
+>
+> 不可避免的是,每次我这样做,都会有老哥检查我的数据来源,然后说 “这都是几年前的事了!他现在变了!”
+>
+> 变个屁。
+>
+> — Sarah Mei (@sarahmei) [September 12, 2019][12]
+
+下面是 Sage Sharp 开头的一篇关于 Stallman 的行为如何对科技人员产生负面影响的帖子:
+
+> 👇大家说下 Richard Stallman 对科技从业者的影响吧,尤其是女性。 [例如: 强奸、乱伦、残障歧视、性交易]
+>
+> [@fsf][13] 有必要永久禁止 Richard Stallman 担任自由软件基金会董事会主席。
+>
+> — Sage Sharp (@\_sagesharp\_) [September 16, 2019][14]
+
+Stallman 一直以来也不是一个圣人。他粗暴,不合时宜、多年来一直在开带有性别歧视的笑话。你可以在[这里][15]和[这里][16]读到。
+
+很快这个消息就被 [The Vice][17]、[每日野兽][18],[未来主义][19]等大媒体采访。他们把 Stallman 描绘成爱泼斯坦的捍卫者。在强烈的抗议声中,[GNOME 执行董事威胁要结束 GNOME 和 FSF 之间的关系][20]。
+
+最后,Stallman 先是从 MIT 辞职,现在又从 [自由软件基金会][21] 辞职。
+
+![][22]
+
+### 危险的特权?
+
+我们见识到了,把一个人从他创建并为之工作了三十多年的组织中驱逐出去仅仅需要五天。这甚至还是在 Stallman 没有参与性交易丑闻的情况下。
+
+其中一些 “活动家” 过去也曾[针对过 Linux 的作者 Linus Torvalds][23]。Linux 基金会背后的管理层预见到了科技行业激进主义的增长趋势,因此他们制定了[适用于 Linux 内核开发的行为准则][24]并[强制 Torvalds 接受培训以改善他的行为][25]。如果他们没有采取纠正措施,可能 Torvalds 也已经被批倒批臭了。
+
+忽视技术支持者的鲁莽行为和性别歧视是不可接受的,但是对于那些遇到不同意某种流行观点的人就进行声讨,施以私刑也是不道德的做法。我不支持 Stallman 和他过去的言论,但我也不能接受他以这种方式(被迫?)辞职。
+
+Techrights 对此有一些有趣的评论,你可以在[这里][26]和[这里][27]看到。
+
+*你对此事有何看法?请文明分享你的观点和意见。过激评论将不会公布。*
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/richard-stallman-controversy/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[name1e5s](https://github.com/name1e5s)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/stallman-conroversy.png?w=800&ssl=1
+[2]: https://en.wikipedia.org/wiki/Richard_Stallman
+[3]: https://en.wikipedia.org/wiki/Massachusetts_Institute_of_Technology
+[4]: https://en.wikipedia.org/wiki/Free_software_movement
+[5]: https://en.wikipedia.org/wiki/Jeffrey_Epstein
+[6]: https://en.wikipedia.org/wiki/Marvin_Minsky
+[7]: https://medium.com/@selamie/remove-richard-stallman-fec6ec210794
+[8]: https://twitter.com/hashtag/epstein?src=hash&ref_src=twsrc%5Etfw
+[9]: https://twitter.com/hashtag/MIT?src=hash&ref_src=twsrc%5Etfw
+[10]: https://twitter.com/selamjie/status/1172244207978897408?ref_src=twsrc%5Etfw
+[11]: https://twitter.com/triketora/status/1172443389536555009?ref_src=twsrc%5Etfw
+[12]: https://twitter.com/sarahmei/status/1172283772428906496?ref_src=twsrc%5Etfw
+[13]: https://twitter.com/fsf?ref_src=twsrc%5Etfw
+[14]: https://twitter.com/_sagesharp_/status/1173637138413318144?ref_src=twsrc%5Etfw
+[15]: https://geekfeminism.wikia.org/wiki/Richard_Stallman
+[16]: https://medium.com/@selamie/remove-richard-stallman-appendix-a-a7e41e784f88
+[17]: https://www.vice.com/en_us/article/9ke3ke/famed-computer-scientist-richard-stallman-described-epstein-victims-as-entirely-willing
+[18]: https://www.thedailybeast.com/famed-mit-computer-scientist-richard-stallman-defends-epstein-victims-were-entirely-willing
+[19]: https://futurism.com/richard-stallman-epstein-scandal
+[20]: https://blog.halon.org.uk/2019/09/gnome-foundation-relationship-gnu-fsf/
+[21]: https://www.fsf.org/news/richard-m-stallman-resigns
+[22]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/richard-stallman.png?resize=800%2C94&ssl=1
+[23]: https://www.newyorker.com/science/elements/after-years-of-abusive-e-mails-the-creator-of-linux-steps-aside
+[24]: https://itsfoss.com/linux-code-of-conduct/
+[25]: https://itsfoss.com/torvalds-takes-a-break-from-linux/
+[26]: http://techrights.org/2019/09/15/media-attention-has-been-shifted/
+[27]: http://techrights.org/2019/09/16/stallman-removed/
diff --git a/published/201909/20190918 How to remove carriage returns from text files on Linux.md b/published/201909/20190918 How to remove carriage returns from text files on Linux.md
new file mode 100644
index 0000000000..2f746068d7
--- /dev/null
+++ b/published/201909/20190918 How to remove carriage returns from text files on Linux.md
@@ -0,0 +1,111 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11389-1.html)
+[#]: subject: (How to remove carriage returns from text files on Linux)
+[#]: via: (https://www.networkworld.com/article/3438857/how-to-remove-carriage-returns-from-text-files-on-linux.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+如何在 Linux 中删除文本中的回车字符
+======
+
+> 当回车字符(`Ctrl+M`)让你紧张时,别担心。有几种简单的方法消除它们。
+
+
+
+“回车”字符可以往回追溯很长一段时间 —— 早在打字机上就有一个机械装置或杠杆将承载纸滚筒的机架移到右边,以便可以重新在左侧输入字母。他们在 Windows 上的文本文件上保留了它,但从未在 Linux 系统上使用过。当你尝试在 Linux 上处理在 Windows 上创建的文件时,这种不兼容性有时会导致问题,但这是一个非常容易解决的问题。
+
+如果你使用 `od`(八进制转储)命令查看文件,那么回车(也用 `Ctrl+M` 代表)字符将显示为八进制的 15。字符 `CRLF` 通常用于表示 Windows 文本文件中的一行结束的回车符和换行符序列。那些注意看八进制转储的会看到 `\r\n`。相比之下,Linux 文本仅以换行符结束。
+
+这有一个 `od` 输出的示例,高亮显示了行中的 `CRLF` 字符,以及它的八进制。
+
+```
+$ od -bc testfile.txt
+0000000 124 150 151 163 040 151 163 040 141 040 164 145 163 164 040 146
+ T h i s i s a t e s t f
+0000020 151 154 145 040 146 162 157 155 040 127 151 156 144 157 167 163
+ i l e f r o m W i n d o w s
+0000040 056 015 012 111 164 047 163 040 144 151 146 146 145 162 145 156 <==
+ . \r \n I t ' s d i f f e r e n <==
+0000060 164 040 164 150 141 156 040 141 040 125 156 151 170 040 164 145
+ t t h a n a U n i x t e
+0000100 170 164 040 146 151 154 145 015 012 167 157 165 154 144 040 142 <==
+ x t f i l e \r \n w o u l d b <==
+```
+
+虽然这些字符不是大问题,但是当你想要以某种方式解析文本,并且不希望就它们是否存在进行编码时,这有时候会产生干扰。
+
+### 3 种从文本中删除回车符的方法
+
+幸运的是,有几种方法可以轻松删除回车符。这有三个选择:
+
+#### dos2unix
+
+你可能会在安装时遇到麻烦,但 `dos2unix` 可能是将 Windows 文本转换为 Unix/Linux 文本的最简单方法。一个命令带上一个参数就行了。不需要第二个文件名。该文件会被直接更改。
+
+```
+$ dos2unix testfile.txt
+dos2unix: converting file testfile.txt to Unix format...
+```
+
+你应该会发现文件长度减少,具体取决于它包含的行数。包含 100 行的文件可能会缩小 99 个字符,因为只有最后一行不会以 `CRLF` 字符结尾。
+
+之前:
+
+```
+-rw-rw-r-- 1 shs shs 121 Sep 14 19:11 testfile.txt
+```
+
+之后:
+
+```
+-rw-rw-r-- 1 shs shs 118 Sep 14 19:12 testfile.txt
+```
+
+如果你需要转换大量文件,不用每次修复一个。相反,将它们全部放在一个目录中并运行如下命令:
+
+```
+$ find . -type f -exec dos2unix {} \;
+```
+
+在此命令中,我们使用 `find` 查找常规文件,然后运行 `dos2unix` 命令一次转换一个。命令中的 `{}` 将被替换为文件名。运行时,你应该处于包含文件的目录中。此命令可能会损坏其他类型的文件,例如除了文本文件外在上下文中包含八进制 15 的文件(如,镜像文件中的字节)。
+
+#### sed
+
+你还可以使用流编辑器 `sed` 来删除回车符。但是,你必须提供第二个文件名。以下是例子:
+
+```
+$ sed -e “s/^M//” before.txt > after.txt
+```
+
+一件需要注意的重要的事情是,请不要输入你看到的字符。你必须按下 `Ctrl+V` 后跟 `Ctrl+M` 来输入 `^M`。`s` 是替换命令。斜杠将我们要查找的文本(`Ctrl + M`)和要替换的文本(这里为空)分开。
+
+#### vi
+
+你甚至可以使用 `vi` 删除回车符(`Ctrl+M`),但这里假设你没有打开数百个文件,或许也在做一些其他的修改。你可以键入 `:` 进入命令行,然后输入下面的字符串。与 `sed` 一样,命令中 `^M` 需要通过 `Ctrl+V` 输入 `^`,然后 `Ctrl+M` 插入 `M`。`%s` 是替换操作,斜杠再次将我们要删除的字符和我们想要替换它的文本(空)分开。 `g`(全局)意味在所有行上执行。
+
+```
+:%s/^M//g
+```
+
+### 总结
+
+`dos2unix` 命令可能是最容易记住的,也是从文本中删除回车的最可靠的方法。其他选择使用起来有点困难,但它们提供相同的基本功能。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3438857/how-to-remove-carriage-returns-from-text-files-on-linux.html
+
+作者:[Sandra Henry-Stocker][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
+[b]: https://github.com/lujun9972
+[1]: https://www.flickr.com/photos/kmsiever/5895380540/in/photolist-9YXnf5-cNmpxq-2KEvib-rfecPZ-9snnkJ-2KAcDR-dTxzKW-6WdgaG-6H5i46-2KzTZX-7cnSw7-e3bUdi-a9meh9-Zm3pD-xiFhs-9Hz6YM-ar4DEx-4PXAhw-9wR4jC-cihLcs-asRFJc-9ueXvG-aoWwHq-atwL3T-ai89xS-dgnntH-5en8Te-dMUDd9-aSQVn-dyZqij-cg4SeS-abygkg-f2umXt-Xk129E-4YAeNn-abB6Hb-9313Wk-f9Tot-92Yfva-2KA7Sv-awSCtG-2KDPzb-eoPN6w-FE9oi-5VhaNf-eoQgx7-eoQogA-9ZWoYU-7dTGdG-5B1aSS
+[3]: https://www.facebook.com/NetworkWorld/
+[4]: https://www.linkedin.com/company/network-world
diff --git a/published/201909/20190918 Microsoft brings IBM iron to Azure for on-premises migrations.md b/published/201909/20190918 Microsoft brings IBM iron to Azure for on-premises migrations.md
new file mode 100644
index 0000000000..4063ab4778
--- /dev/null
+++ b/published/201909/20190918 Microsoft brings IBM iron to Azure for on-premises migrations.md
@@ -0,0 +1,55 @@
+[#]: collector: (lujun9972)
+[#]: translator: (Morisun029)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11375-1.html)
+[#]: subject: (Microsoft brings IBM iron to Azure for on-premises migrations)
+[#]: via: (https://www.networkworld.com/article/3438904/microsoft-brings-ibm-iron-to-azure-for-on-premises-migrations.html)
+[#]: author: (Andy Patrizio https://www.networkworld.com/author/Andy-Patrizio/)
+
+Skytap 和微软将 IBM 机器搬到了 Azure
+======
+
+> 微软再次证明了其摒弃了“非我发明”这一态度来支持客户。
+
+
+
+当微软将 Azure 作为其 Windows 服务器操作系统的云计算版本发布时,它并没有使其成为仅支持 Windows 系统的版本,它还支持 Linux 系统,并且在短短几年内[其 Linux 实例的数量现在已经超过了Windows 实例的数量][1]。
+
+很高兴看到微软终于摆脱了这种长期以来非常有害的“非我发明”态度,该公司的最新举动确实令人惊讶。
+
+微软与一家名为 Skytap 的公司合作,以在 Azure 云服务上提供 IBM Power9 实例,可以在 Azure 云内运行基于 Power 的系统,该系统将与其已有的 Xeon 和 Epyc 实例一同作为 Azure 的虚拟机(VM)。
+
+Skytap 是一家有趣的公司。它由华盛顿大学的三位教授创立,专门研究本地遗留硬件的云迁移,如 IBM System I 或 Sparc 的云迁移。该公司在西雅图拥有一个数据中心,以 IBM 的硬件运行 IBM 的 PowerVM 管理程序,并且对在美国和英格兰的 IBM 数据中心提供主机托管。
+
+该公司的座右铭是快速迁移,然后按照自己的节奏进行现代化。因此,它专注于帮助一些企业将遗留系统迁移到云,然后实现应用程序的现代化,这也是它与微软合作的目的。Azure 将通过为企业提供平台来提高传统应用程序的价值,而无需花费巨额费用重写一个新平台。
+
+Skytap 提供了预览,可以看到使用 Skytap 上的 DB2 提升和扩展原有的 IBM i 应用程序以及通过 Azure 的物联网中心进行扩展时可能发生的情况。该应用程序无缝衔接新旧架构,并证明了不需要完全重写可靠的 IBM i 应用程序即可从现代云功能中受益。
+
+### 迁移到 Azure
+
+根据协议,微软将把 IBM 的 Power S922 服务器部署在一个未声明的 Azure 区域。这些机器可以运行 PowerVM 管理程序,这些管理程序支持老式 IBM 操作系统以及 Linux 系统。
+
+Skytap 首席执行官布拉德·希克在一份声明中说道:“通过先替换旧技术来迁移上云既耗时又冒险。……Skytap 的愿景一直是通过一些小小的改变和较低的风险实现企业系统到云平台的迁移。与微软合作,我们将为各种遗留应用程序迁移到 Azure 提供本地支持,包括那些在 IBM i、AIX 和 Power Linux 上运行的程序。这将使企业能够通过使用 Azure 服务进行现代化来延长传统系统的寿命并增加其价值。”
+
+随着基于 Power 应用程序的现代化,Skytap 随后将引入 DevOps CI/CD 工具链来加快软件的交付。迁移到 Azure 的 Skytap 上后,客户将能够集成 Azure DevOps,以及 Power 的 CI/CD 工具链,例如 Eradani 和 UrbanCode。
+
+这些听起来像是迈出了第一步,但这意味着以后将会实现更多,尤其是在应用程序迁移方面。如果它仅在一个 Azure 区域中,听起来好像它们正在对该项目进行测试和验证,并可能在今年晚些时候或明年进行扩展。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3438904/microsoft-brings-ibm-iron-to-azure-for-on-premises-migrations.html
+
+作者:[Andy Patrizio][a]
+选题:[lujun9972][b]
+译者:[Morisun029](https://github.com/Morisun029)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.networkworld.com/author/Andy-Patrizio/
+[b]: https://github.com/lujun9972
+[1]: https://www.openwall.com/lists/oss-security/2019/06/27/7
+[2]: https://www.networkworld.com/article/3119362/hybrid-cloud/how-to-make-hybrid-cloud-work.html#tk.nww-fsb
+[3]: https://www.facebook.com/NetworkWorld/
+[4]: https://www.linkedin.com/company/network-world
diff --git a/published/201909/20190918 Oracle Unleashes World-s Fastest Database Machine ‘Exadata X8M.md b/published/201909/20190918 Oracle Unleashes World-s Fastest Database Machine ‘Exadata X8M.md
new file mode 100644
index 0000000000..8721fea8c8
--- /dev/null
+++ b/published/201909/20190918 Oracle Unleashes World-s Fastest Database Machine ‘Exadata X8M.md
@@ -0,0 +1,64 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11366-1.html)
+[#]: subject: (Oracle Unleashes World’s Fastest Database Machine ‘Exadata X8M’)
+[#]: via: (https://opensourceforu.com/2019/09/oracle-unleashes-worlds-fastest-database-machine-exadata-x8m/)
+[#]: author: (Longjam Dineshwori https://opensourceforu.com/author/dineshwori-longjam/)
+
+Oracle 发布全球最快的数据库机器 Exadata X8M
+======
+
+> Exadata X8M 是第一台具有集成持久内存和 RoCE 的数据库机器。Oracle 还宣布推出 Oracle 零数据丢失恢复设备 X8M(ZDLRA)。
+
+
+
+Oracle 发布了新的 Exadata 数据库机器 X8M,旨在为数据库基础架构市场树立新的标杆。
+
+Exadata X8M 结合了英特尔 Optane DC 持久存储器和通过融合以太网(RoCE)的 100 千兆的远程直接内存访问(RDMA)来消除存储瓶颈,并显著提高性能,其适用于最苛刻的工作负载,如在线事务处理(OLTP)、分析、物联网、欺诈检测和高频交易。
+
+“借助 Exadata X8M,我们可以提供内存级的性能,同时为 OLTP 和分析提供共享存储的所有优势,”Oracle 任务关键型数据库技术执行副总裁 Juan Loaiza 说。
+
+“使用对共享持久存储器的直接数据库访问将响应时间减少一个数量级,可加速每个 OLTP 应用程序,它是需要实时访问大量数据的应用程序的游戏规则改变者,例如欺诈检测和个性化购物,”官方补充。
+
+### 它有什么独特之处?
+
+Oracle Exadata X8M 使用 RDMA 让数据库直接访问智能存储服务器中的持久内存,从而绕过整个操作系统、IO 和网络软件堆栈。这导致更低的延迟和更高的吞吐量。使用 RDMA 绕过软件堆栈还可以释放存储服务器上的 CPU 资源,以执行更多智能扫描查询来支持分析工作负载。
+
+### 更少的存储瓶颈
+
+“高性能 OLTP 应用需要高的每秒输入/输出操作(IOPS)和低延迟。直接数据库访问共享持久性内存可将SQL 读取的峰值性能提升至 1600 万 IOPS,比行业领先的 Exadata X8 高出 2.5 倍,“Oracle 在一份声明中表示。
+
+此外,Exadata X8M 通过使远程 IO 延迟低于 19 微秒,大大减少了关键数据库 IO 的延迟 —— 这比 Exadata X8 快 10 倍以上。即使对于每秒需要数百万 IO 的工作负载,也可实现这些超低延迟。
+
+### 比 AWS 和 Azure 更高效
+
+该公司声称,与 Oracle 最快的 Amazon RDS 存储相比,Exadata X8M 的延迟降低了 50 倍,IOPS 提高了 200 倍,容量提高了 15 倍。
+
+与 Azure SQL 数据库服务存储相比,Exadata X8M 的延迟降低了 100 倍,IOPS 提高了 150 倍,容量提高了 300 倍。
+
+据 Oracle 称,单机架 Exadata X8M 可提供高达 2 倍的 OLTP 读取 IOPS,3 倍的吞吐量和比具有持久性内存的共享存储系统(如 Dell EMC PowerMax 8000 的单机架)低 5 倍的延迟。
+
+“通过同时支持更快的 OLTP 查询和更高的分析工作负载吞吐量,Exadata X8M 是融合混合工作负载环境以降低 IT 成本和复杂性的理想平台,”该公司说。
+
+### Oracle 零数据丢失恢复设备 X8
+
+Oracle 当天还宣布推出 Oracle 零数据丢失恢复设备 X8M(ZDLRA),它使用新的 100Gb RoCE,用于计算和存储服务器之间的高吞吐量内部数据传输。
+
+Exadata 和 ZDLRA 客户现在可以在 RoCE 或基于 InfiniBand 的工程系统之间进行选择,以在其架构部署中实现最佳灵活性。
+
+--------------------------------------------------------------------------------
+
+via: https://opensourceforu.com/2019/09/oracle-unleashes-worlds-fastest-database-machine-exadata-x8m/
+
+作者:[Longjam Dineshwori][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensourceforu.com/author/dineshwori-longjam/
+[b]: https://github.com/lujun9972
+[1]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/02/Oracle-Cloud.jpg?resize=350%2C212&ssl=1
diff --git a/published/201909/20190921 How to Remove (Delete) Symbolic Links in Linux.md b/published/201909/20190921 How to Remove (Delete) Symbolic Links in Linux.md
new file mode 100644
index 0000000000..bbe57011eb
--- /dev/null
+++ b/published/201909/20190921 How to Remove (Delete) Symbolic Links in Linux.md
@@ -0,0 +1,130 @@
+[#]: collector: (lujun9972)
+[#]: translator: (arrowfeng)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11382-1.html)
+[#]: subject: (How to Remove (Delete) Symbolic Links in Linux)
+[#]: via: (https://www.2daygeek.com/remove-delete-symbolic-link-softlink-linux/)
+[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
+
+在 Linux 中怎样移除(删除)符号链接
+======
+
+你可能有时需要在 Linux 上创建或者删除符号链接。如果有,你知道该怎样做吗?之前你做过吗?你踩坑没有?如果你踩过坑,那没什么问题。如果还没有,别担心,我们将在这里帮助你。
+
+使用 `rm` 和 `unlink` 命令就能完成移除(删除)符号链接的操作。
+
+### 什么是符号链接?
+
+符号链接(symlink)又称软链接,它是一种特殊的文件类型,在 Linux 中该文件指向另一个文件或者目录。它类似于 Windows 中的快捷方式。它能在相同或者不同的文件系统或分区中指向一个文件或着目录。
+
+符号链接通常用来链接库文件。它也可用于链接日志文件和挂载的 NFS(网络文件系统)上的文件夹。
+
+### 什么是 rm 命令?
+
+[rm 命令][1] 被用来移除文件和目录。它非常危险,你每次使用 `rm` 命令的时候要非常小心。
+
+### 什么是 unlink 命令?
+
+`unlink` 命令被用来移除特殊的文件。它被作为 GNU Gorutils 的一部分安装了。
+
+### 1) 使用 rm 命令怎样移除符号链接文件
+
+`rm` 命令是在 Linux 中使用最频繁的命令,它允许我们像下列描述那样去移除符号链接。
+
+```
+# rm symlinkfile
+```
+
+始终将 `rm` 命令与 `-i` 一起使用以了解正在执行的操作。
+
+```
+# rm -i symlinkfile1
+rm: remove symbolic link ‘symlinkfile1’? y
+```
+
+它允许我们一次移除多个符号链接:
+
+```
+# rm -i symlinkfile2 symlinkfile3
+
+rm: remove symbolic link ‘symlinkfile2’? y
+rm: remove symbolic link ‘symlinkfile3’? y
+```
+
+#### 1a) 使用 rm 命令怎样移除符号链接目录
+
+这像移除符号链接文件那样。使用下列命令移除符号链接目录。
+
+```
+# rm -i symlinkdir
+
+rm: remove symbolic link ‘symlinkdir’? y
+```
+
+使用下列命令移除多个符号链接目录。
+
+```
+# rm -i symlinkdir1 symlinkdir2
+
+rm: remove symbolic link ‘symlinkdir1’? y
+rm: remove symbolic link ‘symlinkdir2’? y
+```
+
+如果你在结尾增加 `/`,这个符号链接目录将不会被删除。如果你加了,你将得到一个错误。
+
+```
+# rm -i symlinkdir/
+
+rm: cannot remove ‘symlinkdir/’: Is a directory
+```
+
+你可以增加 `-r` 去处理上述问题。**但如果你增加这个参数,它将会删除目标目录下的内容,并且它不会删除这个符号链接文件。**(LCTT 译注:这可能不是你的原意。)
+
+```
+# rm -ri symlinkdir/
+
+rm: descend into directory ‘symlinkdir/’? y
+rm: remove regular file ‘symlinkdir/file4.txt’? y
+rm: remove directory ‘symlinkdir/’? y
+rm: cannot remove ‘symlinkdir/’: Not a directory
+```
+
+### 2) 使用 unlink 命令怎样移除符号链接
+
+`unlink` 命令删除指定文件。它一次仅接受一个文件。
+
+删除符号链接文件:
+
+```
+# unlink symlinkfile
+```
+
+删除符号链接目录:
+
+```
+# unlink symlinkdir2
+```
+
+如果你在结尾增加 `/`,你不能使用 `unlink` 命令删除符号链接目录。
+
+```
+# unlink symlinkdir3/
+
+unlink: cannot unlink ‘symlinkdir3/’: Not a directory
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/remove-delete-symbolic-link-softlink-linux/
+
+作者:[Magesh Maruthamuthu][a]
+选题:[lujun9972][b]
+译者:[arrowfeng](https://github.com/arrowfeng)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/magesh/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/linux-remove-files-directories-folders-rm-command/
diff --git a/published/201909/20190921 Oracle Autonomous Linux- A Self Updating, Self Patching Linux Distribution for Cloud Computing.md b/published/201909/20190921 Oracle Autonomous Linux- A Self Updating, Self Patching Linux Distribution for Cloud Computing.md
new file mode 100644
index 0000000000..5390aee222
--- /dev/null
+++ b/published/201909/20190921 Oracle Autonomous Linux- A Self Updating, Self Patching Linux Distribution for Cloud Computing.md
@@ -0,0 +1,64 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11370-1.html)
+[#]: subject: (Oracle Autonomous Linux: A Self Updating, Self Patching Linux Distribution for Cloud Computing)
+[#]: via: (https://itsfoss.com/oracle-autonomous-linux/)
+[#]: author: (John Paul https://itsfoss.com/author/john/)
+
+Oracle Autonomous Linux:用于云计算的自我更新、自我修补的 Linux 发行版
+======
+
+自动化是 IT 行业的增长趋势,其目的是消除重复任务中的手动干扰。Oracle 通过推出 Oracle Autonomous Linux 向自动化世界迈出了又一步,这无疑将使 IoT 和云计算行业受益。
+
+### Oracle Autonomous Linux:减少人工干扰,增多自动化
+
+![][1]
+
+周一,Oracle 联合创始人拉里·埃里森参加了在旧金山举行的Oracle OpenWorld 全球大会。[他宣布了][2]一个新产品:世界上第一个自治 Linux。这是 Oracle 向第二代云迈进的第二步。第一步是两年前发布的 [Autonomous Database][3]。
+
+Oracle Autonomous Linux 的最大特性是降低了维护成本。根据 [Oracle 网站][4] 所述,Autonomous Linux “使用先进的机器学习和自治功能来提供前所未有的成本节省、安全性和可用性,并释放关键的 IT 资源来应对更多的战略计划”。
+
+Autonomous Linux 可以无需人工干预就安装更新和补丁。这些自动更新包括 “Linux 内核和关键用户空间库”的补丁。“不需要停机,而且可以免受外部攻击和内部恶意用户的攻击。”它们也可以在系统运行时进行,以减少停机时间。Autonomous Linux 还会自动处理伸缩,以确保满足所有计算需求。
+
+埃里森强调了新的自治系统将如何提高安全性。他特别提到了 [Capitol One 数据泄露][5]是由于配置错误而发生的。他说:“一个防止数据被盗的简单规则:将数据放入自治系统。没有人为错误,没有数据丢失。 那是我们与 AWS 之间的最大区别。”
+
+有趣的是,Oracle 还瞄准了这一新产品以与 IBM 竞争。埃里森说:“如果你付钱给 IBM,可以停了。”所有 Red Hat 应用程序都应该能够在 Autonomous Linux 上运行而无需修改。有趣的是,Oracle Linux 是从 Red Hat Enterprise Linux 的源代码中[构建][6]的。
+
+看起来,Oracle Autonomous Linux 不会用于企业市场以外。
+
+### 关于 Oracle Autonomous Linux 的思考
+
+Oracle 是云服务市场的重要参与者。这种新的 Linux 产品将使其能够与 IBM 竞争。让人感兴趣的是 IBM 的反应会是如何,特别是当他们有来自 Red Hat 的新一批开源智能软件。
+
+如果你看一下市场数字,那么对于 IBM 或 Oracle 来说情况都不好。大多数云业务由 [Amazon Web Services、Microsoft Azure 和 Google Cloud Platform][7] 所占据。IBM 和 Oracle 落后于他们。[IBM 收购 Red Hat][8] 试图获得发展。这项新的自主云计划是 Oracle 争取统治地位(或至少试图获得更大的市场份额)的举动。让人感兴趣的是,到底有多少公司因为购买了 Oracle 的系统而在互联网的狂野西部变得更加安全?
+
+我必须简单提一下:当我第一次阅读该公告时,我的第一反应就是“好吧,我们离天网更近了一步。”如果我们技术性地考虑一下,我们就像是要进入了机器人末日。如果你打算帮我,我计划去购买一些罐头食品。
+
+你对 Oracle 的新产品感兴趣吗?你会帮助他们赢得云战争吗?在下面的评论中让我们知道。
+
+如果你觉得这篇文章有趣,请花一点时间在社交媒体、Hacker News 或 [Reddit][9] 上分享。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/oracle-autonomous-linux/
+
+作者:[John Paul][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/john/
+[b]: https://github.com/lujun9972
+[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/oracle-autonomous-linux.png?resize=800%2C450&ssl=1
+[2]: https://www.zdnet.com/article/oracle-announces-oracle-autonomous-linux/
+[3]: https://www.oracle.com/in/database/what-is-autonomous-database.html
+[4]: https://www.oracle.com/corporate/pressrelease/oow19-oracle-autonomous-linux-091619.html
+[5]: https://www.zdnet.com/article/100-million-americans-and-6-million-canadians-caught-up-in-capital-one-breach/
+[6]: https://distrowatch.com/table.php?distribution=oracle
+[7]: https://www.zdnet.com/article/top-cloud-providers-2019-aws-microsoft-azure-google-cloud-ibm-makes-hybrid-move-salesforce-dominates-saas/
+[8]: https://itsfoss.com/ibm-red-hat-acquisition/
+[9]: https://reddit.com/r/linuxusersgroup
diff --git a/published/201909/20190923 Getting started with data science using Python.md b/published/201909/20190923 Getting started with data science using Python.md
new file mode 100644
index 0000000000..319331fadc
--- /dev/null
+++ b/published/201909/20190923 Getting started with data science using Python.md
@@ -0,0 +1,312 @@
+[#]: collector: (lujun9972)
+[#]: translator: (GraveAccent)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11406-1.html)
+[#]: subject: (Getting started with data science using Python)
+[#]: via: (https://opensource.com/article/19/9/get-started-data-science-python)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+用 Python 入门数据科学
+======
+
+> 使用 Python 开展数据科学为你提供了无限的潜力,使你能够以有意义和启发性的方式解析、解释和组织数据。
+
+
+
+数据科学是计算领域一个令人兴奋的新领域,它围绕分析、可视化和关联以解释我们的计算机收集的有关世界的无限信息而建立。当然,称其为“新”领域有点不诚实,因为该学科是统计学、数据分析和普通而古老的科学观察派生而来的。
+
+但是数据科学是这些学科的形式化分支,拥有自己的流程和工具,并且可以广泛应用于以前从未产生过大量不可管理数据的学科(例如视觉效果)。数据科学是一个新的机会,可以重新审视海洋学、气象学、地理学、制图学、生物学、医学和健康以及娱乐行业的数据,并更好地了解其中的模式、影响和因果关系。
+
+像其他看似包罗万象的大型领域一样,知道从哪里开始探索数据科学可能会令人生畏。有很多资源可以帮助数据科学家使用自己喜欢的编程语言来实现其目标,其中包括最流行的编程语言之一:Python。使用 [Pandas][2]、[Matplotlib][3] 和 [Seaborn][4] 这些库,你可以学习数据科学的基本工具集。
+
+如果你对 Python 的基本用法不是很熟悉,请在继续之前先阅读我的 [Python 介绍][5]。
+
+### 创建 Python 虚拟环境
+
+程序员有时会忘记在开发计算机上安装了哪些库,这可能导致他们提供了在自己计算机上可以运行,但由于缺少库而无法在所有其它电脑上运行的代码。Python 有一个系统旨在避免这种令人不快的意外:虚拟环境。虚拟环境会故意忽略你已安装的所有 Python 库,从而有效地迫使你一开始使用通常的 Python 进行开发。
+
+为了用 `venv` 激活虚拟环境, 为你的环境取个名字 (我会用 `example`) 并且用下面的指令创建它:
+
+```
+$ python3 -m venv example
+```
+
+导入该环境的 `bin` 目录里的 `activate` 文件以激活它:
+
+```
+$ source ./example/bin/activate
+(example) $
+```
+
+你现在“位于”你的虚拟环境中。这是一个干净的状态,你可以在其中构建针对该问题的自定义解决方案,但是额外增加了需要有意识地安装依赖库的负担。
+
+### 安装 Pandas 和 NumPy
+
+你必须在新环境中首先安装的库是 Pandas 和 NumPy。这些库在数据科学中很常见,因此你肯定要时不时安装它们。它们也不是你在数据科学中唯一需要的库,但是它们是一个好的开始。
+
+Pandas 是使用 BSD 许可证的开源库,可轻松处理数据结构以进行分析。它依赖于 NumPy,这是一个提供多维数组、线性代数和傅立叶变换等等的科学库。使用 `pip3` 安装两者:
+
+```
+(example) $ pip3 install pandas
+```
+
+安装 Pandas 还会安装 NumPy,因此你无需同时指定两者。一旦将它们安装到虚拟环境中,安装包就会被缓存,这样,当你再次安装它们时,就不必从互联网上下载它们。
+
+这些是你现在仅需的库。接下来,你需要一些样本数据。
+
+### 生成样本数据集
+
+数据科学都是关于数据的,幸运的是,科学、计算和政府组织可以提供许多免费和开放的数据集。虽然这些数据集是用于教育的重要资源,但它们具有比这个简单示例所需的数据更多的数据。你可以使用 Python 快速创建示例和可管理的数据集:
+
+```python
+#!/usr/bin/env python3
+
+import random
+
+def rgb():
+ NUMBER=random.randint(0,255)/255
+ return NUMBER
+
+FILE = open('sample.csv','w')
+FILE.write('"red","green","blue"')
+for COUNT in range(10):
+ FILE.write('\n{:0.2f},{:0.2f},{:0.2f}'.format(rgb(),rgb(),rgb()))
+```
+
+这将生成一个名为 `sample.csv` 的文件,该文件由随机生成的浮点数组成,这些浮点数在本示例中表示 RGB 值(在视觉效果中通常是数百个跟踪值)。你可以将 CSV 文件用作 Pandas 的数据源。
+
+### 使用 Pandas 提取数据
+
+Pandas 的基本功能之一是可以提取数据和处理数据,而无需程序员编写仅用于解析输入的新函数。如果你习惯于自动执行此操作的应用程序,那么这似乎不是很特别,但请想象一下在 [LibreOffice][6] 中打开 CSV 并且必须编写公式以在每个逗号处拆分值。Pandas 可以让你免受此类低级操作的影响。以下是一些简单的代码,可用于提取和打印以逗号分隔的值的文件:
+
+```python
+#!/usr/bin/env python3
+
+from pandas import read_csv, DataFrame
+import pandas as pd
+
+FILE = open('sample.csv','r')
+DATAFRAME = pd.read_csv(FILE)
+print(DATAFRAME)
+```
+
+一开始的几行导入 Pandas 库的组件。Pandas 库功能丰富,因此在寻找除本文中基本功能以外的功能时,你会经常参考它的文档。
+
+接下来,通过打开你创建的 `sample.csv` 文件创建变量 `FILE`。Pandas 模块 `read_csv`(在第二行中导入)使用该变量来创建数据帧。在 Pandas 中,数据帧是二维数组,通常可以认为是表格。数据放入数据帧中后,你可以按列和行进行操作,查询其范围,然后执行更多操作。目前,示例代码仅将该数据帧输出到终端。
+
+运行代码。你的输出会和下面的输出有些许不同,因为这些数字都是随机生成的,但是格式都是一样的。
+
+```
+(example) $ python3 ./parse.py
+ red green blue
+0 0.31 0.96 0.47
+1 0.95 0.17 0.64
+2 0.00 0.23 0.59
+3 0.22 0.16 0.42
+4 0.53 0.52 0.18
+5 0.76 0.80 0.28
+6 0.68 0.69 0.46
+7 0.75 0.52 0.27
+8 0.53 0.76 0.96
+9 0.01 0.81 0.79
+```
+
+假设你只需要数据集中的红色值(`red`),你可以通过声明数据帧的列名称并有选择地仅打印你感兴趣的列来做到这一点:
+
+```python
+from pandas import read_csv, DataFrame
+import pandas as pd
+
+FILE = open('sample.csv','r')
+DATAFRAME = pd.read_csv(FILE)
+
+# define columns
+DATAFRAME.columns = [ 'red','green','blue' ]
+
+print(DATAFRAME['red'])
+```
+
+现在运行代码,你只会得到红色列:
+
+```
+(example) $ python3 ./parse.py
+0 0.31
+1 0.95
+2 0.00
+3 0.22
+4 0.53
+5 0.76
+6 0.68
+7 0.75
+8 0.53
+9 0.01
+Name: red, dtype: float64
+```
+
+处理数据表是经常使用 Pandas 解析数据的好方法。从数据帧中选择数据的方法有很多,你尝试的次数越多就越习惯。
+
+### 可视化你的数据
+
+很多人偏爱可视化信息已不是什么秘密,这是图表和图形成为与高层管理人员开会的主要内容的原因,也是“信息图”在新闻界如此流行的原因。数据科学家的工作之一是帮助其他人理解大量数据样本,并且有一些库可以帮助你完成这项任务。将 Pandas 与可视化库结合使用可以对数据进行可视化解释。一个流行的可视化开源库是 [Seaborn][7],它基于开源的 [Matplotlib][3]。
+
+#### 安装 Seaborn 和 Matplotlib
+
+你的 Python 虚拟环境还没有 Seaborn 和 Matplotlib,所以用 `pip3` 安装它们。安装 Seaborn 的时候,也会安装 Matplotlib 和很多其它的库。
+
+```
+(example) $ pip3 install seaborn
+```
+
+为了使 Matplotlib 显示图形,你还必须安装 [PyGObject][8] 和 [Pycairo][9]。这涉及到编译代码,只要你安装了必需的头文件和库,`pip3` 便可以为你执行此操作。你的 Python 虚拟环境不了解这些依赖库,因此你可以在环境内部或外部执行安装命令。
+
+在 Fedora 和 CentOS 上:
+
+```
+(example) $ sudo dnf install -y gcc zlib-devel bzip2 bzip2-devel readline-devel \
+sqlite sqlite-devel openssl-devel tk-devel git python3-cairo-devel \
+cairo-gobject-devel gobject-introspection-devel
+```
+
+在 Ubuntu 和 Debian 上:
+
+```
+(example) $ sudo apt install -y libgirepository1.0-dev build-essential \
+libbz2-dev libreadline-dev libssl-dev zlib1g-dev libsqlite3-dev wget \
+curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libcairo2-dev
+```
+
+一旦它们安装好了,你可以安装 Matplotlib 需要的 GUI 组件。
+
+```
+(example) $ pip3 install PyGObject pycairo
+```
+
+### 用 Seaborn 和 Matplotlib 显示图形
+
+在你最喜欢的文本编辑器新建一个叫 `vizualize.py` 的文件。要创建数据的线形图可视化,首先,你必须导入必要的 Python 模块 —— 先前代码示例中使用的 Pandas 模块:
+
+```python
+#!/usr/bin/env python3
+
+from pandas import read_csv, DataFrame
+import pandas as pd
+```
+
+接下来,导入 Seaborn、Matplotlib 和 Matplotlib 的几个组件,以便你可以配置生成的图形:
+
+```python
+import seaborn as sns
+import matplotlib
+import matplotlib.pyplot as plt
+from matplotlib import rcParams
+```
+
+Matplotlib 可以将其输出导出为多种格式,包括 PDF、SVG 和桌面上的 GUI 窗口。对于此示例,将输出发送到桌面很有意义,因此必须将 Matplotlib 后端设置为 `GTK3Agg`。如果你不使用 Linux,则可能需要使用 `TkAgg` 后端。
+
+设置完 GUI 窗口以后,设置窗口大小和 Seaborn 预设样式:
+
+```python
+matplotlib.use('GTK3Agg')
+rcParams['figure.figsize'] = 11,8
+sns.set_style('darkgrid')
+```
+
+现在,你的显示已配置完毕,代码已经很熟悉了。使用 Pandas 导入 `sample.csv` 文件,并定义数据帧的列:
+
+```python
+FILE = open('sample.csv','r')
+DATAFRAME = pd.read_csv(FILE)
+DATAFRAME.columns = [ 'red','green','blue' ]
+```
+
+有了适当格式的数据,你可以将其绘制在图形中。将每一列用作绘图的输入,然后使用 `plt.show()` 在 GUI 窗口中绘制图形。`plt.legend()` 参数将列标题与图形上的每一行关联(`loc` 参数将图例放置在图表之外而不是在图表上方):
+
+
+```python
+for i in DATAFRAME.columns:
+ DATAFRAME[i].plot()
+
+plt.legend(bbox_to_anchor=(1, 1), loc=2, borderaxespad=1)
+plt.show()
+```
+
+运行代码以获得结果。
+
+![第一个数据可视化][10]
+
+你的图形可以准确显示 CSV 文件中包含的所有信息:值在 Y 轴上,索引号在 X 轴上,并且图形中的线也被标识出来了,以便你知道它们代表什么。然而,由于此代码正在跟踪颜色值(至少是假装),所以线条的颜色不仅不直观,而且违反直觉。如果你永远不需要分析颜色数据,则可能永远不会遇到此问题,但是你一定会遇到类似的问题。在可视化数据时,你必须考虑呈现数据的最佳方法,以防止观看者从你呈现的内容中推断出虚假信息。
+
+为了解决此问题(并展示一些可用的自定义设置),以下代码为每条绘制的线分配了特定的颜色:
+
+```python
+import matplotlib
+from pandas import read_csv, DataFrame
+import pandas as pd
+import seaborn as sns
+import matplotlib.pyplot as plt
+from matplotlib import rcParams
+
+matplotlib.use('GTK3Agg')
+rcParams['figure.figsize'] = 11,8
+sns.set_style('whitegrid')
+
+FILE = open('sample.csv','r')
+DATAFRAME = pd.read_csv(FILE)
+DATAFRAME.columns = [ 'red','green','blue' ]
+
+plt.plot(DATAFRAME['red'],'r-')
+plt.plot(DATAFRAME['green'],'g-')
+plt.plot(DATAFRAME['blue'],'b-')
+plt.plot(DATAFRAME['red'],'ro')
+plt.plot(DATAFRAME['green'],'go')
+plt.plot(DATAFRAME['blue'],'bo')
+
+plt.show()
+```
+
+这使用特殊的 Matplotlib 表示法为每列创建两个图。每列的初始图分配有一种颜色(红色为 `r`,绿色为 `g`,蓝色为 `b`)。这些是内置的 Matplotlib 设置。 `-` 表示实线(双破折号,例如 `r--`,将创建虚线)。为每个具有相同颜色的列创建第二个图,但是使用 `o` 表示点或节点。为了演示内置的 Seaborn 主题,请将 `sns.set_style` 的值更改为 `whitegrid`。
+
+![改进的数据可视化][11]
+
+### 停用你的虚拟环境
+
+探索完 Pandas 和绘图后,可以使用 `deactivate` 命令停用 Python 虚拟环境:
+
+```
+(example) $ deactivate
+$
+```
+
+当你想重新使用它时,只需像在本文开始时一样重新激活它即可。重新激活虚拟环境时,你必须重新安装模块,但是它们是从缓存安装的,而不是从互联网下载的,因此你不必联网。
+
+### 无尽的可能性
+
+Pandas、Matplotlib、Seaborn 和数据科学的真正力量是无穷的潜力,使你能够以有意义和启发性的方式解析、解释和组织数据。下一步是使用你在本文中学到的新工具探索简单的数据集。Matplotlib 和 Seaborn 不仅有折线图,还有很多其他功能,因此,请尝试创建条形图或饼图或完全不一样的东西。
+
+一旦你了解了你的工具集并对如何关联数据有了一些想法,则可能性是无限的。数据科学是寻找隐藏在数据中的故事的新方法。让开源成为你的媒介。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/get-started-data-science-python
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[GraveAccent](https://github.com/GraveAccent)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_graph_stats_blue.png?itok=OKCc_60D (Metrics and a graph illustration)
+[2]: https://pandas.pydata.org/
+[3]: https://matplotlib.org/
+[4]: https://seaborn.pydata.org/index.html
+[5]: https://opensource.com/article/17/10/python-101
+[6]: http://libreoffice.org
+[7]: https://seaborn.pydata.org/
+[8]: https://pygobject.readthedocs.io/en/latest/getting_started.html
+[9]: https://pycairo.readthedocs.io/en/latest/
+[10]: https://opensource.com/sites/default/files/uploads/seaborn-matplotlib-graph_0.png (First data visualization)
+[11]: https://opensource.com/sites/default/files/uploads/seaborn-matplotlib-graph_1.png (Improved data visualization)
diff --git a/published/201909/20190923 Introduction to the Linux chgrp and newgrp commands.md b/published/201909/20190923 Introduction to the Linux chgrp and newgrp commands.md
new file mode 100644
index 0000000000..7dffe09737
--- /dev/null
+++ b/published/201909/20190923 Introduction to the Linux chgrp and newgrp commands.md
@@ -0,0 +1,131 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11399-1.html)
+[#]: subject: (Introduction to the Linux chgrp and newgrp commands)
+[#]: via: (https://opensource.com/article/19/9/linux-chgrp-and-newgrp-commands)
+[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss)
+
+chgrp 和 newgrp 命令简介
+======
+
+> chgrp 和 newgrp 命令可帮助你管理需要维护组所有权的文件。
+
+
+
+在最近的一篇文章中,我介绍了 [chown][2] 命令,它用于修改系统上的文件所有权。回想一下,所有权是分配给一个对象的用户和组的组合。`chgrp` 和 `newgrp` 命令为管理需要维护组所有权的文件提供了帮助。
+
+### 使用 chgrp
+
+`chgrp` 只是更改文件的组所有权。这与 `chown :` 命令相同。你可以使用:
+
+```
+$chown :alan mynotes
+```
+
+或者:
+
+```
+$chgrp alan mynotes
+```
+
+#### 递归
+
+`chgrp` 和它的一些参数可以用在命令行和脚本中。就像许多其他 Linux 命令一样,`chgrp` 有一个递归参数 `-R`。如下所示,你需要它来对文件夹及其内容进行递归操作。我加了 `-v`(详细)参数,因此 `chgrp` 会告诉我它在做什么:
+
+
+```
+$ ls -l . conf
+.:
+drwxrwxr-x 2 alan alan 4096 Aug 5 15:33 conf
+
+conf:
+-rw-rw-r-- 1 alan alan 0 Aug 5 15:33 conf.xml
+# chgrp -vR delta conf
+changed group of 'conf/conf.xml' from alan to delta
+changed group of 'conf' from alan to delta
+```
+
+#### 参考
+
+当你要更改文件的组以匹配特定的配置,或者当你不知道具体的组时(比如你运行一个脚本时),可使用参考文件 (`--reference=RFILE`)。你可以复制另外一个作为参考的文件(RFILE)的组。比如,为了撤销上面的更改 (请注意,点 `.` 代表当前工作目录):
+
+```
+$ chgrp -vR --reference=. conf
+```
+
+#### 报告更改
+
+大多数命令都有用于控制其输出的参数。最常见的是 `-v` 来启用详细信息,而且 `chgrp` 命令也拥有详细模式。它还具有 `-c`(`--changes`)参数,指示 `chgrp` 仅在进行了更改时报告。`chgrp` 还会报告其他内容,例如是操作不被允许时。
+
+参数 `-f`(`--silent`、`--quiet`)用于禁止显示大部分错误消息。我将在下一节中使用此参数和 `-c` 来显示实际更改。
+
+#### 保持根目录
+
+Linux 文件系统的根目录(`/`)应该受到高度重视。如果命令在此层级犯了一个错误,那么后果可能是可怕的,并会让系统无法使用。尤其是在运行一个会递归修改甚至删除的命令时。`chgrp` 命令有一个可用于保护和保持根目录的参数。它是 `--preserve-root`。如果在根目录中将此参数和递归一起使用,那么什么也不会发生,而是会出现一条消息:
+
+```
+[root@localhost /]# chgrp -cfR --preserve-root a+w /
+chgrp: it is dangerous to operate recursively on '/'
+chgrp: use --no-preserve-root to override this failsafe
+```
+
+不与递归(-R)结合使用时,该选项无效。但是,如果该命令由 `root` 用户运行,那么 `/` 的权限将会更改,但其下的其他文件或目录的权限则不会被更改:
+
+```
+[alan@localhost /]$ chgrp -c --preserve-root alan /
+chgrp: changing group of '/': Operation not permitted
+[root@localhost /]# chgrp -c --preserve-root alan /
+changed group of '/' from root to alan
+```
+
+令人惊讶的是,它似乎不是默认参数。而选项 `--no-preserve-root` 是默认的。如果你在不带“保持”选项的情况下运行上述命令,那么它将默认为“无保持”模式,并可能会更改不应更改的文件的权限:
+
+```
+[alan@localhost /]$ chgrp -cfR alan /
+changed group of '/dev/pts/0' from tty to alan
+changed group of '/dev/tty2' from tty to alan
+changed group of '/var/spool/mail/alan' from mail to alan
+```
+
+### 关于 newgrp
+
+`newgrp` 命令允许用户覆盖当前的主要组。当你在所有文件必须有相同的组所有权的目录中操作时,`newgrp` 会很方便。假设你的内网服务器上有一个名为 `share` 的目录,不同的团队在其中存储市场活动照片。组名为 `share`。当不同的用户将文件放入目录时,文件的主要组可能会变得混乱。每当添加新文件时,你都可以运行 `chgrp` 将错乱的组纠正为 `share`:
+
+```
+$ cd share
+ls -l
+-rw-r--r--. 1 alan share 0 Aug 7 15:35 pic13
+-rw-r--r--. 1 alan alan 0 Aug 7 15:35 pic1
+-rw-r--r--. 1 susan delta 0 Aug 7 15:35 pic2
+-rw-r--r--. 1 james gamma 0 Aug 7 15:35 pic3
+-rw-rw-r--. 1 bill contract 0 Aug 7 15:36 pic4
+```
+
+我在 [chmod 命令][3]的文章中介绍了 `setgid` 模式。它是解决此问题的一种方法。但是,假设由于某种原因未设置 `setgid` 位。`newgrp` 命令在此时很有用。在任何用户将文件放入 `share` 目录之前,他们可以运行命令 `newgrp share`。这会将其主要组切换为 `share`,因此他们放入目录中的所有文件都将有 `share` 组,而不是用户自己的主要组。完成后,用户可以使用以下命令切换回常规主要组(举例):
+
+```
+newgrp alan
+```
+
+### 总结
+
+了解如何管理用户、组和权限非常重要。最好知道一些替代方法来解决可能遇到的问题,因为并非所有环境都以相同的方式设置。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/linux-chgrp-and-newgrp-commands
+
+作者:[Alan Formy-Duval][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/alanfdosshttps://opensource.com/users/sethhttps://opensource.com/users/alanfdosshttps://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/community-penguins-osdc-lead.png?itok=BmqsAF4A (Penguins walking on the beach )
+[2]: https://opensource.com/article/19/8/linux-chown-command
+[3]: https://opensource.com/article/19/8/linux-chmod-command
diff --git a/published/201909/20190927 IBM brings blockchain to Red Hat OpenShift- adds Apache CouchDB for hybrid cloud customers.md b/published/201909/20190927 IBM brings blockchain to Red Hat OpenShift- adds Apache CouchDB for hybrid cloud customers.md
new file mode 100644
index 0000000000..ac533a1b2c
--- /dev/null
+++ b/published/201909/20190927 IBM brings blockchain to Red Hat OpenShift- adds Apache CouchDB for hybrid cloud customers.md
@@ -0,0 +1,64 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11405-1.html)
+[#]: subject: (IBM brings blockchain to Red Hat OpenShift; adds Apache CouchDB for hybrid cloud customers)
+[#]: via: (https://www.networkworld.com/article/3441362/ibm-brings-blockchain-to-red-hat-openshift-adds-apache-couchdb-for-hybrid-cloud-customers.html)
+[#]: author: (Michael Cooney https://www.networkworld.com/author/Michael-Cooney/)
+
+IBM 将区块链引入红帽 OpenShift;为混合云客户添加了Apache CouchDB
+======
+
+> IBM 在其区块链平台上增加了红帽 OpenShift 支持,并将用于 Apache CouchDB 的 Kubernetes Operator 引入其混合云服务中。
+
+
+
+IBM 本周继续推进其红帽和开源集成工作,在其[区块链][1]平台上添加了红帽 OpenShift 支持,并在其[混合云][2]服务产品之外为 Apache CouchDB 引入了 Kubernetes Operator。
+
+在该公司的旗舰级企业 Kubernetes 平台 [红帽 OpenShift 上部署 IBM 区块链][3] 的能力,意味着 IBM 区块链的开发人员将能够在本地、公共云或混合云架构中部署安全软件。
+
+区块链是一个分布式数据库,维护着一个不断增长的记录列表,可以使用哈希技术对其进行验证,并且 IBM 区块链平台包括用于构建、操作、治理和发展受保护的区块链网络的工具。
+
+IBM 表示,其区块链 / OpenShift 组合的目标客户面对的公司客户是:希望保留区块链分类帐副本并在自己的基础设施上运行工作负载以实现安全性,降低风险或合规性;需要将数据存储在特定位置以满足数据驻留要求;需要在多个云或混合云架构中部署区块链组件。
+
+自 7 月份完成对红帽的收购以来,IBM 一直在围绕红帽基于 Kubernetes 的 OpenShift 容器平台构建云开发生态系统。最近,这位蓝色巨人将其[新 z15 大型机与 IBM 的红帽][4]技术融合在一起,称它将为红帽 OpenShift 容器平台提供 IBM z/OS 云代理。该产品将通过连接到 Kubernetes 容器为用户提供 z/OS 计算资源的直接自助访问。
+
+IBM 表示,打算在 IBM z 系列和 LinuxONE 产品上向 Linux 提供 IBM [Cloud Pak 产品][5]。Cloud Paks 是由 OpenShift 与 100 多种其他 IBM 软件产品组成的捆绑包。LinuxONE 是 IBM 专为支持 Linux 环境而设计的非常成功的大型机系统。
+
+IBM 表示,愿景是使支持 OpenShift 的 IBM 软件成为客户用来转变其组织的基础构建组件。
+
+IBM 表示:“我们的大多数客户都需要支持混合云工作负载以及可在任何地方运行这些工作负载的灵活性的解决方案,而用于红帽的 z/OS 云代理将成为我们在平台上启用云原生的关键。”
+
+在相关新闻中,IBM 宣布支持开源 Apache CouchDB,这是 [Apache CouchDB][7] 的 Kubernetes Operator,并且该 Operator 已通过认证可与红帽 OpenShift 一起使用。Operator 可以自动部署、管理和维护 Apache CouchDB 部署。Apache CouchDB 是非关系型开源 NoSQL 数据库。
+
+在最近的 [Forrester Wave 报告][8]中,研究人员说:“企业喜欢 NoSQL 这样的能力,可以使用低成本服务器和可以存储、处理和访问任何类型的业务数据的灵活的无模式模型进行横向扩展。NoSQL 平台为企业基础设施专业人士提供了对数据存储和处理的更好控制,并提供了可加速应用程序部署的配置。当许多组织使用 NoSQL 来补充其关系数据库时,一些组织已开始替换它们以支持更好的性能、扩展规模并降低其数据库成本。”
+
+当前,IBM 云使用 Cloudant Db 服务作为其针对新的云原生应用程序的标准数据库。IBM 表示,对 CouchDB 的强大支持为用户提供了替代方案和后备选项。IBM 表示,能够将它们全部绑定到红帽 OpenShift Kubernetes 部署中,可以使客户在部署应用程序并在多个云环境中移动数据时使用数据库本地复制功能来维持对数据的低延迟访问。
+
+“我们的客户正在转向基于容器化和[微服务][9]的架构,以提高速度、敏捷性和运营能力。在云原生应用程序开发中,应用程序需要具有支持可伸缩性、可移植性和弹性的数据层。”IBM 院士兼云数据库副总裁 Adam Kocoloski 写道,“我们相信数据可移植性和 CouchDB 可以大大改善多云架构的功能,使客户能够构建真正可在私有云、公共云和边缘位置之间移植的解决方案。”
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3441362/ibm-brings-blockchain-to-red-hat-openshift-adds-apache-couchdb-for-hybrid-cloud-customers.html
+
+作者:[Michael Cooney][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.networkworld.com/author/Michael-Cooney/
+[b]: https://github.com/lujun9972
+[1]: https://www.networkworld.com/article/3330937/how-blockchain-will-transform-the-iot.html
+[2]: https://www.networkworld.com/article/3268448/what-is-hybrid-cloud-really-and-whats-the-best-strategy.html
+[3]: https://www.ibm.com/blogs/blockchain/2019/09/ibm-blockchain-platform-meets-red-hat-openshift/
+[4]: https://www.networkworld.com/article/3438542/ibm-z15-mainframe-amps-up-cloud-security-features.html
+[5]: https://www.networkworld.com/article/3429596/ibm-fuses-its-software-with-red-hats-to-launch-hybrid-cloud-juggernaut.html
+[6]: https://www.networkworld.com/article/3400740/achieve-compliant-cost-effective-hybrid-cloud-operations.html
+[7]: https://www.ibm.com/cloud/learn/couchdb
+[8]: https://reprints.forrester.com/#/assets/2/363/RES136481/reports
+[9]: https://www.networkworld.com/article/3137250/what-you-need-to-know-about-microservices.html
+[10]: https://www.facebook.com/NetworkWorld/
+[11]: https://www.linkedin.com/company/network-world
diff --git a/published/20190902 How RPM packages are made- the spec file.md b/published/20190902 How RPM packages are made- the spec file.md
new file mode 100644
index 0000000000..30542ef8de
--- /dev/null
+++ b/published/20190902 How RPM packages are made- the spec file.md
@@ -0,0 +1,289 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11538-1.html)
+[#]: subject: (How RPM packages are made: the spec file)
+[#]: via: (https://fedoramagazine.org/how-rpm-packages-are-made-the-spec-file/)
+[#]: author: (Ankur Sinha "FranciscoD" https://fedoramagazine.org/author/ankursinha/)
+
+如何编写 RPM 的 spec 文件
+======
+
+![][1]
+
+在[关于 RPM 软件包构建的上一篇文章][2]中,你了解到了源 RPM 包括软件的源代码以及 spec 文件。这篇文章深入研究了 spec 文件,该文件中包含了有关如何构建 RPM 的指令。同样,本文以 `fpaste` 为例。
+
+### 了解源代码
+
+在开始编写 spec 文件之前,你需要对要打包的软件有所了解。在这里,你正在研究 `fpaste`,这是一个非常简单的软件。它是用 Python 编写的,并且是一个单文件脚本。当它发布新版本时,可在 Pagure 上找到:。
+
+如该档案文件所示,当前版本为 0.3.9.2。下载它,以便你查看该档案文件中的内容:
+
+```
+$ wget https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz
+$ tar -tvf fpaste-0.3.9.2.tar.gz
+drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/
+-rw-rw-r-- root/root 25 2018-07-25 02:58 fpaste-0.3.9.2/.gitignore
+-rw-rw-r-- root/root 3672 2018-07-25 02:58 fpaste-0.3.9.2/CHANGELOG
+-rw-rw-r-- root/root 35147 2018-07-25 02:58 fpaste-0.3.9.2/COPYING
+-rw-rw-r-- root/root 444 2018-07-25 02:58 fpaste-0.3.9.2/Makefile
+-rw-rw-r-- root/root 1656 2018-07-25 02:58 fpaste-0.3.9.2/README.rst
+-rw-rw-r-- root/root 658 2018-07-25 02:58 fpaste-0.3.9.2/TODO
+drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/docs/
+drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/
+drwxrwxr-x root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/en/
+-rw-rw-r-- root/root 3867 2018-07-25 02:58 fpaste-0.3.9.2/docs/man/en/fpaste.1
+-rwxrwxr-x root/root 24884 2018-07-25 02:58 fpaste-0.3.9.2/fpaste
+lrwxrwxrwx root/root 0 2018-07-25 02:58 fpaste-0.3.9.2/fpaste.py -> fpaste
+```
+
+你要安装的文件是:
+
+* `fpaste.py`:应该安装到 `/usr/bin/`。
+* `docs/man/en/fpaste.1`:手册,应放到 `/usr/share/man/man1/`。
+* `COPYING`:许可证文本,应放到 `/usr/share/license/fpaste/`。
+* `README.rst`、`TODO`:放到 `/usr/share/doc/fpaste/` 下的其它文档。
+
+这些文件的安装位置取决于文件系统层次结构标准(FHS)。要了解更多信息,可以在这里阅读: 或查看 Fedora 系统的手册页:
+
+```
+$ man hier
+```
+
+#### 第一部分:要构建什么?
+
+现在我们知道了源文件中有哪些文件,以及它们要存放的位置,让我们看一下 spec 文件。你可以在此处查看这个完整的文件:。
+
+这是 spec 文件的第一部分:
+
+```
+Name: fpaste
+Version: 0.3.9.2
+Release: 3%{?dist}
+Summary: A simple tool for pasting info onto sticky notes instances
+BuildArch: noarch
+License: GPLv3+
+URL: https://pagure.io/fpaste
+Source0: https://pagure.io/releases/fpaste/fpaste-0.3.9.2.tar.gz
+
+Requires: python3
+
+%description
+It is often useful to be able to easily paste text to the Fedora
+Pastebin at http://paste.fedoraproject.org and this simple script
+will do that and return the resulting URL so that people may
+examine the output. This can hopefully help folks who are for
+some reason stuck without X, working remotely, or any other
+reason they may be unable to paste something into the pastebin
+```
+
+`Name`、`Version` 等称为*标签*,它们定义在 RPM 中。这意味着你不能只是随意写点标签,RPM 无法理解它们!需要注意的标签是:
+
+* `Source0`:告诉 RPM 该软件的源代码档案文件所在的位置。
+* `Requires`:列出软件的运行时依赖项。RPM 可以自动检测很多依赖项,但是在某些情况下,必须手动指明它们。运行时依赖项是系统上必须具有的功能(通常是软件包),才能使该软件包起作用。这是 [dnf][3] 在安装此软件包时检测是否需要拉取其他软件包的方式。
+* `BuildRequires`:列出了此软件的构建时依赖项。这些通常必须手动确定并添加到 spec 文件中。
+* `BuildArch`:此软件为该计算机体系结构所构建。如果省略此标签,则将为所有受支持的体系结构构建该软件。值 `noarch` 表示该软件与体系结构无关(例如 `fpaste`,它完全是用 Python 编写的)。
+
+本节提供有关 `fpaste` 的常规信息:它是什么,正在将什么版本制作为 RPM,其许可证等等。如果你已安装 `fpaste`,并查看其元数据时,则可以看到该 RPM 中包含的以下信息:
+
+```
+$ sudo dnf install fpaste
+$ rpm -qi fpaste
+Name : fpaste
+Version : 0.3.9.2
+Release : 2.fc30
+...
+```
+
+RPM 会自动添加一些其他标签,以代表它所知道的内容。
+
+至此,我们掌握了要为其构建 RPM 的软件的一般信息。接下来,我们开始告诉 RPM 做什么。
+
+#### 第二部分:准备构建
+
+spec 文件的下一部分是准备部分,用 `%prep` 代表:
+
+```
+%prep
+%autosetup
+```
+
+对于 `fpaste`,这里唯一的命令是 `%autosetup`。这只是将 tar 档案文件提取到一个新文件夹中,并为下一部分的构建阶段做好了准备。你可以在此处执行更多操作,例如应用补丁程序,出于不同目的修改文件等等。如果你查看过 Python 的源 RPM 的内容,那么你会在那里看到许多补丁。这些都将在本节中应用。
+
+通常,spec 文件中带有 `%` 前缀的所有内容都是 RPM 以特殊方式解释的宏或标签。这些通常会带有大括号,例如 `%{example}`。
+
+#### 第三部分:构建软件
+
+下一部分是构建软件的位置,用 `%build` 表示。现在,由于 `fpaste` 是一个简单的纯 Python 脚本,因此无需构建。因此,这里是:
+
+```
+%build
+#nothing required
+```
+
+不过,通常来说,你会在此处使用构建命令,例如:
+
+```
+configure; make
+```
+
+构建部分通常是 spec 文件中最难的部分,因为这是从源代码构建软件的地方。这要求你知道该工具使用的是哪个构建系统,该系统可能是许多构建系统之一:Autotools、CMake、Meson、Setuptools(用于 Python)等等。每个都有自己的命令和语法样式。你需要充分了解这些才能正确构建软件。
+
+#### 第四部分:安装文件
+
+软件构建后,需要在 `%install` 部分中安装它:
+
+```
+%install
+mkdir -p %{buildroot}%{_bindir}
+make install BINDIR=%{buildroot}%{_bindir} MANDIR=%{buildroot}%{_mandir}
+```
+
+在构建 RPM 时,RPM 不会修改你的系统文件。在一个可以正常运行的系统上添加、删除或修改文件的风险太大。如果发生故障怎么办?因此,RPM 会创建一个专门打造的文件系统并在其中工作。这称为 `buildroot`。 因此,在 `buildroot` 中,我们创建由宏 `%{_bindir}` 代表的 `/usr/bin` 目录,然后使用提供的 `Makefile` 将文件安装到其中。
+
+至此,我们已经在专门打造的 `buildroot` 中安装了 `fpaste` 的构建版本。
+
+#### 第五部分:列出所有要包括在 RPM 中的文件
+
+spec 文件其后的一部分是文件部分:`%files`。在这里,我们告诉 RPM 从该 spec 文件创建的档案文件中包含哪些文件。`fpaste` 的文件部分非常简单:
+
+```
+%files
+%{_bindir}/%{name}
+%doc README.rst TODO
+%{_mandir}/man1/%{name}.1.gz
+%license COPYING
+```
+
+请注意,在这里,我们没有指定 `buildroot`。所有这些路径都是相对路径。`%doc` 和 `%license`命令做的稍微多一点,它们会创建所需的文件夹,并记住这些文件必须放在那里。
+
+RPM 很聪明。例如,如果你在 `%install` 部分中安装了文件,但未列出它们,它会提醒你。
+
+#### 第六部分:在变更日志中记录所有变更
+
+Fedora 是一个基于社区的项目。许多贡献者维护或共同维护软件包。因此,当务之急是不要被软件包做了哪些更改所搞混。为了确保这一点,spec 文件包含的最后一部分是变更日志 `%changelog`:
+
+```
+%changelog
+* Thu Jul 25 2019 Fedora Release Engineering < ...> - 0.3.9.2-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
+
+* Thu Jan 31 2019 Fedora Release Engineering < ...> - 0.3.9.2-2
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
+
+* Tue Jul 24 2018 Ankur Sinha - 0.3.9.2-1
+- Update to 0.3.9.2
+
+* Fri Jul 13 2018 Fedora Release Engineering < ...> - 0.3.9.1-4
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
+
+* Wed Feb 07 2018 Fedora Release Engineering < ..> - 0.3.9.1-3
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild
+
+* Sun Sep 10 2017 Vasiliy N. Glazov < ...> - 0.3.9.1-2
+- Cleanup spec
+
+* Fri Sep 08 2017 Ankur Sinha - 0.3.9.1-1
+- Update to latest release
+- fixes rhbz 1489605
+...
+....
+```
+
+spec 文件的*每项*变更都必须有一个变更日志条目。如你在此处看到的,虽然我以维护者身份更新了该 spec 文件,但其他人也做过更改。清楚地记录变更内容有助于所有人知道该 spec 文件的当前状态。对于系统上安装的所有软件包,都可以使用 `rpm` 来查看其更改日志:
+
+```
+$ rpm -q --changelog fpaste
+```
+
+### 构建 RPM
+
+现在我们准备构建 RPM 包。如果要继续执行以下命令,请确保遵循[上一篇文章][2]中的步骤设置系统以构建 RPM。
+
+我们将 `fpaste` 的 spec 文件放置在 `~/rpmbuild/SPECS` 中,将源代码档案文件存储在 `~/rpmbuild/SOURCES/` 中,现在可以创建源 RPM 了:
+
+```
+$ cd ~/rpmbuild/SPECS
+$ wget https://src.fedoraproject.org/rpms/fpaste/raw/master/f/fpaste.spec
+
+$ cd ~/rpmbuild/SOURCES
+$ wget https://pagure.io/fpaste/archive/0.3.9.2/fpaste-0.3.9.2.tar.gz
+
+$ cd ~/rpmbuild/SOURCES
+$ rpmbuild -bs fpaste.spec
+Wrote: /home/asinha/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm
+```
+
+让我们看一下结果:
+
+```
+$ ls ~/rpmbuild/SRPMS/fpaste*
+/home/asinha/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm
+
+$ rpm -qpl ~/rpmbuild/SRPMS/fpaste-0.3.9.2-3.fc30.src.rpm
+fpaste-0.3.9.2.tar.gz
+fpaste.spec
+```
+
+我们看到源 RPM 已构建。让我们同时构建源 RPM 和二进制 RPM:
+
+```
+$ cd ~/rpmbuild/SPECS
+$ rpmbuild -ba fpaste.spec
+..
+..
+..
+```
+
+RPM 将向你显示完整的构建输出,并在我们之前看到的每个部分中详细说明它的工作。此“构建日志”非常重要。当构建未按预期进行时,我们的打包人员将花费大量时间来遍历它们,以跟踪完整的构建路径来查看出了什么问题。
+
+就是这样!准备安装的 RPM 应该位于以下位置:
+
+```
+$ ls ~/rpmbuild/RPMS/noarch/
+fpaste-0.3.9.2-3.fc30.noarch.rpm
+```
+
+### 概括
+
+我们已经介绍了如何从 spec 文件构建 RPM 的基础知识。这绝不是一份详尽的文档。实际上,它根本不是文档。它只是试图解释幕后的运作方式。简短回顾一下:
+
+* RPM 有两种类型:源 RPM 和 二进制 RPM。
+* 二进制 RPM 包含要安装以使用该软件的文件。
+* 源 RPM 包含构建二进制 RPM 所需的信息:完整的源代码,以及 spec 文件中的有关如何构建 RPM 的说明。
+* spec 文件包含多个部分,每个部分都有其自己的用途。
+
+在这里,我们已经在安装好的 Fedora 系统中本地构建了 RPM。虽然这是个基本的过程,但我们从存储库中获得的 RPM 是建立在具有严格配置和方法的专用服务器上的,以确保正确性和安全性。这个 Fedora 打包流程将在以后的文章中讨论。
+
+你想开始构建软件包,并帮助 Fedora 社区维护我们提供的大量软件吗?你可以[从这里开始加入软件包集合维护者][4]。
+
+如有任何疑问,请发布到 [Fedora 开发人员邮件列表][5],我们随时乐意为你提供帮助!
+
+### 参考
+
+这里有一些构建 RPM 的有用参考:
+
+*
+*
+*
+*
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/how-rpm-packages-are-made-the-spec-file/
+
+作者:[Ankur Sinha "FranciscoD"][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/ankursinha/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2019/06/rpm.png-816x345.jpg
+[2]: https://linux.cn/article-11527-1.html
+[3]: https://fedoramagazine.org/managing-packages-fedora-dnf/
+[4]: https://fedoraproject.org/wiki/Join_the_package_collection_maintainers
+[5]: https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/
diff --git a/published/20190905 Building CI-CD pipelines with Jenkins.md b/published/20190905 Building CI-CD pipelines with Jenkins.md
new file mode 100644
index 0000000000..378ad6728a
--- /dev/null
+++ b/published/20190905 Building CI-CD pipelines with Jenkins.md
@@ -0,0 +1,246 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11546-1.html)
+[#]: subject: (Building CI/CD pipelines with Jenkins)
+[#]: via: (https://opensource.com/article/19/9/intro-building-cicd-pipelines-jenkins)
+[#]: author: (Bryant Son https://opensource.com/users/brson)
+
+用 Jenkins 构建 CI/CD 流水线
+======
+
+> 通过这份 Jenkins 分步教程,构建持续集成和持续交付(CI/CD)流水线。
+
+
+
+在我的文章《[使用开源工具构建 DevOps 流水线的初学者指南][2]》中,我分享了一个从头开始构建 DevOps 流水线的故事。推动该计划的核心技术是 [Jenkins][3],这是一个用于建立持续集成和持续交付(CI/CD)流水线的开源工具。
+
+在花旗,有一个单独的团队为专用的 Jenkins 流水线提供稳定的主从节点环境,但是该环境仅用于质量保证(QA)、构建阶段和生产环境。开发环境仍然是非常手动的,我们的团队需要对其进行自动化以在加快开发工作的同时获得尽可能多的灵活性。这就是我们决定为 DevOps 建立 CI/CD 流水线的原因。Jenkins 的开源版本由于其灵活性、开放性、强大的插件功能和易用性而成为显而易见的选择。
+
+在本文中,我将分步演示如何使用 Jenkins 构建 CI/CD 流水线。
+
+### 什么是流水线?
+
+在进入本教程之前,了解有关 CI/CD 流水线的知识会很有帮助。
+
+首先,了解 Jenkins 本身并不是流水线这一点很有帮助。只是创建一个新的 Jenkins 作业并不能构建一条流水线。可以把 Jenkins 看做一个遥控器,在这里点击按钮即可。当你点击按钮时会发生什么取决于遥控器要控制的内容。Jenkins 为其他应用程序 API、软件库、构建工具等提供了一种插入 Jenkins 的方法,它可以执行并自动化任务。Jenkins 本身不执行任何功能,但是随着其它工具的插入而变得越来越强大。
+
+流水线是一个单独的概念,指的是按顺序连接在一起的事件或作业组:
+
+> “流水线”是可以执行的一系列事件或作业。
+
+理解流水线的最简单方法是可视化一系列阶段,如下所示:
+
+![Pipeline example][4]
+
+在这里,你应该看到两个熟悉的概念:阶段和步骤。
+
+* 阶段:一个包含一系列步骤的块。阶段块可以命名为任何名称;它用于可视化流水线过程。
+* 步骤:表明要做什么的任务。步骤定义在阶段块内。
+
+在上面的示例图中,阶段 1 可以命名为 “构建”、“收集信息”或其它名称,其它阶段块也可以采用类似的思路。“步骤”只是简单地说放上要执行的内容,它可以是简单的打印命令(例如,`echo "Hello, World"`)、程序执行命令(例如,`java HelloWorld`)、shell 执行命令( 例如,`chmod 755 Hello`)或任何其他命令,只要通过 Jenkins 环境将其识别为可执行命令即可。
+
+Jenkins 流水线以**编码脚本**的形式提供,通常称为 “Jenkinsfile”,尽管可以用不同的文件名。下面这是一个简单的 Jenkins 流水线文件的示例:
+
+```
+// Example of Jenkins pipeline script
+
+pipeline {
+ stages {
+ stage("Build") {
+ steps {
+ // Just print a Hello, Pipeline to the console
+ echo "Hello, Pipeline!"
+ // Compile a Java file. This requires JDKconfiguration from Jenkins
+ javac HelloWorld.java
+ // Execute the compiled Java binary called HelloWorld. This requires JDK configuration from Jenkins
+ java HelloWorld
+ // Executes the Apache Maven commands, clean then package. This requires Apache Maven configuration from Jenkins
+ mvn clean package ./HelloPackage
+ // List the files in current directory path by executing a default shell command
+ sh "ls -ltr"
+ }
+ }
+ // And next stages if you want to define further...
+ } // End of stages
+} // End of pipeline
+```
+
+从此示例脚本很容易看到 Jenkins 流水线的结构。请注意,默认情况下某些命令(如 `java`、`javac`和 `mvn`)不可用,需要通过 Jenkins 进行安装和配置。 因此:
+
+> Jenkins 流水线是一种以定义的方式依次执行 Jenkins 作业的方法,方法是将其编码并在多个块中进行结构化,这些块可以包含多个任务的步骤。
+
+好。既然你已经了解了 Jenkins 流水线是什么,我将向你展示如何创建和执行 Jenkins 流水线。在本教程的最后,你将建立一个 Jenkins 流水线,如下所示:
+
+![Final Result][5]
+
+### 如何构建 Jenkins 流水线
+
+为了便于遵循本教程的步骤,我创建了一个示例 [GitHub 存储库][6]和一个视频教程。
+
+- [视频](https://img.linux.net.cn/static/video/_-jDPwYgDVKlg.mp4)
+
+开始本教程之前,你需要:
+
+* Java 开发工具包(JDK):如果尚未安装,请安装 JDK 并将其添加到环境路径中,以便可以通过终端执行 Java 命令(如 `java jar`)。这是利用本教程中使用的 Java Web Archive(WAR)版本的 Jenkins 所必需的(尽管你可以使用任何其他发行版)。
+* 基本计算机操作能力:你应该知道如何键入一些代码、通过 shell 执行基本的 Linux 命令以及打开浏览器。
+
+让我们开始吧。
+
+#### 步骤一:下载 Jenkins
+
+导航到 [Jenkins 下载页面][7]。向下滚动到 “Generic Java package (.war)”,然后单击下载文件;将其保存在易于找到的位置。(如果你选择其他 Jenkins 发行版,除了步骤二之外,本教程的其余步骤应该几乎相同。)使用 WAR 文件的原因是它是个一次性可执行文件,可以轻松地执行和删除。
+
+![Download Jenkins as Java WAR file][8]
+
+#### 步骤二:以 Java 二进制方式执行 Jenkins
+
+打开一个终端窗口,并使用 `cd ` 进入下载 Jenkins 的目录。(在继续之前,请确保已安装 JDK 并将其添加到环境路径。)执行以下命令,该命令将 WAR 文件作为可执行二进制文件运行:
+
+```
+java -jar ./jenkins.war
+```
+
+如果一切顺利,Jenkins 应该在默认端口 8080 上启动并运行。
+
+![Execute as an executable JAR binary][9]
+
+#### 步骤三:创建一个新的 Jenkins 作业
+
+打开一个 Web 浏览器并导航到 `localhost:8080`。除非你有以前安装的 Jenkins,否则应直接转到 Jenkins 仪表板。点击 “Create New Jobs”。你也可以点击左侧的 “New Item”。
+
+![Create New Job][10]
+
+#### 步骤四:创建一个流水线作业
+
+在此步骤中,你可以选择并定义要创建的 Jenkins 作业类型。选择 “Pipeline” 并为其命名(例如,“TestPipeline”)。单击 “OK” 创建流水线作业。
+
+![Create New Pipeline Job][11]
+
+你将看到一个 Jenkins 作业配置页面。向下滚动以找到 “Pipeline” 部分。有两种执行 Jenkins 流水线的方法。一种方法是在 Jenkins 上直接编写流水线脚本,另一种方法是从 SCM(源代码管理)中检索 Jenkins 文件。在接下来的两个步骤中,我们将体验这两种方式。
+
+#### 步骤五:通过直接脚本配置并执行流水线作业
+
+要使用直接脚本执行流水线,请首先从 GitHub 复制该 [Jenkinsfile 示例][6]的内容。选择 “Pipeline script” 作为 “Destination”,然后将该 Jenkinsfile 的内容粘贴到 “Script” 中。花一些时间研究一下 Jenkins 文件的结构。注意,共有三个阶段:Build、Test 和 Deploy,它们是任意的,可以是任何一个。每个阶段中都有一些步骤;在此示例中,它们只是打印一些随机消息。
+
+单击 “Save” 以保留更改,这将自动将你带回到 “Job Overview” 页面。
+
+![Configure to Run as Jenkins Script][12]
+
+要开始构建流水线的过程,请单击 “Build Now”。如果一切正常,你将看到第一个流水线(如下面的这个)。
+
+![Click Build Now and See Result][13]
+
+要查看流水线脚本构建的输出,请单击任何阶段,然后单击 “Log”。你会看到这样的消息。
+
+![Visit sample GitHub with Jenkins get clone link][14]
+
+#### 步骤六:通过 SCM 配置并执行流水线作业
+
+现在,换个方式:在此步骤中,你将通过从源代码控制的 GitHub 中复制 Jenkinsfile 来部署相同的 Jenkins 作业。在同一个 [GitHub 存储库][6]中,通过单击 “Clone or download” 并复制其 URL 来找到其存储库 URL。
+
+![Checkout from GitHub][15]
+
+单击 “Configure” 以修改现有作业。滚动到 “Advanced Project Options” 设置,但这一次,从 “Destination” 下拉列表中选择 “Pipeline script from SCM” 选项。将 GitHub 存储库的 URL 粘贴到 “Repository URL” 中,然后在 “Script Path” 中键入 “Jenkinsfile”。 单击 “Save” 按钮保存。
+
+![Change to Pipeline script from SCM][16]
+
+要构建流水线,回到 “Task Overview” 页面后,单击 “Build Now” 以再次执行作业。结果与之前相同,除了多了一个称为 “Declaration: Checkout SCM” 的阶段。
+
+![Build again and verify][17]
+
+要查看来自 SCM 构建的流水线的输出,请单击该阶段并查看 “Log” 以检查源代码控制克隆过程的进行情况。
+
+![Verify Checkout Procedure][18]
+
+### 除了打印消息,还能做更多
+
+恭喜你!你已经建立了第一个 Jenkins 流水线!
+
+“但是等等”,你说,“这太有限了。除了打印无用的消息外,我什么都做不了。”那没问题。到目前为止,本教程仅简要介绍了 Jenkins 流水线可以做什么,但是你可以通过将其与其他工具集成来扩展其功能。以下是给你的下一个项目的一些思路:
+
+* 建立一个多阶段的 Java 构建流水线,从以下阶段开始:从 Nexus 或 Artifactory 之类的 JAR 存储库中拉取依赖项、编译 Java 代码、运行单元测试、打包为 JAR/WAR 文件,然后部署到云服务器。
+* 实现一个高级代码测试仪表板,该仪表板将基于 Selenium 的单元测试、负载测试和自动用户界面测试,报告项目的运行状况。
+* 构建多流水线或多用户流水线,以自动化执行 Ansible 剧本的任务,同时允许授权用户响应正在进行的任务。
+* 设计完整的端到端 DevOps 流水线,该流水线可提取存储在 SCM 中的基础设施资源文件和配置文件(例如 GitHub),并通过各种运行时程序执行该脚本。
+
+学习本文结尾处的任何教程,以了解这些更高级的案例。
+
+#### 管理 Jenkins
+
+在 Jenkins 主面板,点击 “Manage Jenkins”。
+
+![Manage Jenkins][19]
+
+#### 全局工具配置
+
+有许多可用工具,包括管理插件、查看系统日志等。单击 “Global Tool Configuration”。
+
+![Global Tools Configuration][20]
+
+#### 增加附加能力
+
+在这里,你可以添加 JDK 路径、Git、Gradle 等。配置工具后,只需将该命令添加到 Jenkinsfile 中或通过 Jenkins 脚本执行即可。
+
+![See Various Options for Plugin][21]
+
+### 后继
+
+本文为你介绍了使用酷炫的开源工具 Jenkins 创建 CI/CD 流水线的方法。要了解你可以使用 Jenkins 完成的许多其他操作,请在 Opensource.com 上查看以下其他文章:
+
+* [Jenkins X 入门][22]
+* [使用 Jenkins 安装 OpenStack 云][23]
+* [在容器中运行 Jenkins][24]
+* [Jenkins 流水线入门][25]
+* [如何与 Jenkins 一起运行 JMeter][26]
+* [将 OpenStack 集成到你的 Jenkins 工作流中][27]
+
+你可能对我为你的开源之旅而写的其他一些文章感兴趣:
+
+* [9 个用于构建容错系统的开源工具][28]
+* [了解软件设计模式][29]
+* [使用开源工具构建 DevOps 流水线的初学者指南][2]
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/intro-building-cicd-pipelines-jenkins
+
+作者:[Bryant Son][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/brson
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/pipe-pipeline-grid.png?itok=kkpzKxKg (pipelines)
+[2]: https://linux.cn/article-11307-1.html
+[3]: https://jenkins.io/
+[4]: https://opensource.com/sites/default/files/uploads/diagrampipeline.jpg (Pipeline example)
+[5]: https://opensource.com/sites/default/files/uploads/0_endresultpreview_0.jpg (Final Result)
+[6]: https://github.com/bryantson/CICDPractice
+[7]: https://jenkins.io/download/
+[8]: https://opensource.com/sites/default/files/uploads/2_downloadwar.jpg (Download Jenkins as Java WAR file)
+[9]: https://opensource.com/sites/default/files/uploads/3_runasjar.jpg (Execute as an executable JAR binary)
+[10]: https://opensource.com/sites/default/files/uploads/4_createnewjob.jpg (Create New Job)
+[11]: https://opensource.com/sites/default/files/uploads/5_createpipeline.jpg (Create New Pipeline Job)
+[12]: https://opensource.com/sites/default/files/uploads/6_runaspipelinescript.jpg (Configure to Run as Jenkins Script)
+[13]: https://opensource.com/sites/default/files/uploads/7_buildnow4script.jpg (Click Build Now and See Result)
+[14]: https://opensource.com/sites/default/files/uploads/8_seeresult4script.jpg (Visit sample GitHub with Jenkins get clone link)
+[15]: https://opensource.com/sites/default/files/uploads/9_checkoutfromgithub.jpg (Checkout from GitHub)
+[16]: https://opensource.com/sites/default/files/uploads/10_runsasgit.jpg (Change to Pipeline script from SCM)
+[17]: https://opensource.com/sites/default/files/uploads/11_seeresultfromgit.jpg (Build again and verify)
+[18]: https://opensource.com/sites/default/files/uploads/12_verifycheckout.jpg (Verify Checkout Procedure)
+[19]: https://opensource.com/sites/default/files/uploads/13_managingjenkins.jpg (Manage Jenkins)
+[20]: https://opensource.com/sites/default/files/uploads/14_globaltoolsconfiguration.jpg (Global Tools Configuration)
+[21]: https://opensource.com/sites/default/files/uploads/15_variousoptions4plugin.jpg (See Various Options for Plugin)
+[22]: https://opensource.com/article/18/11/getting-started-jenkins-x
+[23]: https://opensource.com/article/18/4/install-OpenStack-cloud-Jenkins
+[24]: https://linux.cn/article-9741-1.html
+[25]: https://opensource.com/article/18/4/jenkins-pipelines-with-cucumber
+[26]: https://opensource.com/life/16/7/running-jmeter-jenkins-continuous-delivery-101
+[27]: https://opensource.com/business/15/5/interview-maish-saidel-keesing-cisco
+[28]: https://opensource.com/article/19/3/tools-fault-tolerant-system
+[29]: https://opensource.com/article/19/7/understanding-software-design-patterns
diff --git a/published/20190906 6 Open Source Paint Applications for Linux Users.md b/published/20190906 6 Open Source Paint Applications for Linux Users.md
new file mode 100644
index 0000000000..72eecbff38
--- /dev/null
+++ b/published/20190906 6 Open Source Paint Applications for Linux Users.md
@@ -0,0 +1,214 @@
+[#]: collector: (lujun9972)
+[#]: translator: (robsean)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11554-1.html)
+[#]: subject: (6 Open Source Paint Applications for Linux Users)
+[#]: via: (https://itsfoss.com/open-source-paint-apps/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+6 款面向 Linux 用户的开源绘图应用程序
+======
+
+小时候,当我开始使用计算机(在 Windows XP 中)时,我最喜欢的应用程序是微软的“画图”。我能在它上面涂鸦数个小时。出乎意料,孩子们仍然喜欢这个“画图”应用程序。不仅仅是孩子们,这个简单的“画图”应用程序,在很多情况下都能派上用场。
+
+你可以找到一堆可以让你绘制/绘图或操作图片的应用程序。然而,其中一些是专有软件。既然你是一名 Linux 用户,为什么不关注一下开源绘图应用程序呢?
+
+在这篇文章中,我们将列出一些最好的开源绘图应用程序,它们可以替代可用于 Linux 的专有绘画软件。
+
+### 开源绘图 & 绘制应用程序
+
+![][1]
+
+**注意:** 该列表没有特别的排名顺序。
+
+#### 1、Pinta
+
+![][2]
+
+主要亮点:
+
+ * Paint.NET / 微软“画图”的极好替代品
+ * 支持附加组件(有对 WebP 图像的支持)
+ * 支持图层
+
+[Pinta][3] 是一款令人赞叹的开源绘图应用程序,非常适合绘图和简单的图片编辑。换句话说,它是一款具有精美功能的简单绘图应用程序。
+
+你可以将 [Pinta][4] 视为 Linux 上的“画图”的一个替代品,但是带有图层支持等等。不仅仅是“画图”,它也可以替代 Windows 上的 Paint.NET。尽管 Paint.NET 更好一些,但 Pinta 似乎是个不错的选择。
+
+几个附加组件可以用于增强功能,例如[在 Linux 上支持 WebP 图像][5]。除了图层支持之外,你还可以轻松地调整图片大小、添加特效、进行调整(亮度、对比度等等),以及在导出图片时调整其质量。
+
+##### 如何安装 Pinta ?
+
+你应该能够在软件中心/应用程序中心/软件包管理器中简单地找到它。只需要输入 “Pinta”,并开始安装它。要么也可以尝试 [Flatpak][6] 软件包。
+
+或者,你可以在终端中输入下面的命令(Ubuntu/Debian):
+
+```
+sudo apt install pinta
+```
+
+下载软件包和安装指南的更多信息,参考[官方下载页面][7]。
+
+#### 2、Krita
+
+![][8]
+
+主要亮点:
+
+ * HDR 绘图
+ * 支持 PSD
+ * 支持图层
+ * 笔刷稳定器
+ * 二维动画
+
+Krita 是 Linux 上最高级的开源绘图应用程序之一。当然,对于本文而言,它可以帮助你绘制草图和在画布上胡写乱画。除此之外,它还提供很多功能。
+
+例如,如果你的手有点颤抖,它可以帮助你稳定笔刷的笔划。你可以使用内置的矢量工具来创建漫画画板和其它有趣的东西。如果你正在寻找具有全面的颜色管理支持、绘图助理和图层管理的软件,Krita 应该是你最好的选择。
+
+##### 如何安装 Krita ?
+
+类似于 pinta,你可以在软件中心/应用程序中心或软件包管理器的列表中找到它。它也可以 [Flatpak 存储库][10]中找到。
+
+考虑通过终端安装它?输入下面的命令:
+
+```
+sudo apt install krita
+```
+
+要么你也可以前往它们的[官方下载页面][11]来获取 AppImage 文件并运行它。
+
+如果你对 AppImage 文件一无所知,查看我们的指南 —— [如何使用 AppImage][12]。
+
+#### 3、Tux Paint
+
+![][13]
+
+主要亮点:
+
+ * 给儿童用的一个简单直接的绘图应用程序
+
+我不是开玩笑,对于 3-12 岁儿童来说,Tux Paint 是最好的开源绘图应用程序之一。当然,当你只想乱画时,那无需选择,所以,在这种情况下,Tux Paint 似乎是最好的选择(即使是成年人!)。
+
+##### 如何安装 Tuxpaint ?
+
+Tuxpaint 可以从软件中心或软件包管理器下载。无论哪种情况,在 Ubuntu/Debian 上安装它,在终端中输入下面的命令:
+
+```
+sudo apt install tuxpaint
+```
+
+关于它的更多信息,前往[官方站点][14]。
+
+#### 4、Drawpile
+
+![][15]
+
+主要亮点:
+
+ * 协同绘制
+ * 内置聊天功能,可与其他用户互动
+ * 图层支持
+ * 记录绘制会话
+
+Drawpile 是一个有趣的开源绘图应用程序,在该程序中,你可以与其他用户实时协作。确切地说,你们可以单个画布中同时绘制。除了这个独特的功能,它还有图层支持、记录绘制会话的能力,甚至还有与协作用户进行交互的聊天功能。
+
+你可以主持或加入一个公共会话,或通过一个密码与你的朋友建立私有会话。默认情况下,服务器将是你的计算机,但是如果你需要远程服务器那也可以。
+
+注意,你将需要[注册一个 Drawpile 账户][16] 才能进行协作。
+
+##### 如何安装 Drawpile ?
+
+据我所知,你只能在 [Flatpak 存储库][17]的列表中找到它。
+
+#### 5、MyPaint
+
+![][19]
+
+主要亮点:
+
+ * 易用的数码画家工具
+ * 支持图层管理
+ * 很多微调你的画笔和绘制的选项
+
+对于数码画家来说,[MyPaint][20] 是一个简单而强大的工具。它具有许多选项,可以调整以制作出完美的数字画笔笔触。我不是一个数字艺术家(但我是一个涂鸦者),但是我注意到有很多调整笔刷、颜色的选项,和一个添加中间结果暂存器面板的选项。
+
+它也支持图层管理,也许你需要它。最新的稳定版本已经有几年没有更新了,但是当前的 alpha 构建版本(我测试过)运行良好。如果你正在 Linux 上寻找一个开源绘图应用程序 —— 试试这个。
+
+##### 如何安装 MyPaint ?
+
+MyPaint 可在官方存储库中获得。然而,这是老旧的版本。如果你仍然想继续,你可以在软件中心搜索它,或在终端中输入下面的命令:
+
+```
+sudo apt install mypaint
+```
+
+你可以前往它的官方 [GitHub 发布页面][21]获取最新的 alpha 构建版本,获取 [AppImage 文件][12](任意版本)并使它可执行并启动应用程序。
+
+#### 6、KolourPaint
+
+![][22]
+
+主要亮点:
+
+ * 一个 Linux 上的“画图”的简单替代品
+ * 不支持图层管理
+
+如果你不需要任何图层管理的支持,而只是想要一个开源绘图应用程序来绘制东西 —— 那就是它了。
+
+[KolourPaint][23] 最初是为 KDE 桌面环境定制的,但是它在其它的桌面环境中也能完美地工作。
+
+##### 如何安装 KolourPaint ?
+
+你可以从软件中心安装 KolourPaint,或通过终端使用下面的命令:
+
+```
+sudo apt install kolourpaint4
+```
+
+你总可以试试 [Flathub][24]。
+
+### 总结
+
+如果你在考虑如 GIMP/Inkscape 这样的应用程序,我们在另一篇关于[给数码艺术家的最好 Linux 工具][25]的文章中列出。如果你对更多的选择好奇,我建议你去查看它。
+
+在这里,我们尝试编写一份 Linux 可用的最佳开源绘图应用程序列表。如果你认为我们错过一些东西,请在下面的评论区告诉我们!
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/open-source-paint-apps/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[robsean](https://github.com/robsean)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/open-source-paint-apps.png?resize=800%2C450&ssl=1
+[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/pinta.png?ssl=1
+[3]: https://pinta-project.com/pintaproject/pinta/
+[4]: https://itsfoss.com/pinta-1-6-ubuntu-linux-mint/
+[5]: https://itsfoss.com/webp-ubuntu-linux/
+[6]: https://www.flathub.org/apps/details/com.github.PintaProject.Pinta
+[7]: https://pinta-project.com/pintaproject/pinta/releases
+[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/krita-paint.png?ssl=1
+[9]: https://itsfoss.com/things-to-do-after-installing-fedora-24/
+[10]: https://www.flathub.org/apps/details/org.kde.krita
+[11]: https://krita.org/en/download/krita-desktop/
+[12]: https://itsfoss.com/use-appimage-linux/
+[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/tux-paint.jpg?ssl=1
+[14]: http://www.tuxpaint.org/
+[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/drawpile.png?ssl=1
+[16]: https://drawpile.net/accounts/signup/
+[17]: https://flathub.org/apps/details/net.drawpile.drawpile
+[18]: https://itsfoss.com/ocs-store/
+[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/mypaint.png?ssl=1
+[20]: https://mypaint.org/
+[21]: https://github.com/mypaint/mypaint/releases
+[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/kolourpaint.png?ssl=1
+[23]: http://kolourpaint.org/
+[24]: https://flathub.org/apps/details/org.kde.kolourpaint
+[25]: https://itsfoss.com/best-linux-graphic-design-software/
diff --git a/published/20190912 How to fix common pitfalls with the Python ORM tool SQLAlchemy.md b/published/20190912 How to fix common pitfalls with the Python ORM tool SQLAlchemy.md
new file mode 100644
index 0000000000..b7f51e093b
--- /dev/null
+++ b/published/20190912 How to fix common pitfalls with the Python ORM tool SQLAlchemy.md
@@ -0,0 +1,194 @@
+[#]: collector: (lujun9972)
+[#]: translator: (MjSeven)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11590-1.html)
+[#]: subject: (How to fix common pitfalls with the Python ORM tool SQLAlchemy)
+[#]: via: (https://opensource.com/article/19/9/common-pitfalls-python)
+[#]: author: (Zach Todd https://opensource.com/users/zchtoddhttps://opensource.com/users/lauren-pritchetthttps://opensource.com/users/liranhaimovitchhttps://opensource.com/users/moshez)
+
+如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
+======
+
+> 在使用 SQLAlchemy 时,那些看似很小的选择可能对这种对象关系映射工具包的性能产生重要影响。
+
+![A python with a package.][1]
+
+对象关系映射([ORM][2])使应用程序开发人员的工作更轻松,在很大程度是因为它允许你使用你可能知道的语言(例如 Python)与数据库交互,而不是使用原始 SQL 语句查询。[SQLAlchemy][3] 是一个 Python ORM 工具包,它提供使用 Python 访问 SQL 数据库的功能。它是一个成熟的 ORM 工具,增加了模型关系、强大的查询构造范式、简单的序列化等优点。然而,它的易用性使得人们很容易忘记其背后发生了什么。使用 SQLAlchemy 时做出的看似很小的选择可能产生非常大的性能影响。
+
+本文解释了开发人员在使用 SQLAlchemy 时遇到的一些最重要的性能问题,以及如何解决这些问题。
+
+### 只需要计数但检索整个结果集
+
+有时开发人员只需要一个结果计数,但是没有使用数据库计数功能,而是获取了所有结果,然后使用 Python 中的 `len` 完成计数。
+
+```
+count = len(User.query.filter_by(acct_active=True).all())
+```
+
+相反,使用 SQLAlchemy 的 `count` 方法将在服务器端执行计数,从而减少发送到客户端的数据。在前面的例子中调用 `all()` 也会导致模型对象的实例化,如果有很多数据,那么时间代价可能会非常昂贵。
+
+除非还需要做其他的事情,否则只需使用 `count` 方法:
+
+```
+count = User.query.filter_by(acct_active=True).count()
+```
+
+### 只需要几列时检索整个模型
+
+在许多情况下,发出查询时只需要几列数据。SQLAlchemy 可以只获取你想要的列,而不是返回整个模型实例。这不仅减少了发送的数据量,还避免了实例化整个对象。使用列数据的元组而不是模型可以快得多。
+
+```
+result = User.query.all()
+for user in result:
+ print(user.name, user.email)
+```
+
+反之,使用 `with_entities` 方法只选择所需要的内容:
+
+```
+result = User.query.with_entities(User.name, User.email).all()
+for (username, email) in result:
+ print(username, email)
+```
+
+### 每次循环都更新一个对象
+
+避免使用循环来单独更新集合。虽然数据库可以非常快地执行单个更新,但应用程序和数据库服务器之间的往返时间将快速累加。通常,在合理的情况下争取更少的查询。
+
+```
+for user in users_to_update:
+ user.acct_active = True
+ db.session.add(user)
+```
+
+改用批量更新方法:
+
+```
+query = User.query.filter(user.id.in_([user.id for user in users_to_update]))
+query.update({"acct_active": True}, synchronize_session=False)
+```
+
+### 触发级联删除
+
+ORM 允许在模型关系上进行简单的配置,但是有一些微妙的行为可能会令人吃惊。大多数数据库通过外键和各种级联选项维护关系完整性。SQLAlchemy 允许你使用外键和级联选项定义模型,但是 ORM 具有自己的级联逻辑,可以取代数据库。
+
+考虑以下模型:
+
+```
+class Artist(Base):
+ __tablename__ = "artist"
+
+ id = Column(Integer, primary_key=True)
+ songs = relationship("Song", cascade="all, delete")
+
+
+class Song(Base):
+ __tablename__ = "song"
+
+ id = Column(Integer, primary_key=True)
+ artist_id = Column(Integer, ForeignKey("artist.id", ondelete="CASCADE"))
+```
+
+删除歌手将导致 ORM 在 `song` 表上发出 `delete` 查询,从而防止由于外键导致的删除操作。这种行为可能会成为复杂关系和大量记录的瓶颈。
+
+请包含 `passive_deletes` 选项,以确保让数据库来管理关系。但是,请确保你的数据库具有此功能。例如,SQLite 默认情况下不管理外键。
+
+```
+songs = relationship("Song", cascade all, delete", passive_deletes=True)
+```
+
+### 当要使用贪婪加载时,应使用延迟加载
+
+延迟加载是 SQLAlchemy 处理关系的默认方法。从上一个例子构建来看,加载一个歌手时不会同时加载他或她的歌曲。这通常是一个好主意,但是如果总是需要加载某些关系,单独的查询可能会造成浪费。
+
+如果允许以延迟方式加载关系,像 [Marshmallow][4] 这样流行的序列化框架可以触发级联查询。
+
+有几种方法可以控制此行为。最简单的方法是通过 relationship 函数本身。
+
+```
+songs = relationship("Song", lazy="joined", cascade="all, delete")
+```
+
+这将导致一个左连接被添加到任何歌手的查询中,因此,`songs` 集合将立即可用。尽管有更多数据返回给客户端,但往返次数可能会少得多。
+
+SQLAlchemy 为无法采用这种综合方法的情况提供了更细粒度的控制,可以使用 `joinedload()` 函数在每个查询的基础上切换连接的加载。
+
+```
+from sqlalchemy.orm import joinedload
+
+artists = Artist.query.options(joinedload(Artist.songs))
+print(artists.songs) # Does not incur a roundtrip to load
+```
+
+### 使用 ORM 进行批量记录导入
+
+导入成千上万条记录时,构建完整模型实例的开销会成为主要瓶颈。想象一下,从一个文件中加载数千首歌曲记录,其中每首歌曲都先被转换为字典。
+
+```
+for song in songs:
+ db.session.add(Song(`song))
+```
+
+相反,绕过 ORM,只使用核心的 SQLAlchemy 参数绑定功能。
+
+```
+batch = []
+insert_stmt = Song.__table__.insert()
+for song in songs:
+ if len(batch) > 1000:
+ db.session.execute(insert_stmt, batch)
+ batch.clear()
+ batch.append(song)
+if batch:
+ db.session.execute(insert_stmt, batch)
+```
+
+请记住,此方法会自然而然地跳过你可能依赖的任何客户端 ORM 逻辑,例如基于 Python 的列默认值。尽管此方法比将对象加载为完整的模型实例要快,但是你的数据库可能具有更快的批量加载方法。例如,PostgreSQL 的 `COPY` 命令为加载大量记录提供了最佳性能。
+
+### 过早调用提交或刷新
+
+在很多情况下,你需要将子记录与其父记录相关联,反之亦然。一种显然的方法是刷新会话,以便为有问题的记录分配一个 ID。
+
+```
+artist = Artist(name="Bob Dylan")
+song = Song(title="Mr. Tambourine Man")
+
+db.session.add(artist)
+db.session.flush()
+
+song.artist_id = artist.id
+```
+
+对于每个请求,多次提交或刷新通常是不必要的,也是不可取的。数据库刷新涉及强制在数据库服务器上进行磁盘写入,在大多数情况下,客户端将阻塞,直到服务器确认已写入数据为止。
+
+SQLAlchemy 可以在幕后跟踪关系和管理相关键。
+
+```
+artist = Artist(name="Bob Dylan")
+song = Song(title="Mr. Tambourine Man")
+
+artist.songs.append(song)
+```
+
+### 总结
+
+我希望这一系列常见的陷阱可以帮助你避免这些问题,并使你的应用平稳运行。通常,在诊断性能问题时,测量是关键。大多数数据库都提供性能诊断功能,可以帮助你定位问题,例如 PostgreSQL 的 `pg_stat_statements` 模块。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/common-pitfalls-python
+
+作者:[Zach Todd][a]
+选题:[lujun9972][b]
+译者:[MjSeven](https://github.com/MjSeven)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/zchtoddhttps://opensource.com/users/lauren-pritchetthttps://opensource.com/users/liranhaimovitchhttps://opensource.com/users/moshez
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python_snake_file_box.jpg?itok=UuDVFLX- (A python with a package.)
+[2]: https://en.wikipedia.org/wiki/Object-relational_mapping
+[3]: https://www.sqlalchemy.org/
+[4]: https://marshmallow.readthedocs.io/en/stable/
diff --git a/published/201910/20140510 Managing Digital Files (e.g., Photographs) in Files and Folders.md b/published/201910/20140510 Managing Digital Files (e.g., Photographs) in Files and Folders.md
new file mode 100644
index 0000000000..6c2f834fa2
--- /dev/null
+++ b/published/201910/20140510 Managing Digital Files (e.g., Photographs) in Files and Folders.md
@@ -0,0 +1,619 @@
+数码文件与文件夹收纳术(以照片为例)
+======
+
+
+
+- 更新 2014-05-14:增加了一些具体实例
+- 更新 2015-03-16:根据照片的 GPS 坐标过滤图片
+- 更新 2016-08-29:以新的 `filetags --filter` 替换已经过时的 `show-sel.sh` 脚本
+- 更新 2017-08-28: geeqier 视频缩略图的邮件评论
+- 更新 2018-03-06:增加了 Julian Kahnert 的链接
+- 更新 2018-05-06:增加了作者在 2018 Linuxtage Graz 大会上 45 分钟演讲的视频
+- 更新 2018-06-05:关于 metadata 的邮件回复
+- 更新 2018-07-22:移动文件夹结构的解释到一篇它自己的文章中
+- 更新 2019-07-09:关于在文件名中避免使用系谱和字符的邮件回复
+
+每当度假或去哪游玩时我就会化身为一个富有激情的摄影师。所以,过去的几年中我积累了许多的 [JPEG][1] 文件。这篇文章中我会介绍我是如何避免 [供应商锁定][2](LCTT 译注:供应商锁定,原为经济学术语,这里引申为避免过于依赖某一服务平台)造成受限于那些临时性的解决方案及数据丢失。相反,我更倾向于使用那些可以让我**投入时间和精力打理,并能长久使用**的解决方案。
+
+这一(相当长的)攻略 **并不仅仅适用于图像文件**:我将进一步阐述像是文件夹结构、文件的命名规则等等许多领域的事情。因此,这些规范适用于我所能接触到的所有类型的文件。
+
+在我开始传授我的方法之前,我们应该先就我将要介绍方法的达成一个共识,那就是我们是否有相同的需求。如果你对 [raw 图像格式][3]十分推崇,将照片存储在云端或其他你信赖的地方(对我而言可能不会),那么你可能不会认同这篇文章将要描述的方式了。请根据你的情况来灵活做出选择。
+
+### 我的需求
+
+对于 **将照片(或视频)从我的数码相机中导出到电脑里**,我只需要将 SD 卡插到我的电脑里并调用 `fetch-workflow` 软件。这一步也完成了**图像软件的预处理**以适用于我的文件命名规范(下文会具体论述),同时也可以将图片旋转至正常的方向(而不是横着)。
+
+这些文件将会被存入到我的摄影收藏文件夹 `$HOME/tmp/digicam/`。在这一文件夹中我希望能**遍历我的图像和视频文件**,以便于**整理/删除、重命名、添加/移除标签,以及将一系列相关的文件移动到相应的文件夹中**。
+
+在完成这些以后,我将会**浏览包含图像/电影文件集的文件夹**。在极少数情况下,我希望**在独立的图像处理工具**(比如 [GIMP][4])中打开一个图像文件。如果仅是为了**旋转 JPEG 文件**,我想找到一个快速的方法,不需要图像处理工具,并且是[以无损的方式][5]旋转 JPEG 图像。
+
+我的数码相机支持用 [GPS][6] 坐标标记图像。因此,我需要一个方法来**对单个文件或一组文件可视化 GPS 坐标**来显示我走过的路径。
+
+我想拥有的另一个好功能是:假设你在威尼斯度假时拍了几百张照片。每一个都很漂亮,所以你每张都舍不得删除。另一方面,你可能想把一组更少的照片送给家里的朋友。而且,在他们嫉妒的爆炸之前,他们可能只希望看到 20 多张照片。因此,我希望能够**定义并显示一组特定的照片子集**。
+
+就独立性和**避免锁定效应**而言,我不想使用那种一旦公司停止产品或服务就无法使用的工具。出于同样的原因,由于我是一个注重隐私的人,**我不想使用任何基于云的服务**。为了让自己对新的可能性保持开放的心态,我不希望只在一个特定的操作系统平台才可行的方案上倾注全部的精力。**基本的东西必须在任何平台上可用**(查看、导航、……),而**全套需求必须可以在 GNU/Linux 上运行**,对我而言,我选择 Debian GNU/Linux。
+
+在我传授当前针对上述大量需求的解决方案之前,我必须解释一下我的一般文件夹结构和文件命名约定,我也使用它来命名数码照片。但首先,你必须认清一个重要的事实:
+
+#### iPhoto、Picasa,诸如此类应被认为是有害的
+
+管理照片集的软件工具确实提供了相当酷的功能。它们提供了一个良好的用户界面,并试图为你提供满足各种需求的舒适的工作流程。
+
+对它们我确实遇到了很多大问题。它们几乎对所有东西都使用专有的存储格式:图像文件、元数据等等。当你打算在几年内换一个不同的软件,这是一个大问题。相信我:总有一天你会因为多种原因而**更换软件**。
+
+如果你现在正打算更换相应的工具,你会意识到 iPhoto 或 Picasa 是分别存储原始图像文件和你对它们所做的所有操作的(旋转图像、向图像文件添加描述/标签、裁剪等等)。如果你不能导出并重新导入到新工具,那么**所有的东西都将永远丢失**。而无损的进行转换和迁移几乎是不可能的。
+
+我不想在一个会锁住我工作的工具上投入任何精力。**我也拒绝把自己绑定在任何专有工具上**。我是一个过来人,希望你们吸取我的经验。
+
+这就是我在文件名中保留时间戳、图像描述或标记的原因。文件名是永久性的,除非我手动更改它们。当我把照片备份或复制到 U 盘或其他操作系统时,它们不会丢失。每个人都能读懂。任何未来的系统都能够处理它们。
+
+### 我的文件命名规范
+
+这里有一个我在 [2018 Linuxtage Graz 大会][44]上做的[演讲][45],其中详细阐述了我的在本文中提到的想法和工作流程。
+
+- [Grazer Linuxtage 2018 - The Advantages of File Name Conventions and Tagging](https://youtu.be/rckSVmYCH90)
+- [备份视频托管在 media.CCC.de](https://media.ccc.de/v/GLT18_-_321_-_en_-_g_ap147_004_-_201804281550_-_the_advantages_of_file_name_conventions_and_tagging_-_karl_voit)
+
+我所有的文件都与一个特定的日期或时间有关,根据所采用的 [ISO 8601][7] 规范,我采用的是**日期戳**或**时间戳**
+
+带有日期戳和两个标签的示例文件名:`2014-05-09 Budget export for project 42 -- finance company.csv`。
+
+带有时间戳(甚至包括可选秒)和两个标签的示例文件名:`2014-05-09T22.19.58 Susan presenting her new shoes -- family clothing.jpg`。
+
+由于我使用的 ISO 时间戳冒号不适用于 Windows [NTFS 文件系统][8],因此,我用点代替冒号,以便将小时与分钟(以及可选的秒)区别开来。
+
+如果是**持续的一段日期或时间**,我会将两个日期戳或时间戳用两个减号分开:`2014-05-09--2014-05-13 Jazz festival Graz -- folder tourism music.pdf`。
+
+文件名中的时间/日期戳的优点是,除非我手动更改它们,否则它们保持不变。当通过某些不处理这些元数据的软件进行处理时,包含在文件内容本身中的元数据(如 [Exif][9])往往会丢失。此外,使用这样的日期/时间戳开始的文件名可以确保文件按时间顺序显示,而不是按字母顺序显示。字母表是一种[完全人工的排序顺序][10],对于用户定位文件通常不太实用。
+
+当我想将**标签**关联到文件名时,我将它们放在原始文件名和[文件名扩展名][11]之间,中间用空格、两个减号和两端额外的空格分隔 ` -- `。我的标签是小写的英文单词,不包含空格或特殊字符。有时,我可能会使用 `quantifiedself` 或 `usergenerated` 这样的连接词。我[倾向于选择一般类别][12],而不是太过具体的描述标签。我在 Twitter [hashtags][13]、文件名、文件夹名、书签、诸如此类的博文等诸如此类地地方重用这些标签。
+
+标签作为文件名的一部分有几个优点。通过使用常用的桌面搜索引擎,你可以在标签的帮助下定位文件。文件名称中的标签不会因为复制到不同的存储介质上而丢失。当系统使用与文件名之外的存储位置(如:元数据数据库、[点文件][14]、[备用数据流][15]等)存储元信息通常会发生丢失。
+
+当然,通常在文件和文件夹名称中,**请避免使用特殊字符**、变音符、冒号等。尤其是在不同操作系统平台之间同步文件时。
+
+我的**文件夹名命名约定**与文件的相应规范相同。
+
+注意:由于 [Memacs][17] 的 [filenametimestamp][16] 模块的聪明之处,所有带有日期/时间戳的文件和文件夹都出现在我的 Org 模式的日历(日程)上的同一天/同一时间。这样,我就能很好地了解当天发生了什么,包括我拍的所有照片。
+
+### 我的一般文件夹结构
+
+在本节中,我将描述我的主文件夹中最重要的文件夹。注意:这可能在将来的被移动到一个独立的页面。或许不是。让我们等着瞧 :-) (LCTT 译注:后来这一节已被作者扩展并移动到另外一篇[文章](https://karl-voit.at/folder-hierarchy/)。)
+
+很多东西只有在一定的时间内才会引起人们的兴趣。这些内容包括快速浏览其内容的下载、解压缩文件以检查包含的文件、一些有趣的小内容等等。对于**临时的东西**,我有 `$HOME/tmp/` 子层次结构。新照片放在 `$HOME/tmp/digicam/` 中。我从 CD、DVD 或 USB 记忆棒临时复制的东西放在 `$HOME/tmp/fromcd/` 中。每当软件工具需要用户文件夹层次结构中的临时数据时,我就使用 `$HOME/tmp/Tools/`作为起点。我经常使用的文件夹是 `$HOME/tmp/2del/`:`2del` 的意思是“随时可以删除”。例如,我所有的浏览器都使用这个文件夹作为默认的下载文件夹。如果我需要在机器上腾出空间,我首先查看这个 `2del` 文件夹,用于删除内容。
+
+与上面描述的临时文件相比,我当然也想将文件**保存更长的时间**。这些文件被移动到我的 `$HOME/archive/` 子层次结构中。它有几个子文件夹用于备份、我想保留的 web 下载类、我要存档的二进制文件、可移动媒体(CD、DVD、记忆棒、外部硬盘驱动器)的索引文件,和一个稍后(寻找一个合适的的目标文件夹)存档的文件夹。有时,我太忙或没有耐心的时候将文件妥善整理。是的,那就是我,我甚至有一个名为“现在不要烦我”的文件夹。这对你而言是否很怪?:-)
+
+我的归档中最重要的子层次结构是 `$HOME/archive/events_memories/` 及其子文件夹 `2014/`、`2013/`、`2012/` 等等。正如你可能已经猜到的,每个年份有一个**子文件夹**。其中每个文件中都有单个文件和文件夹。这些文件是根据我在前一节中描述的文件名约定命名的。文件夹名称以 [ISO 8601][7] 日期标签 “YYYY-MM-DD” 开头,后面跟着一个具有描述性的名称,如 `$HOME/archive/events_memories/2014/2014-05-08 Business marathon with/`。在这些与日期相关的文件夹中,我保存着各种与特定事件相关的文件:照片、(扫描的)pdf 文件、文本文件等等。
+
+对于**共享数据**,我设置一个 `$HOME/share/` 子层次结构。这是我的 Dropbox 文件夹,我用各种各样的方法(比如 [unison][18])来分享数据。我也在我的设备之间共享数据:家里的 Mac Mini、家里的 GNU/Linux 笔记本、Android 手机,root-server(我的个人云),工作用的 Windows 笔记本。我不想在这里详细说明我的同步设置。如果你想了解相关的设置,可以参考另一篇相关的文章。:-)
+
+在我的 `$HOME/templates_tags/` 子层次结构中,我保存了各种**模板文件**([LaTeX][19]、脚本、…),插图和**徽标**,等等。
+
+我的 **Org 模式** 文件,主要是保存在 `$HOME/org/`。我练习记忆力,不会解释我有多喜欢 [Emacs/Org 模式][20] 以及我从中获益多少。你可能读过或听过我详细描述我用它做的很棒的事情。具体可以在我的博客上查找 [我的 Emacs 标签][21],在 Twitter 上查找 [hashtag #orgmode][22]。
+
+以上就是我最重要的文件夹子层次结构设置方式。
+
+### 我的工作流程
+
+哒哒哒,在你了解了我的文件夹结构和文件名约定之后,下面是我当前的工作流程和工具,我使用它们来满足我前面描述的需求。
+
+请注意,**你必须知道你在做什么**。我这里的示例及文件夹路径和更多**只适用我的机器或我的环境**。**你必须采用相应的**路径、文件名等来满足你的需求!
+
+#### 工作流程:将文件从 SD 卡移动到笔记本电脑、旋转人像图像,并重命名文件
+
+当我想把数据从我的数码相机移到我的 GNU/Linux 笔记本上时,我拿出它的 mini SD 存储卡,把它放在我的笔记本上。然后它会自动挂载在 `/media/digicam` 上。
+
+然后,调用 [getdigicamdata][23]。它做了如下几件事:它将文件从 SD 卡移动到一个临时文件夹中进行处理。原始文件名会转换为小写字符。所有的人像照片会使用 [jhead][24] 旋转。同样使用 jhead,我从 Exif 头的时间戳中生成文件名称中的时间戳。使用 [date2name][25],我也将时间戳添加到电影文件中。处理完所有这些文件后,它们将被移动到新的数码相机文件的目标文件夹: `$HOME/tmp/digicam/tmp/`。
+
+#### 工作流程:文件夹索引、查看、重命名、删除图像文件
+
+为了快速浏览我的图像和电影文件,我喜欢使用 GNU/Linux 上的 [geeqie][26]。这是一个相当轻量级的图像浏览器,它具有其他文件浏览器所缺少的一大优势:我可以添加通过键盘快捷方式调用的外部脚本/工具。通过这种方式,我可以通过任意外部命令扩展这个图像浏览器的特性。
+
+基本的图像管理功能是内置在 geeqie:浏览我的文件夹层次结构、以窗口模式或全屏查看图像(快捷键 `f`)、重命名文件名、删除文件、显示 Exif 元数据(快捷键 `Ctrl-e`)。
+
+在 OS X 上,我使用 [Xee][27]。与 geeqie 不同,它不能通过外部命令进行扩展。不过,基本的浏览、查看和重命名功能也是可用的。
+
+#### 工作流程:添加和删除标签
+
+我创建了一个名为 [filetags][28] 的 Python 脚本,用于向单个文件以及一组文件添加和删除标记。
+
+对于数码照片,我使用标签,例如,`specialL` 用于我认为适合桌面背景的风景图片,`specialP` 用于我想展示给其他人的人像照片,`sel` 用于筛选,等等。
+
+##### 使用 geeqie 初始设置 filetags
+
+向 geeqie 添加 `filetags` 是一个手动步骤:“Edit > Preferences > Configure Editors ...”,然后创建一个附加条目 `New`。在这里,你可以定义一个新的桌面文件,如下所示:
+
+```
+[Desktop Entry]
+Name=filetags
+GenericName=filetags
+Comment=
+Exec=/home/vk/src/misc/vk-filetags-interactive-adding-wrapper-with-gnome-terminal.sh %F
+Icon=
+Terminal=true
+Type=Application
+Categories=Application;Graphics;
+hidden=false
+MimeType=image/*;video/*;image/mpo;image/thm
+Categories=X-Geeqie;
+```
+
+*add-tags.desktop*
+
+封装脚本 `vk-filetags-interactive-adding-wrapper-with-gnome-terminal.sh` 是必须的,因为我想要弹出一个新的终端,以便添加标签到我的文件:
+
+```
+#!/bin/sh
+
+/usr/bin/gnome-terminal \
+ --geometry=85x15+330+5 \
+ --tab-with-profile=big \
+ --hide-menubar \
+ -x /home/vk/src/filetags/filetags.py --interactive "${@}"
+
+#end
+```
+
+*vk-filetags-interactive-adding-wrapper-with-gnome-terminal.sh*
+
+在 geeqie 中,你可以在 “Edit > Preferences > Preferences ... > Keyboard”。我将 `t` 与 `filetags` 命令相关联。
+
+这个 `filetags` 脚本还能够从单个文件或一组文件中删除标记。它基本上使用与上面相同的方法。唯一的区别是 `filetags` 脚本额外的 `--remove` 参数:
+
+```
+[Desktop Entry]
+Name=filetags-remove
+GenericName=filetags-remove
+Comment=
+Exec=/home/vk/src/misc/vk-filetags-interactive-removing-wrapper-with-gnome-terminal.sh %F
+Icon=
+Terminal=true
+Type=Application
+Categories=Application;Graphics;
+hidden=false
+MimeType=image/*;video/*;image/mpo;image/thm
+Categories=X-Geeqie;
+```
+
+*remove-tags.desktop*
+
+```
+#!/bin/sh
+
+/usr/bin/gnome-terminal \
+ --geometry=85x15+330+5 \
+ --tab-with-profile=big \
+ --hide-menubar \
+ -x /home/vk/src/filetags/filetags.py --interactive --remove "${@}"
+
+#end
+```
+
+*vk-filetags-interactive-removing-wrapper-with-gnome-terminal.sh*
+
+为了删除标签,我创建了一个键盘快捷方式 `T`。
+
+##### 在 geeqie 中使用 filetags
+
+当我在 geeqie 文件浏览器中浏览图像文件时,我选择要标记的文件(一到多个)并按 `t`。然后,一个小窗口弹出,要求我提供一个或多个标签。用回车确认后,这些标签被添加到文件名中。
+
+删除标签也是一样:选择多个文件,按下 `T`,输入要删除的标签,然后按回车确认。就是这样。几乎没有[给文件添加或删除标签的更简单的方法了][29]。
+
+#### 工作流程:改进的使用 appendfilename 重命名文件
+
+##### 不使用 appendfilename
+
+重命名一组大型文件可能是一个冗长乏味的过程。对于 `2014-04-20T17.09.11_p1100386.jpg` 这样的原始文件名,在文件名中添加描述的过程相当烦人。你将按 `Ctrl-r` (重命名)在 geeqie 中打开文件重命名对话框。默认情况下,原始名称(没有文件扩展名的文件名称)被标记。因此,如果不希望删除/覆盖文件名(但要追加),则必须按下光标键 `→`。然后,光标放在基本名称和扩展名之间。输入你的描述(不要忘记以空格字符开始),并用回车进行确认。
+
+##### 在 geeqie 使中用 appendfilename
+
+使用 [appendfilename][30],我的过程得到了简化,可以获得将文本附加到文件名的最佳用户体验:当我在 geeqie 中按下 `a`(附加)时,会弹出一个对话框窗口,询问文本。在回车确认后,输入的文本将放置在时间戳和可选标记之间。
+
+例如,当我在 `2014-04-20T17.09.11_p1100386.jpg` 上按下 `a`,然后键入`Pick-nick in Graz` 时,文件名变为 `2014-04-20T17.09.11_p1100386 Pick-nick in Graz.jpg`。当我再次按下 `a` 并输入 `with Susan` 时,文件名变为 `2014-04-20T17.09.11_p1100386 Pick-nick in Graz with Susan.jpg`。当文件名添加标记时,附加的文本前将附加标记分隔符。
+
+这样,我就不必担心覆盖时间戳或标记。重命名的过程对我来说变得更加有趣!
+
+最好的部分是:当我想要将相同的文本添加到多个选定的文件中时,也可以使用 `appendfilename`。
+
+##### 在 geeqie 中初始设置 appendfilename
+
+添加一个额外的编辑器到 geeqie: “Edit > Preferences > Configure Editors ... > New”。然后输入桌面文件定义:
+
+```
+[Desktop Entry]
+Name=appendfilename
+GenericName=appendfilename
+Comment=
+Exec=/home/vk/src/misc/vk-appendfilename-interactive-wrapper-with-gnome-terminal.sh %F
+Icon=
+Terminal=true
+Type=Application
+Categories=Application;Graphics;
+hidden=false
+MimeType=image/*;video/*;image/mpo;image/thm
+Categories=X-Geeqie;
+```
+
+*appendfilename.desktop*
+
+同样,我也使用了一个封装脚本,它将为我打开一个新的终端:
+
+```
+#!/bin/sh
+
+/usr/bin/gnome-terminal \
+ --geometry=90x5+330+5 \
+ --tab-with-profile=big \
+ --hide-menubar \
+ -x /home/vk/src/appendfilename/appendfilename.py "${@}"
+
+#end
+```
+
+*vk-appendfilename-interactive-wrapper-with-gnome-terminal.sh*
+
+#### 工作流程:播放电影文件
+
+在 GNU/Linux 上,我使用 [mplayer][31] 回放视频文件。由于 geeqie 本身不播放电影文件,所以我必须创建一个设置,以便在 mplayer 中打开电影文件。
+
+##### 在 geeqie 中初始设置 mplayer
+
+我已经使用 [xdg-open][32] 将电影文件扩展名关联到 mplayer。因此,我只需要为 geeqie 创建一个通用的“open”命令,让它使用 `xdg-open` 打开任何文件及其关联的应用程序。
+
+在 geeqie 中,再次访问 “Edit > Preferences > Configure Editors ...” 添加“open”的条目:
+
+```
+[Desktop Entry]
+Name=open
+GenericName=open
+Comment=
+Exec=/usr/bin/xdg-open %F
+Icon=
+Terminal=true
+Type=Application
+hidden=false
+NOMimeType=*;
+MimeType=image/*;video/*
+Categories=X-Geeqie;
+```
+
+*open.desktop*
+
+当你也将快捷方式 `o` (见上文)与 geeqie 关联时,你就能够打开与其关联的应用程序的视频文件(和其他文件)。
+
+##### 使用 xdg-open 打开电影文件(和其他文件)
+
+在上面的设置过程之后,当你的 geeqie 光标位于文件上方时,你只需按下 `o` 即可。就是如此简洁。
+
+#### 工作流程:在外部图像编辑器中打开
+
+我不太希望能够在 GIMP 中快速编辑图像文件。因此,我添加了一个快捷方式 `g`,并将其与外部编辑器 “"GNU Image Manipulation Program" (GIMP)” 关联起来,geeqie 已经默认创建了该外部编辑器。
+
+这样,只需按下 `g` 就可以在 GIMP 中打开当前图像。
+
+#### 工作流程:移动到存档文件夹
+
+现在我已经在我的文件名中添加了注释,我想将单个文件移动到 `$HOME/archive/events_memories/2014/`,或者将一组文件移动到这个文件夹中的新文件夹中,如 `$HOME/archive/events_memories/2014/2014-05-08 business marathon after show - party`。
+
+通常的方法是选择一个或多个文件,并用快捷方式 `Ctrl-m` 将它们移动到文件夹中。
+
+何等繁复无趣之至!
+
+因此,我(再次)编写了一个 Python 脚本,它为我完成了这项工作:[move2archive][33](简写为:` m2a `),需要一个或多个文件作为命令行参数。然后,出现一个对话框,我可以在其中输入一个可选文件夹名。当我不输入任何东西而是按回车,文件被移动到相应年份的文件夹。当我输入一个类似 `Business-Marathon After-Show-Party` 的文件夹名称时,第一个图像文件的日期戳被附加到该文件夹(`$HOME/archive/events_memories/2014/2014-05-08 Business-Marathon After-Show-Party`),然后创建该文件夹,并移动文件。
+
+再一次,我在 geeqie 中选择一个或多个文件,按 `m`(移动),或者只按回车(没有特殊的子文件夹),或者输入一个描述性文本,这是要创建的子文件夹的名称(可选不带日期戳)。
+
+**没有一个图像管理工具像我的带有 appendfilename 和 move2archive 的 geeqie 一样可以通过快捷键快速且有趣的完成工作。**
+
+##### 在 geeqie 里初始化 m2a 的相关设置
+
+同样,向 geeqie 添加 `m2a` 是一个手动步骤:“Edit > Preferences > Configure Editors ...”,然后创建一个附加条目“New”。在这里,你可以定义一个新的桌面文件,如下所示:
+
+```
+[Desktop Entry]
+Name=move2archive
+GenericName=move2archive
+Comment=Moving one or more files to my archive folder
+Exec=/home/vk/src/misc/vk-m2a-interactive-wrapper-with-gnome-terminal.sh %F
+Icon=
+Terminal=true
+Type=Application
+Categories=Application;Graphics;
+hidden=false
+MimeType=image/*;video/*;image/mpo;image/thm
+Categories=X-Geeqie;
+```
+
+*m2a.desktop*
+
+封装脚本 `vk-m2a-interactive-wrapper-with-gnome-terminal.sh` 是必要的,因为我想要弹出一个新的终端窗口,以便我的文件进入我指定的目标文件夹:
+
+```
+#!/bin/sh
+
+/usr/bin/gnome-terminal \
+ --geometry=157x56+330+5 \
+ --tab-with-profile=big \
+ --hide-menubar \
+ -x /home/vk/src/m2a/m2a.py --pauseonexit "${@}"
+
+#end
+```
+
+*vk-m2a-interactive-wrapper-with-gnome-terminal.sh*
+
+在 geeqie 中,你可以在 “Edit > Preferences > Preferences ... > Keyboard” 将 `m` 与 `m2a` 命令相关联。
+
+#### 工作流程:旋转图像(无损)
+
+通常,我的数码相机会自动将人像照片标记为人像照片。然而,在某些特定的情况下(比如从装饰图案上方拍照),我的相机会出错。在那些**罕见的情况下**,我必须手动修正方向。
+
+你必须知道,JPEG 文件格式是一种有损格式,应该只用于照片,而不是计算机生成的东西,如屏幕截图或图表。以傻瓜方式旋转 JPEG 图像文件通常会解压/可视化图像文件、旋转生成新的图像,然后重新编码结果。这将导致生成的图像[比原始图像质量差得多][5]。
+
+因此,你应该使用无损方法来旋转 JPEG 图像文件。
+
+再一次,我添加了一个“外部编辑器”到 geeqie:“Edit > Preferences > Configure Editors ... > New”。在这里,我添加了两个条目:使用 [exiftran][34],一个用于旋转 270 度(即逆时针旋转 90 度),另一个用于旋转 90 度(顺时针旋转 90 度):
+
+```
+[Desktop Entry]
+Version=1.0
+Type=Application
+Name=Losslessly rotate JPEG image counterclockwise
+
+# call the helper script
+TryExec=exiftran
+Exec=exiftran -p -2 -i -g %f
+
+# Desktop files that are usable only in Geeqie should be marked like this:
+Categories=X-Geeqie;
+OnlyShowIn=X-Geeqie;
+
+# Show in menu "Edit/Orientation"
+X-Geeqie-Menu-Path=EditMenu/OrientationMenu
+
+MimeType=image/jpeg;
+```
+
+*rotate-270.desktop*
+
+```
+[Desktop Entry]
+Version=1.0
+Type=Application
+Name=Losslessly rotate JPEG image clockwise
+
+# call the helper script
+TryExec=exiftran
+Exec=exiftran -p -9 -i -g %f
+
+# Desktop files that are usable only in Geeqie should be marked like this:
+Categories=X-Geeqie;
+OnlyShowIn=X-Geeqie;
+
+# Show in menu "Edit/Orientation"
+X-Geeqie-Menu-Path=EditMenu/OrientationMenu
+
+# It can be made verbose
+# X-Geeqie-Verbose=true
+
+MimeType=image/jpeg;
+```
+
+*rotate-90.desktop*
+
+我创建了 geeqie 快捷键 `[`(逆时针方向)和 `]`(顺时针方向)。
+
+#### 工作流程:可视化 GPS 坐标
+
+我的数码相机有一个 GPS 传感器,它在 JPEG 文件的 Exif 元数据中存储当前的地理位置。位置数据以 [WGS 84][35] 格式存储,如 `47, 58, 26.73; 16, 23, 55.51`(纬度;经度)。这一方式可读性较差,我期望:要么是地图,要么是位置名称。因此,我向 geeqie 添加了一些功能,这样我就可以在 [OpenStreetMap][36] 上看到单个图像文件的位置: `Edit > Preferences > Configure Editors ... > New`。
+
+```
+[Desktop Entry]
+Name=vkphotolocation
+GenericName=vkphotolocation
+Comment=
+Exec=/home/vk/src/misc/vkphotolocation.sh %F
+Icon=
+Terminal=true
+Type=Application
+Categories=Application;Graphics;
+hidden=false
+MimeType=image/bmp;image/gif;image/jpeg;image/jpg;image/pjpeg;image/png;image/tiff;image/x-bmp;image/x-gray;image/x-icb;image/x-ico;image/x-png;image/x-portable-anymap;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/x-pcx;image/svg+xml;image/svg+xml-compressed;image/vnd.wap.wbmp;
+```
+
+*photolocation.desktop*
+
+这调用了我的名为 `vkphotolocation.sh` 的封装脚本,它使用 [ExifTool][37] 以 [Marble][38] 能够读取和可视化的适当格式提取该坐标:
+
+```
+#!/bin/sh
+
+IMAGEFILE="${1}"
+IMAGEFILEBASENAME=`basename ${IMAGEFILE}`
+
+COORDINATES=`exiftool -c %.6f "${IMAGEFILE}" | awk '/GPS Position/ { print $4 " " $6 }'`
+
+if [ "x${COORDINATES}" = "x" ]; then
+ zenity --info --title="${IMAGEFILEBASENAME}" --text="No GPS-location found in the image file."
+else
+ /usr/bin/marble --latlon "${COORDINATES}" --distance 0.5
+fi
+
+#end
+```
+
+*vkphotolocation.sh*
+
+映射到键盘快捷键 `G`,我可以快速地得到**单个图像文件的位置的地图定位**。
+
+当我想将多个 JPEG 图像文件的**位置可视化为路径**时,我使用 [GpsPrune][39]。我无法挖掘出 GpsPrune 将一组文件作为命令行参数的方法。正因为如此,我必须手动启动 GpsPrune,用 “File > Add photos”选择一组文件或一个文件夹。
+
+通过这种方式,我可以为每个 JPEG 位置在 OpenStreetMap 地图上获得一个点(如果配置为这样)。通过单击这样一个点,我可以得到相应图像的详细信息。
+
+如果你恰好在国外拍摄照片,可视化 GPS 位置对**在文件名中添加描述**大有帮助!
+
+#### 工作流程:根据 GPS 坐标过滤照片
+
+这并非我的工作流程。为了完整起见,我列出该工作流对应工具的特性。我想做的就是从一大堆图片中寻找那些在一定区域内(范围或点 + 距离)的照片。
+
+到目前为止,我只找到了 [DigiKam][40],它能够[根据矩形区域进行过滤][41]。如果你知道其他工具,请将其添加到下面的评论或给我写一封电子邮件。
+
+#### 工作流程:显示给定集合的子集
+
+如上面的需求所述,我希望能够对一个文件夹中的文件定义一个子集,以便将这个小集合呈现给其他人。
+
+工作流程非常简单:我向选择的文件添加一个标记(通过 `t`/`filetags`)。为此,我使用标记 `sel`,它是 “selection” 的缩写。在标记了一组文件之后,我可以按下 `s`,它与一个脚本相关联,该脚本只显示标记为 `sel` 的文件。
+
+当然,这也适用于任何标签或标签组合。因此,用同样的方法,你可以得到一个适当的概述,你的婚礼上的所有照片都标记着“教堂”和“戒指”。
+
+很棒的功能,不是吗?:-)
+
+##### 初始设置 filetags 以根据标签和 geeqie 过滤
+
+你必须定义一个额外的“外部编辑器”,“ Edit > Preferences > Configure Editors ... > New”:
+
+```
+[Desktop Entry]
+Name=filetag-filter
+GenericName=filetag-filter
+Comment=
+Exec=/home/vk/src/misc/vk-filetag-filter-wrapper-with-gnome-terminal.sh
+Icon=
+Terminal=true
+Type=Application
+Categories=Application;Graphics;
+hidden=false
+MimeType=image/*;video/*;image/mpo;image/thm
+Categories=X-Geeqie;
+```
+
+*filter-tags.desktop*
+
+再次调用我编写的封装脚本:
+
+```
+#!/bin/sh
+
+/usr/bin/gnome-terminal \
+ --geometry=85x15+330+5 \
+ --hide-menubar \
+ -x /home/vk/src/filetags/filetags.py --filter
+
+#end
+```
+
+*vk-filetag-filter-wrapper-with-gnome-terminal.sh*
+
+带有参数 `--filter` 的 `filetags` 基本上完成的是:用户被要求输入一个或多个标签。然后,当前文件夹中所有匹配的文件都使用[符号链接][42]链接到 `$HOME/.filetags_tagfilter/`。然后,启动了一个新的 geeqie 实例,显示链接的文件。
+
+在退出这个新的 geeqie 实例之后,你会看到进行选择的旧的 geeqie 实例。
+
+#### 用一个真实的案例来总结
+
+哇哦, 这是一篇很长的博客文章。你可能已经忘了之前的概述。总结一下我在(扩展了标准功能集的) geeqie 中可以做的事情,我有一个很酷的总结:
+
+快捷键 | 功能
+--- | ---
+`m` | 移到归档(m2a)
+`o` | 打开(针对非图像文件)
+`a` | 在文件名里添加字段
+`t` | 文件标签(添加)
+`T` | 文件标签(删除)
+`s` | 文件标签(排序)
+`g` | gimp
+`G` | 显示 GPS 信息
+`[` | 无损的逆时针旋转
+`]` | 无损的顺时针旋转
+`Ctrl-e` | EXIF 图像信息
+`f` | 全屏显示
+
+文件名(包括它的路径)的部分及我用来操作该部分的相应工具:
+
+```
+ /this/is/a/folder/2014-04-20T17.09 Picknick in Graz -- food graz.jpg
+ [ move2archive ] [ date2name ] [appendfilename] [ filetags ]
+```
+
+在实践中,我按照以下步骤将照片从相机保存到存档:我将 SD 存储卡放入计算机的 SD 读卡器中。然后我运行 [getdigicamdata.sh][23]。完成之后,我在 geeqie 中打开 `$HOME/tmp/digicam/tmp/`。我浏览了一下照片,把那些不成功的删除了。如果有一个图像的方向错误,我用 `[` 或 `]` 纠正它。
+
+在第二步中,我向我认为值得评论的文件添加描述 (`a`)。每当我想添加标签时,我也这样做:我快速地标记所有应该共享相同标签的文件(`Ctrl + 鼠标点击`),并使用 [filetags][28](`t`)进行标记。
+
+要合并来自给定事件的文件,我选中相应的文件,将它们移动到年度归档文件夹中的 `event-folder`,并通过在 [move2archive][33](`m`)中键入事件描述,其余的(非特殊的文件夹)无需声明事件描述由 `move2archive` (`m`)直接移动到年度归档中。
+
+结束我的工作流程,我删除了 SD 卡上的所有文件,把它从操作系统上弹出,然后把它放回我的数码相机里。
+
+以上。
+
+因为这种工作流程几乎不需要任何开销,所以评论、标记和归档照片不再是一项乏味的工作。
+
+### 最后
+
+所以,这是一个详细描述我关于照片和电影的工作流程的叙述。你可能已经发现了我可能感兴趣的其他东西。所以请不要犹豫,请使用下面的链接留下评论或电子邮件。
+
+我也希望得到反馈,如果我的工作流程适用于你。并且,如果你已经发布了你的工作流程或者找到了其他人工作流程的描述,也请留下评论!
+
+及时行乐,莫让错误的工具或低效的方法浪费了我们的人生!
+
+### 其他工具
+
+阅读关于[本文中关于 gThumb 的部分][43]。
+
+当你觉得你以上文中所叙述的符合你的需求时,请根据相关的建议来选择对应的工具。
+
+--------------------------------------------------------------------------------
+
+via: http://karl-voit.at/managing-digital-photographs/
+
+作者:[Karl Voit][a]
+译者:[qfzy1233](https://github.com/qfzy1233)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:http://karl-voit.at
+[1]:https://en.wikipedia.org/wiki/Jpeg
+[2]:http://en.wikipedia.org/wiki/Vendor_lock-in
+[3]:https://en.wikipedia.org/wiki/Raw_image_format
+[4]:http://www.gimp.org/
+[5]:http://petapixel.com/2012/08/14/why-you-should-always-rotate-original-jpeg-photos-losslessly/
+[6]:https://en.wikipedia.org/wiki/Gps
+[7]:https://en.wikipedia.org/wiki/Iso_date
+[8]:https://en.wikipedia.org/wiki/Ntfs
+[9]:https://en.wikipedia.org/wiki/Exif
+[10]:http://www.isisinform.com/reinventing-knowledge-the-medieval-controversy-of-alphabetical-order/
+[11]:https://en.wikipedia.org/wiki/File_name_extension
+[12]:http://karl-voit.at/tagstore/en/papers.shtml
+[13]:https://en.wikipedia.org/wiki/Hashtag
+[14]:https://en.wikipedia.org/wiki/Dot-file
+[15]:https://en.wikipedia.org/wiki/NTFS#Alternate_data_streams_.28ADS.29
+[16]:https://github.com/novoid/Memacs/blob/master/docs/memacs_filenametimestamps.org
+[17]:https://github.com/novoid/Memacs
+[18]:http://www.cis.upenn.edu/~bcpierce/unison/
+[19]:https://github.com/novoid/LaTeX-KOMA-template
+[20]:http://orgmode.org/
+[21]:http://karl-voit.at/tags/emacs
+[22]:https://twitter.com/search?q%3D%2523orgmode&src%3Dtypd
+[23]:https://github.com/novoid/getdigicamdata.sh
+[24]:http://www.sentex.net/%3Ccode%3Emwandel/jhead/
+[25]:https://github.com/novoid/date2name
+[26]:http://geeqie.sourceforge.net/
+[27]:http://xee.c3.cx/
+[28]:https://github.com/novoid/filetag
+[29]:http://karl-voit.at/tagstore/
+[30]:https://github.com/novoid/appendfilename
+[31]:http://www.mplayerhq.hu
+[32]:https://wiki.archlinux.org/index.php/xdg-open
+[33]:https://github.com/novoid/move2archive
+[34]:http://manpages.ubuntu.com/manpages/raring/man1/exiftran.1.html
+[35]:https://en.wikipedia.org/wiki/WGS84#A_new_World_Geodetic_System:_WGS_84
+[36]:http://www.openstreetmap.org/
+[37]:http://www.sno.phy.queensu.ca/~phil/exiftool/
+[38]:http://userbase.kde.org/Marble/Tracking
+[39]:http://activityworkshop.net/software/gpsprune/
+[40]:https://en.wikipedia.org/wiki/DigiKam
+[41]:https://docs.kde.org/development/en/extragear-graphics/digikam/using-kapp.html#idp7659904
+[42]:https://en.wikipedia.org/wiki/Symbolic_link
+[43]:http://karl-voit.at/2017/02/19/gthumb
+[44]:https://glt18.linuxtage.at
+[45]:https://glt18-programm.linuxtage.at/events/321.html
diff --git a/published/201910/20180706 Building a Messenger App- OAuth.md b/published/201910/20180706 Building a Messenger App- OAuth.md
new file mode 100644
index 0000000000..62b85717d5
--- /dev/null
+++ b/published/201910/20180706 Building a Messenger App- OAuth.md
@@ -0,0 +1,444 @@
+[#]: collector: (lujun9972)
+[#]: translator: (PsiACE)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11510-1.html)
+[#]: subject: (Building a Messenger App: OAuth)
+[#]: via: (https://nicolasparada.netlify.com/posts/go-messenger-oauth/)
+[#]: author: (Nicolás Parada https://nicolasparada.netlify.com/)
+
+构建一个即时消息应用(二):OAuth
+======
+
+[上一篇:模式](https://linux.cn/article-11396-1.html)。
+
+在这篇帖子中,我们将会通过为应用添加社交登录功能进入后端开发。
+
+社交登录的工作方式十分简单:用户点击链接,然后重定向到 GitHub 授权页面。当用户授予我们对他的个人信息的访问权限之后,就会重定向回登录页面。下一次尝试登录时,系统将不会再次请求授权,也就是说,我们的应用已经记住了这个用户。这使得整个登录流程看起来就和你用鼠标单击一样快。
+
+如果进一步考虑其内部实现的话,过程就会变得复杂起来。首先,我们需要注册一个新的 [GitHub OAuth 应用][2]。
+
+这一步中,比较重要的是回调 URL。我们将它设置为 `http://localhost:3000/api/oauth/github/callback`。这是因为,在开发过程中,我们总是在本地主机上工作。一旦你要将应用交付生产,请使用正确的回调 URL 注册一个新的应用。
+
+注册以后,你将会收到“客户端 id”和“安全密钥”。安全起见,请不要与任何人分享他们 👀
+
+顺便让我们开始写一些代码吧。现在,创建一个 `main.go` 文件:
+
+```
+package main
+
+import (
+ "database/sql"
+ "fmt"
+ "log"
+ "net/http"
+ "net/url"
+ "os"
+ "strconv"
+
+ "github.com/gorilla/securecookie"
+ "github.com/joho/godotenv"
+ "github.com/knq/jwt"
+ _ "github.com/lib/pq"
+ "github.com/matryer/way"
+ "golang.org/x/oauth2"
+ "golang.org/x/oauth2/github"
+)
+
+var origin *url.URL
+var db *sql.DB
+var githubOAuthConfig *oauth2.Config
+var cookieSigner *securecookie.SecureCookie
+var jwtSigner jwt.Signer
+
+func main() {
+ godotenv.Load()
+
+ port := intEnv("PORT", 3000)
+ originString := env("ORIGIN", fmt.Sprintf("http://localhost:%d/", port))
+ databaseURL := env("DATABASE_URL", "postgresql://root@127.0.0.1:26257/messenger?sslmode=disable")
+ githubClientID := os.Getenv("GITHUB_CLIENT_ID")
+ githubClientSecret := os.Getenv("GITHUB_CLIENT_SECRET")
+ hashKey := env("HASH_KEY", "secret")
+ jwtKey := env("JWT_KEY", "secret")
+
+ var err error
+ if origin, err = url.Parse(originString); err != nil || !origin.IsAbs() {
+ log.Fatal("invalid origin")
+ return
+ }
+
+ if i, err := strconv.Atoi(origin.Port()); err == nil {
+ port = i
+ }
+
+ if githubClientID == "" || githubClientSecret == "" {
+ log.Fatalf("remember to set both $GITHUB_CLIENT_ID and $GITHUB_CLIENT_SECRET")
+ return
+ }
+
+ if db, err = sql.Open("postgres", databaseURL); err != nil {
+ log.Fatalf("could not open database connection: %v\n", err)
+ return
+ }
+ defer db.Close()
+ if err = db.Ping(); err != nil {
+ log.Fatalf("could not ping to db: %v\n", err)
+ return
+ }
+
+ githubRedirectURL := *origin
+ githubRedirectURL.Path = "/api/oauth/github/callback"
+ githubOAuthConfig = &oauth2.Config{
+ ClientID: githubClientID,
+ ClientSecret: githubClientSecret,
+ Endpoint: github.Endpoint,
+ RedirectURL: githubRedirectURL.String(),
+ Scopes: []string{"read:user"},
+ }
+
+ cookieSigner = securecookie.New([]byte(hashKey), nil).MaxAge(0)
+
+ jwtSigner, err = jwt.HS256.New([]byte(jwtKey))
+ if err != nil {
+ log.Fatalf("could not create JWT signer: %v\n", err)
+ return
+ }
+
+ router := way.NewRouter()
+ router.HandleFunc("GET", "/api/oauth/github", githubOAuthStart)
+ router.HandleFunc("GET", "/api/oauth/github/callback", githubOAuthCallback)
+ router.HandleFunc("GET", "/api/auth_user", guard(getAuthUser))
+
+ log.Printf("accepting connections on port %d\n", port)
+ log.Printf("starting server at %s\n", origin.String())
+ addr := fmt.Sprintf(":%d", port)
+ if err = http.ListenAndServe(addr, router); err != nil {
+ log.Fatalf("could not start server: %v\n", err)
+ }
+}
+
+func env(key, fallbackValue string) string {
+ v, ok := os.LookupEnv(key)
+ if !ok {
+ return fallbackValue
+ }
+ return v
+}
+
+func intEnv(key string, fallbackValue int) int {
+ v, ok := os.LookupEnv(key)
+ if !ok {
+ return fallbackValue
+ }
+ i, err := strconv.Atoi(v)
+ if err != nil {
+ return fallbackValue
+ }
+ return i
+}
+```
+
+安装依赖项:
+
+```
+go get -u github.com/gorilla/securecookie
+go get -u github.com/joho/godotenv
+go get -u github.com/knq/jwt
+go get -u github.com/lib/pq
+ge get -u github.com/matoous/go-nanoid
+go get -u github.com/matryer/way
+go get -u golang.org/x/oauth2
+```
+
+我们将会使用 `.env` 文件来保存密钥和其他配置。请创建这个文件,并保证里面至少包含以下内容:
+
+```
+GITHUB_CLIENT_ID=your_github_client_id
+GITHUB_CLIENT_SECRET=your_github_client_secret
+```
+
+我们还要用到的其他环境变量有:
+
+ * `PORT`:服务器运行的端口,默认值是 `3000`。
+ * `ORIGIN`:你的域名,默认值是 `http://localhost:3000/`。我们也可以在这里指定端口。
+ * `DATABASE_URL`:Cockroach 数据库的地址。默认值是 `postgresql://root@127.0.0.1:26257/messenger?sslmode=disable`。
+ * `HASH_KEY`:用于为 cookie 签名的密钥。没错,我们会使用已签名的 cookie 来确保安全。
+ * `JWT_KEY`:用于签署 JSON 网络令牌的密钥。
+
+因为代码中已经设定了默认值,所以你也不用把它们写到 `.env` 文件中。
+
+在读取配置并连接到数据库之后,我们会创建一个 OAuth 配置。我们会使用 `ORIGIN` 信息来构建回调 URL(就和我们在 GitHub 页面上注册的一样)。我们的数据范围设置为 “read:user”。这会允许我们读取公开的用户信息,这里我们只需要他的用户名和头像就够了。然后我们会初始化 cookie 和 JWT 签名器。定义一些端点并启动服务器。
+
+在实现 HTTP 处理程序之前,让我们编写一些函数来发送 HTTP 响应。
+
+```
+func respond(w http.ResponseWriter, v interface{}, statusCode int) {
+ b, err := json.Marshal(v)
+ if err != nil {
+ respondError(w, fmt.Errorf("could not marshal response: %v", err))
+ return
+ }
+ w.Header().Set("Content-Type", "application/json; charset=utf-8")
+ w.WriteHeader(statusCode)
+ w.Write(b)
+}
+
+func respondError(w http.ResponseWriter, err error) {
+ log.Println(err)
+ http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
+}
+```
+
+第一个函数用来发送 JSON,而第二个将错误记录到控制台并返回一个 `500 Internal Server Error` 错误信息。
+
+### OAuth 开始
+
+所以,用户点击写着 “Access with GitHub” 的链接。该链接指向 `/api/oauth/github`,这将会把用户重定向到 github。
+
+```
+func githubOAuthStart(w http.ResponseWriter, r *http.Request) {
+ state, err := gonanoid.Nanoid()
+ if err != nil {
+ respondError(w, fmt.Errorf("could not generte state: %v", err))
+ return
+ }
+
+ stateCookieValue, err := cookieSigner.Encode("state", state)
+ if err != nil {
+ respondError(w, fmt.Errorf("could not encode state cookie: %v", err))
+ return
+ }
+
+ http.SetCookie(w, &http.Cookie{
+ Name: "state",
+ Value: stateCookieValue,
+ Path: "/api/oauth/github",
+ HttpOnly: true,
+ })
+ http.Redirect(w, r, githubOAuthConfig.AuthCodeURL(state), http.StatusTemporaryRedirect)
+}
+```
+
+OAuth2 使用一种机制来防止 CSRF 攻击,因此它需要一个“状态”(`state`)。我们使用 `Nanoid()` 来创建一个随机字符串,并用这个字符串作为状态。我们也把它保存为一个 cookie。
+
+### OAuth 回调
+
+一旦用户授权我们访问他的个人信息,他将会被重定向到这个端点。这个 URL 的查询字符串上将会包含状态(`state`)和授权码(`code`): `/api/oauth/github/callback?state=&code=`。
+
+```
+const jwtLifetime = time.Hour * 24 * 14
+
+type GithubUser struct {
+ ID int `json:"id"`
+ Login string `json:"login"`
+ AvatarURL *string `json:"avatar_url,omitempty"`
+}
+
+type User struct {
+ ID string `json:"id"`
+ Username string `json:"username"`
+ AvatarURL *string `json:"avatarUrl"`
+}
+
+func githubOAuthCallback(w http.ResponseWriter, r *http.Request) {
+ stateCookie, err := r.Cookie("state")
+ if err != nil {
+ http.Error(w, http.StatusText(http.StatusTeapot), http.StatusTeapot)
+ return
+ }
+
+ http.SetCookie(w, &http.Cookie{
+ Name: "state",
+ Value: "",
+ MaxAge: -1,
+ HttpOnly: true,
+ })
+
+ var state string
+ if err = cookieSigner.Decode("state", stateCookie.Value, &state); err != nil {
+ http.Error(w, http.StatusText(http.StatusTeapot), http.StatusTeapot)
+ return
+ }
+
+ q := r.URL.Query()
+
+ if state != q.Get("state") {
+ http.Error(w, http.StatusText(http.StatusTeapot), http.StatusTeapot)
+ return
+ }
+
+ ctx := r.Context()
+
+ t, err := githubOAuthConfig.Exchange(ctx, q.Get("code"))
+ if err != nil {
+ respondError(w, fmt.Errorf("could not fetch github token: %v", err))
+ return
+ }
+
+ client := githubOAuthConfig.Client(ctx, t)
+ resp, err := client.Get("https://api.github.com/user")
+ if err != nil {
+ respondError(w, fmt.Errorf("could not fetch github user: %v", err))
+ return
+ }
+
+ var githubUser GithubUser
+ if err = json.NewDecoder(resp.Body).Decode(&githubUser); err != nil {
+ respondError(w, fmt.Errorf("could not decode github user: %v", err))
+ return
+ }
+ defer resp.Body.Close()
+
+ tx, err := db.BeginTx(ctx, nil)
+ if err != nil {
+ respondError(w, fmt.Errorf("could not begin tx: %v", err))
+ return
+ }
+
+ var user User
+ if err = tx.QueryRowContext(ctx, `
+ SELECT id, username, avatar_url FROM users WHERE github_id = $1
+ `, githubUser.ID).Scan(&user.ID, &user.Username, &user.AvatarURL); err == sql.ErrNoRows {
+ if err = tx.QueryRowContext(ctx, `
+ INSERT INTO users (username, avatar_url, github_id) VALUES ($1, $2, $3)
+ RETURNING id
+ `, githubUser.Login, githubUser.AvatarURL, githubUser.ID).Scan(&user.ID); err != nil {
+ respondError(w, fmt.Errorf("could not insert user: %v", err))
+ return
+ }
+ user.Username = githubUser.Login
+ user.AvatarURL = githubUser.AvatarURL
+ } else if err != nil {
+ respondError(w, fmt.Errorf("could not query user by github ID: %v", err))
+ return
+ }
+
+ if err = tx.Commit(); err != nil {
+ respondError(w, fmt.Errorf("could not commit to finish github oauth: %v", err))
+ return
+ }
+
+ exp := time.Now().Add(jwtLifetime)
+ token, err := jwtSigner.Encode(jwt.Claims{
+ Subject: user.ID,
+ Expiration: json.Number(strconv.FormatInt(exp.Unix(), 10)),
+ })
+ if err != nil {
+ respondError(w, fmt.Errorf("could not create token: %v", err))
+ return
+ }
+
+ expiresAt, _ := exp.MarshalText()
+
+ data := make(url.Values)
+ data.Set("token", string(token))
+ data.Set("expires_at", string(expiresAt))
+
+ http.Redirect(w, r, "/callback?"+data.Encode(), http.StatusTemporaryRedirect)
+}
+```
+
+首先,我们会尝试使用之前保存的状态对 cookie 进行解码。并将其与查询字符串中的状态进行比较。如果它们不匹配,我们会返回一个 `418 I'm teapot`(未知来源)错误。
+
+接着,我们使用授权码生成一个令牌。这个令牌被用于创建 HTTP 客户端来向 GitHub API 发出请求。所以最终我们会向 `https://api.github.com/user` 发送一个 GET 请求。这个端点将会以 JSON 格式向我们提供当前经过身份验证的用户信息。我们将会解码这些内容,一并获取用户的 ID、登录名(用户名)和头像 URL。
+
+然后我们将会尝试在数据库上找到具有该 GitHub ID 的用户。如果没有找到,就使用该数据创建一个新的。
+
+之后,对于新创建的用户,我们会发出一个将用户 ID 作为主题(`Subject`)的 JSON 网络令牌,并使用该令牌重定向到前端,查询字符串中一并包含该令牌的到期日(`Expiration`)。
+
+这一 Web 应用也会被用在其他帖子,但是重定向的链接会是 `/callback?token=&expires_at=`。在那里,我们将会利用 JavaScript 从 URL 中获取令牌和到期日,并通过 `Authorization` 标头中的令牌以 `Bearer token_here` 的形式对 `/api/auth_user` 进行 GET 请求,来获取已认证的身份用户并将其保存到 localStorage。
+
+### Guard 中间件
+
+为了获取当前已经过身份验证的用户,我们设计了 Guard 中间件。这是因为在接下来的文章中,我们会有很多需要进行身份认证的端点,而中间件将会允许我们共享这一功能。
+
+```
+type ContextKey struct {
+ Name string
+}
+
+var keyAuthUserID = ContextKey{"auth_user_id"}
+
+func guard(handler http.HandlerFunc) http.HandlerFunc {
+ return func(w http.ResponseWriter, r *http.Request) {
+ var token string
+ if a := r.Header.Get("Authorization"); strings.HasPrefix(a, "Bearer ") {
+ token = a[7:]
+ } else if t := r.URL.Query().Get("token"); t != "" {
+ token = t
+ } else {
+ http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
+ return
+ }
+
+ var claims jwt.Claims
+ if err := jwtSigner.Decode([]byte(token), &claims); err != nil {
+ http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
+ return
+ }
+
+ ctx := r.Context()
+ ctx = context.WithValue(ctx, keyAuthUserID, claims.Subject)
+
+ handler(w, r.WithContext(ctx))
+ }
+}
+```
+
+首先,我们尝试从 `Authorization` 标头或者是 URL 查询字符串中的 `token` 字段中读取令牌。如果没有找到,我们需要返回 `401 Unauthorized`(未授权)错误。然后我们将会对令牌中的申明进行解码,并使用该主题作为当前已经过身份验证的用户 ID。
+
+现在,我们可以用这一中间件来封装任何需要授权的 `http.handlerFunc`,并且在处理函数的上下文中保有已经过身份验证的用户 ID。
+
+```
+var guarded = guard(func(w http.ResponseWriter, r *http.Request) {
+ authUserID := r.Context().Value(keyAuthUserID).(string)
+})
+```
+
+### 获取认证用户
+
+```
+func getAuthUser(w http.ResponseWriter, r *http.Request) {
+ ctx := r.Context()
+ authUserID := ctx.Value(keyAuthUserID).(string)
+
+ var user User
+ if err := db.QueryRowContext(ctx, `
+ SELECT username, avatar_url FROM users WHERE id = $1
+ `, authUserID).Scan(&user.Username, &user.AvatarURL); err == sql.ErrNoRows {
+ http.Error(w, http.StatusText(http.StatusTeapot), http.StatusTeapot)
+ return
+ } else if err != nil {
+ respondError(w, fmt.Errorf("could not query auth user: %v", err))
+ return
+ }
+
+ user.ID = authUserID
+
+ respond(w, user, http.StatusOK)
+}
+```
+
+我们使用 Guard 中间件来获取当前经过身份认证的用户 ID 并查询数据库。
+
+这一部分涵盖了后端的 OAuth 流程。在下一篇帖子中,我们将会看到如何开始与其他用户的对话。
+
+- [源代码][3]
+
+--------------------------------------------------------------------------------
+
+via: https://nicolasparada.netlify.com/posts/go-messenger-oauth/
+
+作者:[Nicolás Parada][a]
+选题:[lujun9972][b]
+译者:[PsiACE](https://github.com/PsiACE)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://nicolasparada.netlify.com/
+[b]: https://github.com/lujun9972
+[1]: https://nicolasparada.netlify.com/posts/go-messenger-schema/
+[2]: https://github.com/settings/applications/new
+[3]: https://github.com/nicolasparada/go-messenger-demo
diff --git a/published/201910/20180906 What a shell dotfile can do for you.md b/published/201910/20180906 What a shell dotfile can do for you.md
new file mode 100644
index 0000000000..d2f1a73c71
--- /dev/null
+++ b/published/201910/20180906 What a shell dotfile can do for you.md
@@ -0,0 +1,277 @@
+Shell 点文件可以为你做点什么
+======
+
+> 了解如何使用配置文件来改善你的工作环境。
+
+
+
+不要问你可以为你的 shell 点文件做什么,而是要问一个 shell 点文件可以为你做什么!
+
+我一直在操作系统领域里面打转,但是在过去的几年中,我的日常使用的一直是 Mac。很长一段时间,我都在使用 Bash,但是当几个朋友开始把 [zsh][1] 当成宗教信仰时,我也试试了它。我没用太长时间就喜欢上了它,几年后,我越发喜欢它做的许多小事情。
+
+我一直在使用 zsh(通过 [Homebrew][2] 提供,而不是由操作系统安装的)和 [Oh My Zsh 增强功能][3]。
+
+本文中的示例是我的个人 `.zshrc`。大多数都可以直接用在 Bash 中,我觉得不是每个人都依赖于 Oh My Zsh,但是如果不用的话你的工作量可能会有所不同。曾经有一段时间,我同时为 zsh 和 Bash 维护一个 shell 点文件,但是最终我还是放弃了我的 `.bashrc`。
+
+### 不偏执不行
+
+如果你希望在各个操作系统上使用相同的点文件,则需要让你的点文件聪明点。
+
+```
+### Mac 专用
+if [[ "$OSTYPE" == "darwin"* ]]; then
+ # Mac 专用内容在此
+```
+
+例如,我希望 `Alt + 箭头键` 将光标按单词移动而不是单个空格。为了在 [iTerm2][4](我的首选终端)中实现这一目标,我将此代码段添加到了 `.zshrc` 的 Mac 专用部分:
+
+```
+### Mac 专用
+if [[ "$OSTYPE" == "darwin"* ]]; then
+ ### Mac 用于 iTerm2 的光标命令;映射 ctrl+arrows 或 alt+arrows 来快速移动
+ bindkey -e
+ bindkey '^[[1;9C' forward-word
+ bindkey '^[[1;9D' backward-word
+ bindkey '\e\e[D' backward-word
+ bindkey '\e\e[C' forward-word
+fi
+```
+
+(LCTT 译注:标题 “We're all mad here” 是电影《爱丽丝梦游仙境》中,微笑猫对爱丽丝讲的一句话:“我们这儿全都是疯的”。)
+
+### 在家不工作
+
+虽然我开始喜欢我的 Shell 点文件了,但我并不总是想要家用计算机上的东西与工作的计算机上的东西一样。解决此问题的一种方法是让补充的点文件在家中使用,而不是在工作中使用。以下是我的实现方式:
+
+```
+if [[ `egrep 'dnssuffix1|dnssuffix2' /etc/resolv.conf` ]]; then
+ if [ -e $HOME/.work ]
+ source $HOME/.work
+ else
+ echo "This looks like a work machine, but I can't find the ~/.work file"
+ fi
+fi
+```
+
+在这种情况下,我根据我的工作 dns 后缀(或多个后缀,具体取决于你的情况)来提供(`source`)一个可以使我的工作环境更好的单独文件。
+
+(LCTT 译注:标题 “What about Bob?” 是 1991 年的美国电影《天才也疯狂》。)
+
+### 你该这么做
+
+现在可能是放弃使用波浪号(`~`)表示编写脚本时的主目录的好时机。你会发现在某些上下文中无法识别它。养成使用环境变量 `$HOME` 的习惯,这将为你节省大量的故障排除时间和以后的工作。
+
+如果你愿意,合乎逻辑的扩展是应该包括特定于操作系统的点文件。
+
+(LCTT 译注:标题 “That thing you do” 是 1996 年由汤姆·汉克斯执导的喜剧片《挡不住的奇迹》。)
+
+### 别指望记忆
+
+我写了那么多 shell 脚本,我真的再也不想写脚本了。并不是说 shell 脚本不能满足我大部分时间的需求,而是我发现写 shell 脚本,可能只是拼凑了一个胶带式解决方案,而不是永久地解决问题。
+
+同样,我讨厌记住事情,在我的整个职业生涯中,我经常不得不在一天之中就彻彻底底地改换环境。实际的结果是这些年来,我不得不一再重新学习很多东西。(“等等……这种语言使用哪种 for 循环结构?”)
+
+因此,每隔一段时间我就会觉得自己厌倦了再次寻找做某事的方法。我改善生活的一种方法是添加别名。
+
+对于任何一个使用操作系统的人来说,一个常见的情况是找出占用了所有磁盘的内容。不幸的是,我从来没有记住过这个咒语,所以我做了一个 shell 别名,创造性地叫做 `bigdirs`:
+
+```
+alias bigdirs='du --max-depth=1 2> /dev/null | sort -n -r | head -n20'
+```
+
+虽然我可能不那么懒惰,并实际记住了它,但是,那不太 Unix ……
+
+(LCTT 译注:标题 “Memory, all alone in the moonlight” 是一手英文老歌。)
+
+### 输错的人们
+
+使用 shell 别名改善我的生活的另一种方法是使我免于输入错误。我不知道为什么,但是我已经养成了这种讨厌的习惯,在序列 `ea` 之后输入 `w`,所以如果我想清除终端,我经常会输入 `cleawr`。不幸的是,这对我的 shell 没有任何意义。直到我添加了这个小东西:
+
+```
+alias cleawr='clear'
+```
+
+在 Windows 中有一个等效但更好的命令 `cls`,但我发现自己会在 Shell 也输入它。看到你的 shell 表示抗议真令人沮丧,因此我添加:
+
+```
+alias cls='clear'
+```
+
+是的,我知道 `ctrl + l`,但是我从不使用它。
+
+(LCTT 译注:标题 “Typos, and the people who love them” 可能来自某部电影。)
+
+### 要自娱自乐
+
+工作压力很大。有时你需要找点乐子。如果你的 shell 不知道它显然应该执行的命令,则可能你想直接让它耸耸肩!你可以使用以下功能执行此操作:
+
+```
+shrug() { echo "¯\_(ツ)_/¯"; }
+```
+
+如果还不行,也许你需要掀桌不干了:
+
+```
+fliptable() { echo "(╯°□°)╯ ┻━┻"; } # 掀桌,用法示例: fsck -y /dev/sdb1 || fliptable
+```
+
+想想看,当我想掀桌子时而我不记得我给它起了个什么名字,我会有多沮丧和失望,所以我添加了更多的 shell 别名:
+
+```
+alias flipdesk='fliptable'
+alias deskflip='fliptable'
+alias tableflip='fliptable'
+```
+
+而有时你需要庆祝一下:
+
+```
+disco() {
+ echo "(•_•)"
+ echo "<) )╯"
+ echo " / \ "
+ echo ""
+ echo "\(•_•)"
+ echo " ( (>"
+ echo " / \ "
+ echo ""
+ echo " (•_•)"
+ echo "<) )>"
+ echo " / \ "
+}
+```
+
+通常,我会将这些命令的输出通过管道传递到 `pbcopy`,并将其粘贴到我正在使用的相关聊天工具中。
+
+我从一个我关注的一个叫 “Command Line Magic” [@ climagic][5] 的 Twitter 帐户得到了下面这个有趣的函数。自从我现在住在佛罗里达州以来,我很高兴看到我这一生中唯一的一次下雪:
+
+```
+snow() {
+ clear;while :;do echo $LINES $COLUMNS $(($RANDOM%$COLUMNS));sleep 0.1;done|gawk '{a[$3]=0;for(x in a) {o=a[x];a[x]=a[x]+1;printf "\033[%s;%sH ",o,x;printf "\033[%s;%sH*\033[0;0H",a[x],x;}}'
+}
+```
+
+(LCTT 译注:标题 “Amuse yourself” 是 1936 年的美国电影《自娱自乐》)
+
+### 函数的乐趣
+
+我们已经看到了一些我使用的函数示例。由于这些示例中几乎不需要参数,因此可以将它们作为别名来完成。 当比一个短句更长时,我出于个人喜好使用函数。
+
+在我职业生涯的很多时期我都运行过 [Graphite][6],这是一个开源、可扩展的时间序列指标解决方案。 在很多的情况下,我需要将度量路径(用句点表示)转换到文件系统路径(用斜杠表示),反之亦然,拥有专用于这些任务的函数就变得很有用:
+
+```
+# 在 Graphite 指标和文件路径之间转换很有用
+function dottoslash() {
+ echo $1 | sed 's/\./\//g'
+}
+function slashtodot() {
+ echo $1 | sed 's/\//\./g'
+}
+```
+
+在我的另外一段职业生涯里,我运行了很多 Kubernetes。如果你对运行 Kubernetes 不熟悉,你需要编写很多 YAML。不幸的是,一不小心就会编写了无效的 YAML。更糟糕的是,Kubernetes 不会在尝试应用 YAML 之前对其进行验证,因此,除非你应用它,否则你不会发现它是无效的。除非你先进行验证:
+
+```
+function yamllint() {
+ for i in $(find . -name '*.yml' -o -name '*.yaml'); do echo $i; ruby -e "require 'yaml';YAML.load_file(\"$i\")"; done
+}
+```
+
+因为我厌倦了偶尔破坏客户的设置而让自己感到尴尬,所以我写了这个小片段并将其作为提交前挂钩添加到我所有相关的存储库中。在持续集成过程中,类似的内容将非常有帮助,尤其是在你作为团队成员的情况下。
+
+(LCTT 译注:哦抱歉,我不知道这个标题的出处。)
+
+### 手指不听话
+
+我曾经是一位出色的盲打打字员。但那些日子已经一去不回。我的打字错误超出了我的想象。
+
+在各种时期,我多次用过 Chef 或 Kubernetes。对我来说幸运的是,我从未同时使用过这两者。
+
+Chef 生态系统的一部分是 Test Kitchen,它是加快测试的一组工具,可通过命令 `kitchen test` 来调用。Kubernetes 使用 CLI 工具 `kubectl` 进行管理。这两个命令都需要几个子命令,并且这两者都不会特别顺畅地移动手指。
+
+我没有创建一堆“输错别名”,而是将这两个命令别名为 `k`:
+
+```
+alias k='kitchen test $@'
+```
+
+或
+
+```
+alias k='kubectl $@'
+```
+
+(LCTT 译注:标题 “Oh, fingers, where art thou?” 演绎自《O Brother, Where Art Thou?》,这是 2000 年美国的一部电影《逃狱三王》。)
+
+### 分裂与合并
+
+我职业生涯的后半截涉及与其他人一起编写更多代码。我曾在许多环境中工作过,在这些环境中,我们在帐户中复刻了存储库副本,并将拉取请求用作审核过程的一部分。当我想确保给定存储库的复刻与父版本保持最新时,我使用 `fetchupstream`:
+
+```
+alias fetchupstream='git fetch upstream && git checkout master && git merge upstream/master && git push'
+```
+
+(LCTT 译注:标题 “Timesplitters” 是一款视频游戏《时空分裂者》。)
+
+### 颜色之荣耀
+
+我喜欢颜色。它可以使 `diff` 之类的东西更易于使用。
+
+```
+alias diff='colordiff'
+```
+
+我觉得彩色的手册页是个巧妙的技巧,因此我合并了以下函数:
+
+```
+# 彩色化手册页,来自:
+# http://boredzo.org/blog/archives/2016-08-15/colorized-man-pages-understood-and-customized
+man() {
+ env \
+ LESS_TERMCAP_md=$(printf "\e[1;36m") \
+ LESS_TERMCAP_me=$(printf "\e[0m") \
+ LESS_TERMCAP_se=$(printf "\e[0m") \
+ LESS_TERMCAP_so=$(printf "\e[1;44;33m") \
+ LESS_TERMCAP_ue=$(printf "\e[0m") \
+ LESS_TERMCAP_us=$(printf "\e[1;32m") \
+ man "$@"
+}
+```
+
+我喜欢命令 `which`,但它只是告诉你正在运行的命令在文件系统中的位置,除非它是 Shell 函数才能告诉你更多。在多个级联的点文件之后,有时会不清楚函数的定义位置或作用。事实证明,`whence` 和 `type` 命令可以帮助解决这一问题。
+
+```
+# 函数定义在哪里?
+whichfunc() {
+ whence -v $1
+ type -a $1
+}
+```
+
+(LCTT 译注:标题“Mine eyes have seen the glory of the coming of color” 演绎自歌曲 《Mine Eyes Have Seen The Glory Of The Coming Of The Lord》)
+
+### 总结
+
+希望本文对你有所帮助,并能激发你找到改善日常使用 Shell 的方法。这些方法不必庞大、新颖或复杂。它们可能会解决一些微小但频繁的摩擦、创建捷径,甚至提供减少常见输入错误的解决方案。
+
+欢迎你浏览我的 [dotfiles 存储库][7],但我要警示你,这样做可能会花费很多时间。请随意使用你认为有帮助的任何东西,并互相取长补短。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/9/shell-dotfile
+
+作者:[H.Waldo Grunenwald][a]
+选题:[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/) 荣誉推出
+
+[a]: https://opensource.com/users/gwaldo
+[1]: http://www.zsh.org/
+[2]: https://brew.sh/
+[3]: https://github.com/robbyrussell/oh-my-zsh
+[4]: https://www.iterm2.com/
+[5]: https://twitter.com/climagic
+[6]: https://github.com/graphite-project/
+[7]: https://github.com/gwaldo/dotfiles
diff --git a/published/201910/20190214 The Earliest Linux Distros- Before Mainstream Distros Became So Popular.md b/published/201910/20190214 The Earliest Linux Distros- Before Mainstream Distros Became So Popular.md
new file mode 100644
index 0000000000..f28180e516
--- /dev/null
+++ b/published/201910/20190214 The Earliest Linux Distros- Before Mainstream Distros Became So Popular.md
@@ -0,0 +1,101 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11420-1.html)
+[#]: subject: (The Earliest Linux Distros: Before Mainstream Distros Became So Popular)
+[#]: via: (https://itsfoss.com/earliest-linux-distros/)
+[#]: author: (Avimanyu Bandyopadhyay https://itsfoss.com/author/avimanyu/)
+
+主流发行版之前的那些最早的 Linux 发行版
+======
+
+> 在这篇回溯历史的文章中,我们尝试回顾一些最早的 Linux 发行版是如何演变的,并形成我们今天所知道的发行版的。
+
+![][1]
+
+在这里,我们尝试探讨了第一个 Linux 内核问世后,诸如 Red Hat、Debian、Slackware、SUSE、Ubuntu 等诸多流行的发行版的想法是如何产生的。
+
+随着 1991 年 Linux 最初以内核的形式发布,今天我们所知道的发行版在世界各地众多合作者的帮助下得以创建 shell、库、编译器和相关软件包,从而使其成为一个完整的操作系统。
+
+### 1、第一个已知的“发行版”是由 HJ Lu 创建的
+
+Linux 发行版这种方式可以追溯到 1992 年,当时可以用来访问 Linux 的第一个已知的类似发行版的工具是由 HJ Lu 发布的。它由两个 5.25 英寸软盘组成:
+
+![Linux 0.12 Boot and Root Disks | Photo Credit][2]
+
+* LINUX 0.12 BOOT DISK:“启动”磁盘用来先启动系统。
+* LINUX 0.12 ROOT DISK:第二个“根”磁盘,用于在启动后获取命令提示符以访问 Linux 文件系统。
+
+要在硬盘上安装 LINUX 0.12,必须使用十六进制编辑器来编辑其主启动记录(MBR),这是一个非常复杂的过程,尤其是在那个时代。
+
+> 感觉太怀旧了?
+>
+> 你可以[安装 cool-retro-term 应用程序][3],它可以为你提供 90 年代计算机的复古外观的 Linux 终端。
+
+### 2、MCC Interim Linux
+
+![MCC Linux 0.99.14, 1993 | Image Credit][4]
+
+MCC Interim Linux 最初由英格兰曼彻斯特计算中心的 Owen Le Blanc 与 “LINUX 0.12” 同年发布,它是针对普通用户的第一个 Linux 发行版,它具有菜单驱动的安装程序和最终用户/编程工具。它也是以软盘集的形式,可以将其安装在系统上以提供基于文本的基本环境。
+
+MCC Interim Linux 比 0.12 更加易于使用,并且在硬盘驱动器上的安装过程更加轻松和类似于现代方式。它不需要使用十六进制编辑器来编辑 MBR。
+
+尽管它于 1992 年 2 月首次发布,但自当年 11 月以来也可以通过 FTP 下载。
+
+### 3、TAMU Linux
+
+![TAMU Linux | Image Credit][5]
+
+TAMU Linux 由 Texas A&M 的 Aggies 与 Texas A&M Unix & Linux 用户组于 1992 年 5 月开发,被称为 TAMU 1.0A。它是第一个提供 X Window System 的 Linux 发行版,而不仅仅是基于文本的操作系统。
+
+### 4、Softlanding Linux System (SLS)
+
+![SLS Linux 1.05, 1994 | Image Credit][6]
+
+他们的口号是“DOS 伞降的温柔救援”!SLS 由 Peter McDonald 于 1992 年 5 月发布。SLS 在其时代得到了广泛的使用和流行,并极大地推广了 Linux 的思想。但是由于开发人员决定更改发行版中的可执行格式,因此用户停止使用它。
+
+当今社区最熟悉的许多流行发行版是通过 SLS 演变而成的。其中两个是:
+
+* Slackware:它是最早的 Linux 发行版之一,由 Patrick Volkerding 于 1993 年创建。Slackware 基于 SLS,是最早的 Linux 发行版之一。
+* Debian:由 Ian Murdock 发起,Debian 在从 SLS 模型继续发展之后于 1993 年发布。我们今天知道的非常流行的 Ubuntu 发行版基于 Debian。
+
+### 5、Yggdrasil
+
+![LGX Yggdrasil Fall 1993 | Image Credit][7]
+
+Yggdrasil 于 1992 年 12 月发行,是第一个产生 Live Linux CD 想法的发行版。它是由 Yggdrasil 计算公司开发的,该公司由位于加利福尼亚州伯克利的 Adam J. Richter 创立。它可以在系统硬件上自动配置自身,即“即插即用”功能,这是当今非常普遍且众所周知的功能。Yggdrasil 后来的版本包括一个用于在 Linux 中运行任何专有 MS-DOS CD-ROM 驱动程序的黑科技。
+
+![Yggdrasil’s Plug-and-Play Promo | Image Credit][8]
+
+他们的座右铭是“我们其余人的免费软件”。
+
+### 6、Mandriva
+
+在 90 年代后期,有一个非常受欢迎的发行版 [Mandriva][9],该发行版于 1998 年首次发行,是通过将法国的 Mandrake Linux 发行版与巴西的 Conectiva Linux 发行版统一起来形成的。它的发布寿命为 18 个月,会对 Linux 和系统软件进行更新,并且每年都会发布基于桌面的更新。它还有带有 5 年支持的服务器版本。现在是 [Open Mandriva][10]。
+
+如果你在 Linux 发行之初就用过更多的怀旧发行版,请在下面的评论中与我们分享。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/earliest-linux-distros/
+
+作者:[Avimanyu Bandyopadhyay][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/avimanyu/
+[b]: https://github.com/lujun9972
+[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/earliest-linux-distros.png?resize=800%2C450&ssl=1
+[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/Linux-0.12-Floppies.jpg?ssl=1
+[3]: https://itsfoss.com/cool-retro-term/
+[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/MCC-Interim-Linux-0.99.14-1993.jpg?fit=800%2C600&ssl=1
+[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/TAMU-Linux.jpg?ssl=1
+[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/SLS-1.05-1994.jpg?ssl=1
+[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/LGX_Yggdrasil_CD_Fall_1993.jpg?fit=781%2C800&ssl=1
+[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/Yggdrasil-Linux-Summer-1994.jpg?ssl=1
+[9]: https://en.wikipedia.org/wiki/Mandriva_Linux
+[10]: https://www.openmandriva.org/
diff --git a/published/201910/20190301 Guide to Install VMware Tools on Linux.md b/published/201910/20190301 Guide to Install VMware Tools on Linux.md
new file mode 100644
index 0000000000..e3d241592e
--- /dev/null
+++ b/published/201910/20190301 Guide to Install VMware Tools on Linux.md
@@ -0,0 +1,134 @@
+[#]: collector: (lujun9972)
+[#]: translator: (tomjlw)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11467-1.html)
+[#]: subject: (Guide to Install VMware Tools on Linux)
+[#]: via: (https://itsfoss.com/install-vmware-tools-linux)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+在 Linux 上安装 VMware 工具
+======
+
+> VMware 工具通过允许你共享剪贴板和文件夹以及其他东西来提升你的虚拟机体验。了解如何在 Ubuntu 和其它 Linux 发行版上安装 VMware 工具。
+
+![如何在 Linux 上安装 VMware 工具][4]
+
+在先前的教程中,你学习了[在 Ubuntu 上安装 VMware 工作站][1]。你还可以通过安装 VMware 工具进一步提升你的虚拟机功能。
+
+如果你已经在 VMware 上安装了一个访客机系统,你必须要注意 [VMware 工具][2]的要求 —— 尽管并不完全清楚到底有什么要求。
+
+在本文中,我们将要强调 VMware 工具的重要性、所提供的特性,以及在 Ubuntu 和其它 Linux 发行版上安装 VMware 工具的方法。
+
+### VMware 工具:概览及特性
+
+![在 Ubuntu 上安装 VMware 工具][3]
+
+出于显而易见的理由,虚拟机(你的访客机系统)并不能做到与宿主机上的表现完全一致。在其性能和操作上会有特定的限制。那就是为什么引入 VMware 工具的原因。
+
+VMware 工具以一种高效的形式在提升了其性能的同时,也可以帮助管理访客机系统。
+
+#### VMware 工具到底负责什么?
+
+你大致知道它可以做什么,但让我们探讨一下细节:
+
+* 同步访客机系统与宿主机系统间的时间以简化操作
+* 提供从宿主机系统向访客机系统传递消息的能力。比如说,你可以复制文字到剪贴板,并将它轻松粘贴到你的访客机系统
+* 在访客机系统上启用声音
+* 提升访客机视频分辨率
+* 修正错误的网络速度数据
+* 减少不合适的色深
+
+在访客机系统上安装了 VMware 工具会给它带来显著改变,但是它到底包含了什么特性才解锁或提升这些功能的呢?让我们来看看……
+
+#### VMware 工具:核心特性细节
+
+![用 VMware 工具在宿主机系统与访客机系统间共享剪切板][5]
+
+如果你不想知道它包含什么来启用这些功能的话,你可以跳过这部分。但是为了好奇的读者,让我们简短地讨论它一下:
+
+**VMware 设备驱动:** 它具体取决于操作系统。大多数主流操作系统都默认包含了设备驱动,因此你不必另外安装它。这主要涉及到内存控制驱动、鼠标驱动、音频驱动、网卡驱动、VGA 驱动以及其它。
+
+**VMware 用户进程:** 这是这里真正有意思的地方。通过它你获得了在访客机和宿主机间复制粘贴和拖拽的能力。基本上,你可以从宿主机复制粘贴文本到虚拟机,反之亦然。
+
+你同样也可以拖拽文件。此外,在你未安装 SVGA 驱动时它会启用鼠标指针的释放/锁定。
+
+**VMware 工具生命周期管理:** 嗯,我们会在下面看看如何安装 VMware 工具,但是这个特性帮你在虚拟机中轻松安装/升级 VMware 工具。
+
+**共享文件夹**:除了这些。VMware 工具同样允许你在访客机与宿主机系统间共享文件夹。
+
+![使用 VMware 工具在访客机与宿机系统间共享文件][6]
+
+当然,它的效果同样取决于访客机系统。例如在 Windows 上你通过 Unity 模式运行虚拟机上的程序并从宿主机系统上操作它。
+
+### 如何在 Ubuntu 和其它 Linux 发行版上安装 VMware 工具
+
+**注意:** 对于 Linux 操作系统,你应该已经安装好了“Open VM 工具”,大多数情况下免除了额外安装 VMware 工具的需要。
+
+大部分时候,当你安装了访客机系统时,如果操作系统支持 [Easy Install][7] 的话你会收到软件更新或弹窗告诉你要安装 VMware 工具。
+
+Windows 和 Ubuntu 都支持 Easy Install。因此如果你使用 Windows 作为你的宿主机或尝试在 Ubuntu 上安装 VMware 工具,你应该会看到一个和弹窗消息差不多的选项来轻松安装 VMware 工具。这是它应该看起来的样子:
+
+![安装 VMware 工具的弹窗][8]
+
+这是搞定它最简便的办法。因此当你配置虚拟机时确保你有一个通畅的网络连接。
+
+如果你没收到任何弹窗或者选项来轻松安装 VMware 工具。你需要手动安装它。以下是如何去做:
+
+1. 运行 VMware Workstation Player。
+2. 从菜单导航至 “Virtual Machine -> Install VMware tools”。如果你已经安装了它并想修复安装,你会看到 “Re-install VMware tools” 这一选项出现。
+3. 一旦你点击了,你就会看到一个虚拟 CD/DVD 挂载在访客机系统上。
+4. 打开该 CD/DVD,并复制粘贴那个 tar.gz 文件到任何你选择的区域并解压,这里我们选择“桌面”作为解压目的地。
+
+ ![][9]
+5. 在解压后,运行终端并通过输入以下命令导航至里面的文件夹:
+
+ ```
+cd Desktop/VMwareTools-10.3.2-9925305/vmware-tools-distrib
+```
+
+ 你需要检查文件夹与路径名,这取决于版本与解压目的地,名字可能会改变。
+
+ ![][10]
+
+ 用你的存储位置(如“下载”)替换“桌面”,如果你安装的也是 10.3.2 版本,其它的保持一样即可。
+6. 现在仅需输入以下命令开始安装:
+
+ ```
+sudo ./vmware-install.pl -d
+```
+
+ ![][11]
+
+ 你会被询问密码以获得安装权限,输入密码然后应当一切都搞定了。
+
+到此为止了,你搞定了。这系列步骤应当适用于几乎大部分基于 Ubuntu 的访客机系统。如果你想要在 Ubuntu 服务器上或其它系统安装 VMware 工具,步骤应该类似。
+
+### 总结
+
+在 Ubuntu Linux 上安装 VMware 工具应该挺简单。除了简单办法,我们也详述了手动安装的方法。如果你仍需帮助或者对安装有任何建议,在评论区评论让我们知道。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/install-vmware-tools-linux
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[tomjlw](https://github.com/tomjlw)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/install-vmware-player-ubuntu-1310/
+[2]: https://kb.vmware.com/s/article/340
+[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-downloading.jpg?fit=800%2C531&ssl=1
+[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/install-vmware-tools-linux.png?resize=800%2C450&ssl=1
+[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-features.gif?resize=800%2C500&ssl=1
+[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-shared-folder.jpg?fit=800%2C660&ssl=1
+[7]: https://docs.vmware.com/en/VMware-Workstation-Player-for-Linux/15.0/com.vmware.player.linux.using.doc/GUID-3F6B9D0E-6CFC-4627-B80B-9A68A5960F60.html
+[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools.jpg?fit=800%2C481&ssl=1
+[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-extraction.jpg?fit=800%2C564&ssl=1
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-folder.jpg?fit=800%2C487&ssl=1
+[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmware-tools-installation-ubuntu.jpg?fit=800%2C492&ssl=1
diff --git a/published/201910/20190320 Move your dotfiles to version control.md b/published/201910/20190320 Move your dotfiles to version control.md
new file mode 100644
index 0000000000..0b99773fa9
--- /dev/null
+++ b/published/201910/20190320 Move your dotfiles to version control.md
@@ -0,0 +1,125 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11419-1.html)
+[#]: subject: (Move your dotfiles to version control)
+[#]: via: (https://opensource.com/article/19/3/move-your-dotfiles-version-control)
+[#]: author: (Matthew Broberg https://opensource.com/users/mbbroberg)
+
+把“点文件”放到版本控制中
+======
+
+> 通过在 GitLab 或 GitHub 上分享你的点文件,可以在整个系统上备份或同步你的自定义配置。
+
+
+
+通过隐藏文件集(称为点文件)来定制操作系统是个非常棒的想法。在这篇 [Shell 点文件可以为你做点什么][1]中,H. "Waldo" Grunenwald 详细介绍了为什么以及如何设置点文件的细节。现在让我们深入探讨分享它们的原因和方式。
+
+### 什么是点文件?
+
+“点文件”是指我们计算机中四处漂泊的配置文件。这些文件通常在文件名的开头以 `.` 开头,例如 `.gitconfig`,并且操作系统通常在默认情况下将其隐藏。例如,当我在 MacOS 上使用 `ls -a` 时,它才会显示所有可爱的点文件,否则就不会显示这些点文件。
+
+```
+dotfiles on master
+➜ ls
+README.md Rakefile bin misc profiles zsh-custom
+
+dotfiles on master
+➜ ls -a
+. .gitignore .oh-my-zsh README.md zsh-custom
+.. .gitmodules .tmux Rakefile
+.gemrc .global_ignore .vimrc bin
+.git .gvimrc .zlogin misc
+.gitconfig .maid .zshrc profiles
+```
+
+如果看一下用于 Git 配置的 `.gitconfig`,我能看到大量的自定义配置。我设置了帐户信息、终端颜色首选项和大量别名,这些别名可以使我的命令行界面看起来就像我的一样。这是 `[alias]` 块的摘录:
+
+```
+87 # Show the diff between the latest commit and the current state
+88 d = !"git diff-index --quiet HEAD -- || clear; git --no-pager diff --patch-with-stat"
+89
+90 # `git di $number` shows the diff between the state `$number` revisions ago and the current state
+91 di = !"d() { git diff --patch-with-stat HEAD~$1; }; git diff-index --quiet HEAD -- || clear; d"
+92
+93 # Pull in remote changes for the current repository and all its submodules
+94 p = !"git pull; git submodule foreach git pull origin master"
+95
+96 # Checkout a pull request from origin (of a github repository)
+97 pr = !"pr() { git fetch origin pull/$1/head:pr-$1; git checkout pr-$1; }; pr"
+```
+
+由于我的 `.gitconfig` 有 200 多行的自定义设置,我无意于在我使用的每一台新计算机或系统上重写它,其他人肯定也不想这样。这是分享点文件变得越来越流行的原因之一,尤其是随着社交编码网站 GitHub 的兴起。正式提倡分享点文件的文章是 Zach Holman 在 2008 年发表的《[点文件意味着被复刻][2]》。其前提到今天依然如此:我想与我自己、与点文件新手,以及那些分享了他们的自定义配置从而教会了我很多知识的人分享它们。
+
+### 分享点文件
+
+我们中的许多人拥有多个系统,或者知道硬盘变化无常,因此我们希望备份我们精心策划的自定义设置。那么我们如何在环境之间同步这些精彩的文件?
+
+我最喜欢的答案是分布式版本控制,最好是可以为我处理繁重任务的服务。我经常使用 GitHub,随着我对 GitLab 的使用经验越来越丰富,我肯定会一如既往地继续喜欢它。任何一个这样的服务都是共享你的信息的理想场所。要自己设置的话可以这样做:
+
+1. 登录到你首选的基于 Git 的服务。
+2. 创建一个名为 `dotfiles` 的存储库。(将其设置为公开!分享即关爱。)
+3. 将其克隆到你的本地环境。(你可能需要设置 Git 配置命令来克隆存储库。GitHub 和 GitLab 都会提示你需要运行的命令。)
+4. 将你的点文件复制到该文件夹中。
+5. 将它们符号链接回到其目标文件夹(最常见的是 `$HOME`)。
+6. 将它们推送到远程存储库。
+
+
+
+上面的步骤 4 是这项工作的关键,可能有些棘手。无论是使用脚本还是手动执行,工作流程都是从 `dotfiles` 文件夹符号链接到点文件的目标位置,以便对点文件的任何更新都可以轻松地推送到远程存储库。要对我的 `.gitconfig` 文件执行此操作,我要输入:
+
+```
+$ cd dotfiles/
+$ ln -nfs .gitconfig $HOME/.gitconfig
+```
+
+添加到符号链接命令的标志还具有其他一些用处:
+
+* `-s` 创建符号链接而不是硬链接。
+* `-f` 在发生错误时继续做其他符号链接(此处不需要,但在循环中很有用)
+* `-n` 避免符号链接到一个符号链接文件(等同于其他版本的 `ln` 的 `-h` 标志)
+
+如果要更深入地研究可用参数,可以查看 IEEE 和开放小组的 [ln 规范][3]以及 [MacOS 10.14.3] [4] 上的版本。自从其他人的点文件中拉取出这些标志以来,我才发现了这些标志。
+
+你还可以使用一些其他代码来简化更新,例如我从 [Brad Parbs][6] 复刻的 [Rakefile][5]。另外,你也可以像 Jeff Geerling [在其点文件中][7]那样,使它保持极其简单的状态。他使用[此 Ansible 剧本][8]对文件进行符号链接。这样使所有内容保持同步很容易:你可以从点文件的文件夹中进行 cron 作业或偶尔进行 `git push`。
+
+### 简单旁注:什么不能分享
+
+在继续之前,值得注意的是你不应该添加到共享的点文件存储库中的内容 —— 即使它以点开头。任何有安全风险的东西,例如 `.ssh/` 文件夹中的文件,都不是使用此方法分享的好选择。确保在在线发布配置文件之前仔细检查配置文件,并再三检查文件中没有 API 令牌。
+
+### 我应该从哪里开始?
+
+如果你不熟悉 Git,那么我[有关 Git 术语的文章][9]和常用命令[备忘清单][10]将会帮助你继续前进。
+
+还有其他超棒的资源可帮助你开始使用点文件。多年前,我就发现了 [dotfiles.github.io][11],并继续使用它来更广泛地了解人们在做什么。在其他人的点文件中隐藏了许多秘传知识。花时间浏览一些,大胆地将它们添加到自己的内容中。
+
+我希望这是让你在计算机上拥有一致的点文件的快乐开端。
+
+你最喜欢的点文件技巧是什么?添加评论或在 Twitter 上找我 [@mbbroberg][12]。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/move-your-dotfiles-version-control
+
+作者:[Matthew Broberg][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/mbbroberg
+[b]: https://github.com/lujun9972
+[1]: https://linux.cn/article-11417-1.html
+[2]: https://zachholman.com/2010/08/dotfiles-are-meant-to-be-forked/
+[3]: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ln.html
+[4]: https://www.unix.com/man-page/FreeBSD/1/ln/
+[5]: https://github.com/mbbroberg/dotfiles/blob/master/Rakefile
+[6]: https://github.com/bradp/dotfiles
+[7]: https://github.com/geerlingguy/dotfiles
+[8]: https://github.com/geerlingguy/mac-dev-playbook
+[9]: https://opensource.com/article/19/2/git-terminology
+[10]: https://opensource.com/downloads/cheat-sheet-git
+[11]: http://dotfiles.github.io/
+[12]: https://twitter.com/mbbroberg?lang=en
diff --git a/published/201910/20190404 How writers can get work done better with Git.md b/published/201910/20190404 How writers can get work done better with Git.md
new file mode 100644
index 0000000000..125f925fef
--- /dev/null
+++ b/published/201910/20190404 How writers can get work done better with Git.md
@@ -0,0 +1,261 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11499-1.html)
+[#]: subject: (How writers can get work done better with Git)
+[#]: via: (https://opensource.com/article/19/4/write-git)
+[#]: author: (Seth Kenlon https://opensource.com/users/sethhttps://opensource.com/users/noreplyhttps://opensource.com/users/seth)
+
+用 Git 帮助写作者更好地完成工作
+======
+
+> 如果你是一名写作者,你也能从使用 Git 中受益。在我们的系列文章中了解有关 Git 鲜为人知的用法。
+
+
+
+[Git][2] 是一个少有的能将如此多的现代计算封装到一个程序之中的应用程序,它可以用作许多其他应用程序的计算引擎。虽然它以跟踪软件开发中的源代码更改而闻名,但它还有许多其他用途,可以让你的生活更轻松、更有条理。在这个 Git 系列中,我们将分享七种鲜为人知的使用 Git 的方法。
+
+今天我们来看看写作者如何使用 Git 更好的地完成工作。
+
+### 写作者的 Git
+
+有些人写小说,也有人撰写学术论文、诗歌、剧本、技术手册或有关开源的文章。许多人都在做一些各种写作。相同的是,如果你是一名写作者,或许能从使用 Git 中受益。尽管 Git 是著名的计算机程序员所使用的高度技术性工具,但它也是现代写作者的理想之选,本文将向你演示如何改变你的书写方式以及为什么要这么做的原因。
+
+但是,在谈论 Git 之前,重要的是先谈谈“副本”(或者叫“内容”,对于数字时代而言)到底是什么,以及为什么它与你的交付*媒介*不同。这是 21 世纪,大多数写作者选择的工具是计算机。尽管计算机看似擅长将副本的编辑和布局等过程结合在一起,但写作者还是(重新)发现将内容与样式分开是一个好主意。这意味着你应该在计算机上像在打字机上而不是在文字处理器中进行书写。以计算机术语而言,这意味着以*纯文本*形式写作。
+
+### 以纯文本写作
+
+这个假设曾经是毫无疑问的:你知道自己的写作所要针对的市场,你可以为书籍、网站或软件手册等不同市场编写内容。但是,近来各种市场趋于扁平化:你可能决定在纸质书中使用为网站编写的内容,并且纸质书可能会在以后发布 EPUB 版本。对于你的内容的数字版本,读者才是最终控制者:他们可以在你发布内容的网站上阅读你的文字,也可以点击 Firefox 出色的[阅读视图][3],还可能会打印到纸张上,或者可能会使用 Lynx 将网页转储到文本文件中,甚至可能因为使用屏幕阅读器而根本看不到你的内容。
+
+你只需要逐字写下你的内容,而将交付工作留给发布者。即使你是自己发布,将字词作为写作作品的一种源代码也是一种更聪明、更有效的工作方式,因为在发布时,你可以使用相同的源(你的纯文本)生成适合你的目标输出(用于打印的 PDF、用于电子书的 EPUB、用于网站的 HTML 等)。
+
+用纯文本编写不仅意味着你不必担心布局或文本样式,而且也不再需要专门的工具。无论是手机或平板电脑上的基本的记事本应用程序、计算机附带的文本编辑器,还是从互联网上下载的免费编辑器,任何能够产生文本内容的工具对你而言都是有效的“文字处理器”。无论你身在何处或在做什么,几乎可以在任何设备上书写,并且所生成的文本可以与你的项目完美集成,而无需进行任何修改。
+
+而且,Git 专门用来管理纯文本。
+
+### Atom 编辑器
+
+当你以纯文本形式书写时,文字处理程序会显得过于庞大。使用文本编辑器更容易,因为文本编辑器不会尝试“有效地”重组输入内容。它使你可以将脑海中的单词输入到屏幕中,而不会受到干扰。更好的是,文本编辑器通常是围绕插件体系结构设计的,这样应用程序本身很基础(它用来编辑文本),但是你可以围绕它构建一个环境来满足你的各种需求。
+
+[Atom][4] 编辑器就是这种设计理念的一个很好的例子。这是一个具有内置 Git 集成的跨平台文本编辑器。如果你不熟悉纯文本格式,也不熟悉 Git,那么 Atom 是最简单的入门方法。
+
+#### 安装 Git 和 Atom
+
+首先,请确保你的系统上已安装 Git。如果运行 Linux 或 BSD,则 Git 在软件存储库或 ports 树中可用。你使用的命令将根据你的发行版而有所不同。例如在 Fedora 上:
+
+```
+$ sudo dnf install git
+```
+
+你也可以下载并安装适用于 [Mac][5] 和 [Windows][6] 的 Git。
+
+你不需要直接使用 Git,因为 Atom 会充当你的 Git 界面。下一步是安装 Atom。
+
+如果你使用的是 Linux,请通过软件安装程序或适当的命令从软件存储库中安装 Atom,例如:
+
+```
+$ sudo dnf install atom
+```
+
+Atom 当前没有在 BSD 上构建。但是,有很好的替代方法,例如 [GNU Emacs][7]。对于 Mac 和 Windows 用户,可以在 [Atom 网站][4]上找到安装程序。
+
+安装完成后,启动 Atom 编辑器。
+
+#### 快速指导
+
+如果要使用纯文本和 Git,则需要适应你的编辑器。Atom 的用户界面可能比你习惯的更加动态。实际上,你可以将它视为 Firefox 或 Chrome,而不是文字处理程序,因为它具有可以根据需要打开或关闭的选项卡和面板,甚至还可以安装和配置附件。尝试全部掌握 Atom 如许之多的功能是不切实际的,但是你至少可以知道有什么功能。
+
+当打开 Atom 时,它将显示一个欢迎屏幕。如果不出意外,此屏幕很好地介绍了 Atom 的选项卡式界面。你可以通过单击 Atom 窗口顶部选项卡上的“关闭”图标来关闭欢迎屏幕,并使用“文件 > 新建文件”创建一个新文件。
+
+使用纯文本格式与使用文字处理程序有点不同,因此这里有一些技巧,以人可以理解的方式编写内容,并且 Git 和计算机可以解析,跟踪和转换。
+
+#### 用 Markdown 书写
+
+如今,当人们谈论纯文本时,大多是指 Markdown。Markdown 与其说是格式,不如说是样式,这意味着它旨在为文本提供可预测的结构,以便计算机可以检测自然的模式并智能地转换文本。Markdown 有很多定义,但是最好的技术定义和备忘清单在 [CommonMark 的网站][8]上。
+
+```
+# Chapter 1
+
+This is a paragraph with an *italic* word and a **bold** word in it.
+And it can even reference an image.
+
+
+```
+
+从示例中可以看出,Markdown 读起来感觉不像代码,但可以将其视为代码。如果你遵循 CommonMark 定义的 Markdown 规范,那么一键就可以可靠地将 Markdown 的文字转换为 .docx、.epub、.html、MediaWiki、.odt、.pdf、.rtf 和各种其他的格式,而*不会*失去格式。
+
+你可以认为 Markdown 有点像文字处理程序的样式。如果你曾经为出版社撰写过一套样式来控制章节标题及其样式,那基本上就是一回事,除了不是从下拉菜单中选择样式以外,你需要给你的文字添加一些小记号。对于任何习惯“以文字交谈”的现代阅读者来说,这些表示法都是很自然的,但是在呈现文本时,它们会被精美的文本样式替换掉。实际上,这就是文字处理程序在后台秘密进行的操作。文字处理器显示粗体文本,但是如果你可以看到使文本变为粗体的生成代码,则它与 Markdown 很像(实际上,它是更复杂的 XML)。使用 Markdown 可以消除这种代码和样式之间的阻隔,一方面看起来更可怕一些,但另一方面,你可以在几乎所有可以生成文本的东西上书写 Markdown 而不会丢失任何格式信息。
+
+Markdown 文件流行的文件扩展名是 .md。如果你使用的平台不知道 .md 文件是什么,则可以手动将该扩展名与 Atom 关联,或者仅使用通用的 .txt 扩展名。文件扩展名不会更改文件的性质。它只会改变你的计算机决定如何处理它的方式。Atom 和某些平台足够聪明,可以知道该文件是纯文本格式,无论你给它以什么扩展名。
+
+#### 实时预览
+
+Atom 具有 “Markdown 预览” 插件,该插件可以向你显示正在编写的纯文本 Markdown 及其(通常)呈现的方式。
+
+![Atom's preview screen][9]
+
+要激活此预览窗格,请选择“包 > Markdown 预览 > 切换预览” 或按 `Ctrl + Shift + M`。
+
+此视图为你提供了两全其美的方法。无需承担为你的文本添加样式的负担就可以写作,而你也可以看到一个通用的示例外观,至少是以典型的数字化格式显示文本的外观。当然,关键是你无法控制文本的最终呈现方式,因此不要试图调整 Markdown 来强制以某种方式显示呈现的预览。
+
+#### 每行一句话
+
+你的高中写作老师不会看你的 Markdown。
+
+一开始它不那么自然,但是在数字世界中,保持每行一个句子更有意义。Markdown 会忽略单个换行符(当你按下 `Return` 或 `Enter` 键时),并且只在单个空行之后才会创建一个新段落。
+
+![Writing in Atom][10]
+
+每行写一个句子的好处是你的工作更容易跟踪。也就是说,假如你在段落的开头更改了一个单词,如果更改仅限于一行而不是一个长的段落中的一个单词,那么 Atom、Git 或任何应用程序很容易以有意义的方式突出显示该更改。换句话说,对一个句子的更改只会影响该句子,而不会影响整个段落。
+
+你可能会想:“许多文字处理器也可以跟踪更改,它们可以突出显示已更改的单个单词。”但是这些修订跟踪器绑定在该字处理器的界面上,这意味着你必须先打开该字处理器才能浏览修订。在纯文本工作流程中,你可以以纯文本形式查看修订,这意味着无论手头有什么,只要该设备可以处理纯文本(大多数都可以),就可以进行编辑或批准编辑。
+
+诚然,写作者通常不会考虑行号,但它对于计算机有用,并且通常是一个很好的参考点。默认情况下,Atom 为文本文档的行进行编号。按下 `Enter` 键或 `Return` 键后,一*行*就是一行。
+
+![Writing in Atom][11]
+
+如果(在 Atom 的)一行的行号中有一个点而不是一个数字,则表示它是上一行折叠的一部分,因为它超出了你的屏幕。
+
+#### 主题
+
+如果你是一个在意视觉形象的人,那么你可能会非常注重自己的写作环境。即使你使用普通的 Markdown 进行编写,也并不意味着你必须使用程序员的字体或在使你看起来像码农的黑窗口中进行书写。修改 Atom 外观的最简单方法是使用[主题包][12]。主题设计人员通常将深色主题与浅色主题区分开,因此你可以根据需要使用关键字“Dark”或“Light”进行搜索。
+
+要安装主题,请选择“编辑 > 首选项”。这将在 Atom 界面中打开一个新标签页。是的,标签页可以用于处理文档*和*用于配置及控制面板。在“设置”标签页中,单击“安装”类别。
+
+在“安装”面板中,搜索要安装的主题的名称。单击搜索字段右侧的“主题”按钮,以仅搜索主题。找到主题后,单击其“安装”按钮。
+
+![Atom's themes][13]
+
+要使用已安装的主题或根据喜好自定义主题,请导航至“设置”标签页中的“主题”类别中。从下拉菜单中选择要使用的主题。更改会立即进行,因此你可以准确了解主题如何影响你的环境。
+
+你也可以在“设置”标签的“编辑器”类别中更改工作字体。Atom 默认采用等宽字体,程序员通常首选这种字体。但是你可以使用系统上的任何字体,无论是衬线字体、无衬线字体、哥特式字体还是草书字体。无论你想整天盯着什么字体都行。
+
+作为相关说明,默认情况下,Atom 会在其屏幕上绘制一条垂直线,以提示编写代码的人员。程序员通常不想编写太长的代码行,因此这条垂直线会提醒他们不要写太长的代码行。不过,这条竖线对写作者而言毫无意义,你可以通过禁用 “wrap-guide” 包将其删除。
+
+要禁用 “wrap-guide” 软件包,请在“设置”标签中选择“折行”类别,然后搜索 “wrap-guide”。找到该程序包后,单击其“禁用”按钮。
+
+#### 动态结构
+
+创建长文档时,我发现每个文件写一个章节比在一个文件中写整本书更有意义。此外,我不会以明显的语法 ` chapter-1.md` 或 `1.example.md` 来命名我的章节,而是以章节标题或关键词(例如 `example.md`)命名。为了将来为自己提供有关如何编写本书的指导,我维护了一个名为 `toc.md` (用于“目录”)的文件,其中列出了各章的(当前)顺序。
+
+我这样做是因为,无论我多么相信第 6 章都不可能出现在第 1 章之前,但在我完成整本书之前,几乎难以避免我会交换一两个章节的顺序。我发现从一开始就保持动态变化可以帮助我避免重命名混乱,也可以帮助我避免僵化的结构。
+
+### 在 Atom 中使用 Git
+
+每位写作者的共同点是两件事:他们为流传而写作,而他们的写作是一段旅程。你不能一坐下来写作就完成了最终稿件。顾名思义,你有一个初稿。该草稿会经过修订,你会仔细地将每个修订保存一式两份或三份的备份,以防万一你的文件损坏了。最终,你得到了所谓的最终草稿,但很有可能你有一天还会回到这份最终草稿,要么恢复好的部分,要么修改坏的部分。
+
+Atom 最令人兴奋的功能是其强大的 Git 集成。无需离开 Atom,你就可以与 Git 的所有主要功能进行交互,跟踪和更新项目、回滚你不喜欢的更改、集成来自协作者的更改等等。最好的学习方法就是逐步学习,因此这是在一个写作项目中从始至终在 Atom 界面中使用 Git 的方法。
+
+第一件事:通过选择 “视图 > 切换 Git 标签页” 来显示 Git 面板。这将在 Atom 界面的右侧打开一个新标签页。现在没什么可看的,所以暂时保持打开状态就行。
+
+#### 建立一个 Git 项目
+
+你可以认为 Git 被绑定到一个文件夹。Git 目录之外的任何文件夹都不知道 Git,而 Git 也不知道外面。Git 目录中的文件夹和文件将被忽略,直到你授予 Git 权限来跟踪它们为止。
+
+你可以通过在 Atom 中创建新的项目文件夹来创建 Git 项目。选择 “文件 > 添加项目文件夹”,然后在系统上创建一个新文件夹。你创建的文件夹将出现在 Atom 窗口的左侧“项目面板”中。
+
+#### Git 添加文件
+
+右键单击你的新项目文件夹,然后选择“新建文件”以在项目文件夹中创建一个新文件。如果你要导入文件到新项目中,请右键单击该文件夹,然后选择“在文件管理器中显示”,以在系统的文件查看器中打开该文件夹(Linux 上为 Dolphin 或 Nautilus,Mac 上为 Finder,在 Windows 上是 Explorer),然后拖放文件到你的项目文件夹。
+
+在 Atom 中打开一个项目文件(你创建的空文件或导入的文件)后,单击 Git 标签中的 “创建存储库” 按钮。在弹出的对话框中,单击 “初始化” 以将你的项目目录初始化为本地 Git 存储库。 Git 会将 `.git` 目录(在系统的文件管理器中不可见,但在 Atom 中可见)添加到项目文件夹中。不要被这个愚弄了:`.git` 目录是 Git 管理的,而不是由你管理的,因此一般你不要动它。但是在 Atom 中看到它可以很好地提醒你正在由 Git 管理的项目中工作。换句话说,当你看到 `.git` 目录时,就有了修订历史记录。
+
+在你的空文件中,写一些东西。你是写作者,所以输入一些单词就行。你可以随意输入任何一组单词,但要记住上面的写作技巧。
+
+按 `Ctrl + S` 保存文件,该文件将显示在 Git 标签的 “未暂存的改变” 部分中。这意味着该文件存在于你的项目文件夹中,但尚未提交给 Git 管理。通过单击 Git 选项卡右上方的 “暂存全部” 按钮,以允许 Git 跟踪这些文件。如果你使用过带有修订历史记录的文字处理器,则可以将此步骤视为允许 Git 记录更改。
+
+#### Git 提交
+
+你的文件现在已暂存。这意味着 Git 知道该文件存在,并且知道自上次 Git 知道该文件以来,该文件已被更改。
+
+Git 的提交会将你的文件发送到 Git 的内部和永久存档中。如果你习惯于文字处理程序,这就类似于给一个修订版命名。要创建一个提交,请在 Git 选项卡底部的“提交”消息框中输入一些描述性文本。你可能会感到含糊不清或随意写点什么,但如果你想在将来知道进行修订的原因,那么输入一些有用的信息会更有用。
+
+第一次提交时,必须创建一个分支。Git 分支有点像另外一个空间,它允许你从一个时间轴切换到另一个时间轴,以进行你可能想要也可能不想要永久保留的更改。如果最终喜欢该更改,则可以将一个实验分支合并到另一个实验分支,从而统一项目的不同版本。这是一个高级过程,不需要先学会,但是你仍然需要一个活动分支,因此你必须为首次提交创建一个分支。
+
+单击 Git 选项卡最底部的“分支”图标,以创建新的分支。
+
+![Creating a branch][14]
+
+通常将第一个分支命名为 `master`,但不是必须如此;你可以将其命名为 `firstdraft` 或任何你喜欢的名称,但是遵守当地习俗有时会使谈论 Git(和查找问题的答案)变得容易一些,因为你会知道有人提到 “master” 时,它们的真正意思是“主干”而不是“初稿”或你给分支起的什么名字。
+
+在某些版本的 Atom 上,UI 也许不会更新以反映你已经创建的新分支。不用担心,做了提交之后,它会创建分支(并更新 UI)。按下 “提交” 按钮,无论它显示的是 “创建脱离的提交” 还是 “提交到主干。
+
+提交后,文件的状态将永久保留在 Git 的记忆之中。
+
+#### 历史记录和 Git 差异
+
+一个自然而然的问题是你应该多久做一次提交。这并没有正确的答案。使用 `Ctrl + S` 保存文件和提交到 Git 是两个单独的过程,因此你会一直做这两个过程。每当你觉得自己已经做了重要的事情或打算尝试一个可能会被干掉的疯狂的新想法时,你可能都会想要做次提交。
+
+要了解提交对工作流程的影响,请从测试文档中删除一些文本,然后在顶部和底部添加一些文本。再次提交。 这样做几次,直到你在 Git 标签的底部有了一小段历史记录,然后单击其中一个提交以在 Atom 中查看它。
+
+![Viewing differences][15]
+
+查看过去的提交时,你会看到三种元素:
+
+1. 绿色文本是该提交中已被添加到文档中的内容。
+2. 红色文本是该提交中已从文档中删除的内容。
+3. 其他所有文字均未做更改。
+
+#### 远程备份
+
+使用 Git 的优点之一是,按照设计它是分布式的,这意味着你可以将工作提交到本地存储库,并将所做的更改推送到任意数量的服务器上进行备份。你还可以从这些服务器中拉取更改,以便你碰巧正在使用的任何设备始终具有最新更改。
+
+为此,你必须在 Git 服务器上拥有一个帐户。有几种免费的托管服务,其中包括 GitHub,这个公司开发了 Atom,但奇怪的是 GitHub 不是开源的;而 GitLab 是开源的。相比私有软件,我更喜欢开源,在本示例中,我将使用 GitLab。
+
+如果你还没有 GitLab 帐户,请注册一个帐户并开始一个新项目。项目名称不必与 Atom 中的项目文件夹匹配,但是如果匹配,则可能更有意义。你可以将项目保留为私有,在这种情况下,只有你和任何一个你给予了明确权限的人可以访问它,或者,如果你希望该项目可供任何互联网上偶然发现它的人使用,则可以将其公开。
+
+不要将 README 文件添加到项目中。
+
+创建项目后,它将为你提供有关如何设置存储库的说明。如果你决定在终端中或通过单独的 GUI 使用 Git,这是非常有用的信息,但是 Atom 的工作流程则有所不同。
+
+单击 GitLab 界面右上方的 “克隆” 按钮。这显示了访问 Git 存储库必须使用的地址。复制 “SSH” 地址(而不是 “https” 地址)。
+
+在 Atom 中,点击项目的 `.git` 目录,然后打开 `config` 文件。将下面这些配置行添加到该文件中,调整 `url` 值的 `seth/example.git` 部分以匹配你自己独有的地址。
+
+```
+[remote "origin"]
+ url = git@gitlab.com:seth/example.git
+ fetch = +refs/heads/*:refs/remotes/origin/*
+[branch "master"]
+ remote = origin
+ merge = refs/heads/master
+```
+
+在 Git 标签的底部,出现了一个新按钮,标记为 “提取”。由于你的服务器是全新的服务器,因此没有可供你提取的数据,因此请右键单击该按钮,然后选择“推送”。这会将你的更改推送到你的 GitLab 帐户,现在你的项目已备份到 Git 服务器上。
+
+你可以在每次提交后将更改推送到服务器。它提供了即刻的异地备份,并且由于数据量通常很少,因此它几乎与本地保存一样快。
+
+### 撰写而 Git
+
+Git 是一个复杂的系统,不仅对修订跟踪和备份有用。它还支持异步协作并鼓励实验。本文介绍了一些基础知识,但还有更多关于 Git 的文章和整本的书,以及如何使用它使你的工作更高效、更具弹性和更具活力。 从使用 Git 完成小任务开始,使用的次数越多,你会发现自己提出的问题就越多,最终你将学到的技巧越多。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/4/write-git
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/sethhttps://opensource.com/users/noreplyhttps://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/write-hand_0.jpg?itok=Uw5RJD03 (Writing Hand)
+[2]: https://git-scm.com/
+[3]: https://support.mozilla.org/en-US/kb/firefox-reader-view-clutter-free-web-pages
+[4]: http://atom.io
+[5]: https://git-scm.com/download/mac
+[6]: https://git-scm.com/download/win
+[7]: http://gnu.org/software/emacs
+[8]: https://commonmark.org/help/
+[9]: https://opensource.com/sites/default/files/uploads/atom-preview.jpg (Atom's preview screen)
+[10]: https://opensource.com/sites/default/files/uploads/atom-para.jpg (Writing in Atom)
+[11]: https://opensource.com/sites/default/files/uploads/atom-linebreak.jpg (Writing in Atom)
+[12]: https://atom.io/themes
+[13]: https://opensource.com/sites/default/files/uploads/atom-theme.jpg (Atom's themes)
+[14]: https://opensource.com/sites/default/files/uploads/atom-branch.jpg (Creating a branch)
+[15]: https://opensource.com/sites/default/files/uploads/git-diff.jpg (Viewing differences)
+[16]: mailto:git@gitlab.com
diff --git a/published/201910/20190513 Blockchain 2.0 - Introduction To Hyperledger Fabric -Part 10.md b/published/201910/20190513 Blockchain 2.0 - Introduction To Hyperledger Fabric -Part 10.md
new file mode 100644
index 0000000000..5b3be0ba08
--- /dev/null
+++ b/published/201910/20190513 Blockchain 2.0 - Introduction To Hyperledger Fabric -Part 10.md
@@ -0,0 +1,73 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11461-1.html)
+[#]: subject: (Blockchain 2.0 – Introduction To Hyperledger Fabric [Part 10])
+[#]: via: (https://www.ostechnix.com/blockchain-2-0-introduction-to-hyperledger-fabric/)
+[#]: author: (sk https://www.ostechnix.com/author/sk/)
+
+区块链 2.0:Hyperledger Fabric 介绍(十)
+======
+
+![Hyperledger Fabric][1]
+
+### Hyperledger Fabric
+
+[Hyperledger 项目][2] 是一个伞形组织,包括许多正在开发的不同模块和系统。在这些子项目中,最受欢迎的是 “Hyperledger Fabric”。这篇博文将探讨一旦区块链系统开始大量使用到主流,将使 Fabric 在不久的将来成为几乎不可或缺的功能。最后,我们还将快速了解开发人员和爱好者们需要了解的有关 Hyperledger Fabric 技术的知识。
+
+### 起源
+
+按照 Hyperledger 项目的常规方式,Fabric 由其核心成员之一 IBM “捐赠”给该组织,而 IBM 以前是该组织的主要开发者。由 IBM 共享的这个技术平台在 Hyperledger 项目中进行了联合开发,来自 100 多个成员公司和机构为之做出了贡献。
+
+目前,Fabric 正处于 LTS 版本的 v1.4,该版本已经发展很长一段时间,并且被视为企业管理业务数据的解决方案。Hyperledger 项目的核心愿景也必然会渗透到 Fabric 中。Hyperledger Fabric 系统继承了所有企业级的可扩展功能,这些功能已深深地刻入到 Hyperledger 组织旗下所有的项目当中。
+
+### Hyperledger Fabric 的亮点
+
+Hyperledger Fabric 提供了多种功能和标准,这些功能和标准围绕着支持快速开发和模块化体系结构的使命而构建。此外,与竞争对手(主要是瑞波和[以太坊][3])相比,Fabric 明确用于封闭和[许可区块链][4]。它们的核心目标是开发一套工具,这些工具将帮助区块链开发人员创建定制的解决方案,而不是创建独立的生态系统或产品。
+
+Hyperledger Fabric 的一些亮点如下:
+
+#### 许可区块链系统
+
+这是一个 Hyperledger Fabric 与其他平台(如以太坊和瑞波)差异很大的地方。默认情况下,Fabric 是一种旨在实现私有许可的区块链的工具。此类区块链不能被所有人访问,并且其中致力于达成共识或验证交易的节点将由中央机构进行选择。这对于某些应用(例如银行和保险)可能很重要,在这些应用中,交易必须由中央机构而不是参与者来验证。
+
+#### 机密和受控的信息流
+
+Fabric 内置了权限系统,该权限系统将视情况限制特定组或某些个人中的信息流。与公有区块链不同,在公有区块链中,任何运行节点的人都可以对存储在区块链中的数据进行复制和选择性访问,而 Fabric 系统的管理员可以选择谁能访问共享的信息,以及访问的方式。与现有竞争产品相比,它还有以更好的安全性标准对存储的数据进行加密的子系统。
+
+#### 即插即用架构
+
+Hyperledger Fabric 具有即插即用类型的体系结构。可以选择实施系统的各个组件,而开发人员看不到用处的系统组件可能会被废弃。Fabric 采取高度模块化和可定制的方式进行开发,而不是一种与其竞争对手采用的“一种方法适应所有需求”的方式。对于希望快速构建精益系统的公司和公司而言,这尤其有吸引力。这与 Fabric 和其它 Hyperledger 组件的互操作性相结合,意味着开发人员和设计人员现在可以使用各种标准化工具,而不必从其他来源提取代码并随后进行集成。它还提供了一种相当可靠的方式来构建健壮的模块化系统。
+
+#### 智能合约和链码
+
+运行在区块链上的分布式应用程序称为[智能合约][5]。虽然智能合约这个术语或多或少与以太坊平台相关联,但链码是 Hyperledger 阵营中为其赋予的名称。链码应用程序除了拥有 DApp 中有的所有优点之外,使 Hyperledger 与众不同的是,该应用程序的代码可以用多种高级编程语言编写。它本身支持 [Go][6] 和 JavaScript,并且在与适当的编译器模块集成后还支持许多其它编程语言。尽管这一事实在此时可能并不代表什么,但这意味着,如果可以将现有人才用于正在进行的涉及区块链的项目,从长远来看,这有可能为公司节省数十亿美元的人员培训和管理费用。开发人员可以使用自己喜欢的语言进行编码,从而在 Hyperledger Fabric 上开始构建应用程序,而无需学习或培训平台特定的语言和语法。这提供了 Hyperledger Fabric 当前竞争对手无法提供的灵活性。
+
+### 总结
+
+* Hyperledger Fabric 是一个后端驱动程序平台,是一个主要针对需要区块链或其它分布式账本技术的集成项目。因此,除了次要的脚本功能外,它不提供任何面向用户的服务。(认可以为它更像是一种脚本语言。)
+* Hyperledger Fabric 支持针对特定用例构建侧链。如果开发人员希望将一组用户或参与者隔离到应用程序的特定部分或功能,则可以通过侧链来实现。侧链是衍生自主要父代的区块链,但在其初始块之后形成不同的链。产生新链的块将不受新链进一步变化的影响,即使将新信息添加到原始链中,新链也将保持不变。此功能将有助于扩展正在开发的平台,并引入用户特定的和案例特定的处理功能。
+* 前面的功能还意味着并非所有用户都会像通常对公有链所期望的那样拥有区块链中所有数据的“精确”副本。参与节点将具有仅与之相关的数据副本。例如,假设有一个类似于印度的 PayTM 的应用程序,该应用程序具有钱包功能以及电子商务功能。但是,并非所有的钱包用户都使用 PayTM 在线购物。在这种情况下,只有活跃的购物者将在 PayTM 电子商务网站上拥有相应的交易链,而钱包用户将仅拥有存储钱包交易的链的副本。这种灵活的数据存储和检索体系结构在扩展时非常重要,因为大量的单链区块链已经显示出会增加处理交易的前置时间。这样可以保持链的精简和分类。
+
+我们将在以后的文章中详细介绍 Hyperledger Project 下的其他模块。
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/blockchain-2-0-introduction-to-hyperledger-fabric/
+
+作者:[sk][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
+[1]: https://www.ostechnix.com/wp-content/uploads/2019/05/Hyperledger-Fabric-720x340.png
+[2]: https://www.ostechnix.com/blockchain-2-0-an-introduction-to-hyperledger-project-hlp/
+[3]: https://www.ostechnix.com/blockchain-2-0-what-is-ethereum/
+[4]: https://www.ostechnix.com/blockchain-2-0-public-vs-private-blockchain-comparison/
+[5]: https://www.ostechnix.com/blockchain-2-0-explaining-smart-contracts-and-its-types/
+[6]: https://www.ostechnix.com/install-go-language-linux/
diff --git a/published/201910/20190614 What is a Java constructor.md b/published/201910/20190614 What is a Java constructor.md
new file mode 100644
index 0000000000..62d40ceeeb
--- /dev/null
+++ b/published/201910/20190614 What is a Java constructor.md
@@ -0,0 +1,151 @@
+[#]: collector: (lujun9972)
+[#]: translator: (laingke)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11478-1.html)
+[#]: subject: (What is a Java constructor?)
+[#]: via: (https://opensource.com/article/19/6/what-java-constructor)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+什么是 Java 构造器?
+======
+
+> 构造器是编程的强大组件。使用它们来释放 Java 的全部潜力。
+
+
+
+在开源、跨平台编程领域,Java 无疑(?)是无可争议的重量级语言。尽管有许多[伟大的跨平台][2][框架][3],但很少有像 [Java][4] 那样统一和直接的。
+
+当然,Java 也是一种非常复杂的语言,具有自己的微妙之处和惯例。Java 中与构造器有关的最常见问题之一是:它们是什么,它们的作用是什么?
+
+简而言之:构造器是在 Java 中创建新对象时执行的操作。当 Java 应用程序创建一个你编写的类的实例时,它将检查构造器。如果(该类)存在构造器,则 Java 在创建实例时将运行构造器中的代码。这几句话中包含了大量的技术术语,但是当你看到它的实际应用时就会更加清楚,所以请确保你已经[安装了 Java][5] 并准备好进行演示。
+
+### 没有使用构造器的开发日常
+
+如果你正在编写 Java 代码,那么你已经在使用构造器了,即使你可能不知道它。Java 中的所有类都有一个构造器,因为即使你没有创建构造器,Java 也会在编译代码时为你生成一个。但是,为了进行演示,请忽略 Java 提供的隐藏构造器(因为默认构造器不添加任何额外的功能),并观察没有显式构造器的情况。
+
+假设你正在编写一个简单的 Java 掷骰子应用程序,因为你想为游戏生成一个伪随机数。
+
+首先,你可以创建骰子类来表示一个骰子。你玩了很久[《龙与地下城》][6],所以你决定创建一个 20 面的骰子。在这个示例代码中,变量 `dice` 是整数 20,表示可能的最大掷骰数(一个 20 边骰子的掷骰数不能超过 20)。变量 `roll` 是最终的随机数的占位符,`rand` 用作随机数种子。
+
+```
+import java.util.Random;
+
+public class DiceRoller {
+ private int dice = 20;
+ private int roll;
+ private Random rand = new Random();
+```
+
+接下来,在 `DiceRoller` 类中创建一个函数,以执行计算机模拟模子滚动所必须采取的步骤:从 `rand` 中获取一个整数并将其分配给 `roll`变量,考虑到 Java 从 0 开始计数但 20 面的骰子没有 0 值的情况,`roll` 再加 1 ,然后打印结果。
+
+```
+import java.util.Random;
+
+public class DiceRoller {
+ private int dice = 20;
+ private int roll;
+ private Random rand = new Random();
+```
+
+最后,产生 `DiceRoller` 类的实例并调用其关键函数 `Roller`:
+
+```
+// main loop
+public static void main (String[] args) {
+ System.out.printf("You rolled a ");
+
+ DiceRoller App = new DiceRoller();
+ App.Roller();
+ }
+}
+```
+
+只要你安装了 Java 开发环境(如 [OpenJDK][10]),你就可以在终端上运行你的应用程序:
+
+```
+$ java dice.java
+You rolled a 12
+```
+
+在本例中,没有显式构造器。这是一个非常有效和合法的 Java 应用程序,但是它有一点局限性。例如,如果你把游戏《龙与地下城》放在一边,晚上去玩一些《快艇骰子》,你将需要六面骰子。在这个简单的例子中,更改代码不会有太多的麻烦,但是在复杂的代码中这不是一个现实的选择。解决这个问题的一种方法是使用构造器。
+
+### 构造函数的作用
+
+这个示例项目中的 `DiceRoller` 类表示一个虚拟骰子工厂:当它被调用时,它创建一个虚拟骰子,然后进行“滚动”。然而,通过编写一个自定义构造器,你可以让掷骰子的应用程序询问你希望模拟哪种类型的骰子。
+
+大部分代码都是一样的,除了构造器接受一个表示面数的数字参数。这个数字还不存在,但稍后将创建它。
+
+```
+import java.util.Random;
+
+public class DiceRoller {
+ private int dice;
+ private int roll;
+ private Random rand = new Random();
+
+ // constructor
+ public DiceRoller(int sides) {
+ dice = sides;
+ }
+```
+
+模拟滚动的函数保持不变:
+
+```
+public void Roller() {
+ roll = rand.nextInt(dice);
+ roll += 1;
+ System.out.println (roll);
+}
+```
+
+代码的主要部分提供运行应用程序时提供的任何参数。这的确会是一个复杂的应用程序,你需要仔细解析参数并检查意外结果,但对于这个例子,唯一的预防措施是将参数字符串转换成整数类型。
+
+```
+public static void main (String[] args) {
+ System.out.printf("You rolled a ");
+ DiceRoller App = new DiceRoller( Integer.parseInt(args[0]) );
+ App.Roller();
+}
+```
+
+启动这个应用程序,并提供你希望骰子具有的面数:
+
+```
+$ java dice.java 20
+You rolled a 10
+$ java dice.java 6
+You rolled a 2
+$ java dice.java 100
+You rolled a 44
+```
+
+构造器已接受你的输入,因此在创建类实例时,会将 `sides` 变量设置为用户指定的任何数字。
+
+构造器是编程的功能强大的组件。练习用它们来解开了 Java 的全部潜力。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/6/what-java-constructor
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[laingke](https://github.com/laingke)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/build_structure_tech_program_code_construction.png?itok=nVsiLuag
+[2]: https://opensource.com/resources/python
+[3]: https://opensource.com/article/17/4/pyqt-versus-wxpython
+[4]: https://opensource.com/resources/java
+[5]: https://openjdk.java.net/install/index.html
+[6]: https://opensource.com/article/19/5/free-rpg-day
+[7]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+random
+[8]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system
+[9]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string
+[10]: https://openjdk.java.net/
+[11]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+integer
diff --git a/published/201910/20190627 RPM packages explained.md b/published/201910/20190627 RPM packages explained.md
new file mode 100644
index 0000000000..7f036a1504
--- /dev/null
+++ b/published/201910/20190627 RPM packages explained.md
@@ -0,0 +1,313 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11452-1.html)
+[#]: subject: (RPM packages explained)
+[#]: via: (https://fedoramagazine.org/rpm-packages-explained/)
+[#]: author: (Ankur Sinha "FranciscoD" https://fedoramagazine.org/author/ankursinha/)
+
+RPM 包初窥
+======
+
+![][1]
+
+也许,Fedora 社区追求其[促进自由和开源的软件及内容的使命][2]的最著名的方式就是开发 [Fedora 软件发行版][3]了。因此,我们将很大一部分的社区资源用于此任务也就不足为奇了。这篇文章总结了这些软件是如何“打包”的,以及使之成为可能的基础工具,如 `rpm` 之类。
+
+### RPM:最小的软件单元
+
+可供用户选择的“版本”和“风味版”([spins][4] / [labs][5] / [silverblue][6])其实非常相似。它们都是由各种软件组成的,这些软件经过混合和搭配,可以很好地协同工作。它们之间的不同之处在于放入其中的具体工具不同。这种选择取决于它们所针对的用例。所有这些的“版本”和“风味版”基本组成单位都是 RPM 软件包文件。
+
+RPM 文件是类似于 ZIP 文件或 tarball 的存档文件。实际上,它们使用了压缩来减小存档文件的大小。但是,除了文件之外,RPM 存档中还包含有关软件包的元数据。可以使用 `rpm` 工具查询:
+
+```
+$ rpm -q fpaste
+fpaste-0.3.9.2-2.fc30.noarch
+
+$ rpm -qi fpaste
+Name : fpaste
+Version : 0.3.9.2
+Release : 2.fc30
+Architecture: noarch
+Install Date: Tue 26 Mar 2019 08:49:10 GMT
+Group : Unspecified
+Size : 64144
+License : GPLv3+
+Signature : RSA/SHA256, Thu 07 Feb 2019 15:46:11 GMT, Key ID ef3c111fcfc659b9
+Source RPM : fpaste-0.3.9.2-2.fc30.src.rpm
+Build Date : Thu 31 Jan 2019 20:06:01 GMT
+Build Host : buildhw-07.phx2.fedoraproject.org
+Relocations : (not relocatable)
+Packager : Fedora Project
+Vendor : Fedora Project
+URL : https://pagure.io/fpaste
+Bug URL : https://bugz.fedoraproject.org/fpaste
+Summary : A simple tool for pasting info onto sticky notes instances
+Description :
+It is often useful to be able to easily paste text to the Fedora
+Pastebin at http://paste.fedoraproject.org and this simple script
+will do that and return the resulting URL so that people may
+examine the output. This can hopefully help folks who are for
+some reason stuck without X, working remotely, or any other
+reason they may be unable to paste something into the pastebin
+
+$ rpm -ql fpaste
+/usr/bin/fpaste
+/usr/share/doc/fpaste
+/usr/share/doc/fpaste/README.rst
+/usr/share/doc/fpaste/TODO
+/usr/share/licenses/fpaste
+/usr/share/licenses/fpaste/COPYING
+/usr/share/man/man1/fpaste.1.gz
+```
+
+安装 RPM 软件包后,`rpm` 工具可以知道具体哪些文件被添加到了系统中。因此,删除该软件包也会删除这些文件,并使系统保持一致状态。这就是为什么要尽可能地使用 `rpm` 安装软件,而不是从源代码安装软件的原因。
+
+### 依赖关系
+
+如今,完全独立的软件已经非常罕见。甚至 [fpaste][7],连这样一个简单的单个文件的 Python 脚本,都需要安装 Python 解释器。因此,如果系统未安装 Python(几乎不可能,但有可能),则无法使用 `fpaste`。用打包者的术语来说,“Python 是 `fpaste` 的**运行时依赖项**。”
+
+构建 RPM 软件包时(本文不讨论构建 RPM 的过程),生成的归档文件中包括了所有这些元数据。这样,与 RPM 软件包归档文件交互的工具就知道必须要安装其它的什么东西,以便 `fpaste` 可以正常工作:
+
+```
+$ rpm -q --requires fpaste
+/usr/bin/python3
+python3
+rpmlib(CompressedFileNames) <= 3.0.4-1
+rpmlib(FileDigests) <= 4.6.0-1
+rpmlib(PayloadFilesHavePrefix) <= 4.0-1
+rpmlib(PayloadIsXz) <= 5.2-1
+
+$ rpm -q --provides fpaste
+fpaste = 0.3.9.2-2.fc30
+
+$ rpm -qi python3
+Name : python3
+Version : 3.7.3
+Release : 3.fc30
+Architecture: x86_64
+Install Date: Thu 16 May 2019 18:51:41 BST
+Group : Unspecified
+Size : 46139
+License : Python
+Signature : RSA/SHA256, Sat 11 May 2019 17:02:44 BST, Key ID ef3c111fcfc659b9
+Source RPM : python3-3.7.3-3.fc30.src.rpm
+Build Date : Sat 11 May 2019 01:47:35 BST
+Build Host : buildhw-05.phx2.fedoraproject.org
+Relocations : (not relocatable)
+Packager : Fedora Project
+Vendor : Fedora Project
+URL : https://www.python.org/
+Bug URL : https://bugz.fedoraproject.org/python3
+Summary : Interpreter of the Python programming language
+Description :
+Python is an accessible, high-level, dynamically typed, interpreted programming
+language, designed with an emphasis on code readability.
+It includes an extensive standard library, and has a vast ecosystem of
+third-party libraries.
+
+The python3 package provides the "python3" executable: the reference
+interpreter for the Python language, version 3.
+The majority of its standard library is provided in the python3-libs package,
+which should be installed automatically along with python3.
+The remaining parts of the Python standard library are broken out into the
+python3-tkinter and python3-test packages, which may need to be installed
+separately.
+
+Documentation for Python is provided in the python3-docs package.
+
+Packages containing additional libraries for Python are generally named with
+the "python3-" prefix.
+
+$ rpm -q --provides python3
+python(abi) = 3.7
+python3 = 3.7.3-3.fc30
+python3(x86-64) = 3.7.3-3.fc30
+python3.7 = 3.7.3-3.fc30
+python37 = 3.7.3-3.fc30
+```
+
+### 解决 RPM 依赖关系
+
+虽然 `rpm` 知道每个归档文件所需的依赖关系,但不知道在哪里找到它们。这是设计使然:`rpm` 仅适用于本地文件,必须具体告知它们的位置。因此,如果你尝试安装单个 RPM 软件包,则 `rpm` 找不到该软件包的运行时依赖项时就会出错。本示例尝试安装从 Fedora 软件包集中下载的软件包:
+
+```
+$ ls
+python3-elephant-0.6.2-3.fc30.noarch.rpm
+
+$ rpm -qpi python3-elephant-0.6.2-3.fc30.noarch.rpm
+Name : python3-elephant
+Version : 0.6.2
+Release : 3.fc30
+Architecture: noarch
+Install Date: (not installed)
+Group : Unspecified
+Size : 2574456
+License : BSD
+Signature : (none)
+Source RPM : python-elephant-0.6.2-3.fc30.src.rpm
+Build Date : Fri 14 Jun 2019 17:23:48 BST
+Build Host : buildhw-02.phx2.fedoraproject.org
+Relocations : (not relocatable)
+Packager : Fedora Project
+Vendor : Fedora Project
+URL : http://neuralensemble.org/elephant
+Bug URL : https://bugz.fedoraproject.org/python-elephant
+Summary : Elephant is a package for analysis of electrophysiology data in Python
+Description :
+Elephant - Electrophysiology Analysis Toolkit Elephant is a package for the
+analysis of neurophysiology data, based on Neo.
+
+$ rpm -qp --requires python3-elephant-0.6.2-3.fc30.noarch.rpm
+python(abi) = 3.7
+python3.7dist(neo) >= 0.7.1
+python3.7dist(numpy) >= 1.8.2
+python3.7dist(quantities) >= 0.10.1
+python3.7dist(scipy) >= 0.14.0
+python3.7dist(six) >= 1.10.0
+rpmlib(CompressedFileNames) <= 3.0.4-1
+rpmlib(FileDigests) <= 4.6.0-1
+rpmlib(PartialHardlinkSets) <= 4.0.4-1
+rpmlib(PayloadFilesHavePrefix) <= 4.0-1
+rpmlib(PayloadIsXz) <= 5.2-1
+
+$ sudo rpm -i ./python3-elephant-0.6.2-3.fc30.noarch.rpm
+error: Failed dependencies:
+ python3.7dist(neo) >= 0.7.1 is needed by python3-elephant-0.6.2-3.fc30.noarch
+ python3.7dist(quantities) >= 0.10.1 is needed by python3-elephant-0.6.2-3.fc30.noarch
+```
+
+理论上,你可以下载 `python3-elephant` 所需的所有软件包,并告诉 `rpm` 它们都在哪里,但这并不方便。如果 `python3-neo` 和 `python3-quantities` 还有其它的运行时要求怎么办?很快,这种“依赖链”就会变得相当复杂。
+
+#### 存储库
+
+幸运的是,有了 `dnf` 和它的朋友们,可以帮助解决此问题。与 `rpm` 不同,`dnf` 能感知到**存储库**。存储库是程序包的集合,带有告诉 `dnf` 这些存储库包含什么内容的元数据。所有 Fedora 系统都带有默认启用的默认 Fedora 存储库:
+
+```
+$ sudo dnf repolist
+repo id repo name status
+fedora Fedora 30 - x86_64 56,582
+fedora-modular Fedora Modular 30 - x86_64 135
+updates Fedora 30 - x86_64 - Updates 8,573
+updates-modular Fedora Modular 30 - x86_64 - Updates 138
+updates-testing Fedora 30 - x86_64 - Test Updates 8,458
+```
+
+在 Fedora 快速文档中有[这些存储库][8]以及[如何管理][9]它们的更多信息。
+
+`dnf` 可用于查询存储库以获取有关它们包含的软件包信息。它还可以在这些存储库中搜索软件,或从中安装/卸载/升级软件包:
+
+```
+$ sudo dnf search elephant
+Last metadata expiration check: 0:05:21 ago on Sun 23 Jun 2019 14:33:38 BST.
+============================================================================== Name & Summary Matched: elephant ==============================================================================
+python3-elephant.noarch : Elephant is a package for analysis of electrophysiology data in Python
+python3-elephant.noarch : Elephant is a package for analysis of electrophysiology data in Python
+
+$ sudo dnf list \*elephant\*
+Last metadata expiration check: 0:05:26 ago on Sun 23 Jun 2019 14:33:38 BST.
+Available Packages
+python3-elephant.noarch 0.6.2-3.fc30 updates-testing
+python3-elephant.noarch 0.6.2-3.fc30 updates
+```
+
+#### 安装依赖项
+
+现在使用 `dnf` 安装软件包时,它将*解决*所有必需的依赖项,然后调用 `rpm` 执行该事务操作:
+
+```
+$ sudo dnf install python3-elephant
+Last metadata expiration check: 0:06:17 ago on Sun 23 Jun 2019 14:33:38 BST.
+Dependencies resolved.
+==============================================================================================================================================================================================
+ Package Architecture Version Repository Size
+==============================================================================================================================================================================================
+Installing:
+ python3-elephant noarch 0.6.2-3.fc30 updates-testing 456 k
+Installing dependencies:
+ python3-neo noarch 0.8.0-0.1.20190215git49b6041.fc30 fedora 753 k
+ python3-quantities noarch 0.12.2-4.fc30 fedora 163 k
+Installing weak dependencies:
+ python3-igor noarch 0.3-5.20150408git2c2a79d.fc30 fedora 63 k
+
+Transaction Summary
+==============================================================================================================================================================================================
+Install 4 Packages
+
+Total download size: 1.4 M
+Installed size: 7.0 M
+Is this ok [y/N]: y
+Downloading Packages:
+(1/4): python3-igor-0.3-5.20150408git2c2a79d.fc30.noarch.rpm 222 kB/s | 63 kB 00:00
+(2/4): python3-elephant-0.6.2-3.fc30.noarch.rpm 681 kB/s | 456 kB 00:00
+(3/4): python3-quantities-0.12.2-4.fc30.noarch.rpm 421 kB/s | 163 kB 00:00
+(4/4): python3-neo-0.8.0-0.1.20190215git49b6041.fc30.noarch.rpm 840 kB/s | 753 kB 00:00
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+Total 884 kB/s | 1.4 MB 00:01
+Running transaction check
+Transaction check succeeded.
+Running transaction test
+Transaction test succeeded.
+Running transaction
+ Preparing : 1/1
+ Installing : python3-quantities-0.12.2-4.fc30.noarch 1/4
+ Installing : python3-igor-0.3-5.20150408git2c2a79d.fc30.noarch 2/4
+ Installing : python3-neo-0.8.0-0.1.20190215git49b6041.fc30.noarch 3/4
+ Installing : python3-elephant-0.6.2-3.fc30.noarch 4/4
+ Running scriptlet: python3-elephant-0.6.2-3.fc30.noarch 4/4
+ Verifying : python3-elephant-0.6.2-3.fc30.noarch 1/4
+ Verifying : python3-igor-0.3-5.20150408git2c2a79d.fc30.noarch 2/4
+ Verifying : python3-neo-0.8.0-0.1.20190215git49b6041.fc30.noarch 3/4
+ Verifying : python3-quantities-0.12.2-4.fc30.noarch 4/4
+
+Installed:
+ python3-elephant-0.6.2-3.fc30.noarch python3-igor-0.3-5.20150408git2c2a79d.fc30.noarch python3-neo-0.8.0-0.1.20190215git49b6041.fc30.noarch python3-quantities-0.12.2-4.fc30.noarch
+
+Complete!
+```
+
+请注意,`dnf` 甚至还安装了`python3-igor`,而它不是 `python3-elephant` 的直接依赖项。
+
+### DnfDragora:DNF 的一个图形界面
+
+尽管技术用户可能会发现 `dnf` 易于使用,但并非所有人都这样认为。[Dnfdragora][10] 通过为 `dnf` 提供图形化前端来解决此问题。
+
+![dnfdragora (version 1.1.1-2 on Fedora 30) listing all the packages installed on a system.][11]
+
+从上面可以看到,dnfdragora 似乎提供了 `dnf` 的所有主要功能。
+
+Fedora 中还有其他工具也可以管理软件包,GNOME 的“软件”和“发现”就是其中两个。GNOME “软件”仅专注于图形应用程序。你无法使用这个图形化前端来安装命令行或终端工具,例如 `htop` 或 `weechat`。但是,GNOME “软件”支持安装 `dnf` 所不支持的 [Flatpak][12] 和 Snap 应用程序。它们是针对不同目标受众的不同工具,因此提供了不同的功能。
+
+这篇文章仅触及到了 Fedora 软件的生命周期的冰山一角。本文介绍了什么是 RPM 软件包,以及使用 `rpm` 和 `dnf` 的主要区别。
+
+在以后的文章中,我们将详细介绍:
+
+* 创建这些程序包所需的过程
+* 社区如何测试它们以确保它们正确构建
+* 社区用来将其给到社区用户的基础设施
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/rpm-packages-explained/
+
+作者:[Ankur Sinha "FranciscoD"][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/ankursinha/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2019/06/rpm.png-816x345.jpg
+[2]: https://docs.fedoraproject.org/en-US/project/#_what_is_fedora_all_about
+[3]: https://getfedora.org
+[4]: https://spins.fedoraproject.org/
+[5]: https://labs.fedoraproject.org/
+[6]: https://silverblue.fedoraproject.org/
+[7]: https://src.fedoraproject.org/rpms/fpaste
+[8]: https://docs.fedoraproject.org/en-US/quick-docs/repositories/
+[9]: https://docs.fedoraproject.org/en-US/quick-docs/adding-or-removing-software-repositories-in-fedora/
+[10]: https://src.fedoraproject.org/rpms/dnfdragora
+[11]: https://fedoramagazine.org/wp-content/uploads/2019/06/dnfdragora-1024x558.png
+[12]: https://fedoramagazine.org/getting-started-flatpak/
diff --git a/sources/tech/20190701 Learn how to Record and Replay Linux Terminal Sessions Activity.md b/published/201910/20190701 Learn how to Record and Replay Linux Terminal Sessions Activity.md
similarity index 54%
rename from sources/tech/20190701 Learn how to Record and Replay Linux Terminal Sessions Activity.md
rename to published/201910/20190701 Learn how to Record and Replay Linux Terminal Sessions Activity.md
index bf076d08ea..060ba6926a 100644
--- a/sources/tech/20190701 Learn how to Record and Replay Linux Terminal Sessions Activity.md
+++ b/published/201910/20190701 Learn how to Record and Replay Linux Terminal Sessions Activity.md
@@ -1,48 +1,50 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11429-1.html)
[#]: subject: (Learn how to Record and Replay Linux Terminal Sessions Activity)
[#]: via: (https://www.linuxtechi.com/record-replay-linux-terminal-sessions-activity/)
[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/)
-Learn how to Record and Replay Linux Terminal Sessions Activity
+在 Linux 上记录和重放终端会话活动
======
-Generally, all Linux administrators use **history** command to track which commands were executed in previous sessions, but there is one limitation of history command is that it doesn’t store the command’s output. There can be some scenarios where we want to check commands output of previous session and want to compare it with current session. Apart from this, there are some situations where we are troubleshooting the issues on Linux production boxes and want to save all terminal session activities for future reference, so in such cases script command become handy.
+通常,Linux 管理员们都使用 `history` 命令来跟踪在先前的会话中执行过哪些命令,但是 `history` 命令的局限性在于它不存储命令的输出。在某些情况下,我们要检查上一个会话的命令输出,并希望将其与当前会话进行比较。除此之外,在某些情况下,我们正在对 Linux 生产环境中的问题进行故障排除,并希望保存所有终端会话活动以供将来参考,因此在这种情况下,`script` 命令就变得很方便。
-
+
-Script is a command line tool which is used to capture or record your Linux server terminal sessions activity and later the recorded session can be replayed using scriptreplay command. In this article we will demonstrate how to install script command line tool and how to record Linux server terminal session activity and then later we will see how the recorded session can be replayed using **scriptreplay** command.
+`script` 是一个命令行工具,用于捕获/记录你的 Linux 服务器终端会话活动,以后可以使用 `scriptreplay` 命令重放记录的会话。在本文中,我们将演示如何安装 `script` 命令行工具以及如何记录 Linux 服务器终端会话活动,然后,我们将看到如何使用 `scriptreplay` 命令来重放记录的会话。
-### Installation of Script tool on RHEL 7/ CentOS 7
+### 安装 script 工具
-Script command is provided by the rpm package “**util-linux**”, in case it is not installed on your CentOS 7 / RHEL 7 system , run the following yum command,
+#### 在 RHEL 7/ CentOS 7 上安装 script 工具
+
+`script` 命令由 RPM 包 `util-linux` 提供,如果你没有在你的 CentOS 7 / RHEL 7 系统上安装它,运行下面的 `yum` 安装它:
```
[root@linuxtechi ~]# yum install util-linux -y
```
-**On RHEL 8 / CentOS 8**
+#### 在 RHEL 8 / CentOS 8 上安装 script 工具
-Run the following dnf command to install script utility on RHEL 8 and CentOS 8 system,
+运行下面的 `dnf` 命令来在 RHEL 8 / CentOS 8 上安装 `script` 工具:
```
[root@linuxtechi ~]# dnf install util-linux -y
```
-**Installation of Script tool on Debian based systems (Ubuntu / Linux Mint)**
+#### 在基于 Debian 的系统(Ubuntu / Linux Mint)上安装 script 工具
-Execute the beneath apt-get command to install script utility
+运行下面的 `apt-get` 命令来安装 `script` 工具:
```
root@linuxtechi ~]# apt-get install util-linux -y
```
-### How to Use script utility
+### 如何使用 script 工具
-Use of script command is straight forward, type script command on terminal then hit enter, it will start capturing your current terminal session activities inside a file called “**typescript**”
+直接使用 `script` 命令,在终端上键入 `script` 命令,然后按回车,它将开始在名为 `typescript` 的文件中捕获当前的终端会话活动。
```
[root@linuxtechi ~]# script
@@ -50,7 +52,7 @@ Script started, file is typescript
[root@linuxtechi ~]#
```
-To stop recording the session activities, type exit command and hit enter.
+要停止记录会话活动,请键入 `exit` 命令,然后按回车:
```
[root@linuxtechi ~]# exit
@@ -59,23 +61,23 @@ Script done, file is typescript
[root@linuxtechi ~]#
```
-Syntax of Script command:
+`script` 命令的语法格式:
```
-~ ] # script {options} {file_name}
+~] # script {options} {file_name}
```
-Different options used in script command,
+能在 `script` 命令中使用的不同选项:
![options-script-command][1]
-Let’s start recording of your Linux terminal session by executing script command and then execute couple of command like ‘**w**’, ‘**route -n**’ , ‘[**df -h**][2]’ and ‘**free-h**’, example is shown below
+让我们开始通过执行 `script` 命令来记录 Linux 终端会话,然后执行诸如 `w`,`route -n`,`df -h` 和 `free -h`,示例如下所示:
![script-examples-linux-server][3]
-As we can see above, terminal session logs are saved in the file “typescript”
+正如我们在上面看到的,终端会话日志保存在文件 `typescript` 中:
-Now view the contents of typescript file using [cat][4] / vi command,
+现在使用 `cat` / `vi` 命令查看 `typescript` 文件的内容,
```
[root@linuxtechi ~]# ls -l typescript
@@ -85,11 +87,11 @@ Now view the contents of typescript file using [cat][4] / vi command,
![typescript-file-content-linux][5]
-Above confirms that whatever commands we execute on terminal that have been saved inside the file “typescript”
+以上内容确认了我们在终端上执行的所有命令都已保存在 `typescript` 文件中。
-### Use Custom File name in script command
+### 在 script 命令中使用定制文件名
-Let’s assume we want to use our customize file name to script command, so specify the file name after script command, in the below example we are using a file name “session-log-(current-date-time).txt”
+假设我们要使用自定义文件名来执行 `script` 命令,可以在 `script` 命令后指定文件名。在下面的示例中,我们使用的文件名为 `session-log-(当前日期时间).txt`。
```
[root@linuxtechi ~]# script sessions-log-$(date +%d-%m-%Y-%T).txt
@@ -97,7 +99,7 @@ Script started, file is sessions-log-21-06-2019-01:37:39.txt
[root@linuxtechi ~]#
```
-Now run the commands and then type exit,
+现在运行该命令并输入 `exit`:
```
[root@linuxtechi ~]# exit
@@ -106,9 +108,9 @@ Script done, file is sessions-log-21-06-2019-01:37:39.txt
[root@linuxtechi ~]#
```
-### Append the commands output to script file
+### 附加命令输出到 script 记录文件
-Let assume script command had already recorded the commands output to a file called session-log.txt file and now we want to append output of new sessions commands output to this file, then use “**-a**” command in script command
+假设 `script` 命令已经将命令输出记录到名为 `session-log.txt` 的文件中,现在我们想将新会话命令的输出附加到该文件中,那么可以在 `script` 命令中使用 `-a` 选项。
```
[root@linuxtechi ~]# script -a sessions-log.txt
@@ -129,11 +131,11 @@ Script done, file is sessions-log.txt
[root@linuxtechi ~]#
```
-To view updated session’s logs, use “cat session-log.txt ”
+要查看更新的会话记录,使用 `cat session-log.txt` 命令。
-### Capture commands output to script file without interactive shell
+### 无需 shell 交互而捕获命令输出到 script 记录文件
-Let’s assume we want to capture commands output to a script file, then use **-c** option, example is shown below,
+假设我们要捕获命令的输出到会话记录文件,那么使用 `-c` 选项,示例如下所示:
```
[root@linuxtechi ~]# script -c "uptime && hostname && date" root-session.txt
@@ -145,9 +147,9 @@ Script done, file is root-session.txt
[root@linuxtechi ~]#
```
-### Run script command in quiet mode
+### 以静默模式运行 script 命令
-To run script command in quiet mode use **-q** option, this option will suppress the script started and script done message, example is shown below,
+要以静默模式运行 `script` 命令,请使用 `-q` 选项,该选项将禁止 `script` 的启动和完成消息,示例如下所示:
```
[root@linuxtechi ~]# script -c "uptime && date" -q root-session.txt
@@ -156,11 +158,13 @@ Fri Jun 21 02:01:10 EDT 2019
[root@linuxtechi ~]#
```
-Record Timing information to a file and capture commands output to a separate file, this can be achieved in script command by passing timing file (**–timing**) , example is shown below,
+要将时序信息记录到文件中并捕获命令输出到单独的文件中,这可以通过在 `script` 命令中传递时序文件(`-timing`)实现,示例如下所示:
-Syntax:
+语法格式:
-~ ]# script -t <timing-file-name> {file_name}
+```
+~ ]# script -t {file_name}
+```
```
[root@linuxtechi ~]# script --timing=timing.txt session.log
@@ -185,23 +189,23 @@ Script done, file is session.log
[root@linuxtechi ~]#
```
-### Replay recorded Linux terminal session activity
+### 重放记录的 Linux 终端会话活动
-Now replay the recorded terminal session activities using scriptreplay command,
+现在,使用 `scriptreplay` 命令重放录制的终端会话活动。
-**Note:** Scriptreplay is also provided by rpm package “**util-linux**”. Scriptreplay command requires timing file to work.
+注意:`scriptreplay` 也由 RPM 包 `util-linux` 提供。`scriptreplay` 命令需要时序文件才能工作。
```
[root@linuxtechi ~]# scriptreplay --timing=timing.txt session.log
```
-Output of above command would be something like below,
+上面命令的输出将如下所示,
-
+
-### Record all User’s Linux terminal session activities
+### 记录所有用户的 Linux 终端会话活动
-There are some business critical Linux servers where we want keep track on all users activity, so this can be accomplished using script command, place the following content in /etc/profile file ,
+在某些关键业务的 Linux 服务器上,我们希望跟踪所有用户的活动,这可以使用 `script` 命令来完成,将以下内容放在 `/etc/profile` 文件中,
```
[root@linuxtechi ~]# vi /etc/profile
@@ -218,22 +222,22 @@ fi
……………………………………………………
```
-Save & exit the file.
+保存文件并退出。
-Create the session directory under /var/log folder,
+在 `/var/log` 文件夹下创建 `session` 目录:
```
[root@linuxtechi ~]# mkdir /var/log/session
```
-Assign the permissions to session folder,
+给该文件夹指定权限:
```
[root@linuxtechi ~]# chmod 777 /var/log/session/
[root@linuxtechi ~]#
```
-Now verify whether above code is working or not. Login to ordinary user to linux server, in my I am using pkumar user,
+现在,验证以上代码是否有效。在我正在使用 `pkumar` 用户的情况下,登录普通用户到 Linux 服务器:
```
~ ] # ssh root@linuxtechi
@@ -263,13 +267,13 @@ Login as root and view user’s linux terminal session activity
![Session-output-file-linux][6]
-We can also use scriptreplay command to replay user’s terminal session activities,
+我们还可以使用 `scriptreplay` 命令来重放用户的终端会话活动:
```
[root@linuxtechi session]# scriptreplay --timing session.pkumar.19785.21-06-2019-04\:34\:05.timing session.pkumar.19785.21-06-2019-04\:34\:05
```
-That’s all from this tutorial, please do share your feedback and comments in the comments section below.
+以上就是本教程的全部内容,请在下面的评论部分中分享你的反馈和评论。
--------------------------------------------------------------------------------
@@ -277,8 +281,8 @@ via: https://www.linuxtechi.com/record-replay-linux-terminal-sessions-activity/
作者:[Pradeep Kumar][a]
选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/published/201910/20190719 Buying a Linux-ready laptop.md b/published/201910/20190719 Buying a Linux-ready laptop.md
new file mode 100644
index 0000000000..91fdeab1ab
--- /dev/null
+++ b/published/201910/20190719 Buying a Linux-ready laptop.md
@@ -0,0 +1,82 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11436-1.html)
+[#]: subject: (Buying a Linux-ready laptop)
+[#]: via: (https://opensource.com/article/19/7/linux-laptop)
+[#]: author: (Ricardo Berlasso https://opensource.com/users/rgb-es)
+
+我买了一台 Linux 笔记本
+======
+
+> Tuxedo 让买一台开箱即用的 Linux 笔记本变得容易。
+
+
+
+最近,我开始使用我买的 Linux 笔记本计算机 Tuxedo Book BC1507。十年前,如果有人告诉我,十年后我可以从 [System76][2]、[Slimbook][3] 和 [Tuxedo][4] 等公司购买到高质量的“企鹅就绪”的笔记本电脑。我可能会发笑。好吧,现在我也在笑,但是很开心!
+
+除了为免费/自由开源软件(FLOSS)设计计算机之外,这三家公司最近[宣布][5]都试图通过切换到[Coreboot][6]来消除专有的 BIOS 软件。
+
+### 买一台
+
+Tuxedo Computers 是一家德国公司,生产支持 Linux 的笔记本电脑。实际上,如果你要使用其他的操作系统,则它的价格会更高。
+
+购买他们的计算机非常容易。Tuxedo 提供了许多付款方式:不仅包括信用卡,而且还包括 PayPal 甚至银行转帐(LCTT 译注:我们需要支付宝和微信支付……此外,要国际配送,还需要支付运输费和清关费用等)。只需在 Tuxedo 的网页上填写银行转帐表格,公司就会给你发送银行信息。
+
+Tuxedo 可以按需构建每台计算机,只需选择基本模型并浏览下拉菜单以选择不同的组件,即可轻松准确地选择所需内容。页面上有很多信息可以指导你进行购买。
+
+如果你选择的 Linux 发行版与推荐的发行版不同,则 Tuxedo 会进行“网络安装”,因此请准备好网络电缆以完成安装,也可以将你首选的镜像文件刻录到 USB 盘上。我通过外部 DVD 阅读器来安装刻录了 openSUSE Leap 15.1 安装程序的 DVD,但是你可用你自己的方式。
+
+我选择的型号最多可以容纳两个磁盘:一个 SSD,另一个可以是 SSD 或常规硬盘。由于已经超出了我的预算,因此我决定选择传统的 1TB 磁盘并将 RAM 增加到 16GB。该处理器是具有四个内核的第八代 i5。我选择了背光西班牙语键盘、1920×1080/96dpi 屏幕和 SD 卡读卡器。总而言之,这是一个很棒的系统。
+
+如果你对默认的英语或德语键盘感觉满意,甚至可以要求在 Meta 键上印上一个企鹅图标!我需要的西班牙语键盘则不提供此选项。
+
+### 收货并开箱使用
+
+付款完成后仅六个工作日,完好包装的计算机就十分安全地到达了我家。打开计算机包装并解锁电池后,我准备好开始浪了。
+
+![Tuxedo Book BC1507][7]
+
+*我的(物理)桌面上的新玩具。*
+
+该电脑的设计确实很棒,而且感觉扎实。即使此型号的外壳不是铝制的(LCTT 译注:他们有更好看的铝制外壳的型号),也可以保持凉爽。风扇真的很安静,气流像许多其他笔记本电脑一样导向后边缘,而不是流向侧面。电池可提供数小时的续航时间。BIOS 中的一个名为 FlexiCharger 的选项会在达到一定百分比后停止为电池充电,因此在插入电源长时间工作时,无需卸下电池。
+
+键盘真的很舒适,而且非常安静。甚至触摸板按键也很安静!另外,你可以轻松调整背光键盘上的光强度。
+
+最后,很容易访问笔记本电脑中的每个组件,因此可以毫无问题地对计算机进行更新或维修。Tuxedo 甚至送了几个备用螺丝!
+
+### 结语
+
+经过一个月的频繁使用,我对该系统感到非常满意。它完全满足了我的要求,并且一切都很完美。
+
+因为它们通常是高端系统,所以包含 Linux 的计算机往往比较昂贵。如果你将 Tuxedo 或 Slimbook 电脑的价格与更知名品牌的类似规格的价格进行比较,价格相差无几。如果你想要一台使用自由软件的强大系统,请毫不犹豫地支持这些公司:他们所提供的物有所值。
+
+请在评论中让我们知道你在 Tuxedo 和其他“企鹅友好”公司的经历。
+
+* * *
+
+本文基于 Ricardo 的博客 [From Mind to Type][9] 上发表的“ [我的新企鹅笔记本电脑:Tuxedo-Book-BC1507][8]”。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/7/linux-laptop
+
+作者:[Ricardo Berlasso][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/rgb-es
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_penguin_green.png?itok=ENdVzW22 (Penguin with green background)
+[2]: https://system76.com/
+[3]: https://slimbook.es/en/
+[4]: https://www.tuxedocomputers.com/
+[5]: https://www.tuxedocomputers.com/en/Infos/News/Tuxedo-Computers-stands-for-Free-Software-and-Security-.tuxedo
+[6]: https://coreboot.org/
+[7]: https://opensource.com/sites/default/files/uploads/tuxedo-600_0.jpg (Tuxedo Book BC1507)
+[8]: https://frommindtotype.wordpress.com/2019/06/17/my-new-penguin-ready-laptop-tuxedo-book-bc1507/
+[9]: https://frommindtotype.wordpress.com/
diff --git a/published/201910/20190805 How to Install and Configure PostgreSQL on Ubuntu.md b/published/201910/20190805 How to Install and Configure PostgreSQL on Ubuntu.md
new file mode 100644
index 0000000000..e89257812d
--- /dev/null
+++ b/published/201910/20190805 How to Install and Configure PostgreSQL on Ubuntu.md
@@ -0,0 +1,257 @@
+[#]: collector: (lujun9972)
+[#]: translator: (lnrCoder)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11480-1.html)
+[#]: subject: (How to Install and Configure PostgreSQL on Ubuntu)
+[#]: via: (https://itsfoss.com/install-postgresql-ubuntu/)
+[#]: author: (Sergiu https://itsfoss.com/author/sergiu/)
+
+如何在 Ubuntu 上安装和配置 PostgreSQL
+======
+
+> 本教程中,你将学习如何在 Ubuntu Linux 上安装和使用开源数据库 PostgreSQL。
+
+[PostgreSQL][1] (又名 Postgres) 是一个功能强大的自由开源的关系型数据库管理系统 ([RDBMS][2]) ,其在可靠性、稳定性、性能方面获得了业内极高的声誉。它旨在处理各种规模的任务。它是跨平台的,而且是 [macOS Server][3] 的默认数据库。
+
+如果你喜欢简单易用的 SQL 数据库管理器,那么 PostgreSQL 将是一个正确的选择。PostgreSQL 对标准的 SQL 兼容的同时提供了额外的附加特性,同时还可以被用户大量扩展,用户可以添加数据类型、函数并执行更多的操作。
+
+之前我曾论述过 [在 Ubuntu 上安装 MySQL][4]。在本文中,我将向你展示如何安装和配置 PostgreSQL,以便你随时可以使用它来满足你的任何需求。
+
+![][5]
+
+### 在 Ubuntu 上安装 PostgreSQL
+
+PostgreSQL 可以从 Ubuntu 主存储库中获取。然而,和许多其它开发工具一样,它可能不是最新版本。
+
+首先在终端中使用 [apt 命令][7] 检查 [Ubuntu 存储库][6] 中可用的 PostgreSQL 版本:
+
+```
+apt show postgresql
+```
+
+在我的 Ubuntu 18.04 中,它显示 PostgreSQL 的可用版本是 10(10+190 表示版本 10)而 PostgreSQL 版本 11 已经发布。
+
+```
+Package: postgresql
+Version: 10+190
+Priority: optional
+Section: database
+Source: postgresql-common (190)
+Origin: Ubuntu
+```
+
+根据这些信息,你可以自主决定是安装 Ubuntu 提供的版本还是还是获取 PostgreSQL 的最新发行版。
+
+我将向你介绍这两种方法:
+
+#### 方法一:通过 Ubuntu 存储库安装 PostgreSQL
+
+在终端中,使用以下命令安装 PostgreSQL:
+
+```
+sudo apt update
+sudo apt install postgresql postgresql-contrib
+```
+
+根据提示输入你的密码,依据于你的网速情况,程序将在几秒到几分钟安装完成。说到这一点,随时检查 [Ubuntu 中的各种网络带宽][8]。
+
+> 什么是 postgresql-contrib?
+
+> postgresql-contrib 或者说 contrib 包,包含一些不属于 PostgreSQL 核心包的实用工具和功能。在大多数情况下,最好将 contrib 包与 PostgreSQL 核心一起安装。
+
+#### 方法二:在 Ubuntu 中安装最新版本的 PostgreSQL 11
+
+要安装 PostgreSQL 11, 你需要在 `sources.list` 中添加官方 PostgreSQL 存储库和证书,然后从那里安装它。
+
+不用担心,这并不复杂。 只需按照以下步骤。
+
+首先添加 GPG 密钥:
+
+```
+wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
+```
+
+现在,使用以下命令添加存储库。如果你使用的是 Linux Mint,则必须手动替换你的 Mint 所基于的 Ubuntu 版本号:
+
+```
+sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" >> /etc/apt/sources.list.d/pgdg.list'
+```
+
+现在一切就绪。使用以下命令安装 PostgreSQL:
+
+```
+sudo apt update
+sudo apt install postgresql postgresql-contrib
+```
+
+> PostgreSQL GUI 应用程序
+
+> 你也可以安装用于管理 PostgreSQL 数据库的 GUI 应用程序(pgAdmin):
+
+> `sudo apt install pgadmin4`
+
+### PostgreSQL 配置
+
+你可以通过执行以下命令来检查 PostgreSQL 是否正在运行:
+
+```
+service postgresql status
+```
+
+通过 `service` 命令,你可以启动、关闭或重启 `postgresql`。输入 `service postgresql` 并按回车将列出所有选项。现在,登录该用户。
+
+默认情况下,PostgreSQL 会创建一个拥有所权限的特殊用户 `postgres`。要实际使用 PostgreSQL,你必须先登录该账户:
+
+```
+sudo su postgres
+```
+
+你的提示符会更改为类似于以下的内容:
+
+```
+postgres@ubuntu-VirtualBox:/home/ubuntu$
+```
+
+现在,使用 `psql` 来启动 PostgreSQL Shell:
+
+```
+psql
+```
+
+你应该会看到如下提示符:
+
+```
+postgress=#
+```
+
+你可以输入 `\q` 以退出,输入 `\?` 获取帮助。
+
+要查看现有的所有表,输入如下命令:
+
+```
+\l
+```
+
+输出内容类似于下图所示(单击 `q` 键退出该视图):
+
+![PostgreSQL Tables][10]
+
+使用 `\du` 命令,你可以查看 PostgreSQL 用户:
+
+![PostgreSQLUsers][11]
+
+你可以使用以下命令更改任何用户(包括 `postgres`)的密码:
+
+```
+ALTER USER postgres WITH PASSWORD 'my_password';
+```
+
+**注意:**将 `postgres` 替换为你要更改的用户名,`my_password` 替换为所需要的密码。另外,不要忘记每条命令后面的 `;`(分号)。
+
+建议你另外创建一个用户(不建议使用默认的 `postgres` 用户)。为此,请使用以下命令:
+
+```
+CREATE USER my_user WITH PASSWORD 'my_password';
+```
+
+运行 `\du`,你将看到该用户,但是,`my_user` 用户没有任何的属性。来让我们给它添加超级用户权限:
+
+```
+ALTER USER my_user WITH SUPERUSER;
+```
+
+你可以使用以下命令删除用户:
+
+```
+DROP USER my_user;
+```
+
+要使用其他用户登录,使用 `\q` 命令退出,然后使用以下命令登录:
+
+```
+psql -U my_user
+```
+
+你可以使用 `-d` 参数直接连接数据库:
+
+```
+psql -U my_user -d my_db
+```
+
+你可以使用其他已存在的用户调用 PostgreSQL。例如,我使用 `ubuntu`。要登录,从终端执行以下命名:
+
+```
+psql -U ubuntu -d postgres
+```
+
+**注意:**你必须指定一个数据库(默认情况下,它将尝试将你连接到与登录的用户名相同的数据库)。
+
+如果遇到如下错误:
+
+```
+psql: FATAL: Peer authentication failed for user "my_user"
+```
+
+确保以正确的用户身份登录,并使用管理员权限编辑 `/etc/postgresql/11/main/pg_hba.conf`:
+
+```
+sudo vim /etc/postgresql/11/main/pg_hba.conf
+```
+
+**注意:**用你的版本替换 `11`(例如 `10`)。
+
+对如下所示的一行进行替换:
+
+```
+local all postgres peer
+```
+
+替换为:
+
+```
+local all postgres md5
+```
+
+然后重启 PostgreSQL:
+
+```
+sudo service postgresql restart
+```
+
+使用 PostgreSQL 与使用其他 SQL 类型的数据库相同。由于本文旨在帮助你进行初步的设置,因此不涉及具体的命令。不过,这里有个 [非常有用的要点][12] 可供参考! 另外, 手册(`man psql`)和 [文档][13] 也非常有用。
+
+### 总结
+
+阅读本文有望指导你完成在 Ubuntu 系统上安装和准备 PostgreSQL 的过程。如果你不熟悉 SQL,你应该阅读 [基本的 SQL 命令][15]。
+
+如果你有任何问题或疑惑,请随时在评论部分提出。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/install-postgresql-ubuntu/
+
+作者:[Sergiu][a]
+选题:[lujun9972][b]
+译者:[lnrCoder](https://github.com/lnrCoder)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/sergiu/
+[b]: https://github.com/lujun9972
+[1]: https://www.postgresql.org/
+[2]: https://www.codecademy.com/articles/what-is-rdbms-sql
+[3]: https://www.apple.com/in/macos/server/
+[4]: https://itsfoss.com/install-mysql-ubuntu/
+[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-postgresql-ubuntu.png?resize=800%2C450&ssl=1
+[6]: https://itsfoss.com/ubuntu-repositories/
+[7]: https://itsfoss.com/apt-command-guide/
+[8]: https://itsfoss.com/network-speed-monitor-linux/
+[9]: https://itsfoss.com/fix-gvfsd-smb-high-cpu-ubuntu/
+[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/07/postgresql_tables.png?fit=800%2C303&ssl=1
+[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/07/postgresql_users.png?fit=800%2C244&ssl=1
+[12]: https://gist.github.com/Kartones/dd3ff5ec5ea238d4c546
+[13]: https://www.postgresql.org/docs/manuals/
+[14]: https://itsfoss.com/sync-any-folder-with-dropbox/
+[15]: https://itsfoss.com/basic-sql-commands/
diff --git a/published/201910/20190809 Mutation testing is the evolution of TDD.md b/published/201910/20190809 Mutation testing is the evolution of TDD.md
new file mode 100644
index 0000000000..475673d8b5
--- /dev/null
+++ b/published/201910/20190809 Mutation testing is the evolution of TDD.md
@@ -0,0 +1,273 @@
+[#]: collector: (lujun9972)
+[#]: translator: (Morisun029)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11468-1.html)
+[#]: subject: (Mutation testing is the evolution of TDD)
+[#]: via: (https://opensource.com/article/19/8/mutation-testing-evolution-tdd)
+[#]: author: (Alex Bunardzic https://opensource.com/users/alex-bunardzic)
+
+变异测试是测试驱动开发(TDD)的演变
+======
+
+> 测试驱动开发技术是根据大自然的运作规律创建的,变异测试自然成为 DevOps 演变的下一步。
+
+![Ants and a leaf making the word "open"][1]
+
+在 “[故障是无懈可击的开发运维中的一个特点][2]”,我讨论了故障在通过征求反馈来交付优质产品的过程中所起到的重要作用。敏捷 DevOps 团队就是用故障来指导他们并推动开发进程的。[测试驱动开发][3](TDD)是任何敏捷 DevOps 团队评估产品交付的[必要条件][4]。以故障为中心的 TDD 方法仅在与可量化的测试配合使用时才有效。
+
+TDD 方法仿照大自然是如何运作的以及自然界在进化博弈中是如何产生赢家和输家为模型而建立的。
+
+### 自然选择
+
+![查尔斯·达尔文][5]
+
+1859 年,[查尔斯·达尔文][6]在他的《[物种起源][7]》一书中提出了进化论学说。达尔文的论点是,自然变异是由生物个体的自发突变和环境压力共同造成的。环境压力淘汰了适应性较差的生物体,而有利于其他适应性强的生物的发展。每个生物体的染色体都会发生变异,而这些自发的变异会携带给下一代(后代)。然后在自然选择下测试新出现的变异性 —— 当下存在的环境压力是由变异性的环境条件所导致的。
+
+这张简图说明了调整适应环境条件的过程。
+
+![环境压力对鱼类的影响][8]
+
+*图1. 不同的环境压力导致自然选择下的不同结果。图片截图来源于[理查德·道金斯的一个视频][9]。*
+
+该图显示了一群生活在自己栖息地的鱼。栖息地各不相同(海底或河床底部的砾石颜色有深有浅),每条鱼长的也各不相同(鱼身图案和颜色也有深有浅)。
+
+这张图还显示了两种情况(即环境压力的两种变化):
+
+ 1. 捕食者在场
+ 2. 捕食者不在场
+
+在第一种情况下,在砾石颜色衬托下容易凸显出来的鱼被捕食者捕获的风险更高。当砾石颜色较深时,浅色鱼的数量会更少一些。反之亦然,当砾石颜色较浅时,深色鱼的数量会更少。
+
+在第二种情况下,鱼完全放松下来进行交配。在没有捕食者和没有交配仪式的情况下,可以预料到相反的结果:在砾石背景下显眼的鱼会有更大的机会被选来交配并将其特性传递给后代。
+
+### 选择标准
+
+变异性在进行选择时,绝不是任意的、反复无常的、异想天开的或随机的。选择过程中的决定性因素通常是可以度量的。该决定性因素通常称为测试或目标。
+
+一个简单的数学例子可以说明这一决策过程。(在该示例中,这种选择不是由自然选择决定的,而是由人为选择决定。)假设有人要求你构建一个小函数,该函数将接受一个正数,然后计算该数的平方根。你将怎么做?
+
+敏捷 DevOps 团队的方法是快速验证失败。谦虚一点,先承认自己并不真的知道如何开发该函数。这时,你所知道的就是如何描述你想做的事情。从技术上讲,你已准备好进行单元测试。
+
+“单元测试”描述了你的具体期望结果是什么。它可以简单地表述为“给定数字 16,我希望平方根函数返回数字 4”。你可能知道 16 的平方根是 4。但是,你不知道一些较大数字(例如 533)的平方根。
+
+但至少,你已经制定了选择标准,即你的测试或你的期望值。
+
+### 进行故障测试
+
+[.NET Core][10] 平台可以演示该测试。.NET 通常使用 xUnit.net 作为单元测试框架。(要跟随进行这个代码示例,请安装 .NET Core 和 xUnit.net。)
+
+打开命令行并创建一个文件夹,在该文件夹实现平方根解决方案。例如,输入:
+
+```
+mkdir square_root
+```
+
+再输入:
+
+```
+cd square_root
+```
+
+为单元测试创建一个单独的文件夹:
+
+```
+mkdir unit_tests
+```
+
+进入 `unit_tests` 文件夹下(`cd unit_tests`),初始化 xUnit 框架:
+
+```
+dotnet new xunit
+```
+
+现在,转到 `square_root` 下, 创建 `app` 文件夹:
+
+```
+mkdir app
+cd app
+```
+
+如果有必要的话,为你的代码创建一个脚手架:
+
+```
+dotnet new classlib
+```
+
+现在打开你最喜欢的编辑器开始编码!
+
+在你的代码编辑器中,导航到 `unit_tests` 文件夹,打开 `UnitTest1.cs`。
+
+将 `UnitTest1.cs` 中自动生成的代码替换为:
+
+```
+using System;
+using Xunit;
+using app;
+
+namespace unit_tests{
+
+ public class UnitTest1{
+ Calculator calculator = new Calculator();
+
+ [Fact]
+ public void GivenPositiveNumberCalculateSquareRoot(){
+ var expected = 4;
+ var actual = calculator.CalculateSquareRoot(16);
+ Assert.Equal(expected, actual);
+ }
+ }
+}
+```
+
+该单元测试描述了变量的**期望值**应该为 4。下一行描述了**实际值**。建议通过将输入值发送到称为`calculator` 的组件来计算**实际值**。对该组件的描述是通过接收数值来处理`CalculateSquareRoot` 信息。该组件尚未开发。但这并不重要,我们在此只是描述期望值。
+
+最后,描述了触发消息发送时发生的情况。此时,判断**期望值**是否等于**实际值**。如果是,则测试通过,目标达成。如果**期望值**不等于**实际值**,则测试失败。
+
+接下来,要实现称为 `calculator` 的组件,在 `app` 文件夹中创建一个新文件,并将其命名为`Calculator.cs`。要实现计算平方根的函数,请在此新文件中添加以下代码:
+
+```
+namespace app {
+ public class Calculator {
+ public double CalculateSquareRoot(double number) {
+ double bestGuess = number;
+ return bestGuess;
+ }
+ }
+}
+```
+
+在测试之前,你需要通知单元测试如何找到该新组件(`Calculator`)。导航至 `unit_tests` 文件夹,打开 `unit_tests.csproj` 文件。在 `` 代码块中添加以下代码:
+
+```
+
+```
+
+保存 `unit_test.csproj` 文件。现在,你可以运行第一个测试了。
+
+切换到命令行,进入 `unit_tests` 文件夹。运行以下命令:
+
+```
+dotnet test
+```
+
+运行单元测试,会输出以下内容:
+
+![单元测试失败后xUnit的输出结果][12]
+
+*图2. 单元测试失败后 xUnit 的输出结果*
+
+正如你所看到的,单元测试失败了。期望将数字 16 发送到 `calculator` 组件后会输出数字 4,但是输出(`Actual`)的是 16。
+
+恭喜你!创建了第一个故障。单元测试为你提供了强有力的反馈机制,敦促你修复故障。
+
+### 修复故障
+
+要修复故障,你必须要改进 `bestGuess`。当下,`bestGuess` 仅获取函数接收的数字并返回。这不够好。
+
+但是,如何找到一种计算平方根值的方法呢? 我有一个主意 —— 看一下大自然母亲是如何解决问题的。
+
+### 效仿大自然的迭代
+
+在第一次(也是唯一的)尝试中要得出正确值是非常难的(几乎不可能)。你必须允许自己进行多次尝试猜测,以增加解决问题的机会。允许多次尝试的一种方法是进行迭代。
+
+要迭代,就要将 `bestGuess` 值存储在 `previousGuess` 变量中,转换 `bestGuess` 的值,然后比较两个值之间的差。如果差为 0,则说明问题已解决。否则,继续迭代。
+
+这是生成任何正数的平方根的函数体:
+
+```
+double bestGuess = number;
+double previousGuess;
+
+do {
+ previousGuess = bestGuess;
+ bestGuess = (previousGuess + (number/previousGuess))/2;
+} while((bestGuess - previousGuess) != 0);
+
+return bestGuess;
+```
+
+该循环(迭代)将 `bestGuess` 值集中到设想的解决方案。现在,你精心设计的单元测试通过了!
+
+![单元测试通过了][13]
+
+*图 3. 单元测试通过了。*
+
+### 迭代解决了问题
+
+正如大自然母亲解决问题的方法,在本练习中,迭代解决了问题。增量方法与逐步改进相结合是获得满意解决方案的有效方法。该示例中的决定性因素是具有可衡量的目标和测试。一旦有了这些,就可以继续迭代直到达到目标。
+
+### 关键点!
+
+好的,这是一个有趣的试验,但是更有趣的发现来自于使用这种新创建的解决方案。到目前为止,`bestGuess` 从开始一直把函数接收到的数字作为输入参数。如果更改 `bestGuess` 的初始值会怎样?
+
+为了测试这一点,你可以测试几种情况。 首先,在迭代多次尝试计算 25 的平方根时,要逐步细化观察结果:
+
+![25 平方根的迭代编码][14]
+
+*图 4. 通过迭代来计算 25 的平方根。*
+
+以 25 作为 `bestGuess` 的初始值,该函数需要八次迭代才能计算出 25 的平方根。但是,如果在设计 `bestGuess` 初始值上犯下荒谬的错误,那将怎么办? 尝试第二次,那 100 万可能是 25 的平方根吗? 在这种明显错误的情况下会发生什么?你写的函数是否能够处理这种低级错误。
+
+直接来吧。回到测试中来,这次以一百万开始:
+
+![逐步求精法][15]
+
+*图 5. 在计算 25 的平方根时,运用逐步求精法,以 100 万作为 bestGuess 的初始值。*
+
+哇! 以一个荒谬的数字开始,迭代次数仅增加了两倍(从八次迭代到 23 次)。增长幅度没有你直觉中预期的那么大。
+
+### 故事的寓意
+
+啊哈! 当你意识到,迭代不仅能够保证解决问题,而且与你的解决方案的初始猜测值是好是坏也没有关系。 不论你最初理解得多么不正确,迭代过程以及可衡量的测试/目标,都可以使你走上正确的道路并得到解决方案。
+
+图 4 和 5 显示了陡峭而戏剧性的燃尽图。一个非常错误的开始,迭代很快就产生了一个绝对正确的解决方案。
+
+简而言之,这种神奇的方法就是敏捷 DevOps 的本质。
+
+### 回到一些更深层次的观察
+
+敏捷 DevOps 的实践源于人们对所生活的世界的认知。我们生活的世界存在不确定性、不完整性以及充满太多的困惑。从科学/哲学的角度来看,这些特征得到了[海森堡的不确定性原理][16](涵盖不确定性部分),[维特根斯坦的逻辑论哲学][17](歧义性部分),[哥德尔的不完全性定理][18](不完全性方面)以及[热力学第二定律][19](无情的熵引起的混乱)的充分证明和支持。
+
+简而言之,无论你多么努力,在尝试解决任何问题时都无法获得完整的信息。因此,放下傲慢的姿态,采取更为谦虚的方法来解决问题对我们会更有帮助。谦卑会给为你带来巨大的回报,这个回报不仅是你期望的一个解决方案,还会有它的副产品。
+
+### 总结
+
+大自然在不停地运作,这是一个持续不断的过程。大自然没有总体规划。一切都是对先前发生的事情的回应。 反馈循环是非常紧密的,明显的进步/倒退都是逐步实现的。大自然中随处可见,任何事物的都在以一种或多种形式逐步完善。
+
+敏捷 DevOps 是工程模型逐渐成熟的一个非常有趣的结果。DevOps 基于这样的认识,即你所拥有的信息总是不完整的,因此你最好谨慎进行。获得可衡量的测试(例如,假设、可测量的期望结果),进行简单的尝试,大多数情况下可能失败,然后收集反馈,修复故障并继续测试。除了同意每个步骤都必须要有可衡量的假设/测试之外,没有其他方法。
+
+在本系列的下一篇文章中,我将仔细研究变异测试是如何提供及时反馈来推动实现结果的。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/8/mutation-testing-evolution-tdd
+
+作者:[Alex Bunardzic][a]
+选题:[lujun9972][b]
+译者:[Morisun029](https://github.com/Morisun029)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/alex-bunardzic
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc_520X292_openanttrail-2.png?itok=xhD3WmUd (Ants and a leaf making the word "open")
+[2]: https://opensource.com/article/19/7/failure-feature-blameless-devops
+[3]: https://en.wikipedia.org/wiki/Test-driven_development
+[4]: https://www.merriam-webster.com/dictionary/conditio%20sine%20qua%20non
+[5]: https://opensource.com/sites/default/files/uploads/darwin.png (Charles Darwin)
+[6]: https://en.wikipedia.org/wiki/Charles_Darwin
+[7]: https://en.wikipedia.org/wiki/On_the_Origin_of_Species
+[8]: https://opensource.com/sites/default/files/uploads/environmentalconditions2.png (Environmental pressures on fish)
+[9]: https://www.youtube.com/watch?v=MgK5Rf7qFaU
+[10]: https://dotnet.microsoft.com/
+[11]: https://xunit.net/
+[12]: https://opensource.com/sites/default/files/uploads/xunit-output.png (xUnit output after the unit test run fails)
+[13]: https://opensource.com/sites/default/files/uploads/unit-test-success.png (Unit test successful)
+[14]: https://opensource.com/sites/default/files/uploads/iterating-square-root.png (Code iterating for the square root of 25)
+[15]: https://opensource.com/sites/default/files/uploads/bestguess.png (Stepwise refinement)
+[16]: https://en.wikipedia.org/wiki/Uncertainty_principle
+[17]: https://en.wikipedia.org/wiki/Tractatus_Logico-Philosophicus
+[18]: https://en.wikipedia.org/wiki/G%C3%B6del%27s_incompleteness_theorems
+[19]: https://en.wikipedia.org/wiki/Second_law_of_thermodynamics
diff --git a/published/201910/20190822 A Raspberry Pi Based Open Source Tablet is in Making and it-s Called CutiePi.md b/published/201910/20190822 A Raspberry Pi Based Open Source Tablet is in Making and it-s Called CutiePi.md
new file mode 100644
index 0000000000..7e470c208c
--- /dev/null
+++ b/published/201910/20190822 A Raspberry Pi Based Open Source Tablet is in Making and it-s Called CutiePi.md
@@ -0,0 +1,82 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11414-1.html)
+[#]: subject: (A Raspberry Pi Based Open Source Tablet is in Making and it’s Called CutiePi)
+[#]: via: (https://itsfoss.com/cutiepi-open-source-tab/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+CutiePi:正在开发中的基于树莓派的开源平板
+======
+
+
+
+CutiePi 是一款 8 英寸的构建在树莓派上的开源平板。他们在[树莓派论坛][1]上宣布:现在,它只是一台原型机。
+
+在本文中,你将了解有关 CutiePi 的规格、价格和可用性的更多详细信息。
+
+它们使用一款定制的计算模块载版(CM3)来制造平板。[官网][2]提到使用定制 CM3 载板的目的是:
+
+> 定制 CM3/CM3+ 载板是专为便携使用而设计,拥有增强的电源管理和锂聚合物电池电量监控功能。还可与指定的 HDMI 或 MIPI DSI 显示器配合使用。
+
+因此,这使得该平板足够薄而且便携。
+
+### CutiePi 规格
+
+![CutiePi Board][3]
+
+我惊讶地了解到它有 8 英寸的 IPS LCD 显示屏,这对新手而言是个好事。然而,你不会有一个真正高清的屏幕,因为官方宣称它的分辨率是 1280×800。
+
+它还计划配备 4800 mAh 锂电池(原型机的电池为 5000 mAh)。嗯,对于平板来说,这不算坏。
+
+连接性上包括支持 Wi-Fi 和蓝牙 4.0。此外,还有一个 USB Type-A 插口、6 个 GPIO 引脚和 microSD 卡插槽。
+
+![CutiePi Specifications][4]
+
+硬件与 [Raspbian OS][5] 官方兼容,用户界面采用 [Qt][6] 构建,以获得快速直观的用户体验。此外,除了内置应用外,它还将通过 XWayland 支持 Raspbian PIXEL 应用。
+
+### CutiePi 源码
+
+你可以通过分析所用材料的清单来猜测此平板的定价。CutiePi 遵循 100% 的开源硬件设计。因此,如果你觉得好奇,可以查看它的 [GitHub 页面][7],了解有关硬件设计和内容的详细信息。
+
+### CutiePi 价格、发布日期和可用性
+
+CutiePi 计划在 8 月进行[设计验证测试][8]批量 PCB。他们的目标是在 2019 年底推出最终产品。
+
+官方预计,发售价大约在 $150-$250 左右。这只是一个近似的范围,还应该保有怀疑。
+
+显然,即使产品听上去挺有希望,但价格将是它成功的一个主要因素。
+
+### 总结
+
+CutiePi 并不是第一个使用[像树莓派这样的单板计算机][9]来制作平板的项目。我们有即将推出的 [PineTab][10],它基于 Pine64 单板电脑。Pine 还有一种笔记本电脑,名为 [Pinebook][11]。
+
+从原型来看,它确实是一个我们可以期望使用的产品。但是,预安装的应用和它将支持的应用可能会扭转局面。此外,考虑到价格估计,这听起来很有希望。
+
+你觉得怎么样?让我们在下面的评论中知道你的想法,或者投个票。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/cutiepi-open-source-tab/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://www.raspberrypi.org/forums/viewtopic.php?t=247380
+[2]: https://cutiepi.io/
+[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/cutiepi-board.png?ssl=1
+[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/cutiepi-specifications.jpg?ssl=1
+[5]: https://itsfoss.com/raspberry-pi-os-desktop/
+[6]: https://en.wikipedia.org/wiki/Qt_%28software%29
+[7]: https://github.com/cutiepi-io/cutiepi-board
+[8]: https://en.wikipedia.org/wiki/Engineering_validation_test#Design_verification_test
+[9]: https://itsfoss.com/raspberry-pi-alternatives/
+[10]: https://www.pine64.org/pinetab/
+[11]: https://itsfoss.com/pinebook-pro/
diff --git a/published/201910/20190823 The lifecycle of Linux kernel testing.md b/published/201910/20190823 The lifecycle of Linux kernel testing.md
new file mode 100644
index 0000000000..4353371b32
--- /dev/null
+++ b/published/201910/20190823 The lifecycle of Linux kernel testing.md
@@ -0,0 +1,75 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11464-1.html)
+[#]: subject: (The lifecycle of Linux kernel testing)
+[#]: via: (https://opensource.com/article/19/8/linux-kernel-testing)
+[#]: author: (Major Hayden https://opensource.com/users/mhaydenhttps://opensource.com/users/mhaydenhttps://opensource.com/users/marcobravohttps://opensource.com/users/mhayden)
+
+Linux 内核测试的生命周期
+======
+
+> 内核持续集成(CKI)项目旨在防止错误进入 Linux 内核。
+
+
+
+在 [Linux 内核的持续集成测试][2] 一文中,我介绍了 [内核持续集成][3](CKI)项目及其使命:改变内核开发人员和维护人员的工作方式。本文深入探讨了该项目的某些技术方面,以及这所有的部分是如何组合在一起的。
+
+### 从一次更改开始
+
+内核中每一项令人兴奋的功能、改进和错误都始于开发人员提出的更改。这些更改出现在各个内核存储库的大量邮件列表中。一些存储库关注内核中的某些子系统,例如存储或网络,而其它存储库关注内核的更多方面。 当开发人员向内核提出更改或补丁集时,或者维护者在存储库本身中进行更改时,CKI 项目就会付诸行动。
+
+CKI 项目维护的触发器用于监视这些补丁集并采取措施。诸如 [Patchwork][4] 之类的软件项目通过将多个补丁贡献整合为单个补丁系列,使此过程变得更加容易。补丁系列作为一个整体历经 CKI 系统,并可以针对该系列发布单个报告。
+
+其他触发器可以监视存储库中的更改。当内核维护人员合并补丁集、还原补丁或创建新标签时,就会触发。测试这些关键的更改可确保开发人员始终具有坚实的基线,可以用作编写新补丁的基础。
+
+所有这些更改都会进入 GitLab CI 管道,并历经多个阶段和多个系统。
+
+### 准备构建
+
+首先要准备好要编译的源代码。这需要克隆存储库、打上开发人员建议的补丁集,并生成内核配置文件。这些配置文件具有成千上万个用于打开或关闭功能的选项,并且配置文件在不同的系统体系结构之间差异非常大。 例如,一个相当标准的 x86\_64 系统在其配置文件中可能有很多可用选项,但是 s390x 系统(IBM zSeries 大型机)的选项可能要少得多。在该大型机上,某些选项可能有意义,但在消费类笔记本电脑上没有任何作用。
+
+内核进一步转换为源代码工件。该工件包含整个存储库(已打上补丁)以及编译所需的所有内核配置文件。 上游内核会打包成压缩包,而 Red Hat 的内核会生成下一步所用的源代码 RPM 包。
+
+### 成堆的编译
+
+编译内核会将源代码转换为计算机可以启动和使用的代码。配置文件描述了要构建的内容,内核中的脚本描述了如何构建它,系统上的工具(例如 GCC 和 glibc)完成构建。此过程需要一段时间才能完成,但是 CKI 项目需要针对四种体系结构快速完成:aarch64(64 位 ARM)、ppc64le(POWER)、s390x(IBM zSeries)和 x86\_64。重要的是,我们必须快速编译内核,以便使工作任务不会积压,而开发人员可以及时收到反馈。
+
+添加更多的 CPU 可以大大提高速度,但是每个系统都有其局限性。CKI 项目在 OpenShift 的部署环境中的容器内编译内核;尽管 OpenShift 可以实现高伸缩性,但在部署环境中的可用 CPU 仍然是数量有限的。CKI 团队分配了 20 个虚拟 CPU 来编译每个内核。涉及到四个体系结构,这就涨到了 80 个 CPU!
+
+另一个速度的提高来自 [ccache][5] 工具。内核开发进展迅速,但是即使在多个发布版本之间,内核的大部分仍保持不变。ccache 工具进行编译期间会在磁盘上缓存已构建的对象(整个内核的一小部分)。稍后再进行另一个内核编译时,ccache 会查找以前看到的内核的未更改部分。ccache 会从磁盘中提取缓存的对象并重新使用它。这样可以加快编译速度并降低总体 CPU 使用率。现在,耗时 20 分钟编译的内核在不到几分钟的时间内就完成了。
+
+### 测试时间
+
+内核进入最后一步:在真实硬件上进行测试。每个内核都使用 Beaker 在其原生体系结构上启动,并且开始无数次的测试以发现问题。一些测试会寻找简单的问题,例如容器问题或启动时的错误消息。其他测试则深入到各种内核子系统中,以查找系统调用、内存分配和线程中的回归问题。
+
+大型测试框架,例如 [Linux Test Project][6](LTP),包含了大量测试,这些测试在内核中寻找麻烦的回归问题。其中一些回归问题可能会回滚关键的安全修复程序,并且进行测试以确保这些改进仍保留在内核中。
+
+测试完成后,关键的一步仍然是:报告。内核开发人员和维护人员需要一份简明的报告,准确地告诉他们哪些有效、哪些无效以及如何获取更多信息。每个 CKI 报告都包含所用源代码、编译参数和测试输出的详细信息。该信息可帮助开发人员知道从哪里开始寻找解决问题的方法。此外,它还可以帮助维护人员在漏洞进入内核存储库之前知道何时需要保留补丁集以进行其他查看。
+
+### 总结
+
+CKI 项目团队通过向内核开发人员和维护人员提供及时、自动的反馈,努力防止错误进入 Linux 内核。这项工作通过发现导致内核错误、安全性问题和性能问题等易于找到的问题,使他们的工作更加轻松。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/8/linux-kernel-testing
+
+作者:[Major Hayden][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/mhaydenhttps://opensource.com/users/mhaydenhttps://opensource.com/users/marcobravohttps://opensource.com/users/mhayden
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/fail_progress_cycle_momentum_arrow.png?itok=q-ZFa_Eh (arrows cycle symbol for failing faster)
+[2]: https://opensource.com/article/19/6/continuous-kernel-integration-linux
+[3]: https://cki-project.org/
+[4]: https://github.com/getpatchwork/patchwork
+[5]: https://ccache.dev/
+[6]: https://linux-test-project.github.io
+[7]: https://cki-project.org/posts/hackfest-agenda/
+[8]: https://www.linuxplumbersconf.org/
diff --git a/published/201910/20190824 How to compile a Linux kernel in the 21st century.md b/published/201910/20190824 How to compile a Linux kernel in the 21st century.md
new file mode 100644
index 0000000000..fd29db6483
--- /dev/null
+++ b/published/201910/20190824 How to compile a Linux kernel in the 21st century.md
@@ -0,0 +1,212 @@
+[#]: collector: (lujun9972)
+[#]: translator: (LuuMing)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11427-1.html)
+[#]: subject: (How to compile a Linux kernel in the 21st century)
+[#]: via: (https://opensource.com/article/19/8/linux-kernel-21st-century)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+在 21 世纪该怎样编译 Linux 内核
+======
+
+> 也许你并不需要编译 Linux 内核,但你能通过这篇教程快速上手。
+
+
+
+在计算机世界里,内核是处理硬件与一般系统之间通信的低阶软件。除过一些烧录进计算机主板的初始固件,当你启动计算机时,内核让系统意识到它有一个硬盘驱动器、屏幕、键盘以及网卡。分配给每个部件相等时间(或多或少)使得图像、音频、文件系统和网络可以流畅甚至并行地运行。
+
+然而,对于硬件的需求是源源不断的,随着发布的硬件越多,内核就必须纳入更多代码来保证那些硬件正常工作。得到具体的数字很困难,但是 Linux 内核无疑是硬件兼容性方面的顶级内核之一。Linux 操作着无数的计算机和移动电话、工业用途和爱好者使用的板级嵌入式系统(SoC)、RAID 卡、缝纫机等等。
+
+回到 20 世纪(甚至是 21 世纪初期),对于 Linux 用户来说,在刚买到新的硬件后就需要下载最新的内核代码并编译安装才能使用这是不可理喻的。而现在你也很难见到 Linux 用户为了好玩而编译内核或通过高度专业化定制的硬件的方式赚钱。现在,通常已经不需要再编译 Linux 内核了。
+
+这里列出了一些原因以及快速编译内核的教程。
+
+### 更新当前的内核
+
+无论你买了配备新显卡或 Wifi 芯片集的新品牌电脑还是给家里配备一个新的打印机,你的操作系统(称为 GNU+Linux 或 Linux,它也是该内核的名字)需要一个驱动程序来打开新部件(显卡、芯片集、打印机和其他任何东西)的信道。有时候当你插入某些新的设备时而你的电脑表示发现了它,这具有一定的欺骗性。别被骗到了,有时候那就够了,但更多的情况是你的操作系统仅仅是使用了通用的协议检测到安装了新的设备。
+
+例如,你的计算机也许能够鉴别出新的网络打印机,但有时候那仅仅是因为打印机的网卡被设计成为了获得 DHCP 地址而在网络上标识自己。它并不意味着你的计算机知道如何发送文档给打印机进行打印。事实上,你可以认为计算机甚至不“知道”那台设备是一个打印机。它也许仅仅是显示网络有个设备在一个特定的地址上,并且该设备以一系列字符 “p-r-i-n-t-e-r” 标识自己而已。人类语言的便利性对于计算机毫无意义。计算机需要的是一个驱动程序。
+
+内核开发者、硬件制造商、技术支持和爱好者都知道新的硬件会不断地发布。它们大多数都会贡献驱动程序,直接提交给内核开发团队以包含在 Linux 中。例如,英伟达显卡驱动程序通常都会写入 [Nouveau][2] 内核模块中,并且因为英伟达显卡很常用,它的代码都包含在任一个日常使用的发行版内核中(例如当下载 [Fedora][3] 或 [Ubuntu][4] 得到的内核)。英伟达也有不常用的地方,例如嵌入式系统中 Nouveau 模块通常被移除。对其他设备来说也有类似的模块:打印机得益于 [Foomatic][5] 和 [CUPS][6],无线网卡有 [b43、ath9k、wl][7] 模块等等。
+
+发行版往往会在它们 Linux 内核的构建中包含尽可能多合理的驱动程序,因为他们想让你在接入新设备时不用安装驱动程序能够立即使用。对于大多数情况来说就是这样的,尤其是现在很多设备厂商都在资助自己售卖硬件的 Linux 驱动程序开发,并且直接将这些驱动程序提交给内核团队以用在通常的发行版上。
+
+有时候,或许你正在运行六个月之前安装的内核,并配备了上周刚刚上市令人兴奋的新设备。在这种情况下,你的内核也许没有那款设备的驱动程序。好消息是经常会出现那款设备的驱动程序已经存在于最近版本的内核中,意味着你只要更新运行的内核就可以了。
+
+通常,这些都是通过安装包管理软件完成的。例如在 RHEL、CentOS 和 Fedora 上:
+
+```
+$ sudo dnf update kernel
+```
+
+在 Debian 和 Ubuntu 上,首先获取你当前内核的版本:
+
+```
+$ uname -r
+4.4.186
+```
+
+搜索新的版本:
+
+```
+$ sudo apt update
+$ sudo apt search linux-image
+```
+
+安装找到的最新版本。在这个例子中,最新的版本是 5.2.4:
+
+```
+$ sudo apt install linux-image-5.2.4
+```
+
+内核更新后,你必须 [reboot][8] (除非你使用 kpatch 或 kgraft)。这时,如果你需要的设备驱动程序包含在最新的内核中,你的硬件就会正常工作。
+
+### 安装内核模块
+
+有时候一个发行版没有预计到用户会使用某个设备(或者该设备的驱动程序至少不足以包含在 Linux 内核中)。Linux 对于驱动程序采用模块化方式,因此尽管驱动程序没有编译进内核,但发行版可以推送单独的驱动程序包让内核去加载。尽管有些复杂但是非常有用,尤其是当驱动程序没有包含进内核中而是在引导过程中加载,或是内核中的驱动程序相比模块化的驱动程序过期时。第一个问题可以用 “initrd” 解决(初始化 RAM 磁盘),这一点超出了本文的讨论范围,第二点通过 “kmod” 系统解决。
+
+kmod 系统保证了当内核更新后,所有与之安装的模块化驱动程序也得到更新。如果你手动安装一个驱动程序,你就体验不到 kmod 提供的自动化,因此只要能用 kmod 安装包,就应该选择它。例如,尽管英伟达驱动程序以 Nouveau 模块构建在内核中,但官方的驱动程序仅由英伟达发布。你可以去网站上手动安装英伟达旗下的驱动程序,下载 “.run” 文件,并运行提供的 shell 脚本,但在安装了新的内核之后你必须重复相同的过程,因为没有任何东西告诉包管理软件你手动安装了一个内核驱动程序。英伟达驱动着你的显卡,手动更新英伟达驱动程序通常意味着你需要通过终端来执行更新,因为没有显卡驱动程序将无法显示。
+
+![Nvidia configuration application][9]
+
+然而,如果你通过 kmod 包安装英伟达驱动程序,更新你的内核也会更新你的英伟达驱动程序。在 Fedora 和相关的发行版中:
+
+```
+$ sudo dnf install kmod-nvidia
+```
+
+在 Debian 和相关发行版上:
+
+```
+$ sudo apt update
+$ sudo apt install nvidia-kernel-common nvidia-kernel-dkms nvidia-glx nvidia-xconfig nvidia-settings nvidia-vdpau-driver vdpau-va-driver
+```
+
+这仅仅是一个例子,但是如果你真的要安装英伟达驱动程序,你也必须屏蔽掉 Nouveau 驱动程序。参考你使用发行版的文档获取最佳的步骤吧。
+
+### 下载并安装驱动程序
+
+不是所有的东西都包含在内核中,也不是所有的东西都可以作为内核模块使用。在某些情况下,你需要下载一个由供应商编写并绑定好的特殊驱动程序,还有一些情况,你有驱动程序,但是没有配置驱动程序的前端界面。
+
+有两个常见的例子是 HP 打印机和 [Wacom][10] 数位板。如果你有一台 HP 打印机,你可能有能够和打印机通信的通用的驱动程序,甚至能够打印出东西。但是通用的驱动程序却不能为特定型号的打印机提供定制化的选项,例如双面打印、校对、纸盒选择等等。[HPLIP][11](HP Linux 成像和打印系统)提供了选项来进行任务管理、调整打印设置、选择可用的纸盒等等。
+
+HPLIP 通常包含在包管理软件中;只要搜索“hplip”就行了。
+
+![HPLIP in action][12]
+
+同样的,电子艺术家主要使用的数位板 Wacom 的驱动程序通常也包含在内核中,但是例如调整压感和按键功能等设置只能通过默认包含在 GNOME 的图形控制面板访问。但也可以作为 KDE 上额外的程序包“kde-config-tablet”来访问。
+
+这里也有几个类似的个别例子,例如内核中没有驱动程序,但是以 RPM 或 DEB 文件提供了可供下载并且通过包管理软件安装的 kmod 版本的驱动程序。
+
+### 打上补丁并编译你的内核
+
+即使在 21 世纪的未来主义乌托邦里,仍有厂商不够了解开源,没有提供可安装的驱动程序。有时候,一些公司为驱动程序提供开源代码,而需要你下载代码、修补内核、编译并手动安装。
+
+这种发布方式和在 kmod 系统之外安装打包的驱动程序拥有同样的缺点:对内核的更新会破坏驱动程序,因为每次更换新的内核时都必须手动将其重新集成到内核中。
+
+令人高兴的是,这种事情变得少见了,因为 Linux 内核团队在呼吁公司们与他们交流方面做得很好,并且公司们最终接受了开源不会很快消失的事实。但仍有新奇的或高度专业的设备仅提供了内核补丁。
+
+官方上,对于你如何编译内核以使包管理器参与到升级系统如此重要的部分中,发行版有特定的习惯。这里有太多的包管理器,所以无法一一涵盖。举一个例子,当你使用 Fedora 上的工具例如 `rpmdev` 或 `build-essential`,Debian 上的 `devscripts`。
+
+首先,像通常那样,找到你正在运行内核的版本:
+
+```
+$ uname -r
+```
+
+在大多数情况下,如果你还没有升级过内核那么可以试试升级一下内核。搞定之后,也许你的问题就会在最新发布的内核中解决。如果你尝试后发现不起作用,那么你应该下载正在运行内核的源码。大多数发行版提供了特定的命令来完成这件事,但是手动操作的话,可以在 [kernel.org][13] 上找到它的源代码。
+
+你必须下载内核所需的任何补丁。有时候,这些补丁对应具体的内核版本,因此请谨慎选择。
+
+通常,或至少在人们习惯于编译内核的那时,都是拿到源代码并对 `/usr/src/linux` 打上补丁。
+
+解压内核源码并打上需要的补丁:
+
+```
+$ cd /usr/src/linux
+$ bzip2 --decompress linux-5.2.4.tar.bz2
+$ cd linux-5.2.4
+$ bzip2 -d ../patch*bz2
+```
+
+补丁文件也许包含如何使用的教程,但通常它们都设计成在内核源码树的顶层可用来执行。
+
+```
+$ patch -p1 < patch*example.patch
+```
+
+当内核代码打上补丁后,你可以继续使用旧的配置来对打了补丁的内核进行配置。
+
+```
+$ make oldconfig
+```
+
+`make oldconfig` 命令有两个作用:它继承了当前的内核配置,并且允许你配置补丁带来的新的选项。
+
+你或许需要运行 `make menuconfig` 命令,它启动了一个基于 ncurses 的菜单界面,列出了新的内核所有可能的选项。整个菜单可能看不过来,但是它是以旧的内核配置为基础的,你可以遍历菜单并且禁用掉你没有或不需要的硬件模块。另外,如果你知道自己有一些硬件没有包含在当前的配置中,你可以选择构建它,当作模块或者直接嵌入内核中。理论上,这些并不是必要的,因为你可以猜想,当前的内核运行良好只是缺少了补丁,当使用补丁的时候可能已经激活了所有设备所必要的选项。
+
+下一步,编译内核和它的模块:
+
+```
+$ make bzImage
+$ make modules
+```
+
+这会产生一个叫作 `vmlinuz` 的文件,它是你的可引导内核的压缩版本。保存旧的版本并在 `/boot` 文件夹下替换为新的。
+
+```
+$ sudo mv /boot/vmlinuz /boot/vmlinuz.nopatch
+$ sudo cat arch/x86_64/boot/bzImage > /boot/vmlinuz
+$ sudo mv /boot/System.map /boot/System.map.stock
+$ sudo cp System.map /boot/System.map
+```
+
+到目前为止,你已经打上了补丁并且编译了内核和它的模块,你安装了内核,但你并没有安装任何模块。那就是最后的步骤:
+
+```
+$ sudo make modules_install
+```
+
+新的内核已经就位,并且它的模块也已经安装。
+
+最后一步是更新你的引导程序,为了让你的计算机在加载 Linux 内核之前知道它的位置。GRUB 引导程序使这一过程变得相当简单:
+
+```
+$ sudo grub2-mkconfig
+```
+
+### 现实生活中的编译
+
+当然,现在没有人手动执行这些命令。相反的,参考你的发行版,寻找发行版维护人员使用的开发者工具集修改内核的说明。这些工具集可能会创建一个集成所有补丁的可安装软件包,告诉你的包管理器来升级并更新你的引导程序。
+
+### 内核
+
+操作系统和内核都是玄学,但要理解构成它们的组件并不难。下一次你看到某个技术无法应用在 Linux 上时,深呼吸,调查可用的驱动程序,寻找一条捷径。Linux 比以前简单多了——包括内核。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/8/linux-kernel-21st-century
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[LuMing](https://github.com/LuuMing)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/migration_innovation_computer_software.png?itok=VCFLtd0q (and old computer and a new computer, representing migration to new software or hardware)
+[2]: https://nouveau.freedesktop.org/wiki/
+[3]: http://fedoraproject.org
+[4]: http://ubuntu.com
+[5]: https://wiki.linuxfoundation.org/openprinting/database/foomatic
+[6]: https://www.cups.org/
+[7]: https://wireless.wiki.kernel.org/en/users/drivers
+[8]: https://opensource.com/article/19/7/reboot-linux
+[9]: https://opensource.com/sites/default/files/uploads/nvidia.jpg (Nvidia configuration application)
+[10]: https://linuxwacom.github.io
+[11]: https://developers.hp.com/hp-linux-imaging-and-printing
+[12]: https://opensource.com/sites/default/files/uploads/hplip.jpg (HPLIP in action)
+[13]: https://www.kernel.org/
diff --git a/published/201910/20190826 Introduction to the Linux chown command.md b/published/201910/20190826 Introduction to the Linux chown command.md
new file mode 100644
index 0000000000..6a7befd20a
--- /dev/null
+++ b/published/201910/20190826 Introduction to the Linux chown command.md
@@ -0,0 +1,131 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11416-1.html)
+[#]: subject: (Introduction to the Linux chown command)
+[#]: via: (https://opensource.com/article/19/8/linux-chown-command)
+[#]: author: (Alan Formy-Duval https://opensource.com/users/alanfdoss)
+
+chown 命令简介
+======
+
+> 学习如何使用 chown 命令更改文件或目录的所有权。
+
+
+
+Linux 系统上的每个文件和目录均由某个人拥有,拥有者可以完全控制更改或删除他们拥有的文件。除了有一个*拥有用户*外,文件还有一个*拥有组*。
+
+你可以使用 `ls -l` 命令查看文件的所有权:
+
+```
+[pablo@workstation Downloads]$ ls -l
+total 2454732
+-rw-r--r--. 1 pablo pablo 1934753792 Jul 25 18:49 Fedora-Workstation-Live-x86_64-30-1.2.iso
+```
+
+该输出的第三和第四列是拥有用户和组,它们一起称为*所有权*。上面的那个 ISO 文件这两者都是 `pablo`。
+
+所有权设置由 [chmod 命令][2]进行设置,控制允许谁可以执行读取、写入或运行的操作。你可以使用 `chown` 命令更改所有权(一个或两者)。
+
+所有权经常需要更改。文件和目录一直存在在系统中,但用户不断变来变去。当文件和目录在系统中移动时,或从一个系统移动到另一个系统时,所有权也可能需要更改。
+
+我的主目录中的文件和目录的所有权是我的用户和我的主要组,以 `user:group` 的形式表示。假设 Susan 正在管理 Delta 组,该组需要编辑一个名为 `mynotes` 的文件。你可以使用 `chown` 命令将该文件的用户更改为 `susan`,组更改为 `delta`:
+
+```
+$ chown susan:delta mynotes
+ls -l
+-rw-rw-r--. 1 susan delta 0 Aug 1 12:04 mynotes
+```
+
+当给该文件设置好了 Delta 组时,它可以分配回给我:
+
+```
+$ chown alan mynotes
+$ ls -l mynotes
+-rw-rw-r--. 1 alan delta 0 Aug 1 12:04 mynotes
+```
+
+给用户后添加冒号(`:`),可以将用户和组都分配回给我:
+
+```
+$ chown alan: mynotes
+$ ls -l mynotes
+-rw-rw-r--. 1 alan alan 0 Aug 1 12:04 mynotes
+```
+
+通过在组前面加一个冒号,可以只更改组。现在,`gamma` 组的成员可以编辑该文件:
+
+```
+$ chown :gamma mynotes
+$ ls -l
+-rw-rw-r--. 1 alan gamma 0 Aug 1 12:04 mynotes
+```
+
+`chown` 的一些附加参数都能用在命令行和脚本中。就像许多其他 Linux 命令一样,`chown` 有一个递归参数(`-R`),它告诉该命令进入目录以对其中的所有文件进行操作。没有 `-R` 标志,你就只能更改文件夹的权限,而不会更改其中的文件。在此示例中,假定目的是更改目录及其所有内容的权限。这里我添加了 `-v`(详细)参数,以便 `chown` 报告其工作情况:
+
+```
+$ ls -l . conf
+.:
+drwxrwxr-x 2 alan alan 4096 Aug 5 15:33 conf
+
+conf:
+-rw-rw-r-- 1 alan alan 0 Aug 5 15:33 conf.xml
+
+$ chown -vR susan:delta conf
+changed ownership of 'conf/conf.xml' from alan:alan to susan:delta
+changed ownership of 'conf' from alan:alan to susan:delta
+```
+
+根据你的角色,你可能需要使用 `sudo` 来更改文件的所有权。
+
+在更改文件的所有权以匹配特定配置时,或者在你不知道所有权时(例如运行脚本时),可以使用参考文件(`--reference=RFILE`)。例如,你可以复制另一个文件(`RFILE`,称为参考文件)的用户和组,以撤消上面所做的更改。回想一下,点(`.`)表示当前的工作目录。
+
+```
+$ chown -vR --reference=. conf
+```
+
+### 报告更改
+
+大多数命令都有用于控制其输出的参数。最常见的是 `-v`(`--verbose`)以启用详细信息,但是 `chown` 还具有 `-c`(`--changes`)参数来指示 `chown` 仅在进行更改时报告。`chown` 还会报告其他情况,例如不允许进行的操作。
+
+参数 `-f`(`--silent`、`--quiet`)用于禁止显示大多数错误消息。在下一节中,我将使用 `-f` 和 `-c`,以便仅显示实际更改。
+
+### 保持根目录
+
+Linux 文件系统的根目录(`/`)应该受到高度重视。如果命令在此层级上犯了一个错误,则后果可能会使系统完全无用。尤其是在运行一个会递归修改甚至删除的命令时。`chown` 命令具有一个可用于保护和保持根目录的参数,它是 `--preserve-root`。如果在根目录中将此参数和递归一起使用,那么什么也不会发生,而是会出现一条消息:
+
+```
+$ chown -cfR --preserve-root alan /
+chown: it is dangerous to operate recursively on '/'
+chown: use --no-preserve-root to override this failsafe
+```
+
+如果不与 `--recursive` 结合使用,则该选项无效。但是,如果该命令由 `root` 用户运行,则 `/` 本身的权限将被更改,但其下的其他文件或目录的权限则不会更改:
+
+```
+$ chown -c --preserve-root alan /
+chown: changing ownership of '/': Operation not permitted
+[root@localhost /]# chown -c --preserve-root alan /
+changed ownership of '/' from root to alan
+```
+
+### 所有权即安全
+
+文件和目录所有权是良好的信息安全性的一部分,因此,偶尔检查和维护文件所有权以防止不必要的访问非常重要。`chown` 命令是 Linux 安全命令集中最常见和最重要的命令之一。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/8/linux-chown-command
+
+作者:[Alan Formy-Duval][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/alanfdoss
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC (Hand putting a Linux file folder into a drawer)
+[2]: https://opensource.com/article/19/8/introduction-linux-chmod-command
diff --git a/published/201910/20190830 How to Install Linux on Intel NUC.md b/published/201910/20190830 How to Install Linux on Intel NUC.md
new file mode 100644
index 0000000000..d460dfccb0
--- /dev/null
+++ b/published/201910/20190830 How to Install Linux on Intel NUC.md
@@ -0,0 +1,184 @@
+[#]: collector: (lujun9972)
+[#]: translator: (amwps290)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11477-1.html)
+[#]: subject: "How to Install Linux on Intel NUC"
+[#]: via: "https://itsfoss.com/install-linux-on-intel-nuc/"
+[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
+
+在 Intel NUC 上安装 Linux
+======
+
+
+
+在上周,我买了一台 [InteL NUC][1]。虽然它是如此之小,但它与成熟的桌面型电脑差别甚小。实际上,大部分的[基于 Linux 的微型 PC][2] 都是基于 Intel NUC 构建的。
+
+我买了第 8 代 Core i3 处理器的“准系统” NUC。准系统意味着该设备没有 RAM、没有硬盘,显然也没有操作系统。我添加了一个 [Crucial 的 8 GB 内存条][3](大约 33 美元)和一个 [240 GB 的西数的固态硬盘][4](大约 45 美元)。
+
+现在,我已经有了一台不到 400 美元的电脑。因为我已经有了一个电脑屏幕和键鼠套装,所以我没有把它们计算在内。
+
+![在我的办公桌上放着一个崭新的英特尔 NUC NUC8i3BEH,后面有树莓派 4][5]
+
+我买这个 Intel NUC 的主要原因就是我想在实体机上测试各种各样的 Linux 发行版。我已经有一个 [树莓派 4][6] 设备作为一个入门级的桌面系统,但它是一个 [ARM][7] 设备,因此,只有少数 Linux 发行版可用于树莓派上。(LCTT 译注:新发布的 Ubuntu 19.10 支持树莓派 4B)
+
+*这个文章里的亚马逊链接是(原文的)受益连接。请参阅我们的[受益政策][8]。*
+
+### 在 NUC 上安装 Linux
+
+现在我准备安装 Ubuntu 18.04 长期支持版,因为我现在就有这个系统的安装文件。你也可以按照这个教程安装其他的发行版。在最重要的分区之前,前边的步骤都大致相同。
+
+#### 第一步:创建一个 USB 启动盘
+
+你可以在 Ubuntu 官网下载它的安装文件。使用另一个电脑去[创建一个 USB 启动盘][9]。你可以使用像 [Rufus][10] 和 [Etcher][11] 这样的软件。在 Ubuntu上,你可以使用默认的启动盘创建工具。
+
+#### 第二步:确认启动顺序是正确的
+
+将你的 USB 启动盘插入到你的电脑并开机。一旦你看到 “Intel NUC” 字样出现在你的屏幕上,快速的按下 `F2` 键进入到 BIOS 设置中。
+
+![Intel NUC 的 BIOS 设置][12]
+
+在这里,只是确认一下你的第一启动项是你的 USB 设备。如果不是,切换启动顺序。
+
+如果你修改了一些选项,按 `F10` 键保存退出,否则直接按下 `ESC` 键退出 BIOS 设置。
+
+#### 第三步:正确分区,安装 Linux
+
+现在当机器重启的时候,你就可以看到熟悉的 Grub 界面,可以让你试用或者安装 Ubuntu。现在我们选择安装它。
+
+开始的几个安装步骤非常简单,选择键盘的布局,是否连接网络还有一些其他简单的设置。
+
+![在安装 Ubuntu Linux 时选择键盘布局][14]
+
+你可能会使用常规安装,默认情况下会安装一些有用的应用程序。
+
+![][15]
+
+接下来的是要注意的部分。你有两种选择:
+
+* “擦除磁盘并安装 Ubuntu”:最简单的选项,它将在整个磁盘上安装 Ubuntu。如果你只想在 Intel NUC 上使用一个操作系统,请选择此选项,Ubuntu 将负责剩余的工作。
+* “其他选项”:这是一个控制所有选择的高级选项。就我而言,我想在同一 SSD 上安装多个 Linux 发行版。因此,我选择了此高级选项。
+
+![][16]
+
+**如果你选择了“擦除磁盘并安装 Ubuntu”,点击“继续”,直接跳到第四步,**
+
+如果你选择了高级选项,请按照下面剩下的部分进行操作。
+
+选择固态硬盘,然后点击“新建分区表”。
+
+![][17]
+
+它会给你显示一个警告。直接点击“继续”。
+
+![][18]
+
+现在你就可以看到你 SSD 磁盘里的空闲空间。我的想法是为 EFI bootloader 创建一个 EFI 系统分区。一个根(`/`)分区,一个主目录(`/home`)分区。这里我并没有创建[交换分区][19]。Ubuntu 会根据自己的需要来创建交换分区。我也可以通过[创建新的交换文件][32]来扩展交换分区。
+
+我将在磁盘上保留近 200 GB 的可用空间,以便可以在此处安装其他 Linux 发行版。你可以将其全部用于主目录分区。保留单独的根分区和主目录分区可以在你需要重新安装系统时帮你保存里面的数据。
+
+选择可用空间,然后单击加号以添加分区。
+
+![][20]
+
+一般来说,100MB 足够 EFI 的使用,但是某些发行版可能需要更多空间,因此我要使用 500MB 的 EFI 分区。
+
+![][21]
+
+接下来,我将使用 20GB 的根分区。如果你只使用一个发行版,则可以随意地将其增加到 40GB。
+
+根目录(`/`)是系统文件存放的地方。你的程序缓存和你安装的程序将会有一些文件放在这个目录下边。我建议你可以阅读一下 [Linux 文件系统层次结构][22]来了解更多相关内容。
+
+填入分区的大小,选择 Ext4 文件系统,选择 `/` 作为挂载点。
+
+![][24]
+
+接下来是创建一个主目录分区,我再说一下,如果你仅仅想使用一个 Linux 发行版。那就把剩余的空间都使用完吧。为主目录分区选择一个合适的大小。
+
+主目录是你个人的文件,比如文档、图片、音乐、下载和一些其他的文件存储的地方。
+
+![][25]
+
+既然你创建好了 EFI 分区、根分区、主目录分区,那你就可以点击“现在安装”按钮安装系统了。
+
+![][26]
+
+它将会提示你新的改变将会被写入到磁盘,点击“继续”。
+
+![][27]
+
+#### 第四步:安装 Ubuntu
+
+事情到了这就非常明了了。现在选择你的分区或者以后选择也可以。
+
+![][28]
+
+接下来,输入你的用户名、主机名以及密码。
+
+![][29]
+
+看 7-8 分钟的幻灯片就可以安装完成了。
+
+![][30]
+
+一旦安装完成,你就可以重新启动了。
+
+![][31]
+
+当你重启的时候,你必须要移除你的 USB 设备,否则你将会再次进入安装系统的界面。
+
+这就是在 Intel NUC 设备上安装 Linux 所需要做的一切。坦白说,你可以在其他任何系统上使用相同的过程。
+
+### Intel NUC 和 Linux 在一起:如何使用它?
+
+我非常喜欢 Intel NUC。它不占用太多的桌面空间,而且有足够的能力去取代传统的桌面型电脑。你可以将它的内存升级到 32GB。你也可以安装两个 SSD 硬盘。总之,它提供了一些配置和升级范围。
+
+如果你想购买一个桌面型的电脑,我非常推荐你购买使用 [Intel NUC][1] 迷你主机。如果你不想自己安装系统,那么你可以购买一个[基于 Linux 的已经安装好的系统迷你主机][2]。
+
+你是否已经有了一个 Intel NUC?有一些什么相关的经验?你有什么相关的意见与我们分享吗?可以在下面评论。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/install-linux-on-intel-nuc/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[amwps290](https://github.com/amwps290)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://www.amazon.com/Intel-NUC-Mainstream-Kit-NUC8i3BEH/dp/B07GX4X4PW?psc=1&SubscriptionId=AKIAJ3N3QBK3ZHDGU54Q&tag=chmod7mediate-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B07GX4X4PW "Intel NUC"
+[2]: https://itsfoss.com/linux-based-mini-pc/
+[3]: https://www.amazon.com/Crucial-Single-PC4-19200-SODIMM-260-Pin/dp/B01BIWKP58?psc=1&SubscriptionId=AKIAJ3N3QBK3ZHDGU54Q&tag=chmod7mediate-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B01BIWKP58 "8GB RAM from Crucial"
+[4]: https://www.amazon.com/Western-Digital-240GB-Internal-WDS240G1G0B/dp/B01M9B2VB7?SubscriptionId=AKIAJ3N3QBK3ZHDGU54Q&tag=chmod7mediate-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B01M9B2VB7 "240 GB Western Digital SSD"
+[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/intel-nuc.jpg?resize=800%2C600&ssl=1
+[6]: https://itsfoss.com/raspberry-pi-4/
+[7]: https://en.wikipedia.org/wiki/ARM_architecture
+[8]: https://itsfoss.com/affiliate-policy/
+[9]: https://itsfoss.com/create-live-usb-of-ubuntu-in-windows/
+[10]: https://rufus.ie/
+[11]: https://www.balena.io/etcher/
+[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/boot-screen-nuc.jpg?ssl=1
+[13]: https://itsfoss.com/find-which-kernel-version-is-running-in-ubuntu/
+[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-ubuntu-linux-on-intel-nuc-1_tutorial.jpg?ssl=1
+[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-ubuntu-linux-on-intel-nuc-2_tutorial.jpg?ssl=1
+[16]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-ubuntu-linux-on-intel-nuc-3_tutorial.jpg?ssl=1
+[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-ubuntu-linux-on-intel-nuc-4_tutorial.jpg?ssl=1
+[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-ubuntu-linux-on-intel-nuc-5_tutorial.jpg?ssl=1
+[19]: https://itsfoss.com/swap-size/
+[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-ubuntu-linux-on-intel-nuc-6_tutorial.jpg?ssl=1
+[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-ubuntu-linux-on-intel-nuc-7_tutorial.jpg?ssl=1
+[22]: https://linuxhandbook.com/linux-directory-structure/
+[23]: https://itsfoss.com/share-folders-local-network-ubuntu-windows/
+[24]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-ubuntu-linux-on-intel-nuc-8_tutorial.jpg?ssl=1
+[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-ubuntu-linux-on-intel-nuc-9_tutorial.jpg?ssl=1
+[26]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-ubuntu-linux-on-intel-nuc-10_tutorial.jpg?ssl=1
+[27]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-ubuntu-linux-on-intel-nuc-11_tutorial.jpg?ssl=1
+[28]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-ubuntu-linux-on-intel-nuc-12_tutorial.jpg?ssl=1
+[29]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-ubuntu-linux-on-intel-nuc-13_tutorial.jpg?ssl=1
+[30]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-ubuntu-linux-on-intel-nuc-14_tutorial.jpg?ssl=1
+[31]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/install-ubuntu-linux-on-intel-nuc-15_tutorial.jpg?ssl=1
+[32]: https://itsfoss.com/create-swap-file-linux/
diff --git a/published/201910/20190901 Best Linux Distributions For Everyone in 2019.md b/published/201910/20190901 Best Linux Distributions For Everyone in 2019.md
new file mode 100644
index 0000000000..4a6e136180
--- /dev/null
+++ b/published/201910/20190901 Best Linux Distributions For Everyone in 2019.md
@@ -0,0 +1,386 @@
+[#]: collector: (lujun9972)
+[#]: translator: (heguangzhi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11411-1.html)
+[#]: subject: (Best Linux Distributions For Everyone in 2019)
+[#]: via: (https://itsfoss.com/best-linux-distributions/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+2019 年最好的 Linux 发行版
+======
+
+> 哪个是最好的 Linux 发行版呢?这个问题是没有明确的答案的。这就是为什么我们按各种分类汇编了这个最佳 Linux 列表的原因。
+
+有许多 Linux 发行版,我甚至想不出一个确切的数量,因为你会发现很多不同的 Linux 发行版。
+
+其中有些只是另外一个的复制品,而有些往往是独一无二的。这虽然有点混乱——但这也是 Linux 的优点。
+
+不用担心,尽管有成千上万的发行版,在这篇文章中,我已经列出了目前最好的 Linux 发行版。当然,这个列表是主观的。但是,在这里,我们试图对发行版进行分类——每个发行版本都有自己的特点的。
+
+* 面向初学者的 Linux 用户的最佳发行版
+* 最佳 Linux 服务器发行版
+* 可以在旧计算机上运行的最佳 Linux 发行版
+* 面向高级 Linux 用户的最佳发行版
+* 最佳常青树 Linux 发行版
+
+**注:** 该列表没有特定的排名顺序。
+
+### 面向初学者的最佳 Linux 发行版
+
+在这个分类中,我们的目标是列出开箱即用的易用发行版。你不需要深度学习,你可以在安装后马上开始使用,不需要知道任何命令或技巧。
+
+#### Ubuntu
+
+![][6]
+
+Ubuntu 无疑是最流行的 Linux 发行版之一。你甚至可以发现它已经预装在很多笔记本电脑上了。
+
+用户界面很容易适应。如果你愿意,你可以根据自己的要求轻松定制它的外观。无论哪种情况,你都可以选择安装一个主题。你可以从了解更多关于[如何在 Ubuntu 安装主题的][7]的信息来起步。
+
+除了它本身提供的功能外,你会发现一个巨大的 Ubuntu 用户在线社区。因此,如果你有问题——可以去任何论坛(或版块)寻求帮助。如果你想直接寻找解决方案,你应该看看我们对 [Ubuntu][8] 的报道(我们有很多关于 Ubuntu 的教程和建议)。
+
+- [Ubuntu][9]
+
+#### Linux Mint
+
+![][10]
+
+Linux Mint Cinnamon 是另一个受初学者欢迎的 Linux 发行版。默认的 Cinnamon 桌面类似于 Windows XP,这就是为什么当 Windows XP 停止维护时许多用户选择它的原因。
+
+Linux Mint 基于 Ubuntu,因此它具有适用于 Ubuntu 的所有应用程序。简单易用是它成为 Linux 新用户首选的原因。
+
+- [Linux Mint][11]
+
+#### elementary OS
+
+![][12]
+
+elementary OS 是我用过的最漂亮的 Linux 发行版之一。用户界面类似于苹果操作系统——所以如果你已经使用了苹果系统,则很容易适应。
+
+该发行版基于 Ubuntu,致力于提供一个用户友好的 Linux 环境,该环境在考虑性能的同时尽可能美观。如果你选择安装 elementary OS,这份[在安装 elementary OS 后要做的 11 件事的清单][13]会派上用场。
+
+- [elementary OS][14]
+
+#### MX Linux
+
+![][15]
+
+大约一年前,MX Linux 成为众人瞩目的焦点。现在(在发表这篇文章的时候),它是 [DistroWatch.com][16] 上最受欢迎的 Linux 发行版。如果你还没有使用过它,那么当你开始使用它时,你会感到惊讶。
+
+与 Ubuntu 不同,MX Linux 是一个基于 Debian 的日益流行的发行版,采用 Xfce 作为其桌面环境。除了无与伦比的稳定性之外,它还配备了许多图形用户界面工具,这使得任何习惯了 Windows/Mac 的用户易于使用它。
+
+此外,软件包管理器还专门针对一键安装进行了量身定制。你甚至可以搜索 [Flatpak][18] 软件包并立即安装它(默认情况下,Flathub 在软件包管理器中是可用的来源之一)。
+
+- [MX Linux][19]
+
+#### Zorin OS
+
+![][20]
+
+Zorin OS 是又一个基于 Ubuntu 的发行版,它又是桌面上最漂亮、最直观的操作系统之一。尤其是在[Zorin OS 15 发布][21]之后——我绝对会向没有任何 Linux 经验的用户推荐它。它也引入了许多基于图形用户界面的应用程序。
+
+你也可以将其安装在旧电脑上,但是,请确保选择“Lite”版本。此外,你还有“Core”、“Education”和 “Ultimate”版本可以选择。你可以选择免费安装 Core 版,但是如果你想支持开发人员并帮助改进 Zorin,请考虑获得 Ultimate 版。
+
+Zorin OS 是由两名爱尔兰的青少年创建的。你可以[在这里阅读他们的故事][22]。
+
+- [Zorin OS][23]
+
+#### Pop!_OS
+
+
+
+Sytem76 的 Pop!_OS 是开发人员或计算机科学专业人员的理想选择。当然,不仅限于编码人员,如果你刚开始使用 Linux,这也是一个很好的选择。它基于 Ubuntu,但是其 UI 感觉更加直观和流畅。除了 UI 外,它还强制执行全盘加密。
+
+你可以通过文章下面的评论看到,我们的许多读者似乎都喜欢(并坚持使用)它。如果你对此感到好奇,也应该查看一下我们关于 Phillip Prado 的 [Pop!_OS 的动手实践](https://itsfoss.com/pop-os-linux-review/)的文章。
+
+(LCTT 译注:这段推荐是原文后来补充的,因为原文下面很多人在评论推荐。)
+
+- [Pop!_OS](https://system76.com/pop)
+
+#### 其他选择
+
+[深度操作系统][24] 和其他的 Ubuntu 变种(如 Kubuntu、Xubuntu)也是初学者的首选。如果你想寻求更多的选择,你可以看看。(LCTT 译注:我知道你们肯定对将深度操作系统列入其它不满意——这个锅归原作者。)
+
+如果你想要挑战自己,你可以试试 Ubuntu 之外的 Fedora —— 但是一定要看看我们关于 [Ubuntu 和 Fedora 对比][25]的文章,从桌面的角度做出更好的选择。
+
+### 最好的服务器发行版
+
+对于服务器来说,选择 Linux 发行版取决于稳定性、性能和企业级支持。如果你只是尝试,则可以尝试任何你想要的发行版。
+
+但是,如果你要为 Web 服务器或任何重要的组件安装它,你应该看看我们的一些建议。
+
+#### Ubuntu 服务器
+
+根据你的需要,Ubuntu 为你的服务器提供了不同的选项。如果你正在寻找运行在 AWS、Azure、谷歌云平台等平台上的优化解决方案,[Ubuntu Cloud][26] 是一个很好的选择。
+
+无论是哪种情况,你都可以选择 Ubuntu 服务器包,并将其安装在你的服务器上。然而,Ubuntu 在云上部署时也是最受欢迎的 Linux 发行版(根据数字判断——[来源1][27]、[来源2][28])。
+
+请注意,除非你有特殊要求,我们建议你选择 LTS 版。
+
+- [Ubuntu Server][29]
+
+#### 红帽企业版 Linux(RHEL)
+
+红帽企业版 Linux(RHEL)是面向企业和组织的顶级 Linux 平台。如果我们按数字来看,红帽可能不是服务器领域最受欢迎的。但是,有相当一部分企业用户依赖于 RHEL (比如联想)。
+
+从技术上讲,Fedora 和红帽企业版是相关联的。无论红帽要支持什么——在出现在 RHEL 之前,都要在 Fedora 上进行测试。我不是定制需求的服务器发行版专家,所以你一定要查看他们的[官方文档][30]以了解它是否适合你。
+
+- [RHEL][31]
+
+#### SUSE Linux 企业服务器(SLES)
+
+![][32]
+
+别担心,不要把这和 OpenSUSE 混淆。一切都以一个共同的品牌 “SUSE” 命名 —— 但是 OpenSUSE 是一个开源发行版,目标是社区,并且由社区维护。
+
+SUSE Linux 企业服务器(SLES)是基于云的服务器最受欢迎的解决方案之一。为了获得管理开源解决方案的优先支持和帮助,你必须选择订阅。
+
+- [SLES][33]
+
+#### CentOS
+
+![][34]
+
+正如我提到的,对于 RHEL 你需要订阅。而 CentOS 更像是 RHEL 的社区版,因为它是从 RHEL 的源代码中派生出来的。而且,它是开源的,也是免费的。尽管与过去几年相比,使用 CentOS 的托管提供商数量明显减少,但这仍然是一个很好的选择。
+
+CentOS 可能没有加载最新的软件包,但它被认为是最稳定的发行版之一,你可以在各种云平台上找到 CentOS 镜像。如果没有,你可以选择 CentOS 提供的自托管镜像。
+
+- [CentOS][35]
+
+#### 其他选择
+
+你也可以尝试 [Fedora Server][36]或[Debian][37]作为上述发行版的替代品。
+
+### 旧电脑的最佳 Linux 发行版
+
+如果你有一台旧电脑,或者你真的不需要升级你的系统,你仍然可以尝试一些最好的 Linux 发行版。
+
+我们已经详细讨论了一些[最好的轻量级 Linux 发行版][42]。在这里,我们将只提到那些真正突出的东西(以及一些新的补充)。
+
+#### Puppy Linux
+
+![][43]
+
+Puppy Linux 实际上是最小的发行版本之一。刚开始使用 Linux 时,我的朋友建议我尝试一下 Puppy Linux,因为它可以轻松地在较旧的硬件配置上运行。
+
+如果你想在你的旧电脑上享受一次爽快的体验,那就值得去看看。多年来,随着一些新的有用特性的增加,用户体验得到了改善。
+
+- [Puppy Linux][44]
+
+#### Solus Budgie
+
+![][45]
+
+在最近的一个主要版本——[Solus 4 Fortitude][46] 之后,它是一个令人印象深刻的轻量级桌面操作系统。你可以选择像 GNOME 或 MATE 这样的桌面环境。然而,Solus Budgie 恰好是我的最爱之一,它是一款适合初学者的功能齐全的 Linux发行版,同时对系统资源要求很少。
+
+- [Solus][47]
+
+#### Bodhi
+
+![][48]
+
+Bodhi Linux 构建于 Ubuntu 之上。然而,与Ubuntu不同,它在较旧的配置上运行良好。
+
+这个发行版的主要亮点是它的 [Moksha 桌面][49](这是 Enlightenment 17 桌面的延续)。用户体验直观且反应极快。即使我个人不用它,你也应该在你的旧系统上试一试。
+
+- [Bodhi Linux][50]
+
+#### antiX
+
+![][51]
+
+antiX 部分担起了 MX Linux 的责任,它是一个轻量级的 Linux 发行版,为新的或旧的计算机量身定制。其用户界面并不令人印象深刻——但它可以像预期的那样工作。
+
+它基于 Debian,可以作为一个现场版 CD 发行版使用,而不需要安装它。antiX 还提供现场版引导加载程序。与其他发行版相比,你可以保存设置,这样就不会在每次重新启动时丢失设置。不仅如此,你还可以通过其“持久保留”功能将更改保存到根目录中。
+
+因此,如果你正在寻找一个可以在旧硬件上提供快速用户体验的现场版 USB 发行版,antiX 是一个不错的选择。
+
+- [antiX][52]
+
+#### Sparky Linux
+
+![][53]
+
+Sparky Linux 基于 Debian,它是理想的低端系统 Linux 发行版。伴随着超快的用户体验,Sparky Linux 为不同的用户提供了几个特殊版本(或变种)。
+
+例如,它提供了针对一组用户的稳定版本(和变种)和滚动版本。Sparky Linux GameOver 版非常受游戏玩家欢迎,因为它包含了一堆预装的游戏。你可以查看我们的[最佳 Linux 游戏发行版][54] —— 如果你也想在你的系统上玩游戏。
+
+#### 其他选择
+
+你也可以尝试 [Linux Lite][55]、[Lubuntu][56]、[Peppermint][57] 等轻量级 Linux 发行版。
+
+### 面向高级用户的最佳 Linux 发行版
+
+一旦你习惯了各种软件包管理器和命令来帮助你解决任何问题,你就可以开始找寻只为高级用户量身定制的 Linux 发行版。
+
+当然,如果你是专业人士,你会有一套具体的要求。然而,如果你已经作为普通用户使用了一段时间——以下发行版值得一试。
+
+#### Arch Linux
+
+![][58]
+
+Arch Linux 本身是一个简单而强大的发行版,具有陡峭的学习曲线。不像其系统,你不会一次就把所有东西都预先安装好。你必须配置系统并根据需要添加软件包。
+
+此外,在安装 Arch Linux 时,必须按照一组命令来进行(没有图形用户界面)。要了解更多信息,你可以按照我们关于[如何安装 Arch Linux][59] 的指南进行操作。如果你要安装它,你还应该知道在[安装 Arch Linux 后需要做的一些基本事情][60]。这会帮助你快速入门。
+
+除了多才多艺和简便性之外,值得一提的是 Arch Linux 背后的社区非常活跃。所以,如果你遇到问题,你不用担心。
+
+- [Arch Linux][61]
+
+#### Gentoo
+
+![][62]
+
+如果你知道如何编译源代码,Gentoo Linux 是你必须尝试的版本。这也是一个轻量级的发行版,但是,你需要具备必要的技术知识才能使它发挥作用。
+
+当然,[官方手册][63]提供了许多你需要知道的信息。但是,如果你不确定自己在做什么——你需要花很多时间去想如何充分利用它。
+
+- [Gentoo Linux][64]
+
+#### Slackware
+
+![][65]
+
+Slackware 是仍然重要的最古老的 Linux 发行版之一。如果你愿意编译或开发软件来为自己建立一个完美的环境 —— Slackware 是一个不错的选择。
+
+如果你对一些最古老的 Linux 发行版感到好奇,我们有一篇关于[最早的 Linux 发行版][66]可以去看看。
+
+尽管使用它的用户/开发人员的数量已经显著减少,但对于高级用户来说,它仍然是一个极好的选择。此外,最近有个新闻是 [Slackware 有了一个 Patreon 捐赠页面][67],我们希望 Slackware 继续作为最好的 Linux 发行版之一存在。
+
+- [Slackware][68]
+
+### 最佳多用途 Linux 发行版
+
+有些 Linux 发行版既可以作为初学者友好的桌面又可以作为高级操作系统的服务器。因此,我们考虑为这样的发行版编辑一个单独的部分。
+
+如果你不同意我们的观点(或者有建议要补充),请在评论中告诉我们。我们认为,这对于每个用户都可以派上用场:
+
+#### Fedora
+
+![][69]
+
+Fedora 提供两个独立的版本:一个用于台式机/笔记本电脑(Fedora 工作站),另一个用于服务器(Fedora 服务器)。
+
+因此,如果你正在寻找一款时髦的桌面操作系统,有点学习曲线,又对用户友好,那么 Fedora 是一个选择。无论是哪种情况,如果你正在为你的服务器寻找一个 Linux 操作系统,这也是一个不错的选择。
+
+- [Fedora][70]
+
+#### Manjaro
+
+![][71]
+
+Manjaro 基于 [Arch Linux][72]。不用担心,虽然 Arch Linux 是为高级用户量身定制的,但Manjaro 让新手更容易上手。这是一个简单且对初学者友好的 Linux 发行版。用户界面足够好,并且内置了一系列有用的图形用户界面应用程序。
+
+下载时,你可以为 Manjaro 选择[桌面环境][73]。就个人而言,我喜欢 Manjaro 的 KDE 桌面。
+
+- [Manjaro Linux][74]
+
+#### Debian
+
+![][75]
+
+嗯,Ubuntu 是基于 Debian 的——所以它本身是一个非常好的发行版本。Debian 是台式机和服务器的理想选择。
+
+这可能不是对初学者最友好的操作系统——但你可以通过阅读[官方文档][76]轻松开始。[Debian 10 Buster][77] 的最新版本引入了许多变化和必要的改进。所以,你必须试一试!
+
+### 总结
+
+总的来说,这些是我们推荐你去尝试的最好的 Linux 发行版。是的,还有许多其他的 Linux 发行版值得一提,但是根据个人喜好,对每个发行版来说,取决于个人喜好,这种选择是主观的。
+
+但是,我们也为 [Windows 用户][78]、[黑客和脆弱性测试人员][41]、[游戏玩家][54]、[程序员][39]和[偏重隐私者][79]提供了单独的发行版列表所以,如果你感兴趣的话请仔细阅读。
+
+如果你认为我们遗漏了你最喜欢的 Linux 发行版,请在下面的评论中告诉我们你的想法,我们将更新这篇文章。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/best-linux-distributions/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[heguangzhi](https://github.com/heguangzhi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: tmp.NoRXbIWHkg#for-beginners
+[2]: tmp.NoRXbIWHkg#for-servers
+[3]: tmp.NoRXbIWHkg#for-old-computers
+[4]: tmp.NoRXbIWHkg#for-advanced-users
+[5]: tmp.NoRXbIWHkg#general-purpose
+[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/install-google-chrome-ubuntu-10.jpg?ssl=1
+[7]: https://itsfoss.com/install-themes-ubuntu/
+[8]: https://itsfoss.com/tag/ubuntu/
+[9]: https://ubuntu.com/download/desktop
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/linux-Mint-19-desktop.jpg?ssl=1
+[11]: https://www.linuxmint.com/
+[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/elementary-os-juno-feat.jpg?ssl=1
+[13]: https://itsfoss.com/things-to-do-after-installing-elementary-os-5-juno/
+[14]: https://elementary.io/
+[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/mx-linux.jpg?ssl=1
+[16]: https://distrowatch.com/
+[17]: https://en.wikipedia.org/wiki/Linux_distribution#Rolling_distributions
+[18]: https://flatpak.org/
+[19]: https://mxlinux.org/
+[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/zorin-os-15.png?ssl=1
+[21]: https://itsfoss.com/zorin-os-15-release/
+[22]: https://itsfoss.com/zorin-os-interview/
+[23]: https://zorinos.com/
+[24]: https://www.deepin.org/en/
+[25]: https://itsfoss.com/ubuntu-vs-fedora/
+[26]: https://ubuntu.com/download/cloud
+[27]: https://w3techs.com/technologies/details/os-linux/all/all
+[28]: https://thecloudmarket.com/stats
+[29]: https://ubuntu.com/download/server
+[30]: https://developers.redhat.com/products/rhel/docs-and-apis
+[31]: https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux
+[32]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/SUSE-Linux-Enterprise.jpg?ssl=1
+[33]: https://www.suse.com/products/server/
+[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/centos.png?ssl=1
+[35]: https://www.centos.org/
+[36]: https://getfedora.org/en/server/
+[37]: https://www.debian.org/distrib/
+[38]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/coding.jpg?ssl=1
+[39]: https://itsfoss.com/best-linux-distributions-progammers/
+[40]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/hacking.jpg?ssl=1
+[41]: https://itsfoss.com/linux-hacking-penetration-testing/
+[42]: https://itsfoss.com/lightweight-linux-beginners/
+[43]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/puppy-linux-bionic.jpg?ssl=1
+[44]: http://puppylinux.com/
+[45]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/solus-4-featured.jpg?resize=800%2C450&ssl=1
+[46]: https://itsfoss.com/solus-4-release/
+[47]: https://getsol.us/home/
+[48]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/bodhi-linux.png?fit=800%2C436&ssl=1
+[49]: http://www.bodhilinux.com/moksha-desktop/
+[50]: http://www.bodhilinux.com/
+[51]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2017/10/antix-linux-screenshot.jpg?ssl=1
+[52]: https://antixlinux.com/
+[53]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/sparky-linux.jpg?ssl=1
+[54]: https://itsfoss.com/linux-gaming-distributions/
+[55]: https://www.linuxliteos.com/
+[56]: https://lubuntu.me/
+[57]: https://peppermintos.com/
+[58]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/arch_linux_screenshot.jpg?ssl=1
+[59]: https://itsfoss.com/install-arch-linux/
+[60]: https://itsfoss.com/things-to-do-after-installing-arch-linux/
+[61]: https://www.archlinux.org
+[62]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/08/gentoo-linux.png?ssl=1
+[63]: https://wiki.gentoo.org/wiki/Handbook:Main_Page
+[64]: https://www.gentoo.org
+[65]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/slackware-screenshot.jpg?ssl=1
+[66]: https://itsfoss.com/earliest-linux-distros/
+[67]: https://distrowatch.com/dwres.php?resource=showheadline&story=8743
+[68]: http://www.slackware.com/
+[69]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/08/fedora-overview.png?ssl=1
+[70]: https://getfedora.org/
+[71]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/manjaro-gnome.jpg?ssl=1
+[72]: https://www.archlinux.org/
+[73]: https://itsfoss.com/glossary/desktop-environment/
+[74]: https://manjaro.org/
+[75]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/08/debian-screenshot.png?ssl=1
+[76]: https://www.debian.org/releases/stable/installmanual
+[77]: https://itsfoss.com/debian-10-buster/
+[78]: https://itsfoss.com/windows-like-linux-distributions/
+[79]: https://itsfoss.com/privacy-focused-linux-distributions/
diff --git a/published/201910/20190911 4 open source cloud security tools.md b/published/201910/20190911 4 open source cloud security tools.md
new file mode 100644
index 0000000000..f2c9de3893
--- /dev/null
+++ b/published/201910/20190911 4 open source cloud security tools.md
@@ -0,0 +1,88 @@
+[#]: collector: (lujun9972)
+[#]: translator: (hopefully2333)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11432-1.html)
+[#]: subject: (4 open source cloud security tools)
+[#]: via: (https://opensource.com/article/19/9/open-source-cloud-security)
+[#]: author: (Alison Naylor https://opensource.com/users/asnaylor,Anderson Silva https://opensource.com/users/ansilva)
+
+4 种开源云安全工具
+======
+
+> 查找并排除你存储在 AWS 和 GitHub 中的数据里的漏洞。
+
+![Tools in a cloud][1]
+
+如果你的日常工作是开发者、系统管理员、全栈工程师或者是网站可靠性工程师(SRE),工作内容包括使用 Git 从 GitHub 上推送、提交和拉取,并部署到亚马逊 Web 服务上(AWS),安全性就是一个需要持续考虑的一个点。幸运的是,开源工具能帮助你的团队避免犯常见错误,这些常见错误会导致你的组织损失数千美元。
+
+本文介绍了四种开源工具,当你在 GitHub 和 AWS 上进行开发时,这些工具能帮助你提升项目的安全性。同样的,本着开源的精神,我会与三位安全专家——[Travis McPeak][2],奈飞高级云安全工程师;[Rich Monk][3],红帽首席高级信息安全分析师;以及 [Alison Naylor][4],红帽首席信息安全分析师——共同为本文做出贡献。
+
+我们已经按场景对每个工具都做了区分,但是它们并不是相互排斥的。
+
+### 1、使用 gitrob 发现敏感数据
+
+你需要发现任何出现于你们团队的 Git 仓库中的敏感信息,以便你能将其删除。借助专注于攻击应用程序或者操作系统的工具以使用红/蓝队模型,这样可能会更有意义,在这个模型中,一个信息安全团队会划分为两块,一个是攻击团队(又名红队),以及一个防守团队(又名蓝队)。有一个红队来尝试渗透你的系统和应用要远远好于等待一个攻击者来实际攻击你。你的红队可能会尝试使用 [Gitrob][5],该工具可以克隆和爬取你的 Git 仓库,以此来寻找凭证和敏感信息。
+
+即使像 Gitrob 这样的工具可以被用来造成破坏,但这里的目的是让你的信息安全团队使用它来发现无意间泄露的属于你的组织的敏感信息(比如 AWS 的密钥对或者是其他被失误提交上去的凭证)。这样,你可以修整你的仓库并清除敏感数据——希望能赶在攻击者发现它们之前。记住不光要修改受影响的文件,还要[删除它们的历史记录][6]。
+
+### 2、使用 git-secrets 来避免合并敏感数据
+
+虽然在你的 Git 仓库里发现并移除敏感信息很重要,但在一开始就避免合并这些敏感信息岂不是更好?即使错误地提交了敏感信息,使用 [git-secrets][7] 可以避免你陷入公开的困境。这款工具可以帮助你设置钩子,以此来扫描你的提交、提交信息和合并信息,寻找常见的敏感信息模式。注意你选择的模式要匹配你的团队使用的凭证,比如 AWS 访问密钥和秘密密钥。如果发现了一个匹配项,你的提交就会被拒绝,一个潜在的危机就此得到避免。
+
+为你已有的仓库设置 git-secrets 是很简单的,而且你可以使用一个全局设置来保护所有你以后要创建或克隆的仓库。你同样可以在公开你的仓库之前,使用 git-secrets 来扫描它们(包括之前所有的历史版本)。
+
+### 3、使用 Key Conjurer 创建临时凭证
+
+有一点额外的保险来防止无意间公开了存储的敏感信息,这是很好的事,但我们还可以做得更好,就完全不存储任何凭证。追踪凭证,谁访问了它,存储到了哪里,上次更新是什么时候——太麻烦了。然而,以编程的方式生成的临时凭证就可以避免大量的此类问题,从而巧妙地避开了在 Git 仓库里存储敏感信息这一问题。使用 [Key Conjurer][8],它就是为解决这一需求而被创建出来的。有关更多 Riot Games 为什么创建 Key Conjurer,以及 Riot Games 如何开发的 Key Conjurer,请阅读 [Key Conjurer:我们最低权限的策略][9]。
+
+### 4、使用 Repokid 自动化地提供最小权限
+
+任何一个参加过基本安全课程的人都知道,设置最小权限是基于角色的访问控制的最佳实现。难过的是,离开校门,会发现手动运用最低权限策略会变得如此艰难。一个应用的访问需求会随着时间的流逝而变化,开发人员又太忙了没时间去手动削减他们的权限。[Repokid][10] 使用 AWS 提供提供的有关身份和访问管理(IAM)的数据来自动化地调整访问策略。Repokid 甚至可以在 AWS 中为超大型组织提供自动化地最小权限设置。
+
+### 工具而已,又不是大招
+
+这些工具并不是什么灵丹妙药,它们只是工具!所以,在尝试使用这些工具或其他的控件之前,请和你的组织里一起工作的其他人确保你们已经理解了你的云服务的使用情况和用法模式。
+
+应该严肃对待你的云服务和代码仓库服务,并熟悉最佳实现的做法。下面的文章将帮助你做到这一点。
+
+**对于 AWS:**
+
+ * [管理 AWS 访问密钥的最佳实现][11]
+ * [AWS 安全审计指南][12]
+
+**对于 GitHub:**
+
+ * [介绍一种新方法来让你的代码保持安全][13]
+ * [GitHub 企业版最佳安全实现][14]
+
+同样重要的一点是,和你的安全团队保持联系;他们应该可以为你团队的成功提供想法、建议和指南。永远记住:安全是每个人的责任,而不仅仅是他们的。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/open-source-cloud-security
+
+作者:[Alison Naylor][a1],[Anderson Silva][a2]
+选题:[lujun9972][b]
+译者:[hopefully2333](https://github.com/hopefully2333)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a1]: https://opensource.com/users/asnaylor
+[a2]: https://opensource.com/users/ansilva
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cloud_tools_hardware.png?itok=PGjJenqT (Tools in a cloud)
+[2]: https://twitter.com/travismcpeak?lang=en
+[3]: https://github.com/rmonk
+[4]: https://www.linkedin.com/in/alperkins/
+[5]: https://github.com/michenriksen/gitrob
+[6]: https://help.github.com/en/articles/removing-sensitive-data-from-a-repository
+[7]: https://github.com/awslabs/git-secrets
+[8]: https://github.com/RiotGames/key-conjurer
+[9]: https://technology.riotgames.com/news/key-conjurer-our-policy-least-privilege
+[10]: https://github.com/Netflix/repokid
+[11]: https://docs.aws.amazon.com/general/latest/gr/aws-access-keys-best-practices.html
+[12]: https://docs.aws.amazon.com/general/latest/gr/aws-security-audit-guide.html
+[13]: https://github.blog/2019-05-23-introducing-new-ways-to-keep-your-code-secure/
+[14]: https://github.blog/2015-10-09-github-enterprise-security-best-practices/
diff --git a/published/201910/20190916 Copying large files with Rsync, and some misconceptions.md b/published/201910/20190916 Copying large files with Rsync, and some misconceptions.md
new file mode 100644
index 0000000000..3fe61c4a95
--- /dev/null
+++ b/published/201910/20190916 Copying large files with Rsync, and some misconceptions.md
@@ -0,0 +1,101 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11415-1.html)
+[#]: subject: (Copying large files with Rsync, and some misconceptions)
+[#]: via: (https://fedoramagazine.org/copying-large-files-with-rsync-and-some-misconceptions/)
+[#]: author: (Daniel Leite de Abreu https://fedoramagazine.org/author/dabreu/)
+
+使用 rsync 复制大文件的一些误解
+======
+
+![][1]
+
+有一种观点认为,在 IT 行业工作的许多人经常从网络帖子里复制和粘贴。我们都干过,复制粘贴本身不是问题。问题是当我们在不理解它们的情况下这样干。
+
+几年前,一个曾经在我团队中工作的朋友需要将虚拟机模板从站点 A 复制到站点 B。他们无法理解为什么复制的文件在站点 A 上为 10GB,但是在站点 B 上却变为 100GB。
+
+这位朋友认为 `rsync` 是一个神奇的工具,应该仅“同步”文件本身。但是,我们大多数人所忘记的是了解 `rsync` 的真正含义、用法,以及我认为最重要的是它原本是用来做什么的。本文提供了有关 `rsync` 的更多信息,并解释了那件事中发生了什么。
+
+### 关于 rsync
+
+`rsync` 是由 Andrew Tridgell 和 Paul Mackerras 创建的工具,其动机是以下问题:
+
+假设你有两个文件,`file_A` 和 `file_B`。你希望将 `file_B` 更新为与 `file_A` 相同。显而易见的方法是将 `file_A` 复制到 `file_B`。
+
+现在,假设这两个文件位于通过慢速通信链接(例如,拨号 IP 链接)连接的两个不同的服务器上。如果`file_A` 大,将其复制到 `file_B` 将会很慢,有时甚至是不可能完成的。为了提高效率,你可以在发送前压缩 `file_A`,但这通常只会获得 2 到 4 倍的效率提升。
+
+现在假设 `file_A` 和 `file_B` 非常相似,并且为了加快处理速度,你可以利用这种相似性。一种常见的方法是仅通过链接发送 `file_A` 和 `file_B` 之间的差异,然后使用这个差异列表在远程端重建文件。
+
+问题在于,用于在两个文件之间创建一组差异的常规方法依赖于能够读取两个文件。因此,它们要求链接的一端预先提供两个文件。如果它们在同一台计算机上不是同时可用的,则无法使用这些算法。(一旦将文件复制过来,就不需要做对比差异了)。而这是 `rsync` 解决的问题。
+
+`rsync` 算法有效地计算源文件的哪些部分与现有目标文件的部分匹配。这样,匹配的部分就不需要通过链接发送了;所需要的只是对目标文件部分的引用。只有源文件中不匹配的部分才需要发送。
+
+然后,接收者可以使用对现有目标文件各个部分的引用和原始素材来构造源文件的副本。
+
+另外,可以使用一系列常用压缩算法中的任何一种来压缩发送到接收器的数据,以进一步提高速度。
+
+我们都知道,`rsync` 算法以一种漂亮的方式解决了这个问题。
+
+在 `rsync` 的介绍之后,回到那件事!
+
+### 问题 1:自动精简配置
+
+有两件事可以帮助那个朋友了解正在发生的事情。
+
+该文件在其他地方的大小变得越来越大的问题是由源系统上启用了自动精简配置(TP)引起的,这是一种优化存储区域网络(SAN)或网络连接存储(NAS)中可用空间效率的方法。
+
+由于启用了 TP,源文件只有 10GB,并且在不使用任何其他配置的情况下使用 `rsync` 进行传输时,目标位置将接收到全部 100GB 的大小。`rsync` 无法自动完成该(TP)操作,必须对其进行配置。
+
+进行此工作的选项是 `-S`(或 `–sparse`),它告诉 `rsync` 有效地处理稀疏文件。它会按照它说的做!它只会发送该稀疏数据,因此源和目标将有一个 10GB 的文件。
+
+### 问题 2:更新文件
+
+当发送一个更新的文件时会出现第二个问题。现在目标仅接收 10GB 了,但始终传输的是整个文件(包含虚拟磁盘),即使只是在该虚拟磁盘上更改了一个配置文件。换句话说,只是该文件的一小部分发生了更改。
+
+用于此传输的命令是:
+
+```
+rsync -avS vmdk_file syncuser@host1:/destination
+```
+
+同样,了解 `rsync` 的工作方式也将有助于解决此问题。
+
+上面是关于 `rsync` 的最大误解。我们许多人认为 `rsync` 只会发送文件的增量更新,并且只会自动更新需要更新的内容。**但这不是 `rsync` 的默认行为**。
+
+如手册页所述,`rsync` 的默认行为是在目标位置创建文件的新副本,并在传输完成后将其移动到正确的位置。
+
+要更改 `rsync` 的默认行为,你必须设置以下标志,然后 `rsync` 将仅发送增量:
+
+```
+--inplace 原地更新目标文件
+--partial 保留部分传输的文件
+--append 附加数据到更短的文件
+--progress 在传输时显示进度条
+```
+
+因此,可以确切地执行我那个朋友想要的功能的完整命令是:
+
+```
+rsync -av --partial --inplace --append --progress vmdk_file syncuser@host1:/destination
+```
+
+注意,出于两个原因,这里必须删除稀疏选项 `-S`。首先是通过网络发送文件时,不能同时使用 `–sparse` 和 `–inplace`。其次,当你以前使用过 `–sparse` 发送文件时,就无法再使用 `–inplace` 进行更新。请注意,低于 3.1.3 的 `rsync` 版本将拒绝 `–sparse` 和 `–inplace` 的组合。
+
+因此,即使那个朋友最终通过网络复制了 100GB,那也只需发生一次。以下所有更新仅复制差异,从而使复制非常高效。
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/copying-large-files-with-rsync-and-some-misconceptions/
+
+作者:[Daniel Leite de Abreu][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/dabreu/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2019/08/rsync-816x345.jpg
diff --git a/published/201910/20190916 Linux commands to display your hardware information.md b/published/201910/20190916 Linux commands to display your hardware information.md
new file mode 100644
index 0000000000..39cd92b312
--- /dev/null
+++ b/published/201910/20190916 Linux commands to display your hardware information.md
@@ -0,0 +1,363 @@
+[#]: collector: (lujun9972)
+[#]: translator: (way-ww)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11422-1.html)
+[#]: subject: (Linux commands to display your hardware information)
+[#]: via: (https://opensource.com/article/19/9/linux-commands-hardware-information)
+[#]: author: (Howard Fosdick https://opensource.com/users/howtechhttps://opensource.com/users/sethhttps://opensource.com/users/sethhttps://opensource.com/users/seth)
+
+用 Linux 命令显示硬件信息
+======
+
+> 通过命令行获取计算机硬件详细信息。
+
+
+
+你可能会有很多的原因需要查清计算机硬件的详细信息。例如,你需要修复某些问题并在论坛上发出请求,人们可能会立即询问你的计算机具体的信息。或者当你想要升级计算机配置时,你需要知道现有的硬件型号和能够升级的型号。这些都需要查询你的计算机具体规格信息。
+
+最简单的方法是使用标准的 Linux GUI 程序之一:
+
+* [i-nex][2] 收集硬件信息,并且类似于 Windows 下流行的 [CPU-Z][3] 的显示。
+* [HardInfo][4] 显示硬件具体信息,甚至包括一组八个的流行的性能基准程序,你可以用它们评估你的系统性能。
+* [KInfoCenter][5] 和 [Lshw][6] 也能够显示硬件的详细信息,并且可以从许多软件仓库中获取。
+
+或者,你也可以拆开计算机机箱去查看硬盘、内存和其他设备上的标签信息。或者你可以在系统启动时,按下[相应的按键][7]进入 UEFI 和 BIOS 界面获得信息。这两种方式都会向你显示硬件信息但省略软件信息。
+
+你也可以使用命令行获取硬件信息。等一下… 这听起来有些困难。为什么你会要这样做?
+
+有时候通过使用一条针对性强的命令可以很轻松的找到特定信息。也可能你没有可用的 GUI 程序或者只是不想安装这样的程序。
+
+使用命令行的主要原因可能是编写脚本。无论你是使用 Linux shell 还是其他编程语言来编写脚本通常都需要使用命令行。
+
+很多检测硬件信息的命令行都需要使用 root 权限。所以要么切换到 root 用户,要么使用 `sudo` 在普通用户状态下发出命令:
+
+```
+sudo
+```
+
+并按提示输入你的密码。
+
+这篇文章介绍了很多用于发现系统信息的有用命令。文章最后的快速查询表对它们作出了总结。
+
+### 硬件概述
+
+下面几条命令可以全面概述计算机硬件信息。
+
+`inxi` 命令能够列出包括 CPU、图形、音频、网络、驱动、分区、传感器等详细信息。当论坛里的人尝试帮助其他人解决问题的时候,他们常常询问此命令的输出。这是解决问题的标准诊断程序:
+
+```
+inxi -Fxz
+```
+
+`-F` 参数意味着你将得到完整的输出,`x` 增加细节信息,`z` 参数隐藏像 MAC 和 IP 等私人身份信息。
+
+`hwinfo` 和 `lshw` 命令以不同的格式显示大量相同的信息:
+
+```
+hwinfo --short
+```
+
+或
+
+```
+lshw -short
+```
+
+这两条命令的长格式输出非常详细,但也有点难以阅读:
+
+```
+hwinfo
+```
+
+或
+
+```
+lshw
+```
+
+### CPU 详细信息
+
+通过命令你可以了解关于你的 CPU 的任何信息。使用 `lscpu` 命令或与它相近的 `lshw` 命令查看 CPU 的详细信息:
+
+```
+lscpu
+```
+
+或
+
+```
+lshw -C cpu
+```
+
+在这两个例子中,输出的最后几行都列出了所有 CPU 的功能。你可以查看你的处理器是否支持特定的功能。
+
+使用这些命令的时候,你可以通过使用 `grep` 命令过滤复杂的信息,并缩小所需信息范围。例如,只查看 CPU 品牌和型号:
+
+```
+lshw -C cpu | grep -i product
+```
+
+仅查看 CPU 的速度(兆赫兹):
+
+```
+lscpu | grep -i mhz
+```
+
+或其 [BogoMips][8] 额定功率:
+
+```
+lscpu | grep -i bogo
+```
+
+`grep` 命令的 `-i` 参数代表搜索结果忽略大小写。
+
+### 内存
+
+Linux 命令行使你能够收集关于你的计算机内存的所有可能的详细信息。你甚至可以不拆开计算机机箱就能确定是否可以为计算机添加额外的内存条。
+
+使用 `dmidecode` 命令列出每根内存条和其容量:
+
+```
+dmidecode -t memory | grep -i size
+```
+
+使用以下命令获取系统内存更多的信息,包括类型、容量、速度和电压:
+
+```
+lshw -short -C memory
+```
+
+你肯定想知道的一件事是你的计算机可以安装的最大内存:
+
+```
+dmidecode -t memory | grep -i max
+```
+
+现在检查一下计算机是否有空闲的插槽可以插入额外的内存条。你可以通过使用命令在不打开计算机机箱的情况下就做到:
+
+```
+lshw -short -C memory | grep -i empty
+```
+
+输出为空则意味着所有的插槽都在使用中。
+
+确定你的计算机拥有多少显卡内存需要下面的命令。首先使用 `lspci` 列出所有设备信息然后过滤出你想要的显卡设备信息:
+
+```
+lspci | grep -i vga
+```
+
+视频控制器的设备号输出信息通常如下:
+
+```
+00:02.0 VGA compatible controller: Intel Corporation 82Q35 Express Integrated Graphics Controller (rev 02)
+```
+
+现在再加上视频设备号重新运行 `lspci` 命令:
+
+```
+lspci -v -s 00:02.0
+```
+
+输出信息中 `prefetchable` 那一行显示了系统中的显卡内存大小:
+
+```
+...
+Memory at f0100000 (32-bit, non-prefetchable) [size=512K]
+I/O ports at 1230 [size=8]
+Memory at e0000000 (32-bit, prefetchable) [size=256M]
+Memory at f0000000 (32-bit, non-prefetchable) [size=1M]
+...
+```
+
+最后使用下面的命令展示当前内存使用量(兆字节):
+
+```
+free -m
+```
+
+这条命令告诉你多少内存是空闲的,多少命令正在使用中以及交换内存的大小和是否正在使用。例如,输出信息如下:
+
+```
+ total used free shared buff/cache available
+Mem: 11891 1326 8877 212 1687 10077
+Swap: 1999 0 1999
+```
+
+`top` 命令为你提供内存使用更加详细的信息。它显示了当前全部内存和 CPU 使用情况并按照进程 ID、用户 ID 及正在运行的命令细分。同时这条命令也是全屏输出:
+
+```
+top
+```
+
+### 磁盘文件系统和设备
+
+你可以轻松确定有关磁盘、分区、文件系统和其他设备信息。
+
+显示每个磁盘设备的描述信息:
+
+```
+lshw -short -C disk
+```
+
+通过以下命令获取任何指定的 SATA 磁盘详细信息,例如其型号、序列号以及支持的模式和扇区数量等:
+
+```
+hdparm -i /dev/sda
+```
+
+当然,如果需要的话你应该将 `sda` 替换成 `sdb` 或者其他设备号。
+
+要列出所有磁盘及其分区和大小,请使用以下命令:
+
+```
+lsblk
+```
+
+使用以下命令获取更多有关扇区数量、大小、文件系统 ID 和 类型以及分区开始和结束扇区:
+
+```
+fdisk -l
+```
+
+要启动 Linux,你需要确定 [GRUB][9] 引导程序的可挂载分区。你可以使用 `blkid` 命令找到此信息。它列出了每个分区的唯一标识符(UUID)及其文件系统类型(例如 ext3 或 ext4):
+
+```
+blkid
+```
+
+使用以下命令列出已挂载的文件系统和它们的挂载点,以及已用的空间和可用的空间(兆字节为单位):
+
+```
+df -m
+```
+
+最后,你可以列出所有的 USB 和 PCI 总线以及其他设备的详细信息:
+
+```
+lsusb
+```
+
+或
+
+```
+lspci
+```
+
+### 网络
+
+Linux 提供大量的网络相关命令,下面只是几个例子。
+
+查看你的网卡硬件详细信息:
+
+```
+lshw -C network
+```
+
+`ifconfig` 是显示网络接口的传统命令:
+
+```
+ifconfig -a
+```
+
+但是现在很多人们使用:
+
+```
+ip link show
+```
+
+或
+
+```
+netstat -i
+```
+
+在阅读输出时,了解常见的网络缩写十分有用:
+
+缩写 | 含义
+---|---
+`lo` | 回环接口
+`eth0` 或 `enp*` | 以太网接口
+`wlan0` | 无线网接口
+`ppp0` | 点对点协议接口(由拨号调制解调器、PPTP VPN 连接或者 USB 调制解调器使用)
+`vboxnet0` 或 `vmnet*` | 虚拟机网络接口
+
+表中的星号是通配符,代表不同系统的任意字符。
+
+使用以下命令显示默认网关和路由表:
+
+```
+ip route | column -t
+```
+
+或
+
+```
+netstat -r
+```
+
+### 软件
+
+让我们以显示最底层软件详细信息的两条命令来结束。例如,如果你想知道是否安装了最新的固件该怎么办?这条命令显示了 UEFI 或 BIOS 的日期和版本:
+
+```
+dmidecode -t bios
+```
+
+内核版本是多少,以及它是 64 位的吗?网络主机名是什么?使用下面的命令查出结果:
+
+```
+uname -a
+```
+
+### 快速查询表
+
+用途 | 命令
+--- | ---
+显示所有硬件信息 | `inxi -Fxz` 或 `hwinfo --short` 或 `lshw -short`
+CPU 信息 | `lscpu` 或 `lshw -C cpu`
+显示 CPU 功能(例如 PAE、SSE2) | `lshw -C cpu | grep -i capabilities`
+报告 CPU 位数 | `lshw -C cpu | grep -i width`
+显示当前内存大小和配置 | `dmidecode -t memory | grep -i size` 或 `lshw -short -C memory`
+显示硬件支持的最大内存 | `dmidecode -t memory | grep -i max`
+确定是否有空闲内存插槽 | `lshw -short -C memory | grep -i empty`(输出为空表示没有可用插槽)
+确定显卡内存数量 | `lspci | grep -i vga` 然后指定设备号再次使用;例如:`lspci -v -s 00:02.0` 显卡内存数量就是 `prefetchable` 的值
+显示当前内存使用情况 | `free -m` 或 `top`
+列出磁盘驱动器 | `lshw -short -C disk`
+显示指定磁盘驱动器的详细信息 | `hdparm -i /dev/sda`(需要的话替换掉 `sda`)
+列出磁盘和分区信息 | `lsblk`(简单) 或 `fdisk -l`(详细)
+列出分区 ID(UUID)| `blkid`
+列出已挂载文件系统挂载点以及已用和可用空间 | `df -m`
+列出 USB 设备 | `lsusb`
+列出 PCI 设备 | `lspci`
+显示网卡详细信息 | `lshw -C network`
+显示网络接口 | `ifconfig -a` 或 `ip link show` 或 `netstat -i`
+显示路由表 | `ip route | column -t` 或 `netstat -r`
+显示 UEFI/BIOS 信息 | `dmidecode -t bios`
+显示内核版本网络主机名等 | `uname -a`
+
+你有喜欢的命令被我忽略掉的吗?请添加评论分享给大家。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/linux-commands-hardware-information
+
+作者:[Howard Fosdick][a]
+选题:[lujun9972][b]
+译者:[way-ww](https://github.com/way-ww)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/howtechhttps://opensource.com/users/sethhttps://opensource.com/users/sethhttps://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/features_solutions_command_data.png?itok=4_VQN3RK (computer screen )
+[2]: http://sourceforge.net/projects/i-nex/
+[3]: https://www.cpuid.com/softwares/cpu-z.html
+[4]: http://sourceforge.net/projects/hardinfo.berlios/
+[5]: https://userbase.kde.org/KInfoCenter
+[6]: http://www.binarytides.com/linux-lshw-command/
+[7]: http://www.disk-image.com/faq-bootmenu.htm
+[8]: https://en.wikipedia.org/wiki/BogoMips
+[9]: https://www.dedoimedo.com/computers/grub.html
diff --git a/published/201910/20190918 Adding themes and plugins to Zsh.md b/published/201910/20190918 Adding themes and plugins to Zsh.md
new file mode 100644
index 0000000000..a9eaf0da80
--- /dev/null
+++ b/published/201910/20190918 Adding themes and plugins to Zsh.md
@@ -0,0 +1,190 @@
+[#]: collector: (lujun9972)
+[#]: translator: (amwps290)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11426-1.html)
+[#]: subject: (Adding themes and plugins to Zsh)
+[#]: via: (https://opensource.com/article/19/9/adding-plugins-zsh)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+给 Zsh 添加主题和插件
+======
+
+> 通过 Oh My Zsh 安装的主题和插件来扩展 Zsh 的功能。
+
+
+
+在我的[前文][2]中,我向大家展示了如何安装并使用 [Z-Shell][2] (Zsh)。对于某些用户来说,Zsh 最令人激动的是它可以安装主题。Zsh 安装主题非常容易,一方面是因为有非常活跃的社区为 Z-Shell 设计主题,另一方面是因为有 [Oh My Zsh][3] 这个项目。这使得安装主题变得轻而易举。
+
+主题的变化可能会立刻吸引你的注意力,因此如果你安装了 Zsh 并且将默认的 Shell 替换为 Zsh 时,你可能不喜欢 Shell 默认主题的样子,那么你可以立即更换 Oh My Zsh 自带的 100 多个主题。Oh My Zsh 不仅拥有大量精美的主题,同时还有数以百计的扩展 Zsh 功能的插件。
+
+### 安装 Oh My Zsh
+
+Oh My Zsh 的[官网][3]建议你使用一个脚本在有网络的情况下来安装这个包。尽管 Oh My Zsh 项目几乎是可以令人信服的,但是盲目地在你的电脑上运行一个脚本这是一个糟糕的建议。如果你想运行这个脚本,你可以把它下载下来,看一下它实现了什么功能,在你确信你已经了解了它的所作所为之后,你就可以运行它了。
+
+如果你下载了脚本并且阅读了它,你就会发现安装过程仅仅只有三步:
+
+#### 1、克隆 oh-my-zsh
+
+第一步,克隆 oh-my-zsh 库到 `~/.oh-my-zsh` 目录:
+
+```
+% git clone http://github.com/robbyrussell/oh-my-zsh ~/.oh-my-zsh
+```
+
+#### 2、切换配置文件
+
+下一步,备份你已有的 `.zshrc` 文件,然后将 oh-my-zsh 自带的配置文件移动到这个地方。这两步操作可以一步完成,只需要你的 `mv` 命令支持 `-b` 这个选项。
+
+```
+% mv -b \
+~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
+```
+
+#### 3、编辑配置文件
+
+默认情况下,Oh My Zsh 自带的配置文件是非常简陋的。如果你想将你自己的 `~/.zshrc` 文件合并到 `.oh-my-zsh` 的配置文件中。你可以使用 [cat][4] 命令将你的旧的配置文件添加到新文件的末尾。
+
+```
+% cat ~/.zshrc~ >> ~/.zshrc
+```
+
+看一下默认的配置文件以及它提供的一些选项。用你最喜欢的编辑器打开 `~/.zshrc` 文件。这个文件有非常良好的注释。这是了解它的一个非常好的方法。
+
+例如,你可以更改 `.oh-my-zsh` 目录的位置。在安装的时候,它默认是位于你的家目录。但是,根据 [Free Desktop][5] 所定义的现代 Linux 规范。这个目录应当放置于 `~/.local/share` 。你可以在配置文件中进行修改。如下所示:
+
+```
+# Path to your oh-my-zsh installation.
+export ZSH=$HOME/.local/share/oh-my-zsh
+```
+
+然后将 .oh-my-zsh 目录移动到你新配置的目录下:
+
+```
+% mv ~/.oh-my-zsh $HOME/.local/share/oh-my-zsh
+```
+
+如果你使用的是 MacOS,这个目录可能会有点含糊不清,但是最合适的位置可能是在 `$HOME/Library/Application\ Support`。
+
+### 重新启动 Zsh
+
+编辑配置文件之后,你必须重新启动你的 Shell。在这之前,你必须确定你的任何操作都已正确完成。例如,在你修改了 `.oh-my-zsh` 目录的路径之后。不要忘记将目录移动到新的位置。如果你不想重新启动你的 Shell。你可以使用 `source` 命令来使你的配置文件生效。
+
+```
+% source ~/.zshrc
+➜ .oh-my-zsh git:(master) ✗
+```
+
+你可以忽略任何丢失更新文件的警告;他们将会在重启的时候再次进行解析。
+
+### 更换你的主题
+
+安装好 oh-my-zsh 之后。你可以将你的 Zsh 的主题设置为 `robbyrussell`,这是一个该项目维护者的主题。这个主题的更改是非常小的,仅仅是改变了提示符的颜色。
+
+你可以通过列出 `.oh-my-zsh` 目录下的所有文件来查看所有安装的主题:
+
+```
+➜ .oh-my-zsh git:(master) ✗ ls ~/.local/share/oh-my-zsh/themes
+3den.zsh-theme
+adben.zsh-theme
+af-magic.zsh-theme
+afowler.zsh-theme
+agnoster.zsh-theme
+[...]
+```
+
+想在切换主题之前查看一下它的样子,你可以查看 Oh My Zsh 的 [wiki][6] 页面。要查看更多主题,可以查看 [外部主题][7] wiki 页面。
+
+大部分的主题是非常易于安装和使用的,仅仅需要改变 `.zshrc` 文件中的配置选项然后重新载入配置文件。
+
+```
+➜ ~ sed -i 's/_THEME=\"robbyrussel\"/_THEME=\"linuxonly\"/g' ~/.zshrc
+➜ ~ source ~/.zshrc
+seth@darkstar:pts/0->/home/skenlon (0) ➜
+```
+
+其他的主题可能需要一些额外的配置。例如,为了使用 `agnoster` 主题,你必须先安装 Powerline 字体。这是一个开源字体,如果你使用 Linux 操作系统的话,这个字体很可能在你的软件库中存在。使用下面的命令安装这个字体:
+
+```
+➜ ~ sudo dnf install powerline-fonts
+```
+
+在配置文件中更改你的主题:
+
+```
+➜ ~ sed -i 's/_THEME=\"linuxonly\"/_THEME=\"agnoster\"/g' ~/.zshrc
+```
+
+重新启动你的 Sehll(一个简单的 `source` 命令并不会起作用)。一旦重启,你就可以看到新的主题:
+
+![agnoster theme][8]
+
+### 安装插件
+
+Oh My Zsh 有超过 200 的插件,你可以在 `.oh-my-zsh/plugins` 中看到它们。每一个扩展目录下都有一个 `README` 文件解释了这个插件的作用。
+
+一些插件相当简单。例如,`dnf`、`ubuntu`、`brew` 和 `macports` 插件仅仅是为了简化与 DNF、Apt、Homebres 和 MacPorts 的交互操作而定义的一些别名。
+
+而其他的一些插件则较为复杂,`git` 插件默认是被激活使用的。当你的目录是一个 git 仓库的时候,这个扩展就会更新你的 Shell 提示符,以显示当前的分支和是否有未合并的更改。
+
+为了激活这个扩展,你可以将这个扩展添加到你的配置文件 `~/.zshrc` 中。例如,你可以添加 `dnf` 和 `pass` 插件,按照如下的方式更改:
+
+```
+plugins=(git dnf pass)
+```
+
+保存修改,重新启动你的 Shell。
+
+```
+% source ~/.zshrc
+```
+
+这个扩展现在就可以使用了。你可以通过使用 `dnf` 提供的别名来测试一下:
+
+```
+% dnfs fop
+====== Name Exactly Matched: fop ======
+fop.noarch : XSL-driven print formatter
+```
+
+不同的插件做不同的事,因此你可以一次安装一两个插件来帮你学习新的特性和功能。
+
+### 兼容性
+
+一些 Oh My Zsh 插件具有通用性。如果你看到一个插件声称它可以与 Bash 兼容,那么它就可以在你自己的 Bash 中使用。另一些插件需要 Zsh 提供的特定功能。因此,它们并不是所有都能工作。但是你可以添加一些其他的插件,例如 `dnf`、`ubuntu`、`firewalld`,以及其他的一些插件。你可以使用 `source` 使你的选择生效。例如:
+
+```
+if [ -d $HOME/.local/share/oh-my-zsh/plugins ]; then
+ source $HOME/.local/share/oh-my-zsh/plugins/dnf/dnf.plugin.zsh
+fi
+```
+
+### 选择或者不选择 Zsh
+
+Z-shell 的内置功能和它由社区贡献的扩展功能都非常强大。你可以把它当成你的主 Shell 使用,你也可以在你休闲娱乐的时候尝试一下。这取决于你的爱好。
+
+什么是你最喜爱的主题和扩展可以在下方的评论告诉我们!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/adding-plugins-zsh
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[amwps290](https://github.com/amwps290)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/build_structure_tech_program_code_construction.png?itok=nVsiLuag (Someone wearing a hardhat and carrying code )
+[2]: https://linux.cn/article-11378-1.html
+[3]: https://ohmyz.sh/
+[4]: https://opensource.com/article/19/2/getting-started-cat-command
+[5]: http://freedesktop.org
+[6]: https://github.com/robbyrussell/oh-my-zsh/wiki/Themes
+[7]: https://github.com/robbyrussell/oh-my-zsh/wiki/External-themes
+[8]: https://opensource.com/sites/default/files/uploads/zsh-agnoster.jpg (agnoster theme)
+[9]: https://opensource.com/resources/what-is-git
+[10]: https://opensource.com/article/19/7/make-linux-stronger-firewalls
diff --git a/published/201910/20190920 Hone advanced Bash skills by building Minesweeper.md b/published/201910/20190920 Hone advanced Bash skills by building Minesweeper.md
new file mode 100644
index 0000000000..59b0e8cbd1
--- /dev/null
+++ b/published/201910/20190920 Hone advanced Bash skills by building Minesweeper.md
@@ -0,0 +1,325 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wenwensnow)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11430-1.html)
+[#]: subject: (Hone advanced Bash skills by building Minesweeper)
+[#]: via: (https://opensource.com/article/19/9/advanced-bash-building-minesweeper)
+[#]: author: (Abhishek Tamrakar https://opensource.com/users/tamrakar)
+
+通过编写扫雷游戏提高你的 Bash 技巧
+======
+
+> 那些令人怀念的经典游戏可是提高编程能力的好素材。今天就让我们仔细探索一番,怎么用 Bash 编写一个扫雷程序。
+
+![bash logo on green background][1]
+
+我在编程教学方面不是专家,但当我想更好掌握某一样东西时,会试着找出让自己乐在其中的方法。比方说,当我想在 shell 编程方面更进一步时,我决定用 Bash 编写一个[扫雷][2]游戏来加以练习。
+
+如果你是一个有经验的 Bash 程序员,希望在提高技巧的同时乐在其中,那么请跟着我编写一个你的运行在终端中的扫雷游戏。完整代码可以在这个 [GitHub 存储库][3]中找到。
+
+### 做好准备
+
+在我编写任何代码之前,我列出了该游戏所必须的几个部分:
+
+1. 显示雷区
+2. 创建游戏逻辑
+3. 创建判断单元格是否可选的逻辑
+4. 记录可用和已查明(已排雷)单元格的个数
+5. 创建游戏结束逻辑
+
+### 显示雷区
+
+在扫雷中,游戏界面是一个由 2D 数组(列和行)组成的不透明小方格。每一格下都有可能藏有地雷。玩家的任务就是找到那些不含雷的方格,并且在这一过程中,不能点到地雷。这个 Bash 版本的扫雷使用 10x10 的矩阵,实际逻辑则由一个简单的 Bash 数组来完成。
+
+首先,我先生成了一些随机数字。这将是地雷在雷区里的位置。控制地雷的数量,在开始编写代码之前,这么做会容易一些。实现这一功能的逻辑可以更好,但我这么做,是为了让游戏实现保持简洁,并有改进空间。(我编写这个游戏纯属娱乐,但如果你能将它修改的更好,我也是很乐意的。)
+
+下面这些变量在整个过程中是不变的,声明它们是为了随机生成数字。就像下面的 `a` - `g` 的变量,它们会被用来计算可排除的地雷的值:
+
+```
+# 变量
+score=0 # 会用来存放游戏分数
+# 下面这些变量,用来随机生成可排除地雷的实际值
+a="1 10 -10 -1"
+b="-1 0 1"
+c="0 1"
+d="-1 0 1 -2 -3"
+e="1 2 20 21 10 0 -10 -20 -23 -2 -1"
+f="1 2 3 35 30 20 22 10 0 -10 -20 -25 -30 -35 -3 -2 -1"
+g="1 4 6 9 10 15 20 25 30 -30 -24 -11 -10 -9 -8 -7"
+#
+# 声明
+declare -a room # 声明一个 room 数组,它用来表示雷区的每一格。
+```
+
+接下来,我会用列(0-9)和行(a-j)显示出游戏界面,并且使用一个 10x10 矩阵作为雷区。(`M[10][10]` 是一个索引从 0-99,有 100 个值的数组。) 如想了解更多关于 Bash 数组的内容,请阅读这本书[那些关于 Bash 你所不了解的事: Bash 数组简介][4]。
+
+
+创建一个叫 `plough` 的函数,我们先将标题显示出来:两个空行、列头,和一行 `-`,以示意往下是游戏界面:
+
+```
+printf '\n\n'
+printf '%s' " a b c d e f g h i j"
+printf '\n %s\n' "-----------------------------------------"
+```
+
+然后,我初始化一个计数器变量,叫 `r`,它会用来记录已显示多少横行。注意,稍后在游戏代码中,我们会用同一个变量 `r`,作为我们的数组索引。 在 [Bash for 循环][5]中,用 `seq` 命令从 0 增加到 9。我用数字(`d%`)占位,来显示行号(`$row`,由 `seq` 定义):
+
+
+```
+r=0 # 计数器
+for row in $(seq 0 9); do
+ printf '%d ' "$row" # 显示 行数 0-9
+```
+
+在我们接着往下做之前,让我们看看到现在都做了什么。我们先横着显示 `[a-j]` 然后再将 `[0-9]` 的行号显示出来,我们会用这两个范围,来确定用户排雷的确切位置。
+
+接着,在每行中,插入列,所以是时候写一个新的 `for` 循环了。这一循环管理着每一列,也就是说,实际上是生成游戏界面的每一格。我添加了一些辅助函数,你能在源码中看到它的完整实现。 对每一格来说,我们需要一些让它看起来像地雷的东西,所以我们先用一个点(`.`)来初始化空格。为了实现这一想法,我们用的是一个叫 [`is_null_field`][6] 的自定义函数。 同时,我们需要一个存储每一格具体值的数组,这儿会用到之前已定义的全局数组 [`room`][7] , 并用 [变量 `r`][8]作为索引。随着 `r` 的增加,遍历所有单元格,并随机部署地雷。
+
+```
+ for col in $(seq 0 9); do
+ ((r+=1)) # 循环完一列行数加一
+ is_null_field $r # 假设这里有个函数,它会检查单元格是否为空,为真,则此单元格初始值为点(.)
+ printf '%s \e[33m%s\e[0m ' "|" "${room[$r]}" # 最后显示分隔符,注意,${room[$r]} 的第一个值为 '.',等于其初始值。
+ #结束 col 循环
+ done
+```
+
+最后,为了保持游戏界面整齐好看,我会在每行用一个竖线作为结尾,并在最后结束行循环:
+
+```
+printf '%s\n' "|" # 显示出行分隔符
+printf ' %s\n' "-----------------------------------------"
+# 结束行循环
+done
+printf '\n\n'
+```
+
+完整的 `plough` 代码如下:
+
+```
+plough()
+{
+ r=0
+ printf '\n\n'
+ printf '%s' " a b c d e f g h i j"
+ printf '\n %s\n' "-----------------------------------------"
+ for row in $(seq 0 9); do
+ printf '%d ' "$row"
+ for col in $(seq 0 9); do
+ ((r+=1))
+ is_null_field $r
+ printf '%s \e[33m%s\e[0m ' "|" "${room[$r]}"
+ done
+ printf '%s\n' "|"
+ printf ' %s\n' "-----------------------------------------"
+ done
+ printf '\n\n'
+}
+```
+
+我花了点时间来思考,`is_null_field` 的具体功能是什么。让我们来看看,它到底能做些什么。在最开始,我们需要游戏有一个固定的状态。你可以随便选择个初始值,可以是一个数字或者任意字符。我最后决定,所有单元格的初始值为一个点(`.`),因为我觉得,这样会让游戏界面更好看。下面就是这一函数的完整代码:
+
+```
+is_null_field()
+{
+ local e=$1 # 在数组 room 中,我们已经用过循环变量 'r' 了,这次我们用 'e'
+ if [[ -z "${room[$e]}" ]];then
+ room[$r]="." #这里用点(.)来初始化每一个单元格
+ fi
+}
+```
+
+现在,我已经初始化了所有的格子,现在只要用一个很简单的函数就能得出当前游戏中还有多少单元格可以操作:
+
+```
+get_free_fields()
+{
+ free_fields=0 # 初始化变量
+ for n in $(seq 1 ${#room[@]}); do
+ if [[ "${room[$n]}" = "." ]]; then # 检查当前单元格是否等于初始值(.),结果为真,则记为空余格子。
+ ((free_fields+=1))
+ fi
+ done
+}
+```
+
+这是显示出来的游戏界面,`[a-j]` 为列,`[0-9]` 为行。
+
+![Minefield][9]
+
+### 创建玩家逻辑
+
+玩家操作背后的逻辑在于,先从 [stdin][10] 中读取数据作为坐标,然后再找出对应位置实际包含的值。这里用到了 Bash 的[参数扩展][11],来设法得到行列数。然后将代表列数的字母传给分支语句,从而得到其对应的列数。为了更好地理解这一过程,可以看看下面这段代码中,变量 `o` 所对应的值。 举个例子,玩家输入了 `c3`,这时 Bash 将其分成两个字符:`c` 和 `3`。为了简单起见,我跳过了如何处理无效输入的部分。
+
+```
+ colm=${opt:0:1} # 得到第一个字符,一个字母
+ ro=${opt:1:1} # 得到第二个字符,一个整数
+ case $colm in
+ a ) o=1;; # 最后,通过字母得到对应列数。
+ b ) o=2;;
+ c ) o=3;;
+ d ) o=4;;
+ e ) o=5;;
+ f ) o=6;;
+ g ) o=7;;
+ h ) o=8;;
+ i ) o=9;;
+ j ) o=10;;
+ esac
+```
+
+下面的代码会计算用户所选单元格实际对应的数字,然后将结果储存在变量中。
+
+这里也用到了很多的 `shuf` 命令,`shuf` 是一个专门用来生成随机序列的 [Linux 命令][12]。`-i` 选项后面需要提供需要打乱的数或者范围,`-n` 选项则规定输出结果最多需要返回几个值。Bash 中,可以在两个圆括号内进行[数学计算][13],这里我们会多次用到。
+
+还是沿用之前的例子,玩家输入了 `c3`。 接着,它被转化成了 `ro=3` 和 `o=3`。 之后,通过上面的分支语句代码, 将 `c` 转化为对应的整数,带进公式,以得到最终结果 `i` 的值。
+
+```
+ i=$(((ro*10)+o)) # 遵循运算规则,算出最终值
+ is_free_field $i $(shuf -i 0-5 -n 1) # 调用自定义函数,判断其指向空/可选择单元格。
+```
+
+仔细观察这个计算过程,看看最终结果 `i` 是如何计算出来的:
+
+```
+i=$(((ro*10)+o))
+i=$(((3*10)+3))=$((30+3))=33
+```
+
+最后结果是 33。在我们的游戏界面显示出来,玩家输入坐标指向了第 33 个单元格,也就是在第 3 行(从 0 开始,否则这里变成 4),第 3 列。
+
+### 创建判断单元格是否可选的逻辑
+
+为了找到地雷,在将坐标转化,并找到实际位置之后,程序会检查这一单元格是否可选。如不可选,程序会显示一条警告信息,并要求玩家重新输入坐标。
+
+在这段代码中,单元格是否可选,是由数组里对应的值是否为点(`.`)决定的。如果可选,则重置单元格对应的值,并更新分数。反之,因为其对应值不为点,则设置变量 `not_allowed`。为简单起见,游戏中[警告消息][14]这部分源码,我会留给读者们自己去探索。
+
+```
+is_free_field()
+{
+ local f=$1
+ local val=$2
+ not_allowed=0
+ if [[ "${room[$f]}" = "." ]]; then
+ room[$f]=$val
+ score=$((score+val))
+ else
+ not_allowed=1
+ fi
+}
+```
+
+![Extracting mines][15]
+
+如输入坐标有效,且对应位置为地雷,如下图所示。玩家输入 `h6`,游戏界面会出现一些随机生成的值。在发现地雷后,这些值会被加入用户得分。
+
+![Extracting mines][16]
+
+还记得我们开头定义的变量,`a` - `g` 吗,我会用它们来确定随机生成地雷的具体值。所以,根据玩家输入坐标,程序会根据(`m`)中随机生成的数,来生成周围其他单元格的值(如上图所示)。之后将所有值和初始输入坐标相加,最后结果放在 `i`(计算结果如上)中。
+
+请注意下面代码中的 `X`,它是我们唯一的游戏结束标志。我们将它添加到随机列表中。在 `shuf` 命令的魔力下,`X` 可以在任意情况下出现,但如果你足够幸运的话,也可能一直不会出现。
+
+```
+m=$(shuf -e a b c d e f g X -n 1) # 将 X 添加到随机列表中,当 m=X,游戏结束
+ if [[ "$m" != "X" ]]; then # X 将会是我们爆炸地雷(游戏结束)的触发标志
+ for limit in ${!m}; do # !m 代表 m 变量的值
+ field=$(shuf -i 0-5 -n 1) # 然后再次获得一个随机数字
+ index=$((i+limit)) # 将 m 中的每一个值和 index 加起来,直到列表结尾
+ is_free_field $index $field
+ done
+```
+
+我想要游戏界面中,所有随机显示出来的单元格,都靠近玩家选择的单元格。
+
+![Extracting mines][17]
+
+### 记录已选择和可用单元格的个数
+
+这个程序需要记录游戏界面中哪些单元格是可选择的。否则,程序会一直让用户输入数据,即使所有单元格都被选中过。为了实现这一功能,我创建了一个叫 `free_fields` 的变量,初始值为 `0`。用一个 `for` 循环,记录下游戏界面中可选择单元格的数量。 如果单元格所对应的值为点(`.`),则 `free_fields` 加一。
+
+```
+get_free_fields()
+{
+ free_fields=0
+ for n in $(seq 1 ${#room[@]}); do
+ if [[ "${room[$n]}" = "." ]]; then
+ ((free_fields+=1))
+ fi
+ done
+}
+```
+
+等下,如果 `free_fields=0` 呢? 这意味着,玩家已选择过所有单元格。如果想更好理解这一部分,可以看看这里的[源代码][18]。
+
+```
+if [[ $free_fields -eq 0 ]]; then # 这意味着你已选择过所有格子
+ printf '\n\n\t%s: %s %d\n\n' "You Win" "you scored" "$score"
+ exit 0
+fi
+```
+
+### 创建游戏结束逻辑
+
+对于游戏结束这种情况,我们这里使用了一些很[巧妙的技巧][19],将结果在屏幕中央显示出来。我把这部分留给读者朋友们自己去探索。
+
+```
+if [[ "$m" = "X" ]]; then
+ g=0 # 为了在参数扩展中使用它
+ room[$i]=X # 覆盖此位置原有的值,并将其赋值为X
+ for j in {42..49}; do # 在游戏界面中央,
+ out="gameover"
+ k=${out:$g:1} # 在每一格中显示一个字母
+ room[$j]=${k^^}
+ ((g+=1))
+ done
+fi
+```
+
+最后,我们显示出玩家最关心的两行。
+
+```
+if [[ "$m" = "X" ]]; then
+ printf '\n\n\t%s: %s %d\n' "GAMEOVER" "you scored" "$score"
+ printf '\n\n\t%s\n\n' "You were just $free_fields mines away."
+ exit 0
+fi
+```
+
+![Minecraft Gameover][20]
+
+文章到这里就结束了,朋友们!如果你想了解更多,具体可以查看我的 [GitHub 存储库][3],那儿有这个扫雷游戏的源代码,并且你还能找到更多用 Bash 编写的游戏。 我希望,这篇文章能激起你学习 Bash 的兴趣,并乐在其中。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/advanced-bash-building-minesweeper
+
+作者:[Abhishek Tamrakar][a]
+选题:[lujun9972][b]
+译者:[wenwensnow](https://github.com/wenwensnow)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/tamrakar
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background)
+[2]: https://en.wikipedia.org/wiki/Minesweeper_(video_game)
+[3]: https://github.com/abhiTamrakar/playground/tree/master/bash_games
+[4]: https://opensource.com/article/18/5/you-dont-know-bash-intro-bash-arrays
+[5]: https://opensource.com/article/19/6/how-write-loop-bash
+[6]: https://github.com/abhiTamrakar/playground/blob/28143053ced699c80569666f25268e8b96c38c46/bash_games/minesweeper.sh#L114-L120
+[7]: https://github.com/abhiTamrakar/playground/blob/28143053ced699c80569666f25268e8b96c38c46/bash_games/minesweeper.sh#L41
+[8]: https://github.com/abhiTamrakar/playground/blob/28143053ced699c80569666f25268e8b96c38c46/bash_games/minesweeper.sh#L74
+[9]: https://opensource.com/sites/default/files/uploads/minefield.png (Minefield)
+[10]: https://en.wikipedia.org/wiki/Standard_streams#Standard_input_(stdin)
+[11]: https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
+[12]: https://linux.die.net/man/1/shuf
+[13]: https://www.tldp.org/LDP/abs/html/dblparens.html
+[14]: https://github.com/abhiTamrakar/playground/blob/28143053ced699c80569666f25268e8b96c38c46/bash_games/minesweeper.sh#L143-L177
+[15]: https://opensource.com/sites/default/files/uploads/extractmines.png (Extracting mines)
+[16]: https://opensource.com/sites/default/files/uploads/extractmines2.png (Extracting mines)
+[17]: https://opensource.com/sites/default/files/uploads/extractmines3.png (Extracting mines)
+[18]: https://github.com/abhiTamrakar/playground/blob/28143053ced699c80569666f25268e8b96c38c46/bash_games/minesweeper.sh#L91
+[19]: https://github.com/abhiTamrakar/playground/blob/28143053ced699c80569666f25268e8b96c38c46/bash_games/minesweeper.sh#L131-L141
+[20]: https://opensource.com/sites/default/files/uploads/gameover.png (Minecraft Gameover)
diff --git a/published/201910/20190923 Installation Guide of Manjaro 18.1 (KDE Edition) with Screenshots.md b/published/201910/20190923 Installation Guide of Manjaro 18.1 (KDE Edition) with Screenshots.md
new file mode 100644
index 0000000000..bd8516c2b3
--- /dev/null
+++ b/published/201910/20190923 Installation Guide of Manjaro 18.1 (KDE Edition) with Screenshots.md
@@ -0,0 +1,214 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11487-1.html)
+[#]: subject: (Installation Guide of Manjaro 18.1 (KDE Edition) with Screenshots)
+[#]: via: (https://www.linuxtechi.com/install-manjaro-18-1-kde-edition-screenshots/)
+[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/)
+
+Manjaro 18.1(KDE)安装图解
+======
+
+在 Manjaro 18.0(Illyria)发布一年之际,该团队发布了他们的下一个重要版本,即 Manjaro 18.1,代号为 “Juhraya”。该团队还发布了一份官方声明,称 Juhraya 包含了许多改进和错误修复。
+
+### Manjaro 18.1 中的新功能
+
+以下列出了 Manjaro 18.1 中的一些新功能和增强功能:
+
+* 可以在 LibreOffice 或 Free Office 之间选择
+* Xfce 版的新 Matcha 主题
+* 在 KDE 版本中重新设计了消息传递系统
+* 使用 bhau 工具支持 Snap 和 FlatPak 软件包
+
+### 最小系统需求
+
+* 1 GB RAM
+* 1 GHz 处理器
+* 大约 30 GB 硬盘空间
+* 互联网连接
+* 启动介质(USB/DVD)
+
+### 安装 Manjaro 18.1(KDE 版)的分步指南
+
+要在系统中开始安装 Manjaro 18.1(KDE 版),请遵循以下步骤:
+
+#### 步骤 1) 下载 Manjaro 18.1 ISO
+
+在安装之前,你需要从位于 [这里][1] 的官方下载页面下载 Manjaro 18.1 的最新副本。由于我们这里介绍的是 KDE 版本,因此我们选择 KDE 版本。但是对于所有桌面环境(包括 Xfce、KDE 和 Gnome 版本),安装过程都是相同的。
+
+#### 步骤 2) 创建 USB 启动盘
+
+从 Manjaro 下载页面成功下载 ISO 文件后,就可以创建 USB 磁盘了。将下载的 ISO 文件复制到 USB 磁盘中,然后创建可引导磁盘。确保将你的引导设置更改为使用 USB 引导,并重新启动系统。
+
+#### 步骤 3) Manjaro Live 版安装环境
+
+系统重新启动时,它将自动检测到 USB 驱动器,并开始启动进入 Manjaro Live 版安装屏幕。
+
+![Boot-Manjaro-18-1-kde-installation][3]
+
+接下来,使用箭头键选择 “启动:Manjaro x86\_64 kde”,然后按回车键以启动 Manjaro 安装程序。
+
+#### 安装 4) 选择启动安装程序
+
+接下来,将启动 Manjaro 安装程序,如果你已连接到互联网,Manjaro 将自动检测你的位置和时区。单击 “启动安装程序”,开始在系统中安装 Manjaro 18.1 KDE 版本。
+
+![Choose-Launch-Installaer-Manjaro18-1-kde][4]
+
+#### 步骤 5) 选择语言
+
+接下来,安装程序将带你选择你的首选语言。
+
+![Choose-Language-Manjaro18-1-Kde-Installation][5]
+
+选择你想要的语言,然后单击“下一步”。
+
+#### 步骤 6) 选择时区和区域
+
+在下一个屏幕中,选择所需的时区和区域,然后单击“下一步”继续。
+
+![Select-Location-During-Manjaro18-1-KDE-Installation][6]
+
+#### 步骤 7) 选择键盘布局
+
+在下一个屏幕中,选择你喜欢的键盘布局,然后单击“下一步”继续。
+
+![Select-Keyboard-Layout-Manjaro18-1-kde-installation][7]
+
+#### 步骤 8) 选择分区类型
+
+这是安装过程中非常关键的一步。 它将允许你选择分区方式:
+
+* 擦除磁盘
+* 手动分区
+* 并存安装
+* 替换分区
+
+如果在 VM(虚拟机)中安装 Manjaro 18.1,则将看不到最后两个选项。
+
+如果你不熟悉 Manjaro Linux,那么我建议你使用第一个选项(擦除磁盘),它将为你自动创建所需的分区。如果要创建自定义分区,则选择第二个选项“手动分区”,顾名思义,它将允许我们创建自己的自定义分区。
+
+在本教程中,我将通过选择“手动分区”选项来创建自定义分区:
+
+![Manual-Partition-Manjaro18-1-KDE][8]
+
+选择第二个选项,然后单击“下一步”继续。
+
+如我们所见,我有 40 GB 硬盘,因此我将在其上创建以下分区,
+
+* `/boot` – 2GB(ext4)
+* `/` – 10 GB(ext4)
+* `/home` – 22 GB(ext4)
+* `/opt` – 4 GB(ext4)
+* 交换分区 – 2 GB
+
+当我们在上方窗口中单击“下一步”时,将显示以下屏幕,选择“新建分区表”:
+
+![Create-Partition-Table-Manjaro18-1-Installation][9]
+
+点击“确定”。
+
+现在选择可用空间,然后单击“创建”以将第一个分区设置为大小为 2 GB 的 `/boot`,
+
+![boot-partition-manjaro-18-1-installation][10]
+
+单击“确定”以继续操作,在下一个窗口中再次选择可用空间,然后单击“创建”以将第二个分区设置为 `/`,大小为 10 GB:
+
+![slash-root-partition-manjaro18-1-installation][11]
+
+同样,将下一个分区创建为大小为 22 GB 的 `/home`:
+
+![home-partition-manjaro18-1-installation][12]
+
+到目前为止,我们已经创建了三个分区作为主分区,现在创建下一个分区作为扩展分区:
+
+![Extended-Partition-Manjaro18-1-installation][13]
+
+单击“确定”以继续。
+
+创建大小分别为 5 GB 和 2 GB 的 `/opt` 和交换分区作为逻辑分区。
+
+![opt-partition-manjaro-18-1-installation][14]
+
+![swap-partition-manjaro18-1-installation][15]
+
+完成所有分区的创建后,单击“下一步”:
+
+![choose-next-after-partition-creation][16]
+
+#### 步骤 9) 提供用户信息
+
+在下一个屏幕中,你需要提供用户信息,包括你的姓名、用户名、密码、计算机名等:
+
+![User-creation-details-manjaro18-1-installation][17]
+
+提供所有信息后,单击“下一步”继续安装。
+
+在下一个屏幕中,系统将提示你选择办公套件,因此请做出适合你的选择:
+
+![Office-Suite-Selection-Manjaro18-1][18]
+
+单击“下一步”以继续。
+
+#### 步骤 10) 摘要信息
+
+在完成实际安装之前,安装程序将向你显示你选择的所有详细信息,包括语言、时区、键盘布局和分区信息等。单击“安装”以继续进行安装过程。
+
+![Summary-manjaro18-1-installation][19]
+
+#### 步骤 11) 进行安装
+
+现在,实际的安装过程开始,一旦完成,请重新启动系统以登录到 Manjaro 18.1 KDE 版:
+
+![Manjaro18-1-Installation-Progress][20]
+
+![Restart-Manjaro-18-1-after-installation][21]
+
+#### 步骤 12) 安装成功后登录
+
+重新启动后,我们将看到以下登录屏幕,使用我们在安装过程中创建的用户凭据登录:
+
+![Login-screen-after-manjaro-18-1-installation][22]
+
+点击“登录”。
+
+![KDE-Desktop-Screen-Manjaro-18-1][23]
+
+就是这样!你已经在系统中成功安装了 Manjaro 18.1 KDE 版,并探索了所有令人兴奋的功能。请在下面的评论部分中发表你的反馈和建议。
+
+--------------------------------------------------------------------------------
+
+via: https://www.linuxtechi.com/install-manjaro-18-1-kde-edition-screenshots/
+
+作者:[Pradeep Kumar][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linuxtechi.com/author/pradeep/
+[b]: https://github.com/lujun9972
+[1]: https://manjaro.org/download/official/kde/
+[2]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[3]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Boot-Manjaro-18-1-kde-installation.jpg
+[4]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Choose-Launch-Installaer-Manjaro18-1-kde.jpg
+[5]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Choose-Language-Manjaro18-1-Kde-Installation.jpg
+[6]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Select-Location-During-Manjaro18-1-KDE-Installation.jpg
+[7]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Select-Keyboard-Layout-Manjaro18-1-kde-installation.jpg
+[8]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Manual-Partition-Manjaro18-1-KDE.jpg
+[9]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Create-Partition-Table-Manjaro18-1-Installation.jpg
+[10]: https://www.linuxtechi.com/wp-content/uploads/2019/09/boot-partition-manjaro-18-1-installation.jpg
+[11]: https://www.linuxtechi.com/wp-content/uploads/2019/09/slash-root-partition-manjaro18-1-installation.jpg
+[12]: https://www.linuxtechi.com/wp-content/uploads/2019/09/home-partition-manjaro18-1-installation.jpg
+[13]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Extended-Partition-Manjaro18-1-installation.jpg
+[14]: https://www.linuxtechi.com/wp-content/uploads/2019/09/opt-partition-manjaro-18-1-installation.jpg
+[15]: https://www.linuxtechi.com/wp-content/uploads/2019/09/swap-partition-manjaro18-1-installation.jpg
+[16]: https://www.linuxtechi.com/wp-content/uploads/2019/09/choose-next-after-partition-creation.jpg
+[17]: https://www.linuxtechi.com/wp-content/uploads/2019/09/User-creation-details-manjaro18-1-installation.jpg
+[18]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Office-Suite-Selection-Manjaro18-1.jpg
+[19]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Summary-manjaro18-1-installation.jpg
+[20]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Manjaro18-1-Installation-Progress.jpg
+[21]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Restart-Manjaro-18-1-after-installation.jpg
+[22]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Login-screen-after-manjaro-18-1-installation.jpg
+[23]: https://www.linuxtechi.com/wp-content/uploads/2019/09/KDE-Desktop-Screen-Manjaro-18-1.jpg
diff --git a/published/201910/20190923 Mutation testing by example- How to leverage failure.md b/published/201910/20190923 Mutation testing by example- How to leverage failure.md
new file mode 100644
index 0000000000..f0d5dac0df
--- /dev/null
+++ b/published/201910/20190923 Mutation testing by example- How to leverage failure.md
@@ -0,0 +1,186 @@
+[#]: collector: (lujun9972)
+[#]: translator: (Morisun029)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11483-1.html)
+[#]: subject: (Mutation testing by example: How to leverage failure)
+[#]: via: (https://opensource.com/article/19/9/mutation-testing-example-tdd)
+[#]: author: (Alex Bunardzic https://opensource.com/users/alex-bunardzic)
+
+变异测试:如何利用故障?
+======
+
+> 使用事先设计好的故障以确保你的代码达到预期的结果,并遵循 .NET xUnit.net 测试框架来进行测试。
+
+
+
+[在变异测试是 TDD 的演变][2] 一文中,我谈到了迭代的力量。在可度量的测试中,迭代能够保证找到问题的解决方案。在那篇文章中,我们讨论了迭代法帮助确定实现计算给定数字平方根的代码。
+
+我还演示了最有效的方法是找到可衡量的目标或测试,然后以最佳猜测值开始迭代。正如所预期的,第一次测试通常会失败。因此,必须根据可衡量的目标或测试对失败的代码进行完善。根据运行结果,对测试值进行验证或进一步加以完善。
+
+在此模型中,学习获得解决方案的唯一方法是反复失败。这听起来有悖常理,但它确实有效。
+
+按照这种分析,本文探讨了在构建包含某些依赖项的解决方案时使用 DevOps 的最佳方法。第一步是编写一个预期结果失败的用例。
+
+### 依赖性问题是你不能依赖它们
+
+正如迈克尔·尼加德在《[没有终结状态的架构][3]》中机智的表示的那样,依赖问题是一个很大的话题,最好留到另一篇文章中讨论。在这里,你将会看到依赖项给项目带来的一些潜在问题,以及如何利用测试驱动开发(TDD)来避免这些陷阱。
+
+首先,找到现实生活中的一个挑战,然后看看如何使用 TDD 解决它。
+
+### 谁把猫放出来?
+
+![一只猫站在屋顶][4]
+
+在敏捷开发环境中,通过定义期望结果开始构建解决方案会很有帮助。通常,在 [用户故事][5] 中描述期望结果:
+
+> 我想使用我的家庭自动化系统(HAS)来控制猫何时可以出门,因为我想保证它在夜间的安全。
+
+现在你已经有了一个用户故事,你需要通过提供一些功能要求(即指定验收标准)来对其进行详细说明。 从伪代码中描述的最简单的场景开始:
+
+> 场景 1:在夜间关闭猫门
+>
+> * 用时钟监测到了晚上的时间
+> * 时钟通知 HAS 系统
+> * HAS 关闭支持物联网(IoT)的猫门
+
+### 分解系统
+
+开始构建之前,你需要将正在构建的系统(HAS)进行分解(分解为依赖项)。你必须要做的第一件事是识别任何依赖项(如果幸运的话,你的系统没有依赖项,这将会更容易,但是,这样的系统可以说不是非常有用)。
+
+从上面的简单场景中,你可以看到所需的业务成果(自动控制猫门)取决于对夜间情况监测。这种依赖性取决于时钟。但是时钟是无法区分白天和夜晚的。需要你来提供这种逻辑。
+
+正在构建的系统中的另一个依赖项是能够自动访问猫门并启用或关闭它。该依赖项很可能取决于具有 IoT 功能的猫门提供的 API。
+
+### 依赖管理面临快速失败
+
+为了满足依赖项,我们将构建确定当前时间是白天还是晚上的逻辑。本着 TDD 的精神,我们将从一个小小的失败开始。
+
+有关如何设置此练习所需的开发环境和脚手架的详细说明,请参阅我的[上一篇文章][2]。我们将重用相同的 NET 环境和 [xUnit.net][6] 框架。
+
+接下来,创建一个名为 HAS(“家庭自动化系统”)的新项目,创建一个名为 `UnitTest1.cs` 的文件。在该文件中,编写第一个失败的单元测试。在此单元测试中,描述你的期望结果。例如,当系统运行时,如果时间是晚上 7 点,负责确定是白天还是夜晚的组件将返回值 `Nighttime`。
+
+这是描述期望值的单元测试:
+
+```
+using System;
+using Xunit;
+
+namespace unittest
+{
+ public class UnitTest1
+ {
+ DayOrNightUtility dayOrNightUtility = new DayOrNightUtility();
+
+ [Fact]
+ public void Given7pmReturnNighttime()
+ {
+ var expected = "Nighttime";
+ var actual = dayOrNightUtility.GetDayOrNight();
+ Assert.Equal(expected, actual);
+ }
+ }
+}
+```
+
+至此,你可能已经熟悉了单元测试的结构。快速复习一下:在此示例中,通过给单元测试一个描述性名称`Given7pmReturnNighttime` 来描述期望结果。然后,在单元测试的主体中,创建一个名为 `expected` 的变量,并为该变量指定期望值(在该示例中,值为 `Nighttime`)。然后,为实际值指定一个 `actual`(在组件或服务处理一天中的时间之后可用)。
+
+最后,通过断言期望值和实际值是否相等来检查是否满足期望结果:`Assert.Equal(expected, actual)`。
+
+你还可以在上面的列表中看到名为 `dayOrNightUtility` 的组件或服务。该模块能够接收消息`GetDayOrNight`,并且返回 `string` 类型的值。
+
+同样,本着 TDD 的精神,描述的组件或服务还尚未构建(仅为了后面说明在此进行描述)。构建这些是由所描述的期望结果来驱动的。
+
+在 `app` 文件夹中创建一个新文件,并将其命名为 `DayOrNightUtility.cs`。将以下 C# 代码添加到该文件中并保存:
+
+```
+using System;
+
+namespace app {
+ public class DayOrNightUtility {
+ public string GetDayOrNight() {
+ string dayOrNight = "Undetermined";
+ return dayOrNight;
+ }
+ }
+}
+```
+
+现在转到命令行,将目录更改为 `unittests` 文件夹,然后运行:
+
+```
+[Xunit.net 00:00:02.33] unittest.UnitTest1.Given7pmReturnNighttime [FAIL]
+Failed unittest.UnitTest1.Given7pmReturnNighttime
+[...]
+```
+
+恭喜,你已经完成了第一个失败的单元测试。单元测试的期望结果是 `DayOrNightUtility` 方法返回字符串 `Nighttime`,但相反,它返回是 `Undetermined`。
+
+### 修复失败的单元测试
+
+修复失败的测试的一种快速而粗略的方法是将值 `Undetermined` 替换为值 `Nighttime` 并保存更改:
+
+```
+using System;
+
+namespace app {
+ public class DayOrNightUtility {
+ public string GetDayOrNight() {
+ string dayOrNight = "Nighttime";
+ return dayOrNight;
+ }
+ }
+}
+```
+
+现在运行,成功了。
+
+```
+Starting test execution, please wait...
+
+Total tests: 1. Passed: 1. Failed: 0. Skipped: 0.
+Test Run Successful.
+Test execution time: 2.6470 Seconds
+```
+
+但是,对值进行硬编码基本上是在作弊,最好为 `DayOrNightUtility` 方法赋予一些智能。修改 `GetDayOrNight` 方法以包括一些时间计算逻辑:
+
+```
+public string GetDayOrNight() {
+ string dayOrNight = "Daylight";
+ DateTime time = new DateTime();
+ if(time.Hour < 7) {
+ dayOrNight = "Nighttime";
+ }
+ return dayOrNight;
+}
+```
+
+该方法现在从系统获取当前时间,并与 `Hour` 比较,查看其是否小于上午 7 点。如果小于,则处理逻辑将 `dayOrNight` 字符串值从 `Daylight` 转换为 `Nighttime`。现在,单元测试通过。
+
+### 测试驱动解决方案的开始
+
+现在,我们已经开始了基本的单元测试,并为我们的时间依赖项提供了可行的解决方案。后面还有更多的测试案例需要执行。
+
+在下一篇文章中,我将演示如何对白天时间进行测试以及如何在整个过程中利用故障。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/mutation-testing-example-tdd
+
+作者:[Alex Bunardzic][a]
+选题:[lujun9972][b]
+译者:[Morisun029](https://github.com/Morisun029)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/alex-bunardzic
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/fail_failure_celebrate.png?itok=LbvDAEZF (failure sign at a party, celebrating failure)
+[2]: https://linux.cn/article-11468-1.html
+[3]: https://www.infoq.com/presentations/Architecture-Without-an-End-State/
+[4]: https://opensource.com/sites/default/files/uploads/cat.png (Cat standing on a roof)
+[5]: https://www.agilealliance.org/glossary/user-stories
+[6]: https://xunit.net/
+[7]: http://www.google.com/search?q=new+msdn.microsoft.com
diff --git a/published/201910/20190924 Fedora and CentOS Stream.md b/published/201910/20190924 Fedora and CentOS Stream.md
new file mode 100644
index 0000000000..d31e7437c0
--- /dev/null
+++ b/published/201910/20190924 Fedora and CentOS Stream.md
@@ -0,0 +1,70 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11412-1.html)
+[#]: subject: (Fedora and CentOS Stream)
+[#]: via: (https://fedoramagazine.org/fedora-and-centos-stream/)
+[#]: author: (Matthew Miller https://fedoramagazine.org/author/mattdm/)
+
+Fedora 和 CentOS Stream
+======
+
+![][1]
+
+*一封来自 Fedora 项目负责人办公室的信件:*
+
+(LCTT 译注:背景介绍 —— 红帽宣布与 CentOS 同步构建一个 CentOS Stream 滚动构建版。我们知道 Fedora 是红帽企业版 Linux [RHEL] 的上游,经过 Fedora 验证的特性才会放入 RHEL;而 RHEL 发布后,其源代码开放出来形成了 CentOS。而新的 CentOS Stream 则位于 Fedora 和 RHEL 之间,会滚动添加新的实验特性、更新的软件包等。)
+
+嗨,大家好!你可能已经看到有关 [CentOS 项目变更][3]的[公告][2]。(如果没有,请花一些时间阅读它,我等你看完回来!)现在你可能想知道:如果 CentOS 现在位于 RHEL 的上游,那么 Fedora 会发生什么?那不是 Fedora 在 Red Hat 生态系统中的角色吗?
+
+首先,不用担心。整体有一些变化,但是一切都变得更好。
+
+![][4]
+
+如果你一直在关注 RHEL 领导者关于 Fedora、CentOS 和 RHEL 之间关系的会议讨论,那么你就听说过 “[彭罗斯三角][5]”。形状就像 M. C. Escher 绘图中的形状:在现实生活中这是不可能的!
+
+我们已经思考了一段时间,*也许*几何不可能实际上是最好的模型。
+
+一方面,想象中的流向最终的贡献会流回 Fedora 并以“良性循环”增长,但这种流从来没有真正起作用过。 真可惜,因为有一个庞大而强大的 CentOS 社区,并且有很多伟大的人在为此工作,而且 Fedora 社区也有很多重叠之处。我们错失了。
+
+但是,这个缺口并不是唯一的空隙:在该项目与产品之间并没有真正一致的流程。到目前为止,该过程如下:
+
+1. 在上一版 RHEL 发布之后的某个时间,红帽突然会比以往更加关注 Fedora。
+2. 几个月后,红帽将分拆出一个内部开发的 RHEL 新版本。
+3. 几个月后,它便被带到了世界各地,成为所有包括 CentOS 在内的下游发行版的来源。
+4. 这些源持续向下更新,有时这些更新包括 Fedora 中的修补程序,但没有明确的路径。
+
+这里的每个步骤都有其问题:间歇性注意力、闭门开发、盲目下发以及几乎没有持续的透明度。但是现在红帽和 CentOS 项目正在解决此问题,这对 Fedora 也是个好消息。
+
+**Fedora 仍将是 RHEL 的[第一个][6]上游**。这是每个 RHEL 的来源,也是 RHEL 9 的来源。但是在 RHEL 分支之后,*CentOS* 将成为上游,以继续进行那些 RHEL 版本的工作。我喜欢称其为“中游”,但营销人员却不这样称呼,因此将其称为 “CentOS Stream”。
+
+我们(Fedora、CentOS 和红帽)仍需要解决各种技术细节,但是我们的想法是这些分支将存在于同一软件包源存储库中。(目前的计划是制作一个 “src.centos.org”,它具有与 [src.fedoraproject.org][7] 相同数据的并行视图)。这项更改使公众可以看到已经发布的 RHEL 上正在进行的工作,并为开发人员和红帽合作伙伴在该级别进行协作提供了场所。
+
+[CentOS SIG][8](虚拟化、存储、配置管理等特殊兴趣小组)将在 Fedora 分支旁边的共享空间中开展工作。这将使项目之间的协作和共享更加容易,我希望我们甚至能够合并一些类似的 SIG,以直接协同工作。在有用的情况下,可以将 Fedora 软件包中的修补程序挑选到 CentOS “中游”中,反之亦然。
+
+最终,Fedora、CentOS 和 RHEL 属于同一大型项目家族。这种新的、更自然的流程为协作提供了可能性,这些协作被锁定在人为(和超维度!)障碍的后面。我们现在可以一起做,我感到非常兴奋!
+
+*—— Matthew Miller, Fedora 项目负责人*
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/fedora-and-centos-stream/
+
+作者:[Matthew Miller][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/mattdm/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2019/09/centos-stream-816x345.jpg
+[2]: http://redhat.com/en/blog/transforming-development-experience-within-centos
+[3]: https://wiki.centos.org/Manuals/ReleaseNotes/CentOSStream
+[4]: https://lh3.googleusercontent.com/5XMDU29DYPsFKIVLCexK46n9DqWZEa0nTjAnJcouzww-RSAzNshGW3yIxXBSBsd6KfAyUAGpxX9y0Dsh1hj21ygcAn5a7h55LrneKROkxsipdXO2gq8cgoFqz582ojOh8NU9Ix0X
+[5]: https://www.youtube.com/watch?v=1JmgOkEznjw
+[6]: https://docs.fedoraproject.org/en-US/project/#_first
+[7]: https://src.fedoraproject.org/
+[8]: https://wiki.centos.org/SpecialInterestGroup
diff --git a/published/201910/20190924 How DevOps professionals can become security champions.md b/published/201910/20190924 How DevOps professionals can become security champions.md
new file mode 100644
index 0000000000..c356e406ff
--- /dev/null
+++ b/published/201910/20190924 How DevOps professionals can become security champions.md
@@ -0,0 +1,105 @@
+[#]: collector: (lujun9972)
+[#]: translator: (hopefully2333)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11498-1.html)
+[#]: subject: (How DevOps professionals can become security champions)
+[#]: via: (https://opensource.com/article/19/9/devops-security-champions)
+[#]: author: (Jessica Repka https://opensource.com/users/jrepka)
+
+DevOps 专业人员如何成为网络安全拥护者
+======
+
+> 打破信息孤岛,成为网络安全的拥护者,这对你、对你的职业、对你的公司都会有所帮助。
+
+
+
+安全是 DevOps 中一个被误解了的部分,一些人认为它不在 DevOps 的范围内,而另一些人认为它太过重要(并且被忽视),建议改为使用 DevSecOps。无论你同意哪一方的观点,网络安全都会影响到我们每一个人,这是很明显的事实。
+
+每年,[黑客行为的统计数据][3] 都会更加令人震惊。例如,每 39 秒就有一次黑客行为发生,这可能会导致你为公司写的记录、身份和专有项目被盗。你的安全团队可能需要花上几个月(也可能是永远找不到)才能发现这次黑客行为背后是谁,目的是什么,人在哪,什么时候黑进来的。
+
+运维专家面对这些棘手问题应该如何是好?呐我说,现在是时候成为网络安全的拥护者,变为解决方案的一部分了。
+
+### 孤岛势力范围的战争
+
+在我和我本地的 IT 安全(ITSEC)团队一起肩并肩战斗的岁月里,我注意到了很多事情。一个很大的问题是,安全团队和 DevOps 之间关系紧张,这种情况非常普遍。这种紧张关系几乎都是来源于安全团队为了保护系统、防范漏洞所作出的努力(例如,设置访问控制或者禁用某些东西),这些努力会中断 DevOps 的工作并阻碍他们快速部署应用程序。
+
+你也看到了,我也看到了,你在现场碰见的每一个人都有至少一个和它有关的故事。一小撮的怨恨最终烧毁了信任的桥梁,要么是花费一段时间修复,要么就是两个团体之间开始一场小型的地盘争夺战,这个结果会使 DevOps 实现起来更加艰难。
+
+### 一种新观点
+
+为了打破这些孤岛并结束势力战争,我在每个安全团队中都选了至少一个人来交谈,了解我们组织日常安全运营里的来龙去脉。我开始做这件事是出于好奇,但我持续做这件事是因为它总是能带给我一些有价值的、新的观点。例如,我了解到,对于每个因为失败的安全性而被停止的部署,安全团队都在疯狂地尝试修复 10 个他们看见的其他问题。他们反应的莽撞和尖锐是因为他们必须在有限的时间里修复这些问题,不然这些问题就会变成一个大问题。
+
+考虑到发现、识别和撤销已完成操作所需的大量知识,或者指出 DevOps 团队正在做什么(没有背景信息)然后复制并测试它。所有的这些通常都要由人手配备非常不足的安全团队完成。
+
+这就是你的安全团队的日常生活,并且你的 DevOps 团队看不到这些。ITSEC 的日常工作意味着超时加班和过度劳累,以确保公司,公司的团队,团队里工作的所有人能够安全地工作。
+
+### 成为安全拥护者的方法
+
+这些是你成为你的安全团队的拥护者之后可以帮到它们的。这意味着,对于你做的所有操作,你必须仔细、认真地查看所有能够让其他人登录的方式,以及他们能够从中获得什么。
+
+帮助你的安全团队就是在帮助你自己。将工具添加到你的工作流程里,以此将你知道的要干的活和他们知道的要干的活结合到一起。从小事入手,例如阅读公共漏洞披露(CVE),并将扫描模块添加到你的 CI/CD 流程里。对于你写的所有代码,都会有一个开源扫描工具,添加小型开源工具(例如下面列出来的)在长远看来是可以让项目更好的。
+
+**容器扫描工具:**
+
+ * [Anchore Engine][5]
+ * [Clair][6]
+ * [Vuls][7]
+ * [OpenSCAP][8]
+
+**代码扫描工具:**
+
+ * [OWASP SonarQube][9]
+ * [Find Security Bugs][10]
+ * [Google Hacking Diggity Project][11]
+
+**Kubernetes 安全工具:**
+
+ * [Project Calico][12]
+ * [Kube-hunter][13]
+ * [NeuVector][14]
+
+### 保持你的 DevOps 态度
+
+如果你的工作角色是和 DevOps 相关的,那么学习新技术和如何运用这项新技术创造新事物就是你工作的一部分。安全也是一样。我在 DevOps 安全方面保持到最新,下面是我的方法的列表。
+
+ * 每周阅读一篇你工作的方向里和安全相关的文章.
+ * 每周查看 [CVE][15] 官方网站,了解出现了什么新漏洞.
+ * 尝试做一次黑客马拉松。一些公司每个月都要这样做一次;如果你觉得还不够、想了解更多,可以访问 Beginner Hack 1.0 网站。
+ * 每年至少一次和那你的安全团队的成员一起参加安全会议,从他们的角度来看事情。
+
+### 成为拥护者是为了变得更好
+
+你应该成为你的安全的拥护者,下面是我们列出来的几个理由。首先是增长你的知识,帮助你的职业发展。第二是帮助其他的团队,培养新的关系,打破对你的组织有害的孤岛。在你的整个组织内建立由很多好处,包括设置沟通团队的典范,并鼓励人们一起工作。你同样能促进在整个组织中分享知识,并给每个人提供一个在安全方面更好的内部合作的新契机。
+
+总的来说,成为一个网络安全的拥护者会让你成为你整个组织的拥护者。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/devops-security-champions
+
+作者:[Jessica Repka][a]
+选题:[lujun9972][b]
+译者:[hopefully2333](https://github.com/hopefully2333)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/jrepka
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_3reasons.png?itok=k6F3-BqA (A lock on the side of a building)
+[2]: https://opensource.com/article/19/1/what-devsecops
+[3]: https://hostingtribunal.com/blog/hacking-statistics/
+[4]: https://opensource.com/article/18/8/what-cicd
+[5]: https://github.com/anchore/anchore-engine
+[6]: https://github.com/coreos/clair
+[7]: https://vuls.io/
+[8]: https://www.open-scap.org/
+[9]: https://github.com/OWASP/sonarqube
+[10]: https://find-sec-bugs.github.io/
+[11]: https://resources.bishopfox.com/resources/tools/google-hacking-diggity/
+[12]: https://www.projectcalico.org/
+[13]: https://github.com/aquasecurity/kube-hunter
+[14]: https://github.com/neuvector/neuvector-helm
+[15]: https://cve.mitre.org/
+[16]: https://www.hackerearth.com/challenges/hackathon/beginner-hack-10/
diff --git a/published/201910/20190924 Java still relevant, Linux desktop, and more industry trends.md b/published/201910/20190924 Java still relevant, Linux desktop, and more industry trends.md
new file mode 100644
index 0000000000..9823bf93e1
--- /dev/null
+++ b/published/201910/20190924 Java still relevant, Linux desktop, and more industry trends.md
@@ -0,0 +1,79 @@
+[#]: collector: (lujun9972)
+[#]: translator: (laingke)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11453-1.html)
+[#]: subject: (Java still relevant, Linux desktop, and more industry trends)
+[#]: via: (https://opensource.com/article/19/9/java-relevant-and-more-industry-trends)
+[#]: author: (Tim Hildred https://opensource.com/users/thildred)
+
+每周开源点评:Java 还有用吗、Linux 桌面以及更多的行业趋势
+======
+
+> 开源社区和行业趋势的每周总览。
+
+![Person standing in front of a giant computer screen with numbers, data][1]
+
+作为我在具有开源开发模型的企业软件公司担任高级产品营销经理的角色的一部分,我为产品营销人员、经理和其他影响者定期发布有关开源社区,市场和行业趋势的定期更新。以下是该更新中我和他们最喜欢的五篇文章。
+
+### 《Java 还有用吗?》
+
+- [文章地址][2]
+
+> 负责 Java Enterprise Edition(现为 Jakarta EE)的 Eclipse 基金会执行董事 Mike Milinkovich 也认为 Java 本身将不断发展以支持这些技术。“我认为 Java 将从 JVM 一直到 Java 本身都将发生变化,”Milinkovich 表示,“因此,JVM 中任何有助于将 JVM 与 Docker 容器集成在一起,以及能够更好地在 Kubernetes 中对 Docker 容器进行检测的新特性,都将是一个巨大的帮助。因此,我们将期待 Java SE 朝着这个方向发展。”
+
+**影响**:Jakarta EE 是 Java Enterprise Edition 的完全开源版本,奠定了 Java 未来发展的基础。一些 Java 有用论来自于在用 Java 开发中花费的令人难以置信的成本,以及软件开发人员在用它解决问题方面的多年经验。将其与生态系统中的创新相结合(例如,请参见 [Quarkus][3] 或 GraalVM),答案必须是“是”。
+
+### 《GraalVM:多语言 JVM 的圣杯?》
+
+- [文章地址][4]
+
+> 虽然大多数关于 GraalVM 的宣传都是围绕着将 JVM 项目编译成原生的程序,但是我们仍可以发现它的 Polyglot API 有很多价值。GraalVM 是一个引人注目的、已经完全可以用来替代 Nashorn 的选择,尽管迁移的路径仍然有一些困难,主要原因是缺乏文档。希望这篇文章能帮助其他人找到离开 Nashorn 通往圣杯之路。
+
+**影响**:对于开放源码项目来说,最好的事情之一就是用户开始对一些新奇的应用程序赞不绝口,即使这些应用程序不是主要用例。“是的,听起来不错,我们甚至没有使用过那个功能(指在 JVM 上运行本地语言)……,(都可以感受得到它的优势,)然而我们使用了它的另一个功能(指 Polyglot API)!”
+
+### 《你可以说我疯了,但 Windows 11 或可以在 Linux 上运行》
+
+- [文章链接][5]
+
+> 微软已经做了一些必要的工作。[Windows 的 Linux 子系统][6](WSL)的开发人员一直在致力于将 Linux API 调用映射到 Windows 中,反之亦然。在 WSL 的第一个版本中, 微软将 Windows 本地库、程序以及 Linux 之间的关键点连接起来了。当时,[Carmen Crincoli 发推文称][7]:“2017 年归根结底还是 Linux 桌面年。只不过这个桌面是 Windows。”Carmen Crincoli 是什么人?微软与存储和独立硬件供应商的合作伙伴经理。
+
+**影响**:[Hieroglyph 项目][8] 的前提是“一部好的科幻小说都有一个对未来的愿景……是建立在现实主义的基础上的……(而这)引发我们思考自己的选择和互动对创造未来做出贡献的复杂方式。”微软的选择以及与更广泛的开源社区的互动是否可以导致科幻的未来?敬请关注!
+
+### 《Python 正在吞噬世界:一个开发人员的业余项目如何成为地球上最热门的编程语言》
+
+- [文章链接][9]
+
+> 还有一个问题是,监督语言开发的机构“Python 核心开发人员和 Python 指导委员会”的组成是否能更好地反映 2019 年 Python 用户群的多样性。
+>
+> Wijaya 称:“我希望看到在所有不同指标上都有更好的代表,不仅在性别平衡方面,而且在种族和其它所有方面。”
+>
+> “在 PyCon 上,我与来自印度和非洲的 [PyLadies][10] 成员进行了交谈。他们评论说:‘当我们听说 Python 或 PyLadies 时,我们想到的是北美或加拿大的人,而实际上,世界其它地区的用户群很大。为什么我们看不到更多?’我认为这很有意义。因此,我绝对希望看到这种情况发生,我认为我们都需要尽自己的一份力量。”
+
+**影响**: 在这个动荡的时代,谁不想听到一位仁慈独裁者(指 Python 创始人)把他们项目的统治权移交给最经常使用它的人呢?
+
+*我希望你喜欢这张上周让我印象深刻的列表,并在下周一回来了解更多的开放源码社区、市场和行业趋势。*
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/java-relevant-and-more-industry-trends
+
+作者:[Tim Hildred][a]
+选题:[lujun9972][b]
+译者:[laingke](https://github.com/laingke)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/thildred
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data)
+[2]: https://sdtimes.com/java/is-java-still-relevant/
+[3]: https://github.com/quarkusio/quarkus
+[4]: https://www.transposit.com/blog/2019.01.02-graalvm-holy/?c=hn
+[5]: https://www.computerworld.com/article/3438856/call-me-crazy-but-windows-11-could-run-on-linux.html#tk.rss_operatingsystems
+[6]: https://blogs.msdn.microsoft.com/wsl/
+[7]: https://twitter.com/CarmenCrincoli/status/862714516257226752
+[8]: https://hieroglyph.asu.edu/2016/04/what-is-the-purpose-of-science-fiction-stories/
+[9]: https://www.techrepublic.com/article/python-is-eating-the-world-how-one-developers-side-project-became-the-hottest-programming-language-on-the-planet/
+[10]: https://www.pyladies.com/
diff --git a/published/201910/20190924 Mutation testing by example- Failure as experimentation.md b/published/201910/20190924 Mutation testing by example- Failure as experimentation.md
new file mode 100644
index 0000000000..bc1b43181f
--- /dev/null
+++ b/published/201910/20190924 Mutation testing by example- Failure as experimentation.md
@@ -0,0 +1,189 @@
+[#]: collector: (lujun9972)
+[#]: translator: (Morisun029)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11494-1.html)
+[#]: subject: (Mutation testing by example: Failure as experimentation)
+[#]: via: (https://opensource.com/article/19/9/mutation-testing-example-failure-experimentation)
+[#]: author: (Alex Bunardzic https://opensource.com/users/alex-bunardzichttps://opensource.com/users/jocunddew)
+
+变异测试:基于故障的试验
+======
+
+> 基于 .NET 的 xUnit.net 测试框架,开发一款自动猫门的逻辑,让门在白天开放,夜间锁定。
+
+![Digital hand surrounding by objects, bike, light bulb, graphs][1]
+
+在本系列的[第一篇文章][2]中,我演示了如何使用设计的故障来确保代码中的预期结果。在第二篇文章中,我将继续开发示例项目:一款自动猫门,该门在白天开放,夜间锁定。
+
+在此提醒一下,你可以按照[此处的说明][3]使用 .NET 的 xUnit.net 测试框架。
+
+### 关于白天时间
+
+回想一下,测试驱动开发(TDD)围绕着大量的单元测试。
+
+第一篇文章中实现了满足 `Given7pmReturnNighttime` 单元测试期望的逻辑。但还没有完,现在,你需要描述当前时间大于 7 点时期望发生的结果。这是新的单元测试,称为 `Given7amReturnDaylight`:
+
+```
+ [Fact]
+ public void Given7amReturnDaylight()
+ {
+ var expected = "Daylight";
+ var actual = dayOrNightUtility.GetDayOrNight();
+ Assert.Equal(expected, actual);
+ }
+```
+
+现在,新的单元测试失败了(越早失败越好!):
+
+```
+Starting test execution, please wait...
+[Xunit.net 00:00:01.23] unittest.UnitTest1.Given7amReturnDaylight [FAIL]
+Failed unittest.UnitTest1.Given7amReturnDaylight
+[...]
+```
+
+期望接收到字符串值是 `Daylight`,但实际接收到的值是 `Nighttime`。
+
+### 分析失败的测试用例
+
+经过仔细检查,代码本身似乎已经出现问题。 事实证明,`GetDayOrNight` 方法的实现是不可测试的!
+
+看看我们面临的核心挑战:
+
+1. `GetDayOrNight` 依赖隐藏输入。
+
+ `dayOrNight` 的值取决于隐藏输入(它从内置系统时钟中获取一天的时间值)。
+2. `GetDayOrNight` 包含非确定性行为。
+
+ 从系统时钟中获取到的时间值是不确定的。(因为)该时间取决于你运行代码的时间点,而这一点我们认为这是不可预测的。
+3. `GetDayOrNight` API 的质量差。
+
+ 该 API 与具体的数据源(系统 `DateTime`)紧密耦合。
+4. `GetDayOrNight` 违反了单一责任原则。
+
+ 该方法实现同时使用和处理信息。优良作法是一种方法应负责执行一项职责。
+5. `GetDayOrNight` 有多个更改原因。
+
+ 可以想象内部时间源可能会更改的情况。同样,很容易想象处理逻辑也将改变。这些变化的不同原因必须相互隔离。
+6. 当(我们)尝试了解 `GetDayOrNight` 行为时,会发现它的 API 签名不足。
+
+ 最理想的做法就是通过简单的查看 API 的签名,就能了解 API 预期的行为类型。
+7. `GetDayOrNight` 取决于全局共享可变状态。
+
+ 要不惜一切代价避免共享的可变状态!
+8. 即使在阅读源代码之后,也无法预测 `GetDayOrNight` 方法的行为。
+
+ 这是一个严重的问题。通过阅读源代码,应该始终非常清晰,系统一旦开始运行,便可以预测出其行为。
+
+### 失败背后的原则
+
+每当你遇到工程问题时,建议使用久经考验的分而治之策略。在这种情况下,遵循关注点分离的原则是一种可行的方法。
+
+> 关注点分离(SoC)是一种用于将计算机程序分为不同模块的设计原理,以便每个模块都可以解决一个关注点。关注点是影响计算机程序代码的一组信息。关注点可以和要优化代码的硬件的细节一样概括,也可以和要实例化的类的名称一样具体。完美体现 SoC 的程序称为模块化程序。
+>
+> ([出处][4])
+
+`GetDayOrNight` 方法应仅与确定日期和时间值表示白天还是夜晚有关。它不应该与寻找该值的来源有关。该问题应留给调用客户端。
+
+必须将这个问题留给调用客户端,以获取当前时间。这种方法符合另一个有价值的工程原理——控制反转。Martin Fowler [在这里][5]详细探讨了这一概念。
+
+> 框架的一个重要特征是用户定义的用于定制框架的方法通常来自于框架本身,而不是从用户的应用程序代码调用来的。该框架通常在协调和排序应用程序活动中扮演主程序的角色。控制权的这种反转使框架有能力充当可扩展的框架。用户提供的方法为框架中的特定应用程序量身制定泛化算法。
+>
+> -- [Ralph Johnson and Brian Foote][6]
+
+### 重构测试用例
+
+因此,代码需要重构。摆脱对内部时钟的依赖(`DateTime` 系统实用程序):
+
+```
+ DateTime time = new DateTime();
+```
+
+删除上述代码(在你的文件中应该是第 7 行)。通过将输入参数 `DateTime` 时间添加到 `GetDayOrNight` 方法,进一步重构代码。
+
+这是重构的类 `DayOrNightUtility.cs`:
+
+```
+using System;
+
+namespace app {
+ public class DayOrNightUtility {
+ public string GetDayOrNight(DateTime time) {
+ string dayOrNight = "Nighttime";
+ if(time.Hour >= 7 && time.Hour < 19) {
+ dayOrNight = "Daylight";
+ }
+ return dayOrNight;
+ }
+ }
+}
+```
+
+重构代码需要更改单元测试。 需要准备 `nightHour` 和 `dayHour` 的测试数据,并将这些值传到`GetDayOrNight` 方法中。 以下是重构的单元测试:
+
+```
+using System;
+using Xunit;
+using app;
+
+namespace unittest
+{
+ public class UnitTest1
+ {
+ DayOrNightUtility dayOrNightUtility = new DayOrNightUtility();
+ DateTime nightHour = new DateTime(2019, 08, 03, 19, 00, 00);
+ DateTime dayHour = new DateTime(2019, 08, 03, 07, 00, 00);
+
+ [Fact]
+ public void Given7pmReturnNighttime()
+ {
+ var expected = "Nighttime";
+ var actual = dayOrNightUtility.GetDayOrNight(nightHour);
+ Assert.Equal(expected, actual);
+ }
+
+ [Fact]
+ public void Given7amReturnDaylight()
+ {
+ var expected = "Daylight";
+ var actual = dayOrNightUtility.GetDayOrNight(dayHour);
+ Assert.Equal(expected, actual);
+ }
+
+ }
+}
+```
+
+### 经验教训
+
+在继续开发这种简单的场景之前,请先回顾复习一下本次练习中所学到的东西。
+
+运行无法测试的代码,很容易在不经意间制造陷阱。从表面上看,这样的代码似乎可以正常工作。但是,遵循测试驱动开发(TDD)的实践(首先描述期望结果,然后才描述实现),暴露了代码中的严重问题。
+
+这表明 TDD 是确保代码不会太凌乱的理想方法。TDD 指出了一些问题区域,例如缺乏单一责任和存在隐藏输入。此外,TDD 有助于删除不确定性代码,并用行为明确的完全可测试代码替换它。
+
+最后,TDD 帮助交付易于阅读、逻辑易于遵循的代码。
+
+在本系列的下一篇文章中,我将演示如何使用在本练习中创建的逻辑来实现功能代码,以及如何进行进一步的测试使其变得更好。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/mutation-testing-example-failure-experimentation
+
+作者:[Alex Bunardzic][a]
+选题:[lujun9972][b]
+译者:[Morisun029](https://github.com/Morisun029)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/alex-bunardzic
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolseriesk12_rh_021x_0.png?itok=fvorN0e- (Digital hand surrounding by objects, bike, light bulb, graphs)
+[2]: https://linux.cn/article-11483-1.html
+[3]: https://linux.cn/article-11468-1.html
+[4]: https://en.wikipedia.org/wiki/Separation_of_concerns
+[5]: https://martinfowler.com/bliki/InversionOfControl.html
+[6]: http://www.laputan.org/drc/drc.html
+[7]: http://www.google.com/search?q=new+msdn.microsoft.com
diff --git a/published/201910/20190925 3 quick tips for working with Linux files.md b/published/201910/20190925 3 quick tips for working with Linux files.md
new file mode 100644
index 0000000000..dcf0c29398
--- /dev/null
+++ b/published/201910/20190925 3 quick tips for working with Linux files.md
@@ -0,0 +1,115 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11445-1.html)
+[#]: subject: (3 quick tips for working with Linux files)
+[#]: via: (https://www.networkworld.com/article/3440035/3-quick-tips-for-working-with-linux-files.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+处理 Linux 文件的 3 个技巧
+======
+
+> Linux 提供了许多用于查找、计数和重命名文件的命令。这有一些有用的选择。
+
+
+
+Linux 提供了多种用于处理文件的命令,这些命令可以节省你的时间,并使你的工作不那么繁琐。
+
+### 查找文件
+
+当你查找文件时,`find` 可能会是第一个想到的命令,但是有时精心设计的 `ls` 命令会更好。想知道你昨天离开办公室回家前调用的脚本么?简单!使用 `ls` 命令并加上 `-ltr` 选项。最后一个列出的将是最近创建或更新的文件。
+
+```
+$ ls -ltr ~/bin | tail -3
+-rwx------ 1 shs shs 229 Sep 22 19:37 checkCPU
+-rwx------ 1 shs shs 285 Sep 22 19:37 ff
+-rwxrw-r-- 1 shs shs 1629 Sep 22 19:37 test2
+```
+
+像这样的命令将仅列出今天更新的文件:
+
+```
+$ ls -al --time-style=+%D | grep `date +%D`
+drwxr-xr-x 60 shs shs 69632 09/23/19 .
+drwxrwxr-x 2 shs shs 8052736 09/23/19 bin
+-rw-rw-r-- 1 shs shs 506 09/23/19 stats
+```
+
+如果你要查找的文件可能不在当前目录中,那么 `find` 将比 `ls` 提供更好的选项,但它可能会输出比你想要的更多结果。在下面的命令中,我们*不*搜索以点开头的目录(它们很多一直在更新),指定我们要查找的是文件(即不是目录),并要求仅显示最近一天 (`-mtime -1`)更新过的文件。
+
+```
+$ find . -not -path '*/\.*' -type f -mtime -1 -ls
+ 917517 0 -rwxrw-r-- 1 shs shs 683 Sep 23 11:00 ./newscript
+```
+
+注意 `-not` 选项反转了 `-path` 的行为,因此我们不会搜索以点开头的子目录。
+
+如果只想查找最大的文件和目录,那么可以使用类似 `du` 这样的命令,它会按大小列出当前目录的内容。将输出通过管道传输到 `tail`,仅查看最大的几个。
+
+```
+$ du -kx | egrep -v "\./.+/" | sort -n | tail -5
+918984 ./reports
+1053980 ./notes
+1217932 ./.cache
+31470204 ./photos
+39771212 .
+```
+
+`-k` 选项让 `du` 以块列出文件大小,而 `x` 可防止其遍历其他文件系统上的目录(例如,通过符号链接引用)。事实上,`du` 会先列出文件大小,这样可以按照大小排序(`sort -n`)。
+
+### 文件计数
+
+使用 `find` 命令可以很容易地计数任何特定目录中的文件。你只需要记住,`find` 会递归到子目录中,并将这些子目录中的文件与当前目录中的文件一起计数。在此命令中,我们计数一个特定用户(`username`)的家目录中的文件。根据家目录的权限,这可能需要使用 `sudo`。请记住,第一个参数是搜索的起点。这里指定的是用户的家目录。
+
+```
+$ find ~username -type f 2>/dev/null | wc -l
+35624
+```
+
+请注意,我们正在将上面 `find` 命令的错误输出发送到 `/dev/null`,以避免搜索类似 `~username/.cache` 这类无法搜索并且对它的内容也不感兴趣的文件夹。
+
+必要时,你可以使用 `maxdepth 1` 选项将 `find` 限制在单个目录中:
+
+```
+$ find /home/shs -maxdepth 1 -type f | wc -l
+387
+```
+
+### 重命名文件
+
+使用 `mv` 命令可以很容易地重命名文件,但是有时你会想重命名大量文件,并且不想花费大量时间。例如,要将你在当前目录的文件名中找到的所有空格更改为下划线,你可以使用如下命令:
+
+```
+$ rename 's/ /_/g' *
+```
+
+如你怀疑的那样,此命令中的 `g` 表示“全局”。这意味着该命令会将文件名中的*所有*空格更改为下划线,而不仅仅是第一个。
+
+要从文本文件中删除 .txt 扩展名,可以使用如下命令:
+
+```
+$ rename 's/.txt//g' *
+```
+
+### 总结
+
+Linux 命令行提供了许多用于处理文件的有用选择。请提出你认为特别有用的其他命令。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3440035/3-quick-tips-for-working-with-linux-files.html
+
+作者:[Sandra Henry-Stocker][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
+[b]: https://github.com/lujun9972
+[1]: https://images.idgesg.net/images/article/2019/09/file_key-100811696-large.jpg
+[2]: https://creativecommons.org/licenses/by/2.0/legalcode
+[4]: https://www.facebook.com/NetworkWorld/
+[5]: https://www.linkedin.com/company/network-world
diff --git a/published/201910/20190925 Essential Accessories for Intel NUC Mini PC.md b/published/201910/20190925 Essential Accessories for Intel NUC Mini PC.md
new file mode 100644
index 0000000000..8d6f9b7f63
--- /dev/null
+++ b/published/201910/20190925 Essential Accessories for Intel NUC Mini PC.md
@@ -0,0 +1,120 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11485-1.html)
+[#]: subject: (Essential Accessories for Intel NUC Mini PC)
+[#]: via: (https://itsfoss.com/intel-nuc-essential-accessories/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+英特尔 NUC 迷你 PC 的基本配件
+======
+
+
+
+几周前,我买了一台 [英特尔 NUC 迷你 PC][1]。我[在上面安装了 Linux][2],我非常喜欢它。这个小巧的无风扇机器取代了台式机那庞大的 CPU。
+
+英特尔 NUC 通常采用准系统形式,这意味着它没有任何内存、硬盘,也显然没有操作系统。许多[基于 Linux 的微型 PC][3] 定制化英特尔 NUC 并添加磁盘、RAM 和操作系统将它出售给终端用户。
+
+不用说,它不像大多数其他台式机那样带有键盘、鼠标或屏幕。
+
+[英特尔 NUC][4] 是一款出色的设备,如果你要购买台式机,我强烈建议你购买它。如果你正在考虑购买英特尔 NUC,你需要买一些配件,以便开始使用它。
+
+### 基本的英特尔 NUC 配件
+
+![][5]
+
+*文章中的 Amazon 链接是(原文的)受益链接。请阅读我们的[受益政策][6]。
+
+#### 外围设备:显示器、键盘和鼠标
+
+这很容易想到。你需要有屏幕、键盘和鼠标才能使用计算机。你需要一台有 HDMI 连接的显示器和一个 USB 或无线键盘鼠标。如果你已经有了这些东西,那你可以继续。
+
+如果你正在寻求建议,我建议购买 LG IPS LED 显示器。我有两台 22 英寸的型号,我对它提供的清晰视觉效果感到满意。
+
+这些显示器有一个简单的固定支架。如果要使显示器可以上下移动并纵向旋转,请尝试使用 [HP EliteDisplay 显示器][7]。
+
+![HP EliteDisplay Monitor][8]
+
+我在多屏设置中同时连接了三台显示器。一台显示器连接到指定的 HDMI 端口。两台显示器通过 [Club 3D 的 Thunderbolt 转 HDMI 分配器][9]连接到 Thunderbolt 端口。
+
+你也可以选择超宽显示器。我对此没有亲身经历。
+
+#### 内存
+
+英特尔 NUC 有两个内存插槽,最多可支持 32GB 内存。由于我的是 i3 核心处理器,因此我选择了 [Crucial 的 8GB DDR4 内存][11],价格约为 $33。
+
+![][12]
+
+8 GB 内存在大多数情况下都没问题,但是如果你的是 i7 核心处理器,那么可以选择 [16GB 内存][13],价格约为 $67。你可以加两条,以获得最大 32GB。选择全在于你。
+
+#### 硬盘(重要)
+
+英特尔 NUC 同时支持 2.5 英寸驱动器和 M.2 SSD,因此你可以同时使用两者以获得更多存储空间。
+
+2.5 英寸插槽可同时容纳 SSD 和 HDD。我强烈建议选择 SSD,因为它比 HDD 快得多。[480GB 2.5 英寸][14]的价格是 $60。我认为这是一个合理的价格。
+
+![][15]
+
+2.5 英寸驱动器的标准 SATA 口速度为 6 Gb/秒。根据你是否选择 NVMe SSD,M.2 插槽可能会更快。 NVMe(非易失性内存主机控制器接口规范)SSD 的速度比普通 SSD(也称为 SATA SSD)快 4 倍。但是它们可能也比 SATA M2 SSD 贵一些。
+
+当购买 M.2 SSD 时,请检查产品图片。无论是 NVMe 还是 SATA SSD,都应在磁盘本身的图片中提到。你可以考虑使用[经济的三星 EVO NVMe M.2 SSD][16]。
+
+![Make sure that your are buying the faster NVMe M2 SSD][17]
+
+M.2 插槽和 2.5 英寸插槽中的 SATA SSD 具有相同的速度。这就是为什么如果你不想选择昂贵的 NVMe SSD,建议你选择 2.5 英寸 SATA SSD,并保留 M.2 插槽供以后升级。
+
+#### 交流电源线
+
+当我拿到 NUC 时,为惊讶地发现,尽管它有电源适配器,但它并没有插头。
+
+正如一些读者指出的那样,你可能有完整的电源线。这取决于你的地理区域和供应商。因此,请检查产品说明和用户评论,以验证其是否具有完整的电源线。
+
+![][10]
+
+#### 其他配套配件
+
+你需要使用 HDMI 线缆连接显示器。如果你要购买新显示器,通常应会有一根线缆。
+
+如果要使用 M.2 插槽,那么可能需要螺丝刀。英特尔 NUC 是一款出色的设备,你只需用手旋转四个脚即可拧开底部面板。你必须打开设备才能放置内存和磁盘。
+
+![Intel NUC with Security Cable | Image Credit Intel][18]
+
+NUC 还有防盗孔,可与防盗绳一起使用。在业务环境中,建议使用防盗绳保护计算机安全。购买[防盗绳几美元][19]便可节省数百美元。
+
+### 你使用什么配件?
+
+这些就是我在使用和建议使用的英特尔 NUC 配件。你呢?如果你有一台 NUC,你会使用哪些配件并推荐给其他 NUC 用户?
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/intel-nuc-essential-accessories/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://www.amazon.com/Intel-NUC-Mainstream-Kit-NUC8i3BEH/dp/B07GX4X4PW?psc=1&SubscriptionId=AKIAJ3N3QBK3ZHDGU54Q&tag=chmod7mediate-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B07GX4X4PW (barebone Intel NUC mini PC)
+[2]: https://linux.cn/article-11477-1.html
+[3]: https://itsfoss.com/linux-based-mini-pc/
+[4]: https://www.intel.in/content/www/in/en/products/boards-kits/nuc.html
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/intel-nuc-accessories.png?ssl=1
+[6]: https://itsfoss.com/affiliate-policy/
+[7]: https://www.amazon.com/HP-EliteDisplay-21-5-Inch-1FH45AA-ABA/dp/B075L4VKQF?SubscriptionId=AKIAJ3N3QBK3ZHDGU54Q&tag=chmod7mediate-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B075L4VKQF (HP EliteDisplay monitors)
+[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/hp-elitedisplay-monitor.png?ssl=1
+[9]: https://www.amazon.com/Club3D-CSV-1546-USB-C-Multi-Monitor-Splitter/dp/B06Y2FX13G?SubscriptionId=AKIAJ3N3QBK3ZHDGU54Q&tag=chmod7mediate-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B06Y2FX13G (thunderbolt to HDMI splitter from Club 3D)
+[10]: https://img.linux.net.cn/data/attachment/album/201910/20/224718eebvzvvvm0b6f3ow.jpg
+[11]: https://www.amazon.com/Crucial-Single-PC4-19200-SODIMM-260-Pin/dp/B01BIWKP58?psc=1&SubscriptionId=AKIAJ3N3QBK3ZHDGU54Q&tag=chmod7mediate-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B01BIWKP58 (8GB DDR4 RAM from Crucial)
+[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/crucial-ram.jpg?ssl=1
+[13]: https://www.amazon.com/Crucial-Single-PC4-19200-SODIMM-260-Pin/dp/B019FRBHZ0?psc=1&SubscriptionId=AKIAJ3N3QBK3ZHDGU54Q&tag=chmod7mediate-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B019FRBHZ0 (16 GB RAM)
+[14]: https://www.amazon.com/Green-480GB-Internal-SSD-WDS480G2G0A/dp/B01M3POPK3?psc=1&SubscriptionId=AKIAJ3N3QBK3ZHDGU54Q&tag=chmod7mediate-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B01M3POPK3 (480 GB 2.5)
+[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/wd-green-ssd.png?ssl=1
+[16]: https://www.amazon.com/Samsung-970-EVO-500GB-MZ-V7E500BW/dp/B07BN4NJ2J?psc=1&SubscriptionId=AKIAJ3N3QBK3ZHDGU54Q&tag=chmod7mediate-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B07BN4NJ2J (Samsung EVO is a cost effective NVMe M.2 SSD)
+[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/samsung-evo-nvme.jpg?ssl=1
+[18]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/intel-nuc-security-cable.jpg?ssl=1
+[19]: https://www.amazon.com/Kensington-Combination-Laptops-Devices-K64673AM/dp/B005J7Y99W?psc=1&SubscriptionId=AKIAJ3N3QBK3ZHDGU54Q&tag=chmod7mediate-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B005J7Y99W (few dollars in the security cable)
diff --git a/published/201910/20190925 Mirror your Android screen on your computer with Guiscrcpy.md b/published/201910/20190925 Mirror your Android screen on your computer with Guiscrcpy.md
new file mode 100644
index 0000000000..a0c8a223bd
--- /dev/null
+++ b/published/201910/20190925 Mirror your Android screen on your computer with Guiscrcpy.md
@@ -0,0 +1,110 @@
+[#]: collector: (lujun9972)
+[#]: translator: (amwps290)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11434-1.html)
+[#]: subject: (Mirror your Android screen on your computer with Guiscrcpy)
+[#]: via: (https://opensource.com/article/19/9/mirror-android-screen-guiscrcpy)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+使用 guiscrcpy 将你的安卓手机的屏幕投射到你的电脑
+======
+
+> 使用这个基于 scrcpy 的开源应用从你的电脑上访问你的安卓设备。
+
+
+
+在未来,你所需的一切信息皆触手可及,并且全部会以全息的形式出现在空中,即使你在驾驶汽车时也可以与之交互。不过,那是未来,在那一刻到来之前,我们所有人都只能将信息分散在笔记本电脑、手机、平板电脑和智能冰箱上。不幸的是,这意味着当我们需要来自该设备的信息时,我们通常必须查看该设备。
+
+虽然不完全是像全息终端或飞行汽车那样酷炫,但 [srevin saju][3] 开发的 [guiscrcpy][2] 是一个可以在一个地方整合多个屏幕,让你有一点未来感觉的应用程序。
+
+Guiscrcpy 是一个基于屡获殊荣的一个开源引擎 [scrcpy][4] 的一个开源项目(GUN GPLv3 许可证)。使用 Guiscrcpy 可以将你的安卓手机的屏幕投射到你的电脑,这样你就可以查看手机上的一切东西。Guiscrcpy 支持 Linux、Windows 和 MacOS。
+
+不像其他 scrcpy 的替代软件一样,Guiscrcpy 并不仅仅是 scrcpy 的一个简单的复制品。该项目优先考虑了与其他开源项目的协作。因此,Guiscrcpy 对 scrcpy 来说是一个扩展,或者说是一个用户界面层。将 Python 3 GUI 与 scrcpy 分开可以确保没有任何东西干扰 scrcpy 后端的效率。你可以投射到 1080P 分辨率的屏幕,因为它的超快的渲染速度和超低的 CPU 使用,即使在低端的电脑上也可以运行的很顺畅。
+
+Scrcpy 是 Guiscrcpy 项目的基石。它是一个基于命令行的应用,因此它没有处理你的手势操作的用户界面。它也没有提供返回按钮和主页按钮,而且它需要你对 [Linux 终端][5]比较熟悉。Guiscrcpy 给 scrcpy 添加了图形面板。因此,任何用户都可以使用它,而且不需要通过网络发送任何信息就可以投射和控制他的设备。Guiscrcpy 同时也为 Windows 用户和 Linux 用户提供了编译好的二进制文件,以方便你的使用。
+
+### 安装 Guiscrcpy
+
+在你安装 Guiscrcpy 之前,你需要先安装它的依赖包。尤其是要安装 scrcpy。安装 scrcpy 最简单的方式可能就是使用对于大部分 Linux 发行版都安装了的 [snap][6] 工具。如果你的电脑上安装并使用了 snap,那么你就可以使用下面的命令来一步安装 scrcpy。
+
+```
+$ sudo snap install scrcpy
+```
+
+当你安装完 scrcpy,你就可以安装其他的依赖包了。[Simple DirectMedia Layer][7](SDL 2.0) 是一个显示和控制你设备屏幕的工具包。[Android Debug Bridge][8] (ADB) 命令可以连接你的安卓手机到电脑。
+
+在 Fedora 或者 CentOS:
+
+```
+$ sudo dnf install SDL2 android-tools
+```
+
+在 Ubuntu 或者 Debian:
+
+```
+$ sudo apt install SDL2 android-tools-adb
+```
+
+在另一个终端中,安装 Python 依赖项:
+
+```
+$ python3 -m pip install -r requirements.txt --user
+```
+
+### 设置你的手机
+
+为了能够让你的手机接受 adb 连接。必须让你的手机开启开发者选项。为了打开开发者选项,打开“设置”,然后选择“关于手机”,找到“版本号”(它也可能位于“软件信息”面板中)。不敢置信,只要你连续点击“版本号”七次,你就可以打开开发者选项。(LCTT 译注:显然这里是以 Google 原生的 Android 作为说明的,你的不同品牌的安卓手机打开开发者选项的方式或有不同。)
+
+![Enabling Developer Mode][9]
+
+更多更全面的连接手机的方式,请参考[安卓开发者文档][10]。
+
+一旦你设置好了你的手机,将你的手机通过 USB 线插入到你的电脑中(或者通过无线的方式进行连接,确保你已经配置好了无线连接)。
+
+### 使用 Guiscrcpy
+
+当你启动 guiscrcpy 的时候,你就能看到一个主控制窗口。点击窗口里的 “Start scrcpy” 按钮。只要你设置好了开发者模式并且通过 USB 或者 WiFi 将你的手机连接到电脑。guiscrcpy 就会连接你的手机。
+
+![Guiscrcpy main screen][11]
+
+它还包括一个可写入的配置系统,你可以将你的配置文件写入到 `~/.config` 目录。可以在使用前保存你的首选项。
+
+guiscrcpy 底部的面板是一个浮动的窗口,可以帮助你执行一些基本的控制动作。它包括了主页按钮、返回按钮、电源按钮以及一些其他的按键。这些按键在安卓手机上都非常常用。值得注意的是,这个模块并不是与 scrcpy 的 SDL 进行交互。因此,它可以毫无延迟的执行。换句话说,这个操作窗口是直接通过 adb 与你的手机进行交互而不是通过 scrcpy。
+
+![guiscrcpy's bottom panel][12]
+
+这个项目目前十分活跃,不断地有新的特性加入其中。最新版本的具有了手势操作和通知界面。
+
+有了这个 guiscrcpy,你不仅仅可以在你的电脑屏幕上看到你的手机,你还可以就像操作你的实体手机一样点击 SDL 窗口,或者使用浮动窗口上的按钮与之进行交互。
+
+![guiscrcpy running on Fedora 30][13]
+
+Guiscrcpy 是一个有趣且实用的应用程序,它提供的功能应该是任何现代设备(尤其是 Android 之类的平台)的正式功能。自己尝试一下,为当今的数字生活增添一些未来主义的感觉。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/9/mirror-android-screen-guiscrcpy
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[amwps290](https://github.com/amwps290)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer)
+[2]: https://github.com/srevinsaju/guiscrcpy
+[3]: http://opensource.com/users/srevinsaju
+[4]: https://github.com/Genymobile/scrcpy
+[5]: https://www.redhat.com/sysadmin/navigating-filesystem-linux-terminal
+[6]: https://snapcraft.io/
+[7]: https://www.libsdl.org/
+[8]: https://developer.android.com/studio/command-line/adb
+[9]: https://opensource.com/sites/default/files/uploads/developer-mode.jpg (Enabling Developer Mode)
+[10]: https://developer.android.com/studio/debug/dev-options
+[11]: https://opensource.com/sites/default/files/uploads/guiscrcpy-main.png (Guiscrcpy main screen)
+[12]: https://opensource.com/sites/default/files/uploads/guiscrcpy-bottompanel.png (guiscrcpy's bottom panel)
+[13]: https://opensource.com/sites/default/files/uploads/guiscrcpy-screenshot.jpg (guiscrcpy running on Fedora 30)
diff --git a/published/201910/20190926 How to Execute Commands on Remote Linux System over SSH.md b/published/201910/20190926 How to Execute Commands on Remote Linux System over SSH.md
new file mode 100644
index 0000000000..944cd800c7
--- /dev/null
+++ b/published/201910/20190926 How to Execute Commands on Remote Linux System over SSH.md
@@ -0,0 +1,411 @@
+[#]: collector: (lujun9972)
+[#]: translator: (alim0x)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11440-1.html)
+[#]: subject: (How to Execute Commands on Remote Linux System over SSH)
+[#]: via: (https://www.2daygeek.com/execute-run-linux-commands-remote-system-over-ssh/)
+[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
+
+如何通过 SSH 在远程 Linux 系统上运行命令
+======
+
+我们有时可能需要在远程机器上运行一些命令。如果只是偶尔进行的操作,要实现这个目的,可以登录到远程系统上直接执行命令。但是每次都这么做的话,就有点烦人了。既然如此,有没有摆脱这种麻烦操作的更佳方案?
+
+是的,你可以从你本地系统上执行这些操作,而不用登录到远程系统上。这有什么好处吗?毫无疑问。这会为你节省很多好时光。
+
+这是怎么实现的?SSH 允许你无需登录到远程计算机就可以在它上面运行命令。
+
+**通用语法如下所示:**
+
+```
+$ ssh [用户名]@[远程主机名或 IP] [命令或脚本]
+```
+
+### 1) 如何通过 SSH 在远程 Linux 系统上运行命令
+
+下面的例子允许用户通过 ssh 在远程 Linux 机器上运行 [df 命令][1]。
+
+```
+$ ssh daygeek@CentOS7.2daygeek.com df -h
+
+ Filesystem Size Used Avail Use% Mounted on
+ /dev/mapper/centos-root 27G 4.4G 23G 17% /
+ devtmpfs 903M 0 903M 0% /dev
+ tmpfs 920M 0 920M 0% /dev/shm
+ tmpfs 920M 9.3M 910M 2% /run
+ tmpfs 920M 0 920M 0% /sys/fs/cgroup
+ /dev/sda1 1014M 179M 836M 18% /boot
+ tmpfs 184M 8.0K 184M 1% /run/user/42
+ tmpfs 184M 0 184M 0% /run/user/1000
+```
+
+### 2) 如何通过 SSH 在远程 Linux 系统上运行多条命令
+
+下面的例子允许用户通过 ssh 在远程 Linux 机器上一次运行多条命令。
+
+同时在远程 Linux 系统上运行 `uptime` 命令和 `free` 命令。
+
+```
+$ ssh daygeek@CentOS7.2daygeek.com "uptime && free -m"
+
+ 23:05:10 up 10 min, 0 users, load average: 0.00, 0.03, 0.03
+
+ total used free shared buffers cached
+ Mem: 1878 432 1445 1 100 134
+ -/+ buffers/cache: 197 1680
+ Swap: 3071 0 3071
+```
+
+### 3) 如何通过 SSH 在远程 Linux 系统上运行带 sudo 权限的命令
+
+下面的例子允许用户通过 ssh 在远程 Linux 机器上运行带有 [sudo 权限][2] 的 `fdisk` 命令。
+
+普通用户不允许执行系统二进制(`/usr/sbin/`)目录下提供的命令。用户需要 root 权限来运行它。
+
+所以你需要 root 权限,好在 Linux 系统上运行 [fdisk 命令][3]。`which` 命令返回给定命令的完整可执行路径。
+
+```
+$ which fdisk
+ /usr/sbin/fdisk
+```
+
+```
+$ ssh -t daygeek@CentOS7.2daygeek.com "sudo fdisk -l"
+ [sudo] password for daygeek:
+
+ Disk /dev/sda: 32.2 GB, 32212254720 bytes, 62914560 sectors
+ Units = sectors of 1 * 512 = 512 bytes
+ Sector size (logical/physical): 512 bytes / 512 bytes
+ I/O size (minimum/optimal): 512 bytes / 512 bytes
+ Disk label type: dos
+ Disk identifier: 0x000bf685
+
+ Device Boot Start End Blocks Id System
+ /dev/sda1 * 2048 2099199 1048576 83 Linux
+ /dev/sda2 2099200 62914559 30407680 8e Linux LVM
+
+ Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
+ Units = sectors of 1 * 512 = 512 bytes
+ Sector size (logical/physical): 512 bytes / 512 bytes
+ I/O size (minimum/optimal): 512 bytes / 512 bytes
+
+ Disk /dev/mapper/centos-root: 29.0 GB, 28982640640 bytes, 56606720 sectors
+ Units = sectors of 1 * 512 = 512 bytes
+ Sector size (logical/physical): 512 bytes / 512 bytes
+ I/O size (minimum/optimal): 512 bytes / 512 bytes
+
+ Disk /dev/mapper/centos-swap: 2147 MB, 2147483648 bytes, 4194304 sectors
+ Units = sectors of 1 * 512 = 512 bytes
+ Sector size (logical/physical): 512 bytes / 512 bytes
+ I/O size (minimum/optimal): 512 bytes / 512 bytes
+
+ Connection to centos7.2daygeek.com closed.
+```
+
+### 4) 如何通过 SSH 在远程 Linux 系统上运行带 sudo 权限的服务控制命令
+
+下面的例子允许用户通过 ssh 在远程 Linux 机器上运行带有 sudo 权限的服务控制命令。
+
+```
+$ ssh -t daygeek@CentOS7.2daygeek.com "sudo systemctl restart httpd"
+
+ [sudo] password for daygeek:
+ Connection to centos7.2daygeek.com closed.
+```
+
+### 5) 如何通过非标准端口 SSH 在远程 Linux 系统上运行命令
+
+下面的例子允许用户通过 ssh 在使用了非标准端口的远程 Linux 机器上运行 [hostnamectl 命令][4]。
+
+```
+$ ssh -p 2200 daygeek@CentOS7.2daygeek.com hostnamectl
+
+ Static hostname: Ubuntu18.2daygeek.com
+ Icon name: computer-vm
+ Chassis: vm
+ Machine ID: 27f6c2febda84dc881f28fd145077187
+ Boot ID: bbeccdf932be41ddb5deae9e5f15183d
+ Virtualization: oracle
+ Operating System: Ubuntu 18.04.2 LTS
+ Kernel: Linux 4.15.0-60-generic
+ Architecture: x86-64
+```
+
+### 6) 如何将远程系统的输出保存到本地系统
+
+下面的例子允许用户通过 ssh 在远程 Linux 机器上运行 [top 命令][5],并将输出保存到本地系统。
+
+```
+$ ssh daygeek@CentOS7.2daygeek.com "top -bc | head -n 35" > /tmp/top-output.txt
+```
+
+```
+cat /tmp/top-output.txt
+
+ top - 01:13:11 up 18 min, 1 user, load average: 0.01, 0.05, 0.10
+ Tasks: 168 total, 1 running, 167 sleeping, 0 stopped, 0 zombie
+ %Cpu(s): 0.0 us, 6.2 sy, 0.0 ni, 93.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
+ KiB Mem : 1882300 total, 1176324 free, 342392 used, 363584 buff/cache
+ KiB Swap: 2097148 total, 2097148 free, 0 used. 1348140 avail Mem
+ PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
+ 4943 daygeek 20 0 162052 2248 1612 R 10.0 0.1 0:00.07 top -bc
+ 1 root 20 0 128276 6936 4204 S 0.0 0.4 0:03.08 /usr/lib/sy+
+ 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kthreadd]
+ 3 root 20 0 0 0 0 S 0.0 0.0 0:00.25 [ksoftirqd/+
+ 4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kworker/0:+
+ 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kworker/0:+
+ 7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 [migration/+
+ 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [rcu_bh]
+ 9 root 20 0 0 0 0 S 0.0 0.0 0:00.77 [rcu_sched]
+ 10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [lru-add-dr+
+ 11 root rt 0 0 0 0 S 0.0 0.0 0:00.01 [watchdog/0]
+ 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [kdevtmpfs]
+ 14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [netns]
+ 15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [khungtaskd]
+ 16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [writeback]
+ 17 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kintegrity+
+ 18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [bioset]
+ 19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [bioset]
+ 20 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [bioset]
+```
+
+或者你也可以使用以下格式在远程系统上运行多条命令:
+
+```
+$ ssh daygeek@CentOS7.2daygeek.com << EOF
+hostnamectl
+free -m
+grep daygeek /etc/passwd
+EOF
+```
+
+上面命令的输出如下:
+
+```
+Pseudo-terminal will not be allocated because stdin is not a terminal.
+ Static hostname: CentOS7.2daygeek.com
+ Icon name: computer-vm
+ Chassis: vm
+ Machine ID: 002f47b82af248f5be1d67b67e03514c
+ Boot ID: dca9a1ba06374d7d96678f9461752482
+ Virtualization: kvm
+ Operating System: CentOS Linux 7 (Core)
+ CPE OS Name: cpe:/o:centos:centos:7
+ Kernel: Linux 3.10.0-957.el7.x86_64
+ Architecture: x86-64
+
+ total used free shared buff/cache available
+ Mem: 1838 335 1146 11 355 1314
+ Swap: 2047 0 2047
+
+ daygeek:x:1000:1000:2daygeek:/home/daygeek:/bin/bash
+```
+
+### 7) 如何在远程系统上运行本地 Bash 脚本
+
+下面的例子允许用户通过 ssh 在远程 Linux 机器上运行本地 [bash 脚本][5] `remote-test.sh`。
+
+创建一个 shell 脚本并执行它。
+
+```
+$ vi /tmp/remote-test.sh
+
+#!/bin/bash
+#Name: remote-test.sh
+#--------------------
+ uptime
+ free -m
+ df -h
+ uname -a
+ hostnamectl
+```
+
+上面命令的输出如下:
+
+```
+$ ssh daygeek@CentOS7.2daygeek.com 'bash -s' < /tmp/remote-test.sh
+
+ 01:17:09 up 22 min, 1 user, load average: 0.00, 0.02, 0.08
+
+ total used free shared buff/cache available
+ Mem: 1838 333 1148 11 355 1316
+ Swap: 2047 0 2047
+
+ Filesystem Size Used Avail Use% Mounted on
+ /dev/mapper/centos-root 27G 4.4G 23G 17% /
+ devtmpfs 903M 0 903M 0% /dev
+ tmpfs 920M 0 920M 0% /dev/shm
+ tmpfs 920M 9.3M 910M 2% /run
+ tmpfs 920M 0 920M 0% /sys/fs/cgroup
+ /dev/sda1 1014M 179M 836M 18% /boot
+ tmpfs 184M 12K 184M 1% /run/user/42
+ tmpfs 184M 0 184M 0% /run/user/1000
+
+ Linux CentOS7.2daygeek.com 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
+
+ Static hostname: CentOS7.2daygeek.com
+ Icon name: computer-vm
+ Chassis: vm
+ Machine ID: 002f47b82af248f5be1d67b67e03514c
+ Boot ID: dca9a1ba06374d7d96678f9461752482
+ Virtualization: kvm
+ Operating System: CentOS Linux 7 (Core)
+ CPE OS Name: cpe:/o:centos:centos:7
+ Kernel: Linux 3.10.0-957.el7.x86_64
+ Architecture: x86-64
+```
+
+或者也可以使用管道。如果你觉得输出不太好看,再做点修改让它更优雅些。
+
+```
+$ vi /tmp/remote-test-1.sh
+
+#!/bin/bash
+#Name: remote-test.sh
+ echo "---------System Uptime--------------------------------------------"
+ uptime
+ echo -e "\n"
+ echo "---------Memory Usage---------------------------------------------"
+ free -m
+ echo -e "\n"
+ echo "---------Disk Usage-----------------------------------------------"
+ df -h
+ echo -e "\n"
+ echo "---------Kernel Version-------------------------------------------"
+ uname -a
+ echo -e "\n"
+ echo "---------HostName Info--------------------------------------------"
+ hostnamectl
+ echo "------------------------------------------------------------------"
+```
+
+上面脚本的输出如下:
+
+```
+$ cat /tmp/remote-test.sh | ssh daygeek@CentOS7.2daygeek.com
+ Pseudo-terminal will not be allocated because stdin is not a terminal.
+ ---------System Uptime--------------------------------------------
+ 03:14:09 up 2:19, 1 user, load average: 0.00, 0.01, 0.05
+
+ ---------Memory Usage---------------------------------------------
+ total used free shared buff/cache available
+ Mem: 1838 376 1063 11 398 1253
+ Swap: 2047 0 2047
+
+ ---------Disk Usage-----------------------------------------------
+ Filesystem Size Used Avail Use% Mounted on
+ /dev/mapper/centos-root 27G 4.4G 23G 17% /
+ devtmpfs 903M 0 903M 0% /dev
+ tmpfs 920M 0 920M 0% /dev/shm
+ tmpfs 920M 9.3M 910M 2% /run
+ tmpfs 920M 0 920M 0% /sys/fs/cgroup
+ /dev/sda1 1014M 179M 836M 18% /boot
+ tmpfs 184M 12K 184M 1% /run/user/42
+ tmpfs 184M 0 184M 0% /run/user/1000
+ tmpfs 184M 0 184M 0% /run/user/0
+
+ ---------Kernel Version-------------------------------------------
+ Linux CentOS7.2daygeek.com 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
+
+ ---------HostName Info--------------------------------------------
+ Static hostname: CentOS7.2daygeek.com
+ Icon name: computer-vm
+ Chassis: vm
+ Machine ID: 002f47b82af248f5be1d67b67e03514c
+ Boot ID: dca9a1ba06374d7d96678f9461752482
+ Virtualization: kvm
+ Operating System: CentOS Linux 7 (Core)
+ CPE OS Name: cpe:/o:centos:centos:7
+ Kernel: Linux 3.10.0-957.el7.x86_64
+ Architecture: x86-64
+```
+
+### 8) 如何同时在多个远程系统上运行多条指令
+
+下面的 bash 脚本允许用户同时在多个远程系统上运行多条指令。使用简单的 `for` 循环实现。
+
+为了实现这个目的,你可以尝试 [PSSH 命令][7] 或 [ClusterShell 命令][8] 或 [DSH 命令][9]。
+
+```
+$ vi /tmp/multiple-host.sh
+
+ for host in CentOS7.2daygeek.com CentOS6.2daygeek.com
+ do
+ ssh daygeek@CentOS7.2daygeek.com${host} "uname -a;uptime;date;w"
+ done
+```
+
+上面脚本的输出如下:
+
+```
+$ sh multiple-host.sh
+
+ Linux CentOS7.2daygeek.com 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
+
+ 01:33:57 up 39 min, 1 user, load average: 0.07, 0.06, 0.06
+
+ Wed Sep 25 01:33:57 CDT 2019
+
+ 01:33:57 up 39 min, 1 user, load average: 0.07, 0.06, 0.06
+ USER TTY FROM daygeek@CentOS7.2daygeek.com IDLE JCPU PCPU WHAT
+ daygeek pts/0 192.168.1.6 01:08 23:25 0.06s 0.06s -bash
+
+ Linux CentOS6.2daygeek.com 2.6.32-754.el6.x86_64 #1 SMP Tue Jun 19 21:26:04 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
+
+ 23:33:58 up 39 min, 0 users, load average: 0.00, 0.00, 0.00
+
+ Tue Sep 24 23:33:58 MST 2019
+
+ 23:33:58 up 39 min, 0 users, load average: 0.00, 0.00, 0.00
+ USER TTY FROM daygeek@CentOS7.2daygeek.com IDLE JCPU PCPU WHAT
+```
+
+### 9) 如何使用 sshpass 命令添加一个密码
+
+如果你觉得每次输入密码很麻烦,我建议你视你的需求选择以下方法中的一项来解决这个问题。
+
+如果你经常进行类似的操作,我建议你设置 [免密码认证][10],因为它是标准且永久的解决方案。
+
+如果你一个月只是执行几次这些任务,我推荐你使用 `sshpass` 工具。只需要使用 `-p` 参数选项提供你的密码即可。
+
+```
+$ sshpass -p '在这里输入你的密码' ssh -p 2200 daygeek@CentOS7.2daygeek.com ip a
+
+ 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
+ link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
+ inet 127.0.0.1/8 scope host lo
+ valid_lft forever preferred_lft forever
+ inet6 ::1/128 scope host
+ valid_lft forever preferred_lft forever
+ 2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
+ link/ether 08:00:27:18:90:7f brd ff:ff:ff:ff:ff:ff
+ inet 192.168.1.12/24 brd 192.168.1.255 scope global dynamic eth0
+ valid_lft 86145sec preferred_lft 86145sec
+ inet6 fe80::a00:27ff:fe18:907f/64 scope link tentative dadfailed
+ valid_lft forever preferred_lft forever
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/execute-run-linux-commands-remote-system-over-ssh/
+
+作者:[Magesh Maruthamuthu][a]
+选题:[lujun9972][b]
+译者:[alim0x](https://github.com/alim0x)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/magesh/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/linux-check-disk-space-usage-df-command/
+[2]: https://www.2daygeek.com/how-to-configure-sudo-access-in-linux/
+[3]: https://www.2daygeek.com/linux-fdisk-command-to-manage-disk-partitions/
+[4]: https://www.2daygeek.com/four-methods-to-change-the-hostname-in-linux/
+[5]: https://www.2daygeek.com/understanding-linux-top-command-output-usage/
+[6]: https://www.2daygeek.com/category/shell-script/
+[7]: https://www.2daygeek.com/pssh-parallel-ssh-run-execute-commands-on-multiple-linux-servers/
+[8]: https://www.2daygeek.com/clustershell-clush-run-commands-on-cluster-nodes-remote-system-in-parallel-linux/
+[9]: https://www.2daygeek.com/dsh-run-execute-shell-commands-on-multiple-linux-servers-at-once/
+[10]: https://www.2daygeek.com/configure-setup-passwordless-ssh-key-based-authentication-linux/
diff --git a/published/201910/20190926 You Can Now Use OneDrive in Linux Natively Thanks to Insync.md b/published/201910/20190926 You Can Now Use OneDrive in Linux Natively Thanks to Insync.md
new file mode 100644
index 0000000000..9b850bca1e
--- /dev/null
+++ b/published/201910/20190926 You Can Now Use OneDrive in Linux Natively Thanks to Insync.md
@@ -0,0 +1,103 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11433-1.html)
+[#]: subject: (You Can Now Use OneDrive in Linux Natively Thanks to Insync)
+[#]: via: (https://itsfoss.com/use-onedrive-on-linux/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+现在你可以借助 Insync 在 Linux 中原生使用 OneDrive
+======
+
+[OneDrive][1] 是微软的一项云存储服务,它为每个用户提供 5GB 的免费存储空间。它已与微软帐户集成,如果你使用 Windows,那么已在其中预安装了 OneDrive。
+
+OneDrive 无法在 Linux 中作为桌面应用使用。你可以通过网页访问已存储的文件,但无法像在文件管理器中那样使用云存储。
+
+好消息是,你现在可以使用一个非官方工具,它可让你在 Ubuntu 或其他 Linux 发行版中使用 OneDrive。
+
+当 [Insync][2] 在 Linux 上支持 Google Drive 时,它变成了 Linux 上非常流行的高级第三方同步工具。我们有篇对 [Insync 支持 Google Drive][3] 的详细点评文章。
+
+而最近[发布的 Insync 3][4] 支持了 OneDrive。因此在本文中,我们将看下如何在 Insync 中使用 OneDrive 以及它的新功能。
+
+> 非 FOSS 警告
+
+> 少数开发者会对非 FOSS 软件引入 Linux 感到痛苦。作为专注于桌面 Linux 的门户,即使不是 FOSS,我们也会在此介绍此类软件。
+
+> Insync 3 既不是开源软件,也不免费使用。你只有 15 天的试用期进行测试。如果你喜欢它,那么可以按每个帐户终生 29.99 美元的费用购买。
+
+> 我们不会拿钱来推广它们(以防你这么想)。我们不会在这里这么做。
+
+### 在 Linux 中通过 Insync 获得原生 OneDrive 体验
+
+![][5]
+
+尽管它是一个付费工具,但依赖 OneDrive 的用户或许希望在他们的 Linux 系统中获得同步 OneDrive 的无缝体验。
+
+首先,你需要从[官方页面][6]下载适合你 Linux 发行版的软件包。
+
+- [下载 Insync][7]
+
+你也可以选择添加仓库并进行安装。你将在 Insync 的[官方网站][7]看到说明。
+
+安装完成后,只需启动并选择 OneDrive 选项。
+
+![][8]
+
+另外,要注意的是,你添加的每个 OneDrive 或 Google Drive 帐户都需要单独的许可证。
+
+现在,在授权 OneDrive 帐户后,你必须选择一个用于同步所有内容的基础文件夹,这是 Insync 3 中的一项新功能。
+
+![Insync 3 Base Folder][9]
+
+除此之外,设置完成后,你还可以选择性地同步本地或云端的文件/文件夹。
+
+![Insync Selective Sync][10]
+
+你还可以通过添加自己的规则来自定义同步选项,以忽略/同步所需的文件夹和文件,这完全是可选的。
+
+![Insync Customize Sync Preferences][11]
+
+最后,就这样完成了。
+
+![Insync 3][12]
+
+你现在可以在包括带有 Insync 的 Linux 桌面在内的多个平台使用 OneDrive 开始同步文件/文件夹。除了上面所有新功能/更改之外,你还可以在 Insync 上获得更快/更流畅的体验。
+
+此外,借助 Insync 3,你可以查看同步进度:
+
+![][13]
+
+### 总结
+
+总的来说,对于希望在 Linux 系统上同步 OneDrive 的用户而言,Insync 3 是令人印象深刻的升级。如果你不想付款,你可以尝试其他 [Linux 的免费云服务][14]。
+
+你如何看待 Insync?如果你已经在使用它,到目前为止的体验如何?在下面的评论中让我们知道你的想法。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/use-onedrive-on-linux/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://onedrive.live.com
+[2]: https://www.insynchq.com
+[3]: https://itsfoss.com/insync-linux-review/
+[4]: https://www.insynchq.com/blog/insync-3/
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/onedrive-linux.png?ssl=1
+[6]: https://www.insynchq.com/downloads?start=true
+[7]: https://www.insynchq.com/downloads
+[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/insync-3one-drive-sync.png?ssl=1
+[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/insync-3-base-folder-1.png?ssl=1
+[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/insync-selective-syncs.png?ssl=1
+[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/insync-customize-sync.png?ssl=1
+[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/insync-homescreen.png?ssl=1
+[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/insync-3-progress-bar.png?ssl=1
+[14]: https://itsfoss.com/cloud-services-linux/
diff --git a/published/201910/20190927 CentOS 8 Installation Guide with Screenshots.md b/published/201910/20190927 CentOS 8 Installation Guide with Screenshots.md
new file mode 100644
index 0000000000..7e1a49882c
--- /dev/null
+++ b/published/201910/20190927 CentOS 8 Installation Guide with Screenshots.md
@@ -0,0 +1,251 @@
+[#]: collector: (lujun9972)
+[#]: translator: (HankChow)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11438-1.html)
+[#]: subject: (CentOS 8 Installation Guide with Screenshots)
+[#]: via: (https://www.linuxtechi.com/centos-8-installation-guide-screenshots/)
+[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/)
+
+CentOS 8 安装图解
+======
+
+继 RHEL 8 发布之后,CentOS 社区也发布了让人期待已久的 CentOS 8,并发布了两种模式:
+
+* CentOS stream:滚动发布的 Linux 发行版,适用于需要频繁更新的开发者
+* CentOS:类似 RHEL 8 的稳定操作系统,系统管理员可以用其部署或配置服务和应用
+
+在这篇文章中,我们会使用图解的方式演示 CentOS 8 的安装方法。
+
+### CentOS 8 的新特性
+
+* DNF 成为了默认的软件包管理器,同时 yum 仍然是可用的
+* 使用网络管理器(`nmcli` 和 `nmtui`)进行网络配置,移除了网络脚本
+* 使用 Podman 进行容器管理
+* 引入了两个新的包仓库:BaseOS 和 AppStream
+* 使用 Cockpit 作为默认的系统管理工具
+* 默认使用 Wayland 作为显示服务器
+* `iptables` 将被 `nftables` 取代
+* 使用 Linux 内核 4.18
+* 提供 PHP 7.2、Python 3.6、Ansible 2.8、VIM 8.0 和 Squid 4
+
+### CentOS 8 所需的最低硬件配置:
+
+* 2 GB RAM
+* 64 位 x86 架构、2 GHz 或以上的 CPU
+* 20 GB 硬盘空间
+
+### CentOS 8 安装图解
+
+#### 第一步:下载 CentOS 8 ISO 文件
+
+在 CentOS 官方网站 下载 CentOS 8 ISO 文件。
+
+#### 第二步: 创建 CentOS 8 启动介质(USB 或 DVD)
+
+下载 CentOS 8 ISO 文件之后,将 ISO 文件烧录到 USB 移动硬盘或 DVD 光盘中,作为启动介质。
+
+然后重启系统,在 BIOS 中设置为从上面烧录好的启动介质启动。
+
+#### 第三步:选择“安装 CentOS Linux 8.0”选项
+
+当系统从 CentOS 8 ISO 启动介质启动之后,就可以看到以下这个界面。选择“Install CentOS Linux 8.0”(安装 CentOS Linux 8.0)选项并按回车。
+
+![Choose-Install-CentOS8][2]
+
+#### 第四步:选择偏好语言
+
+选择想要在 CentOS 8 **安装过程**中使用的语言,然后继续。
+
+![Select-Language-CentOS8-Installation][3]
+
+#### 第五步:准备安装 CentOS 8
+
+这一步我们会配置以下内容:
+
+* 键盘布局
+* 日期和时间
+* 安装来源
+* 软件选择
+* 安装目标
+* Kdump
+
+![Installation-Summary-CentOS8][4]
+
+如上图所示,安装向导已经自动提供了“键盘布局”、“时间和日期”、“安装来源”和“软件选择”的选项。
+
+如果你需要修改以上设置,点击对应的图标就可以了。例如修改系统的时间和日期,只需要点击“时间和日期”,选择正确的时区,然后点击“完成”即可。
+
+![TimeZone-CentOS8-Installation][5]
+
+在软件选择选项中选择安装的模式。例如“包含图形界面”选项会在安装后的系统中提供图形界面,而如果想安装尽可能少的额外软件,可以选择“最小化安装”。
+
+![Software-Selection-CentOS8-Installation][6]
+
+这里我们选择“包含图形界面”,点击“完成”。
+
+Kdump 功能默认是开启的。尽管这是一个强烈建议开启的功能,但也可以点击对应的图标将其关闭。
+
+如果想要在安装过程中对网络进行配置,可以点击“网络与主机名”选项。
+
+![Networking-During-CentOS8-Installation][7]
+
+如果系统连接到启用了 DHCP 功能的调制解调器上,就会在启动网络接口的时候自动获取一个 IP 地址。如果需要配置静态 IP,点击“配置”并指定 IP 的相关信息。除此以外我们还将主机名设置为 “linuxtechi.com”。
+
+完成网络配置后,点击“完成”。
+
+最后我们要配置“安装目标”,指定 CentOS 8 将要安装到哪一个硬盘,以及相关的分区方式。
+
+![Installation-Destination-Custom-CentOS8][8]
+
+点击“完成”。
+
+如图所示,我为 CentOS 8 分配了 40 GB 的硬盘空间。有两种分区方案可供选择:如果由安装向导进行自动分区,可以从“存储配置”中选择“自动”选项;如果想要自己手动进行分区,可以选择“自定义”选项。
+
+在这里我们选择“自定义”选项,并按照以下的方式创建基于 LVM 的分区:
+
+* `/boot` – 2 GB (ext4 文件系统)
+* `/` – 12 GB (xfs 文件系统)
+* `/home` – 20 GB (xfs 文件系统)
+* `/tmp` – 5 GB (xfs 文件系统)
+* Swap – 1 GB (xfs 文件系统)
+
+首先创建 `/boot` 标准分区,设置大小为 2GB,如下图所示:
+
+![boot-partition-CentOS8-Installation][9]
+
+点击“添加挂载点”。
+
+再创建第二个分区 `/`,并设置大小为 12GB。点击加号,指定挂载点和分区大小,点击“添加挂载点”即可。
+
+![slash-root-partition-centos8-installation][10]
+
+然后在页面上将 `/` 分区的分区类型从标准更改为 LVM,并点击“更新设置”。
+
+![Change-Partition-Type-CentOS8][11]
+
+如上图所示,安装向导已经自动创建了一个卷组。如果想要更改卷组的名称,只需要点击“卷组”标签页中的“修改”选项。
+
+同样地,创建 `/home` 分区和 `/tmp` 分区,分别将大小设置为 20GB 和 5GB,并设置分区类型为 LVM。
+
+![home-partition-CentOS8-Installation][12]
+
+![tmp-partition-centos8-installation][13]
+
+最后创建交换分区。
+
+![Swap-Partition-CentOS8-Installation][14]
+
+点击“添加挂载点”。
+
+在完成所有分区设置后,点击“完成”。
+
+![Choose-Done-after-manual-partition-centos8][15]
+
+在下一个界面,点击“应用更改”,以上做的更改就会写入到硬盘中。
+
+![Accept-changes-CentOS8-Installation][16]
+
+#### 第六步:选择“开始安装”
+
+完成上述的所有更改后,回到先前的安装概览界面,点击“开始安装”以开始安装 CentOS 8。
+
+![Begin-Installation-CentOS8][17]
+
+下面这个界面表示安装过程正在进行中。
+
+![Installation-progress-centos8][18]
+
+要设置 root 用户的口令,只需要点击 “root 口令”选项,输入一个口令,然后点击“创建用户”选项创建一个本地用户。
+
+![Root-Password-CentOS8-Installation][19]
+
+填写新创建的用户的详细信息。
+
+![Local-User-Details-CentOS8][20]
+
+在安装完成后,安装向导会提示重启系统。
+
+![CentOS8-Installation-Progress][21]
+
+#### 第七步:完成安装并重启系统
+
+安装完成后要重启系统。只需点击“重启”按钮。
+
+![Installation-Completed-CentOS8][22]
+
+注意:重启完成后,记得要把安装介质断开,并将 BIOS 的启动介质设置为硬盘。
+
+#### 第八步:启动新安装的 CentOS 8 并接受许可协议
+
+在 GRUB 引导菜单中,选择 CentOS 8 进行启动。
+
+![Grub-Boot-CentOS8][23]
+
+同意 CentOS 8 的许可证,点击“完成”。
+
+![Accept-License-CentOS8-Installation][24]
+
+在下一个界面,点击“完成配置”。
+
+![Finish-Configuration-CentOS8-Installation][25]
+
+#### 第九步:配置完成后登录
+
+同意 CentOS 8 的许可证以及完成配置之后,会来到登录界面。
+
+![Login-screen-CentOS8][26]
+
+使用刚才创建的用户以及对应的口令登录,按照提示进行操作,就可以看到以下界面。
+
+![CentOS8-Ready-Use-Screen][27]
+
+点击“开始使用 CentOS Linux”。
+
+![Desktop-Screen-CentOS8][28]
+
+以上就是 CentOS 8 的安装过程,至此我们已经完成了 CentOS 8 的安装。
+
+欢迎给我们发送评论。
+
+--------------------------------------------------------------------------------
+
+via: https://www.linuxtechi.com/centos-8-installation-guide-screenshots/
+
+作者:[Pradeep Kumar][a]
+选题:[lujun9972][b]
+译者:[HankChow](https://github.com/HankChow)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linuxtechi.com/author/pradeep/
+[b]: https://github.com/lujun9972
+[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[2]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Choose-Install-CentOS8.jpg
+[3]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Select-Language-CentOS8-Installation.jpg
+[4]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Installation-Summary-CentOS8.jpg
+[5]: https://www.linuxtechi.com/wp-content/uploads/2019/09/TimeZone-CentOS8-Installation.jpg
+[6]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Software-Selection-CentOS8-Installation.jpg
+[7]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Networking-During-CentOS8-Installation.jpg
+[8]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Installation-Destination-Custom-CentOS8.jpg
+[9]: https://www.linuxtechi.com/wp-content/uploads/2019/09/boot-partition-CentOS8-Installation.jpg
+[10]: https://www.linuxtechi.com/wp-content/uploads/2019/09/slash-root-partition-centos8-installation.jpg
+[11]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Change-Partition-Type-CentOS8.jpg
+[12]: https://www.linuxtechi.com/wp-content/uploads/2019/09/home-partition-CentOS8-Installation.jpg
+[13]: https://www.linuxtechi.com/wp-content/uploads/2019/09/tmp-partition-centos8-installation.jpg
+[14]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Swap-Partition-CentOS8-Installation.jpg
+[15]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Choose-Done-after-manual-partition-centos8.jpg
+[16]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Accept-changes-CentOS8-Installation.jpg
+[17]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Begin-Installation-CentOS8.jpg
+[18]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Installation-progress-centos8.jpg
+[19]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Root-Password-CentOS8-Installation.jpg
+[20]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Local-User-Details-CentOS8.jpg
+[21]: https://www.linuxtechi.com/wp-content/uploads/2019/09/CentOS8-Installation-Progress.jpg
+[22]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Installation-Completed-CentOS8.jpg
+[23]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Grub-Boot-CentOS8.jpg
+[24]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Accept-License-CentOS8-Installation.jpg
+[25]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Finish-Configuration-CentOS8-Installation.jpg
+[26]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Login-screen-CentOS8.jpg
+[27]: https://www.linuxtechi.com/wp-content/uploads/2019/09/CentOS8-Ready-Use-Screen.jpg
+[28]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Desktop-Screen-CentOS8.jpg
diff --git a/published/201910/20190929 Bash Script to Generate System Uptime Reports on Linux.md b/published/201910/20190929 Bash Script to Generate System Uptime Reports on Linux.md
new file mode 100644
index 0000000000..8f147863b7
--- /dev/null
+++ b/published/201910/20190929 Bash Script to Generate System Uptime Reports on Linux.md
@@ -0,0 +1,134 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11455-1.html)
+[#]: subject: (Bash Script to Generate System Uptime Reports on Linux)
+[#]: via: (https://www.2daygeek.com/bash-script-generate-linux-system-uptime-reports/)
+[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
+
+生成 Linux 运行时间报告的 Bash 脚本
+======
+
+出于一些原因,你可能需要每月收集一次 [Linux 系统运行时间][1]报告。如果是这样,你可以根据需要使用以下 [bash 脚本][2] 之一。
+
+我们为什么要收集这份报告?在一段时间后重启 Linux 服务器是解决某些未解决问题的好方法。(LCTT 译注:本文这些观点值得商榷,很多服务器可以稳定运行几千天,尤其是有了内核热补丁之后,启动并不是必须的。)
+
+建议每 180 天重新启动一次。但时间段也许取决于你公司的政策。如果你已经长时间运行服务器而没有重启。这可能导致服务器上出现一些性能或内存问题,我在许多服务器上都注意到了这一点。
+
+这些脚本一次性提供了所有系统运行报告。
+
+### 什么是 uptime 命令
+
+`uptime` 命令将告诉你系统已经运行了多长时间。它在一行中显示以下信息:当前时间、系统运行了多长时间、当前登录了多少用户以及过去 1、5 和 15 分钟的平均系统负载。
+
+### 什么是 tuptime?
+
+[tuptime][3] 是用于报告系统的历史和统计运行时间的工具,可在重启之间保存。它类似于 `uptime` 命令,但输出更有趣。
+
+### 1)检查 Linux 系统运行时间的 Bash 脚本
+
+该 bash 脚本将收集所有服务器正常运行时间,并将报告发送到给定的电子邮箱地址。
+
+请替换为你的电子邮箱地址,而不是用我们的,否则你将不会收到邮件。
+
+```
+# vi /opt/scripts/system-uptime-script.sh
+
+#!/bin/bash
+> /tmp/uptime-report.out
+for host in cat /tmp/servers.txt
+do
+echo -n "$host: "
+ssh $host uptime | awk '{print $3,$4}' | sed 's/,//'
+done | column -t >> /tmp/uptime-report.out
+cat /tmp/uptime-report.out | mail -s "Linux Servers Uptime Report" "2daygeek@gmail.com"
+```
+
+给 `system-uptime-script.sh` 设置可执行权限。
+
+```
+$ chmod +x /opt/scripts/system-uptime-script.sh
+```
+
+最后运行 bash 脚本获取输出。
+
+```
+# sh /opt/scripts/system-uptime-script.sh
+```
+
+你将收到类似以下的报告。
+
+```
+# cat /tmp/uptime-report.out
+
+192.168.1.5: 2 days
+192.168.1.6: 15 days
+192.168.1.7: 30 days
+192.168.1.8: 7 days
+192.168.1.9: 67 days
+192.168.1.10: 130 days
+192.168.1.11: 23 days
+```
+
+### 2)检查 Linux 系统是否运行了 30 天以上的 Bash 脚本
+
+此 bash 脚本会收集运行 30 天以上的服务器,并将报告发送到指定的邮箱地址。你可以根据需要更改天数。
+
+```
+# vi /opt/scripts/system-uptime-script-1.sh
+
+#!/bin/bash
+> /tmp/uptime-report-1.out
+for host in cat /tmp/servers.txt
+do
+echo -n "$host: "
+ssh $host uptime | awk '{print $3,$4}' | sed 's/,//'
+done | column -t >> /tmp/uptime-report-1.out
+cat /tmp/uptime-report-1.out | awk ' $2 >= 30' > /tmp/uptime-report-2.out
+cat /tmp/uptime-report-2.out | mail -s "Linux Servers Uptime Report" "2daygeek@gmail.com"
+```
+
+给 `system-uptime-script-1.sh` 设置可执行权限。
+
+```
+$ chmod +x /opt/scripts/system-uptime-script-1.sh
+```
+
+最后添加一条 [cronjob][4] 来自动执行。它会在每天早上 7 点运行。
+
+```
+# crontab -e
+
+0 7 * * * /bin/bash /opt/scripts/system-uptime-script-1.sh
+```
+
+**注意:** 你会在每天早上 7 点会收到一封电子邮件提醒,它是昨天的详情。
+
+你将收到类似下面的报告。
+
+```
+# cat /tmp/uptime-report-2.out
+
+192.168.1.7: 30 days
+192.168.1.9: 67 days
+192.168.1.10: 130 days
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/bash-script-generate-linux-system-uptime-reports/
+
+作者:[Magesh Maruthamuthu][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/magesh/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/linux-system-server-uptime-check/
+[2]: https://www.2daygeek.com/category/shell-script/
+[3]: https://www.2daygeek.com/linux-tuptime-check-historical-uptime/
+[4]: https://www.2daygeek.com/crontab-cronjob-to-schedule-jobs-in-linux/
diff --git a/published/201910/20190929 How to Install and Use Cockpit on CentOS 8 - RHEL 8.md b/published/201910/20190929 How to Install and Use Cockpit on CentOS 8 - RHEL 8.md
new file mode 100644
index 0000000000..ebefb9d662
--- /dev/null
+++ b/published/201910/20190929 How to Install and Use Cockpit on CentOS 8 - RHEL 8.md
@@ -0,0 +1,127 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11449-1.html)
+[#]: subject: (How to Install and Use Cockpit on CentOS 8 / RHEL 8)
+[#]: via: (https://www.linuxtechi.com/install-use-cockpit-tool-centos8-rhel8/)
+[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/)
+
+如何在 CentOS 8/RHEL 8 上安装和使用 Cockpit
+======
+
+
+
+Cockpit 是一个基于 Web 的服务器管理工具,可用于 CentOS 和 RHEL 系统。最近发布的 CentOS 8 和 RHEL 8,其中 cockpit 是默认的服务器管理工具。它的软件包在默认的 CentOS 8 和 RHEL 8 仓库中就有。Cockpit 是一个有用的基于 Web 的 GUI 工具,系统管理员可以通过该工具监控和管理 Linux 服务器,它还可用于管理服务器、容器、虚拟机中的网络和存储,以及检查系统和应用的日志。
+
+在本文中,我们将演示如何在 CentOS 8 和 RHEL 8 中安装和设置 Cockpit。
+
+### 在 CentOS 8/RHEL 8 上安装和设置Cockpit
+
+登录你的 CentOS 8/RHEL 8,打开终端并执行以下 `dnf` 命令:
+
+```
+[root@linuxtechi ~]# dnf install cockpit -y
+```
+
+运行以下命令启用并启动 cockpit 服务:
+
+```
+[root@linuxtechi ~]# systemctl start cockpit.socket
+[root@linuxtechi ~]# systemctl enable cockpit.socket
+```
+
+使用以下命令在系统防火墙中允许 Cockpit 端口:
+
+```
+[root@linuxtechi ~]# firewall-cmd --permanent --add-service=cockpit
+[root@linuxtechi ~]# firewall-cmd --reload
+```
+
+验证 cockpit 服务是否已启动和运行,执行以下命令:
+
+```
+[root@linuxtechi ~]# systemctl status cockpit.socket
+[root@linuxtechi ~]# ss -tunlp | grep cockpit
+[root@linuxtechi ~]# ps auxf|grep cockpit
+```
+
+![cockpit-status-centos8-rhel8][1]
+
+### 在 CentOS 8/RHEL 8 上访问 Cockpit
+
+正如我们在上面命令的输出中看到的,cockpit 正在监听 tcp 9090 端口,打开你的 Web 浏览器并输入 url:`https://:9090`。
+
+![CentOS8-cockpit-login-screen][2]
+
+RHEL 8 中的 Cockpit 登录页面:
+
+![RHEL8-Cockpit-Login-Screen][3]
+
+使用有管理员权限的用户名,或者我们也可以使用 root 用户的密码登录。如果要将管理员权限分配给任何本地用户,请执行以下命令:
+
+```
+[root@linuxtechi ~]# usermod -G wheel pkumar
+```
+
+这里 `pkumar` 是我的本地用户,
+
+在输入用户密码后,选择 “Reuse my password for privileged tasks”,然后单击 “Log In”,然后我们看到以下页面:
+
+![cockpit-dashboard-centos8][4]
+
+在左侧栏上,我们可以看到可以通过 cockpit GUI 监控和配置的内容,
+
+假设你要检查 CentOS 8/RHEL 8 中是否有任何可用更新,请单击 “System Updates”:
+
+![Software-Updates-Cockpit-GUI-CentOS8-RHEL8][5]
+
+要安装所有更新,点击 “Install All Updates”:
+
+![Install-Software-Updates-CentOS8-RHEL8][6]
+
+如果想要修改网络并要添加 Bond 接口和网桥,请单击 “Networking”:
+
+![Networking-Cockpit-Dashboard-CentOS8-RHEL8][7]
+
+如上所见,我们有创建 Bond 接口、网桥和 VLAN 标记接口的选项。
+
+假设我们想创建一个 `br0` 网桥,并要为它添加 `enp0s3` 端口,单击 “Add Bridge”:
+
+将网桥名称指定为 `br0`,将端口指定为 `enp0s3`,然后单击“Apply”。
+
+![Add-Bridge-Cockpit-CentOS8-RHEL8][8]
+
+在下个页面,我们将看到该网桥处于活动状态,并且获得了与 enp0s3 接口相同的 IP:
+
+![Bridge-Details-Cockpit-Dashboard-CentOS8-RHEL8][9]
+
+如果你想检查系统日志,单击 “Logs”,我们可以根据严重性查看日志:
+
+![System-Logs-Cockpit-Dashboard-CentOS8-RHEL8][10]
+
+本文就是这些了,类似地,系统管理员可以使用 cockpit 的其他功能来监控和管理 CentOS 8 和 RHEL 8 服务器。如果这些步骤可以帮助你在 Linux 服务器上设置 cockpit,请在下面的评论栏分享你的反馈和意见。
+
+--------------------------------------------------------------------------------
+
+via: https://www.linuxtechi.com/install-use-cockpit-tool-centos8-rhel8/
+
+作者:[Pradeep Kumar][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linuxtechi.com/author/pradeep/
+[b]: https://github.com/lujun9972
+[1]: https://www.linuxtechi.com/wp-content/uploads/2019/09/cockpit-status-centos8-rhel8.jpg
+[2]: https://www.linuxtechi.com/wp-content/uploads/2019/09/CentOS8-cockpit-login-screen.jpg
+[3]: https://www.linuxtechi.com/wp-content/uploads/2019/09/RHEL8-Cockpit-Login-Screen.jpg
+[4]: https://www.linuxtechi.com/wp-content/uploads/2019/09/cockpit-dashboard-centos8.jpg
+[5]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Software-Updates-Cockpit-GUI-CentOS8-RHEL8.jpg
+[6]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Install-Software-Updates-CentOS8-RHEL8.jpg
+[7]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Networking-Cockpit-Dashboard-CentOS8-RHEL8.jpg
+[8]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Add-Bridge-Cockpit-CentOS8-RHEL8.jpg
+[9]: https://www.linuxtechi.com/wp-content/uploads/2019/09/Bridge-Details-Cockpit-Dashboard-CentOS8-RHEL8.jpg
+[10]: https://www.linuxtechi.com/wp-content/uploads/2019/09/System-Logs-Cockpit-Dashboard-CentOS8-RHEL8.jpg
diff --git a/published/201910/20191002 3 command line games for learning Bash the fun way.md b/published/201910/20191002 3 command line games for learning Bash the fun way.md
new file mode 100644
index 0000000000..beea31d857
--- /dev/null
+++ b/published/201910/20191002 3 command line games for learning Bash the fun way.md
@@ -0,0 +1,145 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11448-1.html)
+[#]: subject: (3 command line games for learning Bash the fun way)
+[#]: via: (https://opensource.com/article/19/10/learn-bash-command-line-games)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+Bash 学习的快乐之旅:3 个命令行游戏
+======
+
+> 通过这些命令行游戏,学习有用的 Bash 技能也是一件乐事。
+
+
+
+学习是件艰苦的工作,然而没有人喜欢工作。这意味着无论学习 Bash 多么容易,它仍然对你来说就像工作一样。当然,除非你通过游戏来学习。
+
+你不会觉得会有很多游戏可以教你如何使用 Bash 终端吧,这是对的。严肃的 PC 游戏玩家知道,《辐射》系列在金库中配备了基于终端的计算机,这可以帮你理解通过文本与计算机进行交互是什么样子,但是尽管其功能或多或少地类似于 [Alpine][2] 或 [Emacs][3],可是玩《辐射》并不会教给你可以在现实生活中使用的命令或应用程序。《辐射》系列从未直接移植到Linux(尽管可以通过 Steam 的开源的 [Proton][4] 来玩。)曾是《辐射》的前身的《[废土][5]》系列的最新作品倒是面向 Linux 的,因此,如果你想体验游戏中的终端,可以在你的 Linux 游戏计算机上玩《[废土 2][6]》和《[废土 3][7]》。《[暗影狂奔][8]》系列也有面向 Linux 的版本,它有许多基于终端的交互,尽管公认 [hot sim][9] 序列常常使它黯然失色。
+
+虽然这些游戏中采用了有趣的操作计算机终端的方式,并且可以在开源的系统上运行,但它们本身都不是开源的。不过,至少有两个游戏采用了严肃且非常有趣的方法来教人们如何通过文本命令与系统进行交互。最重要的是,它们是开源的。
+
+### Bashcrawl
+
+你可能听说过《[巨洞探险][10]》游戏,这是一款古老的基于文本的交互式游戏,其风格为“自由冒险”类。早期的计算机爱好者们在 DOS 或 ProDOS 命令行上痴迷地玩这些游戏,他们努力寻找有效语法和(如一个讽刺黑客所解释的)滑稽幻想逻辑的正确组合来击败游戏。想象一下,如果除了探索虚拟的中世纪地下城之外,挑战还在于回忆起有效的 Bash 命令,那么这样的挑战会多么有成效。这就是 [Bashcrawl][11] 的基调,这是一个基于 Bash 的地下城探险游戏,你可以通过学习和使用 Bash 命令来玩这个游戏。
+
+在 Bashcrawl 中,“地下城”是以目录和文件的形式创建在你的计算机上的。你可以通过使用 `cd` 命令更改目录进入地下城的每个房间来探索它。当你[穿行目录][12]时,你可以用 [ls -F][13] 来查看文件,用 [cat][14] 读取文件,[设置变量][15]来收集宝藏,并运行脚本来与怪物战斗。你在游戏中所做的一切操作都是有效的 Bash 命令,你可以稍后在现实生活中使用它,玩这个游戏提供了 Bash 体验,因为这个“游戏”是由计算机上的实际目录和文件组成的。
+
+```
+$ cd entrance/
+$ ls
+cellar scroll
+$ cat scroll
+
+It is pitch black in these catacombs.
+You have a magical spell that lists all items in a room.
+
+To see in the dark, type: ls
+To move around, type: cd <directory>
+
+Try looking around this room.
+Then move into one of the next rooms.
+
+EXAMPLE:
+
+$ ls
+$ cd cellar
+
+Remember to cast ``ls`` when you get into the next room!
+$
+```
+
+#### 安装 Bashcrawl
+
+在玩 Bashcrawl 之前,你的系统上必须有 Bash 或 [Zsh][16]。Linux、BSD 和 MacOS 都附带了 Bash。Windows 用户可以下载并安装 [Cygwin][17] 或 [WSL][18] 或[试试 Linux][19]。
+
+要安装 Bashcrawl,请在 Firefox 或你选择的 Web 浏览器中导航到这个 [GitLab 存储库][11]。在页面的右侧,单击“下载”图标(位于“Find file”按钮右侧)。在“下载”弹出菜单中,单击“zip”按钮以下载最新版本的游戏。
+
+![Download a zip from Gitlab][20]
+
+下载完成后,解压缩该存档文件。
+
+另外,如果你想从终端中开始安装,则可以使用 [Git][21] 命令:
+
+```
+$ git clone https://gitlab.com/slackermedia/bashcrawl.git bashcrawl
+```
+
+#### 游戏入门
+
+与你下载的几乎所有新的软件包一样,你必须做的第一件事是阅读 README 文件。你可以通过双击`bashcrawl` 目录中的 `README.md` 文件来阅读。在 Mac 上,你的计算机可能不知道要使用哪个应用程序打开该文件;你也可以使用任何文本编辑器或 LibreOffice 打开它。`README.md` 这个文件会具体告诉你如何开始玩游戏,包括如何在终端上进入游戏以及要开始游戏必须发出的第一条命令。如果你无法阅读 README 文件,那游戏就不战自胜了(尽管由于你没有玩而无法告诉你)。
+
+Bashcrawl 并不意味着是给比较聪明或高级用户玩的。相反,为了对新用户透明,它尽可能地简单。理想情况下,新的 Bash 用户可以从游戏中学习 Bash 的一些基础知识,然后会偶然发现一些游戏机制,包括使游戏运行起来的简单脚本,并学习到更多的 Bash 知识。此外,新的 Bash 用户可以按照 Bashcrawl 现有内容的示例设计自己的地下城,没有比编写游戏更好的学习编码的方法了。
+
+### 命令行英雄:BASH
+
+Bashcrawl 适用于绝对初学者。如果你经常使用 Bash,则很有可能会尝试通过以初学者尚不了解的方式查看 Bashcrawl 的文件,从而找到胜过它的秘径。如果你是中高级的 Bash 用户,则应尝试一下 [命令行英雄:BASH][22]。
+
+这个游戏很简单:在给定的时间内输入尽可能多的有效命令(LCTT 译注:BASH 也有“猛击”的意思)。听起来很简单。作为 Bash 用户,你每天都会使用许多命令。对于 Linux 用户来说,你知道在哪里可以找到命令列表。仅 util-linux 软件包就包含一百多个命令!问题是,在倒计时的压力下,你的指尖是否忙的过来输入这些命令?
+
+![Command Line Heroes: BASH][23]
+
+这个游戏听起来很简单,它确实也很简单!原则上,它与闪卡相似,只是反过来而已。在实践中,这是测试你的知识和回忆的一种有趣方式。当然,它是开源的,是由 [Open Jam][24] 的开发者开发的。
+
+#### 安装
+
+你可以[在线][25]玩“命令行英雄:BASH”,或者你也可以从 [GitHub][26] 下载它的源代码。
+
+这个游戏是用 Node.js 编写的,因此除非你想帮助开发该游戏,否则在线进行游戏就够了。
+
+### 在 Bash 中扫雷
+
+如果你是高级 Bash 用户,并且已经编写了多个 Bash 脚本,那么你可能不仅仅想学习 Bash。你可以尝试编写游戏而不是玩游戏,这才是真的挑战。稍加思考,用上一个下午或几个小时,便可以在 Bash 中实现流行的游戏《扫雷》。你可以先尝试自己编写这个游戏,然后参阅 Abhishek Tamrakar 的[文章][27],以了解他如何完成该游戏的。
+
+![][28]
+
+有时编程没有什么目的而是为了教育。在 Bash 中编写的游戏可能不是可以让你在网上赢得声誉的项目,但是该过程可能会很有趣且很有启发性。面对一个你从未想到的问题,这是学习新技巧的好方法。
+
+### 学习 Bash,玩得开心
+
+不管你如何学习它,Bash 都是一个功能强大的界面,因为它使你能够指示计算机执行所需的操作,而无需通过图形界面的应用程序的“中间人”界面。有时,图形界面很有帮助,但有时你想离开那些已经非常了解的东西,然后转向可以快速或通过自动化来完成的事情。由于 Bash 基于文本,因此易于编写脚本,使其成为自动化作业的理想起点。
+
+了解 Bash 以开始走向高级用户之路,但是请确保你乐在其中。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/10/learn-bash-command-line-games
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LAW_maze.png?itok=mZ5LP4-X (connecting yellow dots in a maze)
+[2]: https://opensource.com/article/17/10/alpine-email-client
+[3]: http://www.gnu.org/software/emacs
+[4]: https://github.com/ValveSoftware/Proton/
+[5]: https://www.gog.com/game/wasteland_the_classic_original
+[6]: https://www.inxile-entertainment.com/wasteland2
+[7]: https://www.inxile-entertainment.com/wasteland3
+[8]: http://harebrained-schemes.com/games/
+[9]: https://forums.shadowruntabletop.com/index.php?topic=21804.0
+[10]: https://opensource.com/article/18/12/linux-toy-adventure
+[11]: https://gitlab.com/slackermedia/bashcrawl
+[12]: https://opensource.com/article/19/8/understanding-file-paths-linux
+[13]: https://opensource.com/article/19/7/master-ls-command
+[14]: https://opensource.com/article/19/2/getting-started-cat-command
+[15]: https://opensource.com/article/19/8/using-variables-bash
+[16]: https://opensource.com/article/19/9/getting-started-zsh
+[17]: https://www.cygwin.com/
+[18]: https://docs.microsoft.com/en-us/windows/wsl/wsl2-about
+[19]: https://opensource.com/article/19/7/ways-get-started-linux
+[20]: https://opensource.com/sites/default/files/images/education/screenshot_from_2019-09-28_10-49-49.png (Download a zip from Gitlab)
+[21]: https://opensource.com/life/16/7/stumbling-git
+[22]: https://www.redhat.com/en/command-line-heroes/bash/index.html?extIdCarryOver=true&sc_cid=701f2000001OH79AAG
+[23]: https://opensource.com/sites/default/files/uploads/commandlineheroes-bash.jpg (Command Line Heroes: BASH)
+[24]: http://openjam.io/
+[25]: https://www.redhat.com/en/command-line-heroes/bash/index.html
+[26]: https://github.com/CommandLineHeroes/clh-bash/
+[27]: https://linux.cn/article-11430-1.html
+[28]: https://opensource.com/sites/default/files/uploads/extractmines.png
diff --git a/published/201910/20191002 7 Bash history shortcuts you will actually use.md b/published/201910/20191002 7 Bash history shortcuts you will actually use.md
new file mode 100644
index 0000000000..0b26c89131
--- /dev/null
+++ b/published/201910/20191002 7 Bash history shortcuts you will actually use.md
@@ -0,0 +1,221 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11456-1.html)
+[#]: subject: (7 Bash history shortcuts you will actually use)
+[#]: via: (https://opensource.com/article/19/10/bash-history-shortcuts)
+[#]: author: (Ian Miell https://opensource.com/users/ianmiell)
+
+7 个实用的操作 Bash 历史记录的快捷方式
+======
+
+> 这些必不可少的 Bash 快捷键可在命令行上节省时间。
+
+![Command line prompt][1]
+
+大多数介绍 Bash 历史记录的指南都详尽地列出了全部可用的快捷方式。这样做的问题是,你会对每个快捷方式都浅尝辄止,然后在尝试了那么多的快捷方式后就搞得目不暇接。而在开始工作时它们就全被丢在脑后,只记住了刚开始使用 Bash 时学到的 [!! 技巧][2]。这些技巧大多数从未进入记忆当中。
+
+本文概述了我每天实际使用的快捷方式。它基于我的书《[Bash 学习,艰难之旅][3]》中的某些内容(你可以阅读其中的[样章][4]以了解更多信息)。
+
+当人们看到我使用这些快捷方式时,他们经常问我:“你做了什么!?” 学习它们只需付出很少的精力或智力,但是要真正的学习它们,我建议每周用一天学一个,然后下次再继续学习一个。值得花时间让它们落在你的指尖下,因为从长远来看,节省的时间将很重要。
+
+### 1、最后一个参数:`!$`
+
+如果你仅想从本文中学习一种快捷方式,那就是这个。它会将最后一个命令的最后一个参数替换到你的命令行中。
+
+看看这种情况:
+
+```
+$ mv /path/to/wrongfile /some/other/place
+mv: cannot stat '/path/to/wrongfile': No such file or directory
+```
+
+啊哈,我在命令中写了错误的文件名 “wrongfile”,我应该用正确的文件名 “rightfile” 代替。
+
+你可以重新键入上一个命令,并用 “rightfile” 完全替换 “wrongfile”。但是,你也可以键入:
+
+```
+$ mv /path/to/rightfile !$
+mv /path/to/rightfile /some/other/place
+```
+
+这个命令也可以奏效。
+
+在 Bash 中还有其他方法可以通过快捷方式实现相同的目的,但是重用上一个命令的最后一个参数的这种技巧是我最常使用的。
+
+### 2、第 n 个参数:`!:2`
+
+是不是干过像这样的事情:
+
+```
+$ tar -cvf afolder afolder.tar
+tar: failed to open
+```
+
+像许多其他人一样,我也经常搞错 `tar`(和 `ln`)的参数顺序。
+
+![xkcd comic][5]
+
+当你搞混了参数,你可以这样:
+
+```
+$ !:0 !:1 !:3 !:2
+tar -cvf afolder.tar afolder
+```
+
+这样就不会出丑了。
+
+上一个命令的各个参数的索引是从零开始的,并且可以用 `!:` 之后跟上该索引数字代表各个参数。
+
+显然,你也可以使用它来重用上一个命令中的特定参数,而不是所有参数。
+
+### 3、全部参数:`!:1-$`
+
+假设我运行了类似这样的命令:
+
+```
+$ grep '(ping|pong)' afile
+```
+
+参数是正确的。然而,我想在文件中匹配 “ping” 或 “pong”,但我使用的是 `grep` 而不是 `egrep`。
+
+我开始输入 `egrep`,但是我不想重新输入其他参数。因此,我可以使用 `!:1-$` 快捷方式来调取上一个命令的所有参数,从第二个(记住它们的索引从零开始,因此是 `1`)到最后一个(由 `$` 表示)。
+
+```
+$ egrep !:1-$
+egrep '(ping|pong)' afile
+ping
+```
+
+你不用必须用 `1-$` 选择全部参数;你也可以选择一个子集,例如 `1-2` 或 `3-9` (如果上一个命令中有那么多参数的话)。
+
+### 4、倒数第 n 行的最后一个参数:`!-2:$`
+
+当我输错之后马上就知道该如何更正我的命令时,上面的快捷键非常有用,但是我经常在原来的命令之后运行别的命令,这意味着上一个命令不再是我所要引用的命令。
+
+例如,还是用之前的 `mv` 例子,如果我通过 `ls` 检查文件夹的内容来纠正我的错误:
+
+```
+$ mv /path/to/wrongfile /some/other/place
+mv: cannot stat '/path/to/wrongfile': No such file or directory
+$ ls /path/to/
+rightfile
+```
+
+我就不能再使用 `!$` 快捷方式了。
+
+在这些情况下,我可以在 `!` 之后插入 `-n`:(其中 `n` 是要在历史记录中回溯的命令条数),以从较旧的命令取得最后的参数:
+
+```
+$ mv /path/to/rightfile !-2:$
+mv /path/to/rightfile /some/other/place
+```
+
+同样,一旦你学会了它,你可能会惊讶于你需要使用它的频率。
+
+### 5、进入文件夹:`!$:h`
+
+从表面上看,这个看起来不太有用,但我每天要用它几十次。
+
+想象一下,我运行的命令如下所示:
+
+```
+$ tar -cvf system.tar /etc/system
+ tar: /etc/system: Cannot stat: No such file or directory
+ tar: Error exit delayed from previous errors.
+```
+
+我可能要做的第一件事是转到 `/etc` 文件夹,查看其中的内容并找出我做错了什么。
+
+我可以通过以下方法来做到这一点:
+
+```
+$ cd !$:h
+cd /etc
+```
+
+这是说:“获取上一个命令的最后一个参数(`/etc/system`),并删除其最后的文件名部分,仅保留 `/ etc`。”
+
+### 6、当前行:`!#:1`
+
+多年以来,在我最终找到并学会之前,我有时候想知道是否可以在当前行引用一个参数。我多希望我能早早学会这个快捷方式。我经常常使用它制作备份文件:
+
+```
+$ cp /path/to/some/file !#:1.bak
+cp /path/to/some/file /path/to/some/file.bak
+```
+
+但当我学会之后,它很快就被下面的快捷方式替代了……
+
+### 7、搜索并替换:`!!:gs`
+
+这将搜索所引用的命令,并将前两个 `/` 之间的字符替换为后两个 `/` 之间的字符。
+
+假设我想告诉别人我的 `s` 键不起作用,而是输出了 `f`:
+
+```
+$ echo my f key doef not work
+my f key doef not work
+```
+
+然后我意识到这里出现的 `f` 键都是错的。要将所有 `f` 替换为 `s`,我可以输入:
+
+```
+$ !!:gs/f /s /
+echo my s key does not work
+my s key does not work
+```
+
+它不只对单个字符起作用。我也可以替换单词或句子:
+
+```
+$ !!:gs/does/did/
+echo my s key did not work
+my s key did not work
+```
+
+### 测试一下
+
+为了向你展示如何组合这些快捷方式,你知道这些命令片段将输出什么吗?
+
+```
+$ ping !#:0:gs/i/o
+$ vi /tmp/!:0.txt
+$ ls !$:h
+$ cd !-2:$:h
+$ touch !$!-3:$ !! !$.txt
+$ cat !:1-$
+```
+
+### 总结
+
+对于日常的命令行用户,Bash 可以作为快捷方式的优雅来源。虽然有成千上万的技巧要学习,但这些是我经常使用的最喜欢的技巧。
+
+如果你想更深入地了解 Bash 可以教给你的全部知识,请买本我的书,《[Bash 学习,艰难之旅][3]》,或查看我的在线课程《[精通 Bash shell][7]》。
+
+* * *
+
+本文最初发布在 Ian 的博客 [Zwischenzugs.com][8] 上,并经允许重复发布。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/10/bash-history-shortcuts
+
+作者:[Ian Miell][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/ianmiell
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/command_line_prompt.png?itok=wbGiJ_yg (Command line prompt)
+[2]: https://opensource.com/article/18/5/bash-tricks
+[3]: https://leanpub.com/learnbashthehardway
+[4]: https://leanpub.com/learnbashthehardway/read_sample
+[5]: https://opensource.com/sites/default/files/uploads/tar_2x.png (xkcd comic)
+[6]: https://xkcd.com/1168/
+[7]: https://www.educative.io/courses/master-the-bash-shell
+[8]: https://zwischenzugs.com/2019/08/25/seven-god-like-bash-history-shortcuts-you-will-actually-use/
diff --git a/published/201910/20191003 How to Run the Top Command in Batch Mode.md b/published/201910/20191003 How to Run the Top Command in Batch Mode.md
new file mode 100644
index 0000000000..6e0316f9b8
--- /dev/null
+++ b/published/201910/20191003 How to Run the Top Command in Batch Mode.md
@@ -0,0 +1,331 @@
+[#]: collector: "lujun9972"
+[#]: translator: "way-ww"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-11491-1.html"
+[#]: subject: "How to Run the Top Command in Batch Mode"
+[#]: via: "https://www.2daygeek.com/linux-run-execute-top-command-in-batch-mode/"
+[#]: author: "Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/"
+
+如何在批处理模式下运行 top 命令
+======
+
+
+
+[top 命令][1] 是每个人都在使用的用于 [监控 Linux 系统性能][2] 的最好的命令。你可能已经知道 `top` 命令的绝大部分操作,除了很少的几个操作,如果我没错的话,批处理模式就是其中之一。
+
+大部分的脚本编写者和开发人员都知道这个,因为这个操作主要就是用来编写脚本。
+
+如果你不了解这个,不用担心,我们将在这里介绍它。
+
+### 什么是 top 命令的批处理模式
+
+批处理模式允许你将 `top` 命令的输出发送至其他程序或者文件中。
+
+在这个模式中,`top` 命令将不会接收输入并且持续运行,直到迭代次数达到你用 `-n` 选项指定的次数为止。
+
+如果你想解决 Linux 服务器上的任何性能问题,你需要正确的 [理解 top 命令的输出][3]。
+
+### 1) 如何在批处理模式下运行 top 命令
+
+默认地,`top` 命令按照 CPU 的使用率来排序输出结果,所以当你在批处理模式中运行以下命令时,它会执行同样的操作并打印前 35 行:
+
+```
+# top -bc | head -35
+
+top - 06:41:14 up 8 days, 20:24, 1 user, load average: 0.87, 0.77, 0.81
+Tasks: 139 total, 1 running, 136 sleeping, 0 stopped, 2 zombie
+%Cpu(s): 0.0 us, 3.2 sy, 0.0 ni, 96.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
+KiB Mem : 3880940 total, 1595932 free, 886736 used, 1398272 buff/cache
+KiB Swap: 1048572 total, 514640 free, 533932 used. 2648472 avail Mem
+
+PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
+ 1 root 20 0 191144 2800 1596 S 0.0 0.1 5:43.63 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
+ 2 root 20 0 0 0 0 S 0.0 0.0 0:00.32 [kthreadd]
+ 3 root 20 0 0 0 0 S 0.0 0.0 0:28.10 [ksoftirqd/0]
+ 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kworker/0:0H]
+ 7 root rt 0 0 0 0 S 0.0 0.0 0:33.96 [migration/0]
+ 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [rcu_bh]
+ 9 root 20 0 0 0 0 S 0.0 0.0 63:05.12 [rcu_sched]
+ 10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [lru-add-drain]
+ 11 root rt 0 0 0 0 S 0.0 0.0 0:08.79 [watchdog/0]
+ 12 root rt 0 0 0 0 S 0.0 0.0 0:08.82 [watchdog/1]
+ 13 root rt 0 0 0 0 S 0.0 0.0 0:44.27 [migration/1]
+ 14 root 20 0 0 0 0 S 0.0 0.0 1:22.45 [ksoftirqd/1]
+ 16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kworker/1:0H]
+ 18 root 20 0 0 0 0 S 0.0 0.0 0:00.01 [kdevtmpfs]
+ 19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [netns]
+ 20 root 20 0 0 0 0 S 0.0 0.0 0:01.35 [khungtaskd]
+ 21 root 0 -20 0 0 0 S 0.0 0.0 0:00.02 [writeback]
+ 22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kintegrityd]
+ 23 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [bioset]
+ 24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kblockd]
+ 25 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [md]
+ 26 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [edac-poller]
+ 33 root 20 0 0 0 0 S 0.0 0.0 1:19.07 [kswapd0]
+ 34 root 25 5 0 0 0 S 0.0 0.0 0:00.00 [ksmd]
+ 35 root 39 19 0 0 0 S 0.0 0.0 0:12.80 [khugepaged]
+ 36 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [crypto]
+ 44 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kthrotld]
+ 46 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kmpath_rdacd]
+```
+
+### 2) 如何在批处理模式下运行 top 命令并按内存使用率排序结果
+
+在批处理模式中运行以下命令按内存使用率对结果进行排序:
+
+```
+# top -bc -o +%MEM | head -n 20
+
+top - 06:42:00 up 8 days, 20:25, 1 user, load average: 0.66, 0.74, 0.80
+Tasks: 146 total, 1 running, 145 sleeping, 0 stopped, 0 zombie
+%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
+KiB Mem : 3880940 total, 1422044 free, 1059176 used, 1399720 buff/cache
+KiB Swap: 1048572 total, 514640 free, 533932 used. 2475984 avail Mem
+
+ PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
+ 18105 mysql 20 0 1453900 156096 8816 S 0.0 4.0 2:12.98 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
+ 1841 root 20 0 228980 107036 5360 S 0.0 2.8 0:05.56 /usr/local/cpanel/3rdparty/perl/528/bin/perl -T -w /usr/local/cpanel/3rdparty/bin/spamd --max-children=3 --max-spare=1 --allowed-ips=127.0.0.+
+ 4301 root 20 0 230208 104608 1816 S 0.0 2.7 0:03.77 spamd child
+ 8139 nobody 20 0 257000 27108 3408 S 0.0 0.7 0:00.04 /usr/sbin/httpd -k start
+ 7961 nobody 20 0 256988 26912 3160 S 0.0 0.7 0:00.05 /usr/sbin/httpd -k start
+ 8190 nobody 20 0 256976 26812 3140 S 0.0 0.7 0:00.05 /usr/sbin/httpd -k start
+ 8353 nobody 20 0 256976 26812 3144 S 0.0 0.7 0:00.04 /usr/sbin/httpd -k start
+ 8629 nobody 20 0 256856 26736 3108 S 0.0 0.7 0:00.02 /usr/sbin/httpd -k start
+ 8636 nobody 20 0 256856 26712 3100 S 0.0 0.7 0:00.03 /usr/sbin/httpd -k start
+ 8611 nobody 20 0 256844 25764 2228 S 0.0 0.7 0:00.01 /usr/sbin/httpd -k start
+ 8451 nobody 20 0 256844 25760 2220 S 0.0 0.7 0:00.04 /usr/sbin/httpd -k start
+ 8610 nobody 20 0 256844 25748 2224 S 0.0 0.7 0:00.01 /usr/sbin/httpd -k start
+ 8632 nobody 20 0 256844 25744 2216 S 0.0 0.7 0:00.03 /usr/sbin/httpd -k start
+```
+
+上面命令的详细信息:
+
+ * `-b`:批处理模式选项
+ * `-c`:打印运行中的进程的绝对路径
+ * `-o`:指定进行排序的字段
+ * `head`:输出文件的第一部分
+ * `-n`:打印前 n 行
+
+### 3) 如何在批处理模式下运行 top 命令并按照指定的用户进程对结果进行排序
+
+如果你想要按照指定用户进程对结果进行排序请运行以下命令:
+
+```
+# top -bc -u mysql | head -n 10
+
+top - 06:44:58 up 8 days, 20:27, 1 user, load average: 0.99, 0.87, 0.84
+Tasks: 140 total, 1 running, 137 sleeping, 0 stopped, 2 zombie
+%Cpu(s): 13.3 us, 3.3 sy, 0.0 ni, 83.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
+KiB Mem : 3880940 total, 1589832 free, 885648 used, 1405460 buff/cache
+KiB Swap: 1048572 total, 514640 free, 533932 used. 2649412 avail Mem
+
+ PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
+ 18105 mysql 20 0 1453900 156888 8816 S 0.0 4.0 2:16.42 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
+```
+
+### 4) 如何在批处理模式下运行 top 命令并按照处理时间进行排序
+
+在批处理模式中使用以下 `top` 命令按照处理时间对结果进行排序。这展示了任务从启动以来已使用的总 CPU 时间。
+
+但是如果你想要检查一个进程在 Linux 上运行了多长时间请看接下来的文章:
+
+ * [检查 Linux 中进程运行时间的五种方法][4]
+
+```
+# top -bc -o TIME+ | head -n 20
+
+top - 06:45:56 up 8 days, 20:28, 1 user, load average: 0.56, 0.77, 0.81
+Tasks: 148 total, 1 running, 146 sleeping, 0 stopped, 1 zombie
+%Cpu(s): 0.0 us, 3.1 sy, 0.0 ni, 96.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
+KiB Mem : 3880940 total, 1378664 free, 1094876 used, 1407400 buff/cache
+KiB Swap: 1048572 total, 514640 free, 533932 used. 2440332 avail Mem
+
+ PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
+ 9 root 20 0 0 0 0 S 0.0 0.0 63:05.70 [rcu_sched]
+ 272 root 20 0 0 0 0 S 0.0 0.0 16:12.13 [xfsaild/vda1]
+ 3882 root 20 0 229832 6212 1220 S 0.0 0.2 9:00.84 /usr/sbin/httpd -k start
+ 1 root 20 0 191144 2800 1596 S 0.0 0.1 5:43.75 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
+ 3761 root 20 0 68784 9820 2048 S 0.0 0.3 5:09.67 tailwatchd
+ 3529 root 20 0 404380 3472 2604 S 0.0 0.1 3:24.98 /usr/sbin/rsyslogd -n
+ 3520 root 20 0 574208 572 164 S 0.0 0.0 3:07.74 /usr/bin/python2 -Es /usr/sbin/tuned -l -P
+ 444 dbus 20 0 58444 1144 612 S 0.0 0.0 2:23.90 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
+ 18105 mysql 20 0 1453900 157152 8816 S 0.0 4.0 2:17.29 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
+ 249 root 0 -20 0 0 0 S 0.0 0.0 1:28.83 [kworker/0:1H]
+ 14 root 20 0 0 0 0 S 0.0 0.0 1:22.46 [ksoftirqd/1]
+ 33 root 20 0 0 0 0 S 0.0 0.0 1:19.07 [kswapd0]
+ 342 root 20 0 39472 2940 2752 S 0.0 0.1 1:18.17 /usr/lib/systemd/systemd-journald
+```
+
+### 5) 如何在批处理模式下运行 top 命令并将结果保存到文件中
+
+如果出于解决问题的目的,你想要和别人分享 `top` 命令的输出,请使用以下命令重定向输出到文件中:
+
+```
+# top -bc | head -35 > top-report.txt
+
+# cat top-report.txt
+
+top - 06:47:11 up 8 days, 20:30, 1 user, load average: 0.67, 0.77, 0.81
+Tasks: 133 total, 4 running, 129 sleeping, 0 stopped, 0 zombie
+%Cpu(s): 59.4 us, 12.5 sy, 0.0 ni, 28.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
+KiB Mem : 3880940 total, 1596268 free, 843284 used, 1441388 buff/cache
+KiB Swap: 1048572 total, 514640 free, 533932 used. 2659084 avail Mem
+
+ PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
+ 9686 daygeekc 20 0 406132 62184 43448 R 94.1 1.6 0:00.34 /opt/cpanel/ea-php56/root/usr/bin/php-cgi
+ 9689 nobody 20 0 256588 24428 1184 S 5.9 0.6 0:00.01 /usr/sbin/httpd -k start
+ 1 root 20 0 191144 2800 1596 S 0.0 0.1 5:43.79 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
+ 2 root 20 0 0 0 0 S 0.0 0.0 0:00.32 [kthreadd]
+ 3 root 20 0 0 0 0 S 0.0 0.0 0:28.11 [ksoftirqd/0]
+ 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kworker/0:0H]
+ 7 root rt 0 0 0 0 S 0.0 0.0 0:33.96 [migration/0]
+ 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 [rcu_bh]
+ 9 root 20 0 0 0 0 R 0.0 0.0 63:05.82 [rcu_sched]
+ 10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [lru-add-drain]
+ 11 root rt 0 0 0 0 S 0.0 0.0 0:08.79 [watchdog/0]
+ 12 root rt 0 0 0 0 S 0.0 0.0 0:08.82 [watchdog/1]
+ 13 root rt 0 0 0 0 S 0.0 0.0 0:44.28 [migration/1]
+ 14 root 20 0 0 0 0 S 0.0 0.0 1:22.46 [ksoftirqd/1]
+ 16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kworker/1:0H]
+ 18 root 20 0 0 0 0 S 0.0 0.0 0:00.01 [kdevtmpfs]
+ 19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [netns]
+ 20 root 20 0 0 0 0 S 0.0 0.0 0:01.35 [khungtaskd]
+ 21 root 0 -20 0 0 0 S 0.0 0.0 0:00.02 [writeback]
+ 22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kintegrityd]
+ 23 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [bioset]
+ 24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [kblockd]
+ 25 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [md]
+ 26 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [edac-poller]
+ 33 root 20 0 0 0 0 S 0.0 0.0 1:19.07 [kswapd0]
+ 34 root 25 5 0 0 0 S 0.0 0.0 0:00.00 [ksmd]
+ 35 root 39 19 0 0 0 S 0.0 0.0 0:12.80 [khugepaged]
+ 36 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 [crypto]
+```
+
+### 如何按照指定字段对结果进行排序
+
+在 `top` 命令的最新版本中, 按下 `f` 键进入字段管理界面。
+
+要使用新字段进行排序, 请使用 `up`/`down` 箭头选择正确的选项,然后再按下 `s` 键进行排序。最后按 `q` 键退出此窗口。
+
+```
+Fields Management for window 1:Def, whose current sort field is %CPU
+ Navigate with Up/Dn, Right selects for move then or Left commits,
+ 'd' or toggles display, 's' sets sort. Use 'q' or to end!
+ PID = Process Id nsUTS = UTS namespace Inode
+ USER = Effective User Name LXC = LXC container name
+ PR = Priority RSan = RES Anonymous (KiB)
+ NI = Nice Value RSfd = RES File-based (KiB)
+ VIRT = Virtual Image (KiB) RSlk = RES Locked (KiB)
+ RES = Resident Size (KiB) RSsh = RES Shared (KiB)
+ SHR = Shared Memory (KiB) CGNAME = Control Group name
+ S = Process Status NU = Last Used NUMA node
+ %CPU = CPU Usage
+ %MEM = Memory Usage (RES)
+ TIME+ = CPU Time, hundredths
+ COMMAND = Command Name/Line
+ PPID = Parent Process pid
+ UID = Effective User Id
+ RUID = Real User Id
+ RUSER = Real User Name
+ SUID = Saved User Id
+ SUSER = Saved User Name
+ GID = Group Id
+ GROUP = Group Name
+ PGRP = Process Group Id
+ TTY = Controlling Tty
+ TPGID = Tty Process Grp Id
+ SID = Session Id
+ nTH = Number of Threads
+ P = Last Used Cpu (SMP)
+ TIME = CPU Time
+ SWAP = Swapped Size (KiB)
+ CODE = Code Size (KiB)
+ DATA = Data+Stack (KiB)
+ nMaj = Major Page Faults
+ nMin = Minor Page Faults
+ nDRT = Dirty Pages Count
+ WCHAN = Sleeping in Function
+ Flags = Task Flags
+ CGROUPS = Control Groups
+ SUPGIDS = Supp Groups IDs
+ SUPGRPS = Supp Groups Names
+ TGID = Thread Group Id
+ OOMa = OOMEM Adjustment
+ OOMs = OOMEM Score current
+ ENVIRON = Environment vars
+ vMj = Major Faults delta
+ vMn = Minor Faults delta
+ USED = Res+Swap Size (KiB)
+ nsIPC = IPC namespace Inode
+ nsMNT = MNT namespace Inode
+ nsNET = NET namespace Inode
+ nsPID = PID namespace Inode
+ nsUSER = USER namespace Inode
+```
+
+对 `top` 命令的旧版本,请按 `shift+f` 或 `shift+o` 键进入字段管理界面进行排序。
+
+要使用新字段进行排序,请选择相应的排序字段字母, 然后按下回车键排序。
+
+```
+Current Sort Field: N for window 1:Def
+ Select sort field via field letter, type any other key to return
+ a: PID = Process Id
+ b: PPID = Parent Process Pid
+ c: RUSER = Real user name
+ d: UID = User Id
+ e: USER = User Name
+ f: GROUP = Group Name
+ g: TTY = Controlling Tty
+ h: PR = Priority
+ i: NI = Nice value
+ j: P = Last used cpu (SMP)
+ k: %CPU = CPU usage
+ l: TIME = CPU Time
+ m: TIME+ = CPU Time, hundredths
+* N: %MEM = Memory usage (RES)
+ o: VIRT = Virtual Image (kb)
+ p: SWAP = Swapped size (kb)
+ q: RES = Resident size (kb)
+ r: CODE = Code size (kb)
+ s: DATA = Data+Stack size (kb)
+ t: SHR = Shared Mem size (kb)
+ u: nFLT = Page Fault count
+ v: nDRT = Dirty Pages count
+ w: S = Process Status
+ x: COMMAND = Command name/line
+ y: WCHAN = Sleeping in Function
+ z: Flags = Task Flags
+ Note1:
+ If a selected sort field can't be
+ shown due to screen width or your
+ field order, the '<' and '>' keys
+ will be unavailable until a field
+ within viewable range is chosen.
+ Note2:
+ Field sorting uses internal values,
+ not those in column display. Thus,
+ the TTY & WCHAN fields will violate
+ strict ASCII collating sequence.
+ (shame on you if WCHAN is chosen)
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/linux-run-execute-top-command-in-batch-mode/
+
+作者:[Magesh Maruthamuthu][a]
+选题:[lujun9972][b]
+译者:[way-ww](https://github.com/way-ww)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/magesh/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/linux-top-command-linux-system-performance-monitoring-tool/
+[2]: https://www.2daygeek.com/category/system-monitoring/
+[3]: https://www.2daygeek.com/understanding-linux-top-command-output-usage/
+[4]: https://www.2daygeek.com/how-to-check-how-long-a-process-has-been-running-in-linux/
diff --git a/published/201910/20191004 9 essential GNU binutils tools.md b/published/201910/20191004 9 essential GNU binutils tools.md
new file mode 100644
index 0000000000..49c30e20d2
--- /dev/null
+++ b/published/201910/20191004 9 essential GNU binutils tools.md
@@ -0,0 +1,640 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11441-1.html)
+[#]: subject: (9 essential GNU binutils tools)
+[#]: via: (https://opensource.com/article/19/10/gnu-binutils)
+[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe)
+
+GNU binutils 里的九种武器
+======
+
+> 二进制分析是计算机行业中最被低估的技能。
+
+
+
+想象一下,在无法访问软件的源代码时,但仍然能够理解软件的实现方式,在其中找到漏洞,并且更厉害的是还能修复错误。所有这些都是在只有二进制文件时做到的。这听起来就像是超能力,对吧?
+
+你也可以拥有这样的超能力,GNU 二进制实用程序(binutils)就是一个很好的起点。[GNU binutils] [2] 是一个二进制工具集,默认情况下所有 Linux 发行版中都会安装这些二进制工具。
+
+二进制分析是计算机行业中最被低估的技能。它主要由恶意软件分析师、反向工程师和使用底层软件的人使用。
+
+本文探讨了 binutils 可用的一些工具。我使用的是 RHEL,但是这些示例应该在任何 Linux 发行版上可以运行。
+
+```
+[~]# cat /etc/redhat-release
+Red Hat Enterprise Linux Server release 7.6 (Maipo)
+[~]#
+[~]# uname -r
+3.10.0-957.el7.x86_64
+[~]#
+```
+
+请注意,某些打包命令(例如 `rpm`)在基于 Debian 的发行版中可能不可用,因此请使用等效的 `dpkg` 命令替代。
+
+### 软件开发的基础知识
+
+在开源世界中,我们很多人都专注于源代码形式的软件。当软件的源代码随时可用时,很容易获得源代码的副本,打开喜欢的编辑器,喝杯咖啡,然后就可以开始探索了。
+
+但是源代码不是在 CPU 上执行的代码,在 CPU 上执行的是二进制或者说是机器语言指令。二进制或可执行文件是编译源代码时获得的。熟练的调试人员深谙通常这种差异。
+
+### 编译的基础知识
+
+在深入研究 binutils 软件包本身之前,最好先了解编译的基础知识。
+
+编译是将程序从某种编程语言(如 C/C++)的源代码(文本形式)转换为机器代码的过程。
+
+机器代码是 CPU(或一般而言,硬件)可以理解的 1 和 0 的序列,因此可以由 CPU 执行或运行。该机器码以特定格式保存到文件,通常称为可执行文件或二进制文件。在 Linux(和使用 [Linux 兼容二进制][3]的 BSD)上,这称为 [ELF][4](可执行和可链接格式)。
+
+在生成给定的源文件的可执行文件或二进制文件之前,编译过程将经历一系列复杂的步骤。以这个源程序(C 代码)为例。打开你喜欢的编辑器,然后键入以下程序:
+
+```
+#include
+
+int main(void)
+{
+ printf("Hello World\n");
+ return 0;
+}
+```
+
+#### 步骤 1:用 cpp 预处理
+
+[C 预处理程序(cpp)][5]用于扩展所有宏并将头文件包含进来。在此示例中,头文件 `stdio.h` 将被包含在源代码中。`stdio.h` 是一个头文件,其中包含有关程序内使用的 `printf` 函数的信息。对源代码运行 `cpp`,其结果指令保存在名为 `hello.i` 的文件中。可以使用文本编辑器打开该文件以查看其内容。打印 “hello world” 的源代码在该文件的底部。
+
+```
+[testdir]# cat hello.c
+#include
+
+int main(void)
+{
+ printf("Hello World\n");
+ return 0;
+}
+[testdir]#
+[testdir]# cpp hello.c > hello.i
+[testdir]#
+[testdir]# ls -lrt
+total 24
+-rw-r--r--. 1 root root 76 Sep 13 03:20 hello.c
+-rw-r--r--. 1 root root 16877 Sep 13 03:22 hello.i
+[testdir]#
+```
+
+#### 步骤 2:用 gcc 编译
+
+在此阶段,无需创建目标文件就将步骤 1 中生成的预处理源代码转换为汇编语言指令。这个阶段使用 [GNU 编译器集合(gcc)][6]。对 `hello.i` 文件运行带有 `-S` 选项的 `gcc` 命令后,它将创建一个名为 `hello.s` 的新文件。该文件包含该 C 程序的汇编语言指令。
+
+你可以使用任何编辑器或 `cat` 命令查看其内容。
+
+```
+[testdir]#
+[testdir]# gcc -Wall -S hello.i
+[testdir]#
+[testdir]# ls -l
+total 28
+-rw-r--r--. 1 root root 76 Sep 13 03:20 hello.c
+-rw-r--r--. 1 root root 16877 Sep 13 03:22 hello.i
+-rw-r--r--. 1 root root 448 Sep 13 03:25 hello.s
+[testdir]#
+[testdir]# cat hello.s
+.file "hello.c"
+.section .rodata
+.LC0:
+.string "Hello World"
+.text
+.globl main
+.type main, @function
+main:
+.LFB0:
+.cfi_startproc
+pushq %rbp
+.cfi_def_cfa_offset 16
+.cfi_offset 6, -16
+movq %rsp, %rbp
+.cfi_def_cfa_register 6
+movl $.LC0, %edi
+call puts
+movl $0, %eax
+popq %rbp
+.cfi_def_cfa 7, 8
+ret
+.cfi_endproc
+.LFE0:
+.size main, .-main
+.ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-36)"
+.section .note.GNU-stack,"",@progbits
+[testdir]#
+```
+
+#### 步骤 3:用 as 汇编
+
+汇编器的目的是将汇编语言指令转换为机器语言代码,并生成扩展名为 `.o` 的目标文件。此阶段使用默认情况下在所有 Linux 平台上都可用的 GNU 汇编器。
+
+```
+testdir]# as hello.s -o hello.o
+[testdir]#
+[testdir]# ls -l
+total 32
+-rw-r--r--. 1 root root 76 Sep 13 03:20 hello.c
+-rw-r--r--. 1 root root 16877 Sep 13 03:22 hello.i
+-rw-r--r--. 1 root root 1496 Sep 13 03:39 hello.o
+-rw-r--r--. 1 root root 448 Sep 13 03:25 hello.s
+[testdir]#
+```
+
+现在,你有了第一个 ELF 格式的文件;但是,还不能执行它。稍后,你将看到“目标文件”和“可执行文件”之间的区别。
+
+```
+[testdir]# file hello.o
+hello.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
+```
+
+#### 步骤 4:用 ld 链接
+
+这是编译的最后阶段,将目标文件链接以创建可执行文件。可执行文件通常需要外部函数,这些外部函数通常来自系统库(`libc`)。
+
+你可以使用 `ld` 命令直接调用链接器;但是,此命令有些复杂。相反,你可以使用带有 `-v`(详细)标志的 `gcc` 编译器,以了解链接是如何发生的。(使用 `ld` 命令进行链接作为一个练习,你可以自行探索。)
+
+```
+[testdir]# gcc -v hello.o
+Using built-in specs.
+COLLECT_GCC=gcc
+COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
+Target: x86_64-redhat-linux
+Configured with: ../configure --prefix=/usr --mandir=/usr/share/man [...] --build=x86_64-redhat-linux
+Thread model: posix
+gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
+COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/:[...]:/usr/lib/gcc/x86_64-redhat-linux/
+LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/4.8.5/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../:/lib/:/usr/lib/
+COLLECT_GCC_OPTIONS='-v' '-mtune=generic' '-march=x86-64'
+/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/collect2 --build-id --no-add-needed --eh-frame-hdr --hash-style=gnu [...]/../../../../lib64/crtn.o
+[testdir]#
+```
+
+运行此命令后,你应该看到一个名为 `a.out` 的可执行文件:
+
+```
+[testdir]# ls -l
+total 44
+-rwxr-xr-x. 1 root root 8440 Sep 13 03:45 a.out
+-rw-r--r--. 1 root root 76 Sep 13 03:20 hello.c
+-rw-r--r--. 1 root root 16877 Sep 13 03:22 hello.i
+-rw-r--r--. 1 root root 1496 Sep 13 03:39 hello.o
+-rw-r--r--. 1 root root 448 Sep 13 03:25 hello.s
+```
+
+对 `a.out` 运行 `file` 命令,结果表明它确实是 ELF 可执行文件:
+
+```
+[testdir]# file a.out
+a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=48e4c11901d54d4bf1b6e3826baf18215e4255e5, not stripped
+```
+
+运行该可执行文件,看看它是否如源代码所示工作:
+
+```
+[testdir]# ./a.out Hello World
+```
+
+工作了!在幕后发生了很多事情它才在屏幕上打印了 “Hello World”。想象一下在更复杂的程序中会发生什么。
+
+### 探索 binutils 工具
+
+上面这个练习为使用 binutils 软件包中的工具提供了良好的背景。我的系统带有 binutils 版本 2.27-34;你的 Linux 发行版上的版本可能有所不同。
+
+```
+[~]# rpm -qa | grep binutils
+binutils-2.27-34.base.el7.x86_64
+```
+
+binutils 软件包中提供了以下工具:
+
+```
+[~]# rpm -ql binutils-2.27-34.base.el7.x86_64 | grep bin/
+/usr/bin/addr2line
+/usr/bin/ar
+/usr/bin/as
+/usr/bin/c++filt
+/usr/bin/dwp
+/usr/bin/elfedit
+/usr/bin/gprof
+/usr/bin/ld
+/usr/bin/ld.bfd
+/usr/bin/ld.gold
+/usr/bin/nm
+/usr/bin/objcopy
+/usr/bin/objdump
+/usr/bin/ranlib
+/usr/bin/readelf
+/usr/bin/size
+/usr/bin/strings
+/usr/bin/strip
+```
+
+上面的编译练习已经探索了其中的两个工具:用作汇编器的 `as` 命令,用作链接器的 `ld` 命令。继续阅读以了解上述 GNU binutils 软件包工具中的其他七个。
+
+#### readelf:显示 ELF 文件信息
+
+上面的练习提到了术语“目标文件”和“可执行文件”。使用该练习中的文件,通过带有 `-h`(标题)选项的 `readelf` 命令,以将文件的 ELF 标题转储到屏幕上。请注意,以 `.o` 扩展名结尾的目标文件显示为 `Type: REL (Relocatable file)`(可重定位文件):
+
+```
+[testdir]# readelf -h hello.o
+ELF Header:
+Magic: 7f 45 4c 46 02 01 01 00 [...]
+[...]
+Type: REL (Relocatable file)
+[...]
+```
+
+如果尝试执行此目标文件,会收到一条错误消息,指出无法执行。这仅表示它尚不具备在 CPU 上执行所需的信息。
+
+请记住,你首先需要使用 `chmod` 命令在对象文件上添加 `x`(可执行位),否则你将得到“权限被拒绝”的错误。
+
+```
+[testdir]# ./hello.o
+bash: ./hello.o: Permission denied
+[testdir]# chmod +x ./hello.o
+[testdir]#
+[testdir]# ./hello.o
+bash: ./hello.o: cannot execute binary file
+```
+
+如果对 `a.out` 文件尝试相同的命令,则会看到其类型为 `EXEC (Executable file)`(可执行文件)。
+
+```
+[testdir]# readelf -h a.out
+ELF Header:
+Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
+Class: ELF64
+[...] Type: EXEC (Executable file)
+```
+
+如上所示,该文件可以直接由 CPU 执行:
+
+```
+[testdir]# ./a.out Hello World
+```
+
+`readelf` 命令可提供有关二进制文件的大量信息。在这里,它会告诉你它是 ELF 64 位格式,这意味着它只能在 64 位 CPU 上执行,而不能在 32 位 CPU 上运行。它还告诉你它应在 X86-64(Intel/AMD)架构上执行。该二进制文件的入口点是地址 `0x400430`,它就是 C 源程序中 `main` 函数的地址。
+
+在你知道的其他系统二进制文件上尝试一下 `readelf` 命令,例如 `ls`。请注意,在 RHEL 8 或 Fedora 30 及更高版本的系统上,由于安全原因改用了位置无关可执行文件([PIE][7]),因此你的输出(尤其是 `Type:`)可能会有所不同。
+
+```
+[testdir]# readelf -h /bin/ls
+ELF Header:
+Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
+Class: ELF64
+Data: 2's complement, little endian
+Version: 1 (current)
+OS/ABI: UNIX - System V
+ABI Version: 0
+Type: EXEC (Executable file)
+```
+
+使用 `ldd` 命令了解 `ls` 命令所依赖的系统库,如下所示:
+
+```
+[testdir]# ldd /bin/ls
+linux-vdso.so.1 => (0x00007ffd7d746000)
+libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f060daca000)
+libcap.so.2 => /lib64/libcap.so.2 (0x00007f060d8c5000)
+libacl.so.1 => /lib64/libacl.so.1 (0x00007f060d6bc000)
+libc.so.6 => /lib64/libc.so.6 (0x00007f060d2ef000)
+libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f060d08d000)
+libdl.so.2 => /lib64/libdl.so.2 (0x00007f060ce89000)
+/lib64/ld-linux-x86-64.so.2 (0x00007f060dcf1000)
+libattr.so.1 => /lib64/libattr.so.1 (0x00007f060cc84000)
+libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f060ca68000)
+```
+
+对 `libc` 库文件运行 `readelf` 以查看它是哪种文件。正如它指出的那样,它是一个 `DYN (Shared object file)`(共享对象文件),这意味着它不能直接执行;必须由内部使用了该库提供的任何函数的可执行文件使用它。
+
+```
+[testdir]# readelf -h /lib64/libc.so.6
+ELF Header:
+Magic: 7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00
+Class: ELF64
+Data: 2's complement, little endian
+Version: 1 (current)
+OS/ABI: UNIX - GNU
+ABI Version: 0
+Type: DYN (Shared object file)
+```
+
+#### size:列出节的大小和全部大小
+
+`size` 命令仅适用于目标文件和可执行文件,因此,如果尝试在简单的 ASCII 文件上运行它,则会抛出错误,提示“文件格式无法识别”。
+
+```
+[testdir]# echo "test" > file1
+[testdir]# cat file1
+test
+[testdir]# file file1
+file1: ASCII text
+[testdir]# size file1
+size: file1: File format not recognized
+```
+
+现在,在上面的练习中,对目标文件和可执行文件运行 `size` 命令。请注意,根据 `size` 命令的输出可以看出,可执行文件(`a.out`)的信息要比目标文件(`hello.o`)多得多:
+
+```
+[testdir]# size hello.o
+text data bss dec hex filename
+89 0 0 89 59 hello.o
+[testdir]# size a.out
+text data bss dec hex filename
+1194 540 4 1738 6ca a.out
+```
+
+但是这里的 `text`、`data` 和 `bss` 节是什么意思?
+
+`text` 节是指二进制文件的代码部分,其中包含所有可执行指令。`data` 节是所有初始化数据所在的位置,`bss` 节是所有未初始化数据的存储位置。(LCTT 译注:一般来说,在静态的映像文件中,各个部分称之为节,而在运行时的各个部分称之为段,有时统称为段。)
+
+比较其他一些可用的系统二进制文件的 `size` 结果。
+
+对于 `ls` 命令:
+
+```
+[testdir]# size /bin/ls
+text data bss dec hex filename
+103119 4768 3360 111247 1b28f /bin/ls
+```
+
+只需查看 `size` 命令的输出,你就可以看到 `gcc` 和 `gdb` 是比 `ls` 大得多的程序:
+
+```
+[testdir]# size /bin/gcc
+text data bss dec hex filename
+755549 8464 81856 845869 ce82d /bin/gcc
+[testdir]# size /bin/gdb
+text data bss dec hex filename
+6650433 90842 152280 6893555 692ff3 /bin/gdb
+```
+
+#### strings:打印文件中的可打印字符串
+
+在 `strings` 命令中添加 `-d` 标志以仅显示 `data` 节中的可打印字符通常很有用。
+
+`hello.o` 是一个目标文件,其中包含打印出 `Hello World` 文本的指令。因此,`strings` 命令的唯一输出是 `Hello World`。
+
+```
+[testdir]# strings -d hello.o
+Hello World
+```
+
+另一方面,在 `a.out`(可执行文件)上运行 `strings` 会显示在链接阶段该二进制文件中包含的其他信息:
+
+```
+[testdir]# strings -d a.out
+/lib64/ld-linux-x86-64.so.2
+!^BU
+libc.so.6
+puts
+__libc_start_main
+__gmon_start__
+GLIBC_2.2.5
+UH-0
+UH-0
+=(
+[]A\A]A^A_
+Hello World
+;*3$"
+```
+
+#### objdump:显示目标文件信息
+
+另一个可以从二进制文件中转储机器语言指令的 binutils 工具称为 `objdump`。使用 `-d` 选项,可从二进制文件中反汇编出所有汇编指令。
+
+回想一下,编译是将源代码指令转换为机器代码的过程。机器代码仅由 1 和 0 组成,人类难以阅读。因此,它有助于将机器代码表示为汇编语言指令。汇编语言是什么样的?请记住,汇编语言是特定于体系结构的;由于我使用的是 Intel(x86-64)架构,因此如果你使用 ARM 架构编译相同的程序,指令将有所不同。
+
+```
+[testdir]# objdump -d hello.o
+hello.o: file format elf64-x86-64
+Disassembly of section .text:
+0000000000000000
+:
+0: 55 push %rbp
+1: 48 89 e5 mov %rsp,%rbp
+4: bf 00 00 00 00 mov $0x0,%edi
+9: e8 00 00 00 00 callq e
+
+e: b8 00 00 00 00 mov $0x0,%eax
+13: 5d pop %rbp
+14: c3 retq
+```
+
+该输出乍一看似乎令人生畏,但请花一点时间来理解它,然后再继续。回想一下,`.text` 节包含所有的机器代码指令。汇编指令可以在第四列中看到(即 `push`、`mov`、`callq`、`pop`、`retq` 等)。这些指令作用于寄存器,寄存器是 CPU 内置的存储器位置。本示例中的寄存器是 `rbp`、`rsp`、`edi`、`eax` 等,并且每个寄存器都有特殊的含义。
+
+现在对可执行文件(`a.out`)运行 `objdump` 并查看得到的内容。可执行文件的 `objdump` 的输出可能很大,因此我使用 `grep` 命令将其缩小到 `main` 函数:
+
+```
+[testdir]# objdump -d a.out | grep -A 9 main\>
+000000000040051d
+:
+40051d: 55 push %rbp
+40051e: 48 89 e5 mov %rsp,%rbp
+400521: bf d0 05 40 00 mov $0x4005d0,%edi
+400526: e8 d5 fe ff ff callq 400400
+40052b: b8 00 00 00 00 mov $0x0,%eax
+400530: 5d pop %rbp
+400531: c3 retq
+```
+
+请注意,这些指令与目标文件 `hello.o` 相似,但是其中包含一些其他信息:
+
+* 目标文件 `hello.o` 具有以下指令:`callq e`
+* 可执行文件 `a.out` 由以下指令组成,该指令带有一个地址和函数:`callq 400400 `
+
+上面的汇编指令正在调用 `puts` 函数。请记住,你在源代码中使用了一个 `printf` 函数。编译器插入了对 `puts` 库函数的调用,以将 `Hello World` 输出到屏幕。
+
+查看 `put` 上方一行的说明:
+
+* 目标文件 `hello.o` 有个指令 `mov`:`mov $0x0,%edi`
+* 可执行文件 `a.out` 的 `mov` 指令带有实际地址(`$0x4005d0`)而不是 `$0x0`:`mov $0x4005d0,%edi`
+
+该指令将二进制文件中地址 `$0x4005d0` 处存在的内容移动到名为 `edi` 的寄存器中。
+
+这个存储位置的内容中还能是别的什么吗?是的,你猜对了:它就是文本 `Hello, World`。你是如何确定的?
+
+`readelf` 命令使你可以将二进制文件(`a.out`)的任何节转储到屏幕上。以下要求它将 `.rodata`(这是只读数据)转储到屏幕上:
+
+```
+[testdir]# readelf -x .rodata a.out
+
+Hex dump of section '.rodata':
+0x004005c0 01000200 00000000 00000000 00000000 ....
+0x004005d0 48656c6c 6f20576f 726c6400 Hello World.
+```
+
+你可以在右侧看到文本 `Hello World`,在左侧可以看到其二进制格式的地址。它是否与你在上面的 `mov` 指令中看到的地址匹配?是的,确实匹配。
+
+#### strip:从目标文件中剥离符号
+
+该命令通常用于在将二进制文件交付给客户之前减小二进制文件的大小。
+
+请记住,由于重要信息已从二进制文件中删除,因此它会妨碍调试。但是,这个二进制文件可以完美地执行。
+
+对 `a.out` 可执行文件运行该命令,并注意会发生什么。首先,通过运行以下命令确保二进制文件没有被剥离(`not stripped`):
+
+```
+[testdir]# file a.out
+a.out: ELF 64-bit LSB executable, x86-64, [......] not stripped
+```
+
+另外,在运行 `strip` 命令之前,请记下二进制文件中最初的字节数:
+
+```
+[testdir]# du -b a.out
+8440 a.out
+```
+
+现在对该可执行文件运行 `strip` 命令,并使用 `file` 命令以确保正常完成:
+
+```
+[testdir]# strip a.out
+[testdir]# file a.out a.out: ELF 64-bit LSB executable, x86-64, [......] stripped
+
+```
+
+剥离该二进制文件后,此小程序的大小从之前的 `8440` 字节减小为 `6296` 字节。对于这样小的一个程序都能有这么大的空间节省,难怪大型程序经常被剥离。
+
+```
+[testdir]# du -b a.out
+6296 a.out
+```
+
+#### addr2line:转换地址到文件名和行号
+
+`addr2line` 工具只是在二进制文件中查找地址,并将其与 C 源代码程序中的行进行匹配。很酷,不是吗?
+
+为此编写另一个测试程序;只是这一次确保使用 `gcc` 的 `-g` 标志进行编译,这将为二进制文件添加其它调试信息,并包含有助于调试的行号(由源代码中提供):
+
+```
+[testdir]# cat -n atest.c
+1 #include
+2
+3 int globalvar = 100;
+4
+5 int function1(void)
+6 {
+7 printf("Within function1\n");
+8 return 0;
+9 }
+10
+11 int function2(void)
+12 {
+13 printf("Within function2\n");
+14 return 0;
+15 }
+16
+17 int main(void)
+18 {
+19 function1();
+20 function2();
+21 printf("Within main\n");
+22 return 0;
+23 }
+```
+
+用 `-g` 标志编译并执行它。正如预期:
+
+```
+[testdir]# gcc -g atest.c
+[testdir]# ./a.out
+Within function1
+Within function2
+Within main
+```
+
+现在使用 `objdump` 来标识函数开始的内存地址。你可以使用 `grep` 命令来过滤出所需的特定行。函数的地址在下面突出显示(`55 push %rbp` 前的地址):
+
+```
+[testdir]# objdump -d a.out | grep -A 2 -E 'main>:|function1>:|function2>:'
+000000000040051d :
+40051d: 55 push %rbp
+40051e: 48 89 e5 mov %rsp,%rbp
+--
+0000000000400532 :
+400532: 55 push %rbp
+400533: 48 89 e5 mov %rsp,%rbp
+--
+0000000000400547
+:
+400547: 55 push %rbp
+400548: 48 89 e5 mov %rsp,%rbp
+```
+
+现在,使用 `addr2line` 工具从二进制文件中的这些地址映射到 C 源代码匹配的地址:
+
+```
+[testdir]# addr2line -e a.out 40051d
+/tmp/testdir/atest.c:6
+[testdir]#
+[testdir]# addr2line -e a.out 400532
+/tmp/testdir/atest.c:12
+[testdir]#
+[testdir]# addr2line -e a.out 400547
+/tmp/testdir/atest.c:18
+```
+
+它说 `40051d` 从源文件 `atest.c` 中的第 `6` 行开始,这是 `function1` 的起始大括号(`{`)开始的行。`function2` 和 `main` 的输出也匹配。
+
+#### nm:列出目标文件的符号
+
+使用上面的 C 程序测试 `nm` 工具。使用 `gcc` 快速编译并执行它。
+
+```
+[testdir]# gcc atest.c
+[testdir]# ./a.out
+Within function1
+Within function2
+Within main
+```
+
+现在运行 `nm` 和 `grep` 获取有关函数和变量的信息:
+
+```
+[testdir]# nm a.out | grep -Ei 'function|main|globalvar'
+000000000040051d T function1
+0000000000400532 T function2
+000000000060102c D globalvar
+U __libc_start_main@@GLIBC_2.2.5
+0000000000400547 T main
+```
+
+你可以看到函数被标记为 `T`,它表示 `text` 节中的符号,而变量标记为 `D`,表示初始化的 `data` 节中的符号。
+
+想象一下在没有源代码的二进制文件上运行此命令有多大用处?这使你可以窥视内部并了解使用了哪些函数和变量。当然,除非二进制文件已被剥离,这种情况下它们将不包含任何符号,因此 `nm` 就命令不会很有用,如你在此处看到的:
+
+```
+[testdir]# strip a.out
+[testdir]# nm a.out | grep -Ei 'function|main|globalvar'
+nm: a.out: no symbols
+```
+
+### 结论
+
+GNU binutils 工具为有兴趣分析二进制文件的人提供了许多选项,这只是它们可以为你做的事情的冰山一角。请阅读每种工具的手册页,以了解有关它们以及如何使用它们的更多信息。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/10/gnu-binutils
+
+作者:[Gaurav Kamathe][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/gkamathe
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tools_sysadmin_cloud.png?itok=sUciG0Cn (Tools for the sysadmin)
+[2]: https://en.wikipedia.org/wiki/GNU_Binutils
+[3]: https://www.freebsd.org/doc/handbook/linuxemu.html
+[4]: https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
+[5]: https://en.wikipedia.org/wiki/C_preprocessor
+[6]: https://gcc.gnu.org/onlinedocs/gcc/
+[7]: https://en.wikipedia.org/wiki/Position-independent_code#Position-independent_executables
diff --git a/published/201910/20191004 All That You Can Do with Google Analytics, and More.md b/published/201910/20191004 All That You Can Do with Google Analytics, and More.md
new file mode 100644
index 0000000000..a06d46414c
--- /dev/null
+++ b/published/201910/20191004 All That You Can Do with Google Analytics, and More.md
@@ -0,0 +1,253 @@
+[#]: collector: (lujun9972)
+[#]: translator: (HankChow)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11460-1.html)
+[#]: subject: (All That You Can Do with Google Analytics, and More)
+[#]: via: (https://opensourceforu.com/2019/10/all-that-you-can-do-with-google-analytics-and-more/)
+[#]: author: (Ashwin Sathian https://opensourceforu.com/author/ashwin-sathian/)
+
+Google Analytics 的一些用法介绍
+======
+
+![][1]
+
+Google Analytics (GA)这个最流行的用户活动追踪工具我们或多或少都听说过甚至使用过,但它的用途并不仅仅限于对页面访问的追踪。作为一个既实用又流行的工具,它已经受到了广泛的欢迎,因此我们将要在下文中介绍如何在各种 Angular 和 React 单页应用中使用 Google Analytics。
+
+这篇文章源自这样一个问题:如何对单页应用中的页面访问进行跟踪?
+
+通常来说,有很多的方法可以解决这个问题,在这里我们只讨论其中的一种方法。下面我会使用 Angular 来写出对应的实现,如果你使用的是 React,相关的用法和概念也不会有太大的差别。接下来就开始吧。
+
+### 准备好应用程序
+
+首先需要有一个追踪 ID。在开始编写业务代码之前,要先准备好一个追踪 ID,通过这个唯一的标识,Google Analytics 才能识别出某个点击或者某个页面访问是来自于哪一个应用。
+
+按照以下的步骤:
+
+ 1. 访问 ;
+ 2. 提交指定信息以完成注册,并确保可用于 Web 应用,因为我们要开发的正是一个 Web 应用;
+ 3. 同意相关的条款,生成一个追踪 ID;
+ 4. 保存好追踪 ID。
+
+追踪 ID 拿到了,就可以开始编写业务代码了。
+
+### 添加 analytics.js 脚本
+
+Google 已经帮我们做好了接入之前需要做的所有事情,接下来就是我们的工作了。不过我们要做的也很简单,只需要把下面这段脚本添加到应用的 `index.html` 里,就可以了:
+
+```
+
+```
+
+现在我们来看一下 Google Analytics 是如何在应用程序中初始化的。
+
+### 创建追踪器
+
+首先创建一个应用程序的追踪器。在 `app.component.ts` 中执行以下两个步骤:
+
+ 1. 声明一个名为 `ga`,类型为 `any` 的全局变量(在 Typescript 中需要制定变量类型);
+ 2. 将下面一行代码加入到 `ngInInit()` 中。
+
+```
+ga('create', <你的追踪 ID>, 'auto');
+```
+
+这样就已经成功地在应用程序中初始化了一个 Google Analytics 的追踪器了。由于追踪器的初始化是在 `OnInit()` 函数中执行的,因此每当应用程序启动,追踪器就会启动。
+
+### 在单页应用中记录页面访问情况
+
+我们需要实现的是记录访问路由。
+
+如何记录用户在一个应用中不同部分的访问,这是一个难点。从功能上来看,单页应用中的路由对应了传统多页面应用中各个页面之间的跳转,因此我们需要记录访问路由。要做到这一点尽管不算简单,但仍然是可以实现的。在 `app.component.ts` 的 `ngOnInit()` 函数中添加以下的代码片段:
+
+```
+import { Router, NavigationEnd } from '@angular/router';
+...
+constructor(public router: Router) {}
+...
+this.router.events.subscribe(
+ event => {
+ if (event instanceof NavigationEnd) {
+ ga('set', 'page', event.urlAfterRedirects);
+ ga('send', { hitType: 'pageview', hitCallback: () => { this.pageViewSent = true; }});
+ }
+ }
+);
+```
+
+神奇的是,只需要这么几行代码,就实现了 Angular 应用中记录页面访问情况的功能。
+
+这段代码实际上做了以下几件事情:
+
+ 1. 从 Angular Router 中导入了 `Router`、`NavigationEnd`;
+ 2. 通过构造函数中将 `Router` 添加到组件中;
+ 3. 然后订阅 `router` 事件,也就是由 Angular Router 发出的所有事件;
+ 4. 只要产生了一个 `NavigationEnd` 事件实例,就将路由和目标作为一个页面访问进行记录。
+
+这样,只要使用到了页面路由,就会向 Google Analytics 发送一条页面访问记录,在 Google Analytics 的在线控制台中可以看到这些记录。
+
+类似地,我们可以用相同的方式来记录除了页面访问之外的活动,例如某个界面的查看次数或者时长等等。只要像上面的代码那样使用 `hitCallBack()` 就可以在有需要收集的数据的时候让应用程序作出反应,这里我们做的事情仅仅是把一个变量的值设为 `true`,但实际上 `hitCallBack()` 中可以执行任何代码。
+
+### 追踪用户交互活动
+
+除了页面访问记录之外,Google Analytics 还经常被用于追踪用户的交互活动,例如某个按钮的点击情况。“提交按钮被用户点击了多少次?”,“产品手册会被经常查阅吗?”这些都是 Web 应用程序的产品评审会议上的常见问题。这一节我们将会介绍如何实现这些数据的统计。
+
+#### 按钮点击
+
+设想这样一种场景,需要统计到应用程序中某个按钮或链接被点击的次数,这是一个和注册之类的关键动作关系最密切的数据指标。下面我们来举一个例子:
+
+假设应用程序中有一个“感兴趣”按钮,用于显示即将推出的活动,你希望通过统计这个按钮被点击的次数来推测有多少用户对此感兴趣。那么我们可以使用以下的代码来实现这个功能:
+
+```
+...
+params = {
+ eventCategory:
+ 'Button'
+ ,
+ eventAction:
+ 'Click'
+ ,
+ eventLabel:
+ 'Show interest'
+ ,
+ eventValue:
+ 1
+};
+
+showInterest() {
+ ga('send', 'event', this.params);
+}
+...
+```
+
+现在看下这段代码实际上做了什么。正如前面说到,当我们向 Google Analytics 发送数据的时候,Google Analytics 就会记录下来。因此我们可以向 `send()` 方法传递不同的参数,以区分不同的事件,例如两个不同按钮的点击记录。
+
+1、首先我们定义了一个 `params` 对象,这个对象包含了以下几个字段:
+
+ 1. `eventCategory` – 交互发生的对象,这里对应的是按钮(button)
+ 2. `eventAction` – 发生的交互的类型,这里对应的是点击(click)
+ 3. `eventLabel` – 交互动作的标识,这里对应的是这个按钮的内容,也就是“感兴趣”
+ 4. `eventValue` – 与每个发生的事件实例相关联的值
+
+由于这个例子中是要统计点击了“感兴趣”按钮的用户数,因此我们把 `eventValue` 的值定为 1。
+
+2、对象构造完成之后,下一步就是将 `params` 对象作为请求负载发送到 Google Analytics,而这一步是通过事件绑定将 `showInterest()` 绑定在按钮上实现的。这也是使用 Google Analytics 追踪中最常用的发送事件方法。
+
+至此,Google Analytics 就可以通过记录按钮的点击次数来统计感兴趣的用户数了。
+
+#### 追踪社交活动
+
+Google Analytics 还可以通过应用程序追踪用户在社交媒体上的互动。其中一种场景就是在应用中放置类似 Facebook 的点赞按钮,下面我们来看看如何使用 Google Analytics 来追踪这一行为。
+
+```
+...
+fbLikeParams = {
+ socialNetwork:
+ 'Facebook',
+ socialAction:
+ 'Like',
+ socialTarget:
+ 'https://facebook.com/mypage'
+};
+...
+fbLike() {
+ ga('send', 'social', this.fbLikeParams);
+}
+```
+
+如果你觉得这段代码似曾相识,那是因为它确实跟上面统计“感兴趣”按钮点击次数的代码非常相似。下面我们继续看其中每一步的内容:
+
+1、构造发送的数据负载,其中包括以下字段:
+
+ 1. `socialNetwork` – 交互发生的社交媒体,例如 Facebook、Twitter 等等
+ 2. `socialAction` – 发生的交互类型,例如点赞、发表推文、分享等等
+ 3. `socialTarget` – 交互的目标 URL,一般是社交媒体账号的主页
+
+2、下一步是增加一个函数来发送整个交互记录。和统计按钮点击数量时相比,这里使用 `send()` 的方式有所不同。另外,我们还需要把这个函数绑定到已有的点赞按钮上。
+
+在追踪用户交互方面,Google Analytics 还可以做更多的事情,其中最重要的一种是针对异常的追踪,这让我们可以通过 Google Analytics 来追踪应用程序中出现的错误和异常。在本文中我们就不赘述这一点了,但我们鼓励读者自行探索。
+
+### 用户识别
+
+#### 隐私是一项权利,而不是奢侈品
+
+Google Analytics 除了可以记录很多用户的操作和交互活动之外,这一节还将介绍一个不太常见的功能,就是可以控制是否对用户的身份进行追踪。
+
+#### Cookies
+
+Google Analytics 追踪用户活动的方式是基于 Cookies 的,因此我们可以自定义 Cookies 的名称以及一些其它的内容,请看下面这段代码:
+
+```
+trackingID =
+ 'UA-139883813-1'
+;
+cookieParams = {
+ cookieName: 'myGACookie',
+ cookieDomain: window.location.hostname,
+ cookieExpires: 604800
+};
+...
+ngOnInit() {
+ ga('create', this.trackingID, this.cookieParams);
+...
+}
+```
+
+在上面这段代码中,我们设置了 Google Analytics Cookies 的名称、域以及过期时间,这就让我们能够将不同网站或 Web 应用的 Cookies 区分开来。因此我们需要为我们自己的应用程序的 Google Analytics 追踪器的 Cookies 设置一个自定义的标识1,而不是一个自动生成的随机标识。
+
+#### IP 匿名
+
+在某些场景下,我们可能不需要知道应用程序的流量来自哪里。例如对于一个按钮点击的追踪器,我们只需要关心按钮的点击量,而不需要关心点击者的地理位置。在这种场景下,Google Analytics 允许我们只追踪用户的操作行为,而不获取到用户的 IP 地址。
+
+```
+ipParams = {
+ anonymizeIp: true
+};
+...
+ngOnInit() {
+ ...
+ ga('set', this.ipParams);
+ ...
+}
+```
+
+在上面这段代码中,我们将 Google Analytics 追踪器的 `abibymizeIp` 参数设置为 `true`。这样用户的 IP 地址就不会被 Google Analytics 所追踪,这可以让用户知道自己的隐私正在被保护。
+
+#### 不被跟踪
+
+还有些时候用户可能不希望自己的行为受到追踪,而 Google Analytics 也允许这样的需求。因此也存在让用户不被追踪的选项。
+
+```
+...
+optOut() {
+ window['ga-disable-UA-139883813-1'] = true;
+}
+...
+```
+
+`optOut()` 是一个自定义函数,它可以禁用页面中的 Google Analytics 追踪,我们可以使用按钮或复选框上得事件绑定来使用这一个功能,这样用户就可以选择是否会被 Google Analytics 追踪。
+
+在本文中,我们讨论了 Google Analytics 集成到单页应用时的难点,并探索出了一种相关的解决方法。我们还了解到了如何在单页应用中追踪页面访问和用户交互,例如按钮点击、社交媒体活动等。
+
+最后,我们还了解到 Google Analytics 为用户提供了保护隐私的功能,尤其是用户的一些隐私数据并不需要参与到统计当中的时候。而用户也可以选择完全不受到 Google Analytics 的追踪。除此以外,Google Analytics 还可以做到很多其它的事情,这就需要我们继续不断探索了。
+
+--------------------------------------------------------------------------------
+
+via: https://opensourceforu.com/2019/10/all-that-you-can-do-with-google-analytics-and-more/
+
+作者:[Ashwin Sathian][a]
+选题:[lujun9972][b]
+译者:[HankChow](https://github.com/HankChow)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensourceforu.com/author/ashwin-sathian/
+[b]: https://github.com/lujun9972
+[1]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/10/Analytics-illustration.jpg?resize=696%2C396&ssl=1 (Analytics illustration)
+[2]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/10/Analytics-illustration.jpg?fit=900%2C512&ssl=1
diff --git a/published/201910/20191004 In Fedora 31, 32-bit i686 is 86ed.md b/published/201910/20191004 In Fedora 31, 32-bit i686 is 86ed.md
new file mode 100644
index 0000000000..933083eb29
--- /dev/null
+++ b/published/201910/20191004 In Fedora 31, 32-bit i686 is 86ed.md
@@ -0,0 +1,56 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11424-1.html)
+[#]: subject: (In Fedora 31, 32-bit i686 is 86ed)
+[#]: via: (https://fedoramagazine.org/in-fedora-31-32-bit-i686-is-86ed/)
+[#]: author: (Justin Forbes https://fedoramagazine.org/author/jforbes/)
+
+Fedora 31 将放弃 32 位 i686 支持
+======
+
+![][1]
+
+Fedora 31 中[丢弃了][2] 32 位 i686 内核及其可启动镜像。虽然可能有一些用户仍然拥有无法与 64 位 x86_64 内核一起使用的硬件,但数量很少。本文为你提供了这次更改背后的整个事情,以及在 Fedora 31 中仍然可以找到的 32 位元素。
+
+### 发生了什么?
+
+i686 架构实质上从 [Fedora 27 版本][3]就进入了社区支持阶段(LCTT 译注:不再由官方支持)。不幸的是,社区中没有足够的成员愿意做维护该体系结构的工作。不过请放心,Fedora 不会删除所有 32 位软件包,仍在构建许多 i686 软件包,以确保诸如 multilib、wine 和 Steam 之类的东西可以继续工作。
+
+尽管该存储库不再构建和镜像输出,但存在一个 koji i686 存储库,该库可与 mock 一起使用以构建 32 位程序包,并且可以在紧要关头安装不属于 x86_64 multilib 存储库的 32 位版本。当然,维护人员希望这样做解决有限的使用场景。只是需要运行一个 32 位应用程序的用户应该可以在 64 位系统上使用 multilib 来运行。
+
+### 如果你要运行 32 位应用需要做什么?
+
+如果你仍在运行 32 位 i686 系统,则会在 Fedora 30 生命周期中继续收到受支持的 Fedora 更新。直到大约 2020 年 5 月或 6 月。到那时,如果硬件支持,你可以将其重新安装为 64 位 x86_64,或者如果可能的话,将其替换为支持 64 位的硬件。
+
+社区中有一个用户已经成功地从 32 位 Fedora “升级” 到了 64 位 x86 Fedora。虽然这不是预期或受支持的升级路径,但应该也可行。该项目希望可以为具有 64 位功能的硬件的用户提供一些文档,以在 Fedora 30 使用寿命终止之前说明该升级过程。
+
+如果有 64 位的 CPU,但由于内存不足而运行 32 位 Fedora,请尝试[备用桌面流派][4]之一。LXDE 和其他产品在内存受限的环境中往往表现良好。对于仅在旧的可以扔掉的 32 位硬件上运行简单服务器的用户,请考虑使用较新的 ARM 板之一。在许多情况下,仅节能一项就可以支付新硬件的费用。如果以上皆不可行,[CentOS 7][5] 提供了一个 32 位镜像,并对该平台提供长期支持。
+
+### 安全与你
+
+尽管有些用户可能会在生命周期结束后继续运行旧版本的 Fedora,但强烈建议不要这样做。人们不断研究软件的安全问题。通常,他们发现这些问题已经存在多年了。
+
+一旦 Fedora 维护人员知道了此类问题,他们通常会为它们打补丁,并为支持的发行版提供更新,而不会给使用寿命已终止的发行版提供。当然,一旦这些漏洞公开,就会有人尝试利用它们。如果你在生命周期结束时运行了较旧的发行版,则安全风险会随着时间的推移而增加,从而使你的系统面临不断增长的风险。
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/in-fedora-31-32-bit-i686-is-86ed/
+
+作者:[Justin Forbes][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/jforbes/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2019/09/i686-86-816x345.jpg
+[2]: https://fedoraproject.org/wiki/Changes/Stop_Building_i686_Kernels
+[3]: https://fedoramagazine.org/announcing-fedora-27/
+[4]: https://spins.fedoraproject.org
+[5]: https://centos.org
+[6]: https://unsplash.com/@alexkixa?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
+[7]: https://unsplash.com/s/photos/motherboard?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
diff --git a/published/201910/20191005 Use GameHub to Manage All Your Linux Games in One Place.md b/published/201910/20191005 Use GameHub to Manage All Your Linux Games in One Place.md
new file mode 100644
index 0000000000..5c4de853c5
--- /dev/null
+++ b/published/201910/20191005 Use GameHub to Manage All Your Linux Games in One Place.md
@@ -0,0 +1,161 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wenwensnow)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11504-1.html)
+[#]: subject: (Use GameHub to Manage All Your Linux Games in One Place)
+[#]: via: (https://itsfoss.com/gamehub/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+用 GameHub 集中管理你 Linux 上的所有游戏
+======
+
+你在 Linux 上是怎么[玩游戏的呢][1]? 让我猜猜,要不就是从软件中心直接安装,要不就选 Steam、GOG、Humble Bundle 等平台,对吧?但是,如果你有多个游戏启动器和客户端,又要如何管理呢?好吧,对我来说这简直令人头疼 —— 这也是我发现 [GameHub][2] 这个应用之后,感到非常高兴的原因。
+
+GameHub 是为 Linux 发行版设计的一个桌面应用,它能让你“集中管理你的所有游戏”。这听起来很有趣,是不是?下面让我来具体说明一下。
+
+![][3]
+
+### 集中管理不同平台 Linux 游戏的 GameHub
+
+让我们看看,对玩家来说,让 GameHub 成为一个[不可或缺的 Linux 应用][4]的功能,都有哪些。
+
+#### Steam、GOG & Humble Bundle 支持
+
+![][5]
+
+它支持 Steam、[GOG][6] 和 [Humble Bundle][7] 账户整合。你可以登录你的 GameHub 账号,从而在你的库管理器中管理所有游戏。
+
+对我来说,我在 Steam 上有很多游戏,Humble Bundle 上也有一些。我不能确保它支持所有平台,但可以确信的是,主流平台游戏是没有问题的。
+
+#### 支持原生游戏
+
+![][8]
+
+[有很多网站专门推荐 Linux 游戏,并支持下载][9]。你可以通过下载安装包,或者添加可执行文件,从而管理原生游戏。
+
+可惜的是,现在无法在 GameHub 内搜索 Linux 游戏。如上图所示,你需要分别下载游戏,随后再将其添加到 GameHub 中。
+
+#### 模拟器支持
+
+用模拟器,你可以在 [Linux 上玩复古游戏][10]。正如上图所示,你可以添加模拟器(并导入模拟的镜像)。
+
+你可以在 [RetroArch][11] 查看已有的模拟器,但也能根据需求添加自定义模拟器。
+
+#### 用户界面
+
+![Gamehub 界面选项][12]
+
+当然,用户体验很重要。因此,探究下用户界面都有些什么,也很有必要。
+
+我个人觉得,这一应用很容易使用,并且黑色主题是一个加分项。
+
+#### 手柄支持
+
+如果你习惯在 Linux 系统上用手柄玩游戏 —— 你可以轻松在设置里添加,启用或禁用它。
+
+#### 多个数据提供商
+
+因为它需要获取你的游戏信息(或元数据),也意味着它需要一个数据源。你可以看到下图列出的所有数据源。
+
+![Data Providers Gamehub][13]
+
+这里你什么也不用做 —— 但如果你使用的是 steam 之外的其他平台,你需要为 [IDGB 生成一个 API 密钥][14]。
+
+我建议只有出现 GameHub 中的提示/通知,或有些游戏在 GameHub 上没有任何描述/图片/状态时,再这么做。
+
+#### 兼容性选项
+
+![][15]
+
+你有不支持在 Linux 上运行的游戏吗?
+
+不用担心,GameHub 上提供了多种兼容工具,如 Wine/Proton,你可以利用它们来玩游戏。
+
+我们无法确定具体哪个兼容工具适用于你 —— 所以你需要自己亲自测试。然而,对许多游戏玩家来说,这的确是个很有用的功能。
+
+### GameHub: 如何安装它呢?
+
+![][18]
+
+首先,你可以直接在软件中心或者应用商店内搜索。 它在 “Pop!_Shop” 之下。所以,它在绝大多数官方源中都能找到。
+
+如果你在这些地方都没有找到,你可以手动添加源,并从终端上安装它,你需要输入以下命令:
+
+```
+sudo add-apt-repository ppa:tkashkin/gamehub
+sudo apt update
+sudo apt install com.github.tkashkin.gamehub
+```
+
+如果你遇到了 “add-apt-repository command not found” 这个错误,你可以看看,[add-apt-repository not found error.][19]这篇文章,它能帮你解决这一问题。
+
+这里还提供 AppImage 和 FlatPak 版本。 在[官网][2] 上,你可以针对找到其他 Linux 发行版的安装手册。
+
+同时,你还可以从它的 [GitHub 页面][20]下载之前版本的安装包.
+
+[GameHub][2]
+
+### 如何在 GameHub 上管理你的游戏?
+
+在启动程序后,你可以将自己的 Steam/GOG/Humble Bundle 账号添加进来。
+
+对于 Steam,你需要在 Linux 发行版上安装 Steam 客户端。一旦安装完成,你可以轻松将账号中的游戏导入 GameHub。
+
+![][16]
+
+对于 GOG & Humble Bundle,登录后,就能直接在 GameHub 上管理游戏了。
+
+如果你想添加模拟器或者本地安装文件,点击窗口右上角的 “+” 按钮进行添加。
+
+### 如何安装游戏?
+
+对于 Steam 游戏,它会自动启动 Steam 客户端,从而下载/安装游戏(我希望之后安装游戏,可以不用启动 Steam!)
+
+![][17]
+
+但对于 GOG/Humble Bundle,登录后就能直接、下载安装游戏。必要的话,对于那些不支持在 Linux 上运行的游戏,你可以使用兼容工具。
+
+无论是模拟器游戏,还是本地游戏,只需添加安装包或导入模拟器镜像就可以了。这里没什么其他步骤要做。
+
+### 注意
+
+GameHub 是相当灵活的一个集中游戏管理应用。 用户界面和选项设置也相当直观。
+
+你之前是否使用过这一应用呢?如果有,请在评论里写下你的感受。
+
+而且,如果你想尝试一些与此功能相似的工具/应用,请务必告诉我们。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/gamehub/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[wenwensnow](https://github.com/wenwensnow)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/linux-gaming-guide/
+[2]: https://tkashkin.tk/projects/gamehub/
+[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/gamehub-home-1.png?ssl=1
+[4]: https://itsfoss.com/essential-linux-applications/
+[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/10/gamehub-platform-support.png?ssl=1
+[6]: https://www.gog.com/
+[7]: https://www.humblebundle.com/monthly?partner=itsfoss
+[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/gamehub-native-installers.png?ssl=1
+[9]: https://itsfoss.com/download-linux-games/
+[10]: https://itsfoss.com/play-retro-games-linux/
+[11]: https://www.retroarch.com/
+[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/gamehub-appearance.png?ssl=1
+[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/data-providers-gamehub.png?ssl=1
+[14]: https://www.igdb.com/api
+[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/gamehub-windows-game.png?fit=800%2C569&ssl=1
+[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/gamehub-library.png?ssl=1
+[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/gamehub-compatibility-layer.png?ssl=1
+[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/10/gamehub-install.jpg?ssl=1
+[19]: https://itsfoss.com/add-apt-repository-command-not-found/
+[20]: https://github.com/tkashkin/GameHub/releases
diff --git a/published/201910/20191006 How to Install and Configure VNC Server on Centos 8 - RHEL 8.md b/published/201910/20191006 How to Install and Configure VNC Server on Centos 8 - RHEL 8.md
new file mode 100644
index 0000000000..ad7f88f885
--- /dev/null
+++ b/published/201910/20191006 How to Install and Configure VNC Server on Centos 8 - RHEL 8.md
@@ -0,0 +1,190 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11458-1.html)
+[#]: subject: (How to Install and Configure VNC Server on Centos 8 / RHEL 8)
+[#]: via: (https://www.linuxtechi.com/install-configure-vnc-server-centos8-rhel8/)
+[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/)
+
+如何在 Centos 8 / RHEL 8 上安装和配置 VNC 服务器
+======
+
+VNC(虚拟网络计算)服务器是基于 GUI 的桌面共享平台,它可让你访问远程桌面计算机。在 Centos 8 和 RHEL 8 系统中,默认未安装 VNC 服务器,它需要手动安装。在本文中,我们将通过简单的分步指南,介绍如何在 Centos 8 / RHEL 8 上安装 VNC 服务器。
+
+### 在 Centos 8 / RHEL 8 上安装 VNC 服务器的先决要求
+
+要在你的系统中安装 VNC 服务器,请确保你的系统满足以下要求:
+
+ * CentOS 8 / RHEL 8
+ * GNOME 桌面环境
+ * root 用户权限
+ * DNF / YUM 软件包仓库
+
+### 在 Centos 8 / RHEL 8 上安装 VNC 服务器的分步指导
+
+#### 步骤 1)安装 GNOME 桌面环境
+
+在 CentOS 8 / RHEL 8 中安装 VNC 服务器之前,请确保已安装了桌面环境(DE)。如果已经安装了 GNOME 桌面或安装了 GUI 支持,那么可以跳过此步骤。
+
+在 CentOS 8 / RHEL 8 中,GNOME 是默认的桌面环境。如果你的系统中没有它,请使用以下命令进行安装:
+
+```
+[root@linuxtechi ~]# dnf groupinstall "workstation"
+或者
+[root@linuxtechi ~]# dnf groupinstall "Server with GUI
+```
+
+成功安装上面的包后,请运行以下命令启用图形模式:
+
+```
+[root@linuxtechi ~]# systemctl set-default graphical
+```
+
+现在重启系统,进入 GNOME 登录页面(LCTT 译注:你可以通过切换运行态来进入图形界面)。
+
+```
+[root@linuxtechi ~]# reboot
+```
+
+重启后,请取消注释 `/etc/gdm/custom.conf` 中的 `WaylandEnable=false`,以使通过 vnc 进行的远程桌面会话请求由 GNOME 桌面的 xorg 处理,来代替 Wayland 显示管理器。
+
+注意: Wayland 是 GNOME 中的默认显示管理器 (GDM),并且未配置用于处理 X.org 等远程渲染的 API。
+
+#### 步骤 2)安装 VNC 服务器(tigervnc-server)
+
+接下来,我们将安装 VNC 服务器,有很多 VNC 服务器可以选择,出于安装目的,我们将安装 `TigerVNC 服务器`。它是最受欢迎的 VNC 服务器之一,并且高性能还独立于平台,它使用户可以轻松地与远程计算机进行交互。
+
+现在,使用以下命令安装 TigerVNC 服务器:
+
+```
+[root@linuxtechi ~]# dnf install tigervnc-server tigervnc-server-module -y
+```
+
+#### 步骤 3)为本地用户设置 VNC 密码
+
+假设我们希望用户 `pkumar` 使用 VNC 进行远程桌面会话,然后切换到该用户并使用 `vncpasswd` 命令设置其密码,
+
+```
+[root@linuxtechi ~]# su - pkumar
+[root@linuxtechi ~]$ vncpasswd
+Password:
+Verify:
+Would you like to enter a view-only password (y/n)? n
+A view-only password is not used
+[root@linuxtechi ~]$
+[root@linuxtechi ~]$ exit
+logout
+[root@linuxtechi ~]#
+```
+
+#### 步骤 4)设置 VNC 服务器配置文件
+
+下一步是配置 VNC 服务器配置文件。创建含以下内容的 `/etc/systemd/system/vncserver@.service`,以便为上面的本地用户 `pkumar` 启动 tigervnc-server 的服务。
+
+```
+[root@linuxtechi ~]# vim /etc/systemd/system/vncserver@.service
+[Unit]
+Description=Remote Desktop VNC Service
+After=syslog.target network.target
+
+[Service]
+Type=forking
+WorkingDirectory=/home/pkumar
+User=pkumar
+Group=pkumar
+
+ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
+ExecStart=/usr/bin/vncserver -autokill %i
+ExecStop=/usr/bin/vncserver -kill %i
+
+[Install]
+WantedBy=multi-user.target
+```
+
+保存并退出文件,
+
+注意:替换上面文件中的用户名为你自己的。
+
+默认情况下,VNC 服务器在 tcp 端口 5900+n 上监听,其中 n 是显示端口号,如果显示端口号为 “1”,那么 VNC 服务器将在 TCP 端口 5901 上监听其请求。
+
+#### 步骤 5)启动 VNC 服务并允许防火墙中的端口
+
+我将显示端口号设置为 1,因此请使用以下命令在显示端口号 “1” 上启动并启用 vnc 服务,
+
+```
+[root@linuxtechi ~]# systemctl daemon-reload
+[root@linuxtechi ~]# systemctl start vncserver@:1.service
+[root@linuxtechi ~]# systemctl enable vncserver@:1.service
+Created symlink /etc/systemd/system/multi-user.target.wants/vncserver@:1.service → /etc/systemd/system/vncserver@.service.
+[root@linuxtechi ~]#
+```
+
+使用下面的 `netstat` 或 `ss` 命令来验证 VNC 服务器是否开始监听 5901 上的请求,
+
+```
+[root@linuxtechi ~]# netstat -tunlp | grep 5901
+tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN 8169/Xvnc
+tcp6 0 0 :::5901 :::* LISTEN 8169/Xvnc
+[root@linuxtechi ~]# ss -tunlp | grep -i 5901
+tcp LISTEN 0 5 0.0.0.0:5901 0.0.0.0:* users:(("Xvnc",pid=8169,fd=6))
+tcp LISTEN 0 5 [::]:5901 [::]:* users:(("Xvnc",pid=8169,fd=7))
+[root@linuxtechi ~]#
+```
+
+使用下面的 `systemctl` 命令验证 VNC 服务器的状态,
+
+```
+[root@linuxtechi ~]# systemctl status vncserver@:1.service
+```
+
+![vncserver-status-centos8-rhel8][2]
+
+上面命令的输出确认在 tcp 端口 5901 上成功启动了 VNC。使用以下命令在系统防火墙中允许 VNC 服务器端口 “5901”,
+
+```
+[root@linuxtechi ~]# firewall-cmd --permanent --add-port=5901/tcp
+success
+[root@linuxtechi ~]# firewall-cmd --reload
+success
+[root@linuxtechi ~]#
+```
+
+#### 步骤 6)连接到远程桌面会话
+
+现在,我们已经准备就绪,可以查看远程桌面连接是否正常工作。要访问远程桌面,请在 Windows / Linux 工作站中启动 VNC Viewer,然后输入 VNC 服务器的 IP 地址和端口号,然后按回车。
+
+![VNC-Viewer-Windows10][3]
+
+接下来,它将询问你的 VNC 密码。输入你先前为本地用户创建的密码,然后单击 “OK” 继续。
+
+![VNC-Viewer-Connect-CentOS8-RHEL8-VNC-Server][4]
+
+现在你可以看到远程桌面,
+
+![VNC-Desktop-Screen-CentOS8][5]
+
+就是这样,你已经在 Centos 8 / RHEL 8 中成功安装了 VNC 服务器。
+
+### 总结
+
+希望这篇在 Centos 8 / RHEL 8 上安装 VNC 服务器的分步指南为你提供了轻松设置 VNC 服务器并访问远程桌面的所有信息。请在下面的评论栏中提供你的意见和建议。下篇文章再见。谢谢再见!!!
+
+--------------------------------------------------------------------------------
+
+via: https://www.linuxtechi.com/install-configure-vnc-server-centos8-rhel8/
+
+作者:[Pradeep Kumar][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linuxtechi.com/author/pradeep/
+[b]: https://github.com/lujun9972
+[1]: https://www.linuxtechi.com/cdn-cgi/l/email-protection
+[2]: https://www.linuxtechi.com/wp-content/uploads/2019/10/vncserver-status-centos8-rhel8.jpg
+[3]: https://www.linuxtechi.com/wp-content/uploads/2019/10/VNC-Viewer-Windows10.jpg
+[4]: https://www.linuxtechi.com/wp-content/uploads/2019/10/VNC-Viewer-Connect-CentOS8-RHEL8-VNC-Server.jpg
+[5]: https://www.linuxtechi.com/wp-content/uploads/2019/10/VNC-Desktop-Screen-CentOS8.jpg
diff --git a/published/201910/20191007 IceWM - A really cool desktop.md b/published/201910/20191007 IceWM - A really cool desktop.md
new file mode 100644
index 0000000000..8ad9f9f045
--- /dev/null
+++ b/published/201910/20191007 IceWM - A really cool desktop.md
@@ -0,0 +1,76 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11443-1.html)
+[#]: subject: (IceWM – A really cool desktop)
+[#]: via: (https://fedoramagazine.org/icewm-a-really-cool-desktop/)
+[#]: author: (tdawson https://fedoramagazine.org/author/tdawson/)
+
+IceWM:一个非常酷的桌面
+======
+
+![][1]
+
+IceWM 是一款非常轻量的桌面。它已经出现 20 多年了,它今天的目标仍然与当时相同:速度、简单性以及不妨碍用户。
+
+我曾经将 IceWM 添加到 Scientific Linux 中作为轻量级桌面。当时它只是 0.5 兆的 rpm 包。运行时,它仅使用 5 兆的内存。这些年来,IceWM 有所增长。rpm 包现在为 1 兆。运行时,IceWM 现在使用 10 兆的内存。尽管在过去十年中它的大小增加了一倍,但它仍然非常小。
+
+这么小的包,你能得到什么?确切地说,就是一个窗口管理器。没有其他东西。你有一个带有菜单或图标的工具栏来启动程序。速度很快。最后,还有主题和选项。除了工具栏中的一些小东西,就只有这些了。
+
+![][2]
+
+### 安装
+
+因为 IceWM 很小,你只需安装主软件包。
+
+```
+$ sudo dnf install icewm
+```
+
+如果要节省磁盘空间,许多依赖项都是可选的。没有它们,IceWM 也可以正常工作。
+
+```
+$ sudo dnf install icewm --setopt install_weak_deps=false
+```
+
+### 选项
+
+IceWM 默认已经设置完毕,以使普通的 Windows 用户也能感到舒适。这是一件好事,因为选项是通过配置文件手动完成的。
+
+我希望你不会因此而止步,因为它并没有听起来那么糟糕。它只有 8 个配置文件,大多数人只使用其中几个。主要的三个配置文件是 `keys`(键绑定),`preferences`(总体首选项)和 `toolbar`(工具栏上显示的内容)。默认配置文件位于 `/usr/share/icewm/`。
+
+要进行更改,请将默认配置复制到 IceWM 家目录(`~/.icewm`),编辑文件,然后重新启动 IceWM。第一次做可能会有点害怕,因为在 “Logout” 菜单项下可以找到 “Restart Icewm”。但是,当你重启 IceWM 时,你只会看到闪烁一下,更改就生效了。任何打开的程序均不受影响,并保持原样。
+
+### 主题
+
+![IceWM in the NanoBlue theme][3]
+
+如果安装 icewm-themes 包,那么会得到很多主题。与常规选项不同,你无需重启 IceWM 即可更改为新主题。通常我不会谈论主题,但是由于其他功能很少,因此我想提下。
+
+### 工具栏
+
+工具栏是为 IceWM 添加了更多的功能的地方。你可以看到它可以切换不同的工作区。工作区有时称为虚拟桌面。单击工作区图标以移动到它。右键单击一个窗口的任务栏项目,可以在工作区之间移动它。如果你喜欢工作区,它拥有你想要的所有功能。如果你不喜欢工作区,那么可以选择关闭它。
+
+工具栏还有网络/内存/CPU 监控图。将鼠标悬停在图标上可获得详细信息。单击图标可以打开一个拥有完整监控功能的窗口。这些小图形曾经出现在每个窗口管理器上。但是,随着桌面环境的成熟,它们都将这些图形去除了。我很高兴 IceWM 留下了这个不错的功能。
+
+### 总结
+
+如果你想要轻量但功能强大的桌面,IceWM 适合你。它已经设置好了,因此新的 Linux 用户也可以立即使用它。它是灵活的,因此 Unix 用户可以根据自己的喜好进行调整。最重要的是,IceWM 可以让你的程序不受阻碍地运行。
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/icewm-a-really-cool-desktop/
+
+作者:[tdawson][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/tdawson/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2019/09/icewm-1-816x346.png
+[2]: https://fedoramagazine.org/wp-content/uploads/2019/09/icewm.2-1024x768.png
+[3]: https://fedoramagazine.org/wp-content/uploads/2019/09/icewm.3-1024x771.png
diff --git a/published/201910/20191008 7 steps to securing your Linux server.md b/published/201910/20191008 7 steps to securing your Linux server.md
new file mode 100644
index 0000000000..a98495f234
--- /dev/null
+++ b/published/201910/20191008 7 steps to securing your Linux server.md
@@ -0,0 +1,223 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11444-1.html)
+[#]: subject: (7 steps to securing your Linux server)
+[#]: via: (https://opensource.com/article/19/10/linux-server-security)
+[#]: author: (Patrick H. Mullins https://opensource.com/users/pmullins)
+
+安全强化你的 Linux 服务器的七个步骤
+======
+
+> 通过七个简单的步骤来加固你的 Linux 服务器。
+
+
+
+这篇入门文章将向你介绍基本的 Linux 服务器安全知识。虽然主要针对 Debian/Ubuntu,但是你可以将此处介绍的所有内容应用于其他 Linux 发行版。我也鼓励你研究这份材料,并在适用的情况下进行扩展。
+
+### 1、更新你的服务器
+
+保护服务器安全的第一件事是更新本地存储库,并通过应用最新的修补程序来升级操作系统和已安装的应用程序。
+
+在 Ubuntu 和 Debian 上:
+
+```
+$ sudo apt update && sudo apt upgrade -y
+```
+
+在 Fedora、CentOS 或 RHEL:
+
+```
+$ sudo dnf upgrade
+```
+
+### 2、创建一个新的特权用户
+
+接下来,创建一个新的用户帐户。永远不要以 root 身份登录服务器,而是创建你自己的帐户(用户),赋予它 `sudo` 权限,然后使用它登录你的服务器。
+
+首先创建一个新用户:
+
+```
+$ adduser
+```
+
+通过将 `sudo` 组(`-G`)附加(`-a`)到用户的组成员身份里,从而授予新用户帐户 `sudo` 权限:
+
+```
+$ usermod -a -G sudo
+```
+
+### 3、上传你的 SSH 密钥
+
+你应该使用 SSH 密钥登录到新服务器。你可以使用 `ssh-copy-id` 命令将[预生成的 SSH 密钥][2]上传到你的新服务器:
+
+```
+$ ssh-copy-id @ip_address
+```
+
+现在,你无需输入密码即可登录到新服务器。
+
+### 4、安全强化 SSH
+
+接下来,进行以下三个更改:
+
+* 禁用 SSH 密码认证
+* 限制 root 远程登录
+* 限制对 IPv4 或 IPv6 的访问
+
+使用你选择的文本编辑器打开 `/etc/ssh/sshd_config` 并确保以下行:
+
+```
+PasswordAuthentication yes
+PermitRootLogin yes
+```
+
+改成这样:
+
+```
+PasswordAuthentication no
+PermitRootLogin no
+```
+
+接下来,通过修改 `AddressFamily` 选项将 SSH 服务限制为 IPv4 或 IPv6。要将其更改为仅使用 IPv4(对大多数人来说应该没问题),请进行以下更改:
+
+```
+AddressFamily inet
+```
+
+重新启动 SSH 服务以启用你的更改。请注意,在重新启动 SSH 服务之前,与服务器建立两个活动连接是一个好主意。有了这些额外的连接,你可以在重新启动 SSH 服务出错的情况下修复所有问题。
+
+在 Ubuntu 上:
+
+```
+$ sudo service sshd restart
+```
+
+在 Fedora 或 CentOS 或任何使用 Systemd 的系统上:
+
+```
+$ sudo systemctl restart sshd
+```
+
+### 5、启用防火墙
+
+现在,你需要安装防火墙、启用防火墙并对其进行配置,以仅允许你指定的网络流量通过。(Ubuntu 上的)[简单的防火墙][3](UFW)是一个易用的 iptables 界面,可大大简化防火墙的配置过程。
+
+你可以通过以下方式安装 UFW:
+
+```
+$ sudo apt install ufw
+```
+
+默认情况下,UFW 拒绝所有传入连接,并允许所有传出连接。这意味着服务器上的任何应用程序都可以访问互联网,但是任何尝试访问服务器的内容都无法连接。
+
+首先,确保你可以通过启用对 SSH、HTTP 和 HTTPS 的访问来登录:
+
+```
+$ sudo ufw allow ssh
+$ sudo ufw allow http
+$ sudo ufw allow https
+```
+
+然后启用 UFW:
+
+```
+$ sudo ufw enable
+```
+
+你可以通过以下方式查看允许和拒绝了哪些服务:
+
+```
+$ sudo ufw status
+```
+
+如果你想禁用 UFW,可以通过键入以下命令来禁用:
+
+```
+$ sudo ufw disable
+```
+
+你还可以(在 RHEL/CentOS 上)使用 [firewall-cmd][4],它已经安装并集成到某些发行版中。
+
+### 6、安装 Fail2ban
+
+[Fail2ban][5] 是一种用于检查服务器日志以查找重复或自动攻击的应用程序。如果找到任何攻击,它会更改防火墙以永久地或在指定的时间内阻止攻击者的 IP 地址。
+
+你可以通过键入以下命令来安装 Fail2ban:
+
+```
+$ sudo apt install fail2ban -y
+```
+
+然后复制随附的配置文件:
+
+```
+$ sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
+```
+
+重启 Fail2ban:
+
+```
+$ sudo service fail2ban restart
+```
+
+这样就行了。该软件将不断检查日志文件以查找攻击。一段时间后,该应用程序将建立相当多的封禁的 IP 地址列表。你可以通过以下方法查询 SSH 服务的当前状态来查看此列表:
+
+```
+$ sudo fail2ban-client status ssh
+```
+
+### 7、移除无用的网络服务
+
+几乎所有 Linux 服务器操作系统都启用了一些面向网络的服务。你可能希望保留其中大多数,然而,有一些你或许希望删除。你可以使用 `ss` 命令查看所有正在运行的网络服务:(LCTT 译注:应该是只保留少部分,而所有确认无关的、无用的服务都应该停用或删除。)
+
+```
+$ sudo ss -atpu
+```
+
+`ss` 的输出取决于你的操作系统。下面是一个示例,它显示 SSH(`sshd`)和 Ngnix(`nginx`)服务正在侦听网络并准备连接:
+
+```
+tcp LISTEN 0 128 *:http *:* users:(("nginx",pid=22563,fd=7))
+tcp LISTEN 0 128 *:ssh *:* users:(("sshd",pid=685,fd=3))
+```
+
+删除未使用的服务的方式因你的操作系统及其使用的程序包管理器而异。
+
+要在 Debian / Ubuntu 上删除未使用的服务:
+
+```
+$ sudo apt purge
+```
+
+要在 Red Hat/CentOS 上删除未使用的服务:
+
+```
+$ sudo yum remove
+```
+
+再次运行 `ss -atup` 以确认这些未使用的服务没有安装和运行。
+
+### 总结
+
+本教程介绍了加固 Linux 服务器所需的最起码的措施。你应该根据服务器的使用方式启用其他安全层。这些安全层可以包括诸如各个应用程序配置、入侵检测软件(IDS)以及启用访问控制(例如,双因素身份验证)之类的东西。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/10/linux-server-security
+
+作者:[Patrick H. Mullins][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/pmullins
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/server_data_system_admin.png?itok=q6HCfNQ8 (computer servers processing data)
+[2]: https://opensource.com/article/19/4/ssh-keys-seahorse
+[3]: https://launchpad.net/ufw
+[4]: https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd
+[5]: https://www.fail2ban.org/wiki/index.php/Main_Page
diff --git a/published/201910/20191008 How to manage Go projects with GVM.md b/published/201910/20191008 How to manage Go projects with GVM.md
new file mode 100644
index 0000000000..62cf495b26
--- /dev/null
+++ b/published/201910/20191008 How to manage Go projects with GVM.md
@@ -0,0 +1,232 @@
+[#]: collector: (lujun9972)
+[#]: translator: (heguangzhi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11447-1.html)
+[#]: subject: (How to manage Go projects with GVM)
+[#]: via: (https://opensource.com/article/19/10/introduction-gvm)
+[#]: author: (Chris Collins https://opensource.com/users/clcollins)
+
+如何用 GVM 管理 Go 项目
+======
+
+> 使用 Go 版本管理器管理多个版本的 Go 语言环境及其模块。
+
+![正在编程的女人][1]
+
+Go 语言版本管理器([GVM][2])是管理 Go 语言环境的开源工具。GVM “pkgsets” 支持安装多个版本的 Go 并管理每个项目的模块。它最初由 [Josh Bussdieker][3] 开发,GVM(像它的对手 Ruby RVM 一样)允许你为每个项目或一组项目创建一个开发环境,分离不同的 Go 版本和包依赖关系,以提供更大的灵活性,防止不同版本造成的问题。
+
+有几种管理 Go 包的方式,包括内置于 Go 中的 Go 1.11 的 Modules。我发现 GVM 简单直观,即使我不用它来管理包,我还是会用它来管理 Go 不同的版本的。
+
+### 安装 GVM
+
+安装 GVM 很简单。[GVM 存储库][4]安装文档指示你下载安装程序脚本并将其传送到 Bash 来安装:
+
+```
+bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
+```
+
+尽管越来越多的人采用这种安装方法,但是在安装之前先看看安装程序在做什么仍然是一个很好的想法。以 GVM 为例,该安装程序脚本:
+
+1. 检查一些相关依赖性
+2. 克隆 GVM 存储库
+3. 使用 shell 脚本:
+ * 安装 Go 语言
+ * 管理 `GOPATH` 环境变量
+ * 向 `bashrc`、`zshrc` 或配置文件中添加一行内容
+
+如果你想确认它在做什么,你可以克隆该存储库并查看 shell 脚本,然后运行 `./binscripts/gvm-installer` 这个本地脚本进行设置。
+
+`注意:` 因为 GVM 可以用来下载和编译新的 Go 版本,所以有一些预期的依赖关系,如 Make、Git 和 Curl。你可以在 [GVM 的自述文件][5]中找到完整的发行版列表。
+
+### 使用 GVM 安装和管理 GO 版本
+
+一旦安装了 GVM,你就可以使用它来安装和管理不同版本的 Go。`gvm listall` 命令显示可下载和编译的可用版本的 Go:
+
+```
+[chris@marvin ]$ gvm listall
+
+gvm gos (available)
+
+ go1
+ go1.0.1
+ go1.0.2
+ go1.0.3
+
+<输出截断>
+```
+
+安装特定的 Go 版本就像 `gvm install <版本>` 一样简单,其中 `<版本>` 是 `gvm listall` 命令返回的版本之一。
+
+假设你正在进行一个使用 Go1.12.8 版本的项目。你可以使用 `gvm install go1.12.8` 安装这个版本:
+
+```
+[chris@marvin]$ gvm install go1.12.8
+Installing go1.12.8...
+ * Compiling...
+go1.12.8 successfully installed!
+```
+
+输入 `gvm list`,你会看到 Go 版本 1.12.8 与系统 Go 版本(使用操作系统的软件包管理器打包的版本)一起并存:
+
+```
+[chris@marvin]$ gvm list
+
+gvm gos (installed)
+
+ go1.12.8
+=> system
+```
+
+GVM 仍在使用系统版本的 Go ,由 `=>` 符号表示。你可以使用 `gvm use` 命令切换你的环境以使用新安装的 go1.12.8:
+
+```
+[chris@marvin]$ gvm use go1.12.8
+Now using version go1.12.8
+
+[chris@marvin]$ go version
+go version go1.12.8 linux/amd64
+```
+
+GVM 使管理已安装版本的 Go 变得极其简单,但它不止于此!
+
+### 使用 GVM pkgset
+
+开箱即用,Go 有一种出色而令人沮丧的管理包和模块的方式。默认情况下,如果你 `go get` 获取一个包,它将被下载到 `$GOPATH` 目录中的 `src` 和 `pkg` 目录下,然后可以使用 `import` 将其包含在你的 Go 程序中。这使得获得软件包变得很容易,特别是对于非特权用户,而不需要 `sudo` 或 root 特权(很像 Python 中的 `pip install --user`)。然而,在不同的项目中管理相同包的不同版本是非常困难的。
+
+有许多方法可以尝试修复或缓解这个问题,包括实验性 Go Modules(Go 1.11 版中增加了初步支持)和 [Go dep][6](Go Modules 的“官方实验”并且持续迭代)。在我发现 GVM 之前,我会在一个 Go 项目自己的 Docker 容器中构建和测试它,以确保分离。
+
+GVM 通过使用 “pkgsets” 将项目的新目录附加到安装的 Go 版本的默认 `$GOPATH` 上,很好地实现了项目之间包的管理和隔离,就像 `$PATH` 在 Unix/Linux 系统上工作一样。
+
+想象它如何运行的。首先,安装新版 Go 1.12.9:
+
+```
+[chris@marvin]$ echo $GOPATH
+/home/chris/.gvm/pkgsets/go1.12.8/global
+
+[chris@marvin]$ gvm install go1.12.9
+Installing go1.12.9...
+ * Compiling...
+go1.12.9 successfully installed
+
+[chris@marvin]$ gvm use go1.12.9
+Now using version go1.12.9
+```
+
+当 GVM 被告知使用新版本时,它会更改为新的 `$GOPATH`,默认 `gloabl` pkgset 应用于该版本:
+
+```
+[chris@marvin]$ echo $GOPATH
+/home/chris/.gvm/pkgsets/go1.12.9/global
+
+[chris@marvin]$ gvm pkgset list
+
+gvm go package sets (go1.12.9)
+
+=> global
+```
+
+尽管默认情况下没有安装额外的包,但是全局 pkgset 中的包对于使用该特定版本的 Go 的任何项目都是可用的。
+
+现在,假设你正在启用一个新项目,它需要一个特定的包。首先,使用 GVM 创建一个新的 pkgset,名为 `introToGvm`:
+
+```
+[chris@marvin]$ gvm pkgset create introToGvm
+
+[chris@marvin]$ gvm pkgset use introToGvm
+Now using version go1.12.9@introToGvm
+
+[chris@marvin]$ gvm pkgset list
+
+gvm go package sets (go1.12.9)
+
+ global
+=> introToGvm
+```
+
+如上所述,pkgset 的一个新目录被添加到 `$GOPATH`:
+
+```
+[chris@marvin]$ echo $GOPATH
+/home/chris/.gvm/pkgsets/go1.12.9/introToGvm:/home/chris/.gvm/pkgsets/go1.12.9/global
+```
+
+将目录更改为预先设置的 `introToGvm` 路径,检查目录结构,这里使用 `awk` 和 `bash` 完成。
+
+```
+[chris@marvin]$ cd $( awk -F':' '{print $1}' <<< $GOPATH )
+[chris@marvin]$ pwd
+/home/chris/.gvm/pkgsets/go1.12.9/introToGvm
+
+[chris@marvin]$ ls
+overlay pkg src
+```
+
+请注意,新目录看起来很像普通的 `$GOPATH`。新的 Go 包使用同样的 `go get` 命令下载并正常使用,且添加到 pkgset 中。
+
+例如,使用以下命令获取 `gorilla/mux` 包,然后检查 pkgset 的目录结构:
+
+```
+[chris@marvin]$ go get github.com/gorilla/mux
+[chris@marvin]$ tree
+[chris@marvin introToGvm ]$ tree
+.
+├── overlay
+│ ├── bin
+│ └── lib
+│ └── pkgconfig
+├── pkg
+│ └── linux_amd64
+│ └── github.com
+│ └── gorilla
+│ └── mux.a
+src/
+└── github.com
+ └── gorilla
+ └── mux
+ ├── AUTHORS
+ ├── bench_test.go
+ ├── context.go
+ ├── context_test.go
+ ├── doc.go
+ ├── example_authentication_middleware_test.go
+ ├── example_cors_method_middleware_test.go
+ ├── example_route_test.go
+ ├── go.mod
+ ├── LICENSE
+ ├── middleware.go
+ ├── middleware_test.go
+ ├── mux.go
+ ├── mux_test.go
+ ├── old_test.go
+ ├── README.md
+ ├── regexp.go
+ ├── route.go
+ └── test_helpers.go
+```
+
+如你所见,`gorilla/mux` 已按预期添加到 pkgset `$GOPATH` 目录中,现在可用于使用此 pkgset 项目了。
+
+### GVM 让 Go 管理变得轻而易举
+
+GVM 是一种直观且非侵入性的管理 Go 版本和包的方式。它可以单独使用,也可以与其他 Go 模块管理技术结合使用并利用 GVM Go 版本管理功能。按 Go 版本和包依赖来分离项目使得开发更加容易,并且减少了管理版本冲突的复杂性,GVM 让这变得轻而易举。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/10/introduction-gvm
+
+作者:[Chris Collins][a]
+选题:[lujun9972][b]
+译者:[heguangzhi](https://github.com/heguangzhi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/clcollins
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming-code-keyboard-laptop-music-headphones.png?itok=EQZ2WKzy (Woman programming)
+[2]: https://github.com/moovweb/gvm
+[3]: https://github.com/jbussdieker
+[4]: https://github.com/moovweb/gvm#installing
+[5]: https://github.com/moovweb/gvm/blob/master/README.md
+[6]: https://golang.github.io/dep/
diff --git a/published/201910/20191009 Command line quick tips- Locate and process files with find and xargs.md b/published/201910/20191009 Command line quick tips- Locate and process files with find and xargs.md
new file mode 100644
index 0000000000..038a61aaa6
--- /dev/null
+++ b/published/201910/20191009 Command line quick tips- Locate and process files with find and xargs.md
@@ -0,0 +1,98 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11469-1.html)
+[#]: subject: (Command line quick tips: Locate and process files with find and xargs)
+[#]: via: (https://fedoramagazine.org/command-line-quick-tips-locate-and-process-files-with-find-and-xargs/)
+[#]: author: (Ben Cotton https://fedoramagazine.org/author/bcotton/)
+
+命令行技巧:使用 find 和 xargs 查找和处理文件
+======
+
+![][1]
+
+`find` 是日常工具箱中功能强大、灵活的命令行程序之一。它如它名字所暗示的:查找符合你指定条件的文件和目录。借助 `-exec` 或 `-delete` 之类的参数,你可以让它对找到的文件进行操作。
+
+在[命令行提示][2]系列的这一期中,你将会看到 `find` 命令的介绍,并学习如何使用内置命令或使用 `xargs` 命令处理文件。
+
+### 查找文件
+
+`find` 至少要加上查找的路径。例如,此命令将查找(并打印)系统上的每个文件:
+
+```
+find /
+```
+
+由于一切皆文件,因此你会看到大量的输出。这可能无法帮助你找到所需的内容。你可以更改路径参数缩小范围,但这实际上并没有比使用 `ls` 命令更好。因此,你需要考虑要查找的内容。
+
+也许你想在家目录中查找所有 JPEG 文件。 `-name` 参数允许你将结果限制为与给定模式匹配的文件。
+
+```
+find ~ -name '*jpg'
+```
+
+但是等等!如果其中一些扩展名是大写怎么办? `-iname` 类似于 `-name`,但不区分大小写:
+
+```
+find ~ -iname '*jpg'
+```
+
+很好!但是 8.3 命名方案出自 1985 年。某些图片的扩展名可能是 .jpeg。幸运的是,我们可以将模式使用“或”(`-o`)进行组合。括号需要转义,以便使 `find` 命令而不是 shell 程序尝试解释它们。
+
+```
+find ~ \( -iname 'jpeg' -o -iname 'jpg' \)
+```
+
+更进一步。如果你有一些以 `jpg` 结尾的目录怎么办?(我不懂你为什么将目录命名为 `bucketofjpg` 而不是 `pictures`?)我们可以加上 `-type` 参数来仅查找文件:
+
+```
+find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f
+```
+
+或者,也许你想找到那些名字奇怪的目录,以便之后可以重命名它们:
+
+```
+find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type d
+```
+
+最近你拍摄了很多照片,因此使用 `-mtime`(修改时间)将范围缩小到最近一周修改过的文件。 `-7` 表示 7 天或更短时间内修改的所有文件。
+
+```
+find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7
+```
+
+### 使用 xargs 进行操作
+
+`xargs` 命令从标准输入流中获取参数,并基于它们执行命令。继续使用上一节中的示例,假设你要将上周修改过的家目录中的所有 JPEG 文件复制到 U 盘,以便插到电子相册上。假设你已经将 U 盘挂载到 `/media/photo_display`。
+
+```
+find ~ \( -iname '*jpeg' -o -iname '*jpg' \) -type f -mtime -7 -print0 | xargs -0 cp -t /media/photo_display
+```
+
+这里的 `find` 命令与以前的版本略有不同。`-print0` 命令让输出有一些更改:它不使用换行符,而是添加了一个 `null` 字符。`xargs` 的 `-0`(零)选项可调整解析以达到预期效果。这很重要,不然对包含空格、引号或其他特殊字符的文件名执行操作可能无法按预期进行。对文件采取任何操作时,都应使用这些选项。
+
+`cp` 命令的 `-t` 参数很重要,因为 `cp` 通常要求目的地址在最后。你可以不使用 `xargs` 而使用 `find` 的 `-exec` 执行此操作,但是 `xargs` 的方式会更快,尤其是对于大量文件,因为它会单次调用 `cp`。
+
+### 了解更多
+
+这篇文章仅仅是 `find` 可以做的事情的表面。 `find` 支持基于权限、所有者、访问时间等的测试。它甚至可以将搜索路径中的文件与其他文件进行比较。将测试与布尔逻辑相结合,可以为你提供惊人的灵活性,以精确地找到你要查找的文件。使用内置命令或管道传递给 `xargs`,你可以快速处理大量文件。
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/command-line-quick-tips-locate-and-process-files-with-find-and-xargs/
+
+作者:[Ben Cotton][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/bcotton/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2018/10/commandlinequicktips-816x345.jpg
+[2]: https://fedoramagazine.org/?s=command+line+quick+tips
+[3]: https://opensource.com/article/18/4/how-use-find-linux
+[4]: https://unsplash.com/@wflwong?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
+[5]: https://unsplash.com/s/photos/search?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
diff --git a/published/201910/20191009 Top 10 open source video players for Linux.md b/published/201910/20191009 Top 10 open source video players for Linux.md
new file mode 100644
index 0000000000..8735a7b408
--- /dev/null
+++ b/published/201910/20191009 Top 10 open source video players for Linux.md
@@ -0,0 +1,136 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11481-1.html)
+[#]: subject: (Top 10 open source video players for Linux)
+[#]: via: (https://opensourceforu.com/2019/10/top-10-open-source-video-players-for-linux/)
+[#]: author: (Stella Aldridge https://opensourceforu.com/author/stella-aldridge/)
+
+Linux 中的十大开源视频播放器
+======
+
+![][1]
+
+> 选择合适的视频播放器有助于确保你获得最佳的观看体验,并为你提供[创建视频网站][3]的工具。你甚至可以根据个人喜好自定义正在观看的视频。
+
+因此,为了帮助你挑选适合你需求的最佳播放器,我们列出了 Linux 中的十大开源播放器。
+
+让我们来看看:
+
+### 1、XBMC – Kodi 媒体中心
+
+这是一个灵活的跨平台播放器,核心使用 C++ 编写,并提供 Python 脚本作为附加组件。使用 Kodi 的好处包括:
+
+ * 提供超过 69 种语言版本
+ * 用户可以从网络和本地存储播放音频、视频和媒体播放文件
+ * 可与 JeOS 一起作为应用套件用于智能电视和机顶盒等设备
+ * 有很多不错的附加组件,如视频和音频流插件、主题、屏幕保护程序等
+ * 它支持多种格式,如 MPEG-1、2、4、RealVideo、HVC、HEVC 等
+
+### 2、VLC 媒体播放器
+
+由于该播放器在一系列操作系统上具有令人印象深刻的功能和可用性,它出现在列表上是理所当然的。它使用 C、C++ 和 Objective C 编写,用户无需使用插件,这要归功于它对解码库的广泛支持。VLC 媒体播放器的优势包括:
+
+ * 在 Linux 上支持 DVD 播放器
+ * 能够播放 .iso 文件
+ * 能够播放高清录制的 D-VHS 磁带
+ * 可以直接从 U 盘或外部驱动器运行
+ * API 支持和浏览器支持(通过插件)
+
+### 3、Bomi(CMPlayer)
+
+这个灵活和强大的播放器被许多普通用户选择,它的优势有:
+
+ * 易于使用的图形用户界面(GUI)
+ * 令人印象深刻的播放能力
+ * 可以恢复播放
+ * 支持字幕,可以渲染多个字幕文件
+
+![][4]
+
+### 4、Miro 音乐与视频播放器
+
+以前被称为 Democracy Player(DTV),Miro 由参与文化基金会重新开发,是一个不错的跨平台音频视频播放器。令人印象深刻,因为:
+
+ * 支持一些高清音频和视频
+ * 提供超过 40 种语言版本
+ * 可以播放多种文件格式,例如,QuickTime、WMV、MPEG 文件、AVI、XVID
+ * 一旦可用,可以自动通知用户并下载视频
+
+### 5、SMPlayer
+
+这个跨平台的媒体播放器,只使用 C++ 的 Qt 库编写,它是一个强大的多功能播放器。我们喜欢它,因为:
+
+ * 有多语言选择
+ * 支持所有默认格式
+ * 支持 EDL 文件,你可以配置从互联网获取的字幕
+ * 可从互联网下载的各种皮肤
+ * 倍速播放
+
+### 6、MPV 播放器
+
+它用 C、Objective-C、Lua 和 Python 编写,免费、易于使用,并且有许多新功能,便于使用。主要加分是:
+
+ * 可以编译为一个库,公开客户端 API,从而增强控制
+ * 允许媒体编码
+ * 平滑动画
+
+### 7、Deepin Movie
+
+此播放器是开源媒体播放器的一个极好的例子,它有很多优势,包括:
+
+ * 通过键盘完成所有播放操作
+ * 各种格式的视频文件可以通过这个播放器轻松播放
+ * 流媒体功能能让用户享受许多在线视频资源
+
+### 8、Gnome 视频
+
+以前称为 Totem,这是 Gnome 桌面环境的播放器。
+
+完全用 C 编写,使用 GStreamer 多媒体框架构建,高于 2.7.1 的版本使用 xine 作为后端。它是很棒的,因为:
+
+它支持大量的格式,包括:
+
+ * SHOUTcast、SMIL、M3U、Windows 媒体播放器格式等
+ * 你可以在播放过程中调整灯光设置,如亮度和对比度
+ * 加载 SubRip 字幕
+ * 支持从互联网频道(如 Apple)直接播放视频
+
+### 9、Xine 多媒体播放器
+
+我们列表中用 C 编写的另外一个跨平台多媒体播放器。这是一个全能播放器,因为:
+
+ * 它支持物理媒体以及视频设备。3gp、MKV、 MOV、Mp4、音频格式
+ * 网络协议,V4L、DVB 和 PVR 等
+ * 它可以手动校正音频和视频流的同步
+
+### 10、ExMPlayer
+
+最后但同样重要的一个,ExMPlayer 是一个惊人的、强大的 MPlayer 的 GUI 前端。它的优点包括:
+
+ * 可以播放任何媒体格式
+ * 支持网络流和字幕
+ * 易于使用的音频转换器
+ * 高品质的音频提取,而不会影响音质
+
+上面这些视频播放器在 Linux 上工作得很好。我们建议你尝试一下,选择一个最适合你的播放器。
+
+--------------------------------------------------------------------------------
+
+via: https://opensourceforu.com/2019/10/top-10-open-source-video-players-for-linux/
+
+作者:[Stella Aldridge][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensourceforu.com/author/stella-aldridge/
+[b]: https://github.com/lujun9972
+[1]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/10/Depositphotos_50337841_l-2015.jpg?resize=696%2C585&ssl=1 (Depositphotos_50337841_l-2015)
+[2]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/10/Depositphotos_50337841_l-2015.jpg?fit=900%2C756&ssl=1
+[3]: https://www.ning.com/create-video-website/
+[4]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/10/Depositphotos_20380441_l-2015.jpg?resize=350%2C231&ssl=1
+[5]: https://i2.wp.com/opensourceforu.com/wp-content/uploads/2019/10/Depositphotos_20380441_l-2015.jpg?ssl=1
diff --git a/published/201910/20191010 DevSecOps pipelines and tools- What you need to know.md b/published/201910/20191010 DevSecOps pipelines and tools- What you need to know.md
new file mode 100644
index 0000000000..11ef11bb61
--- /dev/null
+++ b/published/201910/20191010 DevSecOps pipelines and tools- What you need to know.md
@@ -0,0 +1,71 @@
+[#]: collector: (lujun9972)
+[#]: translator: (lnrCoder)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11492-1.html)
+[#]: subject: (DevSecOps pipelines and tools: What you need to know)
+[#]: via: (https://opensource.com/article/19/10/devsecops-pipeline-and-tools)
+[#]: author: (Sagar Nangare https://opensource.com/users/sagarnangare)
+
+你需要知道的 DevSecOps 流程及工具
+======
+
+> DevSecOps 对 DevOps 进行了改进,以确保安全性仍然是该过程的一个重要部分。
+
+
+
+到目前为止,DevOps 在 IT 世界中已广为人知,但其并非完美无缺。试想一下,你在一个项目的现代应用程序交付中实施了所有 DevOps 工程实践。你已经到达开发流程的末尾,但是渗透测试团队(内部或外部)检测到安全漏洞并提出了报告。现在,你必须重新启动所有流程,并要求开发人员修复该漏洞。
+
+在基于 DevOps 的软件开发生命周期(SDLC)系统中,这并不繁琐,但它确实会浪费时间并影响交付进度。如果从 SDLC 初期就已经集成了安全性,那么你可能已经跟踪到了该故障,并在开发流程中就消除了它。但是,如上述情形那样,将安全性推到开发流程的最后将导致更长的开发生命周期。
+
+这就是引入 DevSecOps 的原因,它以自动化的方式巩固了整个软件交付周期。
+
+在现代 DevOps 方法中,组织广泛使用容器托管应用程序,我们看到 [Kubernetes][2] 和 [Istio][3] 使用的较多。但是,这些工具都有其自身的漏洞。例如,云原生计算基金会(CNCF)最近完成了一项 [kubernetes 安全审计][4],发现了几个问题。DevOps 开发流程中使用的所有工具在流程运行时都需要进行安全检查,DevSecOps 会推动管理员去监视工具的存储库以获取升级和补丁。
+
+### 什么是 DevSecOps?
+
+与 DevOps 一样,DevSecOps 是开发人员和 IT 运营团队在开发和部署软件应用程序时所遵循的一种思维方式或文化。它将主动和自动化的安全审计以及渗透测试集成到敏捷应用程序开发中。
+
+要使用 [DevSecOps][5],你需要:
+
+ * 从 SDLC 开始就引入安全性概念,以最大程度地减少软件代码中的漏洞。
+ * 确保每个人(包括开发人员和 IT 运营团队)共同承担在其任务中遵循安全实践的责任。
+ * 在 DevOps 工作流程开始时集成安全控件、工具和流程。这些将在软件交付的每个阶段启用自动安全检查。
+
+DevOps 一直致力于在开发和发布过程中包括安全性以及质量保证(QA)、数据库管理和其他所有方面。然而,DevSecOps 是该过程的一个演进,以确保安全永远不会被遗忘,成为该过程的一个重要部分。
+
+### 了解 DevSecOps 流程
+
+典型的 DevOps 流程有不同的阶段;典型的 SDLC 流程包括计划、编码、构建、测试、发布和部署等阶段。在 DevSecOps 中,每个阶段都会应用特定的安全检查。
+
+ * **计划**:执行安全性分析并创建测试计划,以确定在何处、如何以及何时进行测试的方案。
+ * **编码**:部署整理工具和 Git 控件以保护密码和 API 密钥。
+ * **构建**:在构建执行代码时,请结合使用静态应用程序安全测试(SAST)工具来跟踪代码中的缺陷,然后再部署到生产环境中。这些工具针对特定的编程语言。
+ * **测试**:在运行时使用动态应用程序安全测试(DAST)工具来测试您的应用程序。 这些工具可以检测与用户身份验证,授权,SQL 注入以及与 API 相关的端点相关的错误。
+ * **发布**:在发布应用程序之前,请使用安全分析工具来进行全面的渗透测试和漏洞扫描。
+ * **部署**:在运行时完成上述测试后,将安全的版本发送到生产中以进行最终部署。
+
+### DevSecOps 工具
+
+SDLC 的每个阶段都有可用的工具。有些是商业产品,但大多数是开源的。在我的下一篇文章中,我将更多地讨论在流程的不同阶段使用的工具。
+
+随着基于现代 IT 基础设施的企业安全威胁的复杂性增加,DevSecOps 将发挥更加关键的作用。然而,DevSecOps 流程将需要随着时间的推移而改进,而不是仅仅依靠同时实施所有安全更改即可。这将消除回溯或应用交付失败的可能性。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/10/devsecops-pipeline-and-tools
+
+作者:[Sagar Nangare][a]
+选题:[lujun9972][b]
+译者:[lnrCoder](https://github.com/lnrCoder)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/sagarnangare
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LAW-Internet_construction_9401467_520x292_0512_dc.png?itok=RPkPPtDe (An intersection of pipes.)
+[2]: https://opensource.com/resources/what-is-kubernetes
+[3]: https://opensource.com/article/18/9/what-istio
+[4]: https://www.cncf.io/blog/2019/08/06/open-sourcing-the-kubernetes-security-audit/
+[5]: https://resources.whitesourcesoftware.com/blog-whitesource/devsecops
diff --git a/published/201910/20191010 Viewing files and processes as trees on Linux.md b/published/201910/20191010 Viewing files and processes as trees on Linux.md
new file mode 100644
index 0000000000..f8d1fb7183
--- /dev/null
+++ b/published/201910/20191010 Viewing files and processes as trees on Linux.md
@@ -0,0 +1,242 @@
+[#]: collector: (lujun9972)
+[#]: translator: (laingke)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11462-1.html)
+[#]: subject: (Viewing files and processes as trees on Linux)
+[#]: via: (https://www.networkworld.com/article/3444589/viewing-files-and-processes-as-trees-on-linux.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+在 Linux 上以树状查看文件和进程
+======
+
+> 介绍三个 Linux 命令:ps、pstree 和 tree 以类似树的格式查看文件和进程。
+
+
+
+[Linux][3] 提供了一些方便的命令,用于以树状分支形式查看文件和进程,从而易于查看它们之间的关系。在本文中,我们将介绍 `ps`、`pstree` 和 `tree` 命令以及它们提供的一些选项,这些选项可帮助你将注意力集中在要查看的内容上。
+
+### ps
+
+我们用来列出进程的 `ps` 命令有一些有趣的选项,但是很多人从来没有利用过。虽然常用的 `ps -ef` 提供了正在运行的进程的完整列表,但是 `ps -ejH` 命令增加了一个不错的效果。它缩进了相关的进程以使这些进程之间的关系在视觉上更加清晰——就像这个片段:
+
+```
+$ ps -ejH
+ PID PGID SID TTY TIME CMD
+...
+ 1396 1396 1396 ? 00:00:00 sshd
+28281 28281 28281 ? 00:00:00 sshd
+28409 28281 28281 ? 00:00:00 sshd
+28410 28410 28410 pts/0 00:00:00 bash
+30968 30968 28410 pts/0 00:00:00 ps
+```
+
+可以看到,正在运行的 `ps` 进程是在 `bash` 中运行的,而 `bash` 是在 ssh 会话中运行的。
+
+`-exjf` 选项字符串提供了类似的视图,但是带有一些其它细节和符号以突出显示进程的层次结构性质:
+
+```
+$ ps -exjf
+PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
+...
+ 1 1396 1396 1396 ? -1 Ss 0 0:00 /usr/sbin/sshd -D
+ 1396 28281 28281 28281 ? -1 Ss 0 0:00 \_ sshd: shs [priv]
+28281 28409 28281 28281 ? -1 S 1000 0:00 \_ sshd: shs@pts/0
+28409 28410 28410 28410 pts/0 31028 Ss 1000 0:00 \_ -bash
+28410 31028 31028 28410 pts/0 31028 R+ 1000 0:00 \_ ps axjf
+```
+
+命令中使用的这些选项表示:
+
+```
+-e 选择所有进程
+-j 使用工作格式
+-f 提供完整格式列表
+-H 分层显示进程(如,树状格式)
+-x 取消“必须与 tty 相关联”的限制
+```
+
+同时,该命令也有一个 `--forest` 选项提供了类似的视图。
+
+```
+$ ps -ef --forest
+UID PID PPID C STIME TTY TIME CMD
+...
+root 1396 1 0 Oct08 ? 00:00:00 /usr/sbin/sshd -D
+root 28281 1396 0 12:55 ? 00:00:00 \_ sshd: shs [priv]
+shs 28409 28281 0 12:56 ? 00:00:00 \_ sshd: shs@pts/0
+shs 28410 28409 0 12:56 pts/0 00:00:00 \_ -bash
+shs 32351 28410 0 14:39 pts/0 00:00:00 \_ ps -ef --forest
+```
+
+注意,这些示例只是这些命令如何使用的示例。你可以选择最适合你的进程视图的任何选项组合。
+
+### pstree
+
+使用 `pstree` 命令可以获得类似的进程视图。尽管 `pstree` 具备了许多选项,但是该命令本身就提供了非常有用的显示。注意,许多父子进程关系显示在单行而不是后续行上。
+
+```
+$ pstree
+...
+ ├─sshd───sshd───sshd───bash───pstree
+ ├─systemd─┬─(sd-pam)
+ │ ├─at-spi-bus-laun─┬─dbus-daemon
+ │ │ └─3*[{at-spi-bus-laun}]
+ │ ├─at-spi2-registr───2*[{at-spi2-registr}]
+ │ ├─dbus-daemon
+ │ ├─ibus-portal───2*[{ibus-portal}]
+ │ ├─pulseaudio───2*[{pulseaudio}]
+ │ └─xdg-permission-───2*[{xdg-permission-}]
+```
+
+通过 `-n` 选项,`pstree` 以数值(按进程 ID)顺序显示进程:
+
+```
+$ pstree -n
+systemd─┬─systemd-journal
+ ├─systemd-udevd
+ ├─systemd-timesyn───{systemd-timesyn}
+ ├─systemd-resolve
+ ├─systemd-logind
+ ├─dbus-daemon
+ ├─atopacctd
+ ├─irqbalance───{irqbalance}
+ ├─accounts-daemon───2*[{accounts-daemon}]
+ ├─acpid
+ ├─rsyslogd───3*[{rsyslogd}]
+ ├─freshclam
+ ├─udisksd───4*[{udisksd}]
+ ├─networkd-dispat
+ ├─ModemManager───2*[{ModemManager}]
+ ├─snapd───10*[{snapd}]
+ ├─avahi-daemon───avahi-daemon
+ ├─NetworkManager───2*[{NetworkManager}]
+ ├─wpa_supplicant
+ ├─cron
+ ├─atd
+ ├─polkitd───2*[{polkitd}]
+ ├─colord───2*[{colord}]
+ ├─unattended-upgr───{unattended-upgr}
+ ├─sshd───sshd───sshd───bash───pstree
+```
+
+使用 `pstree` 时可以考虑的一些选项包括 `-a`(包括命令行参数)和 `-g`(包括进程组)。
+
+以下是一些简单的示例(片段)。
+
+命令 `pstree -a` 的输出内容:
+
+```
+└─wpa_supplicant -u -s -O /run/wpa_supplicant
+```
+
+命令 `pstree -g` 的输出内容:
+
+```
+├─sshd(1396)───sshd(28281)───sshd(28281)───bash(28410)───pstree(1115)
+```
+
+### tree
+
+虽然 `tree` 命令听起来与 `pstree` 非常相似,但这是用于查看文件而非进程的命令。它提供了一个漂亮的树状目录和文件视图。
+
+如果你使用 `tree` 命令查看 `/proc` 目录,你显示的开头部分将类似于这个:
+
+```
+$ tree /proc
+/proc
+├── 1
+│ ├── attr
+│ │ ├── apparmor
+│ │ │ ├── current
+│ │ │ ├── exec
+│ │ │ └── prev
+│ │ ├── current
+│ │ ├── display
+│ │ ├── exec
+│ │ ├── fscreate
+│ │ ├── keycreate
+│ │ ├── prev
+│ │ ├── smack
+│ │ │ └── current
+│ │ └── sockcreate
+│ ├── autogroup
+│ ├── auxv
+│ ├── cgroup
+│ ├── clear_refs
+│ ├── cmdline
+...
+```
+
+如果以 root 权限运行这条命令(`sudo tree /proc`),你将会看到更多详细信息,因为 `/proc` 目录的许多内容对于普通用户而言是无法访问的。
+
+命令 `tree -d` 将会限制仅显示目录。
+
+```
+$ tree -d /proc
+/proc
+├── 1
+│ ├── attr
+│ │ ├── apparmor
+│ │ └── smack
+│ ├── fd [error opening dir]
+│ ├── fdinfo [error opening dir]
+│ ├── map_files [error opening dir]
+│ ├── net
+│ │ ├── dev_snmp6
+│ │ ├── netfilter
+│ │ └── stat
+│ ├── ns [error opening dir]
+│ └── task
+│ └── 1
+│ ├── attr
+│ │ ├── apparmor
+│ │ └── smack
+...
+```
+
+使用 `-f` 选项,`tree` 命令会显示完整的路径。
+
+```
+$ tree -f /proc
+/proc
+├── /proc/1
+│ ├── /proc/1/attr
+│ │ ├── /proc/1/attr/apparmor
+│ │ │ ├── /proc/1/attr/apparmor/current
+│ │ │ ├── /proc/1/attr/apparmor/exec
+│ │ │ └── /proc/1/attr/apparmor/prev
+│ │ ├── /proc/1/attr/current
+│ │ ├── /proc/1/attr/display
+│ │ ├── /proc/1/attr/exec
+│ │ ├── /proc/1/attr/fscreate
+│ │ ├── /proc/1/attr/keycreate
+│ │ ├── /proc/1/attr/prev
+│ │ ├── /proc/1/attr/smack
+│ │ │ └── /proc/1/attr/smack/current
+│ │ └── /proc/1/attr/sockcreate
+...
+```
+
+分层显示通常可以使进程和文件之间的关系更容易理解。可用选项的数量很多,而你总可以找到一些视图,帮助你查看所需的内容。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3444589/viewing-files-and-processes-as-trees-on-linux.html
+
+作者:[Sandra Henry-Stocker][a]
+选题:[lujun9972][b]
+译者:[laingke](https://github.com/laingke)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
+[b]: https://github.com/lujun9972
+[1]: https://www.flickr.com/photos/cricketsblog/46967168105/in/photolist-2eyk1Lr-KQsMHg-JbWG41-FWu8FU-6daUYv-cxH2Aq-DV2CNk-25eF8V1-GEEwLx-S9a29U-GpiYf2-Yi5dnF-YLPMV3-23ThoAZ-dTyphv-DVXTMY-ERmSjL-6z86DE-QVnnyv-7PLo9u-58CYnd-dYmbPX-63nVid-p7Ea54-238LQaD-Qb6CkZ-QoRhQX-suMNcq-22JeozK-BwMvBg-26AQHz1-PhQT4J-AGyhXA-2fhixB3-qngdKE-UiptQQ-ZzpiHa-pH4g9e-28CoU2s-81gNxg-qnoewg-2cmYaRk-d3FRuo-4fJrSL-23NqveR-LLEYMU-FZixFK-5aBDGU-PBQbWq-dJoaKi
+[2]: https://creativecommons.org/licenses/by/2.0/legalcode
+[3]: https://www.networkworld.com/article/3215226/what-is-linux-uses-featres-products-operating-systems.html
+[4]: https://www.networkworld.com/article/3440100/take-the-intelligent-route-with-consumption-based-storage.html?utm_source=IDG&utm_medium=promotions&utm_campaign=HPE20773&utm_content=sidebar ( Take the Intelligent Route with Consumption-Based Storage)
+[5]: https://www.networkworld.com/slideshow/153439/linux-best-desktop-distros-for-newbies.html#tk.nww-infsb
+[6]: https://www.facebook.com/NetworkWorld/
+[7]: https://www.linkedin.com/company/network-world
diff --git a/published/201910/20191011 How to Unzip a Zip File in Linux -Beginner-s Tutorial.md b/published/201910/20191011 How to Unzip a Zip File in Linux -Beginner-s Tutorial.md
new file mode 100644
index 0000000000..a40d412a74
--- /dev/null
+++ b/published/201910/20191011 How to Unzip a Zip File in Linux -Beginner-s Tutorial.md
@@ -0,0 +1,124 @@
+[#]: collector: (lujun9972)
+[#]: translator: (singledo)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11470-1.html)
+[#]: subject: (How to Unzip a Zip File in Linux [Beginner’s Tutorial])
+[#]: via: (https://itsfoss.com/unzip-linux/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+新手教程:如何在 Linux 下解压 Zip 文件
+======
+
+> 本文将会向你展示如何在 Ubuntu 和其他 Linux 发行版本上解压文件。终端和图形界面的方法都会讨论。
+
+[Zip][1] 是一种创建压缩存档文件的最普通、最流行的方法。它也是一种古老的文件归档文件格式,这种格式创建于 1989 年。由于它的广泛使用,你会经常遇见 zip 文件。
+
+在更早的一份教程里,我介绍了[如何在 Linux 上用 zip 压缩一个文件夹][2]。在这篇面向初学者的快速教程中,我会介绍如何在 Linux 上解压文件。
+
+先决条件:检查你是否安装了 `unzip`。
+
+为了解压 zip 归档文件,你必须在你的系统上安装了 unzip 软件包。大多数现代的的 Linux 发行版本提供了解压 zip 文件的支持,但是对这些 zip 文件进行校验以避免以后出现损坏总是没有坏处的。
+
+在基于 [Unbutu][3] 和 [Debian][4] 的发行版上,你能够使用下面的命令来安装 `unzip`。如果你已经安装了,你会被告知已经被安装。
+
+```
+sudo apt install unzip
+```
+
+一旦你能够确认你的系统中安装了 `unzip`,你就可以通过 `unzip` 来解压 zip 归档文件。
+
+你也能够使用命令行或者图形工具来达到目的,我会向你展示两种方法:
+
+### 使用命令行解压文件
+
+在 Linux 下使用 `unzip` 命令是非常简单的。在你放 zip 文件的目录,用下面的命令:
+
+```
+unzip zipped_file.zip
+```
+
+你可以给 zip 文件提供解压路径而不是解压到当前所在路径。你会在终端输出中看到提取的文件:
+
+```
+unzip metallic-container.zip -d my_zip
+Archive: metallic-container.zip
+ inflating: my_zip/625993-PNZP34-678.jpg
+ inflating: my_zip/License free.txt
+ inflating: my_zip/License premium.txt
+```
+
+上面的命令有一个小问题。它会提取 zip 文件中所有的内容到现在的文件夹。你会在当前文件夹下留下一堆没有组织的文件,这不是一件很好的事情。
+
+#### 解压到文件夹下
+
+在 Linux 命令行下,对于把文件解压到一个文件夹下是一个好的做法。这种方式下,所有的提取文件都会被存储到你所指定的文件夹下。如果文件夹不存在,会创建该文件夹。
+
+```
+unzip zipped_file.zip -d unzipped_directory
+```
+
+现在 `zipped_file.zip` 中所有的内容都会被提取到 `unzipped_directory` 中。
+
+由于我们在讨论好的做法,这里有另一个注意点,我们可以查看压缩文件中的内容而不用实际解压。
+
+#### 查看压缩文件中的内容而不解压压缩文件
+
+```
+unzip -l zipped_file.zip
+```
+
+下面是该命令的输出:
+
+```
+unzip -l metallic-container.zip
+Archive: metallic-container.zip
+ Length Date Time Name
+--------- ---------- ----- ----
+ 6576010 2019-03-07 10:30 625993-PNZP34-678.jpg
+ 1462 2019-03-07 13:39 License free.txt
+ 1116 2019-03-07 13:39 License premium.txt
+--------- -------
+ 6578588 3 files
+```
+
+在 Linux 下,还有些 `unzip` 的其它用法,但我想你现在已经对在 Linux 下使用解压文件有了足够的了解。
+
+### 使用图形界面来解压文件
+
+如果你使用桌面版 Linux,那你就不必总是使用终端。在图形化的界面下,我们又要如何解压文件呢? 我使用的是 [GNOME 桌面][7],不过其它桌面版 Linux 发行版也大致相同。
+
+打开文件管理器,然后跳转到 zip 文件所在的文件夹下。在文件上点击鼠标右键,你会在弹出的窗口中看到 “提取到这里”,选择它。
+
+![Unzip File in Ubuntu][8]
+
+与 `unzip` 命令不同,这个提取选项会创建一个和压缩文件名相同的文件夹(LCTT 译注:文件夹没有 `.zip` 扩展名),并且把压缩文件中的所有内容存储到创建的文件夹下。相对于 `unzip` 命令的默认行为是将压缩文件提取到当前所在的文件下,图形界面的解压对于我来说是一件非常好的事情。
+
+这里还有一个选项“提取到……”,你可以选择特定的文件夹来存储提取的文件。
+
+你现在知道如何在 Linux 解压文件了。你也许还对学习[在 Linux 下使用 7zip][9] 感兴趣?
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/unzip-linux/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[octopus](https://github.com/singledo)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Zip_(file_format)
+[2]: https://itsfoss.com/linux-zip-folder/
+[3]: https://ubuntu.com/
+[4]: https://www.debian.org/
+[5]: tmp.eqEocGssC8#terminal
+[6]: tmp.eqEocGssC8#gui
+[7]: https://gnome.org/
+[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/unzip-files-ubuntu.jpg?ssl=1
+[9]: https://itsfoss.com/use-7zip-ubuntu-linux/
+
+
diff --git a/published/201910/20191011 How to use IoT devices to keep children safe.md b/published/201910/20191011 How to use IoT devices to keep children safe.md
new file mode 100644
index 0000000000..bf05a950f1
--- /dev/null
+++ b/published/201910/20191011 How to use IoT devices to keep children safe.md
@@ -0,0 +1,68 @@
+[#]: collector: (lujun9972)
+[#]: translator: (Morisun029)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11506-1.html)
+[#]: subject: (How to use IoT devices to keep children safe?)
+[#]: via: (https://opensourceforu.com/2019/10/how-to-use-iot-devices-to-keep-children-safe/)
+[#]: author: (Andrew Carroll https://opensourceforu.com/author/andrew-carroll/)
+
+如何使用物联网设备来确保儿童安全?
+======
+
+![][1]
+
+IoT (物联网)设备正在迅速改变我们的生活。这些设备无处不在,从我们的家庭到其它行业。根据一些预测数据,到 2020 年,将会有 100 亿个 IoT 设备。到 2025 年,该数量将增长到 220 亿。目前,物联网已经在很多领域得到了应用,包括智能家居、工业生产过程、农业甚至医疗保健领域。伴随着如此广泛的应用,物联网显然已经成为近年来的热门话题之一。
+
+多种因素促成了物联网设备在多个学科的爆炸式增长。这其中包括低成本处理器和无线连接的的可用性,以及开源平台的信息交流推动了物联网领域的创新。与传统的应用程序开发相比,物联网设备的开发成指数级增长,因为它的资源是开源的。
+
+在解释如何使用物联网设备来保护儿童之前,必须对物联网技术有基本的了解。
+
+### IoT 设备是什么?
+
+IoT 设备是指那些在没有人类参与的情况下彼此之间可以通信的设备。因此,许多专家并不将智能手机和计算机视为物联网设备。此外,物联网设备必须能够收集数据并且能将收集到的数据传送到其他设备或云端进行处理。
+
+然而,在某些领域中,我们需要探索物联网的潜力。儿童往往是脆弱的,他们很容易成为犯罪分子和其他蓄意伤害者的目标。无论在物理世界还是数字世界中,儿童都很容易面临犯罪的威胁。因为父母不能始终亲自到场保护孩子;这就是为什么需要监视工具了。
+
+除了适用于儿童的可穿戴设备外,还有许多父母监视应用程序,例如 Xnspy,可实时监控儿童并提供信息的实时更新。这些工具可确保儿童安全。可穿戴设备确保儿童身体上的安全性,而家长监控应用可确保儿童的上网安全。
+
+由于越来越多的孩子花费时间在智能手机上,毫无意外地,他们也就成为诈骗分子的主要目标。此外,由于恋童癖、网络自夸和其他犯罪在网络上的盛行,儿童也有可能成为网络欺凌的目标。
+
+这些解决方案够吗?我们需要找到物联网解决方案,以确保孩子们在网上和线下的安全。在当代,我们如何确保孩子的安全?我们需要提出创新的解决方案。 物联网可以帮助保护孩子在学校和家里的安全。
+
+### 物联网的潜力
+
+物联网设备提供的好处很多。举例来说,父母可以远程监控自己的孩子,而又不会显得太霸道。因此,儿童在拥有安全环境的同时也会有空间和自由让自己变得独立。
+
+而且,父母也不必在为孩子的安全而担忧。物联网设备可以提供 7x24 小时的信息更新。像 Xnspy 之类的监视应用程序在提供有关孩子的智能手机活动信息方面更进了一步。随着物联网设备变得越来越复杂,拥有更长使用寿命的电池只是一个时间问题。诸如位置跟踪器之类的物联网设备可以提供有关孩子下落的准确详细信息,所以父母不必担心。
+
+虽然可穿戴设备已经非常好了,但在确保儿童安全方面,这些通常还远远不够。因此,要为儿童提供安全的环境,我们还需要其他方法。许多事件表明,儿童在学校比其他任何公共场所都容易受到攻击。因此,学校需要采取安全措施,以确保儿童和教师的安全。在这一点上,物联网设备可用于检测潜在威胁并采取必要的措施来防止攻击。威胁检测系统包括摄像头。系统一旦检测到威胁,便可以通知当局,如一些执法机构和医院。智能锁等设备可用于封锁学校(包括教室),来保护儿童。除此之外,还可以告知父母其孩子的安全,并立即收到有关威胁的警报。这将需要实施无线技术,例如 Wi-Fi 和传感器。因此,学校需要制定专门用于提供教室安全性的预算。
+
+智能家居实现拍手关灯,也可以让你的家庭助手帮你关灯。同样,物联网设备也可用在屋内来保护儿童。在家里,物联网设备(例如摄像头)为父母在照顾孩子时提供 100% 的可见性。当父母不在家里时,可以使用摄像头和其他传感器检测是否发生了可疑活动。其他设备(例如连接到这些传感器的智能锁)可以锁门和窗,以确保孩子们的安全。
+
+同样,可以引入许多物联网解决方案来确保孩子的安全。
+
+### 有多好就有多坏
+
+物联网设备中的传感器会创建大量数据。数据的安全性是至关重要的一个因素。收集的有关孩子的数据如果落入不法分子手中会存在危险。因此,需要采取预防措施。IoT 设备中泄露的任何数据都可用于确定行为模式。因此,必须对提供不违反用户隐私的安全物联网解决方案投入资金。
+
+IoT 设备通常连接到 Wi-Fi,用于设备之间传输数据。未加密数据的不安全网络会带来某些风险。这样的网络很容易被窃听。黑客可以使用此类网点来入侵系统。他们还可以将恶意软件引入系统,从而使系统变得脆弱、易受攻击。此外,对设备和公共网络(例如学校的网络)的网络攻击可能导致数据泄露和私有数据盗用。 因此,在实施用于保护儿童的物联网解决方案时,保护网络和物联网设备的总体计划必须生效。
+
+物联网设备保护儿童在学校和家里的安全的潜力尚未发现有什么创新。我们需要付出更多努力来保护连接 IoT 设备的网络安全。此外,物联网设备生成的数据可能落入不法分子手中,从而造成更多麻烦。因此,这是物联网安全至关重要的一个领域。
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensourceforu.com/2019/10/how-to-use-iot-devices-to-keep-children-safe/
+
+作者:[Andrew Carroll][a]
+选题:[lujun9972][b]
+译者:[Morisun029](https://github.com/Morisun029)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensourceforu.com/author/andrew-carroll/
+[b]: https://github.com/lujun9972
+[1]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/10/Visual-Internet-of-things_EB-May18.jpg?resize=696%2C507&ssl=1 (Visual Internet of things_EB May18)
+[2]: https://i0.wp.com/opensourceforu.com/wp-content/uploads/2019/10/Visual-Internet-of-things_EB-May18.jpg?fit=900%2C656&ssl=1
diff --git a/published/201910/20191013 Object-Oriented Programming and Essential State.md b/published/201910/20191013 Object-Oriented Programming and Essential State.md
new file mode 100644
index 0000000000..2847253e32
--- /dev/null
+++ b/published/201910/20191013 Object-Oriented Programming and Essential State.md
@@ -0,0 +1,98 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11519-1.html)
+[#]: subject: (Object-Oriented Programming and Essential State)
+[#]: via: (https://theartofmachinery.com/2019/10/13/oop_and_essential_state.html)
+[#]: author: (Simon Arneaud https://theartofmachinery.com)
+
+面向对象编程和根本状态
+======
+
+
+
+早在 2015 年,Brian Will 撰写了一篇有挑衅性的博客:[面向对象编程:一个灾难故事][1]。他随后发布了一个名为[面向对象编程很糟糕][2]的视频,该视频更加详细。我建议你花些时间观看视频,下面是我的一段总结:
+
+> OOP 的柏拉图式理想是一堆相互解耦的对象,它们彼此之间发送无状态消息。没有人真的像这样制作软件,Brian 指出这甚至没有意义:对象需要知道向哪个对象发送消息,这意味着它们需要相互引用。该视频大部分讲述的是这样一个痛点:人们试图将对象耦合以实现控制流,同时假装它们是通过设计解耦的。
+
+总的来说,他的想法与我自己的 OOP 经验产生了共鸣:对象没有问题,但是我一直不满意的是*面向*对象建模程序控制流,并且试图使代码“正确地”面向对象似乎总是在创建不必要的复杂性。
+
+有一件事我认为他无法完全解释。他直截了当地说“封装没有作用”,但在脚注后面加上“在细粒度的代码级别”,并继续承认对象有时可以奏效,并且在库和文件级别封装是可以的。但是他没有确切解释为什么有时会奏效,有时却没有奏效,以及如何和在何处划清界限。有人可能会说这使他的 “OOP 不好”的说法有缺陷,但是我认为他的观点是正确的,并且可以在根本状态和偶发状态之间划清界限。
+
+如果你以前从未听说过“根本”和“偶发”这两个术语的使用,那么你应该阅读 Fred Brooks 的经典文章《[没有银弹][3]》。(顺便说一句,他写了许多很棒的有关构建软件系统的文章。)我以前曾写过[关于根本和偶发的复杂性的文章][4],这里有一个简短的摘要:软件是复杂的。部分原因是因为我们希望软件能够解决混乱的现实世界问题,因此我们将其称为“根本复杂性”。“偶发复杂性”是所有其它的复杂性,因为我们正尝试使用硅和金属来解决与硅和金属无关的问题。例如,对于大多数程序而言,用于内存管理或在内存与磁盘之间传输数据或解析文本格式的代码都是“偶发的复杂性”。
+
+假设你正在构建一个支持多个频道的聊天应用。消息可以随时到达任何频道。有些频道特别有趣,当有新消息传入时,用户希望得到通知。而其他频道静音:消息被存储,但用户不会受到打扰。你需要跟踪每个频道的用户首选设置。
+
+一种实现方法是在频道和频道设置之间使用映射(也称为哈希表、字典或关联数组)。注意,映射是 Brian Will 所说的可以用作对象的抽象数据类型(ADT)。
+
+如果我们有一个调试器并查看内存中的映射对象,我们将看到什么?我们当然会找到频道 ID 和频道设置数据(或至少指向它们的指针)。但是我们还会找到其它数据。如果该映射是使用红黑树实现的,我们将看到带有红/黑标签和指向其他节点的指针的树节点对象。与频道相关的数据是根本状态,而树节点是偶发状态。不过,请注意以下几点:该映射有效地封装了它的偶发状态 —— 你可以用 AVL 树实现的另一个映射替换该映射,并且你的聊天程序仍然可以使用。另一方面,映射没有封装根本状态(仅使用 `get()` 和 `set()` 方法访问数据并不是封装)。事实上,映射与根本状态是尽可能不可知的,你可以使用基本相同的映射数据结构来存储与频道或通知无关的其他映射。
+
+这就是映射 ADT 如此成功的原因:它封装了偶发状态,并与根本状态解耦。如果你思考一下,Brian 用封装描述的问题就是尝试封装根本状态。其他描述的好处是封装偶发状态的好处。
+
+要使整个软件系统都达到这一理想状况相当困难,但扩展开来,我认为它看起来像这样:
+
+* 没有全局的可变状态
+* 封装了偶发状态(在对象或模块或以其他任何形式)
+* 无状态偶发复杂性封装在单独函数中,与数据解耦
+* 使用诸如依赖注入之类的技巧使输入和输出变得明确
+* 组件可由易于识别的位置完全拥有和控制
+
+其中有些违反了我很久以来的直觉。例如,如果你有一个数据库查询函数,如果数据库连接处理隐藏在该函数内部,并且唯一的参数是查询参数,那么接口会看起来会更简单。但是,当你使用这样的函数构建软件系统时,协调数据库的使用实际上变得更加复杂。组件不仅以自己的方式做事,而且还试图将自己所做的事情隐藏为“实现细节”。数据库查询需要数据库连接这一事实从来都不是实现细节。如果无法隐藏某些内容,那么显露它是更合理的。
+
+我对将面向对象编程和函数式编程放在对立的两极非常警惕,但我认为从函数式编程进入面向对象编程的另一极端是很有趣的:OOP 试图封装事物,包括无法封装的根本复杂性,而纯函数式编程往往会使事情变得明确,包括一些偶发复杂性。在大多数时候,这没什么问题,但有时候(比如[在纯函数式语言中构建自我指称的数据结构][5])设计更多的是为了函数编程,而不是为了简便(这就是为什么 [Haskell 包含了一些“逃生出口”][6])。我之前写过一篇[所谓“弱纯性”的中间立场][7]。
+
+Brian 发现封装对更大规模有效,原因有几个。一个是,由于大小的原因,较大的组件更可能包含偶发状态。另一个是“偶发”与你要解决的问题有关。从聊天程序用户的角度来看,“偶发的复杂性”是与消息、频道和用户等无关的任何事物。但是,当你将问题分解为子问题时,更多的事情就变得“根本”。例如,在解决“构建聊天应用”问题时,可以说频道名称和频道 ID 之间的映射是偶发的复杂性,而在解决“实现 `getChannelIdByName()` 函数”子问题时,这是根本复杂性。因此,封装对于子组件的作用比对父组件的作用要小。
+
+顺便说一句,在视频的结尾,Brian Will 想知道是否有任何语言支持*无法*访问它们所作用的范围的匿名函数。[D][8] 语言可以。 D 中的匿名 Lambda 通常是闭包,但是如果你想要的话,也可以声明匿名无状态函数:
+
+```
+import std.stdio;
+
+void main()
+{
+ int x = 41;
+
+ // Value from immediately executed lambda
+ auto v1 = () {
+ return x + 1;
+ }();
+ writeln(v1);
+
+ // Same thing
+ auto v2 = delegate() {
+ return x + 1;
+ }();
+ writeln(v2);
+
+ // Plain functions aren't closures
+ auto v3 = function() {
+ // Can't access x
+ // Can't access any mutable global state either if also marked pure
+ return 42;
+ }();
+ writeln(v3);
+}
+```
+
+--------------------------------------------------------------------------------
+
+via: https://theartofmachinery.com/2019/10/13/oop_and_essential_state.html
+
+作者:[Simon Arneaud][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://theartofmachinery.com
+[b]: https://github.com/lujun9972
+[1]: https://medium.com/@brianwill/object-oriented-programming-a-personal-disaster-1b044c2383ab
+[2]: https://www.youtube.com/watch?v=QM1iUe6IofM
+[3]: http://www.cs.nott.ac.uk/~pszcah/G51ISS/Documents/NoSilverBullet.html
+[4]: https://theartofmachinery.com/2017/06/25/compression_complexity_and_software.html
+[5]: https://wiki.haskell.org/Tying_the_Knot
+[6]: https://en.wikibooks.org/wiki/Haskell/Mutable_objects#The_ST_monad
+[7]: https://theartofmachinery.com/2016/03/28/dirtying_pure_functions_can_be_useful.html
+[8]: https://dlang.org
diff --git a/published/201910/20191014 Use sshuttle to build a poor man-s VPN.md b/published/201910/20191014 Use sshuttle to build a poor man-s VPN.md
new file mode 100644
index 0000000000..a5395a5405
--- /dev/null
+++ b/published/201910/20191014 Use sshuttle to build a poor man-s VPN.md
@@ -0,0 +1,79 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11476-1.html)
+[#]: subject: (Use sshuttle to build a poor man’s VPN)
+[#]: via: (https://fedoramagazine.org/use-sshuttle-to-build-a-poor-mans-vpn/)
+[#]: author: (Paul W. Frields https://fedoramagazine.org/author/pfrields/)
+
+使用 shuttle 构建一个穷人的虚拟专网
+======
+
+![][1]
+
+如今,企业网络经常使用“虚拟专用网络”[来保证员工通信安全][2]。但是,使用的协议有时会降低性能。如果你可以使用 SSH 连接远程主机,那么你可以设置端口转发。但这可能会很痛苦,尤其是在你需要与该网络上的许多主机一起使用的情况下。试试 `sshuttle`,它可以通过 SSH 访问来设置快速简易的虚拟专网。请继续阅读以获取有关如何使用它的更多信息。
+
+`sshuttle` 正是针对上述情况而设计的。远程端的唯一要求是主机必须有可用的 Python。这是因为 `sshuttle` 会构造并运行一些 Python 代码来帮助传输数据。
+
+### 安装 sshuttle
+
+`sshuttle` 被打包在官方仓库中,因此很容易安装。打开一个终端,并[使用 sudo][3] 来运行以下命令:
+
+```
+$ sudo dnf install sshuttle
+```
+
+安装后,你可以在手机页中找到相关信息:
+
+```
+$ man sshuttle
+```
+
+### 设置虚拟专网
+
+最简单的情况就是将所有流量转发到远程网络。这不一定是一个疯狂的想法,尤其是如果你不在自己家里这样的受信任的本地网络中。将 `-r` 选项与 SSH 用户名和远程主机名一起使用:
+
+```
+$ sshuttle -r username@remotehost 0.0.0.0/0
+```
+
+但是,你可能希望将该虚拟专网限制为特定子网,而不是所有网络流量。(有关子网的完整讨论超出了本文的范围,但是你可以在[维基百科][4]上阅读更多内容。)假设你的办公室内部使用了预留的 A 类子网 10.0.0.0 和预留的 B 类子网 172.16.0.0。上面的命令变为:
+
+```
+$ sshuttle -r username@remotehost 10.0.0.0/8 172.16.0.0/16
+```
+
+这非常适合通过 IP 地址访问远程网络的主机。但是,如果你的办公室是一个拥有大量主机的大型网络,该怎么办?名称可能更方便,甚至是必须的。不用担心,`sshuttle` 还可以使用 `–dns` 选项转发 DNS 查询:
+
+```
+$ sshuttle --dns -r username@remotehost 10.0.0.0/8 172.16.0.0/16
+```
+
+要使 `sshuttle` 以守护进程方式运行,请加上 `-D` 选项。它会以 syslog 兼容的日志格式发送到 systemd 日志中。
+
+根据本地和远程系统的功能,可以将 `sshuttle` 用于基于 IPv6 的虚拟专网。如果需要,你还可以设置配置文件并将其与系统启动集成。如果你想阅读更多有关 `sshuttle` 及其工作方式的信息,请[查看官方文档][5]。要查看代码,请[进入 GitHub 页面][6]。
+
+*题图由 [Kurt Cotoaga][7] 拍摄并发表在 [Unsplash][8] 上。*
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/use-sshuttle-to-build-a-poor-mans-vpn/
+
+作者:[Paul W. Frields][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/pfrields/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2019/10/sshuttle-816x345.jpg
+[2]: https://en.wikipedia.org/wiki/Virtual_private_network
+[3]: https://fedoramagazine.org/howto-use-sudo/
+[4]: https://en.wikipedia.org/wiki/Subnetwork
+[5]: https://sshuttle.readthedocs.io/en/stable/index.html
+[6]: https://github.com/sshuttle/sshuttle
+[7]: https://unsplash.com/@kydroon?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
+[8]: https://unsplash.com/s/photos/shuttle?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
diff --git a/published/201910/20191015 10 Ways to Customize Your Linux Desktop With GNOME Tweaks Tool.md b/published/201910/20191015 10 Ways to Customize Your Linux Desktop With GNOME Tweaks Tool.md
new file mode 100644
index 0000000000..c9adda9a5d
--- /dev/null
+++ b/published/201910/20191015 10 Ways to Customize Your Linux Desktop With GNOME Tweaks Tool.md
@@ -0,0 +1,166 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11523-1.html)
+[#]: subject: (10 Ways to Customize Your Linux Desktop With GNOME Tweaks Tool)
+[#]: via: (https://itsfoss.com/gnome-tweak-tool/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+使用 GNOME 优化工具自定义 Linux 桌面的 10 种方法
+======
+
+
+![][7]
+
+你可以通过多种方法来调整 Ubuntu,以自定义其外观和行为。我发现最简单的方法是使用 [GNOME 优化工具][2]。它也被称为 GNOME Tweak 或简单地称为 Tweak(优化)。
+
+在过去的教程中,我已经多次介绍过它。在这里,我列出了你可以使用此工具执行的所有主要优化。
+
+我在这里使用的是 Ubuntu,但是这些步骤应该适用于使用 GNOME 桌面环境的任何 Linux 发行版。
+
+### 在 Ubuntu 18.04 或其它版本上安装 GNOME 优化工具
+
+GNOME 优化工具可从 [Ubuntu 中的 Universe 存储库][3]中安装,因此请确保已在“软件和更新”工具中启用了该仓库:
+
+![在 Ubuntu 中启用 Universe 存储库][4]
+
+之后,你可以从软件中心安装 GNOME 优化工具。只需打开软件中心并搜索 “GNOME Tweaks” 并从那里安装它:
+
+![从软件中心安装 GNOME 优化工具][5]
+
+或者,你也可以使用命令行通过 [apt 命令][6]安装此软件:
+
+```
+sudo apt install gnome-tweaks
+```
+
+### 用优化工具定制 GNOME 桌面
+
+GNOME 优化工具使你可以进行许多设置更改。其中的某些更改(例如墙纸更改、启动应用程序等)也可以在官方的“系统设置”工具中找到。我将重点介绍默认情况下“设置”中不可用的优化。
+
+#### 1、改变主题
+
+你可以通过各种方式[在 Ubuntu 中安装新主题][8]。但是,如果要更改为新安装的主题,则必须安装GNOME 优化工具。
+
+你可以在“外观”部分找到主题和图标设置。你可以浏览可用的主题和图标并设置你喜欢的主题和图标。更改将立即生效。
+
+![通过 GNOME 优化更改主题][9]
+
+#### 2、禁用动画以提速你的桌面体验
+
+应用程序窗口的打开、关闭、最大化等操作都有一些细微的动画。你可以禁用这些动画以稍微加快系统的速度,因为它会稍微使用一点资源。
+
+![禁用动画以获得稍快的桌面体验][10]
+
+#### 3、控制桌面图标
+
+至少在 Ubuntu 中,你会在桌面上看到“家目录”和“垃圾箱”图标。如果你不喜欢,可以选择禁用它。你还可以选择要在桌面上显示的图标。
+
+![在 Ubuntu 中控制桌面图标][11]
+
+#### 4、管理 GNOME 扩展
+
+我想你可能知道 [GNOME 扩展][12]。这些是用于桌面的小型“插件”,可扩展 GNOME 桌面的功能。有[大量的 GNOME 扩展][13],可用于在顶部面板中查看 CPU 消耗、获取剪贴板历史记录等等。
+
+我已经写了一篇[安装和使用 GNOME 扩展][14]的详细文章。在这里,我假设你已经在使用它们,如果是这样,可以从 GNOME 优化工具中对其进行管理。
+
+![管理 GNOME 扩展][15]
+
+#### 5、改变字体和缩放比例
+
+你可以[在 Ubuntu 中安装新字体][16],并使用这个优化工具在系统范围应用字体更改。如果你认为桌面上的图标和文本太小,也可以更改缩放比例。
+
+![更改字体和缩放比例][17]
+
+#### 6、控制触摸板行为,例如在键入时禁用触摸板,使触摸板右键单击可以工作
+
+GNOME 优化工具还允许你在键入时禁用触摸板。如果你在笔记本电脑上快速键入,这将很有用。手掌底部可能会触摸触摸板,并导致光标移至屏幕上不需要的位置。
+
+在键入时自动禁用触摸板可解决此问题。
+
+![键入时禁用触摸板][18]
+
+你还会注意到[当你按下触摸板的右下角以进行右键单击时,什么也没有发生][19]。你的触摸板并没有问题。这是一项系统设置,可对没有实体右键按钮的任何触摸板(例如旧的 Thinkpad 笔记本电脑)禁用这种右键单击功能。两指点击可为你提供右键单击操作。
+
+你也可以通过在“鼠标单击模拟”下设置为“区域”中而不是“手指”来找回这项功能。
+
+![修复右键单击问题][20]
+
+你可能必须[重新启动 Ubuntu][21] 来使这项更改生效。如果你是 Emacs 爱好者,还可以强制使用 Emacs 键盘绑定。
+
+#### 7、改变电源设置
+
+电源这里只有一个设置。它可以让你在盖上盖子后将笔记本电脑置于挂起模式。
+
+![GNOME 优化工具中的电源设置][22]
+
+#### 8、决定什么显示在顶部面板
+
+桌面的顶部面板显示了一些重要的信息。在这里有日历、网络图标、系统设置和“活动”选项。
+
+你还可以[显示电池百分比][23]、添加日期及时间,并显示星期数。你还可以启用鼠标热角,以便将鼠标移至屏幕的左上角时可以获得所有正在运行的应用程序的活动视图。
+
+![GNOME 优化工具中的顶部面板设置][24]
+
+如果将鼠标焦点放在应用程序窗口上,你会注意到其菜单显示在顶部面板中。如果你不喜欢这样,可以将其关闭,然后应用程序菜单将显示应用程序本身。
+
+#### 9、配置应用窗口
+
+你可以决定是否在应用程序窗口中显示最大化和最小化选项(右上角的按钮)。你也可以改变它们的位置到左边或右边。
+
+![应用程序窗口配置][25]
+
+这里还有其他一些配置选项。我不使用它们,但你可以自行探索。
+
+#### 10、配置工作区
+
+GNOME 优化工具还允许你围绕工作区配置一些内容。
+
+![在 Ubuntu 中配置工作区][26]
+
+### 总结
+
+对于任何 GNOME 用户,GNOME 优化(Tweaks)工具都是必备工具。它可以帮助你配置桌面的外观和功能。 我感到惊讶的是,该工具甚至没有出现在 Ubuntu 的主存储库中。我认为应该默认安装它,要不,你就得在 Ubuntu 中手动安装 GNOME 优化工具。
+
+如果你在 GNOME 优化工具中发现了一些此处没有讨论的隐藏技巧,为什么不与大家分享呢?
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/gnome-tweak-tool/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/abhishek/
+[b]: https://github.com/lujun9972
+[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/gnome-tweak-tool-icon.png?ssl=1
+[2]: https://wiki.gnome.org/action/show/Apps/Tweaks?action=show&redirect=Apps%2FGnomeTweakTool
+[3]: https://itsfoss.com/ubuntu-repositories/
+[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/enable-repositories-ubuntu.png?ssl=1
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/install-gnome-tweaks-tool.jpg?ssl=1
+[6]: https://itsfoss.com/apt-command-guide/
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/10/customize-gnome-with-tweak-tool.jpg?ssl=1
+[8]: https://itsfoss.com/install-themes-ubuntu/
+[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/change-theme-ubuntu-gnome.jpg?ssl=1
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/disable-animation-ubuntu-gnome.jpg?ssl=1
+[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/10/desktop-icons-ubuntu.jpg?ssl=1
+[12]: https://extensions.gnome.org/
+[13]: https://itsfoss.com/best-gnome-extensions/
+[14]: https://itsfoss.com/gnome-shell-extensions/
+[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/manage-gnome-extension-tweaks-tool.jpg?ssl=1
+[16]: https://itsfoss.com/install-fonts-ubuntu/
+[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/change-fonts-ubuntu-gnome.jpg?ssl=1
+[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/10/disable-touchpad-while-typing-ubuntu.jpg?ssl=1
+[19]: https://itsfoss.com/fix-right-click-touchpad-ubuntu/
+[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/enable-right-click-ubuntu.jpg?ssl=1
+[21]: https://itsfoss.com/schedule-shutdown-ubuntu/
+[22]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/power-settings-gnome-tweaks-tool.jpg?ssl=1
+[23]: https://itsfoss.com/display-battery-ubuntu/
+[24]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/10/top-panel-settings-gnome-tweaks-tool.jpg?ssl=1
+[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/10/windows-configuration-ubuntu-gnome-tweaks.jpg?ssl=1
+[26]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/configure-workspaces-ubuntu.jpg?ssl=1
diff --git a/published/201910/20191015 4 Free and Open Source Alternatives to Adobe Photoshop.md b/published/201910/20191015 4 Free and Open Source Alternatives to Adobe Photoshop.md
new file mode 100644
index 0000000000..447b694c3a
--- /dev/null
+++ b/published/201910/20191015 4 Free and Open Source Alternatives to Adobe Photoshop.md
@@ -0,0 +1,136 @@
+[#]: collector: (lujun9972)
+[#]: translator: (algzjh)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11474-1.html)
+[#]: subject: (4 Free and Open Source Alternatives to Adobe Photoshop)
+[#]: via: (https://itsfoss.com/open-source-photoshop-alternatives/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+Adobe Photoshop 的 4 种自由开源替代品
+======
+
+> 想寻找免费的 Photoshop 替代品?这里有一些最好的自由开源软件,你可以用它们来代替 Adobe Photoshop。
+
+Adobe Photoshop 是一个可用于 Windows 和 macOS 的高级图像编辑和设计工具。毫无疑问,几乎每个人都知道它。其十分受欢迎。在 Linux 上,你可以在虚拟机中使用 Windows 或[通过 Wine][1] 来使用 Photoshop,但这并不是一种理想的体验。
+
+一般来说,我们没有太多可以替代 Adobe Photoshop 的选项。然而,在本文中,我们将提到一些在 Linux 上可用的最佳的开源 Photoshop 替代品(也支持跨平台)。
+
+请注意 Photoshop 不仅仅是一个图片编辑器。摄影师、数码艺术家、专业编辑使用它用于各种用途。此处的替代软件可能不具备 Photoshop 的所有功能,但你可以将它们用于在 Photoshop 中完成的各种任务。
+
+### 适用于 Linux、Windows 和 macOS 的 Adobe Photoshop 的开源替代品
+
+![][2]
+
+最初,我想只关注 Linux 中的 Photoshop 替代品,但为什么要把这个列表局限于 Linux 呢?其他操作系统用户也可使用开源软件。
+
+**如果你正在使用 Linux,则所有提到的软件都应该可以在你的发行版的存储库中找到。你可以使用软件中心或包管理器进行安装。**
+
+对于其他平台,请查看官方项目网站以获取安装文件。
+
+*该列表没有特定的排名顺序*
+
+#### 1、GIMP:真正的 Photoshop 替代品
+
+![][3]
+
+主要特点:
+
+ * 可定制的界面
+ * 数字级修饰
+ * 照片增强(使用变换工具)
+ * 支持广泛的硬件(压敏平板、音乐数字接口等)
+ * 几乎支持所有主要的图像文件
+ * 支持图层管理
+
+可用平台:Linux、Windows 和 macOS
+
+[GIMP][4] 是我处理任何事情的必备工具,无论任务多么基础/高级。也许,这是你在 Linux 下最接近 Photoshop 的替代品。除此之外,它还是一个开源和免费的解决方案,适合希望在 Linux 上创作伟大作品的艺术家。
+
+它具有任何类型的图像处理所必需的所有功能。当然,还有图层管理支持。根据你的经验水平,利用率会有所不同。因此,如果你想充分利用它,则应阅读 [文档][5] 并遵循 [官方教程][6]。
+
+#### 2、Krita
+
+![][7]
+
+主要特点:
+
+ * 支持图层管理
+ * 转换工具
+ * 丰富的笔刷/绘图工具
+
+可用平台:Linux、Windows 和 macOS
+
+[Krita][8] 是一个令人印象深刻的开源的数字绘画工具。图层管理支持和转换工具的存在使它成为 Photoshop 的基本编辑任务的替代品之一。
+
+如果你喜欢素描/绘图,这将对你很有帮助。
+
+#### 3、Darktable
+
+![][9]
+
+主要特点:
+
+ * RAW 图像显影
+ * 支持多种图像格式
+ * 多个带有混合运算符的图像操作模块
+
+可用平台:Linux、Windows 和 macOS
+
+[Darktable][10] 是一个由摄影师制作的开源摄影工作流应用程序。它可以让你在数据库中管理你的数码底片。从你的收藏中,显影 RAW 格式的图像并使用可用的工具对其进行增强。
+
+从基本的图像编辑工具到支持混合运算符的多个图像模块,你将在探索中发现许多。
+
+#### 4、Inkscape
+
+![][11]
+
+主要特点:
+
+ * 创建对象的工具(最适合绘图/素描)
+ * 支持图层管理
+ * 用于图像处理的转换工具
+ * 颜色选择器(RGB、HSL、CMYK、色轮、CMS)
+ * 支持所有主要文件格式
+
+可用平台:Linux、Windows 和 macOS
+
+[Inkscape][12] 是一个非常流行的开源矢量图形编辑器,许多专业人士都使用它。它提供了灵活的设计工具,可帮助你创作漂亮的艺术作品。从技术上说,它是 Adobe Illustrator 的直接替代品,但它也提供了一些技巧,可以帮助你将其作为 Photoshop 的替代品。
+
+与 GIMP 的官方资源类似,你可以利用 [Inkscape 的教程][13] 来最大程度地利用它。
+
+### 在你看来,真正的 Photoshop 替代品是什么?
+
+很难提供与 Adobe Photoshop 完全相同的功能。然而,如果你遵循官方文档和资源,则可以使用上述 Photoshop 替代品做很多很棒的事情。
+
+Adobe 提供了一系列的图形工具,并且我们有 [整个 Adobe 创意套件的开源替代方案][14]。 你也可以去看看。
+
+你觉得我们在此提到的 Photoshop 替代品怎么样?你是否知道任何值得提及的更好的替代方案?请在下面的评论中告诉我们。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/open-source-photoshop-alternatives/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[algzjh](https://github.com/algzjh)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/install-latest-wine/
+[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/open_source_photoshop_alternatives.png?ssl=1
+[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/08/gimp-screenshot.jpg?ssl=1
+[4]: https://www.gimp.org/
+[5]: https://www.gimp.org/docs/
+[6]: https://www.gimp.org/tutorials/
+[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/krita-paint.png?ssl=1
+[8]: https://krita.org/
+[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/darktable.jpg?ssl=1
+[10]: https://www.darktable.org/
+[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2017/12/inkscape-screenshot.jpg?ssl=1
+[12]: https://inkscape.org/
+[13]: https://inkscape.org/learn/
+[14]: https://itsfoss.com/adobe-alternatives-linux/
diff --git a/published/201910/20191015 Bash Script to Delete Files-Folders Older Than -X- Days in Linux.md b/published/201910/20191015 Bash Script to Delete Files-Folders Older Than -X- Days in Linux.md
new file mode 100644
index 0000000000..c80f5540b9
--- /dev/null
+++ b/published/201910/20191015 Bash Script to Delete Files-Folders Older Than -X- Days in Linux.md
@@ -0,0 +1,205 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11490-1.html)
+[#]: subject: (Bash Script to Delete Files/Folders Older Than “X” Days in Linux)
+[#]: via: (https://www.2daygeek.com/bash-script-to-delete-files-folders-older-than-x-days-in-linux/)
+[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
+
+在 Linux 中使用 Bash 脚本删除早于 “X” 天的文件/文件夹
+======
+
+[磁盘使用率][1] 监控工具能够在达到给定阈值时提醒我们。但它们无法自行解决 [磁盘使用率][2] 问题。需要手动干预才能解决该问题。
+
+如果你想完全自动化此类操作,你会做什么。是的,可以使用 bash 脚本来完成。
+
+该脚本可防止来自 [监控工具][3] 的警报,因为我们会在填满磁盘空间之前删除旧的日志文件。
+
+我们过去做了很多 shell 脚本。如果要查看,请进入下面的链接。
+
+* [如何使用 shell 脚本自动化日常活动?][4]
+
+我在本文中添加了两个 bash 脚本,它们有助于清除旧日志。
+
+### 1)在 Linux 中删除早于 “X” 天的文件夹的 Bash 脚本
+
+我们有一个名为 `/var/log/app/` 的文件夹,其中包含 15 天的日志,我们将删除早于 10 天的文件夹。
+
+```
+$ ls -lh /var/log/app/
+
+drwxrw-rw- 3 root root 24K Oct 1 23:52 app_log.01
+drwxrw-rw- 3 root root 24K Oct 2 23:52 app_log.02
+drwxrw-rw- 3 root root 24K Oct 3 23:52 app_log.03
+drwxrw-rw- 3 root root 24K Oct 4 23:52 app_log.04
+drwxrw-rw- 3 root root 24K Oct 5 23:52 app_log.05
+drwxrw-rw- 3 root root 24K Oct 6 23:54 app_log.06
+drwxrw-rw- 3 root root 24K Oct 7 23:53 app_log.07
+drwxrw-rw- 3 root root 24K Oct 8 23:51 app_log.08
+drwxrw-rw- 3 root root 24K Oct 9 23:52 app_log.09
+drwxrw-rw- 3 root root 24K Oct 10 23:52 app_log.10
+drwxrw-rw- 3 root root 24K Oct 11 23:52 app_log.11
+drwxrw-rw- 3 root root 24K Oct 12 23:52 app_log.12
+drwxrw-rw- 3 root root 24K Oct 13 23:52 app_log.13
+drwxrw-rw- 3 root root 24K Oct 14 23:52 app_log.14
+drwxrw-rw- 3 root root 24K Oct 15 23:52 app_log.15
+```
+
+该脚本将删除早于 10 天的文件夹,并通过邮件发送文件夹列表。
+
+你可以根据需要修改 `-mtime X` 的值。另外,请替换你的电子邮箱,而不是用我们的。
+
+```
+# /opt/script/delete-old-folders.sh
+
+#!/bin/bash
+prev_count=0
+fpath=/var/log/app/app_log.*
+find $fpath -type d -mtime +10 -exec ls -ltrh {} \; > /tmp/folder.out
+find $fpath -type d -mtime +10 -exec rm -rf {} \;
+count=$(cat /tmp/folder.out | wc -l)
+if [ "$prev_count" -lt "$count" ] ; then
+MESSAGE="/tmp/file1.out"
+TO="[email protected]"
+echo "Application log folders are deleted older than 15 days" >> $MESSAGE
+echo "+----------------------------------------------------+" >> $MESSAGE
+echo "" >> $MESSAGE
+cat /tmp/folder.out | awk '{print $6,$7,$9}' >> $MESSAGE
+echo "" >> $MESSAGE
+SUBJECT="WARNING: Apache log files are deleted older than 15 days $(date)"
+mail -s "$SUBJECT" "$TO" < $MESSAGE
+rm $MESSAGE /tmp/folder.out
+fi
+```
+
+给 `delete-old-folders.sh` 设置可执行权限。
+
+```
+# chmod +x /opt/script/delete-old-folders.sh
+```
+
+最后添加一个 [cronjob][5] 自动化此任务。它于每天早上 7 点运行。
+
+```
+# crontab -e
+
+0 7 * * * /bin/bash /opt/script/delete-old-folders.sh
+```
+
+你将看到类似下面的输出。
+
+```
+Application log folders are deleted older than 20 days
++--------------------------------------------------------+
+Oct 11 /var/log/app/app_log.11
+Oct 12 /var/log/app/app_log.12
+Oct 13 /var/log/app/app_log.13
+Oct 14 /var/log/app/app_log.14
+Oct 15 /var/log/app/app_log.15
+```
+
+### 2)在 Linux 中删除早于 “X” 天的文件的 Bash 脚本
+
+我们有一个名为 `/var/log/apache/` 的文件夹,其中包含15天的日志,我们将删除 10 天前的文件。
+
+以下文章与该主题相关,因此你可能有兴趣阅读。
+
+ * [如何在 Linux 中查找和删除早于 “X” 天和 “X” 小时的文件?][6]
+ * [如何在 Linux 中查找最近修改的文件/文件夹][7]
+ * [如何在 Linux 中自动删除或清理 /tmp 文件夹内容?][8]
+
+```
+# ls -lh /var/log/apache/
+
+-rw-rw-rw- 3 root root 24K Oct 1 23:52 2daygeek_access.01
+-rw-rw-rw- 3 root root 24K Oct 2 23:52 2daygeek_access.02
+-rw-rw-rw- 3 root root 24K Oct 3 23:52 2daygeek_access.03
+-rw-rw-rw- 3 root root 24K Oct 4 23:52 2daygeek_access.04
+-rw-rw-rw- 3 root root 24K Oct 5 23:52 2daygeek_access.05
+-rw-rw-rw- 3 root root 24K Oct 6 23:54 2daygeek_access.06
+-rw-rw-rw- 3 root root 24K Oct 7 23:53 2daygeek_access.07
+-rw-rw-rw- 3 root root 24K Oct 8 23:51 2daygeek_access.08
+-rw-rw-rw- 3 root root 24K Oct 9 23:52 2daygeek_access.09
+-rw-rw-rw- 3 root root 24K Oct 10 23:52 2daygeek_access.10
+-rw-rw-rw- 3 root root 24K Oct 11 23:52 2daygeek_access.11
+-rw-rw-rw- 3 root root 24K Oct 12 23:52 2daygeek_access.12
+-rw-rw-rw- 3 root root 24K Oct 13 23:52 2daygeek_access.13
+-rw-rw-rw- 3 root root 24K Oct 14 23:52 2daygeek_access.14
+-rw-rw-rw- 3 root root 24K Oct 15 23:52 2daygeek_access.15
+```
+
+该脚本将删除 10 天前的文件并通过邮件发送文件夹列表。
+
+你可以根据需要修改 `-mtime X` 的值。另外,请替换你的电子邮箱,而不是用我们的。
+
+```
+# /opt/script/delete-old-files.sh
+
+#!/bin/bash
+prev_count=0
+fpath=/var/log/apache/2daygeek_access.*
+find $fpath -type f -mtime +15 -exec ls -ltrd {} \; > /tmp/file.out
+find $fpath -type f -mtime +15 -exec rm -rf {} \;
+count=$(cat /tmp/file.out | wc -l)
+if [ "$prev_count" -lt "$count" ] ; then
+MESSAGE="/tmp/file1.out"
+TO="[email protected]"
+echo "Apache Access log files are deleted older than 20 days" >> $MESSAGE
+echo "+--------------------------------------------- +" >> $MESSAGE
+echo "" >> $MESSAGE
+cat /tmp/file.out | awk '{print $6,$7,$9}' >> $MESSAGE
+echo "" >> $MESSAGE
+SUBJECT="WARNING: Apache log folders are deleted older than 15 days $(date)"
+mail -s "$SUBJECT" "$TO" < $MESSAGE
+rm $MESSAGE /tmp/file.out
+fi
+```
+
+给 `delete-old-files.sh` 设置可执行权限。
+
+```
+# chmod +x /opt/script/delete-old-files.sh
+```
+
+最后添加一个 [cronjob][5] 自动化此任务。它于每天早上 7 点运行。
+
+```
+# crontab -e
+
+0 7 * * * /bin/bash /opt/script/delete-old-folders.sh
+```
+
+你将看到类似下面的输出。
+
+```
+Apache Access log files are deleted older than 20 days
++--------------------------------------------------------+
+Oct 11 /var/log/apache/2daygeek_access.11
+Oct 12 /var/log/apache/2daygeek_access.12
+Oct 13 /var/log/apache/2daygeek_access.13
+Oct 14 /var/log/apache/2daygeek_access.14
+Oct 15 /var/log/apache/2daygeek_access.15
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/bash-script-to-delete-files-folders-older-than-x-days-in-linux/
+
+作者:[Magesh Maruthamuthu][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/magesh/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/linux-check-disk-usage-files-and-directories-folders-size-du-command/
+[2]: https://www.2daygeek.com/linux-check-disk-space-usage-df-command/
+[3]: https://www.2daygeek.com/category/monitoring-tools/
+[4]: https://www.2daygeek.com/category/shell-script/
+[5]: https://www.2daygeek.com/crontab-cronjob-to-schedule-jobs-in-linux/
+[6]: https://www.2daygeek.com/how-to-find-and-delete-files-older-than-x-days-and-x-hours-in-linux/
+[7]: https://www.2daygeek.com/check-find-recently-modified-files-folders-linux/
+[8]: https://www.2daygeek.com/automatically-delete-clean-up-tmp-directory-folder-contents-in-linux/
diff --git a/published/201910/20191016 Linux sudo flaw can lead to unauthorized privileges.md b/published/201910/20191016 Linux sudo flaw can lead to unauthorized privileges.md
new file mode 100644
index 0000000000..327458485a
--- /dev/null
+++ b/published/201910/20191016 Linux sudo flaw can lead to unauthorized privileges.md
@@ -0,0 +1,79 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11495-1.html)
+[#]: subject: (Linux sudo flaw can lead to unauthorized privileges)
+[#]: via: (https://www.networkworld.com/article/3446036/linux-sudo-flaw-can-lead-to-unauthorized-privileges.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+Linux sudo 漏洞可能导致未经授权的特权访问
+======
+
+
+
+> 在 Linux 中利用新发现的 sudo 漏洞可以使某些用户以 root 身份运行命令,尽管对此还有所限制。
+
+[sudo][1] 命令中最近发现了一个严重漏洞,如果被利用,普通用户可以 root 身份运行命令,即使在 `/etc/sudoers` 文件中明确禁止了该用户这样做。
+
+将 `sudo` 更新到版本 1.8.28 应该可以解决该问题,因此建议 Linux 管理员尽快这样做。
+
+如何利用此漏洞取决于 `/etc/sudoers` 中授予的特定权限。例如,一条规则允许用户以除了 root 用户之外的任何用户身份来编辑文件,这实际上将允许该用户也以 root 用户身份来编辑文件。在这种情况下,该漏洞可能会导致非常严重的问题。
+
+用户要能够利用此漏洞,需要在 `/etc/sudoers` 中为**用户**分配特权,以使该用户可以以其他用户身份运行命令,并且该漏洞仅限于以这种方式分配的命令特权。
+
+此问题影响 1.8.28 之前的版本。要检查你的 `sudo` 版本,请使用以下命令:
+
+```
+$ sudo -V
+Sudo version 1.8.27 <===
+Sudoers policy plugin version 1.8.27
+Sudoers file grammar version 46
+Sudoers I/O plugin version 1.8.27
+```
+
+该漏洞已在 CVE 数据库中分配了编号 [CVE-2019-14287][4]。它的风险是,任何被指定能以任意用户运行某个命令的用户,即使被明确禁止以 root 身份运行,它都能逃脱限制。
+
+下面这些行让 `jdoe` 能够以除了 root 用户之外的其他身份使用 `vi` 编辑文件(`!root` 表示“非 root”),同时 `nemo` 有权运行以除了 root 身份以外的任何用户使用 `id` 命令:
+
+```
+# affected entries on host "dragonfly"
+jdoe dragonfly = (ALL, !root) /usr/bin/vi
+nemo dragonfly = (ALL, !root) /usr/bin/id
+```
+
+但是,由于存在漏洞,这些用户中要么能够绕过限制并以 root 编辑文件,或者以 root 用户身份运行 `id` 命令。
+
+攻击者可以通过指定用户 ID 为 `-1` 或 `4294967295` 来以 root 身份运行命令。
+
+```
+sudo -u#-1 id -u
+```
+
+或者
+
+```
+sudo -u#4294967295 id -u
+```
+
+响应为 `1` 表明该命令以 root 身份运行(显示 root 的用户 ID)。
+
+苹果信息安全团队的 Joe Vennix 找到并分析该问题。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3446036/linux-sudo-flaw-can-lead-to-unauthorized-privileges.html
+
+作者:[Sandra Henry-Stocker][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.networkworld.com/author/Sandra-Henry_Stocker/
+[b]: https://github.com/lujun9972
+[1]: https://www.networkworld.com/article/3236499/some-tricks-for-using-sudo.html
+[4]: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-14287
+[5]: https://www.facebook.com/NetworkWorld/
+[6]: https://www.linkedin.com/company/network-world
diff --git a/published/201910/20191018 How to Configure Rsyslog Server in CentOS 8 - RHEL 8.md b/published/201910/20191018 How to Configure Rsyslog Server in CentOS 8 - RHEL 8.md
new file mode 100644
index 0000000000..ba0505daf9
--- /dev/null
+++ b/published/201910/20191018 How to Configure Rsyslog Server in CentOS 8 - RHEL 8.md
@@ -0,0 +1,207 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11505-1.html)
+[#]: subject: (How to Configure Rsyslog Server in CentOS 8 / RHEL 8)
+[#]: via: (https://www.linuxtechi.com/configure-rsyslog-server-centos-8-rhel-8/)
+[#]: author: (James Kiarie https://www.linuxtechi.com/author/james/)
+
+如何在 CentOS8/RHEL8 中配置 Rsyslog 服务器
+======
+
+
+
+Rsyslog 是一个自由开源的日志记录程序,在 CentOS 8 和 RHEL 8 系统上默认可用。它提供了一种从客户端节点到单个中央服务器的“集中日志”的简单有效的方法。日志集中化有两个好处。首先,它简化了日志查看,因为系统管理员可以在一个中心节点查看远程服务器的所有日志,而无需登录每个客户端系统来检查日志。如果需要监视多台服务器,这将非常有用,其次,如果远程客户端崩溃,你不用担心丢失日志,因为所有日志都将保存在中心的 Rsyslog 服务器上。rsyslog 取代了仅支持 UDP 协议的 syslog。它以优异的功能扩展了基本的 syslog 协议,例如在传输日志时支持 UDP 和 TCP 协议,增强的过滤功能以及灵活的配置选项。让我们来探讨如何在 CentOS 8 / RHEL 8 系统中配置 Rsyslog 服务器。
+
+![configure-rsyslog-centos8-rhel8][2]
+
+### 预先条件
+
+我们将搭建以下实验环境来测试集中式日志记录过程:
+
+ * Rsyslog 服务器 CentOS 8 Minimal IP 地址: 10.128.0.47
+ * 客户端系统 RHEL 8 Minimal IP 地址: 10.128.0.48
+
+通过上面的设置,我们将演示如何设置 Rsyslog 服务器,然后配置客户端系统以将日志发送到 Rsyslog 服务器进行监视。
+
+让我们开始!
+
+### 在 CentOS 8 上配置 Rsyslog 服务器
+
+默认情况下,Rsyslog 已安装在 CentOS 8 / RHEL 8 服务器上。要验证 Rsyslog 的状态,请通过 SSH 登录并运行以下命令:
+
+```
+$ systemctl status rsyslog
+```
+
+示例输出:
+
+
+
+如果由于某种原因 Rsyslog 不存在,那么可以使用以下命令进行安装:
+
+```
+$ sudo yum install rsyslog
+```
+
+接下来,你需要修改 Rsyslog 配置文件中的一些设置。打开配置文件:
+
+```
+$ sudo vim /etc/rsyslog.conf
+```
+
+滚动并取消注释下面的行,以允许通过 UDP 协议接收日志:
+
+```
+module(load="imudp") # needs to be done just once
+input(type="imudp" port="514")
+```
+
+
+
+同样,如果你希望启用 TCP rsyslog 接收,请取消注释下面的行:
+
+```
+module(load="imtcp") # needs to be done just once
+input(type="imtcp" port="514")
+```
+
+
+
+保存并退出配置文件。
+
+要从客户端系统接收日志,我们需要在防火墙上打开 Rsyslog 默认端口 514。为此,请运行:
+
+```
+# sudo firewall-cmd --add-port=514/tcp --zone=public --permanent
+```
+
+接下来,重新加载防火墙保存更改:
+
+```
+# sudo firewall-cmd --reload
+```
+
+示例输出:
+
+
+
+接下来,重启 Rsyslog 服务器:
+
+```
+$ sudo systemctl restart rsyslog
+```
+
+要在启动时运行 Rsyslog,运行以下命令:
+
+```
+$ sudo systemctl enable rsyslog
+```
+
+要确认 Rsyslog 服务器正在监听 514 端口,请使用 `netstat` 命令,如下所示:
+
+```
+$ sudo netstat -pnltu
+```
+
+示例输出:
+
+
+
+完美!我们已经成功配置了 Rsyslog 服务器来从客户端系统接收日志。
+
+要实时查看日志消息,请运行以下命令:
+
+```
+$ tail -f /var/log/messages
+```
+
+现在开始配置客户端系统。
+
+### 在 RHEL 8 上配置客户端系统
+
+与 Rsyslog 服务器一样,登录并通过以下命令检查 rsyslog 守护进程是否正在运行:
+
+```
+$ sudo systemctl status rsyslog
+```
+
+示例输出:
+
+
+
+接下来,打开 rsyslog 配置文件:
+
+```
+$ sudo vim /etc/rsyslog.conf
+```
+
+在文件末尾,添加以下行:
+
+```
+*.* @10.128.0.47:514 # Use @ for UDP protocol
+*.* @@10.128.0.47:514 # Use @@ for TCP protocol
+```
+
+保存并退出配置文件。就像 Rsyslog 服务器一样,打开 514 端口,这是防火墙上的默认 Rsyslog 端口:
+
+```
+$ sudo firewall-cmd --add-port=514/tcp --zone=public --permanent
+```
+
+接下来,重新加载防火墙以保存更改:
+
+```
+$ sudo firewall-cmd --reload
+```
+
+接下来,重启 rsyslog 服务:
+
+```
+$ sudo systemctl restart rsyslog
+```
+
+要在启动时运行 Rsyslog,请运行以下命令:
+
+```
+$ sudo systemctl enable rsyslog
+```
+
+### 测试日志记录操作
+
+已经成功安装并配置 Rsyslog 服务器和客户端后,就该验证你的配置是否按预期运行了。
+
+在客户端系统上,运行以下命令:
+
+```
+# logger "Hello guys! This is our first log"
+```
+
+现在进入 Rsyslog 服务器并运行以下命令来实时查看日志消息:
+
+```
+# tail -f /var/log/messages
+```
+
+客户端系统上命令运行的输出显示在了 Rsyslog 服务器的日志中,这意味着 Rsyslog 服务器正在接收来自客户端系统的日志:
+
+
+
+就是这些了!我们成功设置了 Rsyslog 服务器来接收来自客户端系统的日志信息。
+
+--------------------------------------------------------------------------------
+
+via: https://www.linuxtechi.com/configure-rsyslog-server-centos-8-rhel-8/
+
+作者:[James Kiarie][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linuxtechi.com/author/james/
+[b]: https://github.com/lujun9972
+[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[2]: https://www.linuxtechi.com/wp-content/uploads/2019/10/configure-rsyslog-centos8-rhel8.jpg
diff --git a/published/201910/20191021 Kubernetes networking, OpenStack Train, and more industry trends.md b/published/201910/20191021 Kubernetes networking, OpenStack Train, and more industry trends.md
new file mode 100644
index 0000000000..994c583274
--- /dev/null
+++ b/published/201910/20191021 Kubernetes networking, OpenStack Train, and more industry trends.md
@@ -0,0 +1,82 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11497-1.html)
+[#]: subject: (Kubernetes networking, OpenStack Train, and more industry trends)
+[#]: via: (https://opensource.com/article/19/10/kubernetes-openstack-and-more-industry-trends)
+[#]: author: (Tim Hildred https://opensource.com/users/thildred)
+
+每周开源点评:Kubernetes 网络、OpenStack Train 以及更多的行业趋势
+======
+
+> 开源社区和行业趋势的每周总览。
+
+![Person standing in front of a giant computer screen with numbers, data][1]
+
+作为我在具有开源开发模型的企业软件公司担任高级产品营销经理的角色的一部分,我为产品营销人员、经理和其他影响者定期发布有关开源社区,市场和行业趋势的定期更新。以下是该更新中我和他们最喜欢的五篇文章。
+
+### OpenStack Train 中最令人兴奋的功能
+
+- [文章地址][2]
+
+> 考虑到 Train 版本必须提供的所有技术优势([你可以在此处查看版本亮点][3]),你可能会对 Red Hat 认为这些将使我们的电信和企业客户受益的顶级功能及其用例感到好奇。以下我们对该版本最兴奋的功能的概述。
+
+**影响**:OpenStack 对我来说就像 Shia LaBeouf:它在几年前达到了炒作的顶峰,然后继续产出了好的作品。Train 版本看起来是又一次令人难以置信的创新下降。
+
+### 以 Ansible 原生的方式构建 Kubernetes 操作器
+
+- [文章地址][4]
+
+> 操作器简化了 Kubernetes 上复杂应用程序的管理。它们通常是用 Go 语言编写的,并且需要懂得 Kubernetes 内部的专业知识。但是,还有另一种进入门槛较低的选择。Ansible 是操作器 SDK 中的一等公民。使用 Ansible 可以释放应用程序工程师的精力,最大限度地利用时间来自动化和协调你的应用程序,并使用一种简单的语言在新的和现有的平台上进行操作。在这里我们可以看到如何做。
+
+**影响**:这就像你发现可以用搅拌器和冷冻香蕉制作出不错的冰淇淋一样:Ansible(通常被认为很容易掌握)可以使你比你想象的更容易地做一些令人印象深刻的操作器魔术。
+
+### Kubernetes 网络:幕后花絮
+
+- [文章地址][5]
+
+> 尽管围绕该主题有很多很好的资源(链接在[这里][6]),但我找不到一个示例,可以将所有的点与网络工程师喜欢和讨厌的命令输出连接起来,以显示背后实际发生的情况。因此,我决定从许多不同的来源收集这些信息,以期帮助你更好地了解事物之间的联系。
+
+**影响**:这是一篇对复杂主题(带有图片)阐述的很好的作品。保证可以使 Kubenetes 网络的混乱程度降低 10%。
+
+### 保护容器供应链
+
+- [文章地址][7]
+
+> 随着容器、软件即服务和函数即服务的出现,人们开始着眼于在使用现有服务、函数和容器映像的过程中寻求新的价值。[Red Hat][8] 的容器首席产品经理 Scott McCarty 表示,关注这个重点既有优点也有缺点。“它使我们能够集中精力编写满足我们需求的新应用程序代码,同时将对基础架构的关注转移给其他人身上,”McCarty 说,“容器处于一个最佳位置,提供了足够的控制,而卸去了许多繁琐的基础架构工作。”但是,容器也会带来与安全性相关的劣势。
+
+**影响**:我在一个由大约十位安全人员组成的小组中,可以肯定地说,整天要考虑软件安全性需要一定的倾向。当你长时间凝视深渊时,它也凝视着你。如果你不是如此倾向的软件开发人员,请听取 Scott 的建议并确保你的供应商考虑安全。
+
+### 15 岁的 Fedora:为何 Matthew Miller 看到 Linux 发行版的光明前景
+
+- [文章链接][9]
+
+> 在 TechRepublic 的一个大范围采访中,Fedora 项目负责人 Matthew Miller 讨论了过去的经验教训、软件容器的普遍采用和竞争性标准、Fedora 的潜在变化以及包括 systemd 在内的热门话题。
+
+**影响**:我喜欢 Fedora 项目的原因是它的清晰度;该项目知道它代表什么。像 Matt 这样的人就是为什么能看到光明前景的原因。
+
+*我希望你喜欢这张上周让我印象深刻的列表,并在下周一回来了解更多的开放源码社区、市场和行业趋势。*
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/10/kubernetes-openstack-and-more-industry-trends
+
+作者:[Tim Hildred][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/thildred
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data)
+[2]: https://www.redhat.com/en/blog/look-most-exciting-features-openstack-train
+[3]: https://releases.openstack.org/train/highlights.html
+[4]: https://www.cncf.io/webinars/building-kubernetes-operators-in-an-ansible-native-way/
+[5]: https://itnext.io/kubernetes-networking-behind-the-scenes-39a1ab1792bb
+[6]: https://github.com/nleiva/kubernetes-networking-links
+[7]: https://www.devprojournal.com/technology-trends/open-source/securing-the-container-supply-chain/
+[8]: https://www.redhat.com/en
+[9]: https://www.techrepublic.com/article/fedora-at-15-why-matthew-miller-sees-a-bright-future-for-the-linux-distribution/
diff --git a/published/201910/20191021 Pylint- Making your Python code consistent.md b/published/201910/20191021 Pylint- Making your Python code consistent.md
new file mode 100644
index 0000000000..80991142a5
--- /dev/null
+++ b/published/201910/20191021 Pylint- Making your Python code consistent.md
@@ -0,0 +1,93 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11502-1.html)
+[#]: subject: (Pylint: Making your Python code consistent)
+[#]: via: (https://opensource.com/article/19/10/python-pylint-introduction)
+[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
+
+Pylint:让你的 Python 代码保持一致
+======
+
+> 当你想要争论代码复杂性时,Pylint 是你的朋友。
+
+![OpenStack source code \(Python\) in VIM][1]
+
+Pylint 是更高层级的 Python 样式强制程序。而 [flake8][2] 和 [black][3] 检查的是“本地”样式:换行位置、注释的格式、发现注释掉的代码或日志格式中的错误做法之类的问题。
+
+默认情况下,Pylint 非常激进。它将对每样东西都提供严厉的意见,从检查是否实际实现声明的接口到重构重复代码的可能性,这对新用户来说可能会很多。一种温和地将其引入项目或团队的方法是先关闭*所有*检查器,然后逐个启用检查器。如果你已经在使用 flake8、black 和 [mypy][4],这尤其有用:Pylint 有相当多的检查器和它们在功能上重叠。
+
+但是,Pylint 独有之处之一是能够强制执行更高级别的问题:例如,函数的行数或者类中方法的数量。
+
+这些数字可能因项目而异,并且可能取决于开发团队的偏好。但是,一旦团队就参数达成一致,使用自动工具*强制化*这些参数非常有用。这是 Pylint 闪耀的地方。
+
+### 配置 Pylint
+
+要以空配置开始,请将 `.pylintrc` 设置为
+
+```
+[MESSAGES CONTROL]
+
+disable=all
+```
+
+这将禁用所有 Pylint 消息。由于其中许多是冗余的,这是有道理的。在 Pylint 中,`message` 是一种特定的警告。
+
+你可以通过运行 `pylint` 来确认所有消息都已关闭:
+
+```
+$ pylint
+```
+
+通常,向 `pylint` 命令行添加参数并不是一个好主意:配置 `pylint` 的最佳位置是 `.pylintrc`。为了使它做*一些*有用的事,我们需要启用一些消息。
+
+要启用消息,在 `.pylintrc` 中的 `[MESSAGES CONTROL]` 下添加
+
+```
+enable=,
+ ...
+```
+
+对于看起来有用的“消息”(Pylint 称之为不同类型的警告)。我最喜欢的包括 `too-many-lines`、`too-many-arguments` 和 `too-many-branches`。所有这些会限制模块或函数的复杂性,并且无需进行人工操作即可客观地进行代码复杂度测量。
+
+*检查器*是*消息*的来源:每条消息只属于一个检查器。许多最有用的消息都在[设计检查器][5]下。默认数字通常都不错,但要调整最大值也很简单:我们可以在 `.pylintrc` 中添加一个名为 `DESIGN` 的段。
+
+```
+[DESIGN]
+max-args=7
+max-locals=15
+```
+
+另一个有用的消息来源是“重构”检查器。我已启用一些最喜欢的消息有 `consider-using-dict-comprehension`、`stop-iteration-return`(它会查找正确的停止迭代的方式是 `return` 而使用了 `raise StopIteration` 的迭代器)和 `chained-comparison`,它将建议使用如 `1 <= x < 5`,而不是不太明显的 `1 <= x && 5 > 5` 的语法。
+
+最后是一个在性能方面消耗很大的检查器,但它非常有用,就是 `similarities`。它会查找不同部分代码之间的复制粘贴来强制执行“不要重复自己”(DRY 原则)。它只启用一条消息:`duplicate-code`。默认的 “最小相似行数” 设置为 4。可以使用 `.pylintrc` 将其设置为不同的值。
+
+```
+[SIMILARITIES]
+min-similarity-lines=3
+```
+
+### Pylint 使代码评审变得简单
+
+如果你厌倦了需要指出一个类太复杂,或者两个不同的函数基本相同的代码评审,请将 Pylint 添加到你的[持续集成][6]配置中,并且只需要对项目复杂性准则的争论一次就行。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/10/python-pylint-introduction
+
+作者:[Moshe Zadka][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/moshez
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/openstack_python_vim_2.jpg?itok=4fza48WU (OpenStack source code (Python) in VIM)
+[2]: https://opensource.com/article/19/5/python-flake8
+[3]: https://opensource.com/article/19/5/python-black
+[4]: https://opensource.com/article/19/5/python-mypy
+[5]: https://pylint.readthedocs.io/en/latest/technical_reference/features.html#design-checker
+[6]: https://opensource.com/business/15/7/six-continuous-integration-tools
diff --git a/published/201910/20191021 Transition to Nftables.md b/published/201910/20191021 Transition to Nftables.md
new file mode 100644
index 0000000000..71aac43603
--- /dev/null
+++ b/published/201910/20191021 Transition to Nftables.md
@@ -0,0 +1,193 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11513-1.html)
+[#]: subject: (Transition to Nftables)
+[#]: via: (https://opensourceforu.com/2019/10/transition-to-nftables/)
+[#]: author: (Vijay Marcel D https://opensourceforu.com/author/vijay-marcel/)
+
+过渡到 nftables
+======
+
+
+
+> 开源世界中的每个主要发行版都在演进,逐渐将 nftables 作为了默认防火墙。换言之,古老的 iptables 现在已经消亡。本文是有关如何构建 nftables 的教程。
+
+当前,有一个与 nftables 兼容的 iptables-nft 后端,但是很快,即使是它也不再提供了。另外,正如 Red Hat 开发人员所指出的那样,有时它可能会错误地转换规则。我们需要知道如何构建自己的 nftables,而不是依赖于 iptables 到 nftables 的转换器。
+
+在 nftables 中,所有地址族都遵循一个规则。与 iptables 不同,nftables 在用户空间中运行,iptables 中的每个模块都运行在内核(空间)中。它很少需要更新内核,并带有一些新功能,例如映射、地址族和字典。
+
+### 地址族
+
+地址族确定要处理的数据包的类型。在 nftables 中有六个地址族,它们是:
+
+* ip
+* ipv6
+* inet
+* arp
+* bridge
+* netdev
+
+在 nftables 中,ipv4 和 ipv6 协议可以被合并为一个称为 inet 的单一地址族。因此,我们不需要指定两个规则:一个用于 ipv4,另一个用于 ipv6。如果未指定地址族,它将默认为 ip 协议,即 ipv4。我们感兴趣的领域是 inet 地址族,因为大多数家庭用户将使用 ipv4 或 ipv6 协议。
+
+### nftables
+
+典型的 nftables 规则包含三个部分:表、链和规则。
+
+表是链和规则的容器。它们由其地址族和名称来标识。链包含 inet/arp/bridge/netdev 等协议所需的规则,并具有三种类型:过滤器、NAT 和路由。nftables 规则可以从脚本加载,也可以在终端键入,然后另存为规则集。
+
+对于家庭用户,默认链为过滤器。inet 系列包含以下钩子:
+
+* Input
+* Output
+* Forward
+* Pre-routing
+* Post-routing
+
+### 使用脚本还是不用?
+
+最大的问题之一是我们是否可以使用防火墙脚本。答案是:这是你自己的选择。这里有一些建议:如果防火墙中有数百条规则,那么最好使用脚本,但是如果你是典型的家庭用户,则可以在终端中键入命令,然后(保存并在重启时)加载规则集。每种选择都有其自身的优缺点。在本文中,我们将在终端中键入它们以构建防火墙。
+
+nftables 使用一个名为 `nft` 的程序来添加、创建、列出、删除和加载规则。确保使用以下命令将 nftables 与 conntrackd 和 netfilter-persistent 软件包一起安装,并删除 iptables:
+
+```
+apt-get install nftables conntrackd netfilter-persistent
+apt-get purge iptables
+```
+
+`nft` 需要以 root 身份运行或使用 `sudo` 运行。使用以下命令分别列出、刷新、删除规则集和加载脚本。
+
+```
+nft list ruleset
+nft flush ruleset
+nft delete table inet filter
+/usr/sbin/nft -f /etc/nftables.conf
+```
+
+### 输入策略
+
+就像 iptables 一样,防火墙将包含三部分:输入(`input`)、转发(`forward`)和输出(`output`)。在终端中,为输入(`input`)策略键入以下命令。在开始之前,请确保已刷新规则集。我们的默认策略将会删除所有内容。我们将在防火墙中使用 inet 地址族。将以下规则以 root 身份添加或使用 `sudo` 运行:
+
+```
+nft add table inet filter
+nft add chain inet filter input { type filter hook input priority 0 \; counter \; policy drop \; }
+```
+
+你会注意到有一个名为 `priority 0` 的东西。这意味着赋予该规则更高的优先级。挂钩通常赋予负整数,这意味着更高的优先级。每个挂钩都有自己的优先级,过滤器链的优先级为 0。你可以检查 nftables Wiki 页面以查看每个挂钩的优先级。
+
+要了解你计算机中的网络接口,请运行以下命令:
+
+```
+ip link show
+```
+
+它将显示已安装的网络接口,一个是本地主机、另一个是以太网端口或无线端口。以太网端口的名称如下所示:`enpXsY`,其中 `X` 和 `Y` 是数字,无线端口也是如此。我们必须允许本地主机的流量,并且仅允许从互联网建立的传入连接。
+
+nftables 具有一项称为裁决语句的功能,用于解析规则。裁决语句为 `accept`、`drop`、`queue`、`jump`、`goto`、`continue` 和 `return`。由于这是一个很简单的防火墙,因此我们将使用 `accept` 或 `drop` 处理数据包。
+
+```
+nft add rule inet filter input iifname lo accept
+nft add rule inet filter input iifname enpXsY ct state new, established, related accept
+```
+
+接下来,我们必须添加规则以保护我们免受隐秘扫描。并非所有的隐秘扫描都是恶意的,但大多数都是。我们必须保护网络免受此类扫描。第一组规则列出了要测试的 TCP 标志。在这些标志中,第二组列出了要与第一组匹配的标志。
+
+```
+nft add rule inet filter input iifname enpXsY tcp flags \& \(syn\|fin\) == \(syn\|fin\) drop
+nft add rule inet filter input iifname enpXsY tcp flags \& \(syn\|rst\) == \(syn\|rst\) drop
+nft add rule inet filter input iifname enpXsY tcp flags \& \(fin\|rst\) == \(fin\|rst\) drop
+nft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|fin\) == fin drop
+nft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|psh\) == psh drop
+nft add rule inet filter input iifname enpXsY tcp flags \& \(ack\|urg\) == urg drop
+```
+
+记住,我们在终端中键入这些命令。因此,我们必须在一些特殊字符之前添加一个反斜杠,以确保终端能够正确解释该斜杠。如果你使用的是脚本,则不需要这样做。
+
+### 关于 ICMP 的警告
+
+互联网控制消息协议(ICMP)是一种诊断工具,因此不应完全丢弃该流量。完全阻止 ICMP 的任何尝试都是不明智的,因为它还会导致停止向我们提供错误消息。仅启用最重要的控制消息,例如回声请求、回声应答、目的地不可达和超时等消息,并拒绝其余消息。回声请求和回声应答是 `ping` 的一部分。在输入策略中,我们仅允许回声应答、而在输出策略中,我们仅允许回声请求。
+
+```
+nft add rule inet filter input iifname enpXsY icmp type { echo-reply, destination-unreachable, time-exceeded } limit rate 1/second accept
+nft add rule inet filter input iifname enpXsY ip protocol icmp drop
+```
+
+最后,我们记录并丢弃所有无效数据包。
+
+```
+nft add rule inet filter input iifname enpXsY ct state invalid log flags all level info prefix \”Invalid-Input: \”
+nft add rule inet filter input iifname enpXsY ct state invalid drop
+```
+
+### 转发和输出策略
+
+在转发和输出策略中,默认情况下我们将丢弃数据包,仅接受已建立连接的数据包。
+
+```
+nft add chain inet filter forward { type filter hook forward priority 0 \; counter \; policy drop \; }
+nft add rule inet filter forward ct state established, related accept
+nft add rule inet filter forward ct state invalid drop
+nft add chain inet filter output { type filter hook output priority 0 \; counter \; policy drop \; }
+```
+
+典型的桌面用户只需要端口 80 和 443 即可访问互联网。最后,允许可接受的 ICMP 协议并在记录无效数据包时丢弃它们。
+
+```
+nft add rule inet filter output oifname enpXsY tcp dport { 80, 443 } ct state established accept
+nft add rule inet filter output oifname enpXsY icmp type { echo-request, destination-unreachable, time-exceeded } limit rate 1/second accept
+nft add rule inet filter output oifname enpXsY ip protocol icmp drop
+nft add rule inet filter output oifname enpXsY ct state invalid log flags all level info prefix \”Invalid-Output: \”
+nft add rule inet filter output oifname enpXsY ct state invalid drop
+```
+
+现在我们必须保存我们的规则集,否则重新启动时它将丢失。为此,请运行以下命令:
+
+```
+sudo nft list ruleset. > /etc/nftables.conf
+```
+
+我们须在引导时加载 nftables,以下将在 systemd 中启用 nftables 服务:
+
+```
+sudo systemctl enable nftables
+```
+
+接下来,编辑 nftables 单元文件以删除 `Execstop` 选项,以避免在每次引导时刷新规则集。该文件通常位于 `/etc/systemd/system/sysinit.target.wants/nftables.service`。现在重新启动nftables:
+
+```
+sudo systemctl restart nftables
+```
+
+### 在 rsyslog 中记录日志
+
+当你记录丢弃的数据包时,它们直接进入 syslog,这使得读取该日志文件非常困难。最好将防火墙日志重定向到单独的文件。在 `/var/log` 目录中创建一个名为 `nftables` 的目录,并在其中创建两个名为 `input.log` 和 `output.log` 的文件,分别存储输入和输出日志。确保系统中已安装 rsyslog。现在转到 `/etc/rsyslog.d` 并创建一个名为 `nftables.conf` 的文件,其内容如下:
+
+```
+:msg,regex,”Invalid-Input: “ -/var/log/nftables/Input.log
+:msg,regex,”Invalid-Output: “ -/var/log/nftables/Output.log & stop
+```
+
+现在,我们必须确保日志是可管理的。为此,使用以下代码在 `/etc/logrotate.d` 中创建另一个名为 `nftables` 的文件:
+
+```
+/var/log/nftables/* { rotate 5 daily maxsize 50M missingok notifempty delaycompress compress postrotate invoke-rc.d rsyslog rotate > /dev/null endscript }
+```
+
+重新启动 nftables。现在,你可以检查你的规则集。如果你觉得在终端中键入每个命令很麻烦,则可以使用脚本来加载 nftables 防火墙。我希望本文对保护你的系统有用。
+
+--------------------------------------------------------------------------------
+
+via: https://opensourceforu.com/2019/10/transition-to-nftables/
+
+作者:[Vijay Marcel D][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensourceforu.com/author/vijay-marcel/
+[b]: https://github.com/lujun9972
+[1]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2017/01/REHfirewall-1.jpg?resize=696%2C481&ssl=1 (REHfirewall)
+[2]: https://i1.wp.com/opensourceforu.com/wp-content/uploads/2017/01/REHfirewall-1.jpg?fit=900%2C622&ssl=1
diff --git a/published/201910/20191022 How to Get the Size of a Directory in Linux.md b/published/201910/20191022 How to Get the Size of a Directory in Linux.md
new file mode 100644
index 0000000000..d5566b7ec0
--- /dev/null
+++ b/published/201910/20191022 How to Get the Size of a Directory in Linux.md
@@ -0,0 +1,183 @@
+[#]: collector: (lujun9972)
+[#]: translator: (lnrCoder)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11503-1.html)
+[#]: subject: (How to Get the Size of a Directory in Linux)
+[#]: via: (https://www.2daygeek.com/find-get-size-of-directory-folder-linux-disk-usage-du-command/)
+[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
+
+如何获取 Linux 中的目录大小
+======
+
+你应该已经注意到,在 Linux 中使用 [ls 命令][1] 列出的目录内容中,目录的大小仅显示 4KB。这个大小正确吗?如果不正确,那它代表什么,又该如何获取 Linux 中的目录或文件夹大小?这是一个默认的大小,是用来存储磁盘上存储目录的元数据的大小。
+
+Linux 上有一些应用程序可以 [获取目录的实际大小][2]。其中,磁盘使用率(`du`)命令已被 Linux 管理员广泛使用。
+
+我将向您展示如何使用各种选项获取文件夹大小。
+
+### 什么是 du 命令?
+
+[du 命令][3] 表示 磁盘使用率。这是一个标准的 Unix 程序,用于估计当前工作目录中的文件空间使用情况。
+
+它使用递归方式总结磁盘使用情况,以获取目录及其子目录的大小。
+
+如同我说的那样, 使用 `ls` 命令时,目录大小仅显示 4KB。参见下面的输出。
+
+```
+$ ls -lh | grep ^d
+
+drwxr-xr-x 3 daygeek daygeek 4.0K Aug 2 13:57 Bank_Details
+drwxr-xr-x 2 daygeek daygeek 4.0K Mar 15 2019 daygeek
+drwxr-xr-x 6 daygeek daygeek 4.0K Feb 16 2019 drive-2daygeek
+drwxr-xr-x 13 daygeek daygeek 4.0K Jan 6 2019 drive-mageshm
+drwxr-xr-x 15 daygeek daygeek 4.0K Sep 29 21:32 Thanu_Photos
+```
+
+### 1) 在 Linux 上如何只获取父目录的大小
+
+使用以下 `du` 命令格式获取给定目录的总大小。在该示例中,我们将得到 `/home/daygeek/Documents` 目录的总大小。
+
+```
+$ du -hs /home/daygeek/Documents
+或
+$ du -h --max-depth=0 /home/daygeek/Documents/
+20G /home/daygeek/Documents
+```
+
+详细说明:
+
+ * `du` – 这是一个命令
+ * `-h` – 以易读的格式显示大小 (例如 1K 234M 2G)
+ * `-s` – 仅显示每个参数的总数
+ * `--max-depth=N` – 目录的打印深度
+
+### 2) 在 Linux 上如何获取每个目录的大小
+
+使用以下 `du` 命令格式获取每个目录(包括子目录)的总大小。
+
+在该示例中,我们将获得每个 `/home/daygeek/Documents` 目录及其子目录的总大小。
+
+```
+$ du -h /home/daygeek/Documents/ | sort -rh | head -20
+
+20G /home/daygeek/Documents/
+9.6G /home/daygeek/Documents/drive-2daygeek
+6.3G /home/daygeek/Documents/Thanu_Photos
+5.3G /home/daygeek/Documents/Thanu_Photos/Camera
+5.3G /home/daygeek/Documents/drive-2daygeek/Thanu-videos
+3.2G /home/daygeek/Documents/drive-mageshm
+2.3G /home/daygeek/Documents/drive-2daygeek/Thanu-Photos
+2.2G /home/daygeek/Documents/drive-2daygeek/Thanu-photos-by-month
+916M /home/daygeek/Documents/drive-mageshm/Tanisha
+454M /home/daygeek/Documents/drive-mageshm/2g-backup
+415M /home/daygeek/Documents/Thanu_Photos/WhatsApp Video
+300M /home/daygeek/Documents/drive-2daygeek/Thanu-photos-by-month/Jan-2017
+288M /home/daygeek/Documents/drive-2daygeek/Thanu-photos-by-month/Oct-2017
+226M /home/daygeek/Documents/drive-2daygeek/Thanu-photos-by-month/Sep-2017
+219M /home/daygeek/Documents/Thanu_Photos/WhatsApp Documents
+213M /home/daygeek/Documents/drive-mageshm/photos
+163M /home/daygeek/Documents/Thanu_Photos/WhatsApp Video/Sent
+161M /home/daygeek/Documents/Thanu_Photos/WhatsApp Images
+154M /home/daygeek/Documents/drive-2daygeek/Thanu-photos-by-month/June-2017
+150M /home/daygeek/Documents/drive-2daygeek/Thanu-photos-by-month/Nov-2016
+```
+
+### 3) 在 Linux 上如何获取每个目录的摘要
+
+使用如下 `du` 命令格式仅获取每个目录的摘要。
+
+```
+$ du -hs /home/daygeek/Documents/* | sort -rh | head -10
+
+9.6G /home/daygeek/Documents/drive-2daygeek
+6.3G /home/daygeek/Documents/Thanu_Photos
+3.2G /home/daygeek/Documents/drive-mageshm
+756K /home/daygeek/Documents/Bank_Details
+272K /home/daygeek/Documents/user-friendly-zorin-os-15-has-been-released-TouchInterface1.png
+172K /home/daygeek/Documents/user-friendly-zorin-os-15-has-been-released-NightLight.png
+164K /home/daygeek/Documents/ConfigServer Security and Firewall (csf) Cheat Sheet.pdf
+132K /home/daygeek/Documents/user-friendly-zorin-os-15-has-been-released-Todo.png
+112K /home/daygeek/Documents/user-friendly-zorin-os-15-has-been-released-ZorinAutoTheme.png
+96K /home/daygeek/Documents/distro-info.xlsx
+```
+
+### 4) 在 Linux 上如何获取每个目录的不含子目录的大小
+
+使用如下 `du` 命令格式来展示每个目录的总大小,不包括子目录。
+
+```
+$ du -hS /home/daygeek/Documents/ | sort -rh | head -20
+
+5.3G /home/daygeek/Documents/Thanu_Photos/Camera
+5.3G /home/daygeek/Documents/drive-2daygeek/Thanu-videos
+2.3G /home/daygeek/Documents/drive-2daygeek/Thanu-Photos
+1.5G /home/daygeek/Documents/drive-mageshm
+831M /home/daygeek/Documents/drive-mageshm/Tanisha
+454M /home/daygeek/Documents/drive-mageshm/2g-backup
+300M /home/daygeek/Documents/drive-2daygeek/Thanu-photos-by-month/Jan-2017
+288M /home/daygeek/Documents/drive-2daygeek/Thanu-photos-by-month/Oct-2017
+253M /home/daygeek/Documents/Thanu_Photos/WhatsApp Video
+226M /home/daygeek/Documents/drive-2daygeek/Thanu-photos-by-month/Sep-2017
+219M /home/daygeek/Documents/Thanu_Photos/WhatsApp Documents
+213M /home/daygeek/Documents/drive-mageshm/photos
+163M /home/daygeek/Documents/Thanu_Photos/WhatsApp Video/Sent
+154M /home/daygeek/Documents/drive-2daygeek/Thanu-photos-by-month/June-2017
+150M /home/daygeek/Documents/drive-2daygeek/Thanu-photos-by-month/Nov-2016
+127M /home/daygeek/Documents/drive-2daygeek/Thanu-photos-by-month/Dec-2016
+100M /home/daygeek/Documents/drive-2daygeek/Thanu-photos-by-month/Oct-2016
+94M /home/daygeek/Documents/drive-2daygeek/Thanu-photos-by-month/Nov-2017
+92M /home/daygeek/Documents/Thanu_Photos/WhatsApp Images
+90M /home/daygeek/Documents/drive-2daygeek/Thanu-photos-by-month/Dec-2017
+```
+
+### 5) 在 Linux 上如何仅获取一级子目录的大小
+
+如果要获取 Linux 上给定目录的一级子目录(包括其子目录)的大小,请使用以下命令格式。
+
+```
+$ du -h --max-depth=1 /home/daygeek/Documents/
+
+3.2G /home/daygeek/Documents/drive-mageshm
+4.0K /home/daygeek/Documents/daygeek
+756K /home/daygeek/Documents/Bank_Details
+9.6G /home/daygeek/Documents/drive-2daygeek
+6.3G /home/daygeek/Documents/Thanu_Photos
+20G /home/daygeek/Documents/
+```
+
+### 6) 如何在 du 命令输出中获得总计
+
+如果要在 `du` 命令输出中获得总计,请使用以下 `du` 命令格式。
+
+```
+$ du -hsc /home/daygeek/Documents/* | sort -rh | head -10
+
+20G total
+9.6G /home/daygeek/Documents/drive-2daygeek
+6.3G /home/daygeek/Documents/Thanu_Photos
+3.2G /home/daygeek/Documents/drive-mageshm
+756K /home/daygeek/Documents/Bank_Details
+272K /home/daygeek/Documents/user-friendly-zorin-os-15-has-been-released-TouchInterface1.png
+172K /home/daygeek/Documents/user-friendly-zorin-os-15-has-been-released-NightLight.png
+164K /home/daygeek/Documents/ConfigServer Security and Firewall (csf) Cheat Sheet.pdf
+132K /home/daygeek/Documents/user-friendly-zorin-os-15-has-been-released-Todo.png
+112K /home/daygeek/Documents/user-friendly-zorin-os-15-has-been-released-ZorinAutoTheme.png
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/find-get-size-of-directory-folder-linux-disk-usage-du-command/
+
+作者:[Magesh Maruthamuthu][a]
+选题:[lujun9972][b]
+译者:[lnrCoder](https://github.com/lnrCoder)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/magesh/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/linux-unix-ls-command-display-directory-contents/
+[2]: https://www.2daygeek.com/how-to-get-find-size-of-directory-folder-linux/
+[3]: https://www.2daygeek.com/linux-check-disk-usage-files-directories-size-du-command/
diff --git a/published/201910/20191023 Building container images with the ansible-bender tool.md b/published/201910/20191023 Building container images with the ansible-bender tool.md
new file mode 100644
index 0000000000..b4cd0fce3c
--- /dev/null
+++ b/published/201910/20191023 Building container images with the ansible-bender tool.md
@@ -0,0 +1,149 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11518-1.html)
+[#]: subject: (Building container images with the ansible-bender tool)
+[#]: via: (https://opensource.com/article/19/10/building-container-images-ansible)
+[#]: author: (Tomas Tomecek https://opensource.com/users/tomastomecek)
+
+使用 ansible-bender 构建容器镜像
+======
+
+> 了解如何使用 Ansible 在容器中执行命令。
+
+
+
+容器和 [Ansible][2] 可以很好地融合在一起:从管理和编排到供应和构建。在本文中,我们将重点介绍构建部分。
+
+如果你熟悉 Ansible,就会知道你可以编写一系列任务,`ansible-playbook` 命令将为你执行这些任务。你知道吗,如果你编写 Dockerfile 并运行 `podman build`,你还可以在容器环境中执行此类命令,并获得相同的结果。
+
+这是一个例子:
+
+```
+- name: Serve our file using httpd
+ hosts: all
+ tasks:
+ - name: Install httpd
+ package:
+ name: httpd
+ state: installed
+ - name: Copy our file to httpd’s webroot
+ copy:
+ src: our-file.txt
+ dest: /var/www/html/
+```
+
+你可以在 Web 服务器本地或容器中执行这个剧本,并且只要你记得先创建 `our-file.txt`,它就可以工作。
+
+但是这里缺少了一些东西。你需要启动(并配置)httpd 以便提供文件。这是容器构建和基础架构供应之间的区别:构建镜像时,你只需准备内容;而运行容器是另一项任务。另一方面,你可以将元数据附加到容器镜像,它会默认运行命令。
+
+这有个工具可以帮助。试试看 `ansible-bender` 怎么样?
+
+```
+$ ansible-bender build the-playbook.yaml fedora:30 our-httpd
+```
+
+该脚本使用 `ansible-bender` 对 Fedora 30 容器镜像执行该剧本,并将生成的容器镜像命名为 `our-httpd`。
+
+但是,当你运行该容器时,它不会启动 httpd,因为它不知道如何操作。你可以通过向该剧本添加一些元数据来解决此问题:
+
+```
+- name: Serve our file using httpd
+ hosts: all
+ vars:
+ ansible_bender:
+ base_image: fedora:30
+ target_image:
+ name: our-httpd
+ cmd: httpd -DFOREGROUND
+ tasks:
+ - name: Install httpd
+ package:
+ name: httpd
+ state: installed
+ - name: Listen on all network interfaces.
+ lineinfile:
+ path: /etc/httpd/conf/httpd.conf
+ regexp: '^Listen '
+ line: Listen 0.0.0.0:80
+ - name: Copy our file to httpd’s webroot
+ copy:
+ src: our-file.txt
+ dest: /var/www/html
+```
+
+现在你可以构建镜像(从这里开始,请以 root 用户身份运行所有命令。目前,Buildah 和 Podman 不会为无 root 容器创建专用网络):
+
+```
+# ansible-bender build the-playbook.yaml
+PLAY [Serve our file using httpd] ****************************************************
+
+TASK [Gathering Facts] ***************************************************************
+ok: [our-httpd-20191004-131941266141-cont]
+
+TASK [Install httpd] *****************************************************************
+loaded from cache: 'f053578ed2d47581307e9ba3f64f4b4da945579a082c6f99bd797635e62befd0'
+skipping: [our-httpd-20191004-131941266141-cont]
+
+TASK [Listen on all network interfaces.] *********************************************
+changed: [our-httpd-20191004-131941266141-cont]
+
+TASK [Copy our file to httpd’s webroot] **********************************************
+changed: [our-httpd-20191004-131941266141-cont]
+
+PLAY RECAP ***************************************************************************
+our-httpd-20191004-131941266141-cont : ok=3 changed=2 unreachable=0 failed=0 skipped=1 rescued=0 ignored=0
+
+Getting image source signatures
+Copying blob sha256:4650c04b851c62897e9c02c6041a0e3127f8253fafa3a09642552a8e77c044c8
+Copying blob sha256:87b740bba596291af8e9d6d91e30a01d5eba9dd815b55895b8705a2acc3a825e
+Copying blob sha256:82c21252bd87532e93e77498e3767ac2617aa9e578e32e4de09e87156b9189a0
+Copying config sha256:44c6dc6dda1afe28892400c825de1c987c4641fd44fa5919a44cf0a94f58949f
+Writing manifest to image destination
+Storing signatures
+44c6dc6dda1afe28892400c825de1c987c4641fd44fa5919a44cf0a94f58949f
+Image 'our-httpd' was built successfully \o/
+```
+
+镜像构建完毕,可以运行容器了:
+
+```
+# podman run our-httpd
+AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.88.2.106. Set the 'ServerName' directive globally to suppress this message
+```
+
+是否提供文件了?首先,找出你容器的 IP:
+
+```
+# podman inspect -f '{{ .NetworkSettings.IPAddress }}' 7418570ba5a0
+10.88.2.106
+```
+
+你现在可以检查了:
+
+```
+$ curl http://10.88.2.106/our-file.txt
+Ansible is ❤
+```
+
+你文件内容是什么?
+
+这只是使用 Ansible 构建容器镜像的介绍。如果你想了解有关 `ansible-bender` 可以做什么的更多信息,请查看它的 [GitHub][3] 页面。构建快乐!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/10/building-container-images-ansible
+
+作者:[Tomas Tomecek][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/tomastomecek
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/blocks_building.png?itok=eMOT-ire (Blocks for building)
+[2]: https://www.ansible.com/
+[3]: https://github.com/ansible-community/ansible-bender
diff --git a/published/201910/20191023 Using SSH port forwarding on Fedora.md b/published/201910/20191023 Using SSH port forwarding on Fedora.md
new file mode 100644
index 0000000000..e2a66912a4
--- /dev/null
+++ b/published/201910/20191023 Using SSH port forwarding on Fedora.md
@@ -0,0 +1,106 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11515-1.html)
+[#]: subject: (Using SSH port forwarding on Fedora)
+[#]: via: (https://fedoramagazine.org/using-ssh-port-forwarding-on-fedora/)
+[#]: author: (Paul W. Frields https://fedoramagazine.org/author/pfrields/)
+
+在 Fedora 上使用 SSH 端口转发
+======
+
+
+
+你可能已经熟悉使用 [ssh 命令][2]访问远程系统。`ssh` 命令背后所使用的协议允许终端的输入和输出流经[安全通道][3]。但是你知道也可以使用 `ssh` 来安全地发送和接收其他数据吗?一种方法是使用“端口转发”,它允许你在进行 `ssh` 会话时安全地连接网络端口。本文向你展示了它是如何工作的。
+
+### 关于端口
+
+标准 Linux 系统已分配了一组网络端口,范围是 0 - 65535。系统会保留 0 - 1023 的端口以供系统使用。在许多系统中,你不能选择使用这些低端口号。通常有几个端口用于运行特定的服务。你可以在系统的 `/etc/services` 文件中找到这些定义。
+
+你可以认为网络端口是类似的物理端口或可以连接到电缆的插孔。端口可以连接到系统上的某种服务,类似物理插孔后面的接线。一个例子是 Apache Web 服务器(也称为 `httpd`)。对于 HTTP 非安全连接,Web 服务器通常要求在主机系统上使用端口 80,对于 HTTPS 安全连接通常要求使用 443。
+
+当你连接到远程系统(例如,使用 Web 浏览器)时,你是将浏览器“连接”到你的主机上的端口。这通常是一个随机的高端口号,例如 54001。你的主机上的端口连接到远程主机上的端口(例如 443)来访问其安全的 Web 服务器。
+
+那么,当你有这么多可用端口时,为什么还要使用端口转发呢?这是 Web 开发人员生活中的几种常见情况。
+
+### 本地端口转发
+
+想象一下,你正在名为 `remote.example.com` 的远程系统上进行 Web 开发。通常,你是通过 `ssh` 进入此系统的,但是它位于防火墙后面,而且该防火墙很少允许其他类型的访问,并且会阻塞大多数其他端口。要尝试你的网络应用,能够使用浏览器访问远程系统会很有帮助。但是,由于使用了讨厌的防火墙,你无法通过在浏览器中输入 URL 的常规方法来访问它。
+
+本地转发使你可以通过 `ssh` 连接来建立可通过远程系统访问的端口。该端口在系统上显示为本地端口(因而称为“本地转发”)。
+
+假设你的网络应用在 `remote.example.com` 的 8000 端口上运行。要将那个系统的 8000 端口本地转发到你系统上的 8000 端口,请在开始会话时将 `-L` 选项与 `ssh` 结合使用:
+
+```
+$ ssh -L 8000:localhost:8000 remote.example.com
+```
+
+等等,为什么我们使用 `localhost` 作为转发目标?这是因为从 `remote.example.com` 的角度来看,你是在要求主机使用其自己的端口 8000。(回想一下,任何主机通常可以通过网络连接 `localhost` 而连接到自身。)现在那个端口连接到你系统的 8000 端口了。`ssh` 会话准备就绪后,将其保持打开状态,然后可以在浏览器中键入 `http://localhost:8000` 来查看你的 Web 应用。现在,系统之间的流量可以通过 `ssh` 隧道安全地传输!
+
+如果你有敏锐的眼睛,你可能已经注意到了一些东西。如果我们要 `remote.example.com` 转发到与 `localhost` 不同的主机名怎么办?如果它可以访问该网络上另一个系统上的端口,那么通常可以同样轻松地转发该端口。例如,假设你想访问也在该远程网络中的 `db.example.com` 的 MariaDB 或 MySQL 服务。该服务通常在端口 3306 上运行。因此,即使你无法 `ssh` 到实际的 `db.example.com` 主机,你也可以使用此命令将其转发:
+
+```
+$ ssh -L 3306:db.example.com:3306 remote.example.com
+```
+
+现在,你可以在 `localhost` 上运行 MariaDB 命令,而实际上是在使用 `db.example.com` 主机。
+
+### 远程端口转发
+
+远程转发让你可以进行相反操作。想象一下,你正在为办公室的朋友设计一个 Web 应用,并想向他们展示你的工作。不过,不幸的是,你在咖啡店里工作,并且由于网络设置,他们无法通过网络连接访问你的笔记本电脑。但是,你同时使用着办公室的 `remote.example.com` 系统,并且仍然可在这里登录。你的 Web 应用似乎在本地 5000 端口上运行良好。
+
+远程端口转发使你可以通过 `ssh` 连接从本地系统建立端口的隧道,并使该端口在远程系统上可用。在开始 `ssh` 会话时,只需使用 `-R` 选项:
+
+```
+$ ssh -R 6000:localhost:5000 remote.example.com
+```
+
+现在,当在公司防火墙内的朋友打开浏览器时,他们可以进入 `http://remote.example.com:6000` 查看你的工作。就像在本地端口转发示例中一样,通信通过 `ssh` 会话安全地进行。
+
+默认情况下,`sshd` 守护进程运行在设置的主机上,因此**只有**该主机可以连接它的远程转发端口。假设你的朋友希望能够让其他 `example.com` 公司主机上的人看到你的工作,而他们不在 `remote.example.com` 上。你需要让 `remote.example.com` 主机的所有者将以下选项**之一**添加到 `/etc/ssh/sshd_config` 中:
+
+```
+GatewayPorts yes # 或
+GatewayPorts clientspecified
+```
+
+第一个选项意味着 `remote.example.com` 上的所有网络接口都可以使用远程转发的端口。第二个意味着建立隧道的客户端可以选择地址。默认情况下,此选项设置为 `no`。
+
+使用此选项,你作为 `ssh` 客户端仍必须指定可以共享你这边转发端口的接口。通过在本地端口之前添加网络地址范围来进行此操作。有几种方法可以做到,包括:
+
+```
+$ ssh -R *:6000:localhost:5000 # 所有网络
+$ ssh -R 0.0.0.0:6000:localhost:5000 # 所有网络
+$ ssh -R 192.168.1.15:6000:localhost:5000 # 单个网络
+$ ssh -R remote.example.com:6000:localhost:5000 # 单个网络
+```
+
+### 其他注意事项
+
+请注意,本地和远程系统上的端口号不必相同。实际上,有时你甚至可能无法使用相同的端口。例如,普通用户可能不会在默认设置中转发到系统端口。
+
+另外,可以限制主机上的转发。如果你需要在联网主机上更严格的安全性,那么这你来说可能很重要。 `sshd` 守护程进程的 `PermitOpen` 选项控制是否以及哪些端口可用于 TCP 转发。默认设置为 `any`,这让上面的所有示例都能正常工作。要禁止任何端口转发,请选择 `none`,或仅允许的特定的“主机:端口”。有关更多信息,请在手册页中搜索 `PermitOpen` 来配置 `sshd` 守护进程:
+
+```
+$ man sshd_config
+```
+
+最后,请记住,只有在 `ssh` 会话处于打开状态时才会端口转发。如果需要长时间保持转发活动,请尝试使用 `-N` 选项在后台运行会话。确保控制台已锁定,以防止在你离开控制台时其被篡夺。
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/using-ssh-port-forwarding-on-fedora/
+
+作者:[Paul W. Frields][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/pfrields/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2019/10/ssh-port-forwarding-816x345.jpg
+[2]: https://en.wikipedia.org/wiki/Secure_Shell
+[3]: https://fedoramagazine.org/open-source-ssh-clients/
diff --git a/published/201910/20191025 MX Linux 19 Released With Debian 10.1 ‘Buster- - Other Improvements.md b/published/201910/20191025 MX Linux 19 Released With Debian 10.1 ‘Buster- - Other Improvements.md
new file mode 100644
index 0000000000..1e157e106d
--- /dev/null
+++ b/published/201910/20191025 MX Linux 19 Released With Debian 10.1 ‘Buster- - Other Improvements.md
@@ -0,0 +1,96 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11509-1.html)
+[#]: subject: (MX Linux 19 Released With Debian 10.1 ‘Buster’ & Other Improvements)
+[#]: via: (https://itsfoss.com/mx-linux-19/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+随着 Debian 10.1 “Buster” 的发布,MX Linux 19 也发布了
+======
+
+MX Linux 18 是我在[最佳 Linux 发行版][1]中的主要推荐的发行版之一,特别是当你在考虑 Ubuntu 以外的发行版时。
+
+它基于 Debian 9.6 “Stretch”,具有令人难以置信的快速流畅的体验。
+
+现在,作为该发行版的主要升级版本,MX Linux 19 带来了许多重大改进和变更。在这里,我们将看一下主要亮点。
+
+### MX Linux 19 中的新功能
+
+- [视频](https://player.vimeo.com/video/368459760)
+
+#### Debian 10 “Buster”
+
+这个值得一提,因为 Debian 10 实际上是 MX Linux 18 所基于的 Debian 9.6 “Stretch” 的主要升级。
+
+如果你对 Debian 10 “Buster” 的变化感到好奇,建议你阅读有关 [Debian 10 “Buster” 的新功能][3]的文章。
+
+#### Xfce 桌面 4.14
+
+![MX Linux 19][4]
+
+[Xfce 4.14][5] 正是 Xfce 开发团队提供的最新产品。就个人而言,我不是 Xfce 桌面环境的粉丝,但是当你在 Linux 发行版(尤其是 MX Linux 19)上使用它时,它超快的性能会让你惊叹。
+
+或许你会感兴趣,我们也有一个快速指南来帮助你[自定义 Xfce][6]。
+
+#### 升级的软件包及最新的 Debian 内核 4.19
+
+除了 [GIMP][7]、MESA、Firefox 等的更新软件包之外,它还随附有 Debian “Buster” 可用的最新内核 4.19。
+
+#### 升级的 MX 系列应用
+
+如果你以前使用过 MX Linux,则可能会知道它已经预装了有用的 MX 系列应用,可以帮助你快速完成更多工作。
+
+像 MX-installer 和 MX-packageinstaller 这样的应用程序得到了显著改进。
+
+除了这两个以外,所有其他 MX 工具也已不同程度的进行了更新和修复错误、添加了新的翻译(或只是改善了用户体验)。
+
+#### 其它改进
+
+考虑到这是一次重大升级,很明显,底层的更改要多于表面(包括最新的 antiX live 系统更新)。
+
+你可以在他们的[官方公告][8]中查看更多详细信息。你还可以从开发人员那里观看以下视频,它介绍了 MX Linux 19 中的所有新功能:
+
+- [视频](https://youtu.be/4XVHA4l4Zrc)
+
+### 获取 MX Linux 19
+
+即使是你现在正在使用 MX Linux 18 版本,你也[无法][9]升级到 MX Linux 19。你需要像其他人一样进行全新安装。
+
+你可以从此页面下载 MX Linux 19:
+
+- [下载 MX Linux 19][10]
+
+### 结语
+
+在 MX Linux 18 上,我在使用 WiFi 适配器时遇到了问题,通过[论坛][11]解决了该问题,但看来 MX Linux 19 仍未解决该问题。因此,如果你在安装 MX Linux 19 之后遇到了相同的问题,你可能想要查看一下我的[论坛帖子][11]。
+
+如果你使用的是 MX Linux 18,那么这绝对是一个令人印象深刻的升级。
+
+你尝试过了吗?你对新的 MX Linux 19 版本有何想法?让我知道你在以下评论中的想法。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/mx-linux-19/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://linux.cn/article-11411-1.html
+[2]: https://www.youtube.com/c/itsfoss?sub_confirmation=1
+[3]: https://linux.cn/article-11071-1.html
+[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/mx-linux-19.jpg?ssl=1
+[5]: https://xfce.org/about/news
+[6]: https://itsfoss.com/customize-xfce/
+[7]: https://itsfoss.com/gimp-2-10-release/
+[8]: https://mxlinux.org/blog/mx-19-patito-feo-released/
+[9]: https://mxlinux.org/migration/
+[10]: https://mxlinux.org/download-links/
+[11]: https://forum.mxlinux.org/viewtopic.php?t=52201
diff --git a/published/201910/20191029 Fedora 31 is officially here.md b/published/201910/20191029 Fedora 31 is officially here.md
new file mode 100644
index 0000000000..d3af75f5cd
--- /dev/null
+++ b/published/201910/20191029 Fedora 31 is officially here.md
@@ -0,0 +1,85 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11522-1.html)
+[#]: subject: (Fedora 31 is officially here!)
+[#]: via: (https://fedoramagazine.org/announcing-fedora-31/)
+[#]: author: (Matthew Miller https://fedoramagazine.org/author/mattdm/)
+
+Fedora 31 正式发布
+======
+
+![][1]
+
+这里,我们很荣幸地宣布 Fedora 31 的发布。感谢成千上万的 Fedora 社区成员和贡献者的辛勤工作,我们现在正在庆祝又一次的准时发布。这已成为一种惯例!
+
+如果你只想立即获取它,请立即访问 。要了解详细信息,请继续阅读!
+
+### 工具箱
+
+如果你还没有使用过 [Fedora 工具箱][2],那么现在是尝试一下的好时机。这是用于启动和管理个人工作区容器的简单工具,你可以在一个单独的环境中进行开发或试验。它只需要在命令行运行 `toolbox enter` 就行。
+
+这种容器化的工作流程对于基于 ostree 的 Fedora 变体(如 CoreOS、IoT 和 Silverblue)的用户至关重要,但在任何工作站甚至服务器系统上也非常有用。在接下来的几个月中,希望对该工具及其相关的用户体验进行更多增强,非常欢迎你提供反馈。
+
+### Fedora 风味版
+
+Fedora 的“版本”是针对特定的“展示柜”用途输出的。
+
+Fedora 工作站版本专注于台式机,以及希望获得“可以工作的” Linux 操作系统体验的特定软件开发人员。此版本具有 GNOME 3.34,它带来了显著的性能增强,在功耗较低的硬件上尤其明显。
+
+Fedora 服务器版本以易于部署的方式为系统管理员带来了最新的、最先进的开源服务器软件。
+
+而且,我们还有处于预览状态下的 Fedora CoreOS(一个定义了现代容器世界分类的操作系统)和[Fedora IoT][3](用于“边缘计算”用例)。(敬请期待计划中的给该物联网版本的征集名称的活动!)
+
+当然,我们不仅仅提供的是各种版本。还有面向各种受众和用例的 [Fedora Spins][4] 和 [Labs][5],包括 [Fedora 天文学][6] 版本,为业余和专业的天文学家带来了完整的开源工具链,以及支持各种桌面环境(例如 [KDE Plasma][7] 和 [Xfce][8])。
+
+而且,请不要忘记我们的替代架构 [ARM AArch64、Power 和 S390x][9]。特别要注意的是,我们对包括 Rock960、RockPro64 和 Rock64 在内的 Rockchip 片上系统设备的支持得到了改善,并初步支持了 “[panfrost][10]”,这是一种较新的开源 3D 加速图形驱动程序 Arm Mali "midgard" GPU。
+
+不过,如果你使用的是只支持 32 位的 i686 旧系统,那么该找个替代方案了,[我们的基本系统告别了 32 位 Intel 架构][11]。
+
+### 常规改进
+
+无论你使用哪种 Fedora 版本,你都将获得开源世界所提供的最新版本。遵循 “[First][12]” 准则,我们启用了 CgroupsV2(如果你使用的是 Docker,[请确保检查一下][13])。Glibc 2.30 和 NodeJS 12 是 Fedora 31 中许多更新的软件包之一。而且,我们已经将 `python` 命令切换为 Python 3,请记住,Python 2 在[今年年底][14]生命期就终止了。
+
+我们很高兴你能试用新版本!转到 并立即下载吧。或者,如果你已经在运行 Fedora 操作系统,请遵循简单的[升级说明][15]就行。
+
+### 万一出现问题……
+
+如果遇到问题,请查看 [Fedora 31 常见错误][16]页面,如果有疑问,请访问我们的 [Ask Fedora][17] 用户支持平台。
+
+### 谢谢大家
+
+感谢在此发行周期中成千上万为 Fedora 项目做出贡献的人们,尤其是那些为使该发行版再次按时发行而付出更多努力的人。而且,如果你本周在波特兰参加 [USENIX LISA][18],请在博览会大厅,在 Red Hat、Fedora 和 CentOS 展位找到我。
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/announcing-fedora-31/
+
+作者:[Matthew Miller][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/mattdm/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2019/10/fedora31-816x345.jpg
+[2]: https://docs.fedoraproject.org/en-US/fedora-silverblue/toolbox/
+[3]: https://iot.fedoraproject.org/
+[4]: https://spins.fedoraproject.org/
+[5]: https://labs.fedoraproject.org/
+[6]: https://labs.fedoraproject.org/en/astronomy/
+[7]: https://spins.fedoraproject.org/en/kde/
+[8]: https://spins.fedoraproject.org/en/xfce/
+[9]: https://alt.fedoraproject.org/alt/
+[10]: https://panfrost.freedesktop.org/
+[11]: https://fedoramagazine.org/in-fedora-31-32-bit-i686-is-86ed/
+[12]: https://docs.fedoraproject.org/en-US/project/#_first
+[13]: https://fedoraproject.org/wiki/Common_F31_bugs#Docker_package_no_longer_available_and_will_not_run_by_default_.28due_to_switch_to_cgroups_v2.29
+[14]: https://pythonclock.org/
+[15]: https://docs.fedoraproject.org/en-US/quick-docs/upgrading/
+[16]: https://fedoraproject.org/wiki/Common_F31_bugs
+[17]: http://ask.fedoraproject.org
+[18]: https://www.usenix.org/conference/lisa19
diff --git a/published/20191008 5 Best Password Managers For Linux Desktop.md b/published/20191008 5 Best Password Managers For Linux Desktop.md
new file mode 100644
index 0000000000..ebdda1f376
--- /dev/null
+++ b/published/20191008 5 Best Password Managers For Linux Desktop.md
@@ -0,0 +1,193 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11531-1.html)
+[#]: subject: (5 Best Password Managers For Linux Desktop)
+[#]: via: (https://itsfoss.com/password-managers-linux/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+5 个 Linux 桌面上的最佳密码管理器
+======
+
+> 密码管理器是创建唯一密码并安全存储它们的有用工具,这样你无需记住密码。了解一下适用于 Linux 桌面的最佳密码管理器。
+
+
+
+密码无处不在。网站、论坛、Web 应用等,你需要为其创建帐户和密码。麻烦在于密码,为各个帐户使用相同的密码会带来安全风险,因为[如果其中一个网站遭到入侵,黑客也会在其他网站上尝试相同的电子邮件密码组合][1]。
+
+但是,为所有新帐户设置独有的密码意味着你必须记住所有密码,这对普通人而言不太可能。这就是密码管理器可以提供帮助的地方。
+
+密码管理应用会为你建议/创建强密码,并将其存储在加密的数据库中。你只需要记住密码管理器的主密码即可。
+
+主流的现代浏览器(例如 Mozilla Firefox 和 Google Chrome)内置了密码管理器。这有帮助,但是你只能在浏览器上使用它。
+
+有一些第三方专门的密码管理器,其中一些还提供 Linux 的原生桌面应用。在本文中,我们将筛选出可用于 Linux 的最佳密码管理器。
+
+继续之前,我还建议你仔细阅读 [Linux 的免费密码生成器][2],来为你生成强大的唯一密码。
+
+### Linux 密码管理器
+
+> 可能的非 FOSS 警报!
+
+> 我们优先考虑开源软件(有一些专有软件,请不要讨厌我!),并提供适用于 Linux 的独立桌面应用(GUI)。专有软件已高亮显示。
+
+#### 1、Bitwarden
+
+![][3]
+
+主要亮点:
+
+* 开源
+* 免费供个人使用(可选付费升级)
+* 云服务器的端到端加密
+* 跨平台
+* 有浏览器扩展
+* 命令行工具
+
+Bitwarden 是 Linux 上最令人印象深刻的密码管理器之一。老实说,直到现在我才知道它。我已经从 [LastPass][4] 切换到了它。我能够轻松地从 LastPass 导入数据,而没有任何问题和困难。
+
+付费版本的价格仅为每年 10 美元。这似乎是值得的(我已经为个人使用进行了升级)。
+
+它是一个开源解决方案,因此没有任何可疑之处。你甚至可以将其托管在自己的服务器上,并为你的组织创建密码解决方案。
+
+除此之外,你还将获得所有必需的功能,例如用于登录的两步验证、导入/导出凭据、指纹短语(唯一键)、密码生成器等等。
+
+你可以免费将帐户升级为组织帐户,以便最多与 2 个用户共享你的信息。但是,如果你想要额外的加密存储以及与 5 个用户共享密码的功能,那么付费升级的费用低至每月 1 美元。我认为绝对值得一试!
+
+- [Bitwarden][5]
+
+#### 2、Buttercup
+
+![][6]
+
+主要亮点:
+
+* 开源
+* 免费,没有付费方式。
+* 跨平台
+* 有浏览器扩展
+
+这是 Linux 中的另一个开源密码管理器。Buttercup 可能不是一个非常流行的解决方案。但是,如果你在寻找一种更简单的保存凭据的方法,那么这将是一个不错的开始。
+
+与其他软件不同,你不必对怀疑其云服务器的安全,因为它只支持离线使用并支持连接 [Dropbox][7]、[OwnCloud] [8]、[Nextcloud][9] 和 [WebDAV][10] 等云服务。
+
+因此,如果需要同步数据,那么可以选择云服务。你有不同选择。
+
+- [Buttercup][11]
+
+#### 3、KeePassXC
+
+![][12]
+
+主要亮点:
+
+* 开源
+* 简单的密码管理器
+* 跨平台
+* 没有移动设备支持
+
+KeePassXC 是 [KeePassX][13] 的社区分支,它最初是 Windows 上 [KeePass][14] 的 Linux 移植版本。
+
+除非你没意识到,KeePassX 已经多年没有维护。因此,如果你在寻找简单易用的密码管理器,那么 KeePassXC 是一个不错的选择。KeePassXC 可能不是最漂亮或最好的密码管理器,但它确实可以做到该做的事。
+
+它也是安全和开源的。我认为这值得一试,你说呢?
+
+- [KeePassXC][15]
+
+#### 4、Enpass (非开源)
+
+![][16]
+
+主要亮点:
+
+* 专有软件
+* 有许多功能,包括对“可穿戴”设备支持。
+* Linux 完全免费(具有付费支持)
+
+Enpass 是非常流行的跨平台密码管理器。即使它不是开源解决方案,但还是有很多人依赖它。因此,至少可以肯定它是可行的。
+
+它提供了很多功能,如果你有可穿戴设备,它也可以支持它,这点很少见。
+
+很高兴能看到 Enpass 积极管理 Linux 发行版的软件包。另外,请注意,它仅适用于 64 位系统。你可以在它的网站上找到[官方的安装说明] [17]。它需要使用终端,但是我按照步骤进行了测试,它非常好用。
+
+- [Enpass][18]
+
+#### 5、myki (非开源)
+
+![][19]
+
+主要亮点:
+
+* 专有软件
+* 不使用云服务器存储密码
+* 专注于本地点对点同步
+* 能够在移动设备上用指纹 ID 替换密码
+
+这可能不是一个受欢迎的建议,但我发现它很有趣。它是专有软件密码管理器,它让你避免使用云服务器,而是依靠点对点同步。
+
+因此,如果你不想使用任何云服务器来存储你的信息,那么它适合你。另外值得注意的是,用于 Android 和 iOS 的程序可让你用指纹 ID 替换密码。如果你希望便于在手机上使用,又有桌面密码管理器的基本功能,这似乎是个不错的选择。
+
+但是,如果你选择升级到付费版,这有个付费计划供你判断,绝对不便宜。
+
+尝试一下,让我们知道它如何!
+
+- [myki][20]
+
+### 其他一些值得说的密码管理器
+
+即使没有为 Linux 提供独立的应用,但仍有一些密码管理器值得一提。
+
+如果你需要使用基于浏览器的(扩展)密码管理器,建议你尝试使用 [LastPass][21]、[Dashlane][22] 和 [1Password][23]。LastPass 甚至提供了 [Linux 客户端(和命令行工具)][24]。
+
+如果你正在寻找命令行密码管理器,那你应该试试 [Pass][25]。
+
+[Password Safe][26] 也是种选择,但它的 Linux 客户端还处于 beta 阶段。我不建议依靠 “beta” 程序来存储密码。还有 [Universal Password Manager][27],但它不再维护。你可能也听说过 [Password Gorilla][28],但并它没有积极维护。
+
+### 总结
+
+目前,Bitwarden 似乎是我个人的最爱。但是,在 Linux 上有几个替代品可供选择。你可以选择提供原生应用的程序,也可选择浏览器插件,选择权在你。
+
+如果我有错过值得尝试的密码管理器,请在下面的评论中告诉我们。与往常一样,我们会根据你的建议扩展列表。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/password-managers-linux/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://medium.com/@computerphonedude/one-of-my-old-passwords-was-hacked-on-6-different-sites-and-i-had-no-clue-heres-how-to-quickly-ced23edf3b62
+[2]: https://itsfoss.com/password-generators-linux/
+[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/bitward.png?ssl=1
+[4]: https://www.lastpass.com/
+[5]: https://bitwarden.com/
+[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/09/buttercup.png?ssl=1
+[7]: https://www.dropbox.com/
+[8]: https://owncloud.com/
+[9]: https://nextcloud.com/
+[10]: https://en.wikipedia.org/wiki/WebDAV
+[11]: https://buttercup.pw/
+[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/KeePassXC.png?ssl=1
+[13]: https://www.keepassx.org/
+[14]: https://keepass.info/
+[15]: https://keepassxc.org
+[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/09/enpass.png?ssl=1
+[17]: https://www.enpass.io/support/kb/general/how-to-install-enpass-on-linux/
+[18]: https://www.enpass.io/
+[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/09/myki.png?ssl=1
+[20]: https://myki.com/
+[21]: https://lastpass.com/
+[22]: https://www.dashlane.com/
+[23]: https://1password.com/
+[24]: https://lastpass.com/misc_download2.php
+[25]: https://www.passwordstore.org/
+[26]: https://pwsafe.org/
+[27]: http://upm.sourceforge.net/
+[28]: https://github.com/zdia/gorilla/wiki
diff --git a/published/20191013 How to Enable EPEL Repository on CentOS 8 and RHEL 8 Server.md b/published/20191013 How to Enable EPEL Repository on CentOS 8 and RHEL 8 Server.md
new file mode 100644
index 0000000000..c71aa58995
--- /dev/null
+++ b/published/20191013 How to Enable EPEL Repository on CentOS 8 and RHEL 8 Server.md
@@ -0,0 +1,166 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11535-1.html)
+[#]: subject: (How to Enable EPEL Repository on CentOS 8 and RHEL 8 Server)
+[#]: via: (https://www.linuxtechi.com/enable-epel-repo-centos8-rhel8-server/)
+[#]: author: (Pradeep Kumar https://www.linuxtechi.com/author/pradeep/)
+
+如何在 CentOS 8 和 RHEL 8 服务器上启用 EPEL 仓库
+======
+
+EPEL 代表 “Extra Packages for Enterprise Linux”,它是一个自由开源的附加软件包仓库,可用于 CentOS 和 RHEL 服务器。顾名思义,EPEL 仓库提供了额外的软件包,这些软件在 [CentOS 8][1] 和 [RHEL 8][2] 的默认软件包仓库中不可用。
+
+在本文中,我们将演示如何在 CentOS 8 和 RHEL 8 服务器上启用和使用 EPEL 存储库。
+
+
+
+### EPEL 仓库的先决条件
+
+ * 最小化安装的 CentOS 8 和 RHEL 8 服务器
+ * root 或 sudo 管理员权限
+ * 网络连接
+
+### 在 RHEL 8.x 服务器上安装并启用 EPEL 仓库
+
+登录或 SSH 到你的 RHEL 8.x 服务器,并执行以下 `dnf` 命令来安装 EPEL rpm 包,
+
+```
+[root@linuxtechi ~]# dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm -y
+```
+
+上面命令的输出将如下所示,
+
+![dnf-install-epel-repo-rehl8][5]
+
+EPEL rpm 包成功安装后,它将自动启用并配置其 yum/dnf 仓库。运行以下 `dnf` 或 `yum` 命令,以验证是否启用了 EPEL 仓库,
+
+```
+[root@linuxtechi ~]# dnf repolist epel
+或者
+[root@linuxtechi ~]# dnf repolist epel -v
+```
+
+![epel-repolist-rhel8][6]
+
+### 在 CentOS 8.x 服务器上安装并启用 EPEL 仓库
+
+登录或 SSH 到你的 CentOS 8 服务器,并执行以下 `dnf` 或 `yum` 命令来安装 `epel-release` rpm 软件包。在 CentOS 8 服务器中,EPEL rpm 在其默认软件包仓库中。
+
+```
+[root@linuxtechi ~]# dnf install epel-release -y
+或者
+[root@linuxtechi ~]# yum install epel-release -y
+```
+
+执行以下命令来验证 CentOS 8 服务器上 EPEL 仓库的状态,
+
+```
+[root@linuxtechi ~]# dnf repolist epel
+Last metadata expiration check: 0:00:03 ago on Sun 13 Oct 2019 04:18:05 AM BST.
+repo id repo name status
+*epel Extra Packages for Enterprise Linux 8 - x86_64 1,977
+[root@linuxtechi ~]#
+[root@linuxtechi ~]# dnf repolist epel -v
+……………………
+Repo-id : epel
+Repo-name : Extra Packages for Enterprise Linux 8 - x86_64
+Repo-status : enabled
+Repo-revision: 1570844166
+Repo-updated : Sat 12 Oct 2019 02:36:32 AM BST
+Repo-pkgs : 1,977
+Repo-size : 2.1 G
+Repo-metalink: https://mirrors.fedoraproject.org/metalink?repo=epel-8&arch=x86_64&infra=stock&content=centos
+ Updated : Sun 13 Oct 2019 04:28:24 AM BST
+Repo-baseurl : rsync://repos.del.extreme-ix.org/epel/8/Everything/x86_64/ (34 more)
+Repo-expire : 172,800 second(s) (last: Sun 13 Oct 2019 04:28:24 AM BST)
+Repo-filename: /etc/yum.repos.d/epel.repo
+Total packages: 1,977
+[root@linuxtechi ~]#
+```
+
+以上命令的输出说明我们已经成功启用了 EPEL 仓库。让我们在 EPEL 仓库上执行一些基本操作。
+
+### 列出 EPEL 仓库种所有可用包
+
+如果要列出 EPEL 仓库中的所有的软件包,请运行以下 `dnf` 命令,
+
+```
+[root@linuxtechi ~]# dnf repository-packages epel list
+……………
+Last metadata expiration check: 0:38:18 ago on Sun 13 Oct 2019 04:28:24 AM BST.
+Installed Packages
+epel-release.noarch 8-6.el8 @epel
+Available Packages
+BackupPC.x86_64 4.3.1-2.el8 epel
+BackupPC-XS.x86_64 0.59-3.el8 epel
+CGSI-gSOAP.x86_64 1.3.11-7.el8 epel
+CGSI-gSOAP-devel.x86_64 1.3.11-7.el8 epel
+Field3D.x86_64 1.7.2-16.el8 epel
+Field3D-devel.x86_64 1.7.2-16.el8 epel
+GraphicsMagick.x86_64 1.3.33-1.el8 epel
+GraphicsMagick-c++.x86_64 1.3.33-1.el8 epel
+…………………………
+zabbix40-web-mysql.noarch 4.0.12-1.el8 epel
+zabbix40-web-pgsql.noarch 4.0.12-1.el8 epel
+zerofree.x86_64 1.1.1-3.el8 epel
+zimg.x86_64 2.8-4.el8 epel
+zimg-devel.x86_64 2.8-4.el8 epel
+zstd.x86_64 1.4.2-1.el8 epel
+zvbi.x86_64 0.2.35-9.el8 epel
+zvbi-devel.x86_64 0.2.35-9.el8 epel
+zvbi-fonts.noarch 0.2.35-9.el8 epel
+[root@linuxtechi ~]#
+```
+
+### 从 EPEL 仓库中搜索软件包
+
+假设我们要搜索 EPEL 仓库中的 Zabbix 包,请执行以下 `dnf` 命令,
+
+```
+[root@linuxtechi ~]# dnf repository-packages epel list | grep -i zabbix
+```
+
+上面命令的输出类似下面这样,
+
+![epel-repo-search-package-centos8][7]
+
+### 从 EPEL 仓库安装软件包
+
+假设我们要从 EPEL 仓库安装 htop 包,运行以下 `dnf` 命令,
+
+语法:
+
+```
+# dnf –enablerepo=”epel” install <包名>
+```
+
+```
+[root@linuxtechi ~]# dnf --enablerepo="epel" install htop -y
+```
+
+注意:如果我们在上面的命令中未指定 `–enablerepo=epel`,那么它将在所有可用的软件包仓库中查找 htop 包。
+
+本文就是这些内容了,我希望上面的步骤能帮助你在 CentOS 8 和 RHEL 8 服务器上启用并配置 EPEL 仓库,请在下面的评论栏分享你的评论和反馈。
+
+--------------------------------------------------------------------------------
+
+via: https://www.linuxtechi.com/enable-epel-repo-centos8-rhel8-server/
+
+作者:[Pradeep Kumar][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linuxtechi.com/author/pradeep/
+[b]: https://github.com/lujun9972
+[1]: https://www.linuxtechi.com/centos-8-installation-guide-screenshots/
+[2]: https://www.linuxtechi.com/install-configure-kvm-on-rhel-8/
+[3]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[4]: https://www.linuxtechi.com/wp-content/uploads/2019/10/EPEL-Repo-CentOS8-RHEL8.jpg
+[5]: https://www.linuxtechi.com/wp-content/uploads/2019/10/dnf-install-epel-repo-rehl8.jpg
+[6]: https://www.linuxtechi.com/wp-content/uploads/2019/10/epel-repolist-rhel8.jpg
+[7]: https://www.linuxtechi.com/wp-content/uploads/2019/10/epel-repo-search-package-centos8.jpg
diff --git a/published/20191018 How to use Protobuf for data interchange.md b/published/20191018 How to use Protobuf for data interchange.md
new file mode 100644
index 0000000000..cecba89611
--- /dev/null
+++ b/published/20191018 How to use Protobuf for data interchange.md
@@ -0,0 +1,489 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11600-1.html)
+[#]: subject: (How to use Protobuf for data interchange)
+[#]: via: (https://opensource.com/article/19/10/protobuf-data-interchange)
+[#]: author: (Marty Kalin https://opensource.com/users/mkalindepauledu)
+
+如何使用 Protobuf 做数据交换
+======
+
+> 在以不同语言编写并在不同平台上运行的应用程序之间交换数据时,Protobuf 编码可提高效率。
+
+
+
+协议缓冲区([Protobufs][2])像 XML 和 JSON 一样,可以让用不同语言编写并在不同平台上运行的应用程序交换数据。例如,用 Go 编写的发送程序可以在 Protobuf 中对以 Go 表示的销售订单数据进行编码,然后用 Java 编写的接收方可以对它进行解码,以获取所接收订单数据的 Java 表示方式。这是在网络连接上的结构示意图:
+
+> Go 销售订单 ---> Pbuf 编码 ---> 网络 ---> Pbuf 界面 ---> Java 销售订单
+
+与 XML 和 JSON 相比,Protobuf 编码是二进制而不是文本,这会使调试复杂化。但是,正如本文中的代码示例所确认的那样,Protobuf 编码在大小上比 XML 或 JSON 编码要有效得多。
+
+Protobuf 以另一种方式提供了这种有效性。在实现级别,Protobuf 和其他编码系统对结构化数据进行序列化和反序列化。序列化将特定语言的数据结构转换为字节流,反序列化是将字节流转换回特定语言的数据结构的逆运算。序列化和反序列化可能成为数据交换的瓶颈,因为这些操作会占用大量 CPU。高效的序列化和反序列化是 Protobuf 的另一个设计目标。
+
+最近的编码技术,例如 Protobuf 和 FlatBuffers,源自 1990 年代初期的 [DCE/RPC][3](分布式计算环境/远程过程调用)计划。与 DCE/RPC 一样,Protobuf 在数据交换中为 [IDL][4](接口定义语言)和编码层做出了贡献。
+
+本文将着眼于这两层,然后提供 Go 和 Java 中的代码示例以充实 Protobuf 的细节,并表明 Protobuf 是易于使用的。
+
+### Protobuf 作为一个 IDL 和编码层
+
+像 Protobuf 一样,DCE/RPC 被设计为与语言和平台无关。适当的库和实用程序允许任何语言和平台用于 DCE/RPC 领域。此外,DCE/RPC 体系结构非常优雅。IDL 文档是一侧的远程过程与另一侧的调用者之间的协定。Protobuf 也是以 IDL 文档为中心的。
+
+IDL 文档是文本,在 DCE/RPC 中,使用基本 C 语法以及元数据的语法扩展(方括号)和一些新的关键字,例如 `interface`。这是一个例子:
+
+```
+[uuid (2d6ead46-05e3-11ca-7dd1-426909beabcd), version(1.0)]
+interface echo {
+ const long int ECHO_SIZE = 512;
+ void echo(
+ [in] handle_t h,
+ [in, string] idl_char from_client[ ],
+ [out, string] idl_char from_service[ECHO_SIZE]
+ );
+}
+```
+
+该 IDL 文档声明了一个名为 `echo` 的过程,该过程带有三个参数:类型为 `handle_t`(实现指针)和 `idl_char`(ASCII 字符数组)的 `[in]` 参数被传递给远程过程,而 `[out]` 参数(也是一个字符串)从该过程中传回。在此示例中,`echo` 过程不会显式返回值(`echo` 左侧的 `void`),但也可以返回值。返回值,以及一个或多个 `[out]` 参数,允许远程过程任意返回许多值。下一节将介绍 Protobuf IDL,它的语法不同,但同样用作数据交换中的协定。
+
+DCE/RPC 和 Protobuf 中的 IDL 文档是创建用于交换数据的基础结构代码的实用程序的输入:
+
+> IDL 文档 ---> DCE/PRC 或 Protobuf 实用程序 ---> 数据交换的支持代码
+
+作为相对简单的文本,IDL 是同样便于人类阅读的关于数据交换细节的文档(特别是交换的数据项的数量和每个项的数据类型)。
+
+Protobuf 可用于现代 RPC 系统,例如 [gRPC][5];但是 Protobuf 本身仅提供 IDL 层和编码层,用于从发送者传递到接收者的消息。与原本的 DCE/RPC 一样,Protobuf 编码是二进制的,但效率更高。
+
+目前,XML 和 JSON 编码仍在通过 Web 服务等技术进行的数据交换中占主导地位,这些技术利用 Web 服务器、传输协议(例如 TCP、HTTP)以及标准库和实用程序等原有的基础设施来处理 XML 和 JSON 文档。 此外,各种类型的数据库系统可以存储 XML 和 JSON 文档,甚至旧式关系型系统也可以轻松生成查询结果的 XML 编码。现在,每种通用编程语言都具有支持 XML 和 JSON 的库。那么,是什么让我们回到 Protobuf 之类的**二进制**编码系统呢?
+
+让我们看一下负十进制值 `-128`。以 2 的补码二进制表示形式(在系统和语言中占主导地位)中,此值可以存储在单个 8 位字节中:`10000000`。此整数值在 XML 或 JSON 中的文本编码需要多个字节。例如,UTF-8 编码需要四个字节的字符串,即 `-128`,即每个字符一个字节(十六进制,值为 `0x2d`、`0x31`、`0x32` 和 `0x38`)。XML 和 JSON 还添加了标记字符,例如尖括号和大括号。有关 Protobuf 编码的详细信息下面就会介绍,但现在的关注点是一个通用点:文本编码的压缩性明显低于二进制编码。
+
+### 在 Go 中使用 Protobuf 的示例
+
+我的代码示例着重于 Protobuf 而不是 RPC。以下是第一个示例的概述:
+
+* 名为 `dataitem.proto` 的 IDL 文件定义了一个 Protobuf 消息,它具有六个不同类型的字段:具有不同范围的整数值、固定大小的浮点值以及两个不同长度的字符串。
+* Protobuf 编译器使用 IDL 文件生成 Go 版本(以及后面的 Java 版本)的 Protobuf 消息及支持函数。
+* Go 应用程序使用随机生成的值填充原生的 Go 数据结构,然后将结果序列化为本地文件。为了进行比较, XML 和 JSON 编码也被序列化为本地文件。
+* 作为测试,Go 应用程序通过反序列化 Protobuf 文件的内容来重建其原生数据结构的实例。
+* 作为语言中立性测试,Java 应用程序还会对 Protobuf 文件的内容进行反序列化以获取原生数据结构的实例。
+
+[我的网站][6]上提供了该 IDL 文件以及两个 Go 和一个 Java 源文件,打包为 ZIP 文件。
+
+最重要的 Protobuf IDL 文档如下所示。该文档存储在文件 `dataitem.proto` 中,并具有常规的`.proto` 扩展名。
+
+#### 示例 1、Protobuf IDL 文档
+
+```
+syntax = "proto3";
+
+package main;
+
+message DataItem {
+ int64 oddA = 1;
+ int64 evenA = 2;
+ int32 oddB = 3;
+ int32 evenB = 4;
+ float small = 5;
+ float big = 6;
+ string short = 7;
+ string long = 8;
+}
+```
+
+该 IDL 使用当前的 proto3 而不是较早的 proto2 语法。软件包名称(在本例中为 `main`)是可选的,但是惯例使用它以避免名称冲突。这个结构化的消息包含八个字段,每个字段都有一个 Protobuf 数据类型(例如,`int64`、`string`)、名称(例如,`oddA`、`short`)和一个等号 `=` 之后的数字标签(即键)。标签(在此示例中为 1 到 8)是唯一的整数标识符,用于确定字段序列化的顺序。
+
+Protobuf 消息可以嵌套到任意级别,而一个消息可以是另外一个消息的字段类型。这是一个使用 `DataItem` 消息作为字段类型的示例:
+
+```
+message DataItems {
+ repeated DataItem item = 1;
+}
+```
+
+单个 `DataItems` 消息由重复的(零个或多个)`DataItem` 消息组成。
+
+为了清晰起见,Protobuf 还支持枚举类型:
+
+```
+enum PartnershipStatus {
+ reserved "FREE", "CONSTRAINED", "OTHER";
+}
+```
+
+`reserved` 限定符确保用于实现这三个符号名的数值不能重复使用。
+
+为了生成一个或多个声明 Protobuf 消息结构的特定于语言的版本,包含这些结构的 IDL 文件被传递到`protoc` 编译器(可在 [Protobuf GitHub 存储库][7]中找到)。对于 Go 代码,可以以通常的方式安装支持的 Protobuf 库(这里以 `%` 作为命令行提示符):
+
+```
+% go get github.com/golang/protobuf/proto
+```
+
+将 Protobuf IDL 文件 `dataitem.proto` 编译为 Go 源代码的命令是:
+
+```
+% protoc --go_out=. dataitem.proto
+```
+
+标志 `--go_out` 指示编译器生成 Go 源代码。其他语言也有类似的标志。在这种情况下,结果是一个名为 `dataitem.pb.go` 的文件,该文件足够小,可以将其基本内容复制到 Go 应用程序中。以下是生成的代码的主要部分:
+
+```
+var _ = proto.Marshal
+
+type DataItem struct {
+ OddA int64 `protobuf:"varint,1,opt,name=oddA" json:"oddA,omitempty"`
+ EvenA int64 `protobuf:"varint,2,opt,name=evenA" json:"evenA,omitempty"`
+ OddB int32 `protobuf:"varint,3,opt,name=oddB" json:"oddB,omitempty"`
+ EvenB int32 `protobuf:"varint,4,opt,name=evenB" json:"evenB,omitempty"`
+ Small float32 `protobuf:"fixed32,5,opt,name=small" json:"small,omitempty"`
+ Big float32 `protobuf:"fixed32,6,opt,name=big" json:"big,omitempty"`
+ Short string `protobuf:"bytes,7,opt,name=short" json:"short,omitempty"`
+ Long string `protobuf:"bytes,8,opt,name=long" json:"long,omitempty"`
+}
+
+func (m *DataItem) Reset() { *m = DataItem{} }
+func (m *DataItem) String() string { return proto.CompactTextString(m) }
+func (*DataItem) ProtoMessage() {}
+func init() {}
+```
+
+编译器生成的代码具有 Go 结构 `DataItem`,该结构导出 Go 字段(名称现已大写开头),该字段与 Protobuf IDL 中声明的名称匹配。该结构字段具有标准的 Go 数据类型:`int32`、`int64`、`float32` 和 `string`。在每个字段行的末尾,是描述 Protobuf 类型的字符串,提供 Protobuf IDL 文档中的数字标签及有关 JSON 信息的元数据,这将在后面讨论。
+
+此外也有函数;最重要的是 `Proto.Marshal`,用于将 `DataItem` 结构的实例序列化为 Protobuf 格式。辅助函数包括:清除 `DataItem` 结构的 `Reset`,生成 `DataItem` 的单行字符串表示的 `String`。
+
+描述 Protobuf 编码的元数据应在更详细地分析 Go 程序之前进行仔细研究。
+
+### Protobuf 编码
+
+Protobuf 消息的结构为键/值对的集合,其中数字标签为键,相应的字段为值。字段名称(例如,`oddA` 和 `small`)是供人类阅读的,但是 `protoc` 编译器的确使用了字段名称来生成特定于语言的对应名称。例如,Protobuf IDL 中的 `oddA` 和 `small` 名称在 Go 结构中分别成为字段 `OddA` 和 `Small`。
+
+键和它们的值都被编码,但是有一个重要的区别:一些数字值具有固定大小的 32 或 64 位的编码,而其他数字(包括消息标签)则是 `varint` 编码的,位数取决于整数的绝对值。例如,整数值 1 到 15 需要 8 位 `varint` 编码,而值 16 到 2047 需要 16 位。`varint` 编码在本质上与 UTF-8 编码类似(但细节不同),它偏爱较小的整数值而不是较大的整数值。(有关详细分析,请参见 Protobuf [编码指南][8])结果是,Protobuf 消息应该在字段中具有较小的整数值(如果可能),并且键数应尽可能少,但每个字段至少得有一个键。
+
+下表 1 列出了 Protobuf 编码的要点:
+
+编码 | 示例类型 | 长度
+---|---|---
+`varint` | `int32`、`uint32`、`int64` | 可变长度
+`fixed` | `fixed32`、`float`、`double` | 固定的 32 位或 64 位长度
+字节序列 | `string`、`bytes` | 序列长度
+
+*表 1. Protobuf 数据类型*
+
+未明确固定长度的整数类型是 `varint` 编码的;因此,在 `varint` 类型中,例如 `uint32`(`u` 代表无符号),数字 32 描述了整数的范围(在这种情况下为 0 到 2^32 - 1),而不是其位的大小,该位大小取决于值。相比之下,对于固定长度类型(例如 `fixed32` 或 `double`),Protobuf 编码分别需要 32 位和 64 位。Protobuf 中的字符串是字节序列;因此,字段编码的大小就是字节序列的长度。
+
+另一个高效的方法值得一提。回想一下前面的示例,其中的 `DataItems` 消息由重复的 `DataItem` 实例组成:
+
+```
+message DataItems {
+ repeated DataItem item = 1;
+}
+```
+
+`repeated` 表示 `DataItem` 实例是*打包的*:集合具有单个标签,在这里是 1。因此,具有重复的 `DataItem` 实例的 `DataItems` 消息比具有多个但单独的 `DataItem` 字段、每个字段都需要自己的标签的消息的效率更高。
+
+了解了这一背景,让我们回到 Go 程序。
+
+### dataItem 程序的细节
+
+`dataItem` 程序创建一个 `DataItem` 实例,并使用适当类型的随机生成的值填充字段。Go 有一个 `rand` 包,带有用于生成伪随机整数和浮点值的函数,而我的 `randString` 函数可以从字符集中生成指定长度的伪随机字符串。设计目标是要有一个具有不同类型和位大小的字段值的 `DataItem` 实例。例如,`OddA` 和 `EvenA` 值分别是 64 位非负整数值的奇数和偶数;但是 `OddB` 和 `EvenB` 变体的大小为 32 位,并存放 0 到 2047 之间的小整数值。随机浮点值的大小为 32 位,字符串为 16(`Short`)和 32(`Long`)字符的长度。这是用随机值填充 `DataItem` 结构的代码段:
+
+```
+// 可变长度整数
+n1 := rand.Int63() // 大整数
+if (n1 & 1) == 0 { n1++ } // 确保其是奇数
+...
+n3 := rand.Int31() % UpperBound // 小整数
+if (n3 & 1) == 0 { n3++ } // 确保其是奇数
+
+// 固定长度浮点数
+...
+t1 := rand.Float32()
+t2 := rand.Float32()
+...
+// 字符串
+str1 := randString(StrShort)
+str2 := randString(StrLong)
+
+// 消息
+dataItem := &DataItem {
+ OddA: n1,
+ EvenA: n2,
+ OddB: n3,
+ EvenB: n4,
+ Big: f1,
+ Small: f2,
+ Short: str1,
+ Long: str2,
+}
+```
+
+创建并填充值后,`DataItem` 实例将以 XML、JSON 和 Protobuf 进行编码,每种编码均写入本地文件:
+
+```
+func encodeAndserialize(dataItem *DataItem) {
+ bytes, _ := xml.MarshalIndent(dataItem, "", " ") // Xml to dataitem.xml
+ ioutil.WriteFile(XmlFile, bytes, 0644) // 0644 is file access permissions
+
+ bytes, _ = json.MarshalIndent(dataItem, "", " ") // Json to dataitem.json
+ ioutil.WriteFile(JsonFile, bytes, 0644)
+
+ bytes, _ = proto.Marshal(dataItem) // Protobuf to dataitem.pbuf
+ ioutil.WriteFile(PbufFile, bytes, 0644)
+}
+```
+
+这三个序列化函数使用术语 `marshal`,它与 `serialize` 意思大致相同。如代码所示,三个 `Marshal` 函数均返回一个字节数组,然后将其写入文件。(为简单起见,忽略可能的错误处理。)在示例运行中,文件大小为:
+
+```
+dataitem.xml: 262 bytes
+dataitem.json: 212 bytes
+dataitem.pbuf: 88 bytes
+```
+
+Protobuf 编码明显小于其他两个编码方案。通过消除缩进字符(在这种情况下为空白和换行符),可以稍微减小 XML 和 JSON 序列化的大小。
+
+以下是 `dataitem.json` 文件,该文件最终是由 `json.MarshalIndent` 调用产生的,并添加了以 `##` 开头的注释:
+
+```
+{
+ "oddA": 4744002665212642479, ## 64-bit >= 0
+ "evenA": 2395006495604861128, ## ditto
+ "oddB": 57, ## 32-bit >= 0 but < 2048
+ "evenB": 468, ## ditto
+ "small": 0.7562016, ## 32-bit floating-point
+ "big": 0.85202795, ## ditto
+ "short": "ClH1oDaTtoX$HBN5", ## 16 random chars
+ "long": "xId0rD3Cri%3Wt%^QjcFLJgyXBu9^DZI" ## 32 random chars
+}
+```
+
+尽管这些序列化的数据写入到本地文件中,但是也可以使用相同的方法将数据写入网络连接的输出流。
+
+### 测试序列化和反序列化
+
+Go 程序接下来通过将先前写入 `dataitem.pbuf` 文件的字节反序列化为 `DataItem` 实例来运行基本测试。这是代码段,其中去除了错误检查部分:
+
+```
+filebytes, err := ioutil.ReadFile(PbufFile) // get the bytes from the file
+...
+testItem.Reset() // clear the DataItem structure
+err = proto.Unmarshal(filebytes, testItem) // deserialize into a DataItem instance
+```
+
+用于 Protbuf 反序列化的 `proto.Unmarshal` 函数与 `proto.Marshal` 函数相反。原始的 `DataItem` 和反序列化的副本将被打印出来以确认完全匹配:
+
+```
+Original:
+2041519981506242154 3041486079683013705 1192 1879
+0.572123 0.326855
+boPb#T0O8Xd&Ps5EnSZqDg4Qztvo7IIs 9vH66AiGSQgCDxk&
+
+Deserialized:
+2041519981506242154 3041486079683013705 1192 1879
+0.572123 0.326855
+boPb#T0O8Xd&Ps5EnSZqDg4Qztvo7IIs 9vH66AiGSQgCDxk&
+```
+
+### 一个 Java Protobuf 客户端
+
+用 Java 写的示例是为了确认 Protobuf 的语言中立性。原始 IDL 文件可用于生成 Java 支持代码,其中涉及嵌套类。但是,为了抑制警告信息,可以进行一些补充。这是修订版,它指定了一个 `DataMsg` 作为外部类的名称,内部类在该 Protobuf 消息后面自动命名为 `DataItem`:
+
+```
+syntax = "proto3";
+
+package main;
+
+option java_outer_classname = "DataMsg";
+
+message DataItem {
+...
+```
+
+进行此更改后,`protoc` 编译与以前相同,只是所期望的输出现在是 Java 而不是 Go:
+
+```
+% protoc --java_out=. dataitem.proto
+```
+
+生成的源文件(在名为 `main` 的子目录中)为 `DataMsg.java`,长度约为 1,120 行:Java 并不简洁。编译然后运行 Java 代码需要具有 Protobuf 库支持的 JAR 文件。该文件位于 [Maven 存储库][9]中。
+
+放置好这些片段后,我的测试代码相对较短(并且在 ZIP 文件中以 `Main.java` 形式提供):
+
+```
+package main;
+import java.io.FileInputStream;
+
+public class Main {
+ public static void main(String[] args) {
+ String path = "dataitem.pbuf"; // from the Go program's serialization
+ try {
+ DataMsg.DataItem deserial =
+ DataMsg.DataItem.newBuilder().mergeFrom(new FileInputStream(path)).build();
+
+ System.out.println(deserial.getOddA()); // 64-bit odd
+ System.out.println(deserial.getLong()); // 32-character string
+ }
+ catch(Exception e) { System.err.println(e); }
+ }
+}
+```
+
+当然,生产级的测试将更加彻底,但是即使是该初步测试也可以证明 Protobuf 的语言中立性:`dataitem.pbuf` 文件是 Go 程序对 Go 语言版的 `DataItem` 进行序列化的结果,并且该文件中的字节被反序列化以产生一个 Java 语言的 `DataItem` 实例。Java 测试的输出与 Go 测试的输出相同。
+
+### 用 numPairs 程序来结束
+
+让我们以一个示例作为结尾,来突出 Protobuf 效率,但又强调在任何编码技术中都会涉及到的成本。考虑以下 Protobuf IDL 文件:
+
+```
+syntax = "proto3";
+package main;
+
+message NumPairs {
+ repeated NumPair pair = 1;
+}
+
+message NumPair {
+ int32 odd = 1;
+ int32 even = 2;
+}
+```
+
+`NumPair` 消息由两个 `int32` 值以及每个字段的整数标签组成。`NumPairs` 消息是嵌入的 `NumPair` 消息的序列。
+
+Go 语言的 `numPairs` 程序(如下)创建了 200 万个 `NumPair` 实例,每个实例都附加到 `NumPairs` 消息中。该消息可以按常规方式进行序列化和反序列化。
+
+#### 示例 2、numPairs 程序
+
+```
+package main
+
+import (
+ "math/rand"
+ "time"
+ "encoding/xml"
+ "encoding/json"
+ "io/ioutil"
+ "github.com/golang/protobuf/proto"
+)
+
+// protoc-generated code: start
+var _ = proto.Marshal
+type NumPairs struct {
+ Pair []*NumPair `protobuf:"bytes,1,rep,name=pair" json:"pair,omitempty"`
+}
+
+func (m *NumPairs) Reset() { *m = NumPairs{} }
+func (m *NumPairs) String() string { return proto.CompactTextString(m) }
+func (*NumPairs) ProtoMessage() {}
+func (m *NumPairs) GetPair() []*NumPair {
+ if m != nil { return m.Pair }
+ return nil
+}
+
+type NumPair struct {
+ Odd int32 `protobuf:"varint,1,opt,name=odd" json:"odd,omitempty"`
+ Even int32 `protobuf:"varint,2,opt,name=even" json:"even,omitempty"`
+}
+
+func (m *NumPair) Reset() { *m = NumPair{} }
+func (m *NumPair) String() string { return proto.CompactTextString(m) }
+func (*NumPair) ProtoMessage() {}
+func init() {}
+// protoc-generated code: finish
+
+var numPairsStruct NumPairs
+var numPairs = &numPairsStruct
+
+func encodeAndserialize() {
+ // XML encoding
+ filename := "./pairs.xml"
+ bytes, _ := xml.MarshalIndent(numPairs, "", " ")
+ ioutil.WriteFile(filename, bytes, 0644)
+
+ // JSON encoding
+ filename = "./pairs.json"
+ bytes, _ = json.MarshalIndent(numPairs, "", " ")
+ ioutil.WriteFile(filename, bytes, 0644)
+
+ // ProtoBuf encoding
+ filename = "./pairs.pbuf"
+ bytes, _ = proto.Marshal(numPairs)
+ ioutil.WriteFile(filename, bytes, 0644)
+}
+
+const HowMany = 200 * 100 * 100 // two million
+
+func main() {
+ rand.Seed(time.Now().UnixNano())
+
+ // uncomment the modulus operations to get the more efficient version
+ for i := 0; i < HowMany; i++ {
+ n1 := rand.Int31() // % 2047
+ if (n1 & 1) == 0 { n1++ } // ensure it's odd
+ n2 := rand.Int31() // % 2047
+ if (n2 & 1) == 1 { n2++ } // ensure it's even
+
+ next := &NumPair {
+ Odd: n1,
+ Even: n2,
+ }
+ numPairs.Pair = append(numPairs.Pair, next)
+ }
+ encodeAndserialize()
+}
+```
+
+每个 `NumPair` 中随机生成的奇数和偶数值的范围在 0 到 20 亿之间变化。就原始数据(而非编码数据)而言,Go 程序中生成的整数总共为 16MB:每个 `NumPair` 为两个整数,总计为 400 万个整数,每个值的大小为四个字节。
+
+为了进行比较,下表列出了 XML、JSON 和 Protobuf 编码的示例 `NumsPairs` 消息的 200 万个 `NumPair` 实例。原始数据也包括在内。由于 `numPairs` 程序生成随机值,因此样本运行的输出有所不同,但接近表中显示的大小。
+
+编码 | 文件 | 字节大小 | Pbuf/其它 比例
+---|---|---|---
+无 | pairs.raw | 16MB | 169%
+Protobuf | pairs.pbuf | 27MB | —
+JSON | pairs.json | 100MB | 27%
+XML | pairs.xml | 126MB | 21%
+
+*表 2. 16MB 整数的编码开销*
+
+不出所料,Protobuf 和之后的 XML 和 JSON 差别明显。Protobuf 编码大约是 JSON 的四分之一,是 XML 的五分之一。但是原始数据清楚地表明 Protobuf 也会产生编码开销:序列化的 Protobuf 消息比原始数据大 11MB。包括 Protobuf 在内的任何编码都涉及结构化数据,这不可避免地会增加字节。
+
+序列化的 200 万个 `NumPair` 实例中的每个实例都包含**四**个整数值:Go 结构中的 `Even` 和 `Odd` 字段分别一个,而 Protobuf 编码中的每个字段、每个标签一个。对于原始数据(而不是编码数据),每个实例将达到 16 个字节,样本 `NumPairs` 消息中有 200 万个实例。但是 Protobuf 标记(如 `NumPair` 字段中的 `int32` 值)使用 `varint` 编码,因此字节长度有所不同。特别是,小的整数值(在这种情况下,包括标签在内)需要不到四个字节进行编码。
+
+如果对 `numPairs` 程序进行了修改,以使两个 `NumPair` 字段的值小于 2048,且其编码为一或两个字节,则 Protobuf 编码将从 27MB 下降到 16MB,这正是原始数据的大小。下表总结了样本运行中的新编码大小。
+
+编码 | 文件 | 字节大小 | Pbuf/其它 比例
+---|---|---|---
+None | pairs.raw | 16MB | 100%
+Protobuf | pairs.pbuf | 16MB | —
+JSON | pairs.json | 77MB | 21%
+XML | pairs.xml | 103MB | 15%
+
+*表 3. 编码 16MB 的小于 2048 的整数*
+
+总之,修改后的 `numPairs` 程序的字段值小于 2048,可减少原始数据中每个四字节整数值的大小。但是 Protobuf 编码仍然需要标签,这些标签会在 Protobuf 消息中添加字节。Protobuf 编码确实会增加消息大小,但是如果要编码相对较小的整数值(无论是字段还是键),则可以通过 `varint` 因子来减少此开销。
+
+对于包含混合类型的结构化数据(且整数值相对较小)的中等大小的消息,Protobuf 明显优于 XML 和 JSON 等选项。在其他情况下,数据可能不适合 Protobuf 编码。例如,如果两个应用程序需要共享大量文本记录或大整数值,则可以采用压缩而不是编码技术。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/10/protobuf-data-interchange
+
+作者:[Marty Kalin][a]
+选题:[lujun9972][b]
+译者:[wxy](https://github.com/wxy)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/mkalindepauledu
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_data_dashboard_system_computer_analytics.png?itok=oxAeIEI- (metrics and data shown on a computer screen)
+[2]: https://developers.google.com/protocol-buffers/
+[3]: https://en.wikipedia.org/wiki/DCE/RPC
+[4]: https://en.wikipedia.org/wiki/Interface_description_language
+[5]: https://grpc.io/
+[6]: http://condor.depaul.edu/mkalin
+[7]: https://github.com/protocolbuffers/protobuf
+[8]: https://developers.google.com/protocol-buffers/docs/encoding
+[9]: https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java
diff --git a/published/20191021 How to program with Bash- Syntax and tools.md b/published/20191021 How to program with Bash- Syntax and tools.md
new file mode 100644
index 0000000000..3f044598b4
--- /dev/null
+++ b/published/20191021 How to program with Bash- Syntax and tools.md
@@ -0,0 +1,251 @@
+[#]: collector: (lujun9972)
+[#]: translator: (jdh8383)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11552-1.html)
+[#]: subject: (How to program with Bash: Syntax and tools)
+[#]: via: (https://opensource.com/article/19/10/programming-bash-part-1)
+[#]: author: (David Both https://opensource.com/users/dboth)
+
+怎样用 Bash 编程:语法和工具
+======
+
+> 让我们通过本系列文章来学习基本的 Bash 编程语法和工具,以及如何使用变量和控制运算符,这是三篇中的第一篇。
+
+
+
+Shell 是操作系统的命令解释器,其中 Bash 是我最喜欢的。每当用户或者系统管理员将命令输入系统的时候,Linux 的 shell 解释器就会把这些命令转换成操作系统可以理解的形式。而执行结果返回 shell 程序后,它会将结果输出到 STDOUT(标准输出),默认情况下,这些结果会[显示在你的终端][2]。所有我熟悉的 shell 同时也是一门编程语言。
+
+Bash 是个功能强大的 shell,包含众多便捷特性,比如:tab 补全、命令回溯和再编辑、别名等。它的命令行默认编辑模式是 Emacs,但是我最喜欢的 Bash 特性之一是我可以将其更改为 Vi 模式,以使用那些储存在我肌肉记忆中的的编辑命令。
+
+然而,如果你把 Bash 当作单纯的 shell 来用,则无法体验它的真实能力。我在设计一套包含三卷的 [Linux 自学课程][3]时(这个系列的文章正是基于此课程),了解到许多 Bash 的知识,这些是我在过去 20 年的 Linux 工作经验中所没有掌握的,其中的一些知识就是关于 Bash 的编程用法。不得不说,Bash 是一门强大的编程语言,是一个能够同时用于命令行和 shell 脚本的完美设计。
+
+本系列文章将要探讨如何使用 Bash 作为命令行界面(CLI)编程语言。第一篇文章简单介绍 Bash 命令行编程、变量以及控制运算符。其他文章会讨论诸如:Bash 文件的类型;字符串、数字和一些逻辑运算符,它们能够提供代码执行流程中的逻辑控制;不同类型的 shell 扩展;通过 `for`、`while` 和 `until` 来控制循环操作。
+
+### Shell
+
+Bash 是 Bourne Again Shell 的缩写,因为 Bash shell 是 [基于][4] 更早的 Bourne shell,后者是 Steven Bourne 在 1977 年开发的。另外还有很多[其他的 shell][5] 可以使用,但下面四个是我经常见到的:
+
+* `csh`:C shell 适合那些习惯了 C 语言语法的开发者。
+* `ksh`:Korn shell,由 David Korn 开发,在 Unix 用户中更流行。
+* `tcsh`:一个 csh 的变种,增加了一些易用性。
+* `zsh`:Z shell,集成了许多其他流行 shell 的特性。
+
+所有 shell 都有内置命令,用以补充或替代核心工具集。打开 shell 的 man 说明页,找到“BUILT-INS”那一段,可以查看都有哪些内置命令。
+
+每种 shell 都有它自己的特性和语法风格。我用过 csh、ksh 和 zsh,但我还是更喜欢 Bash。你可以多试几个,寻找更适合你的 shell,尽管这可能需要花些功夫。但幸运的是,切换不同 shell 很简单。
+
+所有这些 shell 既是编程语言又是命令解释器。下面我们来快速浏览一下 Bash 中集成的编程结构和工具。
+
+### 作为编程语言的 Bash
+
+大多数场景下,系统管理员都会使用 Bash 来发送简单明了的命令。但 Bash 不仅可以输入单条命令,很多系统管理员可以编写简单的命令行程序来执行一系列任务,这些程序可以作为通用工具,能节省时间和精力。
+
+编写 CLI 程序的目的是要提高效率(做一个“懒惰的”系统管理员)。在 CLI 程序中,你可以用特定顺序列出若干命令,逐条执行。这样你就不用盯着显示屏,等待一条命令执行完,再输入另一条,省下来的时间就可以去做其他事情了。
+
+### 什么是“程序”?
+
+自由在线计算机词典([FOLDOC][6])对于程序的定义是:“由计算机执行的指令,而不是运行它们的物理硬件。”普林斯顿大学的 [WordNet][7] 将程序定义为:“……计算机可以理解并执行的一系列指令……”[维基百科][8]上也有一条不错的关于计算机程序的条目。
+
+总结下,程序由一条或多条指令组成,目的是完成一个具体的相关任务。对于系统管理员而言,一段程序通常由一系列的 shell 命令构成。Linux 下所有的 shell (至少我所熟知的)都有基本的编程功能,Bash 作为大多数 linux 发行版的默认 shell,也不例外。
+
+本系列用 Bash 举例(因为它无处不在),假如你使用一个不同的 shell 也没关系,尽管结构和语法有所不同,但编程思想是相通的。有些 shell 支持某种特性而其他 shell 则不支持,但它们都提供编程功能。Shell 程序可以被存在一个文件中被反复使用,或者在需要的时候才创建它们。
+
+### 简单 CLI 程序
+
+最简单的命令行程序只有一或两条语句,它们可能相关,也可能无关,在按回车键之前被输入到命令行。程序中的第二条语句(如果有的话)可能取决于第一条语句的操作,但也不是必须的。
+
+这里需要特别讲解一个标点符号。当你在命令行输入一条命令,按下回车键的时候,其实在命令的末尾有一个隐含的分号(`;`)。当一段 CLI shell 程序在命令行中被串起来作为单行指令使用时,必须使用分号来终结每个语句并将其与下一条语句分开。但 CLI shell 程序中的最后一条语句可以使用显式或隐式的分号。
+
+### 一些基本语法
+
+下面的例子会阐明这一语法规则。这段程序由单条命令组成,还有一个显式的终止符:
+
+```
+[student@studentvm1 ~]$ echo "Hello world." ;
+Hello world.
+```
+
+看起来不像一个程序,但它确是我学习每个新编程语言时写下的第一个程序。不同语言可能语法不同,但输出结果是一样的。
+
+让我们扩展一下这段微不足道却又无所不在的代码。你的结果可能与我的有所不同,因为我的家目录有点乱,而你可能是在 GUI 桌面中第一次登录账号。
+
+```
+[student@studentvm1 ~]$ echo "My home directory." ; ls ;
+My home directory.
+chapter25 TestFile1.Linux dmesg2.txt Downloads newfile.txt softlink1 testdir6
+chapter26 TestFile1.mac dmesg3.txt file005 Pictures Templates testdir
+TestFile1 Desktop dmesg.txt link3 Public testdir Videos
+TestFile1.dos dmesg1.txt Documents Music random.txt testdir1
+```
+
+现在是不是更明显了。结果是相关的,但是两条语句彼此独立。你可能注意到我喜欢在分号前后多输入一个空格,这样会让代码的可读性更好。让我们再运行一遍这段程序,这次不要带结尾的分号:
+
+```
+[student@studentvm1 ~]$ echo "My home directory." ; ls
+```
+
+输出结果没有区别。
+
+### 关于变量
+
+像所有其他编程语言一样,Bash 支持变量。变量是个象征性的名字,它指向内存中的某个位置,那里存着对应的值。变量的值是可以改变的,所以它叫“变~量”。
+
+Bash 不像 C 之类的语言,需要强制指定变量类型,比如:整型、浮点型或字符型。在 Bash 中,所有变量都是字符串。整数型的变量可以被用于整数运算,这是 Bash 唯一能够处理的数学类型。更复杂的运算则需要借助 [bc][9] 这样的命令,可以被用在命令行编程或者脚本中。
+
+变量的值是被预先分配好的,这些值可以用在命令行编程或者脚本中。可以通过变量名字给其赋值,但是不能使用 `$` 符开头。比如,`VAR=10` 这样会把 `VAR` 的值设为 `10`。要打印变量的值,你可以使用语句 `echo $VAR`。变量名必须以文本(即非数字)开始。
+
+Bash 会保存已经定义好的变量,直到它们被取消掉。
+
+下面这个例子,在变量被赋值前,它的值是空(`null`)。然后给它赋值并打印出来,检验一下。你可以在同一行 CLI 程序里完成它:
+
+```
+[student@studentvm1 ~]$ echo $MyVar ; MyVar="Hello World" ; echo $MyVar ;
+
+Hello World
+[student@studentvm1 ~]$
+```
+
+*注意:变量赋值的语法非常严格,等号(`=`)两边不能有空格。*
+
+那个空行表明了 `MyVar` 的初始值为空。变量的赋值和改值方法都一样,这个例子展示了原始值和新的值。
+
+正如之前说的,Bash 支持整数运算,当你想计算一个数组中的某个元素的位置,或者做些简单的算术运算,这还是挺有帮助的。然而,这种方法并不适合科学计算,或是某些需要小数运算的场景,比如财务统计。这些场景有其它更好的工具可以应对。
+
+下面是个简单的算术题:
+
+```
+[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1*Var2))"
+Result = 63
+```
+
+好像没啥问题,但如果运算结果是浮点数会发生什么呢?
+
+```
+[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var1/Var2))"
+Result = 0
+[student@studentvm1 ~]$ Var1="7" ; Var2="9" ; echo "Result = $((Var2/Var1))"
+Result = 1
+[student@studentvm1 ~]$
+```
+
+结果会被取整。请注意运算被包含在 `echo` 语句之中,其实计算在 echo 命令结束前就已经完成了,原因是 Bash 的内部优先级。想要了解详情的话,可以在 Bash 的 man 页面中搜索 “precedence”。
+
+### 控制运算符
+
+Shell 的控制运算符是一种语法运算符,可以轻松地创建一些有趣的命令行程序。在命令行上按顺序将几个命令串在一起,就变成了最简单的 CLI 程序:
+
+```
+command1 ; command2 ; command3 ; command4 ; . . . ; etc. ;
+```
+
+只要不出错,这些命令都能顺利执行。但假如出错了怎么办?你可以预设好应对出错的办法,这就要用到 Bash 内置的控制运算符, `&&` 和 `||`。这两种运算符提供了流程控制功能,使你能改变代码执行的顺序。分号也可以被看做是一种 Bash 运算符,预示着新一行的开始。
+
+`&&` 运算符提供了如下简单逻辑,“如果 command1 执行成功,那么接着执行 command2。如果 command1 失败,就跳过 command2。”语法如下:
+
+```
+command1 && command2
+```
+
+现在,让我们用命令来创建一个新的目录,如果成功的话,就把它切换为当前目录。确保你的家目录(`~`)是当前目录,先尝试在 `/root` 目录下创建,你应该没有权限:
+
+```
+[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir/ && cd $Dir
+mkdir: cannot create directory '/root/testdir/': Permission denied
+[student@studentvm1 ~]$
+```
+
+上面的报错信息是由 `mkdir` 命令抛出的,因为创建目录失败了。`&&` 运算符收到了非零的返回码,所以 `cd` 命令就被跳过,前者阻止后者继续运行,因为创建目录失败了。这种控制流程可以阻止后面的错误累积,避免引发更严重的问题。是时候讲点更复杂的逻辑了。
+
+当一段程序的返回码大于零时,使用 `||` 运算符可以让你在后面接着执行另一段程序。简单语法如下:
+
+```
+command1 || command2
+```
+
+解读一下,“假如 command1 失败,执行 command2”。隐藏的逻辑是,如果 command1 成功,跳过 command2。下面实践一下,仍然是创建新目录:
+
+```
+[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir || echo "$Dir was not created."
+mkdir: cannot create directory '/root/testdir': Permission denied
+/root/testdir was not created.
+[student@studentvm1 ~]$
+```
+
+正如预期,因为目录无法创建,第一条命令失败了,于是第二条命令被执行。
+
+把 `&&` 和 `||` 两种运算符结合起来才能发挥它们的最大功效。请看下面例子中的流程控制方法:
+
+```
+前置 commands ; command1 && command2 || command3 ; 跟随 commands
+```
+
+语法解释:“假如 command1 退出时返回码为零,就执行 command2,否则执行 command3。”用具体代码试试:
+
+```
+[student@studentvm1 ~]$ Dir=/root/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
+mkdir: cannot create directory '/root/testdir': Permission denied
+/root/testdir was not created.
+[student@studentvm1 ~]$
+```
+
+现在我们再试一次,用你的家目录替换 `/root` 目录,你将会有权限创建这个目录了:
+
+```
+[student@studentvm1 ~]$ Dir=~/testdir ; mkdir $Dir && cd $Dir || echo "$Dir was not created."
+[student@studentvm1 testdir]$
+```
+
+像 `command1 && command2` 这样的控制语句能够运行的原因是,每条命令执行完毕时都会给 shell 发送一个返回码,用来表示它执行成功与否。默认情况下,返回码为 `0` 表示成功,其他任何正值表示失败。一些系统管理员使用的工具用值为 `1` 的返回码来表示失败,但其他很多程序使用别的数字来表示失败。
+
+Bash 的内置变量 `$?` 可以显示上一条命令的返回码,可以在脚本或者命令行中非常方便地检查它。要查看返回码,让我们从运行一条简单的命令开始,返回码的结果总是上一条命令给出的。
+
+```
+[student@studentvm1 testdir]$ ll ; echo "RC = $?"
+total 1264
+drwxrwxr-x 2 student student 4096 Mar 2 08:21 chapter25
+drwxrwxr-x 2 student student 4096 Mar 21 15:27 chapter26
+-rwxr-xr-x 1 student student 92 Mar 20 15:53 TestFile1
+drwxrwxr-x. 2 student student 663552 Feb 21 14:12 testdir
+drwxr-xr-x. 2 student student 4096 Dec 22 13:15 Videos
+RC = 0
+[student@studentvm1 testdir]$
+```
+
+在这个例子中,返回码为零,意味着命令执行成功了。现在对 root 的家目录测试一下,你应该没有权限:
+
+```
+[student@studentvm1 testdir]$ ll /root ; echo "RC = $?"
+ls: cannot open directory '/root': Permission denied
+RC = 2
+[student@studentvm1 testdir]$
+```
+
+本例中返回码是 `2`,表明非 root 用户没有权限进入这个目录。你可以利用这些返回码,用控制运算符来改变程序执行的顺序。
+
+### 总结
+
+本文将 Bash 看作一门编程语言,并从这个视角介绍了它的简单语法和基础工具。我们学习了如何将数据输出到 STDOUT,怎样使用变量和控制运算符。在本系列的下一篇文章中,将会重点介绍能够控制指令执行流程的逻辑运算符。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/10/programming-bash-part-1
+
+作者:[David Both][a]
+选题:[lujun9972][b]
+译者:[jdh8383](https://github.com/jdh8383)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/dboth
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background)
+[2]: https://opensource.com/article/18/10/linux-data-streams
+[3]: http://www.both.org/?page_id=1183
+[4]: https://opensource.com/19/9/command-line-heroes-bash
+[5]: https://en.wikipedia.org/wiki/Comparison_of_command_shells
+[6]: http://foldoc.org/program
+[7]: https://wordnet.princeton.edu/
+[8]: https://en.wikipedia.org/wiki/Computer_program
+[9]: https://www.gnu.org/software/bc/manual/html_mono/bc.html
diff --git a/published/20191022 Initializing arrays in Java.md b/published/20191022 Initializing arrays in Java.md
new file mode 100644
index 0000000000..80177952cb
--- /dev/null
+++ b/published/20191022 Initializing arrays in Java.md
@@ -0,0 +1,361 @@
+[#]: collector: (lujun9972)
+[#]: translator: (laingke)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11533-1.html)
+[#]: subject: (Initializing arrays in Java)
+[#]: via: (https://opensource.com/article/19/10/initializing-arrays-java)
+[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen)
+
+Java 中初始化数组
+======
+
+> 数组是一种有用的数据类型,用于管理在连续内存位置中建模最好的集合元素。下面是如何有效地使用它们。
+
+![Coffee beans and a cup of coffee][1]
+
+有使用 C 或者 FORTRAN 语言编程经验的人会对数组的概念很熟悉。它们基本上是一个连续的内存块,其中每个位置都是某种数据类型:整型、浮点型或者诸如此类的数据类型。
+
+Java 的情况与此类似,但是有一些额外的问题。
+
+### 一个数组的示例
+
+让我们在 Java 中创建一个长度为 10 的整型数组:
+
+```
+int[] ia = new int[10];
+```
+
+上面的代码片段会发生什么?从左到右依次是:
+
+ 1. 最左边的 `int[]` 将变量的*类型*声明为 `int` 数组(由 `[]` 表示)。
+ 2. 它的右边是变量的名称,当前为 `ia`。
+ 3. 接下来,`=` 告诉我们,左侧定义的变量赋值为右侧的内容。
+ 4. 在 `=` 的右侧,我们看到了 `new`,它在 Java 中表示一个对象正在*被初始化中*,这意味着已为其分配存储空间并调用了其构造函数([请参见此处以获取更多信息][2])。
+ 5. 然后,我们看到 `int[10]`,它告诉我们正在初始化的这个对象是包含 10 个整型的数组。
+
+因为 Java 是强类型的,所以变量 `ia` 的类型必须跟 `=` 右侧表达式的类型兼容。
+
+### 初始化示例数组
+
+让我们把这个简单的数组放在一段代码中,并尝试运行一下。将以下内容保存到一个名为 `Test1.java` 的文件中,使用 `javac` 编译,使用 `java` 运行(当然是在终端中):
+
+```
+import java.lang.*;
+
+public class Test1 {
+
+ public static void main(String[] args) {
+ int[] ia = new int[10]; // 见下文注 1
+ System.out.println("ia is " + ia.getClass()); // 见下文注 2
+ for (int i = 0; i < ia.length; i++) // 见下文注 3
+ System.out.println("ia[" + i + "] = " + ia[i]); // 见下文注 4
+ }
+
+}
+```
+
+让我们来看看最重要的部分。
+
+ 1. 我们声明和初始化了长度为 10 的整型数组,即 `ia`,这显而易见。
+ 2. 在下面的行中,我们看到表达式 `ia.getClass()`。没错,`ia` 是属于一个*类*的*对象*,这行代码将告诉我们是哪个类。
+ 3. 在紧接的下一行中,我们看到了一个循环 `for (int i = 0; i < ia.length; i++)`,它定义了一个循环索引变量 `i`,该变量遍历了从 0 到比 `ia.length` 小 1 的序列,这个表达式告诉我们在数组 `ia` 中定义了多少个元素。
+ 4. 接下来,循环体打印出 `ia` 的每个元素的值。
+
+当这个程序编译和运行时,它产生以下结果:
+
+```
+me@mydesktop:~/Java$ javac Test1.java
+me@mydesktop:~/Java$ java Test1
+ia is class [I
+ia[0] = 0
+ia[1] = 0
+ia[2] = 0
+ia[3] = 0
+ia[4] = 0
+ia[5] = 0
+ia[6] = 0
+ia[7] = 0
+ia[8] = 0
+ia[9] = 0
+me@mydesktop:~/Java$
+```
+
+`ia.getClass()` 的输出的字符串表示形式是 `[I`,它是“整数数组”的简写。与 C 语言类似,Java 数组以第 0 个元素开始,扩展到第 `<数组大小> - 1` 个元素。如上所见,我们可以看到数组 `ia` 的每个元素都(似乎由数组构造函数)设置为零。
+
+所以,就这些吗?声明类型,使用适当的初始化器,就完成了吗?
+
+好吧,并没有。在 Java 中有许多其它方法来初始化数组。
+
+### 为什么我要初始化一个数组,有其它方式吗?
+
+像所有好的问题一样,这个问题的答案是“视情况而定”。在这种情况下,答案取决于初始化后我们希望对数组做什么。
+
+在某些情况下,数组自然会作为一种累加器出现。例如,假设我们正在编程实现计算小型办公室中一组电话分机接收和拨打的电话数量。一共有 8 个分机,编号为 1 到 8,加上话务员的分机,编号为 0。 因此,我们可以声明两个数组:
+
+```
+int[] callsMade;
+int[] callsReceived;
+```
+
+然后,每当我们开始一个新的累计呼叫统计数据的周期时,我们就将每个数组初始化为:
+
+```
+callsMade = new int[9];
+callsReceived = new int[9];
+```
+
+在每个累计通话统计数据的最后阶段,我们可以打印出统计数据。粗略地说,我们可能会看到:
+
+```
+import java.lang.*;
+import java.io.*;
+
+public class Test2 {
+
+ public static void main(String[] args) {
+
+ int[] callsMade;
+ int[] callsReceived;
+
+ // 初始化呼叫计数器
+
+ callsMade = new int[9];
+ callsReceived = new int[9];
+
+ // 处理呼叫……
+ // 分机拨打电话:callsMade[ext]++
+ // 分机接听电话:callsReceived[ext]++
+
+ // 汇总通话统计
+
+ System.out.printf("%3s%25s%25s\n", "ext", " calls made",
+ "calls received");
+ for (int ext = 0; ext < callsMade.length; ext++) {
+ System.out.printf("%3d%25d%25d\n", ext,
+ callsMade[ext], callsReceived[ext]);
+ }
+
+ }
+
+}
+```
+
+这会产生这样的输出:
+
+```
+me@mydesktop:~/Java$ javac Test2.java
+me@mydesktop:~/Java$ java Test2
+ext calls made calls received
+ 0 0 0
+ 1 0 0
+ 2 0 0
+ 3 0 0
+ 4 0 0
+ 5 0 0
+ 6 0 0
+ 7 0 0
+ 8 0 0
+me@mydesktop:~/Java$
+```
+
+看来这一天呼叫中心不是很忙。
+
+在上面的累加器示例中,我们看到由数组初始化程序设置的零起始值可以满足我们的需求。但是在其它情况下,这个起始值可能不是正确的选择。
+
+例如,在某些几何计算中,我们可能需要将二维数组初始化为单位矩阵(除沿主对角线———左上角到右下角——以外所有全是零)。我们可以选择这样做:
+
+
+```
+double[][] m = new double[3][3];
+for (int d = 0; d < 3; d++) {
+ m[d][d] = 1.0;
+}
+```
+
+在这种情况下,我们依靠数组初始化器 `new double[3][3]` 将数组设置为零,然后使用循环将主对角线上的元素设置为 1。在这种简单情况下,我们可以使用 Java 提供的快捷方式:
+
+```
+double[][] m = {
+ {1.0, 0.0, 0.0},
+ {0.0, 1.0, 0.0},
+ {0.0, 0.0, 1.0}};
+```
+
+这种可视结构特别适用于这种应用程序,在这种应用程序中,它便于复查数组的实际布局。但是在这种情况下,行数和列数只在运行时确定时,我们可能会看到这样的东西:
+
+```
+int nrc;
+// 一些代码确定行数和列数 = nrc
+double[][] m = new double[nrc][nrc];
+for (int d = 0; d < nrc; d++) {
+ m[d][d] = 1.0;
+}
+```
+
+值得一提的是,Java 中的二维数组实际上是数组的数组,没有什么能阻止无畏的程序员让这些第二层数组中的每个数组的长度都不同。也就是说,下面这样的事情是完全合法的:
+
+```
+int [][] differentLengthRows = {
+ {1, 2, 3, 4, 5},
+ {6, 7, 8, 9},
+ {10, 11, 12},
+ {13, 14},
+ {15}};
+```
+
+在涉及不规则形状矩阵的各种线性代数应用中,可以应用这种类型的结构(有关更多信息,请参见[此 Wikipedia 文章][5])。除此之外,既然我们了解到二维数组实际上是数组的数组,那么以下内容也就不足为奇了:
+
+```
+differentLengthRows.length
+```
+
+可以告诉我们二维数组 `differentLengthRows` 的行数,并且:
+
+```
+differentLengthRows[i].length
+```
+
+告诉我们 `differentLengthRows` 第 `i` 行的列数。
+
+### 深入理解数组
+
+考虑到在运行时确定数组大小的想法,我们看到数组在实例化之前仍需要我们知道该大小。但是,如果在处理完所有数据之前我们不知道大小怎么办?这是否意味着我们必须先处理一次以找出数组的大小,然后再次处理?这可能很难做到,尤其是如果我们只有一次机会使用数据时。
+
+[Java 集合框架][6]很好地解决了这个问题。提供的其中一项是 `ArrayList` 类,它类似于数组,但可以动态扩展。为了演示 `ArrayList` 的工作原理,让我们创建一个 `ArrayList` 对象并将其初始化为前 20 个[斐波那契数字][7]:
+
+```
+import java.lang.*;
+import java.util.*;
+
+public class Test3 {
+
+ public static void main(String[] args) {
+
+ ArrayList fibos = new ArrayList();
+
+ fibos.add(0);
+ fibos.add(1);
+ for (int i = 2; i < 20; i++) {
+ fibos.add(fibos.get(i - 1) + fibos.get(i - 2));
+ }
+
+ for (int i = 0; i < fibos.size(); i++) {
+ System.out.println("fibonacci " + i + " = " + fibos.get(i));
+ }
+
+ }
+}
+```
+
+上面的代码中,我们看到:
+
+ * 用于存储多个 `Integer` 的 `ArrayList` 的声明和实例化。
+ * 使用 `add()` 附加到 `ArrayList` 实例。
+ * 使用 `get()` 通过索引号检索元素。
+ * 使用 `size()` 来确定 `ArrayList` 实例中已经有多少个元素。
+
+这里没有展示 `put()` 方法,它的作用是将一个值放在给定的索引号上。
+
+该程序的输出为:
+
+```
+fibonacci 0 = 0
+fibonacci 1 = 1
+fibonacci 2 = 1
+fibonacci 3 = 2
+fibonacci 4 = 3
+fibonacci 5 = 5
+fibonacci 6 = 8
+fibonacci 7 = 13
+fibonacci 8 = 21
+fibonacci 9 = 34
+fibonacci 10 = 55
+fibonacci 11 = 89
+fibonacci 12 = 144
+fibonacci 13 = 233
+fibonacci 14 = 377
+fibonacci 15 = 610
+fibonacci 16 = 987
+fibonacci 17 = 1597
+fibonacci 18 = 2584
+fibonacci 19 = 4181
+```
+
+`ArrayList` 实例也可以通过其它方式初始化。例如,可以给 `ArrayList` 构造器提供一个数组,或者在编译过程中知道初始元素时也可以使用 `List.of()` 和 `array.aslist()` 方法。我发现自己并不经常使用这些方式,因为我对 `ArrayList` 的主要用途是当我只想读取一次数据时。
+
+此外,对于那些喜欢在加载数据后使用数组的人,可以使用 `ArrayList` 的 `toArray()` 方法将其实例转换为数组;或者,在初始化 `ArrayList` 实例之后,返回到当前数组本身。
+
+Java 集合框架提供了另一种类似数组的数据结构,称为 `Map`(映射)。我所说的“类似数组”是指 `Map` 定义了一个对象集合,它的值可以通过一个键来设置或检索,但与数组(或 `ArrayList`)不同,这个键不需要是整型数;它可以是 `String` 或任何其它复杂对象。
+
+例如,我们可以创建一个 `Map`,其键为 `String`,其值为 `Integer` 类型,如下:
+
+```
+Map stoi = new Map();
+```
+
+然后我们可以对这个 `Map` 进行如下初始化:
+
+```
+stoi.set("one",1);
+stoi.set("two",2);
+stoi.set("three",3);
+```
+
+等类似操作。稍后,当我们想要知道 `"three"` 的数值时,我们可以通过下面的方式将其检索出来:
+
+```
+stoi.get("three");
+```
+
+在我的认知中,`Map` 对于将第三方数据集中出现的字符串转换为我的数据集中的一致代码值非常有用。作为[数据转换管道][8]的一部分,我经常会构建一个小型的独立程序,用作在处理数据之前清理数据;为此,我几乎总是会使用一个或多个 `Map`。
+
+值得一提的是,`ArrayList` 的 `ArrayList` 和 `Map` 的 `Map` 是很可能的,有时也是合理的。例如,假设我们在看树,我们对按树种和年龄范围累计树的数目感兴趣。假设年龄范围定义是一组字符串值(“young”、“mid”、“mature” 和 “old”),物种是 “Douglas fir”、“western red cedar” 等字符串值,那么我们可以将这个 `Map` 中的 `Map` 定义为:
+
+```
+Map> counter = new Map>();
+```
+
+这里需要注意的一件事是,以上内容仅为 `Map` 的*行*创建存储。因此,我们的累加代码可能类似于:
+
+```
+// 假设我们已经知道了物种和年龄范围
+if (!counter.containsKey(species)) {
+ counter.put(species,new Map());
+}
+if (!counter.get(species).containsKey(ageRange)) {
+ counter.get(species).put(ageRange,0);
+}
+```
+
+此时,我们可以这样开始累加:
+
+```
+counter.get(species).put(ageRange, counter.get(species).get(ageRange) + 1);
+```
+
+最后,值得一提的是(Java 8 中的新特性)Streams 还可以用来初始化数组、`ArrayList` 实例和 `Map` 实例。关于此特性的详细讨论可以在[此处][9]和[此处][10]中找到。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/10/initializing-arrays-java
+
+作者:[Chris Hermansen][a]
+选题:[lujun9972][b]
+译者:[laingke](https://github.com/laingke)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/clhermansen
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/java-coffee-mug.jpg?itok=Bj6rQo8r (Coffee beans and a cup of coffee)
+[2]: https://opensource.com/article/19/8/what-object-java
+[3]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string
+[4]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system
+[5]: https://en.wikipedia.org/wiki/Irregular_matrix
+[6]: https://en.wikipedia.org/wiki/Java_collections_framework
+[7]: https://en.wikipedia.org/wiki/Fibonacci_number
+[8]: https://towardsdatascience.com/data-science-for-startups-data-pipelines-786f6746a59a
+[9]: https://stackoverflow.com/questions/36885371/lambda-expression-to-initialize-array
+[10]: https://stackoverflow.com/questions/32868665/how-to-initialize-a-map-using-a-lambda
diff --git a/published/20191023 How to dual boot Windows 10 and Debian 10.md b/published/20191023 How to dual boot Windows 10 and Debian 10.md
new file mode 100644
index 0000000000..b50292a234
--- /dev/null
+++ b/published/20191023 How to dual boot Windows 10 and Debian 10.md
@@ -0,0 +1,261 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wenwensnow)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11557-1.html)
+[#]: subject: (How to dual boot Windows 10 and Debian 10)
+[#]: via: (https://www.linuxtechi.com/dual-boot-windows-10-debian-10/)
+[#]: author: (James Kiarie https://www.linuxtechi.com/author/james/)
+
+如何拥有一个 Windows 10 和 Debian 10 的双系统
+======
+
+在无数次劝说自己后,你终于做出了一个大胆的决定,试试 Linux。不过,在完全熟悉 Linux 之前,你依旧需要使用 Windows 10 系统。幸运的是,通过一个双系统引导设置,能让你在启动时,选择自己想要进入的系统。在这个指南中,你会看到如何 如何双重引导 Windows 10 和 Debian 10。
+
+![如何拥有一个 Windows 10 和 Debian 10 的双系统][2]
+
+### 前提条件
+
+在开始之前,确保你满足下列条件:
+
+ * 一个 Debian 10 的可引导 USB 或 DVD
+ * 一个快速且稳定的网络(为了安装更新以及第三方软件)
+
+另外,记得注意你系统的引导策略(UEFI 或 Legacy),需要确保两个系统使用同一种引导模式。
+
+### 第一步:在硬盘上创建一个空余分区
+
+第一步,你需要在你的硬盘上创建一个空余分区。之后,这将是我们安装 Debian 系统的地方。为了实现这一目的,需要使用下图所示的磁盘管理器:
+
+同时按下 `Windows + R` 键,启动“运行程序”。接下来,输入 `diskmgmt.msc`,按回车键。
+
+![启动“运行程序”][3]
+
+这会启动“磁盘管理”窗口,它会显示你 Windows 上所有已有磁盘。
+
+![磁盘管理][4]
+
+接下来,你需要为安装的 Debian 系统创建空余空间。为此,你需要缩小其中一个磁盘(卷)上的分区,从而创建一个未分配的新分区。在这个例子里,我会从 D 盘中创建一个 30 GB 的新分区。
+
+为了缩小一个卷,右键点击它,然后选中选项 “缩小”。
+
+![缩小卷][5]
+
+在弹出窗口中,定义你想缩小的空间大小。记住,这是将来要安装 Debian 10 的磁盘空间。我选择了 30000MB(大约 30 GB)。压缩完成后,点击“缩小”。
+
+![缩小空间][6]
+
+在缩小操作结束后,你会看到一个如下图所示的未分配分区:
+
+![未分配分区][7]
+
+完美!现在可以准备开始安装了。
+
+### 第二步:开始安装 Debian 10
+
+空余分区已经创建好了,将你的可引导 USB 或安装 DVD 插入电脑,重新启动系统。记得更改 BIOS 中的引导顺序,需要在启动时按住功能键(通常,根据品牌不同,是 `F9`、`F10` 或 `F12` 中的某一个)。 这一步骤,对系统是否能进入安装媒体来说,至关重要。保存 BIOS 设置,并重启电脑。
+
+如下图所示,界面会显示一个新的引导菜单:点击 “Graphical install”。
+
+![图形化界面安装][8]
+
+下一步,选择你的偏好语言,然后点击 “继续”。
+
+![设置语言-Debian10][9]
+
+接着,选择你的地区,点击“继续”。 根据地区,系统会自动选择当地对应的时区。如果你无法找到你所对应的地区,将界面往下拉, 点击“其他”后,选择相对应位置。
+
+![选择地区-Debain10][10]
+
+而后,选择你的键盘布局。
+
+![设置键盘-Debain10][11]
+
+接下来,设置系统的主机名,点击 “继续”。
+
+![设置主机名-Debian10][12]
+
+下一步,确定域名。如果你的电脑不在域中,直接点击 “继续”按钮。
+
+![设置域名-Debian10][13]
+
+然后,如图所示,设置 root 密码,点击 “继续”。
+
+![设置 root 密码-Debian10][14]
+
+下一步骤,设置账户的用户全名,点击 “继续”。
+
+![设置用户全名-debain10][15]
+
+接着,设置与此账户相关联的用户名。
+
+![指定用户名-Debian10][16]
+
+下一步,设置用户密码,点击“继续”。
+
+![设置用户密码-Debian10][17]
+
+然后,设置时区。
+
+![设置时区-Debian10][18]
+
+这时,你要为 Debian10 安装创建分区。如果你是新手用户,点击菜单中的第一个选项,“使用最大的连续空余空间”,点击“继续”。
+
+![使用最大的连续空余空间-debian10][19]
+
+不过,如果你对创建分区有所了解的话,选择“手动” 选项,点击 “继续”。
+
+![选择手动-Debain10][20]
+
+接着,选择被标记为 “空余空间” 的磁盘,点击 “继续” 。接下来,点击“创建新分区”。
+
+![创建新分区-Debain10][21]
+
+下一界面,首先确定交换空间大小。我的交换空间大小为 2GB,点击 “继续”。
+
+![确定交换空间大小-debian10][22]
+
+点击下一界面的 “主分区”,点击“继续”。
+
+![磁盘主分区-Debian10][23]
+
+选择在磁盘 “初始位置” 创建新分区后,点击继续。
+
+![在初始位置创建-Debain10][24]
+
+选择 “Ext 4 日志文件系统”,点击 “继续”。
+
+![选择 Ext4 日志文件系统-debain10][25]
+
+下个界面选择“交换空间” ,点击 “继续”。
+
+![选择交换空间-debian10][26]
+
+选中 “完成此分区设置”,点击 “继续”。
+
+![完成此分区设置-debian10][27]
+
+返回磁盘分区界面,点击 “空余空间”,点击 “继续”。
+
+![点击空余空间-Debain10][28]
+
+为了让自己能轻松一点,选中 “自动为空余空间分区”后,点击 “继续”。
+
+![自动为空余空间分区-Debain10][29]
+
+接着点击 “将所有文件存储在同一分区(新手用户推荐)”。
+
+![将所有文件存储在同一分区-debian10][30]
+
+最后, 点击 “完成分区设置,并将改动写入磁盘” ,点击 “继续”。
+
+![完成分区设置,并将改动写入磁盘][31]
+
+确定你要将改动写入磁盘,点击 “是”。
+
+![将改动写入磁盘-Debian10][32]
+
+而后,安装程序会开始安装所有必要的软件包。
+
+当系统询问是否要扫描其他 CD 时,选择 “否” ,并点击 “继续”。
+
+![扫描其他CD-No-Debain10][33]
+
+接着,选择离你最近的镜像站点地区,点击 “继续”。
+
+![Debian-镜像站点-国家][34]
+
+然后,选择最适合你的镜像站点,点击“继续”。
+
+![选择镜像站点][35]
+
+如果你打算使用代理服务器,在下面输入具体信息,没有的话就留空,点击 “继续”。
+
+![输入代理信息-debian10][36]
+
+随着安装进程的继续, 你会被问到,是否想参加一个软件包用途调查。你可以选择任意一个选项,之后点击“继续”,我选择了“否”。
+
+![参与调查-debain10][37]
+
+在软件选择窗口选中你想安装的软件包,点击“继续”。
+
+![软件选择-debian10][38]
+
+安装程序会将选中的软件一一安装,在这期间,你可以去喝杯咖啡休息一下。
+
+系统将会询问你,是否要将 grub 的引导装载程序安装到主引导记录表(MBR)上。点击 “是”,而后点击 “继续”。
+
+![安装-grub-bootloader-debian10][39]
+
+接着,选中你想安装 grub 的硬盘,点击“继续”。
+
+![选择硬盘-安装 grub-Debian10][40]
+
+最后,安装完成,直接点击 “继续”。
+
+![安装完成-重新启动-debian10][41]
+
+你现在应该会有一个列出 Windows 和 Debian 的 grub 菜单。为了引导 Debian 系统,往下选择 Debian。之后,你就能看见登录界面。输入密码之后,按回车键。
+
+![Debian10-登录][42]
+
+这就完成了!这样,你就拥有了一个全新的 Debian 10 和 Windows 10 双系统。
+
+![Debian10-Buster-Details][43]
+
+--------------------------------------------------------------------------------
+
+via: https://www.linuxtechi.com/dual-boot-windows-10-debian-10/
+
+作者:[James Kiarie][a]
+选题:[lujun9972][b]
+译者:[wenwensnow](https://github.com/wenwensnow)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linuxtechi.com/author/james/
+[b]: https://github.com/lujun9972
+[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[2]: https://www.linuxtechi.com/wp-content/uploads/2019/10/How-to-dual-boot-Windows-and-Debian10.jpg
+[3]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Launch-Run-dialogue.jpg
+[4]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Disk-management.jpg
+[5]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Shrink-volume.jpg
+[6]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Shrink-space.jpg
+[7]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Unallocated-partition.jpg
+[8]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Graphical-Install-Debian10.jpg
+[9]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Select-Language-Debian10.jpg
+[10]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Select-location-Debain10.jpg
+[11]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Configure-Keyboard-layout-Debain10.jpg
+[12]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Set-hostname-Debian10.jpg
+[13]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Set-domain-name-Debian10.jpg
+[14]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Set-root-Password-Debian10.jpg
+[15]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Specify-fullname-user-debain10.jpg
+[16]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Specify-username-Debian10.jpg
+[17]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Specify-user-password-Debian10.jpg
+[18]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Configure-timezone-Debian10.jpg
+[19]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Use-largest-continuous-free-space-debian10.jpg
+[20]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Select-Manual-Debain10.jpg
+[21]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Create-new-partition-Debain10.jpg
+[22]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Define-swap-space-debian10.jpg
+[23]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Partition-Disks-Primary-Debain10.jpg
+[24]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Start-at-the-beginning-Debain10.jpg
+[25]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Select-Ext4-Journaling-system-debain10.jpg
+[26]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Select-swap-debain10.jpg
+[27]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Done-setting-partition-debian10.jpg
+[28]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Click-Free-space-Debain10.jpg
+[29]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Automatically-partition-free-space-Debain10.jpg
+[30]: https://www.linuxtechi.com/wp-content/uploads/2019/10/All-files-in-one-partition-debian10.jpg
+[31]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Finish-partitioning-write-changes-to-disk.jpg
+[32]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Write-changes-to-disk-Yes-Debian10.jpg
+[33]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Scan-another-CD-No-Debain10.jpg
+[34]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Debian-archive-mirror-country.jpg
+[35]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Select-Debian-archive-mirror.jpg
+[36]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Enter-proxy-details-debian10.jpg
+[37]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Participate-in-survey-debain10.jpg
+[38]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Software-selection-debian10.jpg
+[39]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Install-grub-bootloader-debian10.jpg
+[40]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Select-hard-drive-install-grub-Debian10.jpg
+[41]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Installation-complete-reboot-debian10.jpg
+[42]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Debian10-log-in.jpg
+[43]: https://www.linuxtechi.com/wp-content/uploads/2019/10/Debian10-Buster-Details.jpg
diff --git a/published/20191024 Open Source CMS Ghost 3.0 Released with New features for Publishers.md b/published/20191024 Open Source CMS Ghost 3.0 Released with New features for Publishers.md
new file mode 100644
index 0000000000..1879697316
--- /dev/null
+++ b/published/20191024 Open Source CMS Ghost 3.0 Released with New features for Publishers.md
@@ -0,0 +1,116 @@
+[#]: collector: (lujun9972)
+[#]: translator: (Morisun029)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11534-1.html)
+[#]: subject: (Open Source CMS Ghost 3.0 Released with New features for Publishers)
+[#]: via: (https://itsfoss.com/ghost-3-release/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+开源 CMS Ghost 3.0 发布,带来新功能
+======
+
+[Ghost][1] 是一个自由开源的内容管理系统(CMS)。如果你还不了解 CMS,那我在此解释一下。CMS 是一种软件,用它可以构建主要专注于创建内容的网站,而无需了解 HTML 和其他与 Web 相关的技术。
+
+事实上,Ghost 是目前[最好的开源 CMS][2] 之一。它主要聚焦于创建轻量级、快速加载、界面美观的博客。
+
+Ghost 系统有一个现代直观的编辑器,该编辑器内置 SEO(搜索引擎优化)功能。你也可以用本地桌面(包括 Linux 系统)和移动应用程序。如果你喜欢终端,也可以使用其提供的 CLI(命令行界面)工具。
+
+让我们看看 Ghost 3.0 带来了什么新功能。
+
+### Ghost 3.0 的新功能
+
+![][3]
+
+我通常对开源的 CMS 解决方案很感兴趣。因此,在阅读了官方公告后,我通过在 Digital Ocean 云服务器上安装新的 Ghost 实例来进一步尝试它。
+
+与以前的版本相比,Ghost 3.0 在功能和用户界面上的改进给我留下了深刻的印象。
+
+在此,我将列出一些值得一提的关键点。
+
+#### 书签卡
+
+![][5]
+
+除了编辑器的所有细微更改之外,3.0 版本现在支持通过输入 URL 添加漂亮的书签卡。
+
+如果你使用过 WordPress(你可能已经注意到,WordPress 需要添加一个插件才能添加类似的卡片),所以该功能绝对是 Ghost 3.0 系统的一个最大改进。
+
+#### 改进的 WordPress 迁移插件
+
+我没有专门对此进行测试,但它更新了 WordPress 的迁移插件,可以让你轻松地将帖子(带有图片)克隆到 Ghost CMS。
+
+基本上,使用该插件,你就能够创建一个存档(包含图片)并将其导入到 Ghost CMS。
+
+#### 响应式图像库和图片
+
+为了使用户体验更好,Ghost 团队还更新了图像库(现已为响应式),以便在所有设备上舒适地呈现你的图片集。
+
+此外,帖子和页面中的图片也更改为响应式的了。
+
+#### 添加成员和订阅选项
+
+![Ghost Subscription Model][6]
+
+虽然,该功能目前还处于测试阶段,但如果你是以此平台作为维持你业务关系的重要发布平台,你可以为你的博客添加成员、订阅选项。
+
+该功能可以确保只有订阅的成员才能访问你的博客,你也可以选择让未订阅者也可以访问。
+
+#### Stripe:集成支付功能
+
+默认情况下,该版本支持 Stripe 付款网关,帮助你轻松启用订阅功能(或使用任何类型的付款的付款方式),而 Ghost 不收取任何额外费用。
+
+#### 新的应用程序集成
+
+![][7]
+
+你现在可以在 Ghost 3.0 的博客中集成各种流行的应用程序/服务。它可以使很多事情自动化。
+
+#### 默认主题改进
+
+引入的默认主题(设计)已得到改进,现在也提供了夜间模式。
+
+你也可以随时选择创建自定义主题(如果没有可用的预置主题)。
+
+#### 其他小改进
+
+除了所有关键亮点以外,用于创建帖子/页面的可视编辑器也得到了改进(具有某些拖放功能)。
+
+我确定还有很多技术方面的更改,如果你对此感兴趣,可以在他们的[更改日志][8]中查看。
+
+### Ghost 影响力渐增
+
+要在以 WordPress 为主导的世界中获得认可并不是一件容易的事。但 Ghost 逐渐形成了它的一个专门的发布者社区。
+
+不仅如此,它的托管服务 [Ghost Pro][9] 现在拥有像 NASA、Mozilla 和 DuckDuckGo 这样的客户。
+
+在过去的六年中,Ghost 从其 Ghost Pro 客户那里获得了 500 万美元的收入。就从它是致力于开源系统解决方案的非营利组织这一点来讲,这确实是一项成就。
+
+这些收入有助于它们保持独立,避免风险投资家的外部资金投入。Ghost CMS 的托管客户越多,投入到免费和开源的 CMS 的研发款项就越多。
+
+总体而言,Ghost 3.0 是迄今为止提供的最好的升级版本。这些功能给我留下了深刻的印象。
+
+如果你拥有自己的网站,你会使用什么 CMS?你曾经使用过 Ghost 吗?你的体验如何?请在评论部分分享你的想法。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/ghost-3-release/
+
+作者:[Ankush Das][a]
+选题:[lujun9972][b]
+译者:[Morisun029](https://github.com/Morisun029)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/ankush/
+[b]: https://github.com/lujun9972
+[1]: https://itsfoss.com/recommends/ghost/
+[2]: https://itsfoss.com/open-source-cms/
+[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/ghost-3.jpg?ssl=1
+[4]: https://itsfoss.com/recommends/digital-ocean/
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/ghost-editor-screenshot.png?ssl=1
+[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/10/ghost-subscription-model.jpg?resize=800%2C503&ssl=1
+[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/10/ghost-app-integration.jpg?ssl=1
+[8]: https://ghost.org/faq/upgrades/
+[9]: https://itsfoss.com/recommends/ghost-pro/
diff --git a/published/20191025 4 cool new projects to try in COPR for October 2019.md b/published/20191025 4 cool new projects to try in COPR for October 2019.md
new file mode 100644
index 0000000000..73682ef6e5
--- /dev/null
+++ b/published/20191025 4 cool new projects to try in COPR for October 2019.md
@@ -0,0 +1,93 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11528-1.html)
+[#]: subject: (4 cool new projects to try in COPR for October 2019)
+[#]: via: (https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-october-2019/)
+[#]: author: (Dominik Turecek https://fedoramagazine.org/author/dturecek/)
+
+COPR 仓库中 4 个很酷的新项目(2019.10)
+======
+
+![][1]
+
+COPR 是个人软件仓库[集合][2],它不在 Fedora 中。这是因为某些软件不符合轻松打包的标准;或者它可能不符合其他 Fedora 标准,尽管它是自由而开源的。COPR 可以在 Fedora 套件之外提供这些项目。COPR 中的软件不受 Fedora 基础设施的支持,或者是由项目自己背书的。但是,这是一种尝试新的或实验性的软件的一种巧妙的方式。
+
+本文介绍了 COPR 中一些有趣的新项目。如果你第一次使用 COPR,请参阅 [COPR 用户文档][3]。
+
+### Nu
+
+[Nu][4] 也被称为 Nushell,是受 PowerShell 和现代 CLI 工具启发的 shell。通过使用基于结构化数据的方法,Nu 可轻松处理命令的输出,并通过管道传输其他命令。然后将结果显示在可以轻松排序或过滤的表中,并可以用作其他命令的输入。最后,Nu 提供了几个内置命令、多 shell 和对插件的支持。
+
+#### 安装说明
+
+该[仓库][5]目前为 Fedora 30、31 和 Rawhide 提供 Nu。要安装 Nu,请使用以下命令:
+
+```
+sudo dnf copr enable atim/nushell
+sudo dnf install nushell
+```
+
+### NoteKit
+
+[NoteKit][6] 是一个笔记程序。它支持 Markdown 来格式化笔记,并支持使用鼠标创建手绘笔记的功能。在 NoteKit 中,笔记以树状结构进行排序和组织。
+
+#### 安装说明
+
+该[仓库][7]目前为 Fedora 29、30、31 和 Rawhide 提供 NoteKit。要安装 NoteKit,请使用以下命令:
+
+```
+sudo dnf copr enable lyessaadi/notekit
+sudo dnf install notekit
+```
+
+### Crow Translate
+
+[Crow Translate][8] 是一个翻译程序。它可以翻译文本并且可以对输入和结果发音,它还提供命令行界面。对于翻译,Crow Translate 使用 Google、Yandex 或 Bing 的翻译 API。
+
+#### 安装说明
+
+该[仓库][9]目前为 Fedora 30、31 和 Rawhide 以及 Epel 8 提供 Crow Translate。要安装 Crow Translate,请使用以下命令:
+
+```
+sudo dnf copr enable faezebax/crow-translate
+sudo dnf install crow-translate
+```
+
+### dnsmeter
+
+[dnsmeter][10] 是用于测试域名服务器及其基础设施性能的命令行工具。为此,它发送 DNS 查询并计算答复数,从而测量各种统计数据。除此之外,dnsmeter 可以使用不同的加载步骤,使用 PCAP 文件中的载荷和欺骗发送者地址。
+
+#### 安装说明
+
+该仓库目前为 Fedora 29、30、31、Rawhide 以及 Epel 7 提供 dnsmeter。要安装 dnsmeter,请使用以下命令:
+
+```
+sudo dnf copr enable @dnsoarc/dnsmeter
+sudo dnf install dnsmeter
+```
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-october-2019/
+
+作者:[Dominik Turecek][a]
+选题:[lujun9972][b]
+译者:[geekpi](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/dturecek/
+[b]: https://github.com/lujun9972
+[1]: https://fedoramagazine.org/wp-content/uploads/2017/08/4-copr-945x400.jpg
+[2]: https://copr.fedorainfracloud.org/
+[3]: https://docs.pagure.org/copr.copr/user_documentation.html#
+[4]: https://github.com/nushell/nushell
+[5]: https://copr.fedorainfracloud.org/coprs/atim/nushell/
+[6]: https://github.com/blackhole89/notekit
+[7]: https://copr.fedorainfracloud.org/coprs/lyessaadi/notekit/
+[8]: https://github.com/crow-translate/crow-translate
+[9]: https://copr.fedorainfracloud.org/coprs/faezebax/crow-translate/
+[10]: https://github.com/DNS-OARC/dnsmeter
diff --git a/published/20191025 How I used the wget Linux command to recover lost images.md b/published/20191025 How I used the wget Linux command to recover lost images.md
new file mode 100644
index 0000000000..274a70fff2
--- /dev/null
+++ b/published/20191025 How I used the wget Linux command to recover lost images.md
@@ -0,0 +1,132 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-11592-1.html)
+[#]: subject: (How I used the wget Linux command to recover lost images)
+[#]: via: (https://opensource.com/article/19/10/how-community-saved-artwork-creative-commons)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+丢失的开放剪贴画库和新的公共艺术品图书馆 FreeSVG.org 的诞生
+======
+
+> 开放剪贴画库兴衰的故事以及一个新的公共艺术品图书馆 FreeSVG.org 的诞生。
+
+
+
+开放剪贴画库(OCAL)发布于 2004 年,成为了免费插图的来源,任何人都可以出于任何目的使用它们,而无需注明出处或提供任何回报。针对 1990 年代每个家庭办公室书架上的大量剪贴画 CD 以及由闭源公司和艺术品软件提供的艺术品转储,这个网站是开源世界的回应。
+
+最初,这个剪贴画库主要由一些贡献者提供,但是在 2010 年,它重新打造成了一个全新的交互式网站,可以让任何人使用矢量插图应用程序创建和贡献剪贴画。该网站立即获得了来自全球的、各种形式的自由软件和自由文化项目的贡献。[Inkscape][2] 中甚至包含了该库的专用导入器。
+
+但是,在 2019 年初,托管开放剪贴画库的网站离线了,没有任何警告或解释。它已经成长为有着成千上万的人的社区,起初以为这是暂时的故障。但是,这个网站一直离线已超过六个月,而没有任何清楚的解释。
+
+谣言开始膨胀。该网站一直在更新中(“要偿还数年的技术债务”,网站开发者 Jon Philips 在一封电子邮件中说)。一个 Twitter 帐户声称,该网站遭受了猖狂的 DDoS 攻击。另一个 Twitter 帐户声称,该网站维护者已经成为身份盗用的牺牲品。今天,在撰写本文时,该网站的一个且唯一的页面声明它处于“维护和保护模式”,其含义不清楚,只是用户无法访问其内容。
+
+### 恢复公地
+
+网站会随着时间的流逝而消失,但是对其社区而言,开放剪贴画库的丢失尤其令人惊讶,因为它被视为一个社区项目。很少有社区成员知道托管该库的网站已经落入单个维护者手中,因此,由于 [CC0 许可证][3],该库中的艺术品归所有人所有,但对它的访问是由单个维护者功能性拥有的。而且,由于该社区通过网站彼此保持联系,因此该维护者实际上拥有该社区。
+
+当网站发生故障时,社区以及成员彼此之间都无法访问剪贴画。没有该网站,就没有社区。
+
+最初,该网站离线后其上的所有东西都是被封锁的。不过,在几个月之后,用户开始意识到该网站的数据仍然在线,这意味着用户能够通过输入精确的 URL 访问单个剪贴画。换句话说,你不能通过在网站上到处点击来浏览剪贴画文件,但是如果你确切地知道该地址,你就可以在浏览器中访问它。类似的,技术型(或偷懒的)用户意识到能够通过类似 `wget` 的自动 Web 浏览器将网站“抓取”下来。
+
+Linux 的 `wget` 命令从技术上来说是一个 Web 浏览器,虽然它不能让你像用 Firefox 一样交互式地浏览。相反,`wget` 可以连到互联网,获取文件或文件集,并下载到你的本次硬盘。然后,你可以在 Firefox、文本编辑器或最合适的应用程序中打开这些文件,查看内容。
+
+通常,`wget` 需要知道要提取的特定文件。如果你使用的是安装了 `wget` 的 Linux 或 macOS,则可以通过下载 [example.com][4] 的索引页来尝试此过程:
+
+```
+$ wget example.org/index.html
+[...]
+$ tail index.html
+
+
+
Example Domain
+
This domain is for illustrative examples in documents.
+ You may use this domain in examples without permission.
+
More info
+