+```
+
+Vim Surround 有很多其它选项,你可以参照 [GitHub][7] 上的说明尝试它们。
+
+### 4、Vim Gitgutter
+
+[Vim Gitgutter][8] 插件对使用 Git 作为版本控制工具的人来说非常有用。它会在 Vim 的行号列旁显示 `git diff` 的差异标记。假设你有如下已提交过的代码:
+
+```
+ 1 package main
+ 2
+ 3 import "fmt"
+ 4
+ 5 func main() {
+ 6 x := true
+ 7 items := []string{"tv", "pc", "tablet"}
+ 8
+ 9 if x {
+ 10 for _, i := range items {
+ 11 fmt.Println(i)
+ 12 }
+ 13 }
+ 14 }
+```
+
+当你做出一些修改后,Vim Gitgutter 会显示如下标记:
+
+```
+ 1 package main
+ 2
+ 3 import "fmt"
+ 4
+_ 5 func main() {
+ 6 items := []string{"tv", "pc", "tablet"}
+ 7
+~ 8 if len(items) > 0 {
+ 9 for _, i := range items {
+ 10 fmt.Println(i)
++ 11 fmt.Println("------")
+ 12 }
+ 13 }
+ 14 }
+```
+
+`_` 标记表示在第 5 行和第 6 行之间删除了一行。`~` 表示第 8 行有修改,`+` 表示新增了第 11 行。
+
+另外,Vim Gitgutter 允许你用 `[c` 和 `]c` 在多个有修改的块之间跳转,甚至可以用 `Leader+hs` 来暂存某个变更集。
+
+这个插件提供了对变更的即时视觉反馈,如果你用 Git 的话,有了它简直是如虎添翼。
+
+### 5、VIM Fugitive
+
+[Vim Fugitive][9] 是另一个将 Git 工作流集成到 Vim 中的超棒插件。它对 Git 做了一些封装,可以让你在 Vim 里直接执行 Git 命令并将结果集成在 Vim 界面里。这个插件有超多的特性,更多信息请访问它的 [GitHub][10] 项目页面。
+
+这里有一个使用 Vim Fugitive 的基础 Git 工作流示例。设想我们已经对下面的 Go 代码做出修改,你可以用 `:Gblame` 调用 `git blame` 来查看每行最后的提交信息:
+
+```
+e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 1 package main
+e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 2
+e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 3 import "fmt"
+e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 4
+e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│_ 5 func main() {
+e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 6 items := []string{"tv", "pc", "tablet"}
+e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 7
+00000000 (Not Committed Yet 2018-12-05 18:55:00 -0500)│~ 8 if len(items) > 0 {
+e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 9 for _, i := range items {
+e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 10 fmt.Println(i)
+00000000 (Not Committed Yet 2018-12-05 18:55:00 -0500)│+ 11 fmt.Println("------")
+e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 12 }
+e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 13 }
+e9949066 (Ricardo Gerardi 2018-12-05 18:17:19 -0500)│ 14 }
+```
+
+可以看到第 8 行和第 11 行显示还未提交。用 `:Gstatus` 命令检查仓库当前的状态:
+
+```
+ 1 # On branch master
+ 2 # Your branch is up to date with 'origin/master'.
+ 3 #
+ 4 # Changes not staged for commit:
+ 5 # (use "git add ..." to update what will be committed)
+ 6 # (use "git checkout -- ..." to discard changes in working directory)
+ 7 #
+ 8 # modified: vim-5plugins/examples/test1.go
+ 9 #
+ 10 no changes added to commit (use "git add" and/or "git commit -a")
+--------------------------------------------------------------------------------------------------------
+ 1 package main
+ 2
+ 3 import "fmt"
+ 4
+_ 5 func main() {
+ 6 items := []string{"tv", "pc", "tablet"}
+ 7
+~ 8 if len(items) > 0 {
+ 9 for _, i := range items {
+ 10 fmt.Println(i)
++ 11 fmt.Println("------")
+ 12 }
+ 13 }
+ 14 }
+```
+
+Vim Fugitive 在分割的窗口里显示 `git status` 的输出结果。你可以在该行按下 `-` 键用该文件的名字暂存这个文件的提交,再按一次 `-` 可以取消暂存。这个信息会随着你的操作自动更新:
+
+```
+ 1 # On branch master
+ 2 # Your branch is up to date with 'origin/master'.
+ 3 #
+ 4 # Changes to be committed:
+ 5 # (use "git reset HEAD ..." to unstage)
+ 6 #
+ 7 # modified: vim-5plugins/examples/test1.go
+ 8 #
+--------------------------------------------------------------------------------------------------------
+ 1 package main
+ 2
+ 3 import "fmt"
+ 4
+_ 5 func main() {
+ 6 items := []string{"tv", "pc", "tablet"}
+ 7
+~ 8 if len(items) > 0 {
+ 9 for _, i := range items {
+ 10 fmt.Println(i)
++ 11 fmt.Println("------")
+ 12 }
+ 13 }
+ 14 }
+```
+
+现在你可以用 `:Gcommit` 来提交修改了。Vim Fugitive 会打开另一个分割窗口让你输入提交信息:
+
+```
+ 1 vim-5plugins: Updated test1.go example file
+ 2 # Please enter the commit message for your changes. Lines starting
+ 3 # with '#' will be ignored, and an empty message aborts the commit.
+ 4 #
+ 5 # On branch master
+ 6 # Your branch is up to date with 'origin/master'.
+ 7 #
+ 8 # Changes to be committed:
+ 9 # modified: vim-5plugins/examples/test1.go
+ 10 #
+```
+
+按 `:wq` 保存文件完成提交:
+
+```
+[master c3bf80f] vim-5plugins: Updated test1.go example file
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+Press ENTER or type command to continue
+```
+
+然后你可以再用 `:Gstatus` 检查结果并用 `:Gpush` 把新的提交推送到远程。
+
+```
+ 1 # On branch master
+ 2 # Your branch is ahead of 'origin/master' by 1 commit.
+ 3 # (use "git push" to publish your local commits)
+ 4 #
+ 5 nothing to commit, working tree clean
+```
+
+Vim Fugitive 的 GitHub 项目主页有很多屏幕录像展示了它的更多功能和工作流,如果你喜欢它并想多学一些,快去看看吧。
+
+### 接下来?
+
+这些 Vim 插件都是程序开发者的神器!还有另外两类开发者常用的插件:自动完成插件和语法检查插件。它些大都是和具体的编程语言相关的,以后我会在一些文章中介绍它们。
+
+你在写代码时是否用到一些其它 Vim 插件?请在评论区留言分享。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/1/vim-plugins-developers
+
+作者:[Ricardo Gerardi][a]
+选题:[lujun9972][b]
+译者:[pityonline](https://github.com/pityonline)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/rgerardi
+[b]: https://github.com/lujun9972
+[1]: https://www.vim.org/
+[2]: https://www.vim.org/scripts/script.php?script_id=3599
+[3]: https://github.com/jiangmiao/auto-pairs
+[4]: https://github.com/scrooloose/nerdcommenter
+[5]: http://vim.wikia.com/wiki/Filetype.vim
+[6]: https://www.vim.org/scripts/script.php?script_id=1697
+[7]: https://github.com/tpope/vim-surround
+[8]: https://github.com/airblade/vim-gitgutter
+[9]: https://www.vim.org/scripts/script.php?script_id=2975
+[10]: https://github.com/tpope/vim-fugitive
diff --git a/translated/talk/20190110 Toyota Motors and its Linux Journey.md b/published/201902/20190110 Toyota Motors and its Linux Journey.md
similarity index 61%
rename from translated/talk/20190110 Toyota Motors and its Linux Journey.md
rename to published/201902/20190110 Toyota Motors and its Linux Journey.md
index b4ae8074a3..d89f4f2a29 100644
--- a/translated/talk/20190110 Toyota Motors and its Linux Journey.md
+++ b/published/201902/20190110 Toyota Motors and its Linux Journey.md
@@ -1,34 +1,32 @@
[#]: collector: (lujun9972)
[#]: translator: (jdh8383)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10543-1.html)
[#]: subject: (Toyota Motors and its Linux Journey)
[#]: via: (https://itsfoss.com/toyota-motors-linux-journey)
-[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+[#]: author: (Malcolm Dean https://itsfoss.com/toyota-motors-linux-journey)
-丰田汽车的Linux之旅
+丰田汽车的 Linux 之旅
======
-**这篇文章来自 It's FOSS 的读者 Malcolm Dean的投递。**
+我之前跟丰田汽车北美分公司的 Brian.R.Lyons(丰田发言人)聊了聊,话题是关于 Linux 在丰田和雷克萨斯汽车的信息娱乐系统上的实施方案。我了解到一些汽车制造商使用了 Automotive Grade Linux(AGL)。
-我之前跟丰田汽车北美分公司的 Brian.R.Lyons(丰田发言人)聊了聊,话题是关于Linux在丰田和雷克萨斯汽车的信息娱乐系统上的实施方案。我了解到一些汽车制造商使用了 Automotive Grade Linux (AGL)。
+然后我写了一篇短文,记录了我和 Brian 的讨论内容,谈及了丰田和 Linux 的一些渊源。希望 Linux 的狂热粉丝们能够喜欢这次对话。
-然后我写了一篇短文,记录了我和 Brian 的讨论内容,就是丰田和 Linux 的一些渊源。希望 Linux 的狂热粉丝们能够喜欢这次对话。
-
-全部[丰田和雷克萨斯汽车都将会使用 Automotive Grade Linux][1] (AGL),主要是用于车载信息娱乐系统。这项措施对于丰田集团来说是至关重要的,因为据 Lyons 先生所说:“作为技术的引领者之一,丰田认识到,赶上科技快速进步最好的方法就是拥抱开源理念”。
+全部的[丰田和雷克萨斯汽车都将会使用 Automotive Grade Linux(AGL)][1],主要是用于车载信息娱乐系统。这项措施对于丰田集团来说是至关重要的,因为据 Lyons 先生所说:“作为技术的引领者之一,丰田认识到,赶上科技快速进步最好的方法就是接受开源发展的理念。”
丰田和众多汽车制造公司都认为,与使用非自由软件相比,采用基于 Linux 的操作系统在更新和升级方面会更加廉价和快捷。
-这简直太棒了! Linux 终于跟汽车结合起来了。我每天都在电脑上使用 Linux;能看到这个优秀的软件在一个完全不同的产业领域里大展拳脚真是太好了。
+这简直太棒了!Linux 终于跟汽车结合起来了。我每天都在电脑上使用 Linux;能看到这个优秀的软件在一个完全不同的产业领域里大展拳脚真是太好了。
-我很好奇丰田是什么时候开始使用 [Automotive Grade Linux][2] (AGL) 的。按照 Lyons 先生的说法,这要追溯到 2011 年。
+我很好奇丰田是什么时候开始使用 [Automotive Grade Linux(AGL)][2]的。按照 Lyons 先生的说法,这要追溯到 2011 年。
->“自 AGL 项目在五年前启动之始,作为活跃的会员和贡献者,丰田与其他顶级制造商和供应商展开合作,着手开发一个基于 Linux 的强大平台,并不断地增强其功能和安全性。”
+> “自 AGL 项目在五年前启动之始,作为活跃的会员和贡献者,丰田与其他顶级制造商和供应商展开合作,着手开发一个基于 Linux 的强大平台,并不断地增强其功能和安全性。”
![丰田信息娱乐系统][3]
-[丰田于2011年加入了 Linux 基金会][4],与其他汽车制造商和软件公司就 IVI(车内信息娱乐系统)展开讨论,最终在 2012 年,Linux 基金会内部成立了 Automotive Grade Linux 工作组。
+[丰田于 2011 年加入了 Linux 基金会][4],与其他汽车制造商和软件公司就 IVI(车内信息娱乐系统)展开讨论,最终在 2012 年,Linux 基金会内部成立了 Automotive Grade Linux 工作组。
丰田在 AGL 工作组里首先提出了“代码优先”的策略,这在开源领域是很常见的做法。然后丰田和其他汽车制造商、IVI 一线厂家,软件公司等各方展开对话,根据各方的技术需求详细制定了初始方向。
@@ -48,14 +46,14 @@
via: https://itsfoss.com/toyota-motors-linux-journey
-作者:[Abhishek Prakash][a]
+作者:[Malcolm Dean][a]
选题:[lujun9972][b]
译者:[jdh8383](https://github.com/jdh8383)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-[a]: https://itsfoss.com/author/abhishek/
+[a]: https://itsfoss.com/toyota-motors-linux-journey
[b]: https://github.com/lujun9972
[1]: https://www.linuxfoundation.org/press-release/2018/01/automotive-grade-linux-hits-road-globally-toyota-amazon-alexa-joins-agl-support-voice-recognition/
[2]: https://www.automotivelinux.org/
diff --git a/published/20190114 Hegemon - A Modular System And Hardware Monitoring Tool For Linux.md b/published/201902/20190114 Hegemon - A Modular System And Hardware Monitoring Tool For Linux.md
similarity index 100%
rename from published/20190114 Hegemon - A Modular System And Hardware Monitoring Tool For Linux.md
rename to published/201902/20190114 Hegemon - A Modular System And Hardware Monitoring Tool For Linux.md
diff --git a/published/20190114 Remote Working Survival Guide.md b/published/201902/20190114 Remote Working Survival Guide.md
similarity index 100%
rename from published/20190114 Remote Working Survival Guide.md
rename to published/201902/20190114 Remote Working Survival Guide.md
diff --git a/published/20190115 Comparing 3 open source databases- PostgreSQL, MariaDB, and SQLite.md b/published/201902/20190115 Comparing 3 open source databases- PostgreSQL, MariaDB, and SQLite.md
similarity index 100%
rename from published/20190115 Comparing 3 open source databases- PostgreSQL, MariaDB, and SQLite.md
rename to published/201902/20190115 Comparing 3 open source databases- PostgreSQL, MariaDB, and SQLite.md
diff --git a/published/20190115 Getting started with Sandstorm, an open source web app platform.md b/published/201902/20190115 Getting started with Sandstorm, an open source web app platform.md
similarity index 100%
rename from published/20190115 Getting started with Sandstorm, an open source web app platform.md
rename to published/201902/20190115 Getting started with Sandstorm, an open source web app platform.md
diff --git a/published/201902/20190116 The Evil-Twin Framework- A tool for improving WiFi security.md b/published/201902/20190116 The Evil-Twin Framework- A tool for improving WiFi security.md
new file mode 100644
index 0000000000..760c2ed1cf
--- /dev/null
+++ b/published/201902/20190116 The Evil-Twin Framework- A tool for improving WiFi security.md
@@ -0,0 +1,230 @@
+[#]: collector: (lujun9972)
+[#]: translator: (hopefully2333)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10568-1.html)
+[#]: subject: (The Evil-Twin Framework: A tool for improving WiFi security)
+[#]: via: (https://opensource.com/article/19/1/evil-twin-framework)
+[#]: author: (André Esser https://opensource.com/users/andreesser)
+
+Evil-Twin 框架:一个用于提升 WiFi 安全性的工具
+======
+
+> 了解一款用于对 WiFi 接入点安全进行渗透测试的工具。
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security-lock-cloud-safe.png?itok=yj2TFPzq)
+
+越来越多的设备通过无线传输的方式连接到互联网,以及,大范围可用的 WiFi 接入点为攻击者攻击用户提供了很多机会。通过欺骗用户连接到[虚假的 WiFi 接入点][1],攻击者可以完全控制用户的网络连接,这将使得攻击者可以嗅探和篡改用户的数据包,将用户的连接重定向到一个恶意的网站,并通过网络发起其他的攻击。
+
+为了保护用户并告诉他们如何避免线上的危险操作,安全审计人员和安全研究员必须评估用户的安全实践能力,用户常常在没有确认该 WiFi 接入点为安全的情况下就连接上了该网络,安全审计人员和研究员需要去了解这背后的原因。有很多工具都可以对 WiFi 的安全性进行审计,但是没有一款工具可以测试大量不同的攻击场景,也没有能和其他工具集成得很好的工具。
+
+Evil-Twin Framework(ETF)用于解决 WiFi 审计过程中的这些问题。审计者能够使用 ETF 来集成多种工具并测试该 WiFi 在不同场景下的安全性。本文会介绍 ETF 的框架和功能,然后会提供一些案例来说明该如何使用这款工具。
+
+### ETF 的架构
+
+ETF 的框架是用 [Python][2] 写的,因为这门开发语言的代码非常易读,也方便其他开发者向这个项目贡献代码。除此之外,很多 ETF 的库,比如 [Scapy][3],都是为 Python 开发的,很容易就能将它们用于 ETF。
+
+ETF 的架构(图 1)分为不同的彼此交互的模块。该框架的设置都写在一个单独的配置文件里。用户可以通过 `ConfigurationManager` 类里的用户界面来验证并修改这些配置。其他模块只能读取这些设置并根据这些设置进行运行。
+
+![Evil-Twin Framework Architecture][5]
+
+*图 1:Evil-Twin 的框架架构*
+
+ETF 支持多种与框架交互的用户界面,当前的默认界面是一个交互式控制台界面,类似于 [Metasploit][6] 那种。正在开发用于桌面/浏览器使用的图形用户界面(GUI)和命令行界面(CLI),移动端界面也是未来的一个备选项。用户可以使用交互式控制台界面来修改配置文件里的设置(最终会使用 GUI)。用户界面可以与存在于这个框架里的每个模块进行交互。
+
+WiFi 模块(AirCommunicator)用于支持多种 WiFi 功能和攻击类型。该框架确定了 Wi-Fi 通信的三个基本支柱:数据包嗅探、自定义数据包注入和创建接入点。三个主要的 WiFi 通信模块 AirScanner、AirInjector,和 AirHost,分别用于数据包嗅探、数据包注入,和接入点创建。这三个类被封装在主 WiFi 模块 AirCommunicator 中,AirCommunicator 在启动这些服务之前会先读取这些服务的配置文件。使用这些核心功能的一个或多个就可以构造任意类型的 WiFi 攻击。
+
+要使用中间人(MITM)攻击(这是一种攻击 WiFi 客户端的常见手法),ETF 有一个叫做 ETFITM(Evil-Twin Framework-in-the-Middle)的集成模块,这个模块用于创建一个 web 代理,来拦截和修改经过的 HTTP/HTTPS 数据包。
+
+许多其他的工具也可以利用 ETF 创建的 MITM。通过它的可扩展性,ETF 能够支持它们,而不必单独地调用它们,你可以通过扩展 Spawner 类来将这些工具添加到框架里。这使得开发者和安全审计人员可以使用框架里预先配置好的参数字符来调用程序。
+
+扩展 ETF 的另一种方法就是通过插件。有两类插件:WiFi 插件和 MITM 插件。MITM 插件是在 MITM 代理运行时可以执行的脚本。代理会将 HTTP(s) 请求和响应传递给可以记录和处理它们的插件。WiFi 插件遵循一个更加复杂的执行流程,但仍然会给想参与开发并且使用自己插件的贡献者提供一个相对简单的 API。WiFi 插件还可以进一步地划分为三类,其中每个对应一个核心 WiFi 通信模块。
+
+每个核心模块都有一些特定事件能触发响应的插件的执行。举个例子,AirScanner 有三个已定义的事件,可以对其响应进行编程处理。事件通常对应于服务开始运行之前的设置阶段、服务正在运行时的中间执行阶段、服务完成后的卸载或清理阶段。因为 Python 允许多重继承,所以一个插件可以继承多个插件类。
+
+上面的图 1 是框架架构的摘要。从 ConfigurationManager 指出的箭头意味着模块会从中读取信息,指向它的箭头意味着模块会写入/修改配置。
+
+### 使用 ETF 的例子
+
+ETF 可以通过多种方式对 WiFi 的网络安全或者终端用户的 WiFi 安全意识进行渗透测试。下面的例子描述了这个框架的一些渗透测试功能,例如接入点和客户端检测、对使用 WPA 和 WEP 类型协议的接入点进行攻击,和创建 evil twin 接入点。
+
+这些例子是使用 ETF 和允许进行 WiFi 数据捕获的 WiFi 卡设计的。它们也在 ETF 设置命令中使用了下面这些缩写:
+
+ * **APS** Access Point SSID
+ * **APB** Access Point BSSID
+ * **APC** Access Point Channel
+ * **CM** Client MAC address
+
+在实际的测试场景中,确保你使用了正确的信息来替换这些缩写。
+
+#### 在解除认证攻击后捕获 WPA 四次握手的数据包。
+
+这个场景(图 2)做了两个方面的考虑:解除认证攻击和捕获 WPA 四次握手数据包的可能性。这个场景从一个启用了 WPA/WPA2 的接入点开始,这个接入点有一个已经连上的客户端设备(在本例中是一台智能手机)。目的是通过常规的解除认证攻击(LCTT 译注:类似于 DoS 攻击)来让客户端断开和 WiFi 的网络,然后在客户端尝试重连的时候捕获 WPA 的握手包。重连会在断开连接后马上手动完成。
+
+![Scenario for capturing a WPA handshake after a de-authentication attack][8]
+
+*图 2:在解除认证攻击后捕获 WPA 握手包的场景*
+
+在这个例子中需要考虑的是 ETF 的可靠性。目的是确认工具是否一直都能捕获 WPA 的握手数据包。每个工具都会用来多次复现这个场景,以此来检查它们在捕获 WPA 握手数据包时的可靠性。
+
+使用 ETF 来捕获 WPA 握手数据包的方法不止一种。一种方法是使用 AirScanner 和 AirInjector 两个模块的组合;另一种方法是只使用 AirInjector。下面这个场景是使用了两个模块的组合。
+
+ETF 启用了 AirScanner 模块并分析 IEEE 802.11 数据帧来发现 WPA 握手包。然后 AirInjecto 就可以使用解除认证攻击来强制客户端断开连接,以进行重连。必须在 ETF 上执行下面这些步骤才能完成上面的目标:
+
+ 1. 进入 AirScanner 配置模式:`config airscanner`
+ 2. 设置 AirScanner 不跳信道:`config airscanner`
+ 3. 设置信道以嗅探经过 WiFi 接入点信道的数据(APC):`set fixed_sniffing_channel = `
+ 4. 使用 CredentialSniffer 插件来启动 AirScanner 模块:`start airscanner with credentialsniffer`
+ 5. 从已嗅探的接入点列表中添加目标接入点的 BSSID(APS):`add aps where ssid = `
+ 6. 启用 AirInjector 模块,在默认情况下,它会启用解除认证攻击:`start airinjector`
+
+这些简单的命令设置能让 ETF 在每次测试时执行成功且有效的解除认证攻击。ETF 也能在每次测试的时候捕获 WPA 的握手数据包。下面的代码能让我们看到 ETF 成功的执行情况。
+
+```
+███████╗████████╗███████╗
+██╔════╝╚══██╔══╝██╔════╝
+█████╗ ██║ █████╗
+██╔══╝ ██║ ██╔══╝
+███████╗ ██║ ██║
+╚══════╝ ╚═╝ ╚═╝
+
+
+[+] Do you want to load an older session? [Y/n]: n
+[+] Creating new temporary session on 02/08/2018
+[+] Enter the desired session name:
+ETF[etf/aircommunicator/]::> config airscanner
+ETF[etf/aircommunicator/airscanner]::> listargs
+ sniffing_interface = wlan1; (var)
+ probes = True; (var)
+ beacons = True; (var)
+ hop_channels = false; (var)
+fixed_sniffing_channel = 11; (var)
+ETF[etf/aircommunicator/airscanner]::> start airscanner with
+arpreplayer caffelatte credentialsniffer packetlogger selfishwifi
+ETF[etf/aircommunicator/airscanner]::> start airscanner with credentialsniffer
+[+] Successfully added credentialsniffer plugin.
+[+] Starting packet sniffer on interface 'wlan1'
+[+] Set fixed channel to 11
+ETF[etf/aircommunicator/airscanner]::> add aps where ssid = CrackWPA
+ETF[etf/aircommunicator/airscanner]::> start airinjector
+ETF[etf/aircommunicator/airscanner]::> [+] Starting deauthentication attack
+ - 1000 bursts of 1 packets
+ - 1 different packets
+[+] Injection attacks finished executing.
+[+] Starting post injection methods
+[+] Post injection methods finished
+[+] WPA Handshake found for client '70:3e:ac:bb:78:64' and network 'CrackWPA'
+```
+
+#### 使用 ARP 重放攻击并破解 WEP 无线网络
+
+下面这个场景(图 3)将关注[地址解析协议][9](ARP)重放攻击的效率和捕获包含初始化向量(IVs)的 WEP 数据包的速度。相同的网络可能需要破解不同数量的捕获的 IVs,所以这个场景的 IVs 上限是 50000。如果这个网络在首次测试期间,还未捕获到 50000 IVs 就崩溃了,那么实际捕获到的 IVs 数量会成为这个网络在接下来的测试里的新的上限。我们使用 `aircrack-ng` 对数据包进行破解。
+
+测试场景从一个使用 WEP 协议进行加密的 WiFi 接入点和一台知道其密钥的离线客户端设备开始 —— 为了测试方便,密钥使用了 12345,但它可以是更长且更复杂的密钥。一旦客户端连接到了 WEP 接入点,它会发送一个不必要的 ARP 数据包;这是要捕获和重放的数据包。一旦被捕获的包含 IVs 的数据包数量达到了设置的上限,测试就结束了。
+
+![Scenario for capturing a WPA handshake after a de-authentication attack][11]
+
+*图 3:在进行解除认证攻击后捕获 WPA 握手包的场景*
+
+ETF 使用 Python 的 Scapy 库来进行包嗅探和包注入。为了最大限度地解决 Scapy 里的已知的性能问题,ETF 微调了一些低级库,来大大加快包注入的速度。对于这个特定的场景,ETF 为了更有效率地嗅探,使用了 `tcpdump` 作为后台进程而不是 Scapy,Scapy 用于识别加密的 ARP 数据包。
+
+这个场景需要在 ETF 上执行下面这些命令和操作:
+
+ 1. 进入 AirScanner 设置模式:`config airscanner`
+ 2. 设置 AirScanner 不跳信道:`set hop_channels = false`
+ 3. 设置信道以嗅探经过接入点信道的数据(APC):`set fixed_sniffing_channel = `
+ 4. 进入 ARPReplayer 插件设置模式:`config arpreplayer`
+ 5. 设置 WEP 网络目标接入点的 BSSID(APB):`set target_ap_bssid `
+ 6. 使用 ARPReplayer 插件启动 AirScanner 模块:`start airscanner with arpreplayer`
+
+在执行完这些命令后,ETF 会正确地识别加密的 ARP 数据包,然后成功执行 ARP 重放攻击,以此破坏这个网络。
+
+#### 使用一款全能型蜜罐
+
+图 4 中的场景使用相同的 SSID 创建了多个接入点,对于那些可以探测到但是无法接入的 WiFi 网络,这个技术可以发现网络的加密类型。通过启动具有所有安全设置的多个接入点,客户端会自动连接和本地缓存的接入点信息相匹配的接入点。
+
+![Scenario for capturing a WPA handshake after a de-authentication attack][13]
+
+*图 4:在解除认证攻击后捕获 WPA 握手包数据。*
+
+使用 ETF,可以去设置 `hostapd` 配置文件,然后在后台启动该程序。`hostapd` 支持在一张无线网卡上通过设置虚拟接口开启多个接入点,并且因为它支持所有类型的安全设置,因此可以设置完整的全能蜜罐。对于使用 WEP 和 WPA(2)-PSK 的网络,使用默认密码,和对于使用 WPA(2)-EAP 的网络,配置“全部接受”策略。
+
+对于这个场景,必须在 ETF 上执行下面的命令和操作:
+
+ 1. 进入 APLauncher 设置模式:`config aplauncher`
+ 2. 设置目标接入点的 SSID(APS):`set ssid = `
+ 3. 设置 APLauncher 为全部接收的蜜罐:`set catch_all_honeypot = true`
+ 4. 启动 AirHost 模块:`start airhost`
+
+使用这些命令,ETF 可以启动一个包含所有类型安全配置的完整全能蜜罐。ETF 同样能自动启动 DHCP 和 DNS 服务器,从而让客户端能与互联网保持连接。ETF 提供了一个更好、更快、更完整的解决方案来创建全能蜜罐。下面的代码能够看到 ETF 的成功执行。
+
+```
+███████╗████████╗███████╗
+██╔════╝╚══██╔══╝██╔════╝
+█████╗ ██║ █████╗
+██╔══╝ ██║ ██╔══╝
+███████╗ ██║ ██║
+╚══════╝ ╚═╝ ╚═╝
+
+
+[+] Do you want to load an older session? [Y/n]: n
+[+] Creating ne´,cxzw temporary session on 03/08/2018
+[+] Enter the desired session name:
+ETF[etf/aircommunicator/]::> config aplauncher
+ETF[etf/aircommunicator/airhost/aplauncher]::> setconf ssid CatchMe
+ssid = CatchMe
+ETF[etf/aircommunicator/airhost/aplauncher]::> setconf catch_all_honeypot true
+catch_all_honeypot = true
+ETF[etf/aircommunicator/airhost/aplauncher]::> start airhost
+[+] Killing already started processes and restarting network services
+[+] Stopping dnsmasq and hostapd services
+[+] Access Point stopped...
+[+] Running airhost plugins pre_start
+[+] Starting hostapd background process
+[+] Starting dnsmasq service
+[+] Running airhost plugins post_start
+[+] Access Point launched successfully
+[+] Starting dnsmasq service
+```
+
+### 结论和以后的工作
+
+这些场景使用常见和众所周知的攻击方式来帮助验证 ETF 测试 WIFI 网络和客户端的能力。这个结果同样证明了该框架的架构能在平台现有功能的优势上开发新的攻击向量和功能。这会加快新的 WiFi 渗透测试工具的开发,因为很多的代码已经写好了。除此之外,将 WiFi 技术相关的东西都集成到一个单独的工具里,会使 WiFi 渗透测试更加简单高效。
+
+ETF 的目标不是取代现有的工具,而是为它们提供补充,并为安全审计人员在进行 WiFi 渗透测试和提升用户安全意识时,提供一个更好的选择。
+
+ETF 是 [GitHub][14] 上的一个开源项目,欢迎社区为它的开发做出贡献。下面是一些您可以提供帮助的方法。
+
+当前 WiFi 渗透测试的一个限制是无法在测试期间记录重要的事件。这使得报告已经识别到的漏洞更加困难且准确性更低。这个框架可以实现一个记录器,每个类都可以来访问它并创建一个渗透测试会话报告。
+
+ETF 工具的功能涵盖了 WiFi 渗透测试的方方面面。一方面,它让 WiFi 目标侦察、漏洞挖掘和攻击这些阶段变得更加容易。另一方面,它没有提供一个便于提交报告的功能。增加了会话的概念和会话报告的功能,比如在一个会话期间记录重要的事件,会极大地增加这个工具对于真实渗透测试场景的价值。
+
+另一个有价值的贡献是扩展该框架来促进 WiFi 模糊测试。IEEE 802.11 协议非常的复杂,考虑到它在客户端和接入点两方面都会有多种实现方式。可以假设这些实现都包含 bug 甚至是安全漏洞。这些 bug 可以通过对 IEEE 802.11 协议的数据帧进行模糊测试来进行发现。因为 Scapy 允许自定义的数据包创建和数据包注入,可以通过它实现一个模糊测试器。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/1/evil-twin-framework
+
+作者:[André Esser][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/andreesser
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Rogue_access_point
+[2]: https://www.python.org/
+[3]: https://scapy.net
+[4]: /file/417776
+[5]: https://opensource.com/sites/default/files/uploads/pic1.png (Evil-Twin Framework Architecture)
+[6]: https://www.metasploit.com
+[7]: /file/417781
+[8]: https://opensource.com/sites/default/files/uploads/pic2.png (Scenario for capturing a WPA handshake after a de-authentication attack)
+[9]: https://en.wikipedia.org/wiki/Address_Resolution_Protocol
+[10]: /file/417786
+[11]: https://opensource.com/sites/default/files/uploads/pic3.png (Scenario for capturing a WPA handshake after a de-authentication attack)
+[12]: /file/417791
+[13]: https://opensource.com/sites/default/files/uploads/pic4.png (Scenario for capturing a WPA handshake after a de-authentication attack)
+[14]: https://github.com/Esser420/EvilTwinFramework
diff --git a/published/20190117 How to Update-Change Users Password in Linux Using Different Ways.md b/published/201902/20190117 How to Update-Change Users Password in Linux Using Different Ways.md
similarity index 100%
rename from published/20190117 How to Update-Change Users Password in Linux Using Different Ways.md
rename to published/201902/20190117 How to Update-Change Users Password in Linux Using Different Ways.md
diff --git a/published/20190119 Get started with Roland, a random selection tool for the command line.md b/published/201902/20190119 Get started with Roland, a random selection tool for the command line.md
similarity index 100%
rename from published/20190119 Get started with Roland, a random selection tool for the command line.md
rename to published/201902/20190119 Get started with Roland, a random selection tool for the command line.md
diff --git a/published/20190120 Get started with HomeBank, an open source personal finance app.md b/published/201902/20190120 Get started with HomeBank, an open source personal finance app.md
similarity index 100%
rename from published/20190120 Get started with HomeBank, an open source personal finance app.md
rename to published/201902/20190120 Get started with HomeBank, an open source personal finance app.md
diff --git a/translated/tech/20190121 Get started with TaskBoard, a lightweight kanban board.md b/published/201902/20190121 Get started with TaskBoard, a lightweight kanban board.md
similarity index 77%
rename from translated/tech/20190121 Get started with TaskBoard, a lightweight kanban board.md
rename to published/201902/20190121 Get started with TaskBoard, a lightweight kanban board.md
index d2490b03da..bff5c209c7 100644
--- a/translated/tech/20190121 Get started with TaskBoard, a lightweight kanban board.md
+++ b/published/201902/20190121 Get started with TaskBoard, a lightweight kanban board.md
@@ -1,25 +1,26 @@
[#]: collector: (lujun9972)
[#]: translator: (geekpi)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10539-1.html)
[#]: subject: (Get started with TaskBoard, a lightweight kanban board)
[#]: via: (https://opensource.com/article/19/1/productivity-tool-taskboard)
[#]: author: (Kevin Sonney https://opensource.com/users/ksonney (Kevin Sonney))
-开始使用轻量级看板 TaskBoard
+开始使用 TaskBoard 吧,一款轻量级看板
======
-了解我们在开源工具系列中的第九个工具,它将帮助你在 2019 年提高工作效率。
+
+> 了解我们在开源工具系列中的第九个工具,它将帮助你在 2019 年提高工作效率。
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_hands_team_collaboration.png?itok=u82QepPk)
-每年年初似乎都有疯狂的冲动,想方设法提高工作效率。新年的决议,开始一年的权利,当然,“与旧的,与新的”的态度都有助于实现这一目标。通常的一轮建议严重偏向封闭源和专有软件。它不一定是这样。
+每年年初似乎都有疯狂的冲动想提高工作效率。新年的决心,渴望开启新的一年,当然,“抛弃旧的,拥抱新的”的态度促成了这一切。通常这时的建议严重偏向闭源和专有软件,但事实上并不用这样。
这是我挑选出的 19 个新的(或者对你而言新的)开源工具中的第九个工具来帮助你在 2019 年更有效率。
### TaskBoard
-正如我在本系列的[第二篇文章][1]中所写的那样,[看板][2]现在非常受欢迎。并非所有的看板都是相同的。[TaskBoard][3] 是一个易于在现有 Web 服务器上部署的 PHP 应用,它有一些易于使用和管理的功能。
+正如我在本系列的[第二篇文章][1]中所写的那样,[看板][2]现在非常受欢迎。但并非所有的看板都是相同的。[TaskBoard][3] 是一个易于在现有 Web 服务器上部署的 PHP 应用,它有一些易于使用和管理的功能。
![](https://opensource.com/sites/default/files/uploads/taskboard-1.png)
@@ -29,15 +30,15 @@
![](https://opensource.com/sites/default/files/uploads/taskboard-2.png)
-TaskBoard 还允许你创建自动操作,包括更改用户分配、列或卡片类别这些操作。虽然 TaskBoard 不如其他一些看板应用那么强大,但你可以设置自动操作,使看板用户更容易看到卡片,清除截止日期,并根据需要自动为人们分配新卡片。例如,在下面的截图中,如果将卡片分配给 “admin” 用户,那么它的颜色将更改为红色,并且当将卡片分配给我的用户时,其颜色将更改为蓝绿色。如果项目已添加到“待办事项”列,我还添加了一个操作来清除项目的截止日期,并在发生这种情况时自动将卡片分配给我的用户。
+TaskBoard 还允许你创建自动操作,包括更改用户分配、列或卡片类别这些操作。虽然 TaskBoard 不如其他一些看板应用那么强大,但你可以设置自动操作,使看板用户更容易看到卡片、清除截止日期,并根据需要自动为人们分配新卡片。例如,在下面的截图中,如果将卡片分配给 “admin” 用户,那么它的颜色将更改为红色,并且当将卡片分配给我的用户时,其颜色将更改为蓝绿色。如果项目已添加到“待办事项”列,我还添加了一个操作来清除项目的截止日期,并在发生这种情况时自动将卡片分配给我的用户。
![](https://opensource.com/sites/default/files/uploads/taskboard-3.png)
-卡片非常简单。虽然他们没有开始日期,但他们确实有结束日期和点数字段。点数可用于估计所需的时间、所需的工作量或仅是一般优先级。使用点数是可选的,但如果你使用 TaskBoard 进行 scrum 规划或其他敏捷技术,那么这是一个非常方便的功能。你还可以按用户和类别过滤视图。这对于正在进行多个工作流的团队非常有用,因为它允许团队负责人或经理了解进度状态或人员工作量。
+卡片非常简单。虽然它们没有开始日期,但它们确实有结束日期和点数字段。点数可用于估计所需的时间、所需的工作量或仅是一般优先级。使用点数是可选的,但如果你使用 TaskBoard 进行 scrum 规划或其他敏捷技术,那么这是一个非常方便的功能。你还可以按用户和类别过滤视图。这对于正在进行多个工作流的团队非常有用,因为它允许团队负责人或经理了解进度状态或人员工作量。
![](https://opensource.com/sites/default/files/uploads/taskboard-4.png)
-如果你需要一个相当轻便的看板,请看下 TaskBoard。它安装快速,有一些很好的功能,且非常,非常容易使用。它还足够的灵活性,可用于开发团队,个人任务跟踪等等。
+如果你需要一个相当轻便的看板,请看下 TaskBoard。它安装快速,有一些很好的功能,且非常、非常容易使用。它还足够的灵活性,可用于开发团队,个人任务跟踪等等。
--------------------------------------------------------------------------------
@@ -46,13 +47,13 @@ via: https://opensource.com/article/19/1/productivity-tool-taskboard
作者:[Kevin Sonney][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/) 荣誉推出
[a]: https://opensource.com/users/ksonney (Kevin Sonney)
[b]: https://github.com/lujun9972
-[1]: https://opensource.com/article/19/1/productivity-tool-wekan
+[1]: https://linux.cn/article-10454-1.html
[2]: https://en.wikipedia.org/wiki/Kanban
[3]: https://taskboard.matthewross.me/
[4]: https://taskboard.matthewross.me/docs/
diff --git a/published/20190122 Dcp (Dat Copy) - Easy And Secure Way To Transfer Files Between Linux Systems.md b/published/201902/20190122 Dcp (Dat Copy) - Easy And Secure Way To Transfer Files Between Linux Systems.md
similarity index 100%
rename from published/20190122 Dcp (Dat Copy) - Easy And Secure Way To Transfer Files Between Linux Systems.md
rename to published/201902/20190122 Dcp (Dat Copy) - Easy And Secure Way To Transfer Files Between Linux Systems.md
diff --git a/published/201902/20190122 Get started with Go For It, a flexible to-do list application.md b/published/201902/20190122 Get started with Go For It, a flexible to-do list application.md
new file mode 100644
index 0000000000..e2602b216c
--- /dev/null
+++ b/published/201902/20190122 Get started with Go For It, a flexible to-do list application.md
@@ -0,0 +1,61 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10557-1.html)
+[#]: subject: (Get started with Go For It, a flexible to-do list application)
+[#]: via: (https://opensource.com/article/19/1/productivity-tool-go-for-it)
+[#]: author: (Kevin Sonney https://opensource.com/users/ksonney (Kevin Sonney))
+
+开始使用 Go For It 吧,一个灵活的待办事项列表程序
+======
+
+> Go For It,是我们开源工具系列中的第十个工具,它将使你在 2019 年更高效,它在 Todo.txt 系统的基础上构建,以帮助你完成更多工作。
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coffee_cafe_brew_laptop_desktop.jpg?itok=G-n1o1-o)
+
+每年年初似乎都有疯狂的冲动想提高工作效率。新年的决心,渴望开启新的一年,当然,“抛弃旧的,拥抱新的”的态度促成了这一切。通常这时的建议严重偏向闭源和专有软件,但事实上并不用这样。
+
+这是我挑选出的 19 个新的(或者对你而言新的)开源工具中的第 10 个工具来帮助你在 2019 年更有效率。
+
+### Go For It
+
+有时,人们要高效率需要的不是一个花哨的看板或一组笔记,而是一个简单、直接的待办事项清单。像“将项目添加到列表中,在完成后检查”一样基本的东西。为此,[纯文本 Todo.txt 系统][1]可能是最容易使用的系统之一,几乎所有系统都支持它。
+
+![](https://opensource.com/sites/default/files/uploads/go-for-it_1_1.png)
+
+[Go For It][2] 是一个简单易用的 Todo.txt 图形界面。如果你已经在使用 Todo.txt,它可以与现有文件一起使用,如果还没有,那么可以同时创建待办事项和完成事项。它允许拖放任务排序,允许用户按照他们想要执行的顺序组织待办事项。它还支持 [Todo.txt 格式指南][3]中所述的优先级、项目和上下文。而且,只需单击任务列表中的项目或者上下文就可通过它们过滤任务。
+
+![](https://opensource.com/sites/default/files/uploads/go-for-it_2.png)
+
+一开始,Go For It 可能看起来与任何其他 Todo.txt 程序相同,但外观可能是骗人的。将 Go For It 与其他程序真正区分开的功能是它包含一个内置的[番茄工作法][4]计时器。选择要完成的任务,切换到“计时器”选项卡,然后单击“启动”。任务完成后,只需单击“完成”,它将自动重置计时器并选择列表中的下一个任务。你可以暂停并重新启动计时器,也可以单击“跳过”跳转到下一个任务(或中断)。在当前任务剩余 60 秒时,它会发出警告。任务的默认时间设置为 25 分钟,中断的默认时间设置为 5 分钟。你可以在“设置”页面中调整,同时还能调整 Todo.txt 和 done.txt 文件的目录的位置。
+
+![](https://opensource.com/sites/default/files/uploads/go-for-it_3.png)
+
+Go For It 的第三个选项卡是“已完成”,允许你查看已完成的任务并在需要时将其清除。能够看到你已经完成的可能是非常激励的,也是一种了解你在更长的过程中进度的好方法。
+
+![](https://opensource.com/sites/default/files/uploads/go-for-it_4.png)
+
+它还有 Todo.txt 的所有其他优点。Go For It 的列表可以被其他使用相同格式的程序访问,包括 [Todo.txt 的原始命令行工具][5]和任何已安装的[附加组件][6]。
+
+Go For It 旨在成为一个简单的工具来帮助管理你的待办事项列表并完成这些项目。如果你已经使用过 Todo.txt,那么 Go For It 是你的工具箱的绝佳补充,如果你还没有,这是一个尝试最简单、最灵活系统之一的好机会。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/1/productivity-tool-go-for-it
+
+作者:[Kevin Sonney][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/ksonney (Kevin Sonney)
+[b]: https://github.com/lujun9972
+[1]: http://todotxt.org/
+[2]: http://manuel-kehl.de/projects/go-for-it/
+[3]: https://github.com/todotxt/todo.txt
+[4]: https://en.wikipedia.org/wiki/Pomodoro_Technique
+[5]: https://github.com/todotxt/todo.txt-cli
+[6]: https://github.com/todotxt/todo.txt-cli/wiki/Todo.sh-Add-on-Directory
diff --git a/published/201902/20190122 How To Copy A File-Folder From A Local System To Remote System In Linux.md b/published/201902/20190122 How To Copy A File-Folder From A Local System To Remote System In Linux.md
new file mode 100644
index 0000000000..66407b0156
--- /dev/null
+++ b/published/201902/20190122 How To Copy A File-Folder From A Local System To Remote System In Linux.md
@@ -0,0 +1,393 @@
+[#]: collector: (lujun9972)
+[#]: translator: (luming)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10569-1.html)
+[#]: subject: (How To Copy A File/Folder From A Local System To Remote System In Linux?)
+[#]: via: (https://www.2daygeek.com/linux-scp-rsync-pscp-command-copy-files-folders-in-multiple-servers-using-shell-script/)
+[#]: author: (Prakash Subramanian https://www.2daygeek.com/author/prakash/)
+
+如何在 Linux 上复制文件/文件夹到远程系统?
+======
+
+从一个服务器复制文件到另一个服务器,或者从本地到远程复制是 Linux 管理员的日常任务之一。
+
+我觉得不会有人不同意,因为无论在哪里这都是你的日常操作之一。有很多办法都能处理这个任务,我们试着加以概括。你可以挑一个喜欢的方法。当然,看看其他命令也能在别的地方帮到你。
+
+我已经在自己的环境下测试过所有的命令和脚本了,因此你可以直接用到日常工作当中。
+
+通常大家都倾向 `scp`,因为它是文件复制的原生命令之一。但本文所列出的其它命令也很好用,建议你尝试一下。
+
+文件复制可以轻易地用以下四种方法。
+
+- `scp`:在网络上的两个主机之间复制文件,它使用 `ssh` 做文件传输,并使用相同的认证方式,具有相同的安全性。
+- `rsync`:是一个既快速又出众的多功能文件复制工具。它能本地复制、通过远程 shell 在其它主机之间复制,或者与远程的 `rsync` 守护进程 之间复制。
+- `pscp`:是一个并行复制文件到多个主机上的程序。它提供了诸多特性,例如为 `scp` 配置免密传输,保存输出到文件,以及超时控制。
+- `prsync`:也是一个并行复制文件到多个主机上的程序。它也提供了诸多特性,例如为 `ssh` 配置免密传输,保存输出到 文件,以及超时控制。
+
+### 方式 1:如何在 Linux 上使用 scp 命令从本地系统向远程系统复制文件/文件夹?
+
+`scp` 命令可以让我们从本地系统复制文件/文件夹到远程系统上。
+
+我会把 `output.txt` 文件从本地系统复制到 `2g.CentOS.com` 远程系统的 `/opt/backup` 文件夹下。
+
+```
+# scp output.txt root@2g.CentOS.com:/opt/backup
+
+output.txt 100% 2468 2.4KB/s 00:00
+```
+
+从本地系统复制两个文件 `output.txt` 和 `passwd-up.sh` 到远程系统 `2g.CentOs.com` 的 `/opt/backup` 文件夹下。
+
+```
+# scp output.txt passwd-up.sh root@2g.CentOS.com:/opt/backup
+
+output.txt 100% 2468 2.4KB/s 00:00
+passwd-up.sh 100% 877 0.9KB/s 00:00
+```
+
+从本地系统复制 `shell-script` 文件夹到远程系统 `2g.CentOs.com` 的 `/opt/back` 文件夹下。
+
+这会连同`shell-script` 文件夹下所有的文件一同复制到`/opt/back` 下。
+
+```
+# scp -r /home/daygeek/2g/shell-script/ root@:/opt/backup/
+
+output.txt 100% 2468 2.4KB/s 00:00
+ovh.sh 100% 76 0.1KB/s 00:00
+passwd-up.sh 100% 877 0.9KB/s 00:00
+passwd-up1.sh 100% 7 0.0KB/s 00:00
+server-list.txt 100% 23 0.0KB/s 00:00
+```
+
+### 方式 2:如何在 Linux 上使用 scp 命令和 Shell 脚本复制文件/文件夹到多个远程系统上?
+
+如果你想复制同一个文件到多个远程服务器上,那就需要创建一个如下面那样的小 shell 脚本。
+
+并且,需要将服务器添加进 `server-list.txt` 文件。确保添加成功后,每个服务器应当单独一行。
+
+最终,你想要的脚本就像下面这样:
+
+```
+# file-copy.sh
+
+#!/bin/sh
+for server in `more server-list.txt`
+do
+ scp /home/daygeek/2g/shell-script/output.txt root@$server:/opt/backup
+done
+```
+
+完成之后,给 `file-copy.sh` 文件设置可执行权限。
+
+```
+# chmod +x file-copy.sh
+```
+
+最后运行脚本完成复制。
+
+```
+# ./file-copy.sh
+
+output.txt 100% 2468 2.4KB/s 00:00
+output.txt 100% 2468 2.4KB/s 00:00
+```
+
+使用下面的脚本可以复制多个文件到多个远程服务器上。
+
+```
+# file-copy.sh
+
+#!/bin/sh
+for server in `more server-list.txt`
+do
+ scp /home/daygeek/2g/shell-script/output.txt passwd-up.sh root@$server:/opt/backup
+done
+```
+
+下面结果显示所有的两个文件都复制到两个服务器上。
+
+```
+# ./file-cp.sh
+
+output.txt 100% 2468 2.4KB/s 00:00
+passwd-up.sh 100% 877 0.9KB/s 00:00
+output.txt 100% 2468 2.4KB/s 00:00
+passwd-up.sh 100% 877 0.9KB/s 00:00
+```
+
+使用下面的脚本递归地复制文件夹到多个远程服务器上。
+
+```
+# file-copy.sh
+
+#!/bin/sh
+for server in `more server-list.txt`
+do
+ scp -r /home/daygeek/2g/shell-script/ root@$server:/opt/backup
+done
+```
+
+上述脚本的输出。
+
+```
+# ./file-cp.sh
+
+output.txt 100% 2468 2.4KB/s 00:00
+ovh.sh 100% 76 0.1KB/s 00:00
+passwd-up.sh 100% 877 0.9KB/s 00:00
+passwd-up1.sh 100% 7 0.0KB/s 00:00
+server-list.txt 100% 23 0.0KB/s 00:00
+
+output.txt 100% 2468 2.4KB/s 00:00
+ovh.sh 100% 76 0.1KB/s 00:00
+passwd-up.sh 100% 877 0.9KB/s 00:00
+passwd-up1.sh 100% 7 0.0KB/s 00:00
+server-list.txt 100% 23 0.0KB/s 00:00
+```
+
+### 方式 3:如何在 Linux 上使用 pscp 命令复制文件/文件夹到多个远程系统上?
+
+`pscp` 命令可以直接让我们复制文件到多个远程服务器上。
+
+使用下面的 `pscp` 命令复制单个文件到远程服务器。
+
+```
+# pscp.pssh -H 2g.CentOS.com /home/daygeek/2g/shell-script/output.txt /opt/backup
+
+[1] 18:46:11 [SUCCESS] 2g.CentOS.com
+```
+
+使用下面的 `pscp` 命令复制多个文件到远程服务器。
+
+```
+# pscp.pssh -H 2g.CentOS.com /home/daygeek/2g/shell-script/output.txt ovh.sh /opt/backup
+
+[1] 18:47:48 [SUCCESS] 2g.CentOS.com
+```
+
+使用下面的 `pscp` 命令递归地复制整个文件夹到远程服务器。
+
+```
+# pscp.pssh -H 2g.CentOS.com -r /home/daygeek/2g/shell-script/ /opt/backup
+
+[1] 18:48:46 [SUCCESS] 2g.CentOS.com
+```
+
+使用下面的 `pscp` 命令使用下面的命令复制单个文件到多个远程服务器。
+
+```
+# pscp.pssh -h server-list.txt /home/daygeek/2g/shell-script/output.txt /opt/backup
+
+[1] 18:49:48 [SUCCESS] 2g.CentOS.com
+[2] 18:49:48 [SUCCESS] 2g.Debian.com
+```
+
+使用下面的 `pscp` 命令复制多个文件到多个远程服务器。
+
+```
+# pscp.pssh -h server-list.txt /home/daygeek/2g/shell-script/output.txt passwd-up.sh /opt/backup
+
+[1] 18:50:30 [SUCCESS] 2g.Debian.com
+[2] 18:50:30 [SUCCESS] 2g.CentOS.com
+```
+
+使用下面的命令递归地复制文件夹到多个远程服务器。
+
+```
+# pscp.pssh -h server-list.txt -r /home/daygeek/2g/shell-script/ /opt/backup
+
+[1] 18:51:31 [SUCCESS] 2g.Debian.com
+[2] 18:51:31 [SUCCESS] 2g.CentOS.com
+```
+
+### 方式 4:如何在 Linux 上使用 rsync 命令复制文件/文件夹到多个远程系统上?
+
+`rsync` 是一个即快速又出众的多功能文件复制工具。它能本地复制、通过远程 shell 在其它主机之间复制,或者在远程 `rsync` 守护进程 之间复制。
+
+使用下面的 `rsync` 命令复制单个文件到远程服务器。
+
+```
+# rsync -avz /home/daygeek/2g/shell-script/output.txt root@2g.CentOS.com:/opt/backup
+
+sending incremental file list
+output.txt
+
+sent 598 bytes received 31 bytes 1258.00 bytes/sec
+total size is 2468 speedup is 3.92
+```
+
+使用下面的 `rsync` 命令复制多个文件到远程服务器。
+
+```
+# rsync -avz /home/daygeek/2g/shell-script/output.txt passwd-up.sh root@2g.CentOS.com:/opt/backup
+
+sending incremental file list
+output.txt
+passwd-up.sh
+
+sent 737 bytes received 50 bytes 1574.00 bytes/sec
+total size is 2537 speedup is 3.22
+```
+
+使用下面的 `rsync` 命令通过 `ssh` 复制单个文件到远程服务器。
+
+```
+# rsync -avzhe ssh /home/daygeek/2g/shell-script/output.txt root@2g.CentOS.com:/opt/backup
+
+sending incremental file list
+output.txt
+
+sent 598 bytes received 31 bytes 419.33 bytes/sec
+total size is 2.47K speedup is 3.92
+```
+
+使用下面的 `rsync` 命令通过 `ssh` 递归地复制文件夹到远程服务器。这种方式只复制文件不包括文件夹。
+
+```
+# rsync -avzhe ssh /home/daygeek/2g/shell-script/ root@2g.CentOS.com:/opt/backup
+
+sending incremental file list
+./
+output.txt
+ovh.sh
+passwd-up.sh
+passwd-up1.sh
+server-list.txt
+
+sent 3.85K bytes received 281 bytes 8.26K bytes/sec
+total size is 9.12K speedup is 2.21
+```
+
+### 方式 5:如何在 Linux 上使用 rsync 命令和 Shell 脚本复制文件/文件夹到多个远程系统上?
+
+如果你想复制同一个文件到多个远程服务器上,那也需要创建一个如下面那样的小 shell 脚本。
+
+```
+# file-copy.sh
+
+#!/bin/sh
+for server in `more server-list.txt`
+do
+ rsync -avzhe ssh /home/daygeek/2g/shell-script/ root@2g.CentOS.com$server:/opt/backup
+done
+```
+
+上面脚本的输出。
+
+```
+# ./file-copy.sh
+
+sending incremental file list
+./
+output.txt
+ovh.sh
+passwd-up.sh
+passwd-up1.sh
+server-list.txt
+
+sent 3.86K bytes received 281 bytes 8.28K bytes/sec
+total size is 9.13K speedup is 2.21
+
+sending incremental file list
+./
+output.txt
+ovh.sh
+passwd-up.sh
+passwd-up1.sh
+server-list.txt
+
+sent 3.86K bytes received 281 bytes 2.76K bytes/sec
+total size is 9.13K speedup is 2.21
+```
+
+### 方式 6:如何在 Linux 上使用 scp 命令和 Shell 脚本从本地系统向多个远程系统复制文件/文件夹?
+
+在上面两个 shell 脚本中,我们需要事先指定好文件和文件夹的路径,这儿我做了些小修改,让脚本可以接收文件或文件夹作为输入参数。当你每天需要多次执行复制时,这将会非常有用。
+
+```
+# file-copy.sh
+
+#!/bin/sh
+for server in `more server-list.txt`
+do
+scp -r $1 root@2g.CentOS.com$server:/opt/backup
+done
+```
+
+输入文件名并运行脚本。
+
+```
+# ./file-copy.sh output1.txt
+
+output1.txt 100% 3558 3.5KB/s 00:00
+output1.txt 100% 3558 3.5KB/s 00:00
+```
+
+### 方式 7:如何在 Linux 系统上用非标准端口复制文件/文件夹到远程系统?
+
+如果你想使用非标准端口,使用下面的 shell 脚本复制文件或文件夹。
+
+如果你使用了非标准端口,确保像下面 `scp` 命令那样指定好了端口号。
+
+```
+# file-copy-scp.sh
+
+#!/bin/sh
+for server in `more server-list.txt`
+do
+scp -P 2222 -r $1 root@2g.CentOS.com$server:/opt/backup
+done
+```
+
+运行脚本,输入文件名。
+
+```
+# ./file-copy.sh ovh.sh
+
+ovh.sh 100% 3558 3.5KB/s 00:00
+ovh.sh 100% 3558 3.5KB/s 00:00
+```
+
+如果你使用了非标准端口,确保像下面 `rsync` 命令那样指定好了端口号。
+
+```
+# file-copy-rsync.sh
+
+#!/bin/sh
+for server in `more server-list.txt`
+do
+rsync -avzhe 'ssh -p 2222' $1 root@2g.CentOS.com$server:/opt/backup
+done
+```
+
+运行脚本,输入文件名。
+
+```
+# ./file-copy-rsync.sh passwd-up.sh
+sending incremental file list
+passwd-up.sh
+
+sent 238 bytes received 35 bytes 26.00 bytes/sec
+total size is 159 speedup is 0.58
+
+sending incremental file list
+passwd-up.sh
+
+sent 238 bytes received 35 bytes 26.00 bytes/sec
+total size is 159 speedup is 0.58
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/linux-scp-rsync-pscp-command-copy-files-folders-in-multiple-servers-using-shell-script/
+
+作者:[Prakash Subramanian][a]
+选题:[lujun9972][b]
+译者:[LuuMing](https://github.com/LuuMing)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/prakash/
+[b]: https://github.com/lujun9972
diff --git a/published/201902/20190123 Book Review- Fundamentals of Linux.md b/published/201902/20190123 Book Review- Fundamentals of Linux.md
new file mode 100644
index 0000000000..bdde86d16e
--- /dev/null
+++ b/published/201902/20190123 Book Review- Fundamentals of Linux.md
@@ -0,0 +1,75 @@
+[#]: collector: (lujun9972)
+[#]: translator: (mySoul8012)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10565-1.html)
+[#]: subject: (Book Review: Fundamentals of Linux)
+[#]: via: (https://itsfoss.com/fundamentals-of-linux-book-review)
+[#]: author: (John Paul https://itsfoss.com/author/john/)
+
+书评:《Linux 基础》
+======
+
+介绍 Linux 的基础知识以及它的工作原理的书很多,今天,我们将会点评这样一本书。这次讨论的主题为 Oliver Pelz 所写的 《[Linux 基础][1]》,由 [PacktPub][2] 出版。
+
+[Oliver Pelz][3] 是一位拥有超过十年软件开发经验的开发者和系统管理员,拥有生物信息学学位证书。
+
+### 《Linux 基础》
+
+![Fundamental of Linux books][4]
+
+正如可以从书名中猜到那样,《Linux 基础》的目标是为读者打下一个从了解 Linux 到学习 Linux 命令行的坚实基础。这本书一共有两百多页,因此它专注于教给用户日常任务和解决经常遇到的问题。本书是为想要成为 Linux 管理员的读者而写的。
+
+第一章首先概述了虚拟化。本书作者指导了读者如何在 [VirtualBox][6] 中创建 [CentOS][5] 实例。如何克隆实例,如何使用快照。并且同时你也会学习到如何通过 SSH 命令连接到虚拟机。
+
+第二章介绍了 Linux 命令行的基础知识,包括 shell 通配符,shell 展开,如何使用包含空格和特殊字符的文件名称。如何来获取命令手册的帮助页面。如何使用 `sed`、`awk` 这两个命令。如何浏览 Linux 的文件系统。
+
+第三章更深入的介绍了 Linux 文件系统。你将了解如何在 Linux 中文件是如何链接的,以及如何搜索它们。你还将获得用户、组,以及文件权限的大概了解。由于本章的重点介绍了如何与文件进行交互。因此还将会介绍如何从命令行中读取文本文件,以及初步了解如何使用 vim 编辑器。
+
+第四章重点介绍了如何使用命令行。以及涵盖的重要命令。如 `cat`、`sort`、`awk`、`tee`、`tar`、`rsync`、`nmap`、`htop` 等。你还将会了解到进程,以及它们如何彼此通讯。这一章还介绍了 Bash shell 脚本编程。
+
+第五章同时也是本书的最后一章,将会介绍 Linux 和其他高级命令,以及网络的概念。本书的作者讨论了 Linux 是如何处理网络,并提供使用多个虚拟机的示例。同时还将会介绍如何安装新的程序,如何设置防火墙。
+
+### 关于这本书的思考
+
+Linux 的基础知识只有五章和少少的 200 来页可能看起来有些短,但是也涵盖了相当多的信息。同时也将会获得如何使用命令行所需要的知识的一切。
+
+使用本书的时候,需要注意一件事情,即,本书专注于对命令行的关注,没有任何关于如何使用图形化的用户界面的任何教程。这是因为在 Linux 中有太多不同的桌面环境,以及很多的类似的系统应用,因此很难编写一本可以涵盖所有变种的书。此外,还有部分原因还因为本书的面向的用户群体为潜在的 Linux 管理员。
+
+当我看到作者使用 Centos 教授 Linux 的时候有点惊讶。我原本以为他会使用更为常见的 Linux 的发行版本,例如 Ubuntu、Debian 或者 Fedora。原因在于 Centos 是为服务器设计的发行版本。随着时间的推移变化很小,能够为 Linux 的基础知识打下一个非常坚实的基础。
+
+我自己使用 Linux 已经操作五年了。我大部分时间都在使用桌面版本的 Linux。我有些时候会使用命令行操作。但我并没有花太多的时间在那里。我使用鼠标完成了本书中涉及到的很多操作。现在呢。我同时也知道了如何通过终端做到同样的事情。这种方式不会改变我完成任务的方式,但是会有助于自己理解幕后发生的事情。
+
+如果你刚刚使用 Linux,或者计划使用。我不会推荐你阅读这本书。这可能有点绝对化。但是如何你已经花了一些时间在 Linux 上。或者可以快速掌握某种技术语言。那么这本书很适合你。
+
+如果你认为本书适合你的学习需求。你可以从以下链接获取到该书:
+
+- [下载《Linux 基础》](https://www.packtpub.com/networking-and-servers/fundamentals-linux)
+
+我们将在未来几个月内尝试点评更多 Linux 书籍,敬请关注我们。
+
+你最喜欢的关于 Linux 的入门书籍是什么?请在下面的评论中告诉我们。
+
+如果你发现这篇文章很有趣,请花一点时间在社交媒体、Hacker News或 [Reddit][8] 上分享。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/fundamentals-of-linux-book-review
+
+作者:[John Paul][a]
+选题:[lujun9972][b]
+译者:[mySoul8012](https://github.com/mySoul8012)
+校对:[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://www.packtpub.com/networking-and-servers/fundamentals-linux
+[2]: https://www.packtpub.com/
+[3]: http://www.oliverpelz.de/index.html
+[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/fundamentals-of-linux-book-review.jpeg?resize=800%2C450&ssl=1
+[5]: https://centos.org/
+[6]: https://www.virtualbox.org/
+[7]: https://www.centos.org/
+[8]: http://reddit.com/r/linuxusersgroup
diff --git a/published/20190123 Commands to help you monitor activity on your Linux server.md b/published/201902/20190123 Commands to help you monitor activity on your Linux server.md
similarity index 100%
rename from published/20190123 Commands to help you monitor activity on your Linux server.md
rename to published/201902/20190123 Commands to help you monitor activity on your Linux server.md
diff --git a/published/201902/20190124 Get started with LogicalDOC, an open source document management system.md b/published/201902/20190124 Get started with LogicalDOC, an open source document management system.md
new file mode 100644
index 0000000000..35e90d4839
--- /dev/null
+++ b/published/201902/20190124 Get started with LogicalDOC, an open source document management system.md
@@ -0,0 +1,63 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10561-1.html)
+[#]: subject: (Get started with LogicalDOC, an open source document management system)
+[#]: via: (https://opensource.com/article/19/1/productivity-tool-logicaldoc)
+[#]: author: (Kevin Sonney https://opensource.com/users/ksonney)
+
+开始使用 LogicalDOC 吧,一个开源文档管理系统
+======
+
+> 使用 LogicalDOC 更好地跟踪文档版本,这是我们开源工具系列中的第 12 个工具,它将使你在 2019 年更高效。
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/document_free_access_cut_security.png?itok=ocvCv8G2)
+
+每年年初似乎都有疯狂的冲动想提高工作效率。新年的决心,渴望开启新的一年,当然,“抛弃旧的,拥抱新的”的态度促成了这一切。通常这时的建议严重偏向闭源和专有软件,但事实上并不用这样。
+
+这是我挑选出的 19 个新的(或者对你而言新的)开源工具中的第 12 个工具来帮助你在 2019 年更有效率。
+
+### LogicalDOC
+
+高效部分表现在能够在你需要时找到你所需的东西。我们都看到过塞满名称类似的文件的目录,这是每次更改文档时为了跟踪所有版本而重命名这些文件而导致的。例如,我的妻子是一名作家,她在将文档发送给审稿人之前,她经常使用新名称保存文档修订版。
+
+![](https://opensource.com/sites/default/files/uploads/logicaldoc-1.png)
+
+程序员对此一个自然的解决方案是 Git 或者其他版本控制器,但这个不适用于文档作者,因为用于代码的系统通常不能很好地兼容商业文本编辑器使用的格式。之前有人说,“改变格式就行”,[这不是适合每个人的选择][1]。同样,许多版本控制工具对于非技术人员来说并不是非常友好。在大型组织中,有一些工具可以解决此问题,但它们还需要大型组织的资源来运行、管理和支持它们。
+
+![](https://opensource.com/sites/default/files/uploads/logicaldoc-2.png)
+
+[LogicalDOC CE][2] 是为解决此问题而编写的开源文档管理系统。它允许用户签入、签出、查看版本、搜索和锁定文档,并保留版本历史记录,类似于程序员使用的版本控制工具。
+
+LogicalDOC 可在 Linux、MacOS 和 Windows 上[安装][3],使用基于 Java 的安装程序。在安装时,系统将提示你提供数据库存储位置,并提供只在本地文件存储的选项。你将获得访问服务器的 URL 和默认用户名和密码,以及保存用于自动安装脚本选项。
+
+登录后,LogicalDOC 的默认页面会列出你已标记、签出的文档以及有关它们的最新说明。切换到“文档”选项卡将显示你有权访问的文件。你可以在界面中选择文件或使用拖放来上传文档。如果你上传 ZIP 文件,LogicalDOC 会解压它,并将其中的文件添加到仓库中。
+
+![](https://opensource.com/sites/default/files/uploads/logicaldoc-3.png)
+
+右键单击文件将显示一个菜单选项,包括检出文件、锁定文件以防止更改,以及执行大量其他操作。签出文件会将其下载到本地计算机以便编辑。在重新签入之前,其他任何人都无法修改签出的文件。当重新签入文件时(使用相同的菜单),用户可以向版本添加标签,并且需要备注对其执行的操作。
+
+![](https://opensource.com/sites/default/files/uploads/logicaldoc-4.png)
+
+查看早期版本只需在“版本”页面下载就行。对于某些第三方服务,它还有导入和导出选项,内置 [Dropbox][4] 支持。
+
+文档管理不仅仅是能够负担得起昂贵解决方案的大公司才能有的。LogicalDOC 可帮助你追踪文档的版本历史,并为难以管理的文档提供了安全的仓库。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/1/productivity-tool-logicaldoc
+
+作者:[Kevin Sonney][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/ksonney (Kevin Sonney)
+[b]: https://github.com/lujun9972
+[1]: http://www.antipope.org/charlie/blog-static/2013/10/why-microsoft-word-must-die.html
+[2]: https://www.logicaldoc.com/download-logicaldoc-community
+[3]: https://docs.logicaldoc.com/en/installation
+[4]: https://dropbox.com
diff --git a/published/20190124 Understanding Angle Brackets in Bash.md b/published/201902/20190124 Understanding Angle Brackets in Bash.md
similarity index 100%
rename from published/20190124 Understanding Angle Brackets in Bash.md
rename to published/201902/20190124 Understanding Angle Brackets in Bash.md
diff --git a/published/20190125 PyGame Zero- Games without boilerplate.md b/published/201902/20190125 PyGame Zero- Games without boilerplate.md
similarity index 100%
rename from published/20190125 PyGame Zero- Games without boilerplate.md
rename to published/201902/20190125 PyGame Zero- Games without boilerplate.md
diff --git a/published/20190125 Top 5 Linux Distributions for Development in 2019.md b/published/201902/20190125 Top 5 Linux Distributions for Development in 2019.md
similarity index 100%
rename from published/20190125 Top 5 Linux Distributions for Development in 2019.md
rename to published/201902/20190125 Top 5 Linux Distributions for Development in 2019.md
diff --git a/published/20190126 Get started with Tint2, an open source taskbar for Linux.md b/published/201902/20190126 Get started with Tint2, an open source taskbar for Linux.md
similarity index 100%
rename from published/20190126 Get started with Tint2, an open source taskbar for Linux.md
rename to published/201902/20190126 Get started with Tint2, an open source taskbar for Linux.md
diff --git a/published/20190127 Get started with eDEX-UI, a Tron-influenced terminal program for tablets and desktops.md b/published/201902/20190127 Get started with eDEX-UI, a Tron-influenced terminal program for tablets and desktops.md
similarity index 100%
rename from published/20190127 Get started with eDEX-UI, a Tron-influenced terminal program for tablets and desktops.md
rename to published/201902/20190127 Get started with eDEX-UI, a Tron-influenced terminal program for tablets and desktops.md
diff --git a/published/20190128 3 simple and useful GNOME Shell extensions.md b/published/201902/20190128 3 simple and useful GNOME Shell extensions.md
similarity index 100%
rename from published/20190128 3 simple and useful GNOME Shell extensions.md
rename to published/201902/20190128 3 simple and useful GNOME Shell extensions.md
diff --git a/published/20190128 Using more to view text files at the Linux command line.md b/published/201902/20190128 Using more to view text files at the Linux command line.md
similarity index 100%
rename from published/20190128 Using more to view text files at the Linux command line.md
rename to published/201902/20190128 Using more to view text files at the Linux command line.md
diff --git a/published/20190128 fdisk - Easy Way To Manage Disk Partitions In Linux.md b/published/201902/20190128 fdisk - Easy Way To Manage Disk Partitions In Linux.md
similarity index 100%
rename from published/20190128 fdisk - Easy Way To Manage Disk Partitions In Linux.md
rename to published/201902/20190128 fdisk - Easy Way To Manage Disk Partitions In Linux.md
diff --git a/published/201902/20190129 Get started with gPodder, an open source podcast client.md b/published/201902/20190129 Get started with gPodder, an open source podcast client.md
new file mode 100644
index 0000000000..f5449a95de
--- /dev/null
+++ b/published/201902/20190129 Get started with gPodder, an open source podcast client.md
@@ -0,0 +1,65 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10567-1.html)
+[#]: subject: (Get started with gPodder, an open source podcast client)
+[#]: via: (https://opensource.com/article/19/1/productivity-tool-gpodder)
+[#]: author: (Kevin Sonney https://opensource.com/users/ksonney (Kevin Sonney))
+
+开始使用 gPodder 吧,一个开源播客客户端
+======
+
+> 使用 gPodder 将你的播客同步到你的设备上,gPodder 是我们开源工具系列中的第 17 个工具,它将在 2019 年提高你的工作效率。
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/podcast-record-microphone.png?itok=8yUDOywf)
+
+每年年初似乎都有疯狂的冲动想提高工作效率。新年的决心,渴望开启新的一年,当然,“抛弃旧的,拥抱新的”的态度促成了这一切。通常这时的建议严重偏向闭源和专有软件,但事实上并不用这样。
+
+这是我挑选出的 19 个新的(或者对你而言新的)开源工具中的第 17 个工具来帮助你在 2019 年更有效率。
+
+### gPodder
+
+我喜欢播客。哎呀,我非常喜欢它们,因此我录制了其中的三个(你可以在[我的个人资料][1]中找到它们的链接)。我从播客那里学到了很多东西,并在我工作时在后台播放它们。但是,如何在多台桌面和移动设备之间保持同步可能会有一些挑战。
+
+[gPodder][2] 是一个简单的跨平台播客下载器、播放器和同步工具。它支持 RSS feed、[FeedBurner][3]、[YouTube][4] 和 [SoundCloud][5],它还有一个开源的同步服务,你可以根据需要运行它。gPodder 不直接播放播客。相反,它会使用你选择的音频或视频播放器。
+
+![](https://opensource.com/sites/default/files/uploads/gpodder-1.png)
+
+安装 gPodder 非常简单。安装程序适用于 Windows 和 MacOS,同时也有用于主要的 Linux 发行版的软件包。如果你的发行版中没有它,你可以直接从 Git 下载运行。通过 “Add Podcasts via URL” 菜单,你可以输入播客的 RSS 源 URL 或其他服务的 “特殊” URL。gPodder 将获取节目列表并显示一个对话框,你可以在其中选择要下载的节目或在列表上标记旧节目。
+
+![](https://opensource.com/sites/default/files/uploads/gpodder-2.png)
+
+它一个更好的功能是,如果 URL 已经在你的剪贴板中,gPodder 会自动将它放入播放 URL 中,这样你就可以很容易地将新的播客添加到列表中。如果你已有播客 feed 的 OPML 文件,那么可以上传并导入它。还有一个发现选项,让你可搜索 [gPodder.net][6] 上的播客,这是由编写和维护 gPodder 的人员提供的自由及开源的播客的列表网站。
+
+![](https://opensource.com/sites/default/files/uploads/gpodder-3.png)
+
+[mygpo][7] 服务器在设备之间同步播客。gPodder 默认使用 [gPodder.net][8] 的服务器,但是如果你想要运行自己的服务器,那么可以在配置文件中更改它(请注意,你需要直接修改配置文件)。同步能让你在桌面和移动设备之间保持列表一致。如果你在多个设备上收听播客(例如,我在我的工作电脑、家用电脑和手机上收听),这会非常有用,因为这意味着无论你身在何处,你都拥有最近的播客和节目列表而无需一次又一次地设置。
+
+![](https://opensource.com/sites/default/files/uploads/gpodder-4.png)
+
+单击播客节目将显示与其关联的文本,单击“播放”将启动设备的默认音频或视频播放器。如果要使用默认之外的其他播放器,可以在 gPodder 的配置设置中更改此设置。
+
+通过 gPodder,你可以轻松查找、下载和收听播客,在设备之间同步这些播客,在易于使用的界面中访问许多其他功能。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/1/productivity-tool-gpodder
+
+作者:[Kevin Sonney][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/ksonney (Kevin Sonney)
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/users/ksonney
+[2]: https://gpodder.github.io/
+[3]: https://feedburner.google.com/
+[4]: https://youtube.com
+[5]: https://soundcloud.com/
+[6]: http://gpodder.net
+[7]: https://github.com/gpodder/mygpo
+[8]: http://gPodder.net
diff --git a/published/20190129 More About Angle Brackets in Bash.md b/published/201902/20190129 More About Angle Brackets in Bash.md
similarity index 100%
rename from published/20190129 More About Angle Brackets in Bash.md
rename to published/201902/20190129 More About Angle Brackets in Bash.md
diff --git a/published/201902/20190130 Get started with Budgie Desktop, a Linux environment.md b/published/201902/20190130 Get started with Budgie Desktop, a Linux environment.md
new file mode 100644
index 0000000000..58a8a6505c
--- /dev/null
+++ b/published/201902/20190130 Get started with Budgie Desktop, a Linux environment.md
@@ -0,0 +1,61 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10547-1.html)
+[#]: subject: (Get started with Budgie Desktop, a Linux environment)
+[#]: via: (https://opensource.com/article/19/1/productivity-tool-budgie-desktop)
+[#]: author: (Kevin Sonney https://opensource.com/users/ksonney (Kevin Sonney))
+
+开始使用 Budgie 吧,一款 Linux 桌面环境
+======
+
+> 使用 Budgie 按需配置你的桌面,这是我们开源工具系列中的第 18 个工具,它将在 2019 年提高你的工作效率。
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr)
+
+每年年初似乎都有疯狂的冲动想提高工作效率。新年的决心,渴望开启新的一年,当然,“抛弃旧的,拥抱新的”的态度促成了这一切。通常这时的建议严重偏向闭源和专有软件,但事实上并不用这样。
+
+这是我挑选出的 19 个新的(或者对你而言新的)开源工具中的第 18 个工具来帮助你在 2019 年更有效率。
+
+### Budgie 桌面
+
+Linux 中有许多桌面环境。从易于使用并有令人惊叹图形界面的 [GNOME 桌面][1](在大多数主要 Linux 发行版上是默认桌面)和 [KDE][2],到极简主义的 [Openbox][3],再到高度可配置的平铺化的 [i3][4],有很多选择。我要寻找的桌面环境需要速度、不引人注目和干净的用户体验。当桌面不适合你时,很难会有高效率。
+
+![](https://opensource.com/sites/default/files/uploads/budgie-1.png)
+
+[Budgie 桌面][5]是 [Solus][6] Linux 发行版的默认桌面,它在大多数主要 Linux 发行版的附加软件包中提供。它基于 GNOME,并使用了许多你可能已经在计算机上使用的相同工具和库。
+
+其默认桌面非常简约,只有面板和空白桌面。Budgie 包含一个集成的侧边栏(称为 Raven),通过它可以快速访问日历、音频控件和设置菜单。Raven 还包含一个集成的通知区域,其中包含与 MacOS 类似的统一系统消息显示。
+
+![](https://opensource.com/sites/default/files/uploads/budgie-2.png)
+
+点击 Raven 中的齿轮图标会显示 Budgie 的控制面板及其配置。由于 Budgie 仍处于开发阶段,与 GNOME 或 KDE 相比,它的选项有点少,我希望随着时间的推移它会有更多的选项。顶部面板选项允许用户配置顶部面板的排序、位置和内容,这很不错。
+
+![](https://opensource.com/sites/default/files/uploads/budgie-3.png)
+
+Budgie 的 Welcome 应用(首次登录时展示)包含安装其他软件、面板小程序、截图和 Flatpack 软件包的选项。这些小程序有处理网络、截图、额外的时钟和计时器等等。
+
+![](https://opensource.com/sites/default/files/uploads/budgie-4.png)
+
+Budgie 提供干净稳定的桌面。它响应迅速,有许多选项,允许你根据需要自定义它。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/1/productivity-tool-budgie-desktop
+
+作者:[Kevin Sonney][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/ksonney (Kevin Sonney)
+[b]: https://github.com/lujun9972
+[1]: https://www.gnome.org/
+[2]: https://www.kde.org/
+[3]: http://openbox.org/wiki/Main_Page
+[4]: https://i3wm.org/
+[5]: https://getsol.us/solus/experiences/
+[6]: https://getsol.us/home/
diff --git a/published/201902/20190130 Olive is a new Open Source Video Editor Aiming to Take On Biggies Like Final Cut Pro.md b/published/201902/20190130 Olive is a new Open Source Video Editor Aiming to Take On Biggies Like Final Cut Pro.md
new file mode 100644
index 0000000000..430b6210dd
--- /dev/null
+++ b/published/201902/20190130 Olive is a new Open Source Video Editor Aiming to Take On Biggies Like Final Cut Pro.md
@@ -0,0 +1,111 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10577-1.html)
+[#]: subject: (Olive is a new Open Source Video Editor Aiming to Take On Biggies Like Final Cut Pro)
+[#]: via: (https://itsfoss.com/olive-video-editor)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+Olive:一款以 Final Cut Pro 为目标的开源视频编辑器
+======
+
+[Olive][1] 是一个正在开发的新的开源视频编辑器。这个非线性视频编辑器旨在提供高端专业视频编辑软件的免费替代品。目标高么?我认为是的。
+
+如果你读过我们的 [Linux 中的最佳视频编辑器][2]这篇文章,你可能已经注意到大多数“专业级”视频编辑器(如 [Lightworks][3] 或 DaVinciResolve)既不免费也不开源。
+
+[Kdenlive][4] 和 Shotcut 也是此类,但它通常无法达到专业视频编辑的标准(这是许多 Linux 用户说的)。
+
+爱好者级和专业级的视频编辑之间的这种差距促使 Olive 的开发人员启动了这个项目。
+
+![Olive Video Editor][5]
+
+*Olive 视频编辑器界面*
+
+Libre Graphics World 中有一篇详细的[关于 Olive 的点评][6]。实际上,这是我第一次知道 Olive 的地方。如果你有兴趣了解更多信息,请阅读该文章。
+
+### 在 Linux 中安装 Olive 视频编辑器
+
+> 提醒你一下。Olive 正处于发展的早期阶段。你会发现很多 bug 和缺失/不完整的功能。你不应该把它当作你的主要视频编辑器。
+
+如果你想测试 Olive,有几种方法可以在 Linux 上安装它。
+
+#### 通过 PPA 在基于 Ubuntu 的发行版中安装 Olive
+
+你可以在 Ubuntu、Mint 和其他基于 Ubuntu 的发行版使用官方 PPA 安装 Olive。
+
+```
+sudo add-apt-repository ppa:olive-editor/olive-editor
+sudo apt-get update
+sudo apt-get install olive-editor
+```
+
+#### 通过 Snap 安装 Olive
+
+如果你的 Linux 发行版支持 Snap,则可以使用以下命令进行安装。
+
+```
+sudo snap install --edge olive-editor
+```
+
+#### 通过 Flatpak 安装 Olive
+
+如果你的 [Linux 发行版支持 Flatpak][7],你可以通过 Flatpak 安装 Olive 视频编辑器。
+
+- [Flatpak 地址](https://flathub.org/apps/details/org.olivevideoeditor.Olive)
+
+#### 通过 AppImage 使用 Olive
+
+不想安装吗?下载 [AppImage][8] 文件,将其设置为可执行文件并运行它。32 位和 64 位 AppImage 文件都有。你应该下载相应的文件。
+
+- [下载 Olive 的 AppImage](https://github.com/olive-editor/olive/releases/tag/continuous)
+
+Olive 也可用于 Windows 和 macOS。你可以从它的[下载页面][9]获得它。
+
+### 想要支持 Olive 视频编辑器的开发吗?
+
+如果你喜欢 Olive 尝试实现的功能,并且想要支持它,那么你可以通过以下几种方式。
+
+如果你在测试 Olive 时发现一些 bug,请到它们的 GitHub 仓库中报告。
+
+- [提交 bug 报告以帮助 Olive](https://github.com/olive-editor/olive/issues)
+
+如果你是程序员,请浏览 Olive 的源代码,看看你是否可以通过编码技巧帮助项目。
+
+- [Olive 的 GitHub 仓库](https://github.com/olive-editor/olive)
+
+在经济上为项目做贡献是另一种可以帮助开发开源软件的方法。你可以通过成为赞助人来支持 Olive。
+
+- [赞助 Olive](https://www.patreon.com/olivevideoeditor)
+
+如果你没有支持 Olive 的金钱或编码技能,你仍然可以帮助它。在社交媒体或你经常访问的 Linux/软件相关论坛和群组中分享这篇文章或 Olive 的网站。一点微小的口碑都能间接地帮助它。
+
+### 你如何看待 Olive?
+
+评判 Olive 还为时过早。我希望能够持续快速开发,并且在年底之前发布 Olive 的稳定版(如果我没有过于乐观的话)。
+
+你如何看待 Olive?你是否认同开发人员针对专业用户的目标?你希望 Olive 拥有哪些功能?
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/olive-video-editor
+
+作者:[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.olivevideoeditor.org/
+[2]: https://itsfoss.com/best-video-editing-software-linux/
+[3]: https://www.lwks.com/
+[4]: https://kdenlive.org/en/
+[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/olive-video-editor-interface.jpg?resize=800%2C450&ssl=1
+[6]: http://libregraphicsworld.org/blog/entry/introducing-olive-new-non-linear-video-editor
+[7]: https://itsfoss.com/flatpak-guide/
+[8]: https://itsfoss.com/use-appimage-linux/
+[9]: https://www.olivevideoeditor.org/download.php
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/01/olive-video-editor-interface.jpg?fit=800%2C450&ssl=1
diff --git a/published/201902/20190131 Will quantum computing break security.md b/published/201902/20190131 Will quantum computing break security.md
new file mode 100644
index 0000000000..33323796ce
--- /dev/null
+++ b/published/201902/20190131 Will quantum computing break security.md
@@ -0,0 +1,89 @@
+[#]: collector: (lujun9972)
+[#]: translator: (HankChow)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10566-1.html)
+[#]: subject: (Will quantum computing break security?)
+[#]: via: (https://opensource.com/article/19/1/will-quantum-computing-break-security)
+[#]: author: (Mike Bursell https://opensource.com/users/mikecamel)
+
+量子计算会打破现有的安全体系吗?
+======
+
+> 你会希望[某黑客][6]假冒你的银行吗?
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security_privacy_lock.png?itok=ZWjrpFzx)
+
+近年来,量子计算机已经出现在大众的视野当中。量子计算机被认为是第六类计算机,这六类计算机包括:
+
+1. 人力:在人造的计算工具出现之前,人类只能使用人力去进行计算。而承担计算工作的人,只能被称为“计算者”。
+2. 模拟计算工具:由人类制造的一些模拟计算过程的小工具,例如[安提凯希拉装置][1]、星盘、计算尺等等。
+3. 机械工具:在这一个类别中包括了运用到离散数学但未使用电子技术进行计算的工具,例如算盘、Charles Babbage 的差分机等等。
+4. 电子模拟计算工具:这一个类别的计算机多数用于军事方面的用途,例如炸弹瞄准器、枪炮瞄准装置等等。
+5. 电子计算机:我在这里会稍微冒险一点,我觉得 Colossus 是第一台电子计算机,[^1] :这一类几乎包含现代所有的电子设备,从移动电话到超级计算机,都在这个类别当中。
+6. 量子计算机:即将进入我们的生活,而且与之前的几类完全不同。
+
+### 什么是量子计算?
+
+量子计算的概念来源于量子力学,使用的计算方式和我们平常使用的普通计算非常不同。如果想要深入理解,建议从参考[维基百科上的定义][2]开始。对我们来说,最重要的是理解这一点:量子计算机使用量子位进行计算。在这样的前提下,对于很多数学算法和运算操作,量子计算机的计算速度会比普通计算机要快得多。
+
+这里的“快得多”是按数量级来说的“快得多”。在某些情况下,一个计算任务如果由普通计算机来执行,可能要耗费几年或者几十年才能完成,但如果由量子计算机来执行,就只需要几秒钟。这样的速度甚至令人感到可怕。因为量子计算机会非常擅长信息的加密解密计算,即使在没有密钥的情况下,也能快速完成繁重的计算任务。
+
+这意味着,如果拥有足够强大的量子计算机,那么你的所有信息都会被一览无遗,任何被加密的数据都可以被正确解密出来,甚至伪造数字签名也会成为可能。这确实是一个严重的问题。谁也不想被某个黑客冒充成自己在用的银行,更不希望自己在区块链上的交易被篡改得面目全非。
+
+### 好消息
+
+尽管上面的提到的问题非常可怕,但也不需要太担心。
+
+首先,如果要实现上面提到的能力,一台可以操作大量量子位的量子计算机是必不可少的,而这个硬件上的要求就是一个很高的门槛。[^4] 目前普遍认为,规模大得足以有效破解经典加密算法的量子计算机在最近几年还不可能出现。
+
+其次,除了攻击现有的加密算法需要大量的量子位以外,还需要很多量子位来保证容错性。
+
+还有,尽管确实有一些理论上的模型阐述了量子计算机如何对一些现有的算法作出攻击,但是要让这样的理论模型实际运作起来的难度会比我们[^5] 想象中大得多。事实上,有一些攻击手段也是未被完全确认是可行的,又或者这些攻击手段还需要继续耗费很多年的改进才能到达如斯恐怖的程度。
+
+最后,还有很多专业人士正在研究能够防御量子计算的算法(这样的算法也被称为“后量子算法”)。如果这些防御算法经过测试以后投入使用,我们就可以使用这些算法进行加密,来对抗量子计算了。
+
+总而言之,很多专家都认为,我们现有的加密方式在未来 5 年甚至未来 10 年内都是安全的,不需要过分担心。
+
+### 也有坏消息
+
+但我们也并不是高枕无忧了,以下两个问题就值得我们关注:
+
+1. 人们在设计应用系统的时候仍然没有对量子计算作出太多的考量。如果设计的系统可能会使用 10 年以上,又或者数据加密和签名的时间跨度在 10 年以上,那么就必须考虑量子计算在未来会不会对系统造成不利的影响。
+2. 新出现的防御量子计算的算法可能会是专有的。也就是说,如果基于这些防御量子计算的算法来设计系统,那么在系统落地的时候,可能会需要为此付费。尽管我是支持开源的,尤其是[开源密码学][3],但我最担心的就是无法开源这方面的内容。而且最糟糕的是,在建立新的协议标准时(不管是事实标准还是通过标准组织建立的标准),无论是故意的,还是无意忽略,或者是没有好的开源替代品,他们都很可能使用专有算法而排除使用开源算法。
+
+### 我们要怎样做?
+
+幸运的是,针对上述两个问题,我们还是有应对措施的。首先,在整个系统的设计阶段,就需要考虑到它是否会受到量子计算的影响,并作出相应的规划。当然了,不需要现在就立即采取行动,因为当前的技术水平也没法实现有效的方案,但至少也要[在加密方面保持敏捷性][4],以便在任何需要的时候为你的协议和系统更换更有效的加密算法。[^7]
+
+其次是参与开源运动。尽可能鼓励密码学方面的有识之士团结起来,支持开放标准,并投入对非专有的防御量子计算的算法研究当中去。这一点也算是当务之急,因为号召更多的人重视起来并加入研究,比研究本身更为重要。
+
+本文首发于《[Alice, Eve, and Bob][5]》,并在作者同意下重新发表。
+
+[^1]: 我认为把它称为第一台电子可编程计算机是公平的。我知道有早期的非可编程的,也有些人声称是 ENIAC,但我没有足够的空间或精力在这里争论这件事。
+[^2]: No。
+[^3]: See 2. Don't get me wrong, by the way—I grew up near Weston-super-Mare, and it's got things going for it, but it's not Mayfair.
+[^4]: 如果量子物理学家说很难,那么在我看来,就很难。
+[^5]: 而且我假设我们都不是量子物理学家或数学家。
+[^6]: I'm definitely not.
+[^7]: 而且不仅仅是出于量子计算的原因:我们现有的一些经典算法很可能会陷入其他非量子攻击,例如新的数学方法。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/1/will-quantum-computing-break-security
+
+作者:[Mike Bursell][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://opensource.com/users/mikecamel
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Antikythera_mechanism
+[2]: https://en.wikipedia.org/wiki/Quantum_computing
+[3]: https://opensource.com/article/17/10/many-eyes
+[4]: https://aliceevebob.com/2017/04/04/disbelieving-the-many-eyes-hypothesis/
+[5]: https://aliceevebob.com/2019/01/08/will-quantum-computing-break-security/
+[6]: https://www.techopedia.com/definition/20225/j-random-hacker
diff --git a/published/201902/20190201 Top 5 Linux Distributions for New Users.md b/published/201902/20190201 Top 5 Linux Distributions for New Users.md
new file mode 100644
index 0000000000..5641dd8796
--- /dev/null
+++ b/published/201902/20190201 Top 5 Linux Distributions for New Users.md
@@ -0,0 +1,111 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10553-1.html)
+[#]: subject: (Top 5 Linux Distributions for New Users)
+[#]: via: (https://www.linux.com/blog/learn/2019/2/top-5-linux-distributions-new-users)
+[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen)
+
+5 个面向新手的 Linux 发行版
+======
+
+> 5 个可使用新用户有如归家般感觉的发行版。
+
+![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/deepin-main.jpg?itok=ASgr0mOP)
+
+从最初的 Linux 到现在,Linux 已经发展了很长一段路。但是,无论你曾经多少次听说过现在使用 Linux 有多容易,仍然会有表示怀疑的人。而要真的承担得其这份声明,桌面必须足够简单,以便不熟悉 Linux 的人也能够使用它。事实上大量的桌面发行版使这成为了现实。
+
+### 无需 Linux 知识
+
+将这个清单误解为又一个“最佳用户友好型 Linux 发行版”的清单可能很简单。但这不是我们要在这里看到的。这二者之间有什么不同?就我的目的而言,定义的界限是 Linux 是否真正起到了使用的作用。换句话说,你是否可以将这个桌面操作系统放在一个用户面前,并让他们应用自如而无需懂得 Linux 知识呢?
+
+不管你相信与否,有些发行版就能做到。这里我将介绍给你 5 个这样的发行版。这些或许你全都听说过。它们或许不是你所选择的发行版,但可以向你保证它们无需过多关注,而是将用户放在眼前的。
+
+我们来看看选中的几个。
+
+### Elementary OS
+
+[Elementary OS](https://elementary.io/) 的理念主要围绕人们如何实际使用他们的桌面。开发人员和设计人员不遗余力地创建尽可能简单的桌面。在这个过程中,他们致力于去 Linux 化的 Linux。这并不是说他们已经从这个等式中删除了 Linux。不,恰恰相反,他们所做的就是创建一个与你所发现的一样的中立的操作系统。Elementary OS 是如此流畅,以确保一切都完美合理。从单个 Dock 到每个人都清晰明了的应用程序菜单,这是一个桌面,而不用提醒用户说,“你正在使用 Linux!” 事实上,其布局本身就让人联想到 Mac,但附加了一个简单的应用程序菜单(图 1)。
+
+![Elementary OS Juno][2]
+
+*图 1:Elementary OS Juno 应用菜单*
+
+将 Elementary OS 放在此列表中的另一个重要原因是它不像其他桌面发行版那样灵活。当然,有些用户会对此不以为然,但是如果桌面没有向用户扔出各种花哨的定制诱惑,那么就会形成一个非常熟悉的环境:一个既不需要也不允许大量修修补补的环境。操作系统在让新用户熟悉该平台这一方面还有很长的路要走。
+
+与任何现代 Linux 桌面发行版一样,Elementary OS 包括了应用商店,称为 AppCenter,用户可以在其中安装所需的所有应用程序,而无需触及命令行。
+
+### 深度操作系统
+
+[深度操作系统](https://www.deepin.org/)不仅得到了市场上最漂亮的台式机之一的赞誉,它也像任何桌面操作系统一样容易上手。其桌面界面非常简单,对于毫无 Linux 经验的用户来说,它的上手速度非常快。事实上,你很难找到无法立即上手使用 Deepin 桌面的用户。而这里唯一可能的障碍可能是其侧边栏控制中心(图 2)。
+
+![][5]
+
+*图 2:Deepin 的侧边栏控制编码*
+
+但即使是侧边栏控制面板,也像市场上的任何其他配置工具一样直观。任何使用过移动设备的人对于这种布局都很熟悉。至于打开应用程序,Deepin 的启动器采用了 macOS Launchpad 的方式。此按钮位于桌面底座上通常最右侧的位置,因此用户立即就可以会意,知道它可能类似于标准的“开始”菜单。
+
+与 Elementary OS(以及市场上大多数 Linux 发行版)类似,深度操作系统也包含一个应用程序商店(简称为“商店”),可以轻松安装大量应用程序。
+
+### Ubuntu
+
+你知道肯定有它。[Ubuntu](https://www.ubuntu.com/) 通常在大多数用户友好的 Linux 列表中占据首位。因为它是少数几个不需要懂得 Linux 就能使用的桌面之一。但在采用 GNOME(和 Unity 谢幕)之前,情况并非如此。因为 Unity 经常需要进行一些调整才能达到一点 Linux 知识都不需要的程度(图 3)。现在 Ubuntu 已经采用了 GNOME,并将其调整到甚至不需要懂得 GNOME 的程度,这个桌面使得对 Linux 的简单性和可用性的要求不再是迫切问题。
+
+![Ubuntu 18.04][7]
+
+*图 3:Ubuntu 18.04 桌面可使用马上熟悉起来*
+
+与 Elementary OS 不同,Ubuntu 对用户毫无阻碍。因此,任何想从桌面上获得更多信息的人都可以拥有它。但是,其开箱即用的体验对于任何类型的用户都是足够的。任何一个让用户不知道他们触手可及的力量有多少的桌面,肯定不如 Ubuntu。
+
+### Linux Mint
+
+我需要首先声明,我从来都不是 [Linux Mint](https://linuxmint.com/) 的忠实粉丝。但这并不是说我不尊重开发者的工作,而更多的是一种审美观点。我更喜欢现代化的桌面环境。但是,旧式的学校计算机桌面的隐喻(可以在默认的 Cinnamon 桌面中找到)可以让几乎每个人使用它的人都格外熟悉。Linux Mint 使用任务栏、开始按钮、系统托盘和桌面图标(图 4),提供了一个需要零学习曲线的界面。事实上,一些用户最初可能会被愚弄,以为他们正在使用 Windows 7 的克隆版。甚至是它的更新警告图标也会让用户感到非常熟悉。
+
+![Linux Mint][9]
+
+*图 4:Linux Mint 的 Cinnamon 桌面非常像 Windows 7*
+
+因为 Linux Mint 受益于其所基于的 Ubuntu,它不仅会让你马上熟悉起来,而且具有很高的可用性。无论你是否对底层平台有所了解,用户都会立即感受到宾至如归的感觉。
+
+### Ubuntu Budgie
+
+我们的列表将以这样一个发行版做结:它也能让用户忘记他们正在使用 Linux,并且使用常用工具变得简单、美观。使 Ubuntu 融合 Budgie 桌面可以构成一个令人印象深刻的易用发行版。虽然其桌面布局(图 5)可能不太一样,但毫无疑问,适应这个环境并不需要浪费时间。实际上,除了 Dock 默认居于桌面的左侧,[Ubuntu Budgie](https://ubuntubudgie.org/) 确实看起来像 Elementary OS。
+
+![Budgie][11]
+
+*图 5:Budgie 桌面既漂亮又简单*
+
+Ubuntu Budgie 中的系统托盘/通知区域提供了一些不太多见的功能,比如:快速访问 Caffeine(一种保持桌面清醒的工具)、快速笔记工具(用于记录简单笔记)、Night Lite 开关、原地下拉菜单(用于快速访问文件夹),当然还有 Raven 小程序/通知侧边栏(与深度操作系统中的控制中心侧边栏类似,但不太优雅)。Budgie 还包括一个应用程序菜单(左上角),用户可以访问所有已安装的应用程序。打开一个应用程序,该图标将出现在 Dock 中。右键单击该应用程序图标,然后选择“保留在 Dock”以便更快地访问。
+
+Ubuntu Budgie 的一切都很直观,所以几乎没有学习曲线。这种发行版既优雅又易于使用,不能再好了。
+
+### 选择一个吧
+
+至此介绍了 5 个 Linux 发行版,它们各自以自己的方式提供了让任何用户都马上熟悉的桌面体验。虽然这些可能不是你对顶级发行版的选择,但对于那些不熟悉 Linux 的用户来说,却不能否定它们的价值。
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/learn/2019/2/top-5-linux-distributions-new-users
+
+作者:[Jack Wallen][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.linux.com/users/jlwallen
+[b]: https://github.com/lujun9972
+[1]: https://www.linux.com/files/images/elementaryosjpg-2
+[2]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/elementaryos_0.jpg?itok=KxgNUvMW (Elementary OS Juno)
+[3]: https://www.linux.com/licenses/category/used-permission
+[4]: https://www.linux.com/files/images/deepinjpg
+[5]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/deepin.jpg?itok=VV381a9f
+[6]: https://www.linux.com/files/images/ubuntujpg-1
+[7]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ubuntu_1.jpg?itok=bax-_Tsg (Ubuntu 18.04)
+[8]: https://www.linux.com/files/images/linuxmintjpg
+[9]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/linuxmint.jpg?itok=8sPon0Cq (Linux Mint )
+[10]: https://www.linux.com/files/images/budgiejpg-0
+[11]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/budgie_0.jpg?itok=zcf-AHmj (Budgie)
+[12]: https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
diff --git a/published/20190205 DNS and Root Certificates.md b/published/201902/20190205 DNS and Root Certificates.md
similarity index 100%
rename from published/20190205 DNS and Root Certificates.md
rename to published/201902/20190205 DNS and Root Certificates.md
diff --git a/published/201902/20190205 Installing Kali Linux on VirtualBox- Quickest - Safest Way.md b/published/201902/20190205 Installing Kali Linux on VirtualBox- Quickest - Safest Way.md
new file mode 100644
index 0000000000..830ff13fd9
--- /dev/null
+++ b/published/201902/20190205 Installing Kali Linux on VirtualBox- Quickest - Safest Way.md
@@ -0,0 +1,142 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10550-1.html)
+[#]: subject: (Installing Kali Linux on VirtualBox: Quickest & Safest Way)
+[#]: via: (https://itsfoss.com/install-kali-linux-virtualbox)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+在 VirtualBox 上安装 Kali Linux 的最安全快捷的方式
+======
+
+> 本教程将向你展示如何以最快的方式在运行于 Windows 和 Linux 上的 VirtualBox 上安装 Kali Linux。
+
+[Kali Linux][1] 是最好的[黑客][2] 和安全爱好者的 Linux 发行版之一。
+
+由于它涉及像黑客这样的敏感话题,它就像一把双刃剑。我们过去在一篇详细的 [Kali Linux 点评](https://linux.cn/article-10198-1.html)中对此进行了讨论,所以我不会再次赘述。
+
+虽然你可以通过替换现有的操作系统来安装 Kali Linux,但通过虚拟机使用它将是一个更好、更安全的选择。
+
+使用 Virtual Box,你可以将 Kali Linux 当做 Windows / Linux 系统中的常规应用程序一样,几乎就和在系统中运行 VLC 或游戏一样简单。
+
+在虚拟机中使用 Kali Linux 也是安全的。无论你在 Kali Linux 中做什么都不会影响你的“宿主机系统”(即你原来的 Windows 或 Linux 操作系统)。你的实际操作系统将不会受到影响,宿主机系统中的数据将是安全的。
+
+![Kali Linux on Virtual Box][3]
+
+### 如何在 VirtualBox 上安装 Kali Linux
+
+我将在这里使用 [VirtualBox][4]。它是一个很棒的开源虚拟化解决方案,适用于任何人(无论是专业或个人用途)。它可以免费使用。
+
+在本教程中,我们将特指 Kali Linux 的安装,但你几乎可以安装任何其他已有 ISO 文件的操作系统或预先构建好的虚拟机存储文件。
+
+**注意:**这些相同的步骤适用于运行在 Windows / Linux 上的 VirtualBox。
+
+正如我已经提到的,你可以安装 Windows 或 Linux 作为宿主机。但是,在本文中,我安装了 Windows 10(不要讨厌我!),我会尝试在 VirtualBox 中逐步安装 Kali Linux。
+
+而且,最好的是,即使你碰巧使用 Linux 发行版作为主要操作系统,相同的步骤也完全适用!
+
+想知道怎么样做吗?让我们来看看…
+
+### 在 VirtualBox 上安装 Kali Linux 的逐步指导
+
+我们将使用专为 VirtualBox 制作的定制 Kali Linux 镜像。当然,你还可以下载 Kali Linux 的 ISO 文件并创建一个新的虚拟机,但是为什么在你有一个简单的替代方案时还要这样做呢?
+
+#### 1、下载并安装 VirtualBox
+
+你需要做的第一件事是从 Oracle 官方网站下载并安装 VirtualBox。
+
+- [下载 VirtualBox](https://www.virtualbox.org/wiki/Downloads)
+
+下载了安装程序后,只需双击它即可安装 VirtualBox。在 Ubuntu / Fedora Linux 上安装 VirtualBox 也是一样的。
+
+#### 2、下载就绪的 Kali Linux 虚拟镜像
+
+VirtualBox 成功安装后,前往 [Offensive Security 的下载页面][5] 下载用于 VirtualBox 的虚拟机镜像。如果你改变主意想使用 [VMware][6],也有用于它的。
+
+![Kali Linux Virtual Box Image][7]
+
+如你所见,文件大小远远超过 3 GB,你应该使用 torrent 方式或使用 [下载管理器][8] 下载它。
+
+#### 3、在 VirtualBox 上安装 Kali Linux
+
+一旦安装了 VirtualBox 并下载了 Kali Linux 镜像,你只需将其导入 VirtualBox 即可使其正常工作。
+
+以下是如何导入 Kali Linux 的 VirtualBox 镜像:
+
+**步骤 1**:启动 VirtualBox。你会注意到有一个 “Import” 按钮,点击它。
+
+![virtualbox import][9]
+
+*点击 “Import” 按钮*
+
+**步骤 2**:接着,浏览找到你刚刚下载的文件并选择它导入(如你在下图所见)。文件名应该以 “kali linux” 开头,并以 “.ova” 扩展名结束。
+
+![virtualbox import file][10]
+
+*导入 Kali Linux 镜像*
+
+选择好之后,点击 “Next” 进行处理。
+
+**步骤 3**:现在,你将看到要导入的这个虚拟机的设置。你可以自定义它们,这是你的自由。如果你想使用默认设置,也没关系。
+
+你需要选择具有足够存储空间的路径。我永远不会在 Windows 上推荐使用 C:驱动器。
+
+![virtualbox kali linux settings][11]
+
+*以 VDI 方式导入硬盘驱动器*
+
+这里,VDI 方式的硬盘驱动器是指通过分配其存储空间设置来实际挂载该硬盘驱动器。
+
+完成设置后,点击 “Import” 并等待一段时间。
+
+**步骤 4**:你现在将看到这个虚拟机已经列出了。所以,只需点击 “Start” 即可启动它。
+
+你最初可能会因 USB 端口 2.0 控制器支持而出现错误,你可以将其禁用以解决此问题,或者只需按照屏幕上的说明安装其他软件包进行修复即可。现在就完成了!
+
+![kali linux on windows virtual box][12]
+
+*运行于 VirtualBox 中的 Kali Linux*
+
+我希望本指南可以帮助你在 VirtualBox 上轻松安装 Kali Linux。当然,Kali Linux 有很多有用的工具可用于渗透测试 —— 祝你好运!
+
+**提示**:Kali Linux 和 Ubuntu 都是基于 Debian 的。如果你在使用 Kali Linux 时遇到任何问题或错误,可以按照互联网上针对 Ubuntu 或 Debian 的教程进行操作。
+
+### 赠品:免费的 Kali Linux 指南手册
+
+如果你刚刚开始使用 Kali Linux,那么了解如何使用 Kali Linux 是一个好主意。
+
+Kali Linux 背后的公司 Offensive Security 已经创建了一本指南,介绍了 Linux 的基础知识,Kali Linux 的基础知识、配置和设置。它还有一些关于渗透测试和安全工具的章节。
+
+基本上,它拥有你开始使用 Kali Linux 时所需知道的一切。最棒的是这本书可以免费下载。
+
+- [免费下载 Kali Linux 揭秘](https://kali.training/downloads/Kali-Linux-Revealed-1st-edition.pdf)
+
+如果你遇到问题或想分享在 VirtualBox 上运行 Kali Linux 的经验,请在下面的评论中告诉我们。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/install-kali-linux-virtualbox
+
+作者:[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.kali.org/
+[2]: https://itsfoss.com/linux-hacking-penetration-testing/
+[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/kali-linux-virtual-box.png?resize=800%2C450&ssl=1
+[4]: https://www.virtualbox.org/
+[5]: https://www.offensive-security.com/kali-linux-vm-vmware-virtualbox-image-download/
+[6]: https://itsfoss.com/install-vmware-player-ubuntu-1310/
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/kali-linux-virtual-box-image.jpg?resize=800%2C347&ssl=1
+[8]: https://itsfoss.com/4-best-download-managers-for-linux/
+[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmbox-import-kali-linux.jpg?ssl=1
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmbox-linux-next.jpg?ssl=1
+[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/vmbox-kali-linux-settings.jpg?ssl=1
+[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/kali-linux-on-windows-virtualbox.jpg?resize=800%2C429&ssl=1
+[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/kali-linux-virtual-box.png?fit=800%2C450&ssl=1
diff --git a/published/201902/20190206 4 cool new projects to try in COPR for February 2019.md b/published/201902/20190206 4 cool new projects to try in COPR for February 2019.md
new file mode 100644
index 0000000000..92523ddb46
--- /dev/null
+++ b/published/201902/20190206 4 cool new projects to try in COPR for February 2019.md
@@ -0,0 +1,95 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10554-1.html)
+[#]: subject: (4 cool new projects to try in COPR for February 2019)
+[#]: via: (https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-february-2019/)
+[#]: author: (Dominik Turecek https://fedoramagazine.org)
+
+COPR 仓库中 4 个很酷的新软件(2019.2)
+======
+
+![](https://fedoramagazine.org/wp-content/uploads/2017/08/4-copr-945x400.jpg)
+
+COPR 是个人软件仓库[集合][1],它不在 Fedora 中。这是因为某些软件不符合轻松打包的标准。或者它可能不符合其他 Fedora 标准,尽管它是自由而开源的。COPR 可以在 Fedora 套件之外提供这些项目。COPR 中的软件不被 Fedora 基础设施不支持或没有被该项目所签名。但是,这是一种尝试新的或实验性的软件的一种巧妙的方式。
+
+这是 COPR 中一组新的有趣项目。
+
+### CryFS
+
+[CryFS][2] 是一个加密文件系统。它设计与云存储一同使用,主要是 Dropbox,尽管它也可以与其他存储提供商一起使用。CryFS 不仅加密文件系统中的文件,还会加密元数据、文件大小和目录结构。
+
+#### 安装说明
+
+仓库目前为 Fedora 28 和 29 以及 EPEL 7 提供 CryFS。要安装 CryFS,请使用以下命令:
+
+```
+sudo dnf copr enable fcsm/cryfs
+sudo dnf install cryfs
+```
+
+### Cheat
+
+[Cheat][3] 是一个用于在命令行中查看各种备忘录的工具,用来提醒仅偶尔使用的程序的使用方法。对于许多 Linux 程序,`cheat` 提供了来自手册页的精简后的信息,主要关注最常用的示例。除了内置的备忘录,`cheat` 允许你编辑现有的备忘录或从头开始创建新的备忘录。
+
+![][4]
+
+#### 安装说明
+
+仓库目前为 Fedora 28、29 和 Rawhide 以及 EPEL 7 提供 `cheat`。要安装 `cheat`,请使用以下命令:
+
+```
+sudo dnf copr enable tkorbar/cheat
+sudo dnf install cheat
+```
+
+### Setconf
+
+[setconf][5] 是一个简单的程序,作为 `sed` 的替代方案,用于对配置文件进行更改。`setconf` 唯一能做的就是找到指定文件中的密钥并更改其值。`setconf` 仅提供很少的选项来更改其行为 - 例如,取消更改行的注释。
+
+#### 安装说明
+
+仓库目前为 Fedora 27、28 和 29 提供 `setconf`。要安装 `setconf`,请使用以下命令:
+
+```
+sudo dnf copr enable jamacku/setconf
+sudo dnf install setconf
+```
+
+### Reddit 终端查看器
+
+[Reddit 终端查看器][6],或称为 `rtv`,提供了从终端浏览 Reddit 的界面。它提供了 Reddit 的基本功能,因此你可以登录到你的帐户,查看 subreddits、评论、点赞和发现新主题。但是,rtv 目前不支持 Reddit 标签。
+
+![][7]
+
+#### 安装说明
+
+该仓库目前为 Fedora 29 和 Rawhide 提供 Reddit Terminal Viewer。要安装 Reddit Terminal Viewer,请使用以下命令:
+
+```
+sudo dnf copr enable tc01/rtv
+sudo dnf install rtv
+```
+
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/4-cool-new-projects-to-try-in-copr-for-february-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
+[b]: https://github.com/lujun9972
+[1]: https://copr.fedorainfracloud.org/
+[2]: https://www.cryfs.org/
+[3]: https://github.com/chrisallenlane/cheat
+[4]: https://fedoramagazine.org/wp-content/uploads/2019/01/cheat.png
+[5]: https://setconf.roboticoverlords.org/
+[6]: https://github.com/michael-lazar/rtv
+[7]: https://fedoramagazine.org/wp-content/uploads/2019/01/rtv.png
diff --git a/published/201902/20190207 10 Methods To Create A File In Linux.md b/published/201902/20190207 10 Methods To Create A File In Linux.md
new file mode 100644
index 0000000000..ef7d8e8228
--- /dev/null
+++ b/published/201902/20190207 10 Methods To Create A File In Linux.md
@@ -0,0 +1,315 @@
+[#]: collector: (lujun9972)
+[#]: translator: (dianbanjiu)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10549-1.html)
+[#]: subject: (10 Methods To Create A File In Linux)
+[#]: via: (https://www.2daygeek.com/linux-command-to-create-a-file/)
+[#]: author: (Vinoth Kumar https://www.2daygeek.com/author/vinoth/)
+
+在 Linux 上创建文件的 10 个方法
+======
+
+我们都知道,在 Linux 上,包括设备在内的一切都是文件。Linux 管理员每天应该会多次执行文件创建活动(可能是 20 次,50 次,甚至是更多,这依赖于他们的环境)。如果你想 [在Linux上创建一个特定大小的文件][1],查看前面的这个链接。
+
+高效创建一个文件是非常重要的能力。为什么我说高效?如果你了解一些高效进行你当前活动的方式,你就可以事半功倍。这将会节省你很多的时间。你可以把这些有用的时间用到到其他重要的事情上。
+
+我下面将会介绍多个在 Linux 上创建文件的方法。我建议你选择几个简单高效的来辅助你的工作。你不必安装下列的任何一个命令,因为它们已经作为 Linux 核心工具的一部分安装到你的系统上了。
+
+创建文件可以通过以下六个方式来完成。
+
+ * `>`:标准重定向符允许我们创建一个 0KB 的空文件。
+ * `touch`:如果文件不存在的话,`touch` 命令将会创建一个 0KB 的空文件。
+ * `echo`:通过一个参数显示文本的某行。
+ * `printf`:用于显示在终端给定的文本。
+ * `cat`:它串联并打印文件到标准输出。
+ * `vi`/`vim`:Vim 是一个向上兼容 Vi 的文本编辑器。它常用于编辑各种类型的纯文本。
+ * `nano`:是一个简小且用户友好的编辑器。它复制了 `pico` 的外观和优点,但它是自由软件。
+ * `head`:用于打印一个文件开头的一部分。
+ * `tail`:用于打印一个文件的最后一部分。
+ * `truncate`:用于缩小或者扩展文件的尺寸到指定大小。
+
+### 在 Linux 上使用重定向符(>)创建一个文件
+
+标准重定向符允许我们创建一个 0KB 的空文件。它通常用于重定向一个命令的输出到一个新文件中。在没有命令的情况下使用重定向符号时,它会创建一个文件。
+
+但是它不允许你在创建文件时向其中输入任何文本。然而它对于不是很勤劳的管理员是非常简单有用的。只需要输入重定向符后面跟着你想要的文件名。
+
+```
+$ > daygeek.txt
+```
+
+使用 `ls` 命令查看刚刚创建的文件。
+
+```
+$ ls -lh daygeek.txt
+-rw-rw-r-- 1 daygeek daygeek 0 Feb 4 02:00 daygeek.txt
+```
+
+### 在 Linux 上使用 touch 命令创建一个文件
+
+`touch` 命令常用于将每个文件的访问和修改时间更新为当前时间。
+
+如果指定的文件名不存在,将会创建一个新的文件。`touch` 不允许我们在创建文件的同时向其中输入一些文本。它默认创建一个 0KB 的空文件。
+
+```
+$ touch daygeek1.txt
+```
+
+使用 `ls` 命令查看刚刚创建的文件。
+
+```
+$ ls -lh daygeek1.txt
+-rw-rw-r-- 1 daygeek daygeek 0 Feb 4 02:02 daygeek1.txt
+```
+
+### 在 Linux 上使用 echo 命令创建一个文件
+
+`echo` 内置于大多数的操作系统中。它常用于脚本、批处理文件,以及作为插入文本的单个命令的一部分。
+
+它允许你在创建一个文件时就向其中输入一些文本。当然也允许你在之后向其中输入一些文本。
+
+```
+$ echo "2daygeek.com is a best Linux blog to learn Linux" > daygeek2.txt
+```
+
+使用 `ls` 命令查看刚刚创建的文件。
+
+```
+$ ls -lh daygeek2.txt
+-rw-rw-r-- 1 daygeek daygeek 49 Feb 4 02:04 daygeek2.txt
+```
+
+可以使用 `cat` 命令查看文件的内容。
+
+```
+$ cat daygeek2.txt
+2daygeek.com is a best Linux blog to learn Linux
+```
+
+你可以使用两个重定向符 (`>>`) 添加其他内容到同一个文件。
+
+```
+$ echo "It's FIVE years old blog" >> daygeek2.txt
+```
+
+你可以使用 `cat` 命令查看添加的内容。
+
+```
+$ cat daygeek2.txt
+2daygeek.com is a best Linux blog to learn Linux
+It's FIVE years old blog
+```
+
+### 在 Linux 上使用 printf 命令创建一个新的文件
+
+`printf` 命令也可以以类似 `echo` 的方式执行。
+
+`printf` 命令常用来显示在终端窗口给出的字符串。`printf` 可以有格式说明符、转义序列或普通字符。
+
+```
+$ printf "2daygeek.com is a best Linux blog to learn Linux\n" > daygeek3.txt
+```
+
+使用 `ls` 命令查看刚刚创建的文件。
+
+```
+$ ls -lh daygeek3.txt
+-rw-rw-r-- 1 daygeek daygeek 48 Feb 4 02:12 daygeek3.txt
+```
+
+使用 `cat` 命令查看文件的内容。
+
+```
+$ cat daygeek3.txt
+2daygeek.com is a best Linux blog to learn Linux
+```
+
+你可以使用两个重定向符 (`>>`) 添加其他的内容到同一个文件中去。
+
+```
+$ printf "It's FIVE years old blog\n" >> daygeek3.txt
+```
+
+你可以使用 `cat` 命令查看这个文件中添加的内容。
+
+```
+$ cat daygeek3.txt
+2daygeek.com is a best Linux blog to learn Linux
+It's FIVE years old blog
+```
+
+### 在 Linux 中使用 cat 创建一个文件
+
+`cat` 表示串联。在 Linux 经常用于读取一个文件中的数据。
+
+`cat` 是在类 Unix 系统中最常使用的命令之一。它提供了三个与文本文件相关的功能:显示一个文件的内容、组合多个文件的内容到一个输出以及创建一个新的文件。(LCTT 译注:如果 `cat` 命令后如果不带任何文件的话,下面的命令在回车后也不会立刻结束,回车后的操作可以按 `Ctrl-C` 或 `Ctrl-D` 来结束。)
+
+```
+$ cat > daygeek4.txt
+2daygeek.com is a best Linux blog to learn Linux
+It's FIVE years old blog
+```
+
+使用 `ls` 命令查看创建的文件。
+
+```
+$ ls -lh daygeek4.txt
+-rw-rw-r-- 1 daygeek daygeek 74 Feb 4 02:18 daygeek4.txt
+```
+
+使用 `cat` 命令查看文件的内容。
+
+```
+$ cat daygeek4.txt
+2daygeek.com is a best Linux blog to learn Linux
+It's FIVE years old blog
+```
+
+如果你想向同一个文件中添加其他内容,使用两个连接的重定向符(`>>`)。
+
+```
+$ cat >> daygeek4.txt
+This website is maintained by Magesh M, It's licensed under CC BY-NC 4.0.
+```
+
+你可以使用 `cat` 命令查看添加的内容。
+
+```
+$ cat daygeek4.txt
+2daygeek.com is a best Linux blog to learn Linux
+It's FIVE years old blog
+This website is maintained by Magesh M, It's licensed under CC BY-NC 4.0.
+```
+
+### 在 Linux 上使用 vi/vim 命令创建一个文件
+
+`vim` 是一个向上兼容 `vi` 的文本编辑器。它通常用来编辑所有种类的纯文本。在编辑程序时特别有用。
+
+`vim` 中有很多功能可以用于编辑单个文件。
+
+```
+$ vi daygeek5.txt
+
+2daygeek.com is a best Linux blog to learn Linux
+It's FIVE years old blog
+```
+
+使用 `ls` 查看刚才创建的文件。
+
+```
+$ ls -lh daygeek5.txt
+-rw-rw-r-- 1 daygeek daygeek 75 Feb 4 02:23 daygeek5.txt
+```
+
+使用 `cat` 命令查看文件的内容。
+
+```
+$ cat daygeek5.txt
+2daygeek.com is a best Linux blog to learn Linux
+It's FIVE years old blog
+```
+
+### 在 Linux 上使用 nano 命令创建一个文件
+
+`nano` 是一个编辑器,它是一个自由版本的 `pico` 克隆。`nano` 是一个小且用户友好的编辑器。它复制了 `pico` 的外观及优点,并且是一个自由软件,它添加了 `pico` 缺乏的一系列特性,像是打开多个文件、逐行滚动、撤销/重做、语法高亮、行号等等。
+
+```
+$ nano daygeek6.txt
+
+2daygeek.com is a best Linux blog to learn Linux
+It's FIVE years old blog
+This website is maintained by Magesh M, It's licensed under CC BY-NC 4.0.
+```
+
+使用 `ls` 命令查看创建的文件。
+
+```
+$ ls -lh daygeek6.txt
+-rw-rw-r-- 1 daygeek daygeek 148 Feb 4 02:26 daygeek6.txt
+```
+
+使用 `cat` 命令来查看一个文件的内容。
+
+```
+$ cat daygeek6.txt
+2daygeek.com is a best Linux blog to learn Linux
+It's FIVE years old blog
+This website is maintained by Magesh M, It's licensed under CC BY-NC 4.0.
+```
+
+### 在 Linux 上使用 head 命令创建一个文件
+
+`head` 命令通常用于输出一个文件开头的一部分。它默认会打印一个文件的开头 10 行到标准输出。如果有多个文件,则每个文件前都会有一个标题,用来表示文件名。
+
+```
+$ head -c 0K /dev/zero > daygeek7.txt
+```
+
+使用 `ls` 命令查看创建的文件。
+
+```
+$ ls -lh daygeek7.txt
+-rw-rw-r-- 1 daygeek daygeek 0 Feb 4 02:30 daygeek7.txt
+```
+
+### 在 Linux 上使用 tail 创建一个文件
+
+`tail` 命令通常用来输出一个文件最后的一部分。它默认会打印每个文件的最后 10 行到标准输出。如果有多个文件,则每个文件前都会有一个标题,用来表示文件名。
+
+```
+$ tail -c 0K /dev/zero > daygeek8.txt
+```
+
+使用 `ls` 命令查看创建的文件。
+
+```
+$ ls -lh daygeek8.txt
+-rw-rw-r-- 1 daygeek daygeek 0 Feb 4 02:31 daygeek8.txt
+```
+
+### 在 Linux 上使用 truncate 命令创建一个文件
+
+`truncate` 命令通常用作将一个文件的尺寸缩小或者扩展为某个指定的尺寸。
+
+```
+$ truncate -s 0K daygeek9.txt
+```
+
+使用 `ls` 命令检查创建的文件。
+
+```
+$ ls -lh daygeek9.txt
+-rw-rw-r-- 1 daygeek daygeek 0 Feb 4 02:37 daygeek9.txt
+```
+
+在这篇文章中,我使用这十个命令分别创建了下面的这十个文件。
+
+```
+$ ls -lh daygeek*
+-rw-rw-r-- 1 daygeek daygeek 0 Feb 4 02:02 daygeek1.txt
+-rw-rw-r-- 1 daygeek daygeek 74 Feb 4 02:07 daygeek2.txt
+-rw-rw-r-- 1 daygeek daygeek 74 Feb 4 02:15 daygeek3.txt
+-rw-rw-r-- 1 daygeek daygeek 148 Feb 4 02:20 daygeek4.txt
+-rw-rw-r-- 1 daygeek daygeek 75 Feb 4 02:23 daygeek5.txt
+-rw-rw-r-- 1 daygeek daygeek 148 Feb 4 02:26 daygeek6.txt
+-rw-rw-r-- 1 daygeek daygeek 148 Feb 4 02:32 daygeek7.txt
+-rw-rw-r-- 1 daygeek daygeek 148 Feb 4 02:32 daygeek8.txt
+-rw-rw-r-- 1 daygeek daygeek 148 Feb 4 02:38 daygeek9.txt
+-rw-rw-r-- 1 daygeek daygeek 0 Feb 4 02:00 daygeek.txt
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/linux-command-to-create-a-file/
+
+作者:[Vinoth Kumar][a]
+选题:[lujun9972][b]
+译者:[dianbanjiu](https://github.com/dianbanjiu)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/vinoth/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/create-a-file-in-specific-certain-size-linux/
diff --git a/published/201902/20190207 How to determine how much memory is installed, used on Linux systems.md b/published/201902/20190207 How to determine how much memory is installed, used on Linux systems.md
new file mode 100644
index 0000000000..96b474f7e4
--- /dev/null
+++ b/published/201902/20190207 How to determine how much memory is installed, used on Linux systems.md
@@ -0,0 +1,228 @@
+[#]: collector: (lujun9972)
+[#]: translator: (leommxj)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10571-1.html)
+[#]: subject: (How to determine how much memory is installed, used on Linux systems)
+[#]: via: (https://www.networkworld.com/article/3336174/linux/how-much-memory-is-installed-and-being-used-on-your-linux-systems.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+如何在 Linux 系统中判断安装、使用了多少内存
+======
+
+> 有几个命令可以报告在 Linux 系统上安装和使用了多少内存。根据你使用的命令,你可能会被细节淹没,也可能获得快速简单的答案。
+
+![](https://images.idgesg.net/images/article/2019/02/memory-100787327-large.jpg)
+
+在 Linux 系统中有很多种方法获取有关安装了多少内存的信息及查看多少内存正在被使用。有些命令提供了大量的细节,而其他命令提供了简洁但不一定易于理解的答案。在这篇文章中,我们将介绍一些查看内存及其使用状态的有用的工具。
+
+在我们开始之前,让我们先来回顾一些基础知识。物理内存和虚拟内存并不是一回事。后者包括配置为交换空间的磁盘空间。交换空间可能包括为此目的特意留出来的分区,以及在创建新的交换分区不可行时创建的用来增加可用交换空间的文件。有些 Linux 命令会提供关于两者的信息。
+
+当物理内存占满时,交换空间通过提供可以用来存放内存中非活动页的磁盘空间来扩展内存。
+
+`/proc/kcore` 是在内存管理中起作用的一个文件。这个文件看上去是个普通文件(虽然非常大),但它并不占用任何空间。它就像其他 `/proc` 下的文件一样是个虚拟文件。
+
+```
+$ ls -l /proc/kcore
+-r--------. 1 root root 140737477881856 Jan 28 12:59 /proc/kcore
+```
+
+有趣的是,下面查询的两个系统并没有安装相同大小的内存,但 `/proc/kcore` 的大小却是相同的。第一个系统安装了 4 GB 的内存,而第二个系统安装了 6 GB。
+
+```
+system1$ ls -l /proc/kcore
+-r--------. 1 root root 140737477881856 Jan 28 12:59 /proc/kcore
+system2$ ls -l /proc/kcore
+-r-------- 1 root root 140737477881856 Feb 5 13:00 /proc/kcore
+```
+
+一种不靠谱的解释说这个文件代表可用虚拟内存的大小(没准要加 4 KB),如果这样,这些系统的虚拟内存可就是 128TB 了!这个数字似乎代表了 64 位系统可以寻址多少内存,而不是当前系统有多少可用内存。在命令行中计算 128 TB 和这个文件大小加上 4 KB 很容易。
+
+```
+$ expr 1024 \* 1024 \* 1024 \* 1024 \* 128
+140737488355328
+$ expr 1024 \* 1024 \* 1024 \* 1024 \* 128 + 4096
+140737488359424
+```
+
+另一个用来检查内存的更人性化的命令是 `free`。它会给出一个易于理解的内存报告。
+
+```
+$ free
+ total used free shared buff/cache available
+Mem: 6102476 812244 4090752 13112 1199480 4984140
+Swap: 2097148 0 2097148
+```
+
+使用 `-g` 选项,`free` 会以 GB 为单位返回结果。
+
+```
+$ free -g
+ total used free shared buff/cache available
+Mem: 5 0 3 0 1 4
+Swap: 1 0 1
+```
+
+使用 `-t` 选项,`free` 会显示与无附加选项时相同的值(不要把 `-t` 选项理解成 TB),并额外在输出的底部添加一行总计数据。
+
+```
+$ free -t
+ total used free shared buff/cache available
+Mem: 6102476 812408 4090612 13112 1199456 4983984
+Swap: 2097148 0 2097148
+Total: 8199624 812408 6187760
+```
+
+当然,你也可以选择同时使用两个选项。
+
+```
+$ free -tg
+ total used free shared buff/cache available
+Mem: 5 0 3 0 1 4
+Swap: 1 0 1
+Total: 7 0 5
+```
+
+如果你尝试用这个报告来解释“这个系统安装了多少内存?”,你可能会感到失望。上面的报告就是在前文说的装有 6 GB 内存的系统上运行的结果。这并不是说这个结果是错的,这就是系统对其可使用的内存的看法。
+
+`free` 命令也提供了每隔 X 秒刷新显示的选项(下方示例中 X 为 10)。
+
+```
+$ free -s 10
+ total used free shared buff/cache available
+Mem: 6102476 812280 4090704 13112 1199492 4984108
+Swap: 2097148 0 2097148
+
+ total used free shared buff/cache available
+Mem: 6102476 812260 4090712 13112 1199504 4984120
+Swap: 2097148 0 2097148
+```
+
+使用 `-l` 选项,`free` 命令会提供高低内存使用信息。
+
+```
+$ free -l
+ total used free shared buff/cache available
+Mem: 6102476 812376 4090588 13112 1199512 4984000
+Low: 6102476 2011888 4090588
+High: 0 0 0
+Swap: 2097148 0 2097148
+```
+
+查看内存的另一个选择是 `/proc/meminfo` 文件。像 `/proc/kcore` 一样,这也是一个虚拟文件,它可以提供关于安装或使用了多少内存以及可用内存的报告。显然,空闲内存和可用内存并不是同一回事。`MemFree` 看起来代表未使用的 RAM。`MemAvailable` 则是对于启动新程序时可使用的内存的一个估计。
+
+```
+$ head -3 /proc/meminfo
+MemTotal: 6102476 kB
+MemFree: 4090596 kB
+MemAvailable: 4984040 kB
+```
+
+如果只想查看内存总计,可以使用下面的命令之一:
+
+```
+$ awk '/MemTotal/ {print $2}' /proc/meminfo
+6102476
+$ grep MemTotal /proc/meminfo
+MemTotal: 6102476 kB
+```
+
+`DirectMap` 将内存信息分为几类。
+
+```
+$ grep DirectMap /proc/meminfo
+DirectMap4k: 213568 kB
+DirectMap2M: 6076416 kB
+```
+
+`DirectMap4k` 代表被映射成标准 4 k 页的内存大小,`DirectMap2M` 则显示了被映射为 2 MB 的页的内存大小。
+
+`getconf` 命令将会提供比我们大多数人想要看到的更多的信息。
+
+```
+$ getconf -a | more
+LINK_MAX 65000
+_POSIX_LINK_MAX 65000
+MAX_CANON 255
+_POSIX_MAX_CANON 255
+MAX_INPUT 255
+_POSIX_MAX_INPUT 255
+NAME_MAX 255
+_POSIX_NAME_MAX 255
+PATH_MAX 4096
+_POSIX_PATH_MAX 4096
+PIPE_BUF 4096
+_POSIX_PIPE_BUF 4096
+SOCK_MAXBUF
+_POSIX_ASYNC_IO
+_POSIX_CHOWN_RESTRICTED 1
+_POSIX_NO_TRUNC 1
+_POSIX_PRIO_IO
+_POSIX_SYNC_IO
+_POSIX_VDISABLE 0
+ARG_MAX 2097152
+ATEXIT_MAX 2147483647
+CHAR_BIT 8
+CHAR_MAX 127
+--More--
+```
+
+使用类似下面的命令来将其输出精简为指定的内容,你会得到跟前文提到的其他命令相同的结果。
+
+```
+$ getconf -a | grep PAGES | awk 'BEGIN {total = 1} {if (NR == 1 || NR == 3) total *=$NF} END {print total / 1024" kB"}'
+6102476 kB
+```
+
+上面的命令通过将下方输出的第一行和最后一行的值相乘来计算内存。
+
+```
+PAGESIZE 4096 <==
+_AVPHYS_PAGES 1022511
+_PHYS_PAGES 1525619 <==
+```
+
+自己动手计算一下,我们就知道这个值是怎么来的了。
+
+```
+$ expr 4096 \* 1525619 / 1024
+6102476
+```
+
+显然值得为以上的指令之一设置个 `alias`。
+
+另一个具有非常易于理解的输出的命令是 `top` 。在 `top` 输出的前五行,你可以看到一些数字显示多少内存正被使用。
+
+```
+$ top
+top - 15:36:38 up 8 days, 2:37, 2 users, load average: 0.00, 0.00, 0.00
+Tasks: 266 total, 1 running, 265 sleeping, 0 stopped, 0 zombie
+%Cpu(s): 0.2 us, 0.4 sy, 0.0 ni, 99.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
+MiB Mem : 3244.8 total, 377.9 free, 1826.2 used, 1040.7 buff/cache
+MiB Swap: 3536.0 total, 3535.7 free, 0.3 used. 1126.1 avail Mem
+```
+
+最后一个命令将会以一个非常简洁的方式回答“系统安装了多少内存?”:
+
+```
+$ sudo dmidecode -t 17 | grep "Size.*MB" | awk '{s+=$2} END {print s / 1024 "GB"}'
+6GB
+```
+
+取决于你想要获取多少细节,Linux 系统提供了许多用来查看系统安装内存以及使用/空闲内存的选择。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3336174/linux/how-much-memory-is-installed-and-being-used-on-your-linux-systems.html
+
+作者:[Sandra Henry-Stocker][a]
+选题:[lujun9972][b]
+译者:[leommxj](https://github.com/leommxj)
+校对:[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.facebook.com/NetworkWorld/
+[2]: https://www.linkedin.com/company/network-world
diff --git a/published/201902/20190208 How To Install And Use PuTTY On Linux.md b/published/201902/20190208 How To Install And Use PuTTY On Linux.md
new file mode 100644
index 0000000000..a4615d4b78
--- /dev/null
+++ b/published/201902/20190208 How To Install And Use PuTTY On Linux.md
@@ -0,0 +1,147 @@
+[#]: collector: (lujun9972)
+[#]: translator: (zhs852)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10552-1.html)
+[#]: subject: (How To Install And Use PuTTY On Linux)
+[#]: via: (https://www.ostechnix.com/how-to-install-and-use-putty-on-linux/)
+[#]: author: (SK https://www.ostechnix.com/author/sk/)
+
+在 Linux 中安装并使用 PuTTY
+======
+
+![](https://www.ostechnix.com/wp-content/uploads/2019/02/putty-720x340.png)
+
+PuTTY 是一个自由开源且支持包括 SSH、Telnet 和 Rlogin 在内的多种协议的 GUI 客户端。一般来说,Windows 管理员们会把 PuTTY 当成 SSH 或 Telnet 客户端来在本地 Windows 系统和远程 Linux 服务器之间建立连接。不过,PuTTY 可不是 Windows 的独占软件。它在 Linux 用户之中也是很流行的。本篇文章将会告诉你如何在 Linux 中安装并使用 PuTTY。
+
+### 在 Linux 中安装 PuTTY
+
+PuTTY 已经包含在了许多 Linux 发行版的官方源中。举个例子,在 Arch Linux 中,我们可以通过这个命令安装 PuTTY:
+
+```shell
+$ sudo pacman -S putty
+```
+
+在 Debian、Ubuntu 或是 Linux Mint 中安装它:
+
+```shell
+$ sudo apt install putty
+```
+
+### 使用 PuTTY 访问远程 Linux 服务器
+
+在安装完 PuTTY 之后,你可以在菜单或启动器中打开它。如果你想用终端打开它,也是可以的:
+
+```shell
+$ putty
+```
+
+PuTTY 的默认界面长这个样子:
+
+![PuTTY 默认界面](https://www.ostechnix.com/wp-content/uploads/2019/02/putty-default-interface.png)
+
+如你所见,许多选项都配上了说明。在左侧面板中,你可以配置许多项目,比如:
+
+ 1. 修改 PuTTY 登录会话选项;
+ 2. 修改终端模拟器控制选项,控制各个按键的功能;
+ 3. 控制终端响铃的声音;
+ 4. 启用/禁用终端的高级功能;
+ 5. 设定 PuTTY 窗口大小;
+ 6. 控制命令回滚长度(默认是 2000 行);
+ 7. 修改 PuTTY 窗口或光标的外观;
+ 8. 调整窗口边缘;
+ 9. 调整字体;
+ 10. 保存登录信息;
+ 11. 设置代理;
+ 12. 修改各协议的控制选项;
+ 13. 以及更多。
+
+所有选项基本都有注释,相信你理解起来不难。
+
+### 使用 PuTTY 访问远程 Linux 服务器
+
+请在左侧面板点击 “Session” 选项卡,输入远程主机名(或 IP 地址)。然后,请选择连接类型(比如 Telnet、Rlogin 以及 SSH 等)。根据你选择的连接类型,PuTTY 会自动选择对应连接类型的默认端口号(比如 SSH 是 22、Telnet 是 23),如果你修改了默认端口号,别忘了手动把它输入到 “Port” 里。在这里,我用 SSH 连接到远程主机。在输入所有信息后,请点击 “Open”。
+
+![通过 SSH 连接](http://www.ostechnix.com/wp-content/uploads/2019/02/putty-1.png)
+
+如果这是你首次连接到这个远程主机,PuTTY 会显示一个安全警告,问你是否信任你连接到的远程主机。点击 “Accept” 即可将远程主机的密钥加入 PuTTY 的缓存当中:
+
+![PuTTY 安全警告][2]
+
+接下来,输入远程主机的用户名和密码。然后你就成功地连接上远程主机啦。
+
+![已连接上远程主机](https://www.ostechnix.com/wp-content/uploads/2019/02/putty-3.png)
+
+#### 使用密钥验证访问远程主机
+
+一些 Linux 管理员可能在服务器上配置了密钥认证。举个例子,在用 PuTTY 访问 AMS 实例的时候,你需要指定密钥文件的位置。PuTTY 可以使用它自己的格式(`.ppk` 文件)来进行公钥验证。
+
+首先输入主机名或 IP。之后,在 “Category” 选项卡中,展开 “Connection”,再展开 “SSH”,然后选择 “Auth”,之后便可选择 `.ppk` 密钥文件了。
+
+![][3]
+
+点击 “Accept” 来关闭安全提示。然后,输入远程主机的密码(如果密钥被密码保护)来建立连接。
+
+#### 保存 PuTTY 会话
+
+有些时候,你可能需要多次连接到同一个远程主机,你可以保存这些会话并在之后不输入信息访问他们。
+
+请输入主机名(或 IP 地址),并提供一个会话名称,然后点击 “Save”。如果你有密钥文件,请确保你在点击 “Save” 按钮之前指定它们。
+
+![][4]
+
+现在,你可以通过选择 “Saved sessions”,然后点击 “Load”,再点击 “Open” 来启动连接。
+
+#### 使用 PuTTY 安全复制客户端(pscp)来将文件传输到远程主机中
+
+通常来说,Linux 用户和管理员会使用 `scp` 这个命令行工具来从本地往远程主机传输文件。不过 PuTTY 给我们提供了一个叫做 PuTTY 安全复制客户端(简写为 `pscp`)的工具来干这个事情。如果你的本地主机运行的是 Windows,你可能需要这个工具。PSCP 在 Windows 和 Linux 下都是可用的。
+
+使用这个命令来将 `file.txt` 从本地的 Arch Linux 拷贝到远程的 Ubuntu 上:
+
+```shell
+pscp -i test.ppk file.txt sk@192.168.225.22:/home/sk/
+```
+
+让我们来分析这个命令:
+
+ * `-i test.ppk`:访问远程主机所用的密钥文件;
+ * `file.txt`:要拷贝到远程主机的文件;
+ * `sk@192.168.225.22`:远程主机的用户名与 IP;
+ * `/home/sk/`:目标路径。
+
+要拷贝一个目录,请使用 `-r`(递归)参数:
+
+```shell
+ pscp -i test.ppk -r dir/ sk@192.168.225.22:/home/sk/
+```
+
+要使用 `pscp` 传输文件,请执行以下命令:
+
+```shell
+pscp -i test.ppk c:\documents\file.txt.txt sk@192.168.225.22:/home/sk/
+```
+
+你现在应该了解了 PuTTY 是什么,知道了如何安装它和如何使用它。同时,你也学习到了如何使用 `pscp` 程序在本地和远程主机上传输文件。
+
+以上便是所有了,希望这篇文章对你有帮助。
+
+干杯!
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/how-to-install-and-use-putty-on-linux/
+
+作者:[SK][a]
+选题:[lujun9972][b]
+译者:[zhs852](https://github.com/zhs852)
+校对:[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]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[2]: http://www.ostechnix.com/wp-content/uploads/2019/02/putty-2.png
+[3]: http://www.ostechnix.com/wp-content/uploads/2019/02/putty-4.png
+[4]: http://www.ostechnix.com/wp-content/uploads/2019/02/putty-5.png
diff --git a/published/201902/20190214 Drinking coffee with AWK.md b/published/201902/20190214 Drinking coffee with AWK.md
new file mode 100644
index 0000000000..eb83412bbd
--- /dev/null
+++ b/published/201902/20190214 Drinking coffee with AWK.md
@@ -0,0 +1,119 @@
+[#]: collector: (lujun9972)
+[#]: translator: (wxy)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10555-1.html)
+[#]: subject: (Drinking coffee with AWK)
+[#]: via: (https://opensource.com/article/19/2/drinking-coffee-awk)
+[#]: author: (Moshe Zadka https://opensource.com/users/moshez)
+
+用 AWK 喝咖啡
+======
+> 用一个简单的 AWK 程序跟踪你的同事喝咖啡的欠款。
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/coffee_cafe_brew_laptop_desktop.jpg?itok=G-n1o1-o)
+
+以下基于一个真实的故事,虽然一些名字和细节有所改变。
+
+> 很久以前,在一个遥远的地方,有一间~~庙~~(划掉)办公室。由于各种原因,这个办公室没有购买速溶咖啡。所以那个办公室的一些人聚在一起决定建立“咖啡角”。
+>
+> 咖啡角的一名成员会购买一些速溶咖啡,而其他成员会付给他钱。有人喝咖啡比其他人多,所以增加了“半成员”的级别:半成员每周允许喝的咖啡限量,并可以支付其它成员支付的一半。
+
+管理这事非常操心。而我刚读过《Unix 编程环境》这本书,想练习一下我的 [AWK][1] 编程技能,所以我自告奋勇创建了一个系统。
+
+第 1 步:我用一个数据库来记录成员及其应支付给咖啡角的欠款。我是以 AWK 便于处理的格式记录的,其中字段用冒号分隔:
+
+```
+member:john:1:22
+member:jane:0.5:33
+member:pratyush:0.5:17
+member:jing:1:27
+```
+
+上面的第一个字段标识了这是哪一种行(`member`)。第二个字段是成员的名字(即他们的电子邮件用户名,但没有 @ )。下一个字段是其成员级别(成员 = 1,或半会员 = 0.5)。最后一个字段是他们欠咖啡角的钱。正数表示他们欠咖啡角钱,负数表示咖啡角欠他们。
+
+第 2 步:我记录了咖啡角的收入和支出:
+
+```
+payment:jane:33
+payment:pratyush:17
+bought:john:60
+payback:john:50
+```
+
+Jane 付款 $33,Pratyush 付款 $17,John 买了价值 $60 的咖啡,而咖啡角还款给 John $50。
+
+第 3 步:我准备写一些代码,用来处理成员和付款,并生成记录了新欠账的更新的成员文件。
+
+```
+#!/usr/bin/env --split-string=awk -F: -f
+```
+
+释伴行(`#!`)需要做一些调整,我使用 `env` 命令来允许从释伴行传递多个参数:具体来说,AWK 的 `-F` 命令行参数会告诉它字段分隔符是什么。
+
+AWK 程序就是一个规则序列(也可以包含函数定义,但是对于这个咖啡角应用来说不需要)
+
+第一条规则读取该成员文件。当我运行该命令时,我总是首先给它的是成员文件,然后是付款文件。它使用 AWK 关联数组来在 `members` 数组中记录成员级别,以及在 `debt` 数组中记录当前欠账。
+
+```
+$1 == "member" {
+ members[$2]=$3
+ debt[$2]=$4
+ total_members += $3
+}
+```
+
+第二条规则在记录付款(`payment`)时减少欠账。
+
+```
+$1 == "payment" {
+ debt[$2] -= $3
+}
+```
+
+还款(`payback`)则相反:它增加欠账。这可以优雅地支持意外地给了某人太多钱的情况。
+
+```
+$1 == "payback" {
+ debt[$2] += $3
+}
+```
+
+最复杂的部分出现在有人购买(`bought`)速溶咖啡供咖啡角使用时。它被视为付款(`payment`),并且该人的债务减少了适当的金额。接下来,它计算每个会员的费用。它根据成员的级别对所有成员进行迭代并增加欠款
+
+```
+$1 == "bought" {
+ debt[$2] -= $3
+ per_member = $3/total_members
+ for (x in members) {
+ debt[x] += per_member * members[x]
+ }
+}
+```
+
+`END` 模式很特殊:当 AWK 没有更多的数据要处理时,它会一次性执行。此时,它会使用更新的欠款数生成新的成员文件。
+
+```
+END {
+ for (x in members) {
+ printf "%s:%s:%s\n", x, members[x], debt[x]
+ }
+}
+```
+
+再配合一个遍历成员文件,并向人们发送提醒电子邮件以支付他们的会费(积极清账)的脚本,这个系统管理咖啡角相当一段时间。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/drinking-coffee-awk
+
+作者:[Moshe Zadka][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/moshez
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/AWK
diff --git a/published/201902/20190216 How To Grant And Remove Sudo Privileges To Users On Ubuntu.md b/published/201902/20190216 How To Grant And Remove Sudo Privileges To Users On Ubuntu.md
new file mode 100644
index 0000000000..a53e354779
--- /dev/null
+++ b/published/201902/20190216 How To Grant And Remove Sudo Privileges To Users On Ubuntu.md
@@ -0,0 +1,103 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10576-1.html)
+[#]: subject: (How To Grant And Remove Sudo Privileges To Users On Ubuntu)
+[#]: via: (https://www.ostechnix.com/how-to-grant-and-remove-sudo-privileges-to-users-on-ubuntu/)
+[#]: author: (SK https://www.ostechnix.com/author/sk/)
+
+如何在 Ubuntu 上为用户授予和移除 sudo 权限
+======
+
+![](https://www.ostechnix.com/wp-content/uploads/2019/02/sudo-privileges-720x340.png)
+
+如你所知,用户可以在 Ubuntu 系统上使用 sudo 权限执行任何管理任务。在 Linux 机器上创建新用户时,他们无法执行任何管理任务,直到你将其加入 `sudo` 组的成员。在这个简短的教程中,我们将介绍如何将普通用户添加到 `sudo` 组以及移除给定的权限,使其成为普通用户。
+
+### 在 Linux 上向普通用户授予 sudo 权限
+
+通常,我们使用 `adduser` 命令创建新用户,如下所示。
+
+```
+$ sudo adduser ostechnix
+```
+
+如果你希望新创建的用户使用 `sudo` 执行管理任务,只需使用以下命令将它添加到 `sudo` 组:
+
+```
+$ sudo usermod -a -G sudo hduser
+```
+
+上面的命令将使名为 `ostechnix` 的用户成为 `sudo` 组的成员。
+
+你也可以使用此命令将用户添加到 `sudo` 组。
+
+```
+$ sudo adduser ostechnix sudo
+```
+
+现在,注销并以新用户身份登录,以使此更改生效。此时用户已成为管理用户。
+
+要验证它,只需在任何命令中使用 `sudo` 作为前缀。
+
+```
+$ sudo mkdir /test
+[sudo] password for ostechnix:
+```
+
+### 移除用户的 sudo 权限
+
+有时,你可能希望移除特定用户的 `sudo` 权限,而不用在 Linux 中删除它。要将任何用户设为普通用户,只需将其从 `sudo` 组中删除即可。
+
+比如说如果要从 `sudo` 组中删除名为 `ostechnix` 的用户,只需运行:
+
+```
+$ sudo deluser ostechnix sudo
+```
+
+示例输出:
+
+```
+Removing user `ostechnix' from group `sudo' ...
+Done.
+```
+
+此命令仅从 `sudo` 组中删除用户 `ostechnix`,但不会永久地从系统中删除用户。现在,它成为了普通用户,无法像 `sudo` 用户那样执行任何管理任务。
+
+此外,你可以使用以下命令撤消用户的 `sudo` 访问权限:
+
+```
+$ sudo gpasswd -d ostechnix sudo
+```
+
+从 `sudo` 组中删除用户时请小心。不要从 `sudo` 组中删除真正的管理员。
+
+使用命令验证用户 `ostechnix` 是否已从 `sudo` 组中删除:
+
+```
+$ sudo -l -U ostechnix
+User ostechnix is not allowed to run sudo on ubuntuserver.
+```
+
+是的,用户 `ostechnix` 已从 `sudo` 组中删除,他无法执行任何管理任务。
+
+从 `sudo` 组中删除用户时请小心。如果你的系统上只有一个 `sudo` 用户,并且你将他从 `sudo` 组中删除了,那么就无法执行任何管理操作,例如在系统上安装、删除和更新程序。所以,请小心。在我们的下一篇教程中,我们将解释如何恢复用户的 `sudo` 权限。
+
+就是这些了。希望这篇文章有用。还有更多好东西。敬请期待!
+
+干杯!
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/how-to-grant-and-remove-sudo-privileges-to-users-on-ubuntu/
+
+作者:[SK][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.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
diff --git a/published/201902/20190219 3 tools for viewing files at the command line.md b/published/201902/20190219 3 tools for viewing files at the command line.md
new file mode 100644
index 0000000000..eb975657c2
--- /dev/null
+++ b/published/201902/20190219 3 tools for viewing files at the command line.md
@@ -0,0 +1,99 @@
+[#]: collector: (lujun9972)
+[#]: translator: (MjSeven)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10573-1.html)
+[#]: subject: (3 tools for viewing files at the command line)
+[#]: via: (https://opensource.com/article/19/2/view-files-command-line)
+[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt)
+
+在命令行查看文件的 3 个工具
+======
+
+> 看一下 `less`、Antiword 和 `odt2xt` 这三个实用程序,它们都可以在终端中查看文件。
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/command_line_prompt.png?itok=wbGiJ_yg)
+
+我常说,你不需要使用命令行也可以高效使用 Linux —— 我知道许多 Linux 用户从不打开终端窗口,并且也用的挺好。然而,即使我不认为自己是一名技术人员,我也会在命令行上花费大约 20% 的计算时间,包括操作文件、处理文本和使用实用程序。
+
+我经常在终端窗口中做的一件事是查看文件,无论是文本还是需要用到文字处理器的文件。有时使用命令行实用程序比启动文本编辑器或文字处理器更容易。
+
+下面是我在命令行中用来查看文件的三个实用程序。
+
+### less
+
+[less][1] 的美妙之处在于它易于使用,它将你正在查看的文件分解为块(或页面),这使得它们更易于阅读。你可以使用它在命令行查看文本文件,例如 README、HTML 文件、LaTeX 文件或其他任何纯文本文件。我在[上一篇文章][2]中介绍了 `less`。
+
+要使用 `less`,只需输入:
+
+```
+less file_name
+```
+
+![](https://opensource.com/sites/default/files/uploads/less.png)
+
+通过按键盘上的空格键或 `PgDn` 键向下滚动文件,按 `PgUp` 键向上移动文件。要停止查看文件,按键盘上的 `Q` 键。
+
+### Antiword
+
+[Antiword][3] 是一个很好地实用小程序,你可以使用它将 Word 文档转换为纯文本。只要你想,还可以将它们转换为 [PostScript][4] 或 [PDF][5]。在本文中,让我们继续使用文本转换。
+
+Antiword 可以读取和转换 Word 2.0 到 2003 版本创建的文件(LCTT 译注:此处疑为 Word 2000,因为 Word 2.0 for DOS 发布于 1984 年,而 WinWord 2.0 发布于 1991 年,都似乎太老了)。它不能读取 DOCX 文件 —— 如果你尝试这样做,Antiword 会显示一条错误消息,表明你尝试读取的是一个 ZIP 文件。这在技术上说是正确的,但仍然令人沮丧。
+
+要使用 Antiword 查看 Word 文档,输入以下命令:
+
+```
+antiword file_name.doc
+```
+
+Antiword 将文档转换为文本并显示在终端窗口中。不幸的是,它不能在终端中将文档分解成页面。不过,你可以将 Antiword 的输出重定向到 `less` 或 [more][6] 之类的实用程序,一遍对其进行分页。通过输入以下命令来执行此操作:
+
+```
+antiword file_name.doc | less
+```
+
+如果你是命令行的新手,那么我告诉你 `|` 称为管道。这就是重定向。
+
+![](https://opensource.com/sites/default/files/uploads/antiword.png)
+
+### odt2txt
+
+作为一个优秀的开源公民,你会希望尽可能多地使用开放格式。对于你的文字处理需求,你可能需要处理 [ODT][7] 文件(由诸如 LibreOffice Writer 和 AbiWord 等文字处理器使用)而不是 Word 文件。即使没有,也可能会遇到 ODT 文件。而且,即使你的计算机上没有安装 Writer 或 AbiWord,也很容易在命令行中查看它们。
+
+怎样做呢?用一个名叫 [odt2txt][8] 的实用小程序。正如你猜到的那样,`odt2txt` 将 ODT 文件转换为纯文本。要使用它,运行以下命令:
+
+```
+odt2txt file_name.odt
+```
+
+与 Antiword 一样,`odt2txt` 将文档转换为文本并在终端窗口中显示。和 Antiword 一样,它不会对文档进行分页。但是,你也可以使用以下命令将 `odt2txt` 的输出管道传输到 `less` 或 `more` 这样的实用程序中:
+
+```
+odt2txt file_name.odt | more
+```
+
+![](https://opensource.com/sites/default/files/uploads/odt2txt.png)
+
+你有一个最喜欢的在命令行中查看文件的实用程序吗?欢迎留下评论与社区分享。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/view-files-command-line
+
+作者:[Scott Nesbitt][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/scottnesbitt
+[b]: https://github.com/lujun9972
+[1]: https://www.gnu.org/software/less/
+[2]: https://opensource.com/article/18/4/using-less-view-text-files-command-line
+[3]: http://www.winfield.demon.nl/
+[4]: http://en.wikipedia.org/wiki/PostScript
+[5]: http://en.wikipedia.org/wiki/Portable_Document_Format
+[6]: https://opensource.com/article/19/1/more-text-files-linux
+[7]: http://en.wikipedia.org/wiki/OpenDocument
+[8]: https://github.com/dstosberg/odt2txt
diff --git a/published/201902/20190219 How to List Installed Packages on Ubuntu and Debian -Quick Tip.md b/published/201902/20190219 How to List Installed Packages on Ubuntu and Debian -Quick Tip.md
new file mode 100644
index 0000000000..2eec9eb896
--- /dev/null
+++ b/published/201902/20190219 How to List Installed Packages on Ubuntu and Debian -Quick Tip.md
@@ -0,0 +1,200 @@
+[#]: collector: (lujun9972)
+[#]: translator: (guevaraya)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10562-1.html)
+[#]: subject: (How to List Installed Packages on Ubuntu and Debian [Quick Tip])
+[#]: via: (https://itsfoss.com/list-installed-packages-ubuntu)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+如何列出 Ubuntu 和 Debian 上已安装的软件包
+======
+
+当你安装了 [Ubuntu 并想好好用一用][1]。但在将来某个时候,你肯定会遇到忘记曾经安装了那些软件包。
+
+这个是完全正常。没有人要求你把系统里所有已安装的软件包都记住。但是问题是,如何才能知道已经安装了哪些软件包?如何查看安装过的软件包呢?
+
+### 列出 Ubuntu 和 Debian 上已安装的软件包
+
+![列出已安装的软件包][2]
+
+如果你经常用 [apt 命令][3],你可能觉得会有个命令像 `apt` 一样可以列出已安装的软件包。不算全错。
+
+[apt-get 命令][4] 没有类似列出已安装软件包的简单的选项,但是 `apt` 有一个这样的命令:
+
+```
+apt list --installed
+```
+
+这个会显示使用 `apt` 命令安装的所有的软件包。同时也会包含由于依赖而被安装的软件包。也就是说不仅会包含你曾经安装的程序,而且会包含大量库文件和间接安装的软件包。
+
+![用 atp 命令列出显示已安装的软件包][5]
+
+*用 atp 命令列出显示已安装的软件包*
+
+由于列出出来的已安装的软件包太多,用 `grep` 过滤特定的软件包是一个比较好的办法。
+
+```
+apt list --installed | grep program_name
+```
+
+如上命令也可以检索出使用 .deb 软件包文件安装的软件。是不是很酷?
+
+如果你阅读过 [apt 与 apt-get 对比][7]的文章,你可能已经知道 `apt` 和 `apt-get` 命令都是基于 [dpkg][8]。也就是说用 `dpkg` 命令可以列出 Debian 系统的所有已经安装的软件包。
+
+```
+dpkg-query -l
+```
+
+你可以用 `grep` 命令检索指定的软件包。
+
+![用 dpkg 命令列出显示已经安装的软件包][9]!
+
+*用 dpkg 命令列出显示已经安装的软件包*
+
+现在你可以搞定列出 Debian 的软件包管理器安装的应用了。那 Snap 和 Flatpak 这个两种应用呢?如何列出它们?因为它们不能被 `apt` 和 `dpkg` 访问。
+
+显示系统里所有已经安装的 [Snap 软件包][10],可以这个命令:
+
+```
+snap list
+```
+
+Snap 可以用绿色勾号标出哪个应用来自经过认证的发布者。
+
+![列出已经安装的 Snap 软件包][11]
+
+*列出已经安装的 Snap 软件包*
+
+显示系统里所有已安装的 [Flatpak 软件包][12],可以用这个命令:
+
+```
+flatpak list
+```
+
+让我来个汇总:
+
+
+用 `apt` 命令显示已安装软件包:
+
+```
+apt list –installed
+```
+
+用 `dpkg` 命令显示已安装软件包:
+
+```
+dpkg-query -l
+```
+
+列出系统里 Snap 已安装软件包:
+
+```
+snap list
+```
+
+列出系统里 Flatpak 已安装软件包:
+
+```
+flatpak list
+```
+
+### 显示最近安装的软件包
+
+现在你已经看过以字母顺序列出的已经安装软件包了。如何显示最近已经安装的软件包?
+
+幸运的是,Linux 系统保存了所有发生事件的日志。你可以参考最近安装软件包的日志。
+
+有两个方法可以来做。用 `dpkg` 命令的日志或者 `apt` 命令的日志。
+
+你仅仅需要用 `grep` 命令过滤已经安装的软件包日志。
+
+```
+grep " install " /var/log/dpkg.log
+```
+
+这会显示所有的软件安装包,其中包括最近安装的过程中所依赖的软件包。
+
+```
+2019-02-12 12:41:42 install ubuntu-make:all 16.11.1ubuntu1
+2019-02-13 21:03:02 install xdg-desktop-portal:amd64 0.11-1
+2019-02-13 21:03:02 install libostree-1-1:amd64 2018.8-0ubuntu0.1
+2019-02-13 21:03:02 install flatpak:amd64 1.0.6-0ubuntu0.1
+2019-02-13 21:03:02 install xdg-desktop-portal-gtk:amd64 0.11-1
+2019-02-14 11:49:10 install qml-module-qtquick-window2:amd64 5.9.5-0ubuntu1.1
+2019-02-14 11:49:10 install qml-module-qtquick2:amd64 5.9.5-0ubuntu1.1
+2019-02-14 11:49:10 install qml-module-qtgraphicaleffects:amd64 5.9.5-0ubuntu1
+```
+
+你也可以查看 `apt` 历史命令日志。这个仅会显示用 `apt` 命令安装的的程序。但不会显示被依赖安装的软件包,详细的日志在日志里可以看到。有时你只是想看看对吧?
+
+```
+grep " install " /var/log/apt/history.log
+```
+
+具体的显示如下:
+
+```
+Commandline: apt install pinta
+Commandline: apt install pinta
+Commandline: apt install tmux
+Commandline: apt install terminator
+Commandline: apt install moreutils
+Commandline: apt install ubuntu-make
+Commandline: apt install flatpak
+Commandline: apt install cool-retro-term
+Commandline: apt install ubuntu-software
+```
+
+![显示最近已安装的软件包][13]
+
+*显示最近已安装的软件包*
+
+`apt` 的历史日志非常有用。因为他显示了什么时候执行了 `apt` 命令,哪个用户执行的命令以及安装的软件包名。
+
+### 小技巧:在软件中心显示已安装的程序包名
+
+如果你觉得终端和命令行交互不友好,还有一个方法可以查看系统的程序名。
+
+可以打开软件中心,然后点击已安装标签。你可以看到系统上已经安装的程序包名
+
+![Ubuntu 软件中心显示已安装的软件包][14]
+
+*在软件中心显示已安装的软件包*
+
+这个不会显示库和其他命令行的东西,有可能你也不想看到它们,因为你的大量交互都是在 GUI。此外,你也可以用 Synaptic 软件包管理器。
+
+### 结束语
+
+我希望这个简易的教程可以帮你查看 Ubuntu 和基于 Debian 的发行版的已安装软件包。
+
+如果你对本文有什么问题或建议,请在下面留言。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/list-installed-packages-ubuntu
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[guevaraya](https://github.com/guevaraya)
+校对:[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/getting-started-with-ubuntu/
+[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/list-installed-packages.png?resize=800%2C450&ssl=1
+[3]: https://itsfoss.com/apt-command-guide/
+[4]: https://itsfoss.com/apt-get-linux-guide/
+[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/list-installed-packages-in-ubuntu-with-apt.png?resize=800%2C407&ssl=1
+[6]: https://itsfoss.com/install-deb-files-ubuntu/
+[7]: https://itsfoss.com/apt-vs-apt-get-difference/
+[8]: https://wiki.debian.org/dpkg
+[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/list-installed-packages-with-dpkg.png?ssl=1
+[10]: https://itsfoss.com/use-snap-packages-ubuntu-16-04/
+[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/list-installed-snap-packages.png?ssl=1
+[12]: https://itsfoss.com/flatpak-guide/
+[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/apt-list-recently-installed-packages.png?resize=800%2C187&ssl=1
+[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/installed-software-ubuntu.png?ssl=1
+[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/list-installed-packages.png?fit=800%2C450&ssl=1
diff --git a/published/20190206 And, Ampersand, and - in Linux.md b/published/20190206 And, Ampersand, and - in Linux.md
new file mode 100644
index 0000000000..5c85abc111
--- /dev/null
+++ b/published/20190206 And, Ampersand, and - in Linux.md
@@ -0,0 +1,196 @@
+[#]: collector: (lujun9972)
+[#]: translator: (HankChow)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10587-1.html)
+[#]: subject: (And, Ampersand, and & in Linux)
+[#]: via: (https://www.linux.com/blog/learn/2019/2/and-ampersand-and-linux)
+[#]: author: (Paul Brown https://www.linux.com/users/bro66)
+
+Linux 中的 &
+======
+
+> 这篇文章将了解一下 & 符号及它在 Linux 命令行中的各种用法。
+
+![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ampersand.png?itok=7GdFO36Y)
+
+如果阅读过我之前的三篇文章([1][1]、[2][2]、[3][3]),你会觉得掌握连接各个命令之间的连接符号用法也是很重要的。实际上,命令的用法并不难,例如 `mkdir`、`touch` 和 `find` 也分别可以简单概括为“建立新目录”、“更新文件”和“在目录树中查找文件”而已。
+
+但如果要理解
+
+```
+mkdir test_dir 2>/dev/null || touch images.txt && find . -iname "*jpg" > backup/dir/images.txt &
+```
+
+这一串命令的目的,以及为什么要这样写,就没有这么简单了。
+
+关键之处就在于命令之间的连接符号。掌握了这些符号的用法,不仅可以让你更好理解整体的工作原理,还可以让你知道如何将不同的命令有效地结合起来,提高工作效率。
+
+在这一篇文章和接下来的文章中,我会介绍如何使用 `&` 号和管道符号(`|`)在不同场景下的使用方法。
+
+### 幕后工作
+
+我来举一个简单的例子,看看如何使用 `&` 号将下面这个命令放到后台运行:
+
+```
+cp -R original/dir/ backup/dir/
+```
+
+这个命令的目的是将 `original/dir/` 的内容递归地复制到 `backup/dir/` 中。虽然看起来很简单,但是如果原目录里面的文件太大,在执行过程中终端就会一直被卡住。
+
+所以,可以在命令的末尾加上一个 `&` 号,将这个任务放到后台去执行:
+
+```
+cp -R original/dir/ backup/dir/ &
+```
+
+任务被放到后台执行之后,就可以立即继续在同一个终端上工作了,甚至关闭终端也不影响这个任务的正常执行。需要注意的是,如果要求这个任务输出内容到标准输出中(例如 `echo` 或 `ls`),即使使用了 `&`,也会等待这些输出任务在前台运行完毕。
+
+当使用 `&` 将一个进程放置到后台运行的时候,Bash 会提示这个进程的进程 ID。在 Linux 系统中运行的每一个进程都有一个唯一的进程 ID,你可以使用进程 ID 来暂停、恢复或者终止对应的进程,因此进程 ID 是非常重要的。
+
+这个时候,只要你还停留在启动进程的终端当中,就可以使用以下几个命令来对管理后台进程:
+
+ * `jobs` 命令可以显示当前终端正在运行的进程,包括前台运行和后台运行的进程。它对每个正在执行中的进程任务分配了一个序号(这个序号不是进程 ID),可以使用这些序号来引用各个进程任务。
+
+ ```
+ $ jobs
+[1]- Running cp -i -R original/dir/* backup/dir/ &
+[2]+ Running find . -iname "*jpg" > backup/dir/images.txt &
+```
+ * `fg` 命令可以将后台运行的进程任务放到前台运行,这样可以比较方便地进行交互。根据 `jobs` 命令提供的进程任务序号,再在前面加上 `%` 符号,就可以把相应的进程任务放到前台运行。
+
+ ```
+ $ fg %1 # 将上面序号为 1 的 cp 任务放到前台运行
+cp -i -R original/dir/* backup/dir/
+```
+ 如果这个进程任务是暂停状态,`fg` 命令会将它启动起来。
+ * 使用 `ctrl+z` 组合键可以将前台运行的任务暂停,仅仅是暂停,而不是将任务终止。当使用 `fg` 或者 `bg` 命令将任务重新启动起来的时候,任务会从被暂停的位置开始执行。但 [sleep][4] 命令是一个特例,`sleep` 任务被暂停的时间会计算在 `sleep` 时间之内。因为 `sleep` 命令依据的是系统时钟的时间,而不是实际运行的时间。也就是说,如果运行了 `sleep 30`,然后将任务暂停 30 秒以上,那么任务恢复执行的时候会立即终止并退出。
+ * `bg` 命令会将任务放置到后台执行,如果任务是暂停状态,也会被启动起来。
+
+ ```
+ $ bg %1
+[1]+ cp -i -R original/dir/* backup/dir/ &
+```
+
+如上所述,以上几个命令只能在同一个终端里才能使用。如果启动进程任务的终端被关闭了,或者切换到了另一个终端,以上几个命令就无法使用了。
+
+如果要在另一个终端管理后台进程,就需要其它工具了。例如可以使用 [kill][5] 命令从另一个终端终止某个进程:
+
+```
+kill -s STOP
+```
+
+这里的 PID 就是使用 `&` 将进程放到后台时 Bash 显示的那个进程 ID。如果你当时没有把进程 ID 记录下来,也可以使用 `ps` 命令(代表 process)来获取所有正在运行的进程的进程 ID,就像这样:
+
+```
+ps | grep cp
+```
+
+执行以后会显示出包含 `cp` 字符串的所有进程,例如上面例子中的 `cp` 进程。同时还会显示出对应的进程 ID:
+
+```
+$ ps | grep cp
+14444 pts/3 00:00:13 cp
+```
+
+在这个例子中,进程 ID 是 14444,因此可以使用以下命令来暂停这个后台进程:
+
+```
+kill -s STOP 14444
+```
+
+注意,这里的 `STOP` 等同于前面提到的 `ctrl+z` 组合键的效果,也就是仅仅把进程暂停掉。
+
+如果想要把暂停了的进程启动起来,可以对进程发出 `CONT` 信号:
+
+```
+kill -s CONT 14444
+```
+
+这个给出一个[可以向进程发出的常用信号][6]列表。如果想要终止一个进程,可以发送 `TERM` 信号:
+
+```
+kill -s TERM 14444
+```
+
+如果进程不响应 `TERM` 信号并拒绝退出,还可以发送 `KILL` 信号强制终止进程:
+
+```
+kill -s KILL 14444
+```
+
+强制终止进程可能会有一定的风险,但如果遇到进程无节制消耗资源的情况,这样的信号还是能够派上用场的。
+
+另外,如果你不确定进程 ID 是否正确,可以在 `ps` 命令中加上 `x` 参数:
+
+```
+$ ps x| grep cp
+14444 pts/3 D 0:14 cp -i -R original/dir/Hols_2014.mp4
+ original/dir/Hols_2015.mp4 original/dir/Hols_2016.mp4
+ original/dir/Hols_2017.mp4 original/dir/Hols_2018.mp4 backup/dir/
+```
+
+这样就可以看到是不是你需要的进程 ID 了。
+
+最后介绍一个将 `ps` 和 `grep` 结合到一起的命令:
+
+```
+$ pgrep cp
+8
+18
+19
+26
+33
+40
+47
+54
+61
+72
+88
+96
+136
+339
+6680
+13735
+14444
+```
+
+`pgrep` 可以直接将带有字符串 `cp` 的进程的进程 ID 显示出来。
+
+可以加上一些参数让它的输出更清晰:
+
+```
+$ pgrep -lx cp
+14444 cp
+```
+
+在这里,`-l` 参数会让 `pgrep` 将进程的名称显示出来,`-x` 参数则是让 `pgrep` 完全匹配 `cp` 这个命令。如果还想了解这个命令的更多细节,可以尝试运行 `pgrep -ax`。
+
+### 总结
+
+在命令的末尾加上 `&` 可以让我们理解前台进程和后台进程的概念,以及如何管理这些进程。
+
+在 UNIX/Linux 术语中,在后台运行的进程被称为守护进程。如果你曾经听说过这个词,那你现在应该知道它的意义了。
+
+和其它符号一样,`&` 在命令行中还有很多别的用法。在下一篇文章中,我会更详细地介绍。
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/learn/2019/2/and-ampersand-and-linux
+
+作者:[Paul Brown][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.linux.com/users/bro66
+[b]: https://github.com/lujun9972
+[1]: https://linux.cn/article-10465-1.html
+[2]: https://linux.cn/article-10502-1.html
+[3]: https://linux.cn/article-10529-1.html
+[4]: https://ss64.com/bash/sleep.html
+[5]: https://bash.cyberciti.biz/guide/Sending_signal_to_Processes
+[6]: https://www.computerhope.com/unix/signals.htm
+
diff --git a/published/20190206 Getting started with Vim visual mode.md b/published/20190206 Getting started with Vim visual mode.md
new file mode 100644
index 0000000000..fff2bafe1a
--- /dev/null
+++ b/published/20190206 Getting started with Vim visual mode.md
@@ -0,0 +1,120 @@
+[#]: collector: (lujun9972)
+[#]: translator: (MjSeven)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10589-1.html)
+[#]: subject: (Getting started with Vim visual mode)
+[#]: via: (https://opensource.com/article/19/2/getting-started-vim-visual-mode)
+[#]: author: (Susan Lauber https://opensource.com/users/susanlauber)
+
+Vim 可视化模式入门
+======
+
+> 可视化模式使得在 Vim 中高亮显示和操作文本变得更加容易。
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming_code_keyboard_orange_hands.png?itok=G6tJ_64Y)
+
+Ansible 剧本文件是 YAML 格式的文本文件,经常与它们打交道的人通过他们偏爱的编辑器和扩展插件以使格式化更容易。
+
+当我使用大多数 Linux 发行版中提供的默认编辑器来教学 Ansible 时,我经常使用 Vim 的可视化模式。它可以让我在屏幕上高亮显示我的操作 —— 我要编辑什么以及我正在做的文本处理任务,以便使我的学生更容易学习。
+
+### Vim 的可视化模式
+
+使用 Vim 编辑文本时,可视化模式对于识别要操作的文本块非常有用。
+
+Vim 的可视模式有三个模式:字符、行和块。进入每种模式的按键是:
+
+ * 字符模式: `v` (小写)
+ * 行模式: `V` (大写)
+ * 块模式: `Ctrl+v`
+
+下面是使用每种模式简化工作的一些方法。
+
+### 字符模式
+
+字符模式可以高亮显示段落中的一个句子或句子中的一个短语,然后,可以使用任何 Vim 编辑命令删除、复制、更改/修改可视化模式识别的文本。
+
+#### 移动一个句子
+
+要将句子从一个地方移动到另一个地方,首先打开文件并将光标移动到要移动的句子的第一个字符。
+
+![](https://opensource.com/sites/default/files/uploads/vim-visual-char1.png)
+
+ * 按下 `v` 键进入可视化字符模式。单词 `VISUAL` 将出现在屏幕底部。
+ * 使用箭头来高亮显示所需的文本。你可以使用其他导航命令,例如 `w` 高亮显示至下一个单词的开头,`$` 来包含该行的其余部分。
+ * 在文本高亮显示后,按下 `d` 删除文本。
+ * 如果你删除得太多或不够,按下 `u` 撤销并重新开始。
+ * 将光标移动到新位置,然后按 `p` 粘贴文本。
+
+#### 改变一个短语
+
+你还可以高亮显示要替换的一段文本。
+
+![](https://opensource.com/sites/default/files/uploads/vim-visual-char2.png)
+
+ * 将光标放在要更改的第一个字符处。
+ * 按下 `v` 进入可视化字符模式。
+ * 使用导航命令(如箭头键)高亮显示该部分。
+ * 按下 `c` 可更改高亮显示的文本。
+ * 高亮显示的文本将消失,你将处于插入模式,你可以在其中添加新文本。
+ * 输入新文本后,按下 `Esc` 返回命令模式并保存你的工作。
+
+![](https://opensource.com/sites/default/files/uploads/vim-visual-char3.png)
+
+### 行模式
+
+使用 Ansible 剧本时,任务的顺序很重要。使用可视化行模式将 Ansible 任务移动到该剧本文件中的其他位置。
+
+#### 操纵多行文本
+
+![](https://opensource.com/sites/default/files/uploads/vim-visual-line1.png)
+
+ * 将光标放在要操作的文本的第一行或最后一行的任何位置。
+ * 按下 `Shift+V` 进入行模式。单词 `VISUAL LINE` 将出现在屏幕底部。
+ * 使用导航命令(如箭头键)高亮显示多行文本。
+ * 高亮显示所需文本后,使用命令来操作它。按下 `d` 删除,然后将光标移动到新位置,按下 `p` 粘贴文本。
+ * 如果要复制该 Ansible 任务,可以使用 `y`(yank)来代替 `d`(delete)。
+
+#### 缩进一组行
+
+使用 Ansible 剧本或 YAML 文件时,缩进很重要。高亮显示的块可以使用 `>` 和 `<` 键向右或向左移动。
+
+![](https://opensource.com/sites/default/files/uploads/vim-visual-line2.png)
+
+ * 按下 `>` 增加所有行的缩进。
+ * 按下 `<` 减少所有行的缩进。
+
+尝试其他 Vim 命令将它们应用于高亮显示的文本。
+
+### 块模式
+
+可视化块模式对于操作特定的表格数据文件非常有用,但它作为验证 Ansible 剧本文件缩进的工具也很有帮助。
+
+Ansible 任务是个项目列表,在 YAML 中,每个列表项都以一个破折号跟上一个空格开头。破折号必须在同一列中对齐,以达到相同的缩进级别。仅凭肉眼很难看出这一点。缩进 Ansible 任务中的其他行也很重要。
+
+#### 验证任务列表缩进相同
+
+![](https://opensource.com/sites/default/files/uploads/vim-visual-block1.png)
+
+ * 将光标放在列表项的第一个字符上。
+ * 按下 `Ctrl+v` 进入可视化块模式。单词 `VISUAL BLOCK` 将出现在屏幕底部。
+ * 使用箭头键高亮显示单个字符列。你可以验证每个任务的缩进量是否相同。
+ * 使用箭头键向右或向左展开块,以检查其它缩进是否正确。
+
+![](https://opensource.com/sites/default/files/uploads/vim-visual-block2.png)
+
+尽管我对其它 Vim 编辑快捷方式很熟悉,但我仍然喜欢使用可视化模式来整理我想要出来处理的文本。当我在讲演过程中演示其它概念时,我的学生将会在这个“对他们而言很新”的文本编辑器中看到一个可以高亮文本并可以点击删除的工具。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/getting-started-vim-visual-mode
+
+作者:[Susan Lauber][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/susanlauber
+[b]: https://github.com/lujun9972
diff --git a/published/20190208 7 steps for hunting down Python code bugs.md b/published/20190208 7 steps for hunting down Python code bugs.md
new file mode 100644
index 0000000000..1d89b8fd2d
--- /dev/null
+++ b/published/20190208 7 steps for hunting down Python code bugs.md
@@ -0,0 +1,116 @@
+[#]: collector: (lujun9972)
+[#]: translator: (LazyWolfLin)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10603-1.html)
+[#]: subject: (7 steps for hunting down Python code bugs)
+[#]: via: (https://opensource.com/article/19/2/steps-hunting-code-python-bugs)
+[#]: author: (Maria Mckinley https://opensource.com/users/parody)
+
+Python 七步捉虫法
+======
+
+> 了解一些技巧助你减少代码查错时间。
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bug-insect-butterfly-diversity-inclusion-2.png?itok=TcC9eews)
+
+在周五的下午三点钟(为什么是这个时间?因为事情总会在周五下午三点钟发生),你收到一条通知,客户发现你的软件出现一个错误。在有了初步的怀疑后,你联系运维,查看你的软件日志以了解发生了什么,因为你记得收到过日志已经搬家了的通知。
+
+结果这些日志被转移到了你获取不到的地方,但它们正在导入到一个网页应用中——所以到时候你可以用这个漂亮的应用来检索日志,但是,这个应用现在还没完成。这个应用预计会在几天内完成。我知道,你觉得这完全不切实际。然而并不是,日志或者日志消息似乎经常在错误的时间消失不见。在我们开始查错前,一个忠告:经常检查你的日志以确保它们还在你认为它们应该在的地方,并记录你认为它们应该记的东西。当你不注意的时候,这些东西往往会发生令人惊讶的变化。
+
+好的,你找到了日志或者尝试了呼叫运维人员,而客户确实发现了一个错误。甚至你可能认为你已经知道错误在哪儿。
+
+你立即打开你认为可能有问题的文件并开始查错。
+
+### 1、先不要碰你的代码
+
+阅读代码,你甚至可能会想到该阅读哪些部分。但是在开始搞乱你的代码前,请重现导致错误的调用并把它变成一个测试。这将是一个集成测试,因为你可能还有其他疑问,目前你还不能准确地知道问题在哪儿。
+
+确保这个测试结果是失败的。这很重要,因为有时你的测试不能重现失败的调用,尤其是你使用了可以混淆测试的 web 或者其他框架。很多东西可能被存储在变量中,但遗憾的是,只通过观察测试,你在测试里调用的东西并不总是明显可见的。当我尝试着重现这个失败的调用时,我并不是说我要创建一个可以通过的测试,但是,好吧,我确实是创建了一个测试,但我不认为这特别不寻常。
+
+> 从自己的错误中吸取教训。
+
+### 2、编写错误的测试
+
+现在,你有了一个失败的测试,或者可能是一个带有错误的测试,那么是时候解决问题了。但是在你开干之前,让我们先检查下调用栈,因为这样可以更轻松地解决问题。
+
+调用栈包括你已经启动但尚未完成地所有任务。因此,比如你正在烤蛋糕并准备往面糊里加面粉,那你的调用栈将是:
+
+* 做蛋糕
+* 打面糊
+* 加面粉
+
+你已经开始做蛋糕,开始打面糊,而你现在正在加面粉。往锅底抹油不在这个列表中,因为你已经完成了,而做糖霜不在这个列表上因为你还没开始做。
+
+如果你对调用栈不清楚,我强烈建议你使用 [Python Tutor][1],它能帮你在执行代码时观察调用栈。
+
+现在,如果你的 Python 程序出现了错误, Python 解释器会帮你打印出当前调用栈。这意味着无论那一时刻程序在做什么,很明显错误发生在调用栈的底部。
+
+### 3、始终先检查调用栈底部
+
+在栈底你不仅能看到发生了哪个错误,而且通常可以在调用栈的最后一行发现问题。如果栈底对你没有帮助,而你的代码还没有经过代码分析,那么使用代码分析是非常有用的。我推荐 pylint 或者 flake8。通常情况下,它会指出我一直忽略的错误的地方。
+
+如果错误看起来很迷惑,你下一步行动可能是用 Google 搜索它。如果你搜索的内容不包含你的代码的相关信息,如变量名、文件等,那你将获得更好的搜索结果。如果你使用的是 Python 3(你应该使用它),那么搜索内容包含 Python 3 是有帮助的,否则 Python 2 的解决方案往往会占据大多数。
+
+很久以前,开发者需要在没有搜索引擎的帮助下解决问题。那是一段黑暗时光。充分利用你可以使用的所有工具。
+
+不幸的是,有时候问题发生在更早阶段,但只有在调用栈底部执行的地方才显现出来。就像当蛋糕没有膨胀时,忘记加发酵粉的事才被发现。
+
+那就该检查整个调用栈。问题更可能在你的代码而不是 Python 标准库或者第三方包,所以先检查调用栈内你的代码。另外,在你的代码中放置断点通常会更容易检查代码。在调用栈的代码中放置断点,然后看看周围是否如你预期。
+
+“但是,玛丽,”我听到你说,“如果我有一个调用栈,那这些都是有帮助的,但我只有一个失败的测试。我该从哪里开始?”
+
+pdb,一个 Python 调试器。
+
+找到你代码里会被这个调用命中的地方。你应该能够找到至少一个这样的地方。在那里打上一个 pdb 的断点。
+
+#### 一句题外话
+
+为什么不使用 `print` 语句呢?我曾经依赖于 `print` 语句。有时候,它们仍然很方便。但当我开始处理复杂的代码库,尤其是有网络调用的代码库,`print` 语句就变得太慢了。我最终在各种地方都加上了 `print` 语句,但我没法追踪它们的位置和原因,而且变得更复杂了。但是主要使用 pdb 还有一个更重要的原因。假设你添加一条 `print` 语句去发现错误问题,而且 `print` 语句必须早于错误出现的地方。但是,看看你放 `print` 语句的函数,你不知道你的代码是怎么执行到那个位置的。查看代码是寻找调用路径的好方法,但看你以前写的代码是恐怖的。是的,我会用 `grep` 处理我的代码库以寻找调用函数的地方,但这会变得乏味,而且搜索一个通用函数时并不能缩小搜索范围。pdb 就变得非常有用。
+
+你遵循我的建议,打上 pdb 断点并运行你的测试。然而测试再次失败,但是没有任何一个断点被命中。留着你的断点,并运行测试套件中一个同这个失败的测试非常相似的测试。如果你有个不错的测试套件,你应该能够找到一个这样的测试。它会命中了你认为你的失败测试应该命中的代码。运行这个测试,然后当它运行到你的断点,按下 `w` 并检查调用栈。如果你不知道如何查看因为其他调用而变得混乱的调用栈,那么在调用栈的中间找到属于你的代码,并在堆栈中该代码的上一行放置一个断点。再试一次新的测试。如果仍然没命中断点,那么继续,向上追踪调用栈并找出你的调用在哪里脱轨了。如果你一直没有命中断点,最后到了追踪的顶部,那么恭喜你,你发现了问题:你的应用程序名称拼写错了。
+
+> 没有经验,小白,一点都没有经验。
+
+### 4、修改代码
+
+如果你仍觉得迷惑,在你稍微改变了一些的地方尝试新的测试。你能让新的测试跑起来么?有什么是不同的呢?有什么是相同的呢?尝试改变一下别的东西。当你有了你的测试,以及可能也还有其它的测试,那就可以开始安全地修改代码了,确定是否可以缩小问题范围。记得从一个新提交开始解决问题,以便于可以轻松地撤销无效地更改。(这就是版本控制,如果你没有使用过版本控制,这将会改变你的生活。好吧,可能它只是让编码更容易。查阅“[版本控制可视指南][2]”,以了解更多。)
+
+### 5、休息一下
+
+尽管如此,当它不再感觉起来像一个有趣的挑战或者游戏而开始变得令人沮丧时,你最好的举措是脱离这个问题。休息一下。我强烈建议你去散步并尝试考虑别的事情。
+
+### 6、把一切写下来
+
+当你回来了,如果你没有突然受到启发,那就把你关于这个问题所知的每一个点信息写下来。这应该包括:
+
+ * 真正造成问题的调用
+ * 真正发生了什么,包括任何错误信息或者相关的日志信息
+ * 你真正期望发生什么
+ * 到目前为止,为了找出问题,你做了什么工作;以及解决问题中你发现的任何线索。
+
+有时这里有很多信息,但相信我,从零碎中挖掘信息是很烦人。所以尽量简洁,但是要完整。
+
+### 7、寻求帮助
+
+我经常发现写下所有信息能够启迪我想到还没尝试过的东西。当然,有时候我在点击求助邮件(或表单)的提交按钮后立刻意识到问题是是什么。无论如何,当你在写下所有东西仍一无所获时,那就试试向他人发邮件求助。首先是你的同事或者其他参与你的项目的人,然后是该项目的邮件列表。不要害怕向人求助。大多数人都是友善和乐于助人的,我发现在 Python 社区里尤其如此。
+
+Maria McKinley 已在 [PyCascades 2019][4] 演讲 [代码查错][3],2 月 23-24,于西雅图。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/steps-hunting-code-python-bugs
+
+作者:[Maria Mckinley][a]
+选题:[lujun9972][b]
+译者:[LazyWolfLin](https://github.com/LazyWolfLin)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/parody
+[b]: https://github.com/lujun9972
+[1]: http://www.pythontutor.com/
+[2]: https://betterexplained.com/articles/a-visual-guide-to-version-control/
+[3]: https://2019.pycascades.com/talks/hunting-the-bugs
+[4]: https://2019.pycascades.com/
diff --git a/published/20190212 Ampersands and File Descriptors in Bash.md b/published/20190212 Ampersands and File Descriptors in Bash.md
new file mode 100644
index 0000000000..1458375ae6
--- /dev/null
+++ b/published/20190212 Ampersands and File Descriptors in Bash.md
@@ -0,0 +1,164 @@
+[#]: collector: (lujun9972)
+[#]: translator: (zero-mk)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10591-1.html)
+[#]: subject: (Ampersands and File Descriptors in Bash)
+[#]: via: (https://www.linux.com/blog/learn/2019/2/ampersands-and-file-descriptors-bash)
+[#]: author: (Paul Brown https://www.linux.com/users/bro66)
+
+Bash 中的 & 符号和文件描述符
+======
+
+> 了解如何将 “&” 与尖括号结合使用,并从命令行中获得更多信息。
+
+![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ampersand-coffee.png?itok=yChaT-47)
+
+在我们探究大多数链式 Bash 命令中出现的所有的杂项符号(`&`、`|`、`;`、`>`、`<`、`{`、`[`、`(`、`)`、`]`、`}` 等等)的任务中,[我们一直在仔细研究 & 符号][1]。
+
+[上次,我们看到了如何使用 & 把可能需要很长时间运行的进程放到后台运行][1]。但是,`&` 与尖括号 `<` 结合使用,也可用于将输出或输出通过管道导向其他地方。
+
+在 [前面的][2] [尖括号教程中][3],你看到了如何使用 `>`,如下:
+
+```
+ls > list.txt
+```
+
+将 `ls` 输出传递给 `list.txt` 文件。
+
+现在我们看到的是简写:
+
+```
+ls 1> list.txt
+```
+
+在这种情况下,`1` 是一个文件描述符,指向标准输出(`stdout`)。
+
+以类似的方式,`2` 指向标准错误输出(`stderr`):
+
+```
+ls 2> error.log
+```
+
+所有错误消息都通过管道传递给 `error.log` 文件。
+
+回顾一下:`1>` 是标准输出(`stdout`),`2>` 是标准错误输出(`stderr`)。
+
+第三个标准文件描述符,`0<` 是标准输入(`stdin`)。你可以看到它是一个输入,因为箭头(`<`)指向`0`,而对于 `1` 和 `2`,箭头(`>`)是指向外部的。
+
+### 标准文件描述符有什么用?
+
+如果你在阅读本系列以后,你已经多次使用标准输出(`1>`)的简写形式:`>`。
+
+例如,当(假如)你知道你的命令会抛出一个错误时,像 `stderr`(`2`)这样的东西也很方便,但是 Bash 告诉你的东西是没有用的,你不需要看到它。如果要在 `home/` 目录中创建目录,例如:
+
+```
+mkdir newdir
+```
+
+如果 `newdir/` 已经存在,`mkdir` 将显示错误。但你为什么要关心这些呢?(好吧,在某些情况下你可能会关心,但并非总是如此。)在一天结束时,`newdir` 会以某种方式让你填入一些东西。你可以通过将错误消息推入虚空(即 ``/dev/null`)来抑制错误消息:
+
+```
+mkdir newdir 2> /dev/null
+```
+
+这不仅仅是 “让我们不要看到丑陋和无关的错误消息,因为它们很烦人”,因为在某些情况下,错误消息可能会在其他地方引起一连串错误。比如说,你想找到 `/etc` 下所有的 `.service` 文件。你可以这样做:
+
+```
+find /etc -iname "*.service"
+```
+
+但事实证明,在大多数系统中,`find` 显示的错误会有许多行,因为普通用户对 `/etc` 下的某些文件夹没有读取访问权限。它使读取正确的输出变得很麻烦,如果 `find` 是更大的脚本的一部分,它可能会导致行中的下一个命令排队。
+
+相反,你可以这样做:
+
+```
+find /etc -iname "*.service" 2> /dev/null
+```
+
+而且你只得到你想要的结果。
+
+### 文件描述符入门
+
+单独的文件描述符 `stdout` 和 `stderr` 还有一些注意事项。如果要将输出存储在文件中,请执行以下操作:
+
+```
+find /etc -iname "*.service" 1> services.txt
+```
+
+工作正常,因为 `1>` 意味着 “发送标准输出且自身标准输出(非标准错误)到某个地方”。
+
+但这里存在一个问题:如果你想把命令抛出的错误信息记录到文件,而结果中没有错误信息你该怎么**做**?上面的命令并不会这样做,因为它只写入 `find` 正确的结果,而:
+
+```
+find /etc -iname "*.service" 2> services.txt
+```
+
+只会写入命令抛出的错误信息。
+
+我们如何得到两者?请尝试以下命令:
+
+```
+find /etc -iname "*.service" &> services.txt
+```
+
+…… 再次和 `&` 打个招呼!
+
+我们一直在说 `stdin`(`0`)、`stdout`(`1`)和 `stderr`(`2`)是“文件描述符”。文件描述符是一种特殊构造,是指向文件的通道,用于读取或写入,或两者兼而有之。这来自于将所有内容都视为文件的旧 UNIX 理念。想写一个设备?将其视为文件。想写入套接字并通过网络发送数据?将其视为文件。想要读取和写入文件?嗯,显然,将其视为文件。
+
+因此,在管理命令的输出和错误的位置时,将目标视为文件。因此,当你打开它们来读取和写入它们时,它们都会获得文件描述符。
+
+这是一个有趣的效果。例如,你可以将内容从一个文件描述符传递到另一个文件描述符:
+
+```
+find /etc -iname "*.service" 1> services.txt 2>&1
+```
+
+这会将 `stderr` 导向到 `stdout`,而 `stdout` 通过管道被导向到一个文件中 `services.txt` 中。
+
+它再次出现:`&` 发信号通知 Bash `1` 是目标文件描述符。
+
+标准文件描述符的另一个问题是,当你从一个管道传输到另一个时,你执行此操作的顺序有点违反直觉。例如,按照上面的命令。它看起来像是错误的方式。你应该像这样阅读它:“将输出导向到文件,然后将错误导向到标准输出。” 看起来错误输出会在后面,并且在输出到标准输出(`1`)已经完成时才发送。
+
+但这不是文件描述符的工作方式。文件描述符不是文件的占位符,而是文件的输入和(或)输出通道。在这种情况下,当你做 `1> services.txt` 时,你的意思是 “打开一个写管道到 `services.txt` 并保持打开状态”。`1` 是你要使用的管道的名称,它将保持打开状态直到该行的结尾。
+
+如果你仍然认为这是错误的方法,试试这个:
+
+```
+find /etc -iname "*.service" 2>&1 1>services.txt
+```
+
+并注意它是如何不工作的;注意错误是如何被导向到终端的,而只有非错误的输出(即 `stdout`)被推送到 `services.txt`。
+
+这是因为 Bash 从左到右处理 `find` 的每个结果。这样想:当 Bash 到达 `2>&1` 时,`stdout` (`1`)仍然是指向终端的通道。如果 `find` 给 Bash 的结果包含一个错误,它将被弹出到 `2`,转移到 `1`,然后留在终端!
+
+然后在命令结束时,Bash 看到你要打开 `stdout`(`1`) 作为到 `services.txt` 文件的通道。如果没有发生错误,结果将通过通道 `1` 进入文件。
+
+相比之下,在:
+
+```
+find /etc -iname "*.service" 1>services.txt 2>&1
+```
+
+`1` 从一开始就指向 `services.txt`,因此任何弹出到 `2` 的内容都会导向到 `1` ,而 `1` 已经指向最终去的位置 `services.txt`,这就是它工作的原因。
+
+在任何情况下,如上所述 `&>` 都是“标准输出和标准错误”的缩写,即 `2>&1`。
+
+这可能有点多,但不用担心。重新导向文件描述符在 Bash 命令行和脚本中是司空见惯的事。随着本系列的深入,你将了解更多关于文件描述符的知识。下周见!
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/learn/2019/2/ampersands-and-file-descriptors-bash
+
+作者:[Paul Brown][a]
+选题:[lujun9972][b]
+译者:[zero-mk](https://github.com/zero-mk)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linux.com/users/bro66
+[b]: https://github.com/lujun9972
+[1]: https://linux.cn/article-10587-1.html
+[2]: https://linux.cn/article-10502-1.html
+[3]: https://linux.cn/article-10529-1.html
diff --git a/published/20190212 How To Check CPU, Memory And Swap Utilization Percentage In Linux.md b/published/20190212 How To Check CPU, Memory And Swap Utilization Percentage In Linux.md
new file mode 100644
index 0000000000..cee9dc5f2c
--- /dev/null
+++ b/published/20190212 How To Check CPU, Memory And Swap Utilization Percentage In Linux.md
@@ -0,0 +1,218 @@
+[#]: collector: (lujun9972)
+[#]: translator: (An-DJ)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10595-1.html)
+[#]: subject: (How To Check CPU, Memory And Swap Utilization Percentage In Linux?)
+[#]: via: (https://www.2daygeek.com/linux-check-cpu-memory-swap-utilization-percentage/)
+[#]: author: (Vinoth Kumar https://www.2daygeek.com/author/vinoth/)
+
+如何查看 Linux 下 CPU、内存和交换分区的占用率?
+======
+
+在 Linux 下有很多可以用来查看内存占用情况的命令和选项,但是我并没有看见关于内存占用率的更多的信息。
+
+在大多数情况下我们只想查看内存使用情况,并没有考虑占用的百分比究竟是多少。如果你想要了解这些信息,那你看这篇文章就对了。我们将会详细地在这里帮助你解决这个问题。
+
+这篇教程将会帮助你在面对 Linux 服务器下频繁的内存高占用情况时,确定内存使用情况。
+
+而在同时,如果你使用的是 `free -m` 或者 `free -g`,占用情况描述地也并不是十分清楚。
+
+这些格式化命令属于 Linux 高级命令。它将会对 Linux 专家和中等水平 Linux 使用者非常有用。
+
+### 方法-1:如何查看 Linux 下内存占用率?
+
+我们可以使用下面命令的组合来达到此目的。在该方法中,我们使用的是 `free` 和 `awk` 命令的组合来获取内存占用率。
+
+如果你正在寻找其他有关于内存的文章,你可以导航到如下链接。这些文章有 [free 命令][1]、[smem 命令][2]、[ps_mem 命令][3]、[vmstat 命令][4] 及 [查看物理内存大小的多种方式][5]。
+
+要获取不包含百分比符号的内存占用率:
+
+```
+$ free -t | awk 'NR == 2 {print "Current Memory Utilization is : " $3/$2*100}'
+或
+$ free -t | awk 'FNR == 2 {print "Current Memory Utilization is : " $3/$2*100}'
+
+Current Memory Utilization is : 20.4194
+```
+
+要获取不包含百分比符号的交换分区占用率:
+
+```
+$ free -t | awk 'NR == 3 {print "Current Swap Utilization is : " $3/$2*100}'
+或
+$ free -t | awk 'FNR == 3 {print "Current Swap Utilization is : " $3/$2*100}'
+
+Current Swap Utilization is : 0
+```
+
+要获取包含百分比符号及保留两位小数的内存占用率:
+
+```
+$ free -t | awk 'NR == 2 {printf("Current Memory Utilization is : %.2f%"), $3/$2*100}'
+或
+$ free -t | awk 'FNR == 2 {printf("Current Memory Utilization is : %.2f%"), $3/$2*100}'
+
+Current Memory Utilization is : 20.42%
+```
+
+要获取包含百分比符号及保留两位小数的交换分区占用率:
+
+```
+$ free -t | awk 'NR == 3 {printf("Current Swap Utilization is : %.2f%"), $3/$2*100}'
+或
+$ free -t | awk 'FNR == 3 {printf("Current Swap Utilization is : %.2f%"), $3/$2*100}'
+
+Current Swap Utilization is : 0.00%
+```
+
+如果你正在寻找有关于交换分区的其他文章,你可以导航至如下链接。这些链接有 [使用 LVM(逻辑盘卷管理)创建和扩展交换分区][6],[创建或扩展交换分区的多种方式][7] 和 [创建/删除和挂载交换分区文件的多种方式][8]。
+
+键入 `free` 命令会更好地作出阐释:
+
+```
+$ free
+ total used free shared buff/cache available
+Mem: 15867 3730 9868 1189 2269 10640
+Swap: 17454 0 17454
+Total: 33322 3730 27322
+```
+
+细节如下:
+
+ * `free`:是一个标准命令,用于在 Linux 下查看内存使用情况。
+ * `awk`:是一个专门用来做文本数据处理的强大命令。
+ * `FNR == 2`:该命令给出了每一个输入文件的行数。其基本上用于挑选出给定的行(针对于这里,它选择的是行号为 2 的行)
+ * `NR == 2`:该命令给出了处理的行总数。其基本上用于过滤给出的行(针对于这里,它选择的是行号为 2 的行)
+ * `$3/$2*100`:该命令将列 3 除以列 2 并将结果乘以 100。
+ * `printf`:该命令用于格式化和打印数据。
+ * `%.2f%`:默认情况下,其打印小数点后保留 6 位的浮点数。使用后跟的格式来约束小数位。
+
+### 方法-2:如何查看 Linux 下内存占用率?
+
+我们可以使用下面命令的组合来达到此目的。在这种方法中,我们使用 `free`、`grep` 和 `awk` 命令的组合来获取内存占用率。
+
+要获取不包含百分比符号的内存占用率:
+
+```
+$ free -t | grep Mem | awk '{print "Current Memory Utilization is : " $3/$2*100}'
+Current Memory Utilization is : 20.4228
+```
+
+要获取不包含百分比符号的交换分区占用率:
+
+```
+$ free -t | grep Swap | awk '{print "Current Swap Utilization is : " $3/$2*100}'
+Current Swap Utilization is : 0
+```
+
+要获取包含百分比符号及保留两位小数的内存占用率:
+
+```
+$ free -t | grep Mem | awk '{printf("Current Memory Utilization is : %.2f%"), $3/$2*100}'
+Current Memory Utilization is : 20.43%
+```
+
+要获取包含百分比符号及保留两位小数的交换空间占用率:
+
+```
+$ free -t | grep Swap | awk '{printf("Current Swap Utilization is : %.2f%"), $3/$2*100}'
+Current Swap Utilization is : 0.00%
+```
+
+### 方法-1:如何查看 Linux 下 CPU 的占用率?
+
+我们可以使用如下命令的组合来达到此目的。在这种方法中,我们使用 `top`、`print` 和 `awk` 命令的组合来获取 CPU 的占用率。
+
+如果你正在寻找其他有关于 CPU(LCTT 译注:原文误为 memory)的文章,你可以导航至如下链接。这些文章有 [top 命令][9]、[htop 命令][10]、[atop 命令][11] 及 [Glances 命令][12]。
+
+如果在输出中展示的是多个 CPU 的情况,那么你需要使用下面的方法。
+
+```
+$ top -b -n1 | grep ^%Cpu
+%Cpu0 : 5.3 us, 0.0 sy, 0.0 ni, 94.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
+%Cpu1 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
+%Cpu2 : 0.0 us, 0.0 sy, 0.0 ni, 94.7 id, 0.0 wa, 0.0 hi, 5.3 si, 0.0 st
+%Cpu3 : 5.3 us, 0.0 sy, 0.0 ni, 94.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
+%Cpu4 : 10.5 us, 15.8 sy, 0.0 ni, 73.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
+%Cpu5 : 0.0 us, 5.0 sy, 0.0 ni, 95.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
+%Cpu6 : 5.3 us, 0.0 sy, 0.0 ni, 94.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
+%Cpu7 : 5.3 us, 0.0 sy, 0.0 ni, 94.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
+```
+
+要获取不包含百分比符号的 CPU 占用率:
+
+```
+$ top -b -n1 | grep ^%Cpu | awk '{cpu+=$9}END{print "Current CPU Utilization is : " 100-cpu/NR}'
+Current CPU Utilization is : 21.05
+```
+
+要获取包含百分比符号及保留两位小数的 CPU 占用率:
+
+```
+$ top -b -n1 | grep ^%Cpu | awk '{cpu+=$9}END{printf("Current CPU Utilization is : %.2f%"), 100-cpu/NR}'
+Current CPU Utilization is : 14.81%
+```
+
+### 方法-2:如何查看 Linux 下 CPU 的占用率?
+
+我们可以使用如下命令的组合来达到此目的。在这种方法中,我们使用的是 `top`、`print`/`printf` 和 `awk` 命令的组合来获取 CPU 的占用率。
+
+如果在单个输出中一起展示了所有的 CPU 的情况,那么你需要使用下面的方法。
+
+```
+$ top -b -n1 | grep ^%Cpu
+%Cpu(s): 15.3 us, 7.2 sy, 0.8 ni, 69.0 id, 6.7 wa, 0.0 hi, 1.0 si, 0.0 st
+```
+
+要获取不包含百分比符号的 CPU 占用率:
+
+```
+$ top -b -n1 | grep ^%Cpu | awk '{print "Current CPU Utilization is : " 100-$8}'
+Current CPU Utilization is : 5.6
+```
+
+要获取包含百分比符号及保留两位小数的 CPU 占用率:
+
+```
+$ top -b -n1 | grep ^%Cpu | awk '{printf("Current CPU Utilization is : %.2f%"), 100-$8}'
+Current CPU Utilization is : 5.40%
+```
+
+如下是一些细节:
+
+ * `top`:是一种用于查看当前 Linux 系统下正在运行的进程的非常好的命令。
+ * `-b`:选项允许 `top` 命令切换至批处理的模式。当你从本地系统运行 `top` 命令至远程系统时,它将会非常有用。
+ * `-n1`:迭代次数。
+ * `^%Cpu`:过滤以 `%CPU` 开头的行。
+ * `awk`:是一种专门用来做文本数据处理的强大命令。
+ * `cpu+=$9`:对于每一行,将第 9 列添加至变量 `cpu`。
+ * `printf`:该命令用于格式化和打印数据。
+ * `%.2f%`:默认情况下,它打印小数点后保留 6 位的浮点数。使用后跟的格式来限制小数位数。
+ * `100-cpu/NR`:最终打印出 CPU 平均占用率,即用 100 减去其并除以行数。
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/linux-check-cpu-memory-swap-utilization-percentage/
+
+作者:[Vinoth Kumar][a]
+选题:[lujun9972][b]
+译者:[An-DJ](https://github.com/An-DJ)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/vinoth/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/free-command-to-check-memory-usage-statistics-in-linux/
+[2]: https://www.2daygeek.com/smem-linux-memory-usage-statistics-reporting-tool/
+[3]: https://www.2daygeek.com/ps_mem-report-core-memory-usage-accurately-in-linux/
+[4]: https://www.2daygeek.com/linux-vmstat-command-examples-tool-report-virtual-memory-statistics/
+[5]: https://www.2daygeek.com/easy-ways-to-check-size-of-physical-memory-ram-in-linux/
+[6]: https://www.2daygeek.com/how-to-create-extend-swap-partition-in-linux-using-lvm/
+[7]: https://www.2daygeek.com/add-extend-increase-swap-space-memory-file-partition-linux/
+[8]: https://www.2daygeek.com/shell-script-create-add-extend-swap-space-linux/
+[9]: https://www.2daygeek.com/linux-top-command-linux-system-performance-monitoring-tool/
+[10]: https://www.2daygeek.com/linux-htop-command-linux-system-performance-resource-monitoring-tool/
+[11]: https://www.2daygeek.com/atop-system-process-performance-monitoring-tool/
+[12]: https://www.2daygeek.com/install-glances-advanced-real-time-linux-system-performance-monitoring-tool-on-centos-fedora-ubuntu-debian-opensuse-arch-linux/
diff --git a/published/20190212 Two graphical tools for manipulating PDFs on the Linux desktop.md b/published/20190212 Two graphical tools for manipulating PDFs on the Linux desktop.md
new file mode 100644
index 0000000000..77c68dc718
--- /dev/null
+++ b/published/20190212 Two graphical tools for manipulating PDFs on the Linux desktop.md
@@ -0,0 +1,97 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10584-1.html)
+[#]: subject: (Two graphical tools for manipulating PDFs on the Linux desktop)
+[#]: via: (https://opensource.com/article/19/2/manipulating-pdfs-linux)
+[#]: author: (Scott Nesbitt https://opensource.com/users/scottnesbitt)
+
+两款 Linux 桌面中的图形化操作 PDF 的工具
+======
+
+> PDF-Shuffler 和 PDF Chain 是在 Linux 中修改 PDF 的绝佳工具。
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tools_osyearbook2016_sysadmin_cc.png?itok=Y1AHCKI4)
+
+由于我谈论和写作了些 PDF 及使用它们的工具的文章,有些人认为我喜欢这种格式。其实我并不是,由于各种原因,我不会深入它。
+
+我不会说 PDF 是我个人和职业生活中的一个躲不开的坏事 - 而实际上它们不是那么好。通常即使有更好的替代方案来交付文档,通常我也必须使用 PDF。
+
+当我使用 PDF 时,通常是在白天工作时在其他的操作系统上使用,我使用 Adobe Acrobat 进行操作。但是当我必须在 Linux 桌面上使用 PDF 时呢?我们来看看我用来操作 PDF 的两个图形工具。
+
+### PDF-Shuffler
+
+顾名思义,你可以使用 [PDF-Shuffler][1] 在 PDF 文件中移动页面。它可以做得更多,但该软件的功能是有限的。这并不意味着 PDF-Shuffler 没用。它有用,很有用。
+
+你可以将 PDF-Shuffler 用来:
+
+ * 从 PDF 文件中提取页面
+ * 将页面添加到文件中
+ * 重新排列文件中的页面
+
+请注意,PDF-Shuffler 有一些依赖项,如 pyPDF 和 python-gtk。通常,通过包管理器安装它是最快且最不令人沮丧的途径。
+
+假设你想从 PDF 中提取页面,也许是作为你书中的样本章节。选择 “File > Add”打开 PDF 文件。
+
+![](https://opensource.com/sites/default/files/uploads/pdfshuffler-book.png)
+
+要提取第 7 页到第 9 页,请按住 `Ctrl` 并单击选择页面。然后,右键单击并选择 “Export selection”。
+
+![](https://opensource.com/sites/default/files/uploads/pdfshuffler-export.png)
+
+选择要保存文件的目录,为其命名,然后单击 “Save”。
+
+要添加文件 —— 例如,要添加封面或重新插入已扫描的且已签名的合同或者应用 - 打开 PDF 文件,然后选择 “File > Add” 并找到要添加的 PDF 文件。单击 “Open”。
+
+PDF-Shuffler 有个不好的地方就是添加页面到你正在处理的 PDF 文件末尾。单击并将添加的页面拖动到文件中的所需位置。你一次只能在文件中单击并拖动一个页面。
+
+![](https://opensource.com/sites/default/files/uploads/pdfshuffler-move.png)
+
+### PDF Chain
+
+我是 [PDFtk][2] 的忠实粉丝,它是一个可以对 PDF 做一些有趣操作的命令行工具。由于我不经常使用它,我不记得所有 PDFtk 的命令和选项。
+
+[PDF Chain][3] 是 PDFtk 命令行的一个很好的替代品。它可以让你一键使用 PDFtk 最常用的命令。无需使用菜单,你可以:
+
+* 合并 PDF(包括旋转一个或多个文件的页面)
+* 从 PDF 中提取页面并将其保存到单个文件中
+* 为 PDF 添加背景或水印
+* 将附件添加到文件
+
+![](https://opensource.com/sites/default/files/uploads/pdfchain1.png)
+
+你也可以做得更多。点击 “Tools” 菜单,你可以:
+
+* 从 PDF 中提取附件
+* 压缩或解压缩文件
+* 从文件中提取元数据
+* 用外部[数据][4]填充 PDF 表格
+* [扁平化][5] PDF
+* 从 PDF 表单中删除 [XML 表格结构][6](XFA)数据
+
+老实说,我只使用 PDF Chain 或 PDFtk 提取附件、压缩或解压缩 PDF。其余的对我来说基本没听说。
+
+### 总结
+
+Linux 上用于处理 PDF 的工具数量一直让我感到吃惊。它们的特性和功能的广度和深度也是如此。无论是命令行还是图形,我总能找到一个能做我需要的。在大多数情况下,PDF Mod 和 PDF Chain 对我来说效果很好。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/manipulating-pdfs-linux
+
+作者:[Scott Nesbitt][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/scottnesbitt
+[b]: https://github.com/lujun9972
+[1]: https://savannah.nongnu.org/projects/pdfshuffler/
+[2]: https://en.wikipedia.org/wiki/PDFtk
+[3]: http://pdfchain.sourceforge.net/
+[4]: http://www.verypdf.com/pdfform/fdf.htm
+[5]: http://pdf-tips-tricks.blogspot.com/2009/03/flattening-pdf-layers.html
+[6]: http://en.wikipedia.org/wiki/XFA
diff --git a/published/20190213 How To Install, Configure And Use Fish Shell In Linux.md b/published/20190213 How To Install, Configure And Use Fish Shell In Linux.md
new file mode 100644
index 0000000000..417f170517
--- /dev/null
+++ b/published/20190213 How To Install, Configure And Use Fish Shell In Linux.md
@@ -0,0 +1,260 @@
+[#]: collector: "lujun9972"
+[#]: translator: "zero-MK"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-10622-1.html"
+[#]: subject: "How To Install, Configure And Use Fish Shell In Linux?"
+[#]: via: "https://www.2daygeek.com/linux-fish-shell-friendly-interactive-shell/"
+[#]: author: "Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/"
+
+如何在 Linux 中安装、配置和使用 Fish Shell?
+======
+
+每个 Linux 管理员都可能听到过 shell 这个词。你知道什么是 shell 吗? 你知道 shell 在 Linux 中的作用是什么吗? Linux 中有多少个 shell 可用?
+
+shell 是一个程序,它是提供用户和内核之间交互的接口。
+
+内核是 Linux 操作系统的核心,它管理用户和操作系统之间的所有内容。Shell 可供所有用户在启动终端时使用。终端启动后,用户可以运行任何可用的命令。当 shell 完成命令的执行时,你将在终端窗口上获取输出。
+
+Bash(全称是 Bourne Again Shell)是运行在今天的大多数 Linux 发行版上的默认的 shell,它非常受欢迎,并具有很多功能。但今天我们将讨论 Fish Shell 。
+
+### 什么是 Fish Shell?
+
+[Fish][1] 是友好的交互式 shell ,是一个功能齐全,智能且对用户友好的 Linux 命令行 shell ,它带有一些在大多数 shell 中都不具备的方便功能。
+
+这些功能包括自动补全建议、Sane Scripting、手册页补全、基于 Web 的配置器和 Glorious VGA Color 。你对它感到好奇并想测试它吗?如果是这样,请按照以下安装步骤继续安装。
+
+### 如何在 Linux 中安装 Fish Shell ?
+
+它的安装非常简单,除了少数几个发行版外,它在大多数发行版中都没有。但是,可以使用以下 [fish 仓库][2] 轻松安装。
+
+对于基于 Arch Linux 的系统, 使用 [Pacman 命令][3] 来安装 fish shell。
+
+```
+$ sudo pacman -S fish
+```
+
+对于 Ubuntu 16.04/18.04 系统来说,请使用 [APT-GET 命令][4] 或者 [APT 命令][5] 安装 fish shell。
+
+```
+$ sudo apt-add-repository ppa:fish-shell/release-3
+$ sudo apt-get update
+$ sudo apt-get install fish
+```
+
+对于 Fedora 系统来说,请使用 [DNF 命令][6] 安装 fish shell。
+
+对于 Fedora 29 系统来说:
+
+```
+$ sudo dnf config-manager --add-repo https://download.opensuse.org/repositories/shells:/fish:/release:/3/Fedora_29/shells:fish:release:3.repo
+$ sudo dnf install fish
+```
+
+对于 Fedora 28 系统来说:
+
+```
+$ sudo dnf config-manager --add-repo https://download.opensuse.org/repositories/shells:/fish:/release:/3/Fedora_28/shells:fish:release:3.repo
+$ sudo dnf install fish
+```
+
+对于 Debian 系统来说,请使用 [APT-GET 命令][4] 或者 [APT 命令][5] 安装 fish shell。
+
+对于 Debian 9 系统来说:
+
+```
+$ sudo wget -nv https://download.opensuse.org/repositories/shells:fish:release:3/Debian_9.0/Release.key -O Release.key
+$ sudo apt-key add - < Release.key
+$ sudo echo 'deb http://download.opensuse.org/repositories/shells:/fish:/release:/3/Debian_9.0/ /' > /etc/apt/sources.list.d/shells:fish:release:3.list
+$ sudo apt-get update
+$ sudo apt-get install fish
+```
+
+对于 Debian 8 系统来说:
+
+```
+$ sudo wget -nv https://download.opensuse.org/repositories/shells:fish:release:3/Debian_8.0/Release.key -O Release.key
+$ sudo apt-key add - < Release.key
+$ sudo echo 'deb http://download.opensuse.org/repositories/shells:/fish:/release:/3/Debian_8.0/ /' > /etc/apt/sources.list.d/shells:fish:release:3.list
+$ sudo apt-get update
+$ sudo apt-get install fish
+```
+
+对于 RHEL/CentOS 系统来说,请使用 [YUM 命令][7] 安装 fish shell。
+
+对于 RHEL 7 系统来说:
+
+```
+$ sudo yum-config-manager --add-repo https://download.opensuse.org/repositories/shells:/fish:/release:/3/RHEL_7/shells:fish:release:3.repo
+$ sudo yum install fish
+```
+
+对于 RHEL 6 系统来说:
+
+```
+$ sudo yum-config-manager --add-repo https://download.opensuse.org/repositories/shells:/fish:/release:/3/RedHat_RHEL-6/shells:fish:release:3.repo
+$ sudo yum install fish
+```
+
+对于 CentOS 7 系统来说:
+
+```
+$ sudo yum-config-manager --add-repo https://download.opensuse.org/repositories/shells:fish:release:2/CentOS_7/shells:fish:release:2.repo
+$ sudo yum install fish
+```
+
+对于 CentOS 6 系统来说:
+
+```
+$ sudo yum-config-manager --add-repo https://download.opensuse.org/repositories/shells:fish:release:2/CentOS_6/shells:fish:release:2.repo
+$ sudo yum install fish
+```
+
+对于 openSUSE Leap 系统来说,请使用 [Zypper 命令][8] 安装 fish shell。
+
+```
+$ sudo zypper addrepo https://download.opensuse.org/repositories/shells:/fish:/release:/3/openSUSE_Leap_42.3/shells:fish:release:3.repo
+$ suod zypper refresh
+$ sudo zypper install fish
+```
+
+### 如何使用 Fish Shell ?
+
+一旦你成功安装了 fish shell 。只需在你的终端上输入 `fish` ,它将自动从默认的 bash shell 切换到 fish shell 。
+
+```
+$ fish
+```
+
+![][10]
+
+### 自动补全建议
+
+当你在 fish shell 中键入任何命令时,它会在输入几个字母后以浅灰色自动建议一个命令。
+
+![][11]
+
+一旦你得到一个建议然后按下向右光标键(LCTT 译注:原文是左,错的)就能完成它而不是输入完整的命令。
+
+![][12]
+
+你可以在键入几个字母后立即按下向上光标键检索该命令以前的历史记录。它类似于 bash shell 的 `CTRL+r` 选项。
+
+### Tab 补全
+
+如果你想查看给定命令是否还有其他可能性,那么在键入几个字母后,只需按一下 `Tab` 键即可。
+
+![][13]
+
+再次按 `Tab` 键可查看完整列表。
+
+![][14]
+
+### 语法高亮
+
+fish 会进行语法高亮显示,你可以在终端中键入任何命令时看到。无效的命令被着色为 `RED color` 。
+
+![][15]
+
+同样的,有效的命令以不同的颜色显示。此外,当你键入有效的文件路径时,fish 会在其下面加下划线,如果路径无效,则不会显示下划线。
+
+![][16]
+
+### 基于 Web 的配置器
+
+fish shell 中有一个很酷的功能,它允许我们通过网络浏览器设置颜色、提示符、功能、变量、历史和键绑定。
+
+在终端上运行以下命令以启动 Web 配置界面。只需按下 `Ctrl+c` 即可退出。
+
+```
+$ fish_config
+Web config started at 'file:///home/daygeek/.cache/fish/web_config-86ZF5P.html'. Hit enter to stop.
+qt5ct: using qt5ct plugin
+^C
+Shutting down.
+```
+
+![][17]
+
+### 手册页补全
+
+其他 shell 支持可编程的补全,但只有 fish 可以通过解析已安装的手册页自动生成它们。
+
+要使用该功能,请运行以下命令:
+
+```
+$ fish_update_completions
+Parsing man pages and writing completions to /home/daygeek/.local/share/fish/generated_completions/
+ 3466 / 3466 : zramctl.8.gz
+```
+
+### 如何将 Fish 设置为默认 shell
+
+如果你想测试 fish shell 一段时间,你可以将 fish shell 设置为默认 shell,而不用每次都切换它。
+
+要这样做,首先使用以下命令获取 Fish Shell 的位置。
+
+```
+$ whereis fish
+fish: /usr/bin/fish /etc/fish /usr/share/fish /usr/share/man/man1/fish.1.gz
+```
+
+通过运行以下命令将默认 shell 更改为 fish shell 。
+
+```
+$ chsh -s /usr/bin/fish
+```
+
+![][18]
+
+提示:只需验证 Fish Shell 是否已添加到 `/etc/shells` 目录中。如果不是,则运行以下命令以附加它。
+
+```
+$ echo /usr/bin/fish | sudo tee -a /etc/shells
+```
+
+完成测试后,如果要返回 bash shell ,请使用以下命令。
+
+暂时返回:
+
+```
+$ bash
+```
+
+永久返回:
+
+```
+$ chsh -s /bin/bash
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/linux-fish-shell-friendly-interactive-shell/
+
+作者:[Magesh Maruthamuthu][a]
+选题:[lujun9972][b]
+译者:[zero-MK](https://github.com/zero-MK)
+校对:[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://fishshell.com/
+[2]: https://download.opensuse.org/repositories/shells:/fish:/release:/
+[3]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/
+[4]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/
+[5]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/
+[6]: https://www.2daygeek.com/dnf-command-examples-manage-packages-fedora-system/
+[7]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/
+[8]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/
+[9]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[10]: https://www.2daygeek.com/wp-content/uploads/2019/02/linux-fish-shell-friendly-interactive-shell-1.png
+[11]: https://www.2daygeek.com/wp-content/uploads/2019/02/linux-fish-shell-friendly-interactive-shell-2.png
+[12]: https://www.2daygeek.com/wp-content/uploads/2019/02/linux-fish-shell-friendly-interactive-shell-5.png
+[13]: https://www.2daygeek.com/wp-content/uploads/2019/02/linux-fish-shell-friendly-interactive-shell-3.png
+[14]: https://www.2daygeek.com/wp-content/uploads/2019/02/linux-fish-shell-friendly-interactive-shell-4.png
+[15]: https://www.2daygeek.com/wp-content/uploads/2019/02/linux-fish-shell-friendly-interactive-shell-6.png
+[16]: https://www.2daygeek.com/wp-content/uploads/2019/02/linux-fish-shell-friendly-interactive-shell-8.png
+[17]: https://www.2daygeek.com/wp-content/uploads/2019/02/linux-fish-shell-friendly-interactive-shell-9.png
+[18]: https://www.2daygeek.com/wp-content/uploads/2019/02/linux-fish-shell-friendly-interactive-shell-7.png
diff --git a/published/20190213 How to use Linux Cockpit to manage system performance.md b/published/20190213 How to use Linux Cockpit to manage system performance.md
new file mode 100644
index 0000000000..2209d07df3
--- /dev/null
+++ b/published/20190213 How to use Linux Cockpit to manage system performance.md
@@ -0,0 +1,83 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10583-1.html)
+[#]: subject: (How to use Linux Cockpit to manage system performance)
+[#]: via: (https://www.networkworld.com/article/3340038/linux/sitting-in-the-linux-cockpit.html)
+[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
+
+如何使用 Linux Cockpit 来管理系统性能
+======
+
+> Linux Cockpit 是一个基于 Web 界面的应用,它提供了对系统的图形化管理。看下它能够控制哪些。
+
+![](https://images.idgesg.net/images/article/2019/02/cockpit_airline_airplane_control_pilot-by-southerlycourse-getty-100787904-large.jpg)
+
+如果你还没有尝试过相对较新的 Linux Cockpit,你可能会对它所能做的一切感到惊讶。它是一个用户友好的基于 web 的控制台,提供了一些非常简单的方法来管理 Linux 系统 —— 通过 web。你可以通过一个非常简单的 web 来监控系统资源、添加或删除帐户、监控系统使用情况、关闭系统以及执行其他一些其他任务。它的设置和使用也非常简单。
+
+虽然许多 Linux 系统管理员将大部分时间花在命令行上,但使用 PuTTY 等工具访问远程系统并不总能提供最有用的命令输出。Linux Cockpit 提供了图形和易于使用的表单,来查看性能情况并对系统进行更改。
+
+Linux Cockpit 能让你查看系统性能的许多方面并进行配置更改,但任务列表可能取决于你使用的特定 Linux。任务分类包括以下内容:
+
+* 监控系统活动(CPU、内存、磁盘 IO 和网络流量) —— **系统**
+* 查看系统日志条目 —— **日志**
+* 查看磁盘分区的容量 —— **存储**
+* 查看网络活动(发送和接收) —— **网络**
+* 查看用户帐户 —— **帐户**
+* 检查系统服务的状态 —— **服务**
+* 提取已安装应用的信息 —— **应用**
+* 查看和安装可用更新(如果以 root 身份登录)并在需要时重新启动系统 —— **软件更新**
+* 打开并使用终端窗口 —— **终端**
+
+某些 Linux Cockpit 安装还允许你运行诊断报告、转储内核、检查 SELinux(安全)设置和列出订阅。
+
+以下是 Linux Cockpit 显示的系统活动示例:
+
+![cockpit activity][1]
+
+*Linux Cockpit 显示系统活动*
+
+### 如何设置 Linux Cockpit
+
+在某些 Linux 发行版(例如,最新的 RHEL)中,Linux Cockpit 可能已经安装并可以使用。在其他情况下,你可能需要采取一些简单的步骤来安装它并使其可使用。
+
+例如,在 Ubuntu 上,这些命令应该可用:
+
+```
+$ sudo apt-get install cockpit
+$ man cockpit <== just checking
+$ sudo systemctl enable --now cockpit.socket
+$ netstat -a | grep 9090
+tcp6 0 0 [::]:9090 [::]:* LISTEN
+$ sudo systemctl enable --now cockpit.socket
+$ sudo ufw allow 9090
+```
+
+启用 Linux Cockpit 后,在浏览器中打开 `https://:9090`
+
+可以在 [Cockpit 项目][2] 中找到可以使用 Cockpit 的发行版列表以及安装说明。
+
+没有额外的配置,Linux Cockpit 将无法识别 `sudo` 权限。如果你被禁止使用 Cockpit 进行更改,你将会在你点击的按钮上看到一个红色的通用禁止标志。
+
+要使 `sudo` 权限有效,你需要确保用户位于 `/etc/group` 文件中的 `wheel`(RHEL)或 `adm` (Debian)组中,即服务器当以 root 用户身份登录 Cockpit 并且用户在登录 Cockpit 时选择“重用我的密码”时,已勾选了 “Server Administrator”。
+
+在你管理的系统位在千里之外或者没有控制台时,能使用图形界面控制也不错。虽然我喜欢在控制台上工作,但我偶然也乐于见到图形或者按钮。Linux Cockpit 为日常管理任务提供了非常有用的界面。
+
+--------------------------------------------------------------------------------
+
+via: https://www.networkworld.com/article/3340038/linux/sitting-in-the-linux-cockpit.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/02/cockpit-activity-100787994-large.jpg
+[2]: https://cockpit-project.org/running.html
+[3]: https://www.facebook.com/NetworkWorld/
+[4]: https://www.linkedin.com/company/network-world
diff --git a/published/20190216 FinalCrypt - An Open Source File Encryption Application.md b/published/20190216 FinalCrypt - An Open Source File Encryption Application.md
new file mode 100644
index 0000000000..3619ccacc1
--- /dev/null
+++ b/published/20190216 FinalCrypt - An Open Source File Encryption Application.md
@@ -0,0 +1,119 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10588-1.html)
+[#]: subject: (FinalCrypt – An Open Source File Encryption Application)
+[#]: via: (https://itsfoss.com/finalcrypt/)
+[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
+
+FinalCrypt:一个开源文件加密应用
+======
+
+我通常不会加密文件,但如果我打算整理我的重要文件或凭证,加密程序就会派上用场。
+
+你可能已经在使用像 [GnuPG][1] 这样的程序来帮助你加密/解密 Linux 上的文件。还有 [EncryptPad][2] 也可以加密你的笔记。
+
+但是,我看到了一个名为 FinalCrypt 的新的免费开源加密工具。你可以在 [GitHub 页面][3]上查看其最新的版本和源码。
+
+在本文中,我将分享使用此工具的经验。请注意,我不会将它与其他程序进行比较 —— 因此,如果你想要多个程序之间的详细比较,请在评论中告诉我们。
+
+![FinalCrypt][4]
+
+### 使用 FinalCrypt 加密文件
+
+FinalCrypt 使用[一次性密码本][5]密钥生成密码来加密文件。换句话说,它会生成一个 OTP 密钥,你将使用该密钥加密或解密你的文件。
+
+根据你指定的密钥大小,密钥是完全随机的。因此,没有密钥文件就无法解密文件。
+
+虽然 OTP 密钥用于加密/解密简单而有效,但管理或保护密钥文件对某些人来说可能是不方便的。
+
+如果要使用 FinalCrypt,可以从它的网站下载 DEB/RPM 文件。FinalCrypt 也可用于 Windows 和 macOS。
+
+- [下载 FinalCrypt](https://sites.google.com/site/ronuitholland/home/finalcrypt)
+
+下载后,只需双击该 [deb][6] 或 rpm 文件就能安装。如果需要,你还可以从源码编译。
+
+### 使用 FileCrypt
+
+该视频演示了如何使用FinalCrypt:
+
+
+
+如果你喜欢 Linux 相关的视频,请[订阅我们的 YouTube 频道][7]。
+
+安装 FinalCrypt 后,你将在已安装的应用列表中找到它。从这里启动它。
+
+启动后,你将看到(分割的)两栏,一个进行加密/解密,另一个选择 OTP 文件。
+
+![Using FinalCrypt for encrypting files in Linux][8]
+
+首先,你必须生成 OTP 密钥。下面是做法:
+
+![finalcrypt otp][9]
+
+请注意你的文件名可以是任何内容 —— 但你需要确保密钥文件的大小大于或等于要加密的文件。我觉得这很荒谬,但事实就是如此。
+
+![][10]
+
+生成文件后,选择窗口右侧的密钥,然后选择要在窗口左侧加密的文件。
+
+生成 OTP 后,你会看到高亮显示的校验和、密钥文件大小和有效状态:
+
+![][11]
+
+选择之后,你只需要点击 “Encrypt” 来加密这些文件,如果已经加密,那么点击 “Decrypt” 来解密这些文件。
+
+![][12]
+
+你还可以在命令行中使用 FinalCrypt 来自动执行加密作业。
+
+#### 如何保护你的 OTP 密钥?
+
+加密/解密你想要保护的文件很容易。但是,你应该在哪里保存你的 OTP 密钥?
+
+如果你未能将 OTP 密钥保存在安全的地方,那么它几乎没用。
+
+嗯,最好的方法之一是使用专门的 USB 盘保存你的密钥。只需要在解密文件时将它插入即可。
+
+除此之外,如果你认为足够安全,你可以将密钥保存在[云服务][13]中。
+
+有关 FinalCrypt 的更多信息,请访问它的网站。
+
+[FinalCrypt](https://sites.google.com/site/ronuitholland/home/finalcrypt)
+
+### 总结
+
+它开始时看上去有点复杂,但它实际上是 Linux 中一个简单且用户友好的加密程序。如果你想看看其他的,还有一些其他的[加密保护文件夹][14]的程序。
+
+你如何看待 FinalCrypt?你还知道其他类似可能更好的程序么?请在评论区告诉我们,我们将会查看的!
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/finalcrypt/
+
+作者:[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.gnupg.org/
+[2]: https://itsfoss.com/encryptpad-encrypted-text-editor-linux/
+[3]: https://github.com/ron-from-nl/FinalCrypt
+[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/finalcrypt.png?resize=800%2C450&ssl=1
+[5]: https://en.wikipedia.org/wiki/One-time_pad
+[6]: https://itsfoss.com/install-deb-files-ubuntu/
+[7]: https://www.youtube.com/c/itsfoss?sub_confirmation=1
+[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/finalcrypt.jpg?fit=800%2C439&ssl=1
+[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/finalcrypt-otp-key.jpg?resize=800%2C443&ssl=1
+[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/finalcrypt-otp-generate.jpg?ssl=1
+[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/finalcrypt-key.jpg?fit=800%2C420&ssl=1
+[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/finalcrypt-encrypt.jpg?ssl=1
+[13]: https://itsfoss.com/cloud-services-linux/
+[14]: https://itsfoss.com/password-protect-folder-linux/
+[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/finalcrypt.png?fit=800%2C450&ssl=1
diff --git a/published/20190217 How to Change User Password in Ubuntu -Beginner-s Tutorial.md b/published/20190217 How to Change User Password in Ubuntu -Beginner-s Tutorial.md
new file mode 100644
index 0000000000..dbaf1ca52e
--- /dev/null
+++ b/published/20190217 How to Change User Password in Ubuntu -Beginner-s Tutorial.md
@@ -0,0 +1,124 @@
+[#]: collector: (lujun9972)
+[#]: translator: (An-DJ)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10580-1.html)
+[#]: subject: (How to Change User Password in Ubuntu [Beginner’s Tutorial])
+[#]: via: (https://itsfoss.com/change-password-ubuntu)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+新手教程:Ubuntu 下如何修改用户密码
+======
+
+> 想要在 Ubuntu 下修改 root 用户的密码?那我们来学习下如何在 Ubuntu Linux 下修改任意用户的密码。我们会讨论在终端下修改和在图形界面(GUI)修改两种做法。
+
+那么,在 Ubuntu 下什么时候会需要修改密码呢?这里我给出如下两种场景。
+
+- 当你刚安装 [Ubuntu][1] 系统时,你会创建一个用户并且为之设置一个密码。这个初始密码可能安全性较弱或者太过于复杂,你会想要对它做出修改。
+- 如果你是系统管理员,你可能需要去修改在你管理的系统内其他用户的密码。
+
+当然,你可能会有其他的一些原因做这样的一件事。不过现在问题来了,我们到底如何在 Ubuntu 或其它 Linux 系统下修改单个用户的密码呢?
+
+在这个快速教程中,我将会展示给你在 Ubuntu 中如何使用命令行和图形界面(GUI)两种方式修改密码。
+
+### 在 Ubuntu 中修改用户密码 —— 通过命令行
+
+![如何在 Ubuntu Linux 下修改用户密码][2]
+
+在 Ubuntu 下修改用户密码其实非常简单。事实上,在任何 Linux 发行版上修改的方式都是一样的,因为你要使用的是叫做 `passwd` 的普通 Linux 命令来达到此目的。
+
+如果你想要修改你的当前密码,只需要简单地在终端执行此命令:
+
+```
+passwd
+```
+
+系统会要求你输入当前密码和两次新的密码。
+
+在键入密码时,你不会从屏幕上看到任何东西。这在 UNIX 和 Linux 系统中是非常正常的表现。
+
+```
+passwd
+Changing password for abhishek.
+(current) UNIX password:
+Enter new UNIX password:
+Retype new UNIX password:
+passwd: password updated successfully
+```
+
+由于这是你的管理员账户,你刚刚修改了 Ubuntu 下 sudo 密码,但你甚至没有意识到这个操作。(LCTT 译注:执行 sudo 操作时,输入的是的用户自身的密码,此处修改的就是自身的密码。而所说的“管理员账户”指的是该用户处于可以执行 `sudo` 命令的用户组中。本文此处描述易引起误会,特注明。)
+
+![在 Linux 命令行中修改用户密码][3]
+
+如果你想要修改其他用户的密码,你也可以使用 `passwd` 命令来做。但是在这种情况下,你将不得不使用`sudo`。(LCTT 译注:此处执行 `sudo`,要先输入你的 sudo 密码 —— 如上提示已经修改,再输入给其它用户设置的新密码 —— 两次。)
+
+```
+sudo passwd
+```
+
+如果你对密码已经做出了修改,不过之后忘记了,不要担心。你可以[很容易地在Ubuntu下重置密码][4].
+
+### 修改 Ubuntu 下 root 用户密码
+
+默认情况下,Ubuntu 中 root 用户是没有密码的。不必惊讶,你并不是在 Ubuntu 下一直使用 root 用户。不太懂?让我快速地给你解释下。
+
+当[安装 Ubuntu][5] 时,你会被强制创建一个用户。这个用户拥有管理员访问权限。这个管理员用户可以通过 `sudo` 命令获得 root 访问权限。但是,该用户使用的是自身的密码,而不是 root 账户的密码(因为就没有)。
+
+你可以使用 `passwd` 命令来设置或修改 root 用户的密码。然而,在大多数情况下,你并不需要它,而且你不应该去做这样的事。
+
+你将必须使用 `sudo` 命令(对于拥有管理员权限的账户)。~~如果 root 用户的密码之前没有被设置,它会要求你设置。另外,你可以使用已有的 root 密码对它进行修改。~~(LCTT 译注:此处描述有误,使用 `sudo` 或直接以 root 用户执行 `passwd` 命令时,不需要输入该被改变密码的用户的当前密码。)
+
+```
+sudo password root
+```
+
+### 在 Ubuntu 下使用图形界面(GUI)修改密码
+
+我这里使用的是 GNOME 桌面环境,Ubuntu 版本为 18.04。这些步骤对于其他的桌面环境和 Ubuntu 版本应该差别不大。
+
+打开菜单(按下 `Windows`/`Super` 键)并搜索 “Settings”(设置)。
+
+在 “Settings” 中,向下滚动一段距离打开进入 “Details”。
+
+![在 Ubuntu GNOME Settings 中进入 Details][6]
+
+在这里,点击 “Users” 获取系统下可见的所有用户。
+
+![Ubuntu 下用户设置][7]
+
+你可以选择任一你想要的用户,包括你的主要管理员账户。你需要先解锁用户并点击 “Password” 区域。
+
+![Ubuntu 下修改用户密码][8]
+
+你会被要求设置密码。如果你正在修改的是你自己的密码,你将必须也输入当前使用的密码。
+
+![Ubuntu 下修改用户密码][9]
+
+做好这些后,点击上面的 “Change” 按钮,这样就完成了。你已经成功地在 Ubuntu 下修改了用户密码。
+
+我希望这篇快速精简的小教程能够帮助你在 Ubuntu 下修改用户密码。如果你对此还有一些问题或建议,请在下方留下评论。
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/change-password-ubuntu
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[An-DJ](https://github.com/An-DJ)
+校对:[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.ubuntu.com/
+[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-password-ubuntu-linux.png?resize=800%2C450&ssl=1
+[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-user-password-linux-1.jpg?resize=800%2C253&ssl=1
+[4]: https://itsfoss.com/how-to-hack-ubuntu-password/
+[5]: https://itsfoss.com/install-ubuntu-1404-dual-boot-mode-windows-8-81-uefi/
+[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-user-password-ubuntu-gui-2.jpg?resize=800%2C484&ssl=1
+[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-user-password-ubuntu-gui-3.jpg?resize=800%2C488&ssl=1
+[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-user-password-ubuntu-gui-4.jpg?resize=800%2C555&ssl=1
+[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-user-password-ubuntu-gui-1.jpg?ssl=1
+[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/02/change-password-ubuntu-linux.png?fit=800%2C450&ssl=1
diff --git a/published/20190219 Logical - in Bash.md b/published/20190219 Logical - in Bash.md
new file mode 100644
index 0000000000..990b73311e
--- /dev/null
+++ b/published/20190219 Logical - in Bash.md
@@ -0,0 +1,194 @@
+[#]: collector: "lujun9972"
+[#]: translator: "zero-mk"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-10596-1.html"
+[#]: subject: "Logical & in Bash"
+[#]: via: "https://www.linux.com/blog/learn/2019/2/logical-ampersand-bash"
+[#]: author: "Paul Brown https://www.linux.com/users/bro66"
+
+Bash 中的逻辑和(&)
+======
+> 在 Bash 中,你可以使用 & 作为 AND(逻辑和)操作符。
+
+![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ampersand-brian-taylor-unsplash.jpg?itok=Iq6vxSNK)
+
+有人可能会认为两篇文章中的 `&` 意思差不多,但实际上并不是。虽然 [第一篇文章讨论了如何在命令末尾使用 & 来将命令转到后台运行][1],在之后剖析了流程管理,第二篇文章将 [ & 看作引用文件描述符的方法][2],这些文章让我们知道了,与 `<` 和 `>` 结合使用后,你可以将输入或输出引导到别的地方。
+
+但我们还没接触过作为 AND 操作符使用的 `&`。所以,让我们来看看。
+
+### & 是一个按位运算符
+
+如果你十分熟悉二进制数操作,你肯定听说过 AND 和 OR 。这些是按位操作,对二进制数的各个位进行操作。在 Bash 中,使用 `&` 作为 AND 运算符,使用 `|` 作为 OR 运算符:
+
+**AND**:
+
+```
+0 & 0 = 0
+0 & 1 = 0
+1 & 0 = 0
+1 & 1 = 1
+```
+
+**OR**:
+
+```
+0 | 0 = 0
+0 | 1 = 1
+1 | 0 = 1
+1 | 1 = 1
+```
+
+你可以通过对任何两个数字进行 AND 运算并使用 `echo` 输出结果:
+
+```
+$ echo $(( 2 & 3 )) # 00000010 AND 00000011 = 00000010
+2
+$ echo $(( 120 & 97 )) # 01111000 AND 01100001 = 01100000
+96
+```
+
+OR(`|`)也是如此:
+
+```
+$ echo $(( 2 | 3 )) # 00000010 OR 00000011 = 00000011
+3
+$ echo $(( 120 | 97 )) # 01111000 OR 01100001 = 01111001
+121
+```
+
+说明:
+
+1. 使用 `(( ... ))` 告诉 Bash 双括号之间的内容是某种算术或逻辑运算。`(( 2 + 2 ))`、 `(( 5 % 2 ))` (`%` 是[求模][3]运算符)和 `((( 5 % 2 ) + 1))`(等于 3)都可以工作。
+2. [像变量一样][4],使用 `$` 提取值,以便你可以使用它。
+3. 空格并没有影响:`((2+3))` 等价于 `(( 2+3 ))` 和 `(( 2 + 3 ))`。
+4. Bash 只能对整数进行操作。试试这样做: `(( 5 / 2 ))` ,你会得到 `2`;或者这样 `(( 2.5 & 7 ))` ,但会得到一个错误。然后,在按位操作中使用除了整数之外的任何东西(这就是我们现在所讨论的)通常是你不应该做的事情。
+
+**提示:** 如果你想看看十进制数字在二进制下会是什么样子,你可以使用 `bc` ,这是一个大多数 Linux 发行版都预装了的命令行计算器。比如:
+
+```
+bc <<< "obase=2; 97"
+```
+
+这个操作将会把 `97` 转换成十二进制(`obase` 中的 `o` 代表 “output” ,也即,“输出”)。
+
+```
+bc <<< "ibase=2; 11001011"
+```
+
+这个操作将会把 `11001011` 转换成十进制(`ibase` 中的 `i` 代表 “input”,也即,“输入”)。
+
+### && 是一个逻辑运算符
+
+虽然它使用与其按位表达相同的逻辑原理,但 Bash 的 `&&` 运算符只能呈现两个结果:`1`(“真值”)和`0`(“假值”)。对于 Bash 来说,任何不是 `0` 的数字都是 “真值”,任何等于 `0` 的数字都是 “假值”。什么也是 “假值”同时也不是数字呢:
+
+```
+$ echo $(( 4 && 5 )) # 两个非零数字,两个为 true = true
+1
+$ echo $(( 0 && 5 )) # 有一个为零,一个为 false = false
+0
+$ echo $(( b && 5 )) # 其中一个不是数字,一个为 false = false
+0
+```
+
+与 `&&` 类似, OR 对应着 `||` ,用法正如你想的那样。
+
+以上这些都很简单……直到它用在命令的退出状态时。
+
+### && 是命令退出状态的逻辑运算符
+
+[正如我们在之前的文章中看到的][2],当命令运行时,它会输出错误消息。更重要的是,对于今天的讨论,它在结束时也会输出一个数字。此数字称为“返回码”,如果为 0,则表示该命令在执行期间未遇到任何问题。如果是任何其他数字,即使命令完成,也意味着某些地方出错了。
+
+所以 0 意味着是好的,任何其他数字都说明有问题发生,并且,在返回码的上下文中,0 意味着“真”,其他任何数字都意味着“假”。对!这 **与你所熟知的逻辑操作完全相反** ,但是你能用这个做什么? 不同的背景,不同的规则。这种用处很快就会显现出来。
+
+让我们继续!
+
+返回码 *临时* 储存在 [特殊变量][5] `?` 中 —— 是的,我知道:这又是一个令人迷惑的选择。但不管怎样,[别忘了我们在讨论变量的文章中说过][4],那时我们说你要用 `$` 符号来读取变量中的值,在这里也一样。所以,如果你想知道一个命令是否顺利运行,你需要在命令结束后,在运行别的命令之前马上用 `$?` 来读取 `?` 变量的值。
+
+试试下面的命令:
+
+```
+$ find /etc -iname "*.service"
+find: '/etc/audisp/plugins.d': Permission denied
+/etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service
+/etc/systemd/system/dbus-org.freedesktop.ModemManager1.service
+[......]
+```
+
+[正如你在上一篇文章中看到的一样][2],普通用户权限在 `/etc` 下运行 `find` 通常将抛出错误,因为它试图读取你没有权限访问的子目录。
+
+所以,如果你在执行 `find` 后立马执行……
+
+```
+echo $?
+```
+
+……,它将打印 `1`,表明存在错误。
+
+(注意:当你在一行中运行两遍 `echo $?` ,你将得到一个 `0` 。这是因为 `$?` 将包含第一个 `echo $?` 的返回码,而这条命令按理说一定会执行成功。所以学习如何使用 `$?` 的第一课就是: **单独执行 `$?`** 或者将它保存在别的安全的地方 —— 比如保存在一个变量里,不然你会很快丢失它。)
+
+一个直接使用 `?` 变量的用法是将它并入一串链式命令列表,这样 Bash 运行这串命令时若有任何操作失败,后面命令将终止。例如,你可能熟悉构建和编译应用程序源代码的过程。你可以像这样手动一个接一个地运行它们:
+
+```
+$ configure
+.
+.
+.
+$ make
+.
+.
+.
+$ make install
+.
+.
+.
+```
+
+你也可以把这三行合并成一行……
+
+```
+$ configure; make; make install
+```
+
+…… 但你要希望上天保佑。
+
+为什么这样说呢?因为你这样做是有缺点的,比方说 `configure` 执行失败了, Bash 将仍会尝试执行 `make` 和 `sudo make install`——就算没东西可 `make` ,实际上,是没东西会安装。
+
+聪明一点的做法是:
+
+```
+$ configure && make && make install
+```
+
+这将从每个命令中获取退出码,并将其用作链式 `&&` 操作的操作数。
+
+但是,没什么好抱怨的,Bash 知道如果 `configure` 返回非零结果,整个过程都会失败。如果发生这种情况,不必运行 `make` 来检查它的退出代码,因为无论如何都会失败的。因此,它放弃运行 `make`,只是将非零结果传递给下一步操作。并且,由于 `configure && make` 传递了错误,Bash 也不必运行`make install`。这意味着,在一长串命令中,你可以使用 `&&` 连接它们,并且一旦失败,你可以节省时间,因为其他命令会立即被取消运行。
+
+你可以类似地使用 `||`,OR 逻辑操作符,这样就算只有一部分命令成功执行,Bash 也能运行接下来链接在一起的命令。
+
+鉴于所有这些(以及我们之前介绍过的内容),你现在应该更清楚地了解我们在 [这篇文章开头][1] 出现的命令行:
+
+```
+mkdir test_dir 2>/dev/null || touch backup/dir/images.txt && find . -iname "*jpg" > backup/dir/images.txt &
+```
+
+因此,假设你从具有读写权限的目录运行上述内容,它做了什么以及如何做到这一点?它如何避免不合时宜且可能导致执行中断的错误?下周,除了给你这些答案的结果,我们将讨论圆括号,不要错过了哟!
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/learn/2019/2/logical-ampersand-bash
+
+作者:[Paul Brown][a]
+选题:[lujun9972][b]
+译者:[zero-MK](https://github.com/zero-mk)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.linux.com/users/bro66
+[b]: https://github.com/lujun9972
+[1]: https://linux.cn/article-10587-1.html
+[2]: https://linux.cn/article-10591-1.html
+[3]: https://en.wikipedia.org/wiki/Modulo_operation
+[4]: https://www.linux.com/blog/learn/2018/12/bash-variables-environmental-and-otherwise
+[5]: https://www.gnu.org/software/bash/manual/html_node/Special-Parameters.html
diff --git a/published/20190220 An Automated Way To Install Essential Applications On Ubuntu.md b/published/20190220 An Automated Way To Install Essential Applications On Ubuntu.md
new file mode 100644
index 0000000000..fb7f2ffde2
--- /dev/null
+++ b/published/20190220 An Automated Way To Install Essential Applications On Ubuntu.md
@@ -0,0 +1,135 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10600-1.html)
+[#]: subject: (An Automated Way To Install Essential Applications On Ubuntu)
+[#]: via: (https://www.ostechnix.com/an-automated-way-to-install-essential-applications-on-ubuntu/)
+[#]: author: (SK https://www.ostechnix.com/author/sk/)
+
+在 Ubuntu 上自动化安装基本应用的方法
+======
+
+![](https://www.ostechnix.com/wp-content/uploads/2019/02/alfred-720x340.png)
+
+默认安装的 Ubuntu 并未预先安装所有必需的应用。你可能需要在网上花几个小时或者向其他 Linux 用户寻求帮助才能找到并安装 Ubuntu 所需的应用。如果你是新手,那么你肯定需要花更多的时间来学习如何从命令行(使用 `apt-get` 或 `dpkg`)或从 Ubuntu 软件中心搜索和安装应用。一些用户,特别是新手,可能希望轻松快速地安装他们喜欢的每个应用。如果你是其中之一,不用担心。在本指南中,我们将了解如何使用名为 “Alfred” 的简单命令行程序在 Ubuntu 上安装基本应用。
+
+Alfred 是用 Python 语言编写的自由、开源脚本。它使用 Zenity 创建了一个简单的图形界面,用户只需点击几下鼠标即可轻松选择和安装他们选择的应用。你不必花费数小时来搜索所有必要的应用程序、PPA、deb、AppImage、snap 或 flatpak。Alfred 将所有常见的应用、工具和小程序集中在一起,并自动安装所选的应用。如果你是最近从 Windows 迁移到 Ubuntu Linux 的新手,Alfred 会帮助你在新安装的 Ubuntu 系统上进行无人值守的软件安装,而无需太多用户干预。请注意,还有一个名称相似的 Mac OS 应用,但两者有不同的用途。
+
+### 在 Ubuntu 上安装 Alfred
+
+Alfred 安装很简单!只需下载脚本并启动它。就这么简单。
+
+```
+$ wget https://raw.githubusercontent.com/derkomai/alfred/master/alfred.py
+$ python3 alfred.py
+```
+
+或者,使用 `wget` 下载脚本,如上所示,只需将 `alfred.py` 移动到 `$PATH` 中:
+
+```
+$ sudo cp alfred.py /usr/local/bin/alfred
+```
+
+使其可执行:
+
+```
+$ sudo chmod +x /usr/local/bin/alfred
+```
+
+并使用命令启动它:
+
+```
+$ alfred
+```
+
+### 使用 Alfred 脚本轻松快速地在 Ubuntu 上安装基本应用程序
+
+按照上面所说启动 Alfred 脚本。这就是 Alfred 默认界面的样子。
+
+![][2]
+
+如你所见,Alfred 列出了许多最常用的应用类型,例如:
+
+ * 网络浏览器,
+ * 邮件客户端,
+ * 消息,
+ * 云存储客户端,
+ * 硬件驱动程序,
+ * 编解码器,
+ * 开发者工具,
+ * Android,
+ * 文本编辑器,
+ * Git,
+ * 内核更新工具,
+ * 音频/视频播放器,
+ * 截图工具,
+ * 录屏工具,
+ * 视频编码器,
+ * 流媒体应用,
+ * 3D 建模和动画工具,
+ * 图像查看器和编辑器,
+ * CAD 软件,
+ * PDF 工具,
+ * 游戏模拟器,
+ * 磁盘管理工具,
+ * 加密工具,
+ * 密码管理器,
+ * 存档工具,
+ * FTP 软件,
+ * 系统资源监视器,
+ * 应用启动器等。
+
+你可以选择任何一个或多个应用并立即安装它们。在这里,我将安装 “Developer bundle”,因此我选择它并单击 OK 按钮。
+
+![][3]
+
+现在,Alfred 脚本将自动你的 Ubuntu 系统上添加必要仓库、PPA 并开始安装所选的应用。
+
+![][4]
+
+安装完成后,你将看到以下消息。
+
+![][5]
+
+恭喜你!已安装选定的软件包。
+
+你可以使用以下命令[在 Ubuntu 上查看最近安装的应用][6]:
+
+```
+$ grep " install " /var/log/dpkg.log
+```
+
+你可能需要重启系统才能使用某些已安装的应用。类似地,你可以方便地安装列表中的任何程序。
+
+提示一下,还有一个由不同的开发人员编写的类似脚本,名为 `post_install.sh`。它与 Alfred 完全相同,但提供了一些不同的应用。请查看以下链接获取更多详细信息。
+
+- [Ubuntu Post Installation Script](https://www.ostechnix.com/ubuntu-post-installation-script/)
+
+这两个脚本能让懒惰的用户,特别是新手,只需点击几下鼠标就能够轻松快速地安装他们想要在 Ubuntu Linux 中使用的大多数常见应用、工具、更新、小程序,而无需依赖官方或者非官方文档的帮助。
+
+就是这些了。希望这篇文章有用。还有更多好东西。敬请期待!
+
+干杯!
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/an-automated-way-to-install-essential-applications-on-ubuntu/
+
+作者:[SK][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.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
+[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[2]: http://www.ostechnix.com/wp-content/uploads/2019/02/alfred-1.png
+[3]: http://www.ostechnix.com/wp-content/uploads/2019/02/alfred-2.png
+[4]: http://www.ostechnix.com/wp-content/uploads/2019/02/alfred-4.png
+[5]: http://www.ostechnix.com/wp-content/uploads/2019/02/alfred-5-1.png
+[6]: https://www.ostechnix.com/list-installed-packages-sorted-installation-date-linux/
diff --git a/published/20190221 Bash-Insulter - A Script That Insults An User When Typing A Wrong Command.md b/published/20190221 Bash-Insulter - A Script That Insults An User When Typing A Wrong Command.md
new file mode 100644
index 0000000000..d2844f8a05
--- /dev/null
+++ b/published/20190221 Bash-Insulter - A Script That Insults An User When Typing A Wrong Command.md
@@ -0,0 +1,188 @@
+[#]: collector: "lujun9972"
+[#]: translator: "zero-mk"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-10593-1.html"
+[#]: subject: "Bash-Insulter : A Script That Insults An User When Typing A Wrong Command"
+[#]: via: "https://www.2daygeek.com/bash-insulter-insults-the-user-when-typing-wrong-command/"
+[#]: author: "Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/"
+
+Bash-Insulter:一个在输入错误命令时嘲讽用户的脚本
+======
+
+这是一个非常有趣的脚本,每当用户在终端输入错误的命令时,它都会嘲讽用户。
+
+它让你在解决一些问题时会感到快乐。有的人在受到终端嘲讽的时候感到不愉快。但是,当我受到终端的批评时,我真的很开心。
+
+这是一个有趣的 CLI 工具,在你弄错的时候,会用随机短语嘲讽你。此外,它允许你添加自己的短语。
+
+### 如何在 Linux 上安装 Bash-Insulter?
+
+在安装 Bash-Insulter 之前,请确保你的系统上安装了 git。如果没有,请使用以下命令安装它。
+
+对于 Fedora 系统, 请使用 [DNF 命令][1] 安装 git。
+
+```
+$ sudo dnf install git
+```
+
+对于 Debian/Ubuntu 系统,请使用 [APT-GET 命令][2] 或者 [APT 命令][3] 安装 git。
+
+```
+$ sudo apt install git
+```
+
+对于基于 Arch Linux 的系统,请使用 [Pacman 命令][4] 安装 git。
+
+```
+$ sudo pacman -S git
+```
+
+对于 RHEL/CentOS 系统,请使用 [YUM 命令][5] 安装 git。
+
+```
+$ sudo yum install git
+```
+
+对于 openSUSE Leap 系统,请使用 [Zypper 命令][6] 安装 git。
+
+```
+$ sudo zypper install git
+```
+
+我们可以通过克隆开发人员的 GitHub 存储库轻松地安装它。
+
+首先克隆 Bash-insulter 存储库。
+
+```
+$ git clone https://github.com/hkbakke/bash-insulter.git bash-insulter
+```
+
+将下载的文件移动到文件夹 `/etc` 下。
+
+```
+$ sudo cp bash-insulter/src/bash.command-not-found /etc/
+```
+
+将下面的代码添加到 `/etc/bash.bashrc` 文件中。
+
+```
+$ vi /etc/bash.bashrc
+
+#Bash Insulter
+if [ -f /etc/bash.command-not-found ]; then
+ . /etc/bash.command-not-found
+fi
+```
+
+运行以下命令使更改生效。
+
+```
+$ sudo source /etc/bash.bashrc
+```
+
+你想测试一下安装是否生效吗?你可以试试在终端上输入一些错误的命令,看看它如何嘲讽你。
+
+```
+$ unam -a
+
+$ pin 2daygeek.com
+```
+
+![][8]
+
+如果你想附加你自己的短语,则导航到以下文件并更新它。你可以在 `messages` 部分中添加短语。
+
+```
+# vi /etc/bash.command-not-found
+
+print_message () {
+
+ local messages
+ local message
+
+ messages=(
+ "Boooo!"
+ "Don't you know anything?"
+ "RTFM!"
+ "Haha, n00b!"
+ "Wow! That was impressively wrong!"
+ "Pathetic"
+ "The worst one today!"
+ "n00b alert!"
+ "Your application for reduced salary has been sent!"
+ "lol"
+ "u suk"
+ "lol... plz"
+ "plz uninstall"
+ "And the Darwin Award goes to.... ${USER}!"
+ "ERROR_INCOMPETENT_USER"
+ "Incompetence is also a form of competence"
+ "Bad."
+ "Fake it till you make it!"
+ "What is this...? Amateur hour!?"
+ "Come on! You can do it!"
+ "Nice try."
+ "What if... you type an actual command the next time!"
+ "What if I told you... it is possible to type valid commands."
+ "Y u no speak computer???"
+ "This is not Windows"
+ "Perhaps you should leave the command line alone..."
+ "Please step away from the keyboard!"
+ "error code: 1D10T"
+ "ACHTUNG! ALLES TURISTEN UND NONTEKNISCHEN LOOKENPEEPERS! DAS KOMPUTERMASCHINE IST NICHT FÜR DER GEFINGERPOKEN UND MITTENGRABEN! ODERWISE IST EASY TO SCHNAPPEN DER SPRINGENWERK, BLOWENFUSEN UND POPPENCORKEN MIT SPITZENSPARKEN. IST NICHT FÜR GEWERKEN BEI DUMMKOPFEN. DER RUBBERNECKEN SIGHTSEEREN KEEPEN DAS COTTONPICKEN HÄNDER IN DAS POCKETS MUSS. ZO RELAXEN UND WATSCHEN DER BLINKENLICHTEN."
+ "Pro tip: type a valid command!"
+ "Go outside."
+ "This is not a search engine."
+ "(╯°□°)╯︵ ┻━┻"
+ "¯\_(ツ)_/¯"
+ "So, I'm just going to go ahead and run rm -rf / for you."
+ "Why are you so stupid?!"
+ "Perhaps computers is not for you..."
+ "Why are you doing this to me?!"
+ "Don't you have anything better to do?!"
+ "I am _seriously_ considering 'rm -rf /'-ing myself..."
+ "This is why you get to see your children only once a month."
+ "This is why nobody likes you."
+ "Are you even trying?!"
+ "Try using your brain the next time!"
+ "My keyboard is not a touch screen!"
+ "Commands, random gibberish, who cares!"
+ "Typing incorrect commands, eh?"
+ "Are you always this stupid or are you making a special effort today?!"
+ "Dropped on your head as a baby, eh?"
+ "Brains aren't everything. In your case they're nothing."
+ "I don't know what makes you so stupid, but it really works."
+ "You are not as bad as people say, you are much, much worse."
+ "Two wrongs don't make a right, take your parents as an example."
+ "You must have been born on a highway because that's where most accidents happen."
+ "If what you don't know can't hurt you, you're invulnerable."
+ "If ignorance is bliss, you must be the happiest person on earth."
+ "You're proof that god has a sense of humor."
+ "Keep trying, someday you'll do something intelligent!"
+ "If shit was music, you'd be an orchestra."
+ "How many times do I have to flush before you go away?"
+ )
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/bash-insulter-insults-the-user-when-typing-wrong-command/
+
+作者:[Magesh Maruthamuthu][a]
+选题:[lujun9972][b]
+译者:[zero-mk](https://github.com/zero-mk)
+校对:[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/dnf-command-examples-manage-packages-fedora-system/
+[2]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/
+[3]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/
+[4]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/
+[5]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/
+[6]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/
+[7]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[8]: https://www.2daygeek.com/wp-content/uploads/2019/02/bash-insulter-insults-the-user-when-typing-wrong-command-1.png
diff --git a/published/20190223 Regex groups and numerals.md b/published/20190223 Regex groups and numerals.md
new file mode 100644
index 0000000000..8e963d8fdb
--- /dev/null
+++ b/published/20190223 Regex groups and numerals.md
@@ -0,0 +1,59 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10594-1.html)
+[#]: subject: (Regex groups and numerals)
+[#]: via: (https://leancrew.com/all-this/2019/02/regex-groups-and-numerals/)
+[#]: author: (Dr.Drang https://leancrew.com)
+
+正则表达式的分组和数字
+======
+
+大约一周前,我在编辑一个程序时想要更改一些变量名。我之前认为这将是一个简单的正则表达式查找/替换。只是这没有我想象的那么简单。
+
+变量名为 `a10`、`v10` 和 `x10`,我想分别将它们改为 `a30`、`v30` 和 `x30`。我想到使用 BBEdit 的查找窗口并输入:
+
+![Mistaken BBEdit replacement pattern][2]
+
+我不能简单地 `30` 替换为 `10`,因为代码中有一些与变量无关的数字 `10`。我认为我很聪明,所以我不想写三个非正则表达式替换,`a10`、`v10` 和 `x10`,每个一个。但是我却没有注意到替换模式中的蓝色。如果我这样做了,我会看到 BBEdit 将我的替换模式解释为“匹配组 13,后面跟着 `0`,而不是”匹配组 1,后面跟着 `30`,后者是我想要的。由于匹配组 13 是空白的,因此所有变量名都会被替换为 `0`。
+
+你看,BBEdit 可以在搜索模式中匹配多达 99 个分组,严格来说,我们应该在替换模式中引用它们时使用两位数字。但在大多数情况下,我们可以使用 `\1` 到 `\9` 而不是 `\01` 到 `\09`,因为这没有歧义。换句话说,如果我尝试将 `a10`、`v10` 和 `x10` 更改为 `az`、`vz` 和 `xz`,那么使用 `\1z`的替换模式就可以了。因为后面的 `z` 意味着不会误解释该模式中 `\1`。
+
+因此,在撤消替换后,我将模式更改为这样:
+
+![Two-digit BBEdit replacement pattern][3]
+
+它可以正常工作。
+
+还有另一个选择:命名组。这是使用 `var` 作为模式名称:
+
+![Named BBEdit replacement pattern][4]
+
+我从来都没有使用过命名组,无论正则表达式是在文本编辑器还是在脚本中。我的总体感觉是,如果模式复杂到我必须使用变量来跟踪所有组,那么我应该停下来并将问题分解为更小的部分。
+
+顺便说一下,你可能已经听说 BBEdit 正在庆祝它诞生[25周年][5]。当一个有良好文档的应用有如此长的历史时,手册的积累能让人愉快地回到过去的日子。当我在 BBEdit 手册中查找命名组的表示法时,我遇到了这个说明:
+
+![BBEdit regex manual excerpt][6]
+
+BBEdit 目前的版本是 12.5。第一次出现于 2001 年的 V6.5。但手册希望确保长期客户(我记得是在 V4 的时候第一次购买)不会因行为变化而感到困惑,即使这些变化几乎发生在二十年前。
+
+--------------------------------------------------------------------------------
+
+via: https://leancrew.com/all-this/2019/02/regex-groups-and-numerals/
+
+作者:[Dr.Drang][a]
+选题:[lujun9972][b]
+译者:[s](https://github.com/geekpi)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://leancrew.com
+[b]: https://github.com/lujun9972
+[1]: https://leancrew.com/all-this/2019/02/automation-evolution/
+[2]: https://leancrew.com/all-this/images2019/20190223-Mistaken%20BBEdit%20replacement%20pattern.png (Mistaken BBEdit replacement pattern)
+[3]: https://leancrew.com/all-this/images2019/20190223-Two-digit%20BBEdit%20replacement%20pattern.png (Two-digit BBEdit replacement pattern)
+[4]: https://leancrew.com/all-this/images2019/20190223-Named%20BBEdit%20replacement%20pattern.png (Named BBEdit replacement pattern)
+[5]: https://merch.barebones.com/
+[6]: https://leancrew.com/all-this/images2019/20190223-BBEdit%20regex%20manual%20excerpt.png (BBEdit regex manual excerpt)
diff --git a/published/20190226 All about -Curly Braces- in Bash.md b/published/20190226 All about -Curly Braces- in Bash.md
new file mode 100644
index 0000000000..ad9023f47b
--- /dev/null
+++ b/published/20190226 All about -Curly Braces- in Bash.md
@@ -0,0 +1,221 @@
+[#]: collector: (lujun9972)
+[#]: translator: (HankChow)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10624-1.html)
+[#]: subject: (All about {Curly Braces} in Bash)
+[#]: via: (https://www.linux.com/blog/learn/2019/2/all-about-curly-braces-bash)
+[#]: author: (Paul Brown https://www.linux.com/users/bro66)
+
+浅析 Bash 中的 {花括号}
+======
+> 让我们继续我们的 Bash 基础之旅,来近距离观察一下花括号,了解一下如何和何时使用它们。
+
+![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/curly-braces-1920.jpg?itok=cScRhWrX)
+
+在前面的 Bash 基础系列文章中,我们或多或少地使用了一些还没有讲到的符号。在之前文章的很多例子中,我们都使用到了括号,但并没有重点讲解关于括号的内容。
+
+这个系列接下来的文章中,我们会研究括号们的用法:如何使用这些括号?将它们放在不同的位置会有什么不同的效果?除了圆括号、方括号、花括号以外,我们还会接触另外的将一些内容“包裹”起来的符号,例如单引号、双引号和反引号。
+
+在这周,我们先来看看花括号 `{}`。
+
+### 构造序列
+
+花括号在之前的《[点的含义][1]》这篇文章中已经出现过了,当时我们只对点号 `.` 的用法作了介绍。但在构建一个序列的过程中,同样不可以缺少花括号。
+
+我们使用
+
+```
+echo {0..10}
+```
+
+来顺序输出 0 到 10 这 11 个数。使用
+
+```
+echo {10..0}
+```
+
+可以将这 11 个数倒序输出。更进一步,可以使用
+
+```
+echo {10..0..2}
+```
+
+来跳过其中的奇数。
+
+而
+
+```
+echo {z..a..2}
+```
+
+则从倒序输出字母表,并跳过其中的第奇数个字母。
+
+以此类推。
+
+还可以将两个序列进行组合:
+
+```
+echo {a..z}{a..z}
+```
+
+这个命令会将从 aa 到 zz 的所有双字母组合依次输出。
+
+这是很有用的。在 Bash 中,定义一个数组的方法是在圆括号 `()` 中放置各个元素并使用空格隔开,就像这样:
+
+```
+month=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
+```
+
+如果需要获取数组中的元素,就要使用方括号 `[]` 并在其中填入元素的索引:
+
+```
+$ echo ${month[3]} # 数组索引从 0 开始,因此 [3] 对应第 4 个元素
+Apr
+```
+
+先不要过分关注这里用到的三种括号,我们等下会讲到。
+
+注意,像上面这样,我们可以定义这样一个数组:
+
+```
+letter_combos=({a..z}{a..z})
+```
+
+其中 `letter_combos` 变量指向的数组依次包含了从 aa 到 zz 的所有双字母组合。
+
+因此,还可以这样定义一个数组:
+
+```
+dec2bin=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})
+```
+
+在这里,`dec2bin` 变量指向的数组按照升序依次包含了所有 8 位的二进制数,也就是 00000000、00000001、00000010,……,11111111。这个数组可以作为一个十进制数到 8 位二进制数的转换器。例如将十进制数 25 转换为二进制数,可以这样执行:
+
+```
+$ echo ${dec2bin[25]}
+00011001
+```
+
+对于进制转换,确实还有更好的方法,但这不失为一个有趣的方法。
+
+### 参数展开
+
+再看回前面的
+
+```
+echo ${month[3]}
+```
+
+在这里,花括号的作用就不是构造序列了,而是用于参数展开。顾名思义,参数展开就是将花括号中的变量展开为这个变量实际的内容。
+
+我们继续使用上面的 `month` 数组来举例:
+
+```
+month=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
+```
+
+注意,Bash 中的数组索引从 0 开始,因此 3 代表第 4 个元素 `"Apr"`。因此 `echo ${month[3]}` 在经过参数展开之后,相当于 `echo "Apr"`。
+
+像上面这样将一个数组展开成它所有的元素,只是参数展开的其中一种用法。另外,还可以通过参数展开的方式读取一个字符串变量,并对其进行处理。
+
+例如对于以下这个变量:
+
+```
+a="Too longgg"
+```
+
+如果执行:
+
+```
+echo ${a%gg}
+```
+
+可以输出 “too long”,也就是去掉了最后的两个 g。
+
+在这里,
+
+ * `${...}` 告诉 shell 展开花括号里的内容
+ * `a` 就是需要操作的变量
+ * `%` 告诉 shell 需要在展开字符串之后从字符串的末尾去掉某些内容
+ * `gg` 是被去掉的内容
+
+这个特性在转换文件格式的时候会比较有用,我来举个例子:
+
+[ImageMagick][3] 是一套可以用于操作图像文件的命令行工具,它有一个 `convert` 命令。这个 `convert` 命令的作用是可以为某个格式的图像文件制作一个另一格式的副本。
+
+下面这个命令就是使用 `convert` 为 JPEG 格式图像 `image.jpg` 制作一个 PNG 格式的图像副本 `image.png`:
+
+```
+convert image.jpg image.png
+```
+
+在很多 Linux 发行版中都预装了 ImageMagick,如果没有预装,一般可以在发行版对应的软件管理器中找到。
+
+继续来看,在对变量进行展开之后,就可以批量执行相类似的操作了:
+
+```
+i=image.jpg
+convert $i ${i%jpg}png
+```
+
+这实际上是将变量 `i` 末尾的 `"jpg"` 去掉,然后加上 `"png"`,最终将整个命令拼接成 `convert image.jpg image.png`。
+
+如果你觉得并不怎么样,可以想象一下有成百上千个图像文件需要进行这个操作,而仅仅运行:
+
+```
+for i in *.jpg; do convert $i ${i%jpg}png; done
+```
+
+就瞬间完成任务了。
+
+如果需要去掉字符串开头的部分,就要将上面的 `%` 改成 `#` 了:
+
+```
+$ a="Hello World!"
+$ echo Goodbye${a#Hello}
+Goodbye World!
+```
+
+参数展开还有很多用法,但一般在写脚本的时候才会需要用到。在这个系列以后的文章中就继续提到。
+
+### 合并输出
+
+最后介绍一个花括号的用法,这个用法很简单,就是可以将多个命令的输出合并在一起。首先看下面这个命令:
+
+```
+echo "I found all these PNGs:"; find . -iname "*.png"; echo "Within this bunch of files:"; ls > PNGs.txt
+```
+
+以分号分隔开的几条命令都会执行,但只有最后的 `ls` 命令的结果输出会被重定向到 `PNGs.txt` 文件中。如果将这几条命令用花括号包裹起来,就像这样:
+
+```
+{ echo "I found all these PNGs:"; find . -iname "*.png"; echo "Within this bunch of files:"; ls; } > PNGs.txt
+```
+
+执行完毕后,可以看到 `PNGs.txt` 文件中会包含两次 `echo` 的内容、`find` 命令查找到的 PNG 文件以及最后的 `ls` 命令结果。
+
+需要注意的是,花括号与命令之间需要有空格隔开。因为这里的花括号 `{` 和 `}` 是作为 shell 中的保留字,shell 会将这两个符号之间的输出内容组合到一起。
+
+另外,各个命令之间要用分号 `;` 分隔,否则命令无法正常运行。
+
+### 下期预告
+
+在后续的文章中,我会介绍其它“包裹”类符号的用法,敬请关注。
+
+--------------------------------------------------------------------------------
+
+via: https://www.linux.com/blog/learn/2019/2/all-about-curly-braces-bash
+
+作者:[Paul Brown][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.linux.com/users/bro66
+[b]: https://github.com/lujun9972
+[1]: https://linux.cn/article-10465-1.html
+[3]: http://www.imagemagick.org/
+
diff --git a/published/20190226 How To SSH Into A Particular Directory On Linux.md b/published/20190226 How To SSH Into A Particular Directory On Linux.md
new file mode 100644
index 0000000000..2706735314
--- /dev/null
+++ b/published/20190226 How To SSH Into A Particular Directory On Linux.md
@@ -0,0 +1,111 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10618-1.html)
+[#]: subject: (How To SSH Into A Particular Directory On Linux)
+[#]: via: (https://www.ostechnix.com/how-to-ssh-into-a-particular-directory-on-linux/)
+[#]: author: (SK https://www.ostechnix.com/author/sk/)
+
+如何 SSH 登录到 Linux 上的特定目录
+======
+
+![](https://www.ostechnix.com/wp-content/uploads/2019/02/SSH-Into-A-Particular-Directory-720x340.png)
+
+你是否遇到过需要 SSH 登录到远程服务器并立即 `cd` 到一个目录来继续交互式作业?你找对地方了!这个简短的教程描述了如何直接 SSH 登录到远程 Linux 系统的特定目录。而且不仅是 SSH 登录到特定目录,你还可以在连接到 SSH 服务器后立即运行任何命令。这些没有你想的那么难。请继续阅读。
+
+### SSH 登录到远程系统的特定目录
+
+在我知道这个方法之前,我通常首先使用以下命令 SSH 登录到远程系统:
+
+```
+$ ssh user@remote-system
+```
+
+然后如下 `cd` 进入某个目录:
+
+```
+$ cd
+```
+
+然而,你不需要使用两个单独的命令。你可以用一条命令组合并简化这个任务。
+
+看看下面的例子。
+
+```
+$ ssh -t sk@192.168.225.22 'cd /home/sk/ostechnix ; bash'
+```
+
+上面的命令将通过 SSH 连接到远程系统 (192.168.225.22) 并立即进入名为 `/home/sk/ostechnix/` 的目录,并停留在提示符中。
+
+这里,`-t` 标志用于强制分配伪终端,这是一个必要的交互式 shell。
+
+以下是上面命令的输出:
+
+![](https://www.ostechnix.com/wp-content/uploads/2019/02/ssh-1.gif)
+
+你也可以使用此命令:
+
+```
+$ ssh -t sk@192.168.225.22 'cd /home/sk/ostechnix ; exec bash'
+```
+
+或者,
+
+```
+$ ssh -t sk@192.168.225.22 'cd /home/sk/ostechnix && exec bash -l'
+```
+
+这里,`-l` 标志将 bash 设置为登录 shell。
+
+在上面的例子中,我在最后一个参数中使用了 `bash`。它是我的远程系统中的默认 shell。如果你不知道远程系统上的 shell 类型,请使用以下命令:
+
+```
+$ ssh -t sk@192.168.225.22 'cd /home/sk/ostechnix && exec $SHELL'
+```
+
+就像我已经说过的,它不仅仅是连接到远程系统后 `cd` 进入目录。你也可以使用此技巧运行其他命令。例如,以下命令将进入 `/home/sk/ostechnix/`,然后执行命令 `uname -a` 。
+
+```
+$ ssh -t sk@192.168.225.22 'cd /home/sk/ostechnix && uname -a && exec $SHELL'
+```
+
+或者,你可以在远程系统上的 `.bash_profile` 文件中添加你想在 SSH 登录后执行的命令。
+
+编辑 `.bash_profile` 文件:
+
+```
+$ nano ~/.bash_profile
+```
+
+每个命令一行。在我的例子中,我添加了下面这行:
+
+```
+cd /home/sk/ostechnix >& /dev/null
+```
+
+保存并关闭文件。最后,运行以下命令更新修改。
+
+```
+$ source ~/.bash_profile
+```
+
+请注意,你应该在远程系统的 `.bash_profile` 或 `.bashrc` 文件中添加此行,而不是在本地系统中。从现在开始,无论何时登录(无论是通过 SSH 还是直接登录),`cd` 命令都将执行,你将自动进入 `/home/sk/ostechnix/` 目录。
+
+就是这些了。希望这篇文章有用。还有更多好东西。敬请关注!
+
+干杯!
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/how-to-ssh-into-a-particular-directory-on-linux/
+
+作者:[SK][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.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
diff --git a/published/20190227 How To Check Password Complexity-Strength And Score In Linux.md b/published/20190227 How To Check Password Complexity-Strength And Score In Linux.md
new file mode 100644
index 0000000000..6ab262f592
--- /dev/null
+++ b/published/20190227 How To Check Password Complexity-Strength And Score In Linux.md
@@ -0,0 +1,155 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10623-1.html)
+[#]: subject: (How To Check Password Complexity/Strength And Score In Linux?)
+[#]: via: (https://www.2daygeek.com/how-to-check-password-complexity-strength-and-score-in-linux/)
+[#]: author: (Magesh Maruthamuthu https://www.2daygeek.com/author/magesh/)
+
+如何在 Linux 中检查密码的复杂性/强度和评分?
+======
+
+我们都知道密码的重要性。最好的密码就是使用难以猜测密码。另外,我建议你为每个服务使用不同的密码,如电子邮件、ftp、ssh 等。最重要的是,我建议你们经常更改密码,以避免不必要的黑客攻击。
+
+默认情况下,RHEL 和它的衍生版使用 cracklib 模块来检查密码强度。我们将教你如何使用 cracklib 模块检查密码强度。
+
+如果你想检查你创建的密码评分,请使用 pwscore 包。
+
+如果你想创建一个好密码,最起码它应该至少有 12-15 个字符长度。它应该按以下组合创建,如字母(小写和大写)、数字和特殊字符。Linux 中有许多程序可用于检查密码复杂性,我们今天将讨论有关 cracklib 模块和 pwscore 评分。
+
+### 如何在 Linux 中安装 cracklib 模块?
+
+cracklib 模块在大多数发行版仓库中都有,因此,请使用发行版官方软件包管理器来安装它。
+
+对于 Fedora 系统,使用 [DNF 命令][1]来安装 cracklib。
+
+```
+$ sudo dnf install cracklib
+```
+
+对于 Debian/Ubuntu 系统,使用 [APT-GET 命令][2] 或 [APT 命令][3]来安装 libcrack2。
+
+```
+$ sudo apt install libcrack2
+```
+
+对于基于 Arch Linux 的系统,使用 [Pacman 命令][4]来安装 cracklib。
+
+```
+$ sudo pacman -S cracklib
+```
+
+对于 RHEL/CentOS 系统,使用 [YUM 命令][5]来安装 cracklib。
+
+```
+$ sudo yum install cracklib
+```
+
+对于 openSUSE Leap 系统,使用 [Zypper 命令][6]来安装 cracklib。
+
+```
+$ sudo zypper install cracklib
+```
+
+### 如何在 Linux 中使用 cracklib 模块检查密码复杂性?
+
+我在本文中添加了一些示例来助你更好地了解此模块。
+
+如果你提供了任何如人名或地名或常用字,那么你将看到一条消息“它存在于字典的单词中”。
+
+```
+$ echo "password" | cracklib-check
+password: it is based on a dictionary word
+```
+
+Linux 中的默认密码长度为 7 个字符。如果你提供的密码少于 7 个字符,那么你将看到一条消息“它太短了”。
+
+```
+$ echo "123" | cracklib-check
+123: it is WAY too short
+```
+
+当你提供像我们这样的好密码时,你会看到 “OK”。
+
+```
+$ echo "ME$2w!@fgty6723" | cracklib-check
+ME!@fgty6723: OK
+```
+
+### 如何在 Linux 中安装 pwscore?
+
+pwscore 包在大多数发行版仓库中都有,因此,请使用发行版官方软件包管理器来安装它。
+
+对于 Fedora 系统,使用 [DNF 命令][1]来安装 libpwquality。
+
+```
+$ sudo dnf install libpwquality
+```
+
+对于 Debian/Ubuntu 系统,使用 [APT-GET 命令][2] 或 [APT 命令][3]来安装 libpwquality。
+
+```
+$ sudo apt install libpwquality
+```
+
+对于基于 Arch Linux 的系统,使用 [Pacman 命令][4]来安装 libpwquality。
+
+```
+$ sudo pacman -S libpwquality
+```
+
+对于 RHEL/CentOS 系统,使用 [YUM 命令][5]来安装 libpwquality。
+
+```
+$ sudo yum install libpwquality
+```
+
+对于 openSUSE Leap 系统,使用 [Zypper 命令][6]来安装 libpwquality。
+
+```
+$ sudo zypper install libpwquality
+```
+
+如果你提供了任何如人名或地名或常用字,那么你将看到一条消息“它存在于字典的单词中”。
+
+```
+$ echo "password" | pwscore
+Password quality check failed:
+ The password fails the dictionary check - it is based on a dictionary word
+```
+
+Linux 中的默认密码长度为 7 个字符。如果你提供的密码少于 7 个字符,那么你将看到一条消息“密码短于 8 个字符”。
+
+```
+$ echo "123" | pwscore
+Password quality check failed:
+ The password is shorter than 8 characters
+```
+
+当你像我们这样提供了一个好的密码时,你将会看到“密码评分”。
+
+```
+$ echo "ME!@fgty6723" | pwscore
+90
+```
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/how-to-check-password-complexity-strength-and-score-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/dnf-command-examples-manage-packages-fedora-system/
+[2]: https://www.2daygeek.com/apt-get-apt-cache-command-examples-manage-packages-debian-ubuntu-systems/
+[3]: https://www.2daygeek.com/apt-command-examples-manage-packages-debian-ubuntu-systems/
+[4]: https://www.2daygeek.com/pacman-command-examples-manage-packages-arch-linux-system/
+[5]: https://www.2daygeek.com/yum-command-examples-manage-packages-rhel-centos-systems/
+[6]: https://www.2daygeek.com/zypper-command-examples-manage-packages-opensuse-system/
diff --git a/published/20190228 Connecting a VoIP phone directly to an Asterisk server.md b/published/20190228 Connecting a VoIP phone directly to an Asterisk server.md
new file mode 100644
index 0000000000..e3abdb310b
--- /dev/null
+++ b/published/20190228 Connecting a VoIP phone directly to an Asterisk server.md
@@ -0,0 +1,75 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10620-1.html)
+[#]: subject: (Connecting a VoIP phone directly to an Asterisk server)
+[#]: via: (https://feeding.cloud.geek.nz/posts/connecting-voip-phone-directly-to-asterisk-server/)
+[#]: author: (François Marier https://fmarier.org/)
+
+将 VoIP 电话直接连接到 Asterisk 服务器
+======
+
+在我的 [Asterisk][1] 服务器上正好有张以太网卡。由于我只用了其中一个,因此我决定将我的 VoIP 电话从本地网络交换机换成连接到 Asterisk 服务器。
+
+主要的好处是这台运行着未知质量的专有软件的电话,在我的一般家庭网络中不能用了。最重要的是,它不再能访问互联网,因此无需手动配置防火墙。
+
+以下是我配置的方式。
+
+### 私有网络配置
+
+在服务器上,我在 `/etc/network/interfaces` 中给第二块网卡分配了一个静态 IP:
+
+```
+auto eth1
+iface eth1 inet static
+ address 192.168.2.2
+ netmask 255.255.255.0
+```
+
+在 VoIP 电话上,我将静态 IP 设置成 `192.168.2.3`,DNS 服务器设置成 `192.168.2.2`。我接着将 SIP 注册 IP 地址设置成 `192.168.2.2`。
+
+DNS 服务器实际上是一个在 Asterisk 服务器上运行的 [unbound 守护进程][2]。我唯一需要更改的配置是监听第二张网卡,并允许 VoIP 电话进入:
+
+```
+server:
+ interface: 127.0.0.1
+ interface: 192.168.2.2
+ access-control: 0.0.0.0/0 refuse
+ access-control: 127.0.0.1/32 allow
+ access-control: 192.168.2.3/32 allow
+```
+
+最后,我在 `/etc/network/iptables.up.rules` 中打开了服务器防火墙上的正确端口:
+
+```
+-A INPUT -s 192.168.2.3/32 -p udp --dport 5060 -j ACCEPT
+-A INPUT -s 192.168.2.3/32 -p udp --dport 10000:20000 -j ACCEPT
+```
+
+### 访问管理页面
+
+现在 VoIP 电话不能在本地网络上用了,因此无法访问其管理页面。从安全的角度来看,这是一件好事,但它有点不方便。
+
+因此,在通过 ssh 连接到 Asterisk 服务器之后,我将以下内容放在我的 `~/.ssh/config` 中以便通过 `http://localhost:8081` 访问管理页面:
+
+```
+Host asterisk
+ LocalForward 8081 192.168.2.3:80
+```
+
+--------------------------------------------------------------------------------
+
+via: https://feeding.cloud.geek.nz/posts/connecting-voip-phone-directly-to-asterisk-server/
+
+作者:[François Marier][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://fmarier.org/
+[b]: https://github.com/lujun9972
+[1]: https://www.asterisk.org/
+[2]: https://feeding.cloud.geek.nz/posts/setting-up-your-own-dnssec-aware/
diff --git a/published/20190301 How to use sudo access in winSCP.md b/published/20190301 How to use sudo access in winSCP.md
new file mode 100644
index 0000000000..17f2e5ede9
--- /dev/null
+++ b/published/20190301 How to use sudo access in winSCP.md
@@ -0,0 +1,65 @@
+[#]: collector: (lujun9972)
+[#]: translator: (geekpi)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10616-1.html)
+[#]: subject: (How to use sudo access in winSCP)
+[#]: via: (https://kerneltalks.com/tools/how-to-use-sudo-access-in-winscp/)
+[#]: author: (kerneltalks https://kerneltalks.com)
+
+如何在 winSCP 中使用 sudo
+======
+
+> 用截图了解如何在 winSCP 中使用 sudo。
+
+![How to use sudo access in winSCP][1]
+
+*sudo access in winSCP*
+
+首先你需要检查你尝试使用 winSCP 连接的 sftp 服务器的二进制文件的位置。
+
+你可以使用以下命令检查 SFTP 服务器二进制文件位置:
+
+```
+[root@kerneltalks ~]# cat /etc/ssh/sshd_config |grep -i sftp-server
+Subsystem sftp /usr/libexec/openssh/sftp-server
+```
+
+你可以看到 sftp 服务器的二进制文件位于 `/usr/libexec/openssh/sftp-server`。
+
+打开 winSCP 并单击“高级”按钮打开高级设置。
+
+![winSCP advance settings][2]
+
+*winSCP 高级设置*
+
+它将打开如下高级设置窗口。在左侧面板上选择“Environment”下的 “SFTP”。你会在右侧看到选项。
+
+现在,使用命令 `sudo su -c` 在这里添加 SFTP 服务器值,如下截图所示:
+
+![SFTP server setting in winSCP][3]
+
+*winSCP 中的 SFTP 服务器设置*
+
+所以我们在设置中添加了 `sudo su -c /usr/libexec/openssh/sftp-server`。单击“Ok”并像平常一样连接到服务器。
+
+连接之后,你将可以从你以前需要 sudo 权限的目录传输文件了。
+
+完成了!你已经使用 winSCP 使用 sudo 登录服务器了。
+
+--------------------------------------------------------------------------------
+
+via: https://kerneltalks.com/tools/how-to-use-sudo-access-in-winscp/
+
+作者:[kerneltalks][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://kerneltalks.com
+[b]: https://github.com/lujun9972
+[1]: https://i2.wp.com/kerneltalks.com/wp-content/uploads/2019/03/How-to-use-sudo-access-in-winSCP.png?ssl=1
+[2]: https://i0.wp.com/kerneltalks.com/wp-content/uploads/2019/03/winscp-advanced-settings.jpg?ssl=1
+[3]: https://i1.wp.com/kerneltalks.com/wp-content/uploads/2019/03/SFTP-server-setting-in-winSCP.jpg?ssl=1
diff --git a/published/20190301 Which Raspberry Pi should you choose.md b/published/20190301 Which Raspberry Pi should you choose.md
new file mode 100644
index 0000000000..f0aefd5dea
--- /dev/null
+++ b/published/20190301 Which Raspberry Pi should you choose.md
@@ -0,0 +1,47 @@
+[#]: collector: (lujun9972)
+[#]: translator: (qhwdw)
+[#]: reviewer: (wxy)
+[#]: publisher: (wxy)
+[#]: url: (https://linux.cn/article-10611-1.html)
+[#]: subject: (Which Raspberry Pi should you choose?)
+[#]: via: (https://opensource.com/article/19/3/which-raspberry-pi-choose)
+[#]: author: (Anderson Silva https://opensource.com/users/ansilva)
+
+树莓派使用入门:你应该选择哪种树莓派?
+======
+
+> 在我们的《树莓派使用入门》系列的第一篇文章中,我们将学习选择符合你要求的树莓派型号的三个标准。
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/raspberrypi_board_vector_red.png?itok=yaqYjYqI)
+
+本文是《14 天学会[树莓派][1]使用》系列文章的第一篇。虽然本系列文章主要面向没有使用过树莓派或 Linux 或没有编程经验的人群,但是肯定有些东西还是需要有经验的读者的,我希望这些读者能够留下他们有益的评论、提示和补充。如果每个人都能贡献,这将会让本系列文章对初学者、其它有经验的读者、甚至是我更受益!
+
+言归正传,如果你想拥有一个树莓派,但不知道应该买哪个型号。或许你希望为你的教学活动或你的孩子买一个,但面对这么多的选择,却不知道应该买哪个才是正确的决定。
+
+![](https://opensource.com/sites/default/files/uploads/raspberrypi_1_boards.png)
+
+关于选择一个新的树莓派,我有三个主要的标准:
+
+ * **成本:** 不能只考虑树莓派板的成本,还需要考虑到你使用它时外围附件的成本。在美国,树莓派的成本区间是从 5 美元(树莓派 Zero)到 35 美元(树莓派 3 B 和 3 B+)。但是,如果你选择 Zero,那么你或许还需要一个 USB hub 去连接你的鼠标、键盘、无线网卡、以及某种显示适配器。不论你想使用树莓派做什么,除非你已经有了(假如不是全部)大部分的外设,那么你一定要把这些外设考虑到预算之中。此外,在一些国家,对于许多学生和老师,树莓派(即便没有任何外设)的购置成本也或许是一个不少的成本负担。
+ * **可获得性:** 根据你所在地去查找你想要的树莓派,因为在一些国家得到某些版本的树莓派可能很容易(或很困难)。在新型号刚发布后,可获得性可能是个很大的问题,在你的市场上获得最新版本的树莓派可能需要几天或几周的时间。
+ * **用途:** 所在地和成本可能并不会影响每个人,但每个购买者必须要考虑的是买树莓派做什么。因内存、CPU 核心、CPU 速度、物理尺寸、网络连接、外设扩展等不同衍生出八个不同的型号。比如,如果你需要一个拥有更大的“马力”时健壮性更好的解决方案,那么你或许应该选择树莓派 3 B+,它有更大的内存、最快的 CPU、以及更多的核心数。如果你的解决方案并不需要网络连接,并不用于 CPU 密集型的工作,并且需要将它隐藏在一个非常小的空间中,那么一个树莓派 Zero 将是你的最佳选择。
+
+[维基百科的树莓派规格表][2] 是比较八种树莓派型号的好办法。
+
+现在,你已经知道了如何找到适合你的树莓派了,下一篇文章中,我将介绍如何购买它。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/which-raspberry-pi-choose
+
+作者:[Anderson Silva][a]
+选题:[lujun9972][b]
+译者:[qhwdw](https://github.com/qhwdw)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/ansilva
+[b]: https://github.com/lujun9972
+[1]: https://www.raspberrypi.org/
+[2]: https://en.wikipedia.org/wiki/Raspberry_Pi#Specifications
diff --git a/published/20190302 How to buy a Raspberry Pi.md b/published/20190302 How to buy a Raspberry Pi.md
new file mode 100644
index 0000000000..12e6359a9c
--- /dev/null
+++ b/published/20190302 How to buy a Raspberry Pi.md
@@ -0,0 +1,52 @@
+[#]: collector: "lujun9972"
+[#]: translator: "qhwdw"
+[#]: reviewer: "wxy"
+[#]: publisher: "wxy"
+[#]: url: "https://linux.cn/article-10615-1.html"
+[#]: subject: "How to buy a Raspberry Pi"
+[#]: via: "https://opensource.com/article/19/3/how-buy-raspberry-pi"
+[#]: author: "Anderson Silva https://opensource.com/users/ansilva"
+
+树莓派使用入门:如何购买一个树莓派
+======
+
+> 在我们的《树莓派使用入门》系列文章的第二篇中,我们将介绍获取树莓派的最佳途径。
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/open_business_sign_store.jpg?itok=g4QibRqg)
+
+在本系列指南的第一篇文章中,我们提供了一个关于 [你应该购买哪个版本的树莓派][1] 的一些建议。哪个版本才是你想要的,你应该有了主意了,现在,我们来看一下如何获得它。
+
+最显而易见的方式 —— 并且也或许是最安全最简单的方式 —— 非 [树莓派的官方网站][2] 莫属了。如果你从官网主页上点击 “Buy a Raspberry Pi”,它将跳转到官方的 [在线商店][3],在那里,它可以给你提供你的国家所在地的授权销售商。如果你的国家没有在清单中,还有一个“其它”选项,它可以提供国际订购。
+
+第二,查看亚马逊或在你的国家里允许销售新的或二手商品的其它主流技术类零售商。鉴于树莓派比较便宜并且尺寸很小,一些小商家基于转售目的的进出口它,应该是非常容易的。在你下订单时,一定要关注对卖家的评价。
+
+第三,打听你的极客朋友!你可能从没想过一些人的树莓派正在“吃灰”。我已经给家人送了至少三个树莓派,当然它们并不是计划要送的礼物,只是因为他们对这个“迷你计算机”感到很好奇而已。我身边有好多个,因此我让他们拿走一个!
+
+### 不要忘了外设
+
+最后一个建设是:不要忘了外设,你将需要一些外设去配置和操作你的树莓派。至少你会用到键盘、一个 HDMI 线缆去连接显示器、一个 Micro SD 卡去安装操作系统,一个电源线、以及一个好用的鼠标。
+
+![](https://opensource.com/sites/default/files/uploads/raspberrypi_2a_pi0w-kit.jpg)
+
+如果你没有准备好这些东西,试着从朋友那儿借用,或与树莓派一起购买。你可以从授权的树莓派销售商那儿考虑订购一个起步套装 —— 它可以让你避免查找的麻烦而一次性搞定。
+
+![](https://opensource.com/sites/default/files/uploads/raspberrypi_2b_pi3b.jpg)
+
+现在,你有了树莓派,在本系列的下一篇文章中,我们将安装树莓派的操作系统并开始使用它。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/how-buy-raspberry-pi
+
+作者:[Anderson Silva][a]
+选题:[lujun9972][b]
+译者:[qhwdw](https://github.com/qhwdw)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/ansilva
+[b]: https://github.com/lujun9972
+[1]: https://linux.cn/article-10611-1.html
+[2]: https://www.raspberrypi.org/
+[3]: https://www.raspberrypi.org/products/
diff --git a/sources/talk/20120911 Doug Bolden, Dunnet (IF).md b/sources/talk/20120911 Doug Bolden, Dunnet (IF).md
new file mode 100644
index 0000000000..c856dc5be0
--- /dev/null
+++ b/sources/talk/20120911 Doug Bolden, Dunnet (IF).md
@@ -0,0 +1,52 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Doug Bolden, Dunnet (IF))
+[#]: via: (http://www.wyrmis.com/games/if/dunnet.html)
+[#]: author: (W Doug Bolden http://www.wyrmis.com)
+
+Doug Bolden, Dunnet (IF)
+======
+
+### Dunnet (IF)
+
+#### Review
+
+When I began becoming a semi-serious hobbyist of IF last year, I mostly focused on Infocom, Adventures Unlimited, other Scott Adams based games, and freeware titles. I went on to buy some from Malinche. I picked up _1893_ and _Futureboy_ and (most recnetly) _Treasures of a Slave Kingdom_. I downloaded a lot of free games from various sites. With all of my research and playing, I never once read anything that talked about a game being bundled with Emacs.
+
+Partially, this is because I am a Vim guy. But I used to use Emacs. Kind of a lot. For probably my first couple of years with Linux. About as long as I have been a diehard Vim fan, now. I just never explored, it seems.
+
+I booted up Emacs tonight, and my fonts were hosed. Still do not know exactly why. I surfed some menus to find out what was going wrong and came across a menu option called "Adventure" under Games, which I assumed (I know, I know) meant the Crowther and Woods and 1977 variety. When I clicked it tonight, thinking that it has been a few months since I chased a bird around with a cage in a mine so I can fight off giant snakes or something, I was brought up text involving ends of roads and shovels. Trees, if shaken, that kill me with a coconut. This was not the game I thought it was.
+
+I dug around (or, in purely technical terms, typed "help") and got directed to [this website][1]. Well, here was an IF I had never touched before. Brand spanking new to me. I had planned to play out some _ToaSK_ tonight, but figured that could wait. Besides, I was not quite in the mood for the jocular fun of S. John Ross's commerical IF outing. I needed something a little more direct, and this apparently it.
+
+Most of the game plays out just like the _Colossal Cave Adventure_ cousins of the oldschool (generally commercial) IF days. There are items you pick. Each does a single task (well, there could be one exception to this, I guess). You collect treasures. Winning is a combination of getting to the end and turning in the treasures. The game slightly tweaks the formula by allowing multiple drop off points for the treasures. Since there is a weight limit, though, you usually have to drop them off at a particular time to avoid getting stuck. At several times, your "item cache" is flushed, so to speak, meaning you have to go back and replay earlier portions to find out how to bring things foward. Damage to items can occur to stop you from being able to play. Replaying is pretty much unavoidable, unless you guess outcomes just right.
+
+It also inherits many problems from the era it came. There is a twisty maze. I'm not sure how big it is. I just cheated and looked up a walkthrough for the maze portion. I plan on going back and replaying up to the maze bit and mapping it out, though. I was just mentally and physically beat when I played and knew that I was going to have to call it quits on the game for the night or cheat through the maze. I'm glad I cheated, because there are some interesting things after the maze.
+
+It also has the same sort of stilted syntax and variable levels of description that the original _Adventure_ had. Looking at one item might give you "there is nothing special about that" while looking at another might give you a sentence of flavor text. Several things mentioned in the background do not exist to the parser, which some do. Part of game play is putting up with experimenting. This includes, in cases, a tendency of room descriptions to be written from the perspective of the first time you enter. I know that the Classroom found towards the end of the game does not mention the South exit, either. There are possibly other times this occured that I didn't notice.
+
+It's final issue, again coming out of the era it was designed, is random death syndrome. This is not too common, but there are a few places where things that have no initially apparent fatal outcome lead to one anyhow. In some ways, this "fatal outcome" is just the game reaching an unwinnable state. For an example of the former, type "shake trees" in the first room. For an example of the latter, send either the lamp, the key, or the shovel through the ftp without switching ftp modes first. At least with the former, there is a sense of exploration in finding out new ways to die. In IF, creative deaths is a form of victory in their own right.
+
+_Dunnet_ has a couple of differences from most IF. The former difference is minor. There are little odd descriptions throughout the game. "This room is red" or "The towel has a picture of Snoopy one it" or "There is a cliff here" that do not seem to have an immediate effect on the game. Sure, you can jump over the cliff (and die, obviously) but but it still comes off as a bright spot in the standard description matrix. Towards the end, you will be forced to bring back these details. It makes a neat little diversion of looking around and exploring things. Most of the details are cute and/or add to the surreality of the game overall.
+
+The other big difference, and the one that greatly increased both my annoyance with and my enjoyment of the game, revolves around the two-three computer oriented scenes in the game. You have to type commands into two different computers throughout. One is a VAX and the other is, um, something like a PC (I forget). In both cases, there are clues to be found by knowing your way around the interface. This is a game for computer folk, so most who play it will have a sense of how to type "ls" or "dir" depending on the OS. But not all, will. Beating the game requires a general sense of computer literacy. You must know what types are in ftp. You must know how to determine what type a file is. You must know how to read a text file on a DOS style prompt. You must know something about protocols and etiquette for logging into ftp servers. All this sort of thing. If you do, or are willing to learn (I looked up some of the stuff online) then you can get past this portion with no problem. But this can be like the maze to some people, requiring several replays to get things right.
+
+The end result is a quirky but fun game that I wish I had known about before because now I have the feeling that my computer is hiding other secrets from me. Glad to have played. Will likely play again to see how many ways I can die.
+
+--------------------------------------------------------------------------------
+
+via: http://www.wyrmis.com/games/if/dunnet.html
+
+作者:[W Doug Bolden][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: http://www.wyrmis.com
+[b]: https://github.com/lujun9972
+[1]: http://www.driver-aces.com/ronnie.html
diff --git a/sources/talk/20180314 Pi Day- 12 fun facts and ways to celebrate.md b/sources/talk/20180314 Pi Day- 12 fun facts and ways to celebrate.md
deleted file mode 100644
index 292afeb895..0000000000
--- a/sources/talk/20180314 Pi Day- 12 fun facts and ways to celebrate.md
+++ /dev/null
@@ -1,65 +0,0 @@
-Translating by wwhio
-
-Pi Day: 12 fun facts and ways to celebrate
-======
-
-![](https://enterprisersproject.com/sites/default/files/styles/620x350/public/images/cio_piday.png?itok=kTht0qV9)
-Today, tech teams around the world will celebrate a number. March 14 (written 3/14 in the United States) is known as Pi Day, a holiday that people ring in with pie eating contests, pizza parties, and math puns. If the most important number in mathematics wasn’t enough of a reason to reach for a slice of pie, March 14 also happens to be Albert Einstein’s birthday, the release anniversary of Linux kernel 1.0.0, and the day Eli Whitney patented the cotton gin.
-
-In honor of this special day, we’ve rounded up a dozen fun facts and interesting pi-related projects. Master you team’s Pi Day trivia, or borrow an idea or two for a team-building exercise. Do a project with a budding technologist. And let us know in the comments if you are doing anything unique to celebrate everyone’s favorite never-ending number.
-
-### Pi Day celebrations:
-
- * Today is the 30th anniversary of Pi Day. The first was held in 1988 in San Francisco at the Exploratorium by physicist Larry Shaw. “On [the first Pi Day][1], staff brought in fruit pies and a tea urn for the celebration. At 1:59 – the pi numbers that follow 3.14 – Shaw led a circular parade around the museum with his boombox blaring the digits of pi to the music of ‘Pomp and Circumstance.’” It wasn’t until 21 years later, March 2009, that Pi Day became an official national holiday in the U.S.
- * Although it started in San Francisco, one of the biggest Pi Day celebrations can be found in Princeton. The town holds a [number of events][2] over the course of five days, including an Einstein look-alike contest, a pie-throwing event, and a pi recitation competition. Some of the activities even offer a cash prize of $314.15 for the winner.
- * MIT Sloan School of Management (on Twitter as [@MITSloan][3]) is celebrating Pi Day with fun facts about pi – and pie. Follow along with the Twitter hashtag #PiVersusPie
-
-
-
-### Pi-related projects and activities:
-
- * If you want to keep your math skills sharpened, NASA Jet Propulsion Lab has posted a [new set of math problems][4] that illustrate how pi can be used to unlock the mysteries of space. This marks the fifth year of NASA’s Pi Day Challenge, geared toward students.
- * There's no better way to get into the spirit of Pi Day than to take on a [Raspberry Pi][5] project. Whether you are looking for a project to do with your kids or with your team, there’s no shortage of ideas out there. Since its launch in 2012, millions of the basic computer boards have been sold. In fact, it’s the [third best-selling general purpose computer][6] of all time. Here are a few Raspberry Pi projects and activities that caught our eye:
- * Grab an AIY (AI-Yourself) kit from Google. You can create a [voice-controlled digital assistant][7] or an [image-recognition device][8].
- * [Run Kubernetes][9] on a Raspberry Pi.
- * Save Princess Peach by building a [retro gaming system][10].
- * Host a [Raspberry Jam][11] with your team. The Raspberry Pi Foundation has released a [Guidebook][12] to make hosting easy. According to the website, Raspberry Jams provide, “a support network for people of all ages in digital making. All around the world, like-minded people meet up to discuss and share their latest projects, give workshops, and chat about all things Pi.”
-
-
-
-### Other fun Pi facts:
-
- * The current [world record holder][13] for reciting pi is Suresh Kumar Sharma, who in October 2015 recited 70,030 digits. It took him 17 hours and 14 minutes to do so. However, the [unofficial record][14] goes to Akira Haraguchi, who claims he can recite up to 111,700 digits.
- * And, there’s more to remember than ever before. In November 2016, R&D scientist Peter Trueb calculated 22,459,157,718,361 digits of pi – [9 trillion more digits][15] than the previous world record set in 2013. According to New Scientist, “The final file containing the 22 trillion digits of pi is nearly 9 terabytes in size. If printed out, it would fill a library of several million books containing a thousand pages each."
-
-
-
-Happy Pi Day!
-
-
---------------------------------------------------------------------------------
-
-via: https://enterprisersproject.com/article/2018/3/pi-day-12-fun-facts-and-ways-celebrate
-
-作者:[Carla Rudder][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://enterprisersproject.com/user/crudder
-[1]:https://www.exploratorium.edu/pi/pi-day-history
-[2]:https://princetontourcompany.com/activities/pi-day/
-[3]:https://twitter.com/MITSloan
-[4]:https://www.jpl.nasa.gov/news/news.php?feature=7074
-[5]:https://opensource.com/resources/raspberry-pi
-[6]:https://www.theverge.com/circuitbreaker/2017/3/17/14962170/raspberry-pi-sales-12-5-million-five-years-beats-commodore-64
-[7]:http://www.zdnet.com/article/raspberry-pi-this-google-kit-will-turn-your-pi-into-a-voice-controlled-digital-assistant/
-[8]:http://www.zdnet.com/article/google-offers-raspberry-pi-owners-this-new-ai-vision-kit-to-spot-cats-people-emotions/
-[9]:https://opensource.com/article/17/3/kubernetes-raspberry-pi
-[10]:https://opensource.com/article/18/1/retro-gaming
-[11]:https://opensource.com/article/17/5/how-run-raspberry-pi-meetup
-[12]:https://www.raspberrypi.org/blog/support-raspberry-jam-community/
-[13]:http://www.pi-world-ranking-list.com/index.php?page=lists&category=pi
-[14]:https://www.theguardian.com/science/alexs-adventures-in-numberland/2015/mar/13/pi-day-2015-memory-memorisation-world-record-japanese-akira-haraguchi
-[15]:https://www.newscientist.com/article/2124418-celebrate-pi-day-with-9-trillion-more-digits-than-ever-before/?utm_medium=Social&utm_campaign=Echobox&utm_source=Facebook&utm_term=Autofeed&cmpid=SOC%7CNSNS%7C2017-Echobox#link_time=1489480071
diff --git a/sources/talk/20180916 The Rise and Demise of RSS.md b/sources/talk/20180916 The Rise and Demise of RSS.md
index 8511d220d9..d7f5c610b6 100644
--- a/sources/talk/20180916 The Rise and Demise of RSS.md
+++ b/sources/talk/20180916 The Rise and Demise of RSS.md
@@ -1,3 +1,4 @@
+name1e5s translating
The Rise and Demise of RSS
======
There are two stories here. The first is a story about a vision of the web’s future that never quite came to fruition. The second is a story about how a collaborative effort to improve a popular standard devolved into one of the most contentious forks in the history of open-source software development.
diff --git a/sources/talk/20180930 A Short History of Chaosnet.md b/sources/talk/20180930 A Short History of Chaosnet.md
index acbb10d53d..7ee1db8a37 100644
--- a/sources/talk/20180930 A Short History of Chaosnet.md
+++ b/sources/talk/20180930 A Short History of Chaosnet.md
@@ -1,3 +1,4 @@
+acyanbird translating
A Short History of Chaosnet
======
If you fire up `dig` and run a DNS query for `google.com`, you will get a response somewhat like the following:
diff --git a/sources/talk/20181205 5 reasons to give Linux for the holidays.md b/sources/talk/20181205 5 reasons to give Linux for the holidays.md
index 2bcd6d642c..71d65741ed 100644
--- a/sources/talk/20181205 5 reasons to give Linux for the holidays.md
+++ b/sources/talk/20181205 5 reasons to give Linux for the holidays.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: (mokshal)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: subject: (5 reasons to give Linux for the holidays)
diff --git a/sources/talk/20181220 7 CI-CD tools for sysadmins.md b/sources/talk/20181220 7 CI-CD tools for sysadmins.md
deleted file mode 100644
index d645cf2561..0000000000
--- a/sources/talk/20181220 7 CI-CD tools for sysadmins.md
+++ /dev/null
@@ -1,136 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (7 CI/CD tools for sysadmins)
-[#]: via: (https://opensource.com/article/18/12/cicd-tools-sysadmins)
-[#]: author: (Dan Barker https://opensource.com/users/barkerd427)
-
-7 CI/CD tools for sysadmins
-======
-An easy guide to the top open source continuous integration, continuous delivery, and continuous deployment tools.
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cicd_continuous_delivery_deployment_gears.png?itok=kVlhiEkc)
-
-Continuous integration, continuous delivery, and continuous deployment (CI/CD) have all existed in the developer community for many years. Some organizations have involved their operations counterparts, but many haven't. For most organizations, it's imperative for their operations teams to become just as familiar with CI/CD tools and practices as their development compatriots are.
-
-CI/CD practices can equally apply to infrastructure and third-party applications and internally developed applications. Also, there are many different tools but all use similar models. And possibly most importantly, leading your company into this new practice will put you in a strong position within your company, and you'll be a beacon for others to follow.
-
-Some organizations have been using CI/CD practices on infrastructure, with tools like [Ansible][1], [Chef][2], or [Puppet][3], for several years. Other tools, like [Test Kitchen][4], allow tests to be performed on infrastructure that will eventually host applications. In fact, those tests can even deploy the application into a production-like environment and execute application-level tests with production loads in more advanced configurations. However, just getting to the point of being able to test the infrastructure individually is a huge feat. Terraform can also use Test Kitchen for even more [ephemeral][5] and [idempotent][6] infrastructure configurations than some of the original configuration-management tools. Add in Linux containers and Kubernetes, and you can now test full infrastructure and application deployments with prod-like specs and resources that come and go in hours rather than months or years. Everything is wiped out before being deployed and tested again.
-
-However, you can also focus on getting your network configurations or database data definition language (DDL) files into version control and start running small CI/CD pipelines on them. Maybe it just checks syntax or semantics or some best practices. Actually, this is how most development pipelines started. Once you get the scaffolding down, it will be easier to build on. You'll start to find all kinds of use cases for pipelines once you get started.
-
-For example, I regularly write a newsletter within my company, and I maintain it in version control using [MJML][7]. I needed to be able to host a web version, and some folks liked being able to get a PDF, so I built a [pipeline][8]. Now when I create a new newsletter, I submit it for a merge request in GitLab. This automatically creates an index.html with links to HTML and PDF versions of the newsletter. The HTML and PDF files are also created in the pipeline. None of this is published until someone comes and reviews these artifacts. Then, GitLab Pages publishes the website and I can pull down the HTML to send as a newsletter. In the future, I'll automatically send the newsletter when the merge request is merged or after a special approval step. This seems simple, but it has saved me a lot of time. This is really at the core of what these tools can do for you. They will save you time.
-
-The key is creating tools to work in the abstract so that they can apply to multiple problems with little change. I should also note that what I created required almost no code except [some light HTML templating][9], some [node to loop through the HTML files][10], and some more [node to populate the index page with all the HTML pages and PDFs][11].
-
-Some of this might look a little complex, but most of it was taken from the tutorials of the different tools I'm using. And many developers are happy to work with you on these types of things, as they might also find them useful when they're done. The links I've provided are to a newsletter we plan to start for [DevOps KC][12], and all the code for creating the site comes from the work I did on our internal newsletter.
-
-Many of the tools listed below can offer this type of interaction, but some offer a slightly different model. The emerging model in this space is that of a declarative description of a pipeline in something like YAML with each stage being ephemeral and idempotent. Many of these systems also ensure correct sequencing by creating a [directed acyclic graph][13] (DAG) over the different stages of the pipeline.
-
-These stages are often run in Linux containers and can do anything you can do in a container. Some tools, like [Spinnaker][14], focus only on the deployment component and offer some operational features that others don't normally include. [Jenkins][15] has generally kept pipelines in an XML format and most interactions occur within the GUI, but more recent implementations have used a [domain specific language][16] (DSL) using [Groovy][17]. Further, Jenkins jobs normally execute on nodes with a special Java agent installed and consist of a mix of plugins and pre-installed components.
-
-Jenkins introduced pipelines in its tool, but they were a bit challenging to use and contained several caveats. Recently, the creator of Jenkins decided to move the community toward a couple different initiatives that will hopefully breathe new life into the project—which is the one that really brought CI/CD to the masses. I think its most interesting initiative is creating a Cloud Native Jenkins that can turn a Kubernetes cluster into a Jenkins CI/CD platform.
-
-As you learn more about these tools and start bringing these practices into your company or your operations division, you'll quickly gain followers. You will increase your own productivity as well as that of others. We all have years of backlog to get to—how much would your co-workers love if you could give them enough time to start tackling that backlog? Not only that, but your customers will start to see increased application reliability, and your management will see you as a force multiplier. That certainly can't hurt during your next salary negotiation or when interviewing with all your new skills.
-
-Let's dig into the tools a bit more. We'll briefly cover each one and share links to more information.
-
-### GitLab CI
-
-GitLab is a fairly new entrant to the CI/CD space, but it's already achieved the top spot in the [Forrester Wave for Continuous Integration Tools][20]. That's a huge achievement in such a crowded and highly qualified field. What makes GitLab CI so great? It uses a YAML file to describe the entire pipeline. It also has a functionality called Auto DevOps that allows for simpler projects to have a pipeline built automatically with multiple tests built-in. This system uses [Herokuish buildpacks][21] to determine the language and how to build the application. Some languages can also manage databases, which is a real game-changer for building new applications and getting them deployed to production from the beginning of the development process. The system has native integrations into Kubernetes and will deploy your application automatically into a Kubernetes cluster using one of several different deployment methodologies, like percentage-based rollouts and blue-green deployments.
-
-In addition to its CI functionality, GitLab offers many complementary features like operations and monitoring with Prometheus deployed automatically with your application; portfolio and project management using GitLab Issues, Epics, and Milestones; security checks built into the pipeline with the results provided as an aggregate across multiple projects; and the ability to edit code right in GitLab using the WebIDE, which can even provide a preview or execute part of a pipeline for faster feedback.
-
-### GoCD
-
-GoCD comes from the great minds at Thoughtworks, which is testimony enough for its capabilities and efficiency. To me, GoCD's main differentiator from the rest of the pack is its [Value Stream Map][22] (VSM) feature. In fact, pipelines can be chained together with one pipeline providing the "material" for the next pipeline. This allows for increased independence for different teams with different responsibilities in the deployment process. This may be a useful feature when introducing this type of system in older organizations that intend to keep these teams separate—but having everyone using the same tool will make it easier later to find bottlenecks in the VSM and reorganize the teams or work to increase efficiencies.
-
-It's incredibly valuable to have a VSM for each product in a company; that GoCD allows this to be [described in JSON or YAML][23] in version control and presented visually with all the data around wait times makes this tool even more valuable to an organization trying to understand itself better. Start by installing GoCD and mapping out your process with only manual approval gates. Then have each team use the manual approvals so you can start collecting data on where bottlenecks might exist.
-
-### Travis CI
-
-Travis CI was my first experience with a Software as a Service (SaaS) CI system, and it's pretty awesome. The pipelines are stored as YAML with your source code, and it integrates seamlessly with tools like GitHub. I don't remember the last time a pipeline failed because of Travis CI or the integration—Travis CI has a very high uptime. Not only can it be used as SaaS, but it also has a version that can be hosted. I haven't run that version—there were a lot of components, and it looked a bit daunting to install all of it. I'm guessing it would be much easier to deploy it all to Kubernetes with [Helm charts provided by Travis CI][26]. Those charts don't deploy everything yet, but I'm sure it will grow even more in the future. There is also an enterprise version if you don't want to deal with the hassle.
-
-However, if you're developing open source code, you can use the SaaS version of Travis CI for free. That is an awesome service provided by an awesome team! This alleviates a lot of overhead and allows you to use a fairly common platform for developing open source code without having to run anything.
-
-### Jenkins
-
-Jenkins is the original, the venerable, de facto standard in CI/CD. If you haven't already, you need to read "[Jenkins: Shifting Gears][27]" from Kohsuke, the creator of Jenkins and CTO of CloudBees. It sums up all of my feelings about Jenkins and the community from the last decade. What he describes is something that has been needed for several years, and I'm happy CloudBees is taking the lead on this transformation. Jenkins will be a bit overwhelming to most non-developers and has long been a burden on its administrators. However, these are items they're aiming to fix.
-
-[Jenkins Configuration as Code][28] (JCasC) should help fix the complex configuration issues that have plagued admins for years. This will allow for a zero-touch configuration of Jenkins masters through a YAML file, similar to other CI/CD systems. [Jenkins Evergreen][29] aims to make this process even easier by providing predefined Jenkins configurations based on different use cases. These distributions should be easier to maintain and upgrade than the normal Jenkins distribution.
-
-Jenkins 2 introduced native pipeline functionality with two types of pipelines, which [I discuss][30] in a LISA17 presentation. Neither is as easy to navigate as YAML when you're doing something simple, but they're quite nice for doing more complex tasks.
-
-[Jenkins X][31] is the full transformation of Jenkins and will likely be the implementation of Cloud Native Jenkins (or at least the thing most users see when using Cloud Native Jenkins). It will take JCasC and Evergreen and use them at their best natively on Kubernetes. These are exciting times for Jenkins, and I look forward to its innovation and continued leadership in this space.
-
-### Concourse CI
-
-I was first introduced to Concourse through folks at Pivotal Labs when it was an early beta version—there weren't many tools like it at the time. The system is made of microservices, and each job runs within a container. One of its most useful features that other tools don't have is the ability to run a job from your local system with your local changes. This means you can develop locally (assuming you have a connection to the Concourse server) and run your builds just as they'll run in the real build pipeline. Also, you can rerun failed builds from your local system and inject specific changes to test your fixes.
-
-Concourse also has a simple extension system that relies on the fundamental concept of resources. Basically, each new feature you want to provide to your pipeline can be implemented in a Docker image and included as a new resource type in your configuration. This keeps all functionality encapsulated in a single, immutable artifact that can be upgraded and modified independently, and breaking changes don't necessarily have to break all your builds at the same time.
-
-### Spinnaker
-
-Spinnaker comes from Netflix and is more focused on continuous deployment than continuous integration. It can integrate with other tools, including Travis and Jenkins, to kick off test and deployment pipelines. It also has integrations with monitoring tools like Prometheus and Datadog to make decisions about deployments based on metrics provided by these systems. For example, the canary deployment uses a judge concept and the metrics being collected to determine if the latest canary deployment has caused any degradation in pertinent metrics and should be rolled back or if deployment can continue.
-
-A couple of additional, unique features related to deployments cover an area that is often overlooked when discussing continuous deployment, and might even seem antithetical, but is critical to success: Spinnaker helps make continuous deployment a little less continuous. It will prevent a stage from running during certain times to prevent a deployment from occurring during a critical time in the application lifecycle. It can also enforce manual approvals to ensure the release occurs when the business will benefit the most from the change. In fact, the whole point of continuous integration and continuous deployment is to be ready to deploy changes as quickly as the business needs to change.
-
-### Screwdriver
-
-Screwdriver is an impressively simple piece of engineering. It uses a microservices approach and relies on tools like Nomad, Kubernetes, and Docker to act as its execution engine. There is a pretty good [deployment tutorial][34] for deploying to AWS and Kubernetes, but it could be improved once the in-progress [Helm chart][35] is completed.
-
-Screwdriver also uses YAML for its pipeline descriptions and includes a lot of sensible defaults, so there's less boilerplate configuration for each pipeline. The configuration describes an advanced workflow that can have complex dependencies among jobs. For example, a job can be guaranteed to run after or before another job. Jobs can run in parallel and be joined afterward. You can also use logical operators to run a job, for example, if any of its dependencies are successful or only if all are successful. Even better is that you can specify certain jobs to be triggered from a pull request. Also, dependent jobs won't run when this occurs, which allows easy segregation of your pipeline for when an artifact should go to production and when it still needs to be reviewed.
-
-This is only a brief description of these CI/CD tools—each has even more cool features and differentiators you can investigate. They are all open source and free to use, so go deploy them and see which one fits your needs best.
-
-### What to read next
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/12/cicd-tools-sysadmins
-
-作者:[Dan Barker][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/barkerd427
-[b]: https://github.com/lujun9972
-[1]: https://www.ansible.com/
-[2]: https://www.chef.io/
-[3]: https://puppet.com/
-[4]: https://github.com/test-kitchen/test-kitchen
-[5]: https://www.merriam-webster.com/dictionary/ephemeral
-[6]: https://en.wikipedia.org/wiki/Idempotence
-[7]: https://mjml.io/
-[8]: https://gitlab.com/devopskc/newsletter/blob/master/.gitlab-ci.yml
-[9]: https://gitlab.com/devopskc/newsletter/blob/master/index/index.html
-[10]: https://gitlab.com/devopskc/newsletter/blob/master/html-to-pdf.js
-[11]: https://gitlab.com/devopskc/newsletter/blob/master/populate-index.js
-[12]: https://devopskc.com/
-[13]: https://en.wikipedia.org/wiki/Directed_acyclic_graph
-[14]: https://www.spinnaker.io/
-[15]: https://jenkins.io/
-[16]: https://martinfowler.com/books/dsl.html
-[17]: http://groovy-lang.org/
-[18]: https://about.gitlab.com/product/continuous-integration/
-[19]: https://gitlab.com/gitlab-org/gitlab-ce/
-[20]: https://about.gitlab.com/2017/09/27/gitlab-leader-continuous-integration-forrester-wave/
-[21]: https://github.com/gliderlabs/herokuish
-[22]: https://www.gocd.org/getting-started/part-3/#value_stream_map
-[23]: https://docs.gocd.org/current/advanced_usage/pipelines_as_code.html
-[24]: https://docs.travis-ci.com/
-[25]: https://github.com/travis-ci/travis-ci
-[26]: https://github.com/travis-ci/kubernetes-config
-[27]: https://jenkins.io/blog/2018/08/31/shifting-gears/
-[28]: https://jenkins.io/projects/jcasc/
-[29]: https://github.com/jenkinsci/jep/blob/master/jep/300/README.adoc
-[30]: https://danbarker.codes/talk/lisa17-becoming-plumber-building-deployment-pipelines/
-[31]: https://jenkins-x.io/
-[32]: https://concourse-ci.org/
-[33]: https://github.com/concourse/concourse
-[34]: https://docs.screwdriver.cd/cluster-management/kubernetes
-[35]: https://github.com/screwdriver-cd/screwdriver-chart
diff --git a/sources/talk/20190121 Booting Linux faster.md b/sources/talk/20190121 Booting Linux faster.md
deleted file mode 100644
index ef79351e0e..0000000000
--- a/sources/talk/20190121 Booting Linux faster.md
+++ /dev/null
@@ -1,54 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Booting Linux faster)
-[#]: via: (https://opensource.com/article/19/1/booting-linux-faster)
-[#]: author: (Stewart Smith https://opensource.com/users/stewart-ibm)
-
-Booting Linux faster
-======
-Doing Linux kernel and firmware development leads to lots of reboots and lots of wasted time.
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tux_linux_penguin_code_binary.jpg?itok=TxGxW0KY)
-Of all the computers I've ever owned or used, the one that booted the quickest was from the 1980s; by the time your hand moved from the power switch to the keyboard, the BASIC interpreter was ready for your commands. Modern computers take anywhere from 15 seconds for a laptop to minutes for a small home server to boot. Why is there such a difference in boot times?
-
-A microcomputer from the 1980s that booted straight to a BASIC prompt had a very simple CPU that started fetching and executing instructions from a memory address immediately upon getting power. Since these systems had BASIC in ROM, there was no loading time—you got to the BASIC prompt really quickly. More complex systems of that same era, such as the IBM PC or Macintosh, took a significant time to boot (~30 seconds), although this was mostly due to having to read the operating system (OS) off a floppy disk. Only a handful of seconds were spent in firmware before being able to load an OS.
-
-Modern servers typically spend minutes, rather than seconds, in firmware before getting to the point of booting an OS from disk. This is largely due to modern systems' increased complexity. No longer can a CPU just come up and start executing instructions at full speed; we've become accustomed to CPU frequency scaling, idle states that save a lot of power, and multiple CPU cores. In fact, inside modern CPUs are a surprising number of simpler CPUs that help start the main CPU cores and provide runtime services such as throttling the frequency when it gets too hot. On most CPU architectures, the code running on these cores inside your CPU is provided as opaque binary blobs.
-
-On OpenPOWER systems, every instruction executed on every core inside the CPU is open source software. On machines with [OpenBMC][1] (such as IBM's AC922 system and Raptor's TALOS II and Blackbird systems), this extends to the code running on the Baseboard Management Controller as well. This means we can get a tremendous amount of insight into what takes so long from the time you plug in a power cable to the time a familiar login prompt is displayed.
-
-If you're part of a team that works on the Linux kernel, you probably boot a lot of kernels. If you're part of a team that works on firmware, you're probably going to boot a lot of different firmware images, followed by an OS to ensure your firmware still works. If we can reduce the hardware's boot time, these teams can become more productive, and end users may be grateful when they're setting up systems or rebooting to install firmware or OS updates.
-
-Over the years, many improvements have been made to Linux distributions' boot time. Modern init systems deal well with doing things concurrently and on-demand. On a modern system, once the kernel starts executing, it can take very few seconds to get to a login prompt. This handful of seconds are not the place to optimize boot time; we have to go earlier: before we get to the OS.
-
-On OpenPOWER systems, the firmware loads an OS by booting a Linux kernel stored in the firmware flash chip that runs a userspace program called [Petitboot][2] to find the disk that holds the OS the user wants to boot and [kexec][3][()][3] to it. This code reuse leverages the efforts that have gone into making Linux boot quicker. Even so, we found places in our kernel config and userspace where we could improve and easily shave seconds off boot time. With these optimizations, booting the Petitboot environment is a single-digit percentage of boot time, so we had to find more improvements elsewhere.
-
-Before the Petitboot environment starts, there's a prior bit of firmware called [Skiboot][4], and before that there's [Hostboot][5]. Prior to Hostboot is the [Self-Boot Engine][6], a separate core on the die that gets a single CPU core up and executing instructions out of Level 3 cache. These components are where we can make the most headway in reducing boot time, as they take up the overwhelming majority of it. Perhaps some of these components aren't optimized enough or doing as much in parallel as they could be?
-
-Another avenue of attack is reboot time rather than boot time. On a reboot, do we really need to reinitialize all the hardware?
-
-Like any modern system, the solutions to improving boot (and reboot) time have been a mixture of doing more in parallel, dealing with legacy, and (arguably) cheating.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/1/booting-linux-faster
-
-作者:[Stewart Smith][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/stewart-ibm
-[b]: https://github.com/lujun9972
-[1]: https://en.wikipedia.org/wiki/OpenBMC
-[2]: https://github.com/open-power/petitboot
-[3]: https://en.wikipedia.org/wiki/Kexec
-[4]: https://github.com/open-power/skiboot
-[5]: https://github.com/open-power/hostboot
-[6]: https://github.com/open-power/sbe
-[7]: https://linux.conf.au/schedule/presentation/105/
-[8]: https://linux.conf.au/
diff --git a/sources/talk/20190123 Book Review- Fundamentals of Linux.md b/sources/talk/20190123 Book Review- Fundamentals of Linux.md
deleted file mode 100644
index 5e0cffd9bc..0000000000
--- a/sources/talk/20190123 Book Review- Fundamentals of Linux.md
+++ /dev/null
@@ -1,74 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Book Review: Fundamentals of Linux)
-[#]: via: (https://itsfoss.com/fundamentals-of-linux-book-review)
-[#]: author: (John Paul https://itsfoss.com/author/john/)
-
-Book Review: Fundamentals of Linux
-======
-
-There are many great books that cover the basics of what Linux is and how it works. Today, I will be taking a look at one such book. Today, the subject of our discussion is [Fundamentals of Linux][1] by Oliver Pelz and is published by [PacktPub][2].
-
-[Oliver Pelz][3] has over ten years of experience as a software developer and a system administrator. He holds a degree in bioinformatics.
-
-### What is the book ‘Fundamentals of Linux’ about?
-
-![Fundamental of Linux books][4]
-
-As can be guessed from the title, the goal of Fundamentals of Linux is to give the reader a strong foundation from which to learn about the Linux command line. The book is a little over two hundred pages long, so it only focuses on teaching the everyday tasks and problems that users commonly encounter. The book is designed for readers who want to become Linux administrators.
-
-The first chapter starts out by giving an overview of virtualization. From there the author instructs how to create a virtual instance of [CentOS][5] in [VirtualBox][6], how to clone it, and how to use snapshots. You will also learn how to connect to the virtual machines via SSH.
-
-The second chapter covers the basics of the Linux command line. This includes shell globbing, shell expansion, how to work with file names that contain spaces or special characters. It also explains how to interpret a command’s manual page, as well as, how to use `sed`, `awk`, and to navigate the Linux file system.
-
-The third chapter takes a more in-depth look at the Linux file system. You will learn how files are linked in Linux and how to search for them. You will also be given an overview of users, groups and file permissions. Since the chapter focuses on interacting with files, it tells how to read text files from the command line, as well as, an overview of how to use the VIM editor.
-
-Chapter four focuses on using the command line. It covers important commands, such as `cat`, `sort`, `awk`. `tee`, `tar`, `rsync`, `nmap`, `htop` and more. You will learn what processes are and how they communicate with each other. This chapter also includes an introduction to Bash shell scripting.
-
-The fifth and final chapter covers networking on Linux and other advanced command line concepts. The author discusses how Linux handles networking and gives examples using multiple virtual machines. He also covers how to install new programs and how to set up a firewall.
-
-### Thoughts on the book
-
-Fundamentals of Linux might seem short at five chapters and a little over two hundred pages. However, quite a bit of information is covered. You are given everything that you need to get going on the command line.
-
-The book’s sole focus on the command line is one thing to keep in mind. You won’t get any information on how to use a graphical user interface. That is partially because Linux has so many different desktop environments and so many similar system applications that it would be hard to write a book that could cover all of the variables. It is also partially because the book is aimed at potential Linux administrators.
-
-I was kinda surprised to see that the author used [CentOS][7] to teach Linux. I would have expected him to use a more common Linux distro, like Ubuntu, Debian, or Fedora. However, because it is a distro designed for servers very little changes over time, so it is a very stable basis for a course on Linux basics.
-
-I’ve used Linux for over half a decade. I spent most of that time using desktop Linux. I dove into the terminal when I needed to, but didn’t spend lots of time there. I have performed many of the actions covered in this book using a mouse. Now, I know how to do the same things via the terminal. It won’t change the way I do my tasks, but it will help me understand what goes on behind the curtain.
-
-If you have either just started using Linux or are planning to do so in the future, I would not recommend this book. It might be a little overwhelming. If you have already spent some time with Linux or can quickly grasp the technical language, this book may very well be for you.
-
-If you think this book is apt for your learning needs, you can get the book from the link below:
-
-We will be trying to review more Linux books in coming months so stay tuned with us.
-
-What is your favorite introductory book on Linux? Let us know in the comments below.
-
-If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][8].
-
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/fundamentals-of-linux-book-review
-
-作者:[John Paul][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://itsfoss.com/author/john/
-[b]: https://github.com/lujun9972
-[1]: https://www.packtpub.com/networking-and-servers/fundamentals-linux
-[2]: https://www.packtpub.com/
-[3]: http://www.oliverpelz.de/index.html
-[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/fundamentals-of-linux-book-review.jpeg?resize=800%2C450&ssl=1
-[5]: https://centos.org/
-[6]: https://www.virtualbox.org/
-[7]: https://www.centos.org/
-[8]: http://reddit.com/r/linuxusersgroup
diff --git a/sources/talk/20190211 Introducing kids to computational thinking with Python.md b/sources/talk/20190211 Introducing kids to computational thinking with Python.md
index 542b2291e7..c877d3c212 100644
--- a/sources/talk/20190211 Introducing kids to computational thinking with Python.md
+++ b/sources/talk/20190211 Introducing kids to computational thinking with Python.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: (WangYueScream )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/talk/20190214 Top 5 podcasts for Linux news and tips.md b/sources/talk/20190214 Top 5 podcasts for Linux news and tips.md
new file mode 100644
index 0000000000..fb827bb39b
--- /dev/null
+++ b/sources/talk/20190214 Top 5 podcasts for Linux news and tips.md
@@ -0,0 +1,80 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Top 5 podcasts for Linux news and tips)
+[#]: via: (https://opensource.com/article/19/2/top-linux-podcasts)
+[#]: author: (Stephen Bancroft https://opensource.com/users/stevereaver)
+
+Top 5 podcasts for Linux news and tips
+======
+A tried and tested podcast listener, shares his favorite Linux podcasts over the years, plus a couple of bonus picks.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux-penguin-penguins.png?itok=5hlVDue7)
+
+Like many Linux enthusiasts, I listen to a lot of podcasts. I find my daily commute is the best time to get some time to myself and catch up on the latest tech news. Over the years, I have subscribed and unsubscribed to more show feeds than I care to think about and have distilled them down to the best of the best.
+
+Here are my top five Linux podcasts I think you should be listening to in 2019, plus a couple of bonus picks.
+
+ 5. [**Late Night Linux**][1]—This podcast, hosted by Joe, [Félim][2], [Graham][3], and [Will][4] from the UK, is rough, ready, and pulls no punches. [Joe Ressington][5] is always ready to tell it how it is, and Félim is always quick with his opinions. It's presented in a casual conversation format—but not one to have one with the kids around, especially with subjects they are all passionate about!
+
+
+ 4. [**Ask Noah Show**][6]—This show was forked from the Linux Action Show after it ended. Hosted by [Noah Chelliah][7], it's presented in a radio talkback style and takes live calls from listeners—it's syndicated from a local radio station in Grand Forks, North Dakota. The podcast isn't purely about Linux, but Noah takes on technical challenges and solves them with Linux and answers listeners' questions about how to achieve good technical solutions using Linux.
+
+
+ 3. [**The Ubuntu Podcast**][8]—If you want the latest about Ubuntu, you can't go past this show. In another podcast with a UK twist, hosts [Alan Pope][9] (Popey), [Mark Johnson][10], and [Martin Wimpress][11] (Wimpy) present a funny and insightful view of the open source community with news directly from Ubuntu.
+
+
+ 2. [**Linux Action News**][12]—The title says it all: it's a news show for Linux. This show was spawned from the popular Linux Action Show and is broadcast by the [Jupiter Broadcasting Network][13], which has many other tech-related podcasts. Hosts Chris Fisher and [Joe Ressington][5] present the show in a more formal "evening news" style, which runs around 30 minutes long. If you want to get a quick weekly update on Linux and Linux-related news, this is the show for you.
+
+
+ 1. [**Linux Unplugged**][14]—Finally, coming in at the number one spot is the granddaddy of them all, Linux Unplugged. This show gets to the core of what being in the Linux community is all about. Presented as a casual panel-style discussion by [Chris Fisher][15] and [Wes Payne][16], the podcast includes an interactive voice chatroom where listeners can connect and be heard live on the show as it broadcasts.
+
+
+
+Well, there you have it, my current shortlist of Linux podcasts. It's likely to change in the near future, but for now, I am enjoying every minute these guys put together.
+
+### Bonus podcasts
+
+Here are two bonus podcasts you might want to check out.
+
+**[Choose Linux][17]** is a brand-new podcast that is tantalizing because of its hosts: Joe Ressington of Linux Action News, who is a long-time Linux veteran, and [Jason Evangelho][18], a Forbes writer who recently shot to fame in the open source community with his articles showcasing his introduction to Linux and open source. Living vicariously through Jason's introduction to Linux has been and will continue to be fun.
+
+[**Command Line Heroes**][19] is a podcast produced by Red Hat. It has a very high production standard and has a slightly different format to the shows I have previously mentioned, anchored by a single presenter, developer, and [CodeNewbie][20] founder [Saron Yitbarek][21], who presents the latest innovations in open source. Now in its second season and released fortnightly, I highly recommend that you start from the first episode of this podcast. It starts with a great intro to the O/S wars of the '90s and sets the foundations for the start of Linux.
+
+Do you have a favorite Linux podcast that isn't on this list? Please share it in the comments.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/top-linux-podcasts
+
+作者:[Stephen Bancroft][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/stevereaver
+[b]: https://github.com/lujun9972
+[1]: https://latenightlinux.com/
+[2]: https://twitter.com/felimwhiteley
+[3]: https://twitter.com/degville
+[4]: https://twitter.com/8none1
+[5]: https://twitter.com/JoeRessington
+[6]: http://www.asknoahshow.com/
+[7]: https://twitter.com/kernellinux?lang=en
+[8]: http://ubuntupodcast.org/
+[9]: https://twitter.com/popey
+[10]: https://twitter.com/marxjohnson
+[11]: https://twitter.com/m_wimpress
+[12]: https://linuxactionnews.com/
+[13]: https://www.jupiterbroadcasting.com/
+[14]: https://linuxunplugged.com/
+[15]: https://twitter.com/ChrisLAS
+[16]: https://twitter.com/wespayne
+[17]: https://chooselinux.show
+[18]: https://twitter.com/killyourfm
+[19]: https://www.redhat.com/en/command-line-heroes
+[20]: https://www.codenewbie.org/
+[21]: https://twitter.com/saronyitbarek
diff --git a/sources/talk/20190219 How Linux testing has changed and what matters today.md b/sources/talk/20190219 How Linux testing has changed and what matters today.md
new file mode 100644
index 0000000000..ad26d6dbec
--- /dev/null
+++ b/sources/talk/20190219 How Linux testing has changed and what matters today.md
@@ -0,0 +1,99 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How Linux testing has changed and what matters today)
+[#]: via: (https://opensource.com/article/19/2/phoronix-michael-larabel)
+[#]: author: (Don Watkins https://opensource.com/users/don-watkins)
+
+How Linux testing has changed and what matters today
+======
+Michael Larabel, the founder of Phoronix, shares his insights on the evolution of Linux and open hardware.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/mistake_bug_fix_find_error.png?itok=PZaz3dga)
+
+If you've ever wondered how your Linux computer stacks up against other Linux, Windows, and MacOS machines or searched for reviews of Linux-compatible hardware, you're probably familiar with [Phoronix][1]. Along with its website, which attracts more than 250 million visitors a year to its Linux reviews and news, the company also offers the [Phoronix Test Suite][2], an open source hardware benchmarking tool, and [OpenBenchmarking.org][3], where test result data is stored.
+
+According to [Michael Larabel][4], who started Phoronix in 2004, the site "is frequently cited as being the leading source for those interested in computer hardware and Linux. It offers insights regarding the development of the Linux kernel, product reviews, interviews, and news regarding free and open source software."
+
+I recently had the opportunity to interview Michael about Phoronix and his work.
+
+The questions and answers have been edited for length and clarity.
+
+**Don Watkins:** What inspired you to start Phoronix?
+
+**Michael Larabel:** When I started [Phoronix.com][5] in June 2004, it was still challenging to get a mouse or other USB peripherals working on the popular distributions of the time, like Mandrake, Yoper, MEPIS, and others. So, I set out to work on reviewing different hardware components and their compatibility with Linux. Over time, that shifted more from "does the basic device work?" to how well they perform and what features are supported or unsupported under Linux.
+
+It's been interesting to see the evolution and the importance of Linux on hardware rise. Linux was very common to LAMP/web servers, but Linux has also become synonymous with high-performance computing (HPC), Android smartphones, cloud software, autonomous vehicles, edge computing, digital signage, and related areas. While Linux hasn't quite dominated the desktop, it's doing great practically everywhere else.
+
+I also developed the Phoronix Test Suite, with its initial 1.0 public release in 2008, to increase the viability of testing on Linux, engage with more hardware and software vendors on best practices for testing, and just get more test cases running on Linux. At the time, there weren't any really shiny benchmarks on Linux like there were on Windows.
+
+**DW:** Who are your website's readers?
+
+**ML:** Phoronix's audience is as diverse as the content. Initially, it was quite desktop/gamer/enthusiast oriented, but as Linux's dominance has grown in HPC, cloud, embedded, etc., my testing has expanded in those areas and thus so has the readership. Readers tend to be interested in open source/Linux ecosystem advancements, performance, and a slight bent towards graphics processor and hardware driver interests.
+
+**DW:** How important is testing in the Linux world and how has it changed from when you started?
+
+**ML:** Testing has changed radically since 2004. Back then, many open source projects weren't carrying out any continuous integration (CI) or testing for regressions—both functional issues and performance problems. The hardware vendors supporting Linux were mostly trying to get things working and maintained while being less concerned about performance or scratching away at catching up to Mac, Solaris, and Windows. With time, we've seen the desktop reach close parity with (or exceed, depending upon your views) alternative operating systems. Most PC hardware now works out-of-the-box on Linux, most open source projects engage in some form of CI or testing, and more time and resources are afforded to advancing Linux performance. With high-frequency trading and cloud platforms relying on Linux, performance has become of utmost importance.
+
+Most of my testing at Phoronix.com is focused on benchmarking processors, graphics cards, storage devices, and other areas of interest to gamers and enthusiasts, but also interesting server platforms. Readers are also quite interested in testing of software components like the Linux kernel, code compilers, and filesystems. But in terms of the Phoronix Test Suite, its scope is rather limitless, with a framework in which new tests can be easily added and automated. There are currently more than 1,000 different profiles/suites, and new ones are routinely added—from machine learning tests to traditional benchmarks.
+
+**DW:** How important is open source hardware? Where do you see it going?
+
+**ML:** Open hardware is of increasing importance, especially in light of all the security vulnerabilities and disclosures in recent years. Facebook's work on the [Open Compute Project][6] can be commended, as can Google leveraging [Coreboot][7] in its Chromebook devices, and [Raptor Computing Systems][8]' successful, high-performance, open source POWER9 desktops/workstations/servers. [Intel][9] potentially open sourcing its firmware support package this year is also incredibly tantalizing and will hopefully spur more efforts in this space.
+
+Outside of that, open source hardware has had a really tough time cracking the consumer space due to the sheer amount of capital necessary and the complexities of designing a modern chip, etc., not to mention competing with the established hardware vendors' marketing budgets and other resources. So, while I would love for 100% open source hardware to dominate—or even compete in features and performance with proprietary hardware—in most segments, that is sadly unlikely to happen, especially with open hardware generally being much more expensive due to economies of scale.
+
+Software efforts like [OpenBMC][10], Coreboot/[Libreboot][11], and [LinuxBoot][12] are opening up hardware much more. Those efforts at liberating hardware have proven successful and will hopefully continue to be endorsed by more organizations.
+
+As for [OSHWA][13], I certainly applaud their efforts and the enthusiasm they bring to open source hardware. Certainly, for niche and smaller-scale devices, open source hardware can be a great fit. It will certainly be interesting to see what comes about with OSHWA and some of its partners like Lulzbot, Adafruit, and System76.
+
+**DW:** Can people install Phoronix Test Suite on their own computers?
+
+ML: The Phoronix Test Suite benchmarking software is open source under the GPL and can be downloaded from [Phoronix-Test-Suite.com][2] and [GitHub][14]. The benchmarking software works on not only Linux systems but also MacOS, Solaris, BSD, and Windows 10/Windows Server. The Phoronix Test Suite works on x86/x86_64, ARM/AArch64, POWER, RISC-V, and other architectures.
+
+**DW:** How does [OpenBenchmarking.org][15] work with the Phoronix Test Suite?
+
+**ML:** OpenBenchmarking.org is, in essence, the "cloud" component to the Phoronix Test Suite. It stores test profiles/test suites in a package manager-like fashion, allows users to upload their own benchmarking results, and offers related functionality around our benchmarking software.
+
+OpenBenchmarking.org is seamlessly integrated into the Phoronix Test Suite, but from the web interface, it is also where anyone can see the public benchmark results, inspect the open source test profiles to understand their methodology, research hardware and software data, and use similar functionality.
+
+Another component developed as part of the Phoronix Test Suite is [Phoromatic][16], which effectively allows anyone to deploy their own OpenBenchmarking-like environment within their own private intranet/LAN. This allows organizations to archive their benchmark results locally (and privately), orchestrate benchmarks automatically against groups of systems, manage the benchmark systems, and develop new test cases.
+
+**DW:** How can people stay up to date on Phoronix?
+
+**ML:** You can follow [me][17], [Phoronix][18], [Phoronix Test Suite][19], and [OpenBenchMarking.org][20] on Twitter.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/phoronix-michael-larabel
+
+作者:[Don Watkins][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/don-watkins
+[b]: https://github.com/lujun9972
+[1]: https://www.phoronix.com/
+[2]: https://www.phoronix-test-suite.com/
+[3]: https://openbenchmarking.org/
+[4]: https://www.michaellarabel.com/
+[5]: http://Phoronix.com
+[6]: https://www.opencompute.org/
+[7]: https://www.coreboot.org/
+[8]: https://www.raptorcs.com/
+[9]: https://www.phoronix.com/scan.php?page=news_item&px=Intel-Open-Source-FSP-Likely
+[10]: https://en.wikipedia.org/wiki/OpenBMC
+[11]: https://libreboot.org/
+[12]: https://linuxboot.org/
+[13]: https://www.oshwa.org/
+[14]: https://github.com/phoronix-test-suite/
+[15]: http://OpenBenchmarking.org
+[16]: http://www.phoronix-test-suite.com/index.php?k=phoromatic
+[17]: https://twitter.com/michaellarabel
+[18]: https://twitter.com/phoronix
+[19]: https://twitter.com/Phoromatic
+[20]: https://twitter.com/OpenBenchmark
diff --git a/sources/talk/20190219 How our non-profit works openly to make education accessible.md b/sources/talk/20190219 How our non-profit works openly to make education accessible.md
new file mode 100644
index 0000000000..eee670610c
--- /dev/null
+++ b/sources/talk/20190219 How our non-profit works openly to make education accessible.md
@@ -0,0 +1,136 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How our non-profit works openly to make education accessible)
+[#]: via: (https://opensource.com/open-organization/19/2/building-curriculahub)
+[#]: author: (Tanner Johnson https://opensource.com/users/johnsontanner3)
+
+How our non-profit works openly to make education accessible
+======
+To build an open access education hub, our team practiced the same open methods we teach our students.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_Education_2_OpenAccess_1040x584_12268077_0614MM.png?itok=xb96iaHe)
+
+I'm lucky to work with a team of impressive students at Duke University who are leaders in their classrooms and beyond. As members of [CSbyUs][1], a non-profit and student-run organization based at Duke, we connect university students to middle school students, mostly from [title I schools][2] across North Carolina's Research Triangle Park. Our mission is to fuel future change agents from under-resourced learning environments by fostering critical technology skills for thriving in the digital age.
+
+The CSbyUs Tech R&D team (TRD for short) recently set an ambitious goal to build and deploy a powerful web application over the course of one fall semester. Our team of six knew we had to do something about our workflow to ship a product by winter break. In our middle school classrooms, we teach our learners to use agile methodologies and design thinking to create mobile applications. On the TRD team, we realized we needed to practice what we preach in those classrooms to ship a quality product by semester's end.
+
+This is the story of how and why we utilized the principles we teach our students in order to deploy technology that will scale our mission and make our teaching resources open and accessible.
+
+### Setting the scene
+
+For the past two years, CSbyUs has operated "on the ground," connecting Duke undergraduates to Durham middle schools via after-school programming. After teaching and evaluating several iterations of our unique, student-centered mobile app development curriculum, we saw promising results. Our middle schoolers were creating functional mobile apps, connecting to their mentors, and leaving the class more confident in their computer science skills. Naturally, we wondered how to expand our programming.
+
+We knew we should take our own advice and lean into web-based technologies to share our work, but we weren't immediately sure what problem we needed to solve. Ultimately, we decided to create a web app that serves as a centralized hub for open source and open access digital education curricula. "CurriculaHub" (name inspired by GitHub) would be the defining pillar of CSbyUs's new website, where educators could share and adapt resources.
+
+But the vision and implementation didn't happen overnight.
+
+Given our sense of urgency and the potential of "CurriculaHub," we wanted to start this project with a well defined plan. The stakes were (and are) high, so planning, albeit occasionally tedious, was critical to our success. Like the curriculum we teach, we scaffolded our workflow process with design thinking and agile methodology, two critical 21st century frameworks we often fail to practice in higher ed.
+
+What follows is a step-wise explanation of our design thinking process, starting from inspiration and ending in a shipped prototype.
+
+```
+This is the story of how and why we utilized the principles we teach our students in order to deploy technology that will scale our mission and make our teaching resources open and accessible.
+```
+
+### Our Process
+
+#### **Step 1: Pre-Work**
+
+In order to understand the why to our what, you have to know who our team is.
+
+The members of this team are busy. All of us contribute to CSbyUs beyond our TRD-related responsibilities. As an organization with lofty goals beyond creating a web-based platform, we have to reconcile our "on the ground" commitments (i.e., curriculum curation, research and evaluation, mentorship training and practice, presentations at conferences, etc.) with our "in the cloud" technological goals.
+
+In addition to balancing time across our organization, we have to be flexible in the ways we communicate. As a remote member of the team, I'm writing this post from Spain, but the rest of our team is based in North Carolina, adding collaboration challenges.
+
+Before diving into development (or even problem identification), we knew we had to set some clear expectations for how we'd operate as a team. We took a note from our curriculum team's book and started with some [rules of engagement][3]. This is actually [a well-documented approach][4] to setting up a team's [social contract][5] used by teams across the tech space. During a summer internship at IBM, I remember pre-project meetings where my manager and team spent more than an hour clarifying principles of interaction. Whenever we faced uncertainty in our team operations, we'd pull out the rules of engagement and clear things up almost immediately. (An aside: I've found this strategy to be wildly effective not only in my teams, but in all relationships).
+
+Considering the remote nature of our team, one of our favorite tools is Slack. We use it for almost everything. We can't have sticky-note brainstorms, so we create Slack brainstorm threads. In fact, that's exactly what we did to generate our rules of engagement. One [open source principle we take to heart is transparency][6]; Slack allows us to archive and openly share our thought processes and decision-making steps with the rest of our team.
+
+#### **Step 2: Empathy Research**
+
+We're all here for unique reasons, but we find a common intersection: the desire to broaden equity in access to quality digital era education.
+
+Each member of our team has been lucky enough to study at Duke. We know how it feels to have limitless opportunities and the support of talented peers and renowned professors. But we're mindful that this isn't normal. Across the country and beyond, these opportunities are few and far between. Where they do exist, they're confined within the guarded walls of higher institutes of learning or come with a lofty price tag.
+
+While our team members' common desire to broaden access is clear, we work hard to root our decisions in research. So our team begins each semester [reviewing][7] [research][8] that justifies our existence. TRD works with CRD (curriculum research and development) and TT (teaching team), our two other CSbyUs sub-teams, to discuss current trends in digital education access, their systemic roots, and novel approaches to broaden access and make materials relevant to learners. We not only perform research collaboratively at the beginning of the semester but also implement weekly stand-up research meetings with the sub-teams. During these, CRD often presents new findings we've gleaned from interviewing current teachers and digging into the current state of access in our local community. They are our constant source of data-driven, empathy-fueling research.
+
+Through this type of empathy-based research, we have found that educators interested in student-centered teaching and digital era education lack a centralized space for proven and adaptable curricula and lesson plans. The bureaucracy and rigid structures that shape classroom learning in the United States makes reshaping curricula around the personal needs of students daunting and seemingly impossible. As students, educators, and technologists, we wondered how we might unleash the creativity and agency of others by sharing our own resources and creating an online ecosystem of support.
+
+#### **Step 3: Defining the Problem**
+
+We wanted to avoid [scope creep][9] caused by a poorly defined mission and vision (something that happens too often in some organizations). We needed structures to define our goals and maintain clarity in scope. Before imagining our application features, we knew we'd have to start with defining our north star. We would generate a clear problem statement to which we could refer throughout development.
+
+Before imagining our application features, we knew we'd have to start with defining our north star.
+
+This is common practice for us. Before committing to new programming, new partnerships, or new changes, the CSbyUs team always refers back to our mission and vision and asks, "Does this make sense?" (in fact, we post our mission and vision to the top of every meeting minutes document). If it fits and we have capacity to pursue it, we go for it. And if we don't, then we don't. In the case of a "no," we are always sure to document what and why because, as engineers know, [detailed logs are almost always a good decision][10]. TRD gleaned that big-picture wisdom and implemented a group-defined problem statement to guide our sub-team mission and future development decisions.
+
+To formulate a single, succinct problem statement, we each began by posting our own takes on the problem. Then, during one of our weekly [30-minute-no-more-no-less stand-up meetings][11], we identified commonalities and differences, ultimately [merging all our ideas into one][12]. Boiled down, we identified that there exist massive barriers for educators, parents, and students to share, modify, and discuss open source and accessible curricula. And of course, our mission would be to break down those barriers with user-centered technology. This "north star" lives as a highly visible document in our Google Drive, which has influenced our feature prioritization and future directions.
+
+#### **Step 4: Ideating a Solution**
+
+With our problem defined and our rules of engagement established, we were ready to imagine a solution.
+
+We believe that effective structures can ensure meritocracy and community. Sometimes, certain personalities dominate team decision-making and leave little space for collaborative input. To avoid that pitfall and maximize our equality of voice, we tend to use "offline" individual brainstorms and merge collective ideas online. It's the same process we used to create our rules of engagement and problem statement. In the case of ideating a solution, we started with "offline" brainstorms of three [S.M.A.R.T. goals][13]. Those goals would be ones we could achieve as a software development team (specifically because the CRD and TT teams offer different skill sets) and address our problem statement. Finally, we wrote these goals in a meeting minutes document, clustering common goals and ultimately identifying themes that describe our application features. In the end, we identified three: support, feedback, and open source curricula.
+
+From here, we divided ourselves into sub-teams, repeating the goal-setting process with those teams—but in a way that was specific to our features. And if it's not obvious by now, we realized a web-based platform would be the most optimal and scalable solution for supporting students, educators, and parents by providing a hub for sharing and adapting proven curricula.
+
+To work efficiently, we needed to be adaptive, reinforcing structures that worked and eliminating those that didn't. For example, we put a lot of effort in crafting meeting agendas. We strive to include only those subjects we must discuss in-person and table everything else for offline discussions on Slack or individually organized calls. We practice this in real time, too. During our regular meetings on Google Hangouts, if someone brings up a topic that isn't highly relevant or urgent, the current stand-up lead (a role that rotates weekly) "parking lots" it until the end of the meeting. If we have space at the end, we pull from the parking lot, and if not, we reserve that discussion for a Slack thread.
+
+This prioritization structure has led to massive gains in meeting efficiency and a focus on progress updates, shared technical hurdle discussions, collective decision-making, and assigning actionable tasks (the next-steps a person has committed to taking, documented with their name attached for everyone to view).
+
+#### **Step 5: Prototyping**
+
+This is where the fun starts.
+
+Our team was only able to unite new people with highly varied experience through the power of open principles and methodologies.
+
+Given our requirements—like an interactive user experience, the ability to collaborate on blogs and curricula, and the ability to receive feedback from our users—we began identifying the best technologies. Ultimately, we decided to build our web app with a ReactJS frontend and a Ruby on Rails backend. We chose these due to the extensive documentation and active community for both, and the well-maintained libraries that bridge the relationship between the two (e.g., react-on-rails). Since we chose Rails for our backend, it was obvious from the start that we'd work within a Model-View-Controller framework.
+
+Most of us didn't have previous experience with web development, neither on the frontend nor the backend. So, getting up and running with either technology independently presented a steep learning curve, and gluing the two together only steepened it. To centralize our work, we use an open-access GitHub repository. Given our relatively novice experience in web development, our success hinged on extremely efficient and open collaborations.
+
+And to explain that, we need to revisit the idea of structures. Some of ours include peer code reviews—where we can exchange best-practices and reusable solutions, maintaining up-to-date tech and user documentation so we can look back and understand design decisions—and (my personal favorite) our questions bot on Slack, which gently reminds us to post and answer questions in a separate Slack #questions channel.
+
+We've also dabbled with other strategies, like instructional videos for generating basic React components and rendering them in Rails Views. I tried this and in my first video, [I covered a basic introduction to our repository structure][14] and best practices for generating React components. While this proved useful, our team has since realized the wealth of online resources that document various implementations of these technologies robustly. Also, we simply haven't had enough time (but we might revisit them in the future—stay tuned).
+
+We're also excited about our cloud-based implementation. We use Heroku to host our application and manage data storage. In next iterations, we plan to both expand upon our current features and configure a continuous iteration/continuous development pipeline using services like Jenkins integrated with GitHub.
+
+#### **Step 6: Testing**
+
+Since we've [just deployed][1], we are now in a testing stage. Our goals are to collect user feedback across our feature domains and our application experience as a whole, especially as they interact with our specific audiences. Given our original constraints (namely, time and people power), this iteration is the first of many to come. For example, future iterations will allow for individual users to register accounts and post external curricula directly on our site without going through the extra steps of email. We want to scale and maximize our efficiency, and that's part of the recipe we'll deploy in future iterations. As for user testing: We collect user feedback via our contact form, via informal testing within our team, and via structured focus groups. [We welcome your constructive feedback and collaboration][15].
+
+Our team was only able to unite new people with highly varied experience through the power of open principles and methodologies. Luckily enough, each one I described in this post is adaptable to virtually every team.
+
+Regardless of whether you work—on a software development team, in a classroom, or, heck, [even in your family][16]—principles like transparency and community are almost always the best foundation for a successful organization.
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/open-organization/19/2/building-curriculahub
+
+作者:[Tanner Johnson][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/johnsontanner3
+[b]: https://github.com/lujun9972
+[1]: http://csbyus.org
+[2]: https://www2.ed.gov/programs/titleiparta/index.html
+[3]: https://docs.google.com/document/d/1tqV6B6Uk-QB7Psj1rX9tfCyW3E64_v6xDlhRZ-L2rq0/edit
+[4]: https://www.atlassian.com/team-playbook/plays/rules-of-engagement
+[5]: https://openpracticelibrary.com/practice/social-contract/
+[6]: https://opensource.com/open-organization/resources/open-org-definition
+[7]: https://services.google.com/fh/files/misc/images-of-computer-science-report.pdf
+[8]: https://drive.google.com/file/d/1_iK0ZRAXVwGX9owtjUUjNz3_2kbyYZ79/view?usp=sharing
+[9]: https://www.pmi.org/learning/library/top-five-causes-scope-creep-6675
+[10]: https://www.codeproject.com/Articles/42354/The-Art-of-Logging#what
+[11]: https://opensource.com/open-organization/16/2/6-steps-running-perfect-30-minute-meeting
+[12]: https://docs.google.com/document/d/1wdPRvFhMKPCrwOG2CGp7kP4rKOXrJKI77CgjMfaaXnk/edit?usp=sharing
+[13]: https://www.projectmanager.com/blog/how-to-create-smart-goals
+[14]: https://www.youtube.com/watch?v=52kvV0plW1E
+[15]: http://csbyus.org/
+[16]: https://opensource.com/open-organization/15/11/what-our-families-teach-us-about-organizational-life
diff --git a/sources/talk/20190220 Do Linux distributions still matter with containers.md b/sources/talk/20190220 Do Linux distributions still matter with containers.md
new file mode 100644
index 0000000000..c1c7886d0d
--- /dev/null
+++ b/sources/talk/20190220 Do Linux distributions still matter with containers.md
@@ -0,0 +1,87 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Do Linux distributions still matter with containers?)
+[#]: via: (https://opensource.com/article/19/2/linux-distributions-still-matter-containers)
+[#]: author: (Scott McCarty https://opensource.com/users/fatherlinux)
+
+Do Linux distributions still matter with containers?
+======
+There are two major trends in container builds: using a base image and building from scratch. Each has engineering tradeoffs.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/cube_innovation_process_block_container.png?itok=vkPYmSRQ)
+
+Some people say Linux distributions no longer matter with containers. Alternative approaches, like distroless and scratch containers, seem to be all the rage. It appears we are considering and making technology decisions based more on fashion sense and immediate emotional gratification than thinking through the secondary effects of our choices. We should be asking questions like: How will these choices affect maintenance six months down the road? What are the engineering tradeoffs? How does this paradigm shift affect our build systems at scale?
+
+It's frustrating to watch. If we forget that engineering is a zero-sum game with measurable tradeoffs—advantages and disadvantages, with costs and benefits of different approaches— we do ourselves a disservice, we do our employers a disservice, and we do our colleagues who will eventually maintain our code a disservice. Finally, we do all of the maintainers ([hail the maintainers!][1]) a disservice by not appreciating the work they do.
+
+### Understanding the problem
+
+To understand the problem, we have to investigate why we started using Linux distributions in the first place. I would group the reasons into two major buckets: kernels and other packages. Compiling kernels is actually fairly easy. Slackware and Gentoo (I still have a soft spot in my heart) taught us that.
+
+On the other hand, the tremendous amount of development and runtime software that needs to be packaged for a usable Linux system can be daunting. Furthermore, the only way you can ensure that millions of permutations of packages can be installed and work together is by using the old paradigm: compile it and ship it together as a thing (i.e., a Linux distribution). So, why do Linux distributions compile kernels and all the packages together? Simple: to make sure things work together.
+
+First, let's talk about kernels. The kernel is special. Booting a Linux system without a compiled kernel is a bit of a challenge. It's the core of a Linux operating system, and it's the first thing we rely on when a system boots. Kernels have a lot of different configuration options when they're being compiled that can have a tremendous effect on how hardware and software run on one. A secondary problem in this bucket is that system software, like compilers, C libraries, and interpreters, must be tuned for the options you built into the kernel. Gentoo taught us this in a visceral way, which turned everyone into a miniature distribution maintainer.
+
+Embarrassingly (because I have worked with containers for the last five years), I must admit that I have compiled kernels quite recently. I had to get nested KVM working on RHEL 7 so that I could run [OpenShift on OpenStack][2] virtual machines, in a KVM virtual machine on my laptop, as well as [our Container Development Kit (CDK][3]). #justsayin Suffice to say, I fired RHEL7 up on a brand new 4.X kernel at the time. Like any good sysadmin, I was a little worried that I missed some important configuration options and patches. And, of course, I had missed some things. Sleep mode stopped working right, my docking station stopped working right, and there were numerous other small, random errors. But it did work well enough for a live demo of OpenShift on OpenStack, in a single KVM virtual machine on my laptop. Come on, that's kinda' fun, right? But I digress…
+
+Now, let's talk about all the other packages. While the kernel and associated system software can be tricky to compile, the much, much bigger problem from a workload perspective is compiling thousands and thousands of packages to give us a useable Linux system. Each package requires subject matter expertise. Some pieces of software require running only three commands: **./configure** , **make** , and **make install**. Others require a lot of subject matter expertise ranging from adding users and configuring specific defaults in **etc** to running post-install scripts and adding systemd unit files. The set of skills necessary for the thousands of different pieces of software you might use is daunting for any single person. But, if you want a usable system with the ability to try new software whenever you want, you have to learn how to compile and install the new software before you can even begin to learn to use it. That's Linux without a Linux distribution. That's the engineering problem you are agreeing to when you forgo a Linux distribution.
+
+The point is that you have to build everything together to ensure it works together with any sane level of reliability, and it takes a ton of knowledge to build a usable cohort of packages. This is more knowledge than any single developer or sysadmin is ever going to reasonably learn and retain. Every problem I described applies to your [container host][4] (kernel and system software) and [container image][5] (system software and all other packages)—notice the overlap; there are compilers, C libraries, interpreters, and JVMs in the container image, too.
+
+### The solution
+
+You already know this, but Linux distributions are the solution. Stop reading and send your nearest package maintainer (again, hail the maintainers!) an e-card (wait, did I just give my age away?). Seriously though, these people do a ton of work, and it's really underappreciated. Kubernetes, Istio, Prometheus, and Knative: I am looking at you. Your time is coming too, when you will be in maintenance mode, overused, and underappreciated. I will be writing this same article again, probably about Kubernetes, in about seven to 10 years.
+
+### First principles with container builds
+
+There are tradeoffs to building from scratch and building from base images.
+
+#### Building from base images
+
+Building from base images has the advantage that most build operations are nothing more than a package install or update. It relies on a ton of work done by package maintainers in a Linux distribution. It also has the advantage that a patching event six months—or even 10 years—from now (with RHEL) is an operations/systems administrator event (yum update), not a developer event (that requires picking through code to figure out why some function argument no longer works).
+
+Let's double-click on that a bit. Application code relies on a lot of libraries ranging from JSON munging libraries to object-relational mappers. Unlike the Linux kernel and Glibc, these types of libraries change with very little regard to breaking API compatibility. That means that three years from now your patching event likely becomes a code-changing event, not a yum update event. Got it, let that sink in. Developers, you are getting paged at 2 AM if the security team can't find a firewall hack to block the exploit.
+
+Building from a base image is not perfect; there are disadvantages, like the size of all the dependencies that get dragged in. This will almost always make your container images larger than building from scratch. Another disadvantage is you will not always have access to the latest upstream code. This can be frustrating for developers, especially when you just want to get something out the door, but not as frustrating as being paged to look at a library you haven't thought about in three years that the upstream maintainers have been changing the whole time.
+
+If you are a web developer and rolling your eyes at me, I have one word for you: DevOps. That means you are carrying a pager, my friend.
+
+#### Building from scratch
+
+Scratch builds have the advantage of being really small. When you don't rely on a Linux distribution in the container, you have a lot of control, which means you can customize everything for your needs. This is a best-of-breed model, and it's valid in certain use cases. Another advantage is you have access to the latest packages. You don't have to wait for a Linux distro to update anything. You are in control, so you choose when to spend the engineering work to incorporate new software.
+
+Remember, there is a cost to controlling everything. Often, updating to new libraries with new features drags in unwanted API changes, which means fixing incompatibilities in code (in other words, [shaving yaks][6]). Shaving yaks at 2 AM when the application doesn't work is not fun. Luckily, with containers, you can roll back and shave the yaks the next business day, but it will still eat into your time for delivering new value to the business, new features to your applications. Welcome to the life of a sysadmin.
+
+OK, that said, there are times that building from scratch makes sense. I will completely concede that statically compiled Golang programs and C programs are two decent candidates for scratch/distroless builds. With these types of programs, every container build is a compile event. You still have to worry about API breakage three years from now, but if you are a Golang shop, you should have the skillset to fix things over time.
+
+### Conclusion
+
+Basically, Linux distributions do a ton of work to save you time—on a regular Linux system or with containers. The knowledge that maintainers have is tremendous and leveraged so much without really being appreciated. The adoption of containers has made the problem even worse because it's even further abstracted.
+
+With container hosts, a Linux distribution offers you access to a wide hardware ecosystem, ranging from tiny ARM systems, to giant 128 CPU x86 boxes, to cloud-provider VMs. They offer working container engines and container runtimes out of the box, so you can just fire up your containers and let somebody else worry about making things work.
+
+For container images, Linux distributions offer you easy access to a ton of software for your projects. Even when you build from scratch, you will likely look at how a package maintainer built and shipped things—a good artist is a good thief—so, don't undervalue this work.
+
+So, thank you to all of the maintainers in Fedora, RHEL (Frantisek, you are my hero), Debian, Gentoo, and every other Linux distribution. I appreciate the work you do, even though I am a "container guy."
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/linux-distributions-still-matter-containers
+
+作者:[Scott McCarty][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/fatherlinux
+[b]: https://github.com/lujun9972
+[1]: https://aeon.co/essays/innovation-is-overvalued-maintenance-often-matters-more
+[2]: https://blog.openshift.com/openshift-on-openstack-delivering-applications-better-together/
+[3]: https://developers.redhat.com/blog/2018/02/13/red-hat-cdk-nested-kvm/
+[4]: https://developers.redhat.com/blog/2018/02/22/container-terminology-practical-introduction/#h.8tyd9p17othl
+[5]: https://developers.redhat.com/blog/2018/02/22/container-terminology-practical-introduction/#h.dqlu6589ootw
+[6]: https://en.wiktionary.org/wiki/yak_shaving
diff --git a/sources/talk/20190222 Developer happiness- What you need to know.md b/sources/talk/20190222 Developer happiness- What you need to know.md
new file mode 100644
index 0000000000..8ef7772193
--- /dev/null
+++ b/sources/talk/20190222 Developer happiness- What you need to know.md
@@ -0,0 +1,79 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Developer happiness: What you need to know)
+[#]: via: (https://opensource.com/article/19/2/developer-happiness)
+[#]: author: (Bart Copeland https://opensource.com/users/bartcopeland)
+
+Developer happiness: What you need to know
+======
+Developers need the tools and the freedom to code quickly, without getting bogged down by compliance and security.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_happy_sad_developer_programming.png?itok=72nkfSQ_)
+
+A person needs the right tools for the job. There's nothing as frustrating as getting halfway through a car repair, for instance, only to discover you don't have the specialized tool you need to complete the job. The same concept applies to developers: you need the tools to do what you are best at, without disrupting your workflow with compliance and security needs, so you can produce code faster.
+
+Over half—51%, to be specific—of developers spend only one to four hours each day programming, according to ActiveState's recent [Developer Survey 2018: Open Source Runtime Pains][1]. In other words, the majority of developers spend less than half of their time coding. According to the survey, 50% of developers say security is one of their biggest concerns, but 67% of developers choose not to add a new language when coding because of the difficulties related to corporate policies.
+
+The result is developers have to devote time to non-coding activities like retrofitting software for security and compliance criteria checked after software and languages have been built. And they won't choose the best tool or language for the job because of corporate policies. Their satisfaction goes down and risk goes up.
+
+So, developers aren't able to devote time to high-value work. This creates additional business risk because their time-to-market is slowed, and the organization increases tech debt by not empowering developers to decide on "the best" tech, unencumbered by corporate policy drag.
+
+### Baking in security and compliance workflows
+
+How can we solve this issue? One way is to integrate security and compliance workflows into the software development process in four easy steps:
+
+#### 1\. Gather your forces
+
+Get support from everyone involved. This is an often-forgotten but critical first step. Make sure to consider a wide range of stakeholders, including:
+
+ * DevOps
+ * Developers
+ * InfoSec
+ * Legal/compliance
+ * IT security
+
+
+
+Stakeholders want to understand the business benefits, so make a solid case for eliminating the security and compliance checkpoints after software builds. You can consider any (or all) of the following in building your business case: time savings, opportunity cost, and developer productivity. By integrating security and compliance workflows into the development process, you also avoid retrofitting of languages.
+
+#### 2\. Find trustworthy sources
+
+Next, choose the trusted sources that can be used, along with their license and security requirements. Consider including information such as:
+
+ * Restrictions on usage based on environment or application type and version controls per language
+ * Which open source components are allowable, e.g., specific packages
+ * Which licenses can be used in which types of environments (e.g., research vs. production)
+ * The definition of security levels, acceptable vulnerability risk levels, what risk levels trigger an action, what that action would be, and who would be responsible for its implementation
+
+
+
+#### 3\. Incorporate security and compliance from day one
+
+The upshot of incorporating security and compliance workflows is that it ultimately bakes security and compliance into the first line of code. It eliminates the drag of corporate policy because you're coding to spec versus having to fix things after the fact. But to do this, consider mechanisms for automatically scanning code as it's being built, along with using agentless monitoring of your runtime code. You're freeing up your time, and you'll also be able to programmatically enforce policies to ensure compliance across your entire organization.
+
+New vulnerabilities arise, and new patches and versions become available. Consequently, security and compliance need to be considered when deploying code into production and also when running code. You need to know what, if any, code is at risk and where that code is running. So, the process for deploying and running code should include monitoring, reporting, and updating code in production.
+
+By integrating security and compliance into your software development process from the start, you can also benefit by tracking where your code is running once deployed and be alerted of new threats as they arise. You will be able to track when your applications were vulnerable and respond with automatic enforcement of your software policies.
+
+If your software development process has security and compliance workflows baked in, you will improve your productivity. And you'll be able to measure value through increased time spent coding; gains in security and stability; and cost- and time-savings in maintenance and discovery of security and compliance threats.
+
+### Happiness through integration
+
+If you don't develop and update software, your organization can't go forward. Developers are a linchpin in the success of your company, which means they need the tools and the freedom to code quickly. You can't let compliance and security needs—though they are critical—bog you down. Developers clearly worry about security, so the happy medium is to "shift left" and integrate security and compliance workflows from the start. You'll get more done, get it right the first time, and spend far less time retrofitting code.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/developer-happiness
+
+作者:[Bart Copeland][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/bartcopeland
+[b]: https://github.com/lujun9972
+[1]: https://www.activestate.com/company/press/press-releases/activestate-developer-survey-examines-open-source-challenges/
diff --git a/sources/talk/20190223 No- Ubuntu is NOT Replacing Apt with Snap.md b/sources/talk/20190223 No- Ubuntu is NOT Replacing Apt with Snap.md
new file mode 100644
index 0000000000..bb7dd14943
--- /dev/null
+++ b/sources/talk/20190223 No- Ubuntu is NOT Replacing Apt with Snap.md
@@ -0,0 +1,76 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (No! Ubuntu is NOT Replacing Apt with Snap)
+[#]: via: (https://itsfoss.com/ubuntu-snap-replaces-apt-blueprint/)
+[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
+
+No! Ubuntu is NOT Replacing Apt with Snap
+======
+
+Stop believing the rumors that Ubuntu is planning to replace Apt with Snap in the [Ubuntu 19.04 release][1]. These are only rumors.
+
+![Snap replacing apt rumors][2]
+
+Don’t get what I am talking about? Let me give you some context.
+
+There is a ‘blueprint’ on Ubuntu’s launchpad website, titled ‘Replace APT with snap as default package manager’. It talks about replacing Apt (package manager at the heart of Debian) with Snap ( a new packaging system by Ubuntu).
+
+> Thanks to Snap, the need for APT is disappearing, fast… why don’t we use snap at the system level?
+
+The post further says “Imagine, for example, being able to run “sudo snap install cosmic” to upgrade to the current release, “sudo snap install –beta disco” (in March) to upgrade to a beta release, or, for that matter, “sudo snap install –edge disco” to upgrade to a pre-beta release. It would make the whole process much easier, and updates could simply be delivered as updates to the corresponding snap, which could then just be pushed to the repositories and there it is. This way, instead of having a separate release updater, it would be possible to A, run all system updates completely and silently in the background to avoid nagging the user (a la Chrome OS), and B, offer release upgrades in the GNOME software store, Mac-style, as banners, so the user can install them easily. It would make the user experience both more consistent and even more user-friendly than it currently is.”
+
+It might sound good and promising and if you take a look at [this link][3], even you might start believing the rumor. Why? Because at the bottom of the blueprint information, it lists Ubuntu-founder Mark Shuttleworth as the approver.
+
+![Apt being replaced with Snap blueprint rumor][4]Mark Shuttleworth’s name adds to the confusion
+
+The rumor got fanned when the Switch to Linux YouTube channel covered it. You can watch the video from around 11:30.
+
+
+
+When this ‘news’ was brought to my attention, I reached out to Alan Pope of Canonical and asked him if he or his colleagues at Canonical (Ubuntu’s parent company) could confirm it.
+
+Alan clarified that the so called blueprint was not associated with official Ubuntu team. It was created as a proposal by some community member not affiliated with Ubuntu.
+
+> That’s not anything official. Some random community person made it. Anyone can write a blueprint.
+>
+> Alan Pope, Canonical
+
+Alan further elaborated that anyone can create such blueprints and tag Mark Shuttleworth or other Ubuntu members in it. Just because Mark’s name was listed as the approver, it doesn’t mean he already approved the idea.
+
+Canonical has no such plans to replace Apt with Snap. It’s not as simple as the blueprint in question suggests.
+
+After talking with Alan, I decided to not write about this topic because I don’t want to fan baseless rumors and confuse people.
+
+Unfortunately, the ‘replace Apt with Snap’ blueprint is still being shared on various Ubuntu and Linux related groups and forums. Alan had to publicly dismiss these rumors in a series of tweets:
+
+> Seen this [#Ubuntu][5] blueprint being shared around the internet. It's not official, not a thing we're doing. Just because someone made a blueprint, doesn't make it fact.
+>
+> — Alan Pope 🇪🇺🇬🇧 (@popey) [February 23, 2019][6]
+
+I don’t want you, the It’s FOSS reader, to fell for such silly rumors so I quickly penned this article.
+
+If you come across ‘apt being replaced with snap’ discussion, you may tell people that it’s not true and provide them this link as a reference.
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/ubuntu-snap-replaces-apt-blueprint/
+
+作者:[Abhishek Prakash][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [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/ubuntu-19-04-release-features/
+[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/02/snap-replacing-apt.png?resize=800%2C450&ssl=1
+[3]: https://blueprints.launchpad.net/ubuntu/+spec/package-management-default-snap
+[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/apt-snap-blueprint.jpg?ssl=1
+[5]: https://twitter.com/hashtag/Ubuntu?src=hash&ref_src=twsrc%5Etfw
+[6]: https://twitter.com/popey/status/1099238146393468931?ref_src=twsrc%5Etfw
diff --git a/sources/talk/20190225 Teaching scientists how to share code.md b/sources/talk/20190225 Teaching scientists how to share code.md
new file mode 100644
index 0000000000..074da27476
--- /dev/null
+++ b/sources/talk/20190225 Teaching scientists how to share code.md
@@ -0,0 +1,72 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Teaching scientists how to share code)
+[#]: via: (https://opensource.com/article/19/2/open-science-git)
+[#]: author: (Jon Tennant https://opensource.com/users/jon-tennant)
+
+Teaching scientists how to share code
+======
+This course teaches them how to set up a GitHub project, index their project in Zenodo, and integrate Git into an RStudio workflow.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolserieshe_rh_051x_0.png?itok=gIzbmxuI)
+
+Would it surprise you to learn that most of the world's scholarly research is not owned by the people who funded it or who created it? Rather it's owned by private corporations and locked up in proprietary systems, leading to [problems][1] around sharing, reuse, and reproducibility.
+
+The open science movement is challenging this system, aiming to give researchers control, ownership, and freedom over their work. The [Open Science MOOC][2] (massively open online community) is a mission-driven project launched in 2018 to kick-start an open scientific revolution and foster more partnerships between open source software and open science.
+
+The Open Science MOOC is a peer-to-peer community of practice, based around sharing knowledge and ideas, learning new skills, and using these things to develop as individuals so research communities can grow as part of a wider cultural shift towards openness.
+
+### The curriculum
+
+The Open Science MOOC is divided into 10 core modules, from the principles of open science to becoming an open science advocate.
+
+The first module, [Open Research Software and Open Source][3], was released in late 2018. It includes three main tasks, all designed to help make research workflows more efficient and more open for collaboration:
+
+#### 1\. Setting up your first GitHub project
+
+GitHub is a powerful project management tool, both for coders and non-coders. This task teaches how to create a community around the platform, select an appropriate license, and write good documentation (including README files, contributing guidelines, and codes of conduct) to foster open collaboration and a welcoming community.
+
+#### 2\. Indexing your project in Zenodo
+
+[Zenodo][4] is an open science platform that seamlessly integrates with GitHub to help make projects more permanent, reusable, and citable. This task explains how webhooks between Zenodo and GitHub allow new versions of projects to become permanently archived as they progress. This is critical for helping researchers get a [DOI][5] for their work so they can receive full credit for all aspects of a project. As citations are still a primary form of "academic capital," this is essential for researchers.
+
+#### 3\. Integrating Git into an RStudio workflow
+
+This task is about giving research a mega-boost through greater collaborative efficiency and reproducibility. Git enables version control in all forms of text-based content, including data analysis and writing papers. Each time you save your work during the development process, Git saves time-stamped copies. This saves the hassle of trying to "roll back" projects if you delete a file or text by mistake, and eliminates horrific file-naming conventions. (For example, does FINAL_Revised_2.2_supervisor_edits_ver1.7_scream.txt look familiar?) Getting Git to interface with RStudio is the painful part, but this task goes through it, step by step, to ease the stress.
+
+The third task also gives students the ability to interact directly with the MOOC by submitting pull requests to demonstrate their skills. This also adds their name to an online list of open source champions (aka "open sourcerers").
+
+The MOOC's inherently interactive style is much more valuable than listening to someone talk at you, either on or off screen, like with many traditional online courses or educational programs. Each task is backed up by expert-gathered knowledge, so students get a rigorous, dual-learning experience.
+
+### Empowering researchers
+
+The Open Science MOOC strives to be as open as possible—this means we walk the walk and talk the talk. We are built upon a solid values-based foundation of freedom and equitable access to research. We see this route towards widespread adoption of best scientific practices as an essential part of the research process.
+
+Everything we produce is openly developed and openly licensed for maximum engagement, sharing, and reuse. An open source workflow underpins our development. All of this happens openly around channels such as [Slack][6] and [GitHub][7] and helps to make the community much more coherent.
+
+If we can instill the value of open source into modern research, this would empower current and future generations of researchers to think more about fundamental freedoms around knowledge production. We think that is something worth working towards as a community.
+
+The Open Science MOOC combines the best elements of the open education, open science, and open source worlds. If you're ready to join, [sign up for the full course][3], which is, of course, free.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/open-science-git
+
+作者:[Jon Tennant][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/jon-tennant
+[b]: https://github.com/lujun9972
+[1]: https://www.theguardian.com/science/political-science/2018/jun/29/elsevier-are-corrupting-open-science-in-europe
+[2]: https://opensciencemooc.eu/
+[3]: https://eliademy.com/catalog/oer/module-5-open-research-software-and-open-source.html
+[4]: https://zenodo.org/
+[5]: https://en.wikipedia.org/wiki/Digital_object_identifier
+[6]: https://osmooc.herokuapp.com/
+[7]: https://open-science-mooc-invite.herokuapp.com/
diff --git a/sources/talk/20190226 Reducing security risks with centralized logging.md b/sources/talk/20190226 Reducing security risks with centralized logging.md
new file mode 100644
index 0000000000..60bbd7a80b
--- /dev/null
+++ b/sources/talk/20190226 Reducing security risks with centralized logging.md
@@ -0,0 +1,82 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Reducing security risks with centralized logging)
+[#]: via: (https://opensource.com/article/19/2/reducing-security-risks-centralized-logging)
+[#]: author: (Hannah Suarez https://opensource.com/users/hcs)
+
+Reducing security risks with centralized logging
+======
+Centralizing logs and structuring log data for processing can mitigate risks related to insufficient logging.
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security_privacy_lock.png?itok=ZWjrpFzx)
+
+Logging and log analysis are essential to securing infrastructure, particularly when we consider common vulnerabilities. This article, based on my lightning talk [Let's use centralized log collection to make incident response teams happy][1] at FOSDEM'19, aims to raise awareness about the security concerns around insufficient logging, offer a way to avoid the risk, and advocate for more secure practices _(disclaimer: I work for NXLog)._
+
+### Why log collection and why centralized logging?
+
+Logging is, to be specific, an append-only sequence of records written to disk. In practice, logs help you investigate an infrastructure issue as you try to find a cause for misbehavior. A challenge comes up when you have heterogeneous systems with their own standards and formats, and you want to be able to handle and process these in a dependable way. This often comes at the cost of metadata. Centralized logging solutions require commonality, and that commonality often removes the rich metadata many open source logging tools provide.
+
+### The security risk of insufficient logging and monitoring
+
+The Open Web Application Security Project ([OWASP][2]) is a nonprofit organization that contributes to the industry with incredible projects (including many [tools][3] focusing on software security). The organization regularly reports on the riskiest security challenges for application developers and maintainers. In its most recent report on the [top 10 most critical web application security risks][4], OWASP added Insufficient Logging and Monitoring to its list. OWASP warns of risks due to insufficient logging, detection, monitoring, and active response in the following types of scenarios.
+
+ * Important auditable events, such as logins, failed logins, and high-value transactions are not logged.
+ * Warnings and errors generate none, inadequate, or unclear log messages.
+ * Logs are only being stored locally.
+ * The application is unable to detect, escalate, or alert for active attacks in real time or near real time.
+
+
+
+These instances can be mitigated by centralizing logs (i.e., not storing logs locally) and structuring log data for processing (i.e., in alerting dashboards and security suites).
+
+For example, imagine a DNS query leads to a malicious site named **hacked.badsite.net**. With DNS monitoring, administrators monitor and proactively analyze DNS queries and responses. The efficiency of DNS monitoring relies on both sufficient logging and log collection in order to catch potential issues as well as structuring the resulting DNS log for further processing:
+
+```
+2019-01-29
+Time (GMT) Source Destination Protocol-Info
+12:42:42.112898 SOURCE_IP xxx.xx.xx.x DNS Standard query 0x1de7 A hacked.badsite.net
+```
+
+You can try this yourself and run through other examples and snippets with the [NXLog Community Edition][5] _(disclaimer again: I work for NXLog)._
+
+### Important aside: unstructured vs. structured data
+
+It's important to take a moment and consider the log data format. For example, let's consider this log message:
+
+```
+debug1: Failed password for invalid user amy from SOURCE_IP port SOURCE_PORT ssh2
+```
+
+This log contains a predefined structure, such as a metadata keyword before the colon ( **debug1** ). However, the rest of the log field is an unstructured string ( **Failed password for invalid user amy from SOURCE_IP port SOURCE_PORT ssh2** ). So, while the message is easily available in a human-readable format, it is not a format a computer can easily parse.
+
+Unstructured event data poses limitations including difficulty of parsing, searching, and analyzing the logs. The important metadata is too often set in an unstructured data field in the form of a freeform string like the example above. Logging administrators will come across this problem at some point as they attempt to standardize/normalize log data and centralize their log sources.
+
+### Where to go next
+
+Alongside centralizing and structuring your logs, make sure you're collecting the right log data—Sysmon, PowerShell, Windows EventLog, DNS debug, NetFlow, ETW, kernel monitoring, file integrity monitoring, database logs, external cloud logs, and so on. Also have the right tools and processes in place to collect, aggregate, and help make sense of the data.
+
+Hopefully, this gives you a starting point to centralize log collection across diverse sources; send them to outside sources like dashboards, monitoring software, analytics software, specialized software like security information and event management (SEIM) suites; and more.
+
+What does your centralized logging strategy look like? Share your thoughts in the comments.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/reducing-security-risks-centralized-logging
+
+作者:[Hannah Suarez][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/hcs
+[b]: https://github.com/lujun9972
+[1]: https://fosdem.org/2019/schedule/event/lets_use_centralized_log_collection_to_make_incident_response_teams_happy/
+[2]: https://www.owasp.org/index.php/Main_Page
+[3]: https://github.com/OWASP
+[4]: https://www.owasp.org/index.php/Top_10-2017_Top_10
+[5]: https://nxlog.co/products/nxlog-community-edition/download
diff --git a/sources/talk/20190227 Let your engineers choose the license- A guide.md b/sources/talk/20190227 Let your engineers choose the license- A guide.md
new file mode 100644
index 0000000000..81a8dd8ee2
--- /dev/null
+++ b/sources/talk/20190227 Let your engineers choose the license- A guide.md
@@ -0,0 +1,62 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Let your engineers choose the license: A guide)
+[#]: via: (https://opensource.com/article/19/2/choose-open-source-license-engineers)
+[#]: author: (Jeffrey Robert Kaufman https://opensource.com/users/jkaufman)
+
+Let your engineers choose the license: A guide
+======
+Enabling engineers to make licensing decisions is wise and efficient.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_hands_team_collaboration.png?itok=u82QepPk)
+
+Imagine you are working for a company that will be starting a new open source community project. Great! You have taken a positive first step to give back and enable a virtuous cycle of innovation that the open source community-based development model provides.
+
+But what about choosing an open source license for your project? You ask your manager for guidance, and she provides some perspective but quickly realizes that there is no formal company policy or guidelines. As any wise manager would do, she asks you to develop formal corporate guidelines for choosing an open source license for such projects.
+
+Simple, right? You may be surprised to learn some unexpected challenges. This article will describe some of the complexities you may encounter and some perspective based on my recent experience with a similar project at Red Hat.
+
+It may be useful to quickly review some of the more common forms of open source licensing. Open source licenses may be generally placed into two main buckets, copyleft and permissive.
+
+> Copyleft licenses, such as the GPL, allow access to source code, modifications to the source, and distribution of the source or binary versions in their original or modified forms. Copyleft additionally provides that essential software freedoms (run, study, change, and distribution) will be allowed and ensured for any recipients of that code. A copyleft license prohibits restrictions or limitations on these essential software freedoms.
+>
+> Permissive licenses, similar to copyleft, also generally allow access to source code, modifications to the source, and distribution of the source or binary versions in their original or modified forms. However, unlike copyleft licenses, additional restrictions may be included with these forms of licenses, including proprietary limitations such as prohibiting the creation of modified works or further distribution.
+
+Red Hat is one of the leading open source development companies, with thousands of open source developers continuously working upstream and contributing to an assortment of open source projects. When I joined Red Hat, I was very familiar with its flagship Red Hat Enterprise Linux offering, often referred to as RHEL. Although I fully expected that the company contributes under a wide assortment of licenses based on project requirements, I thought our preference and top recommendation for our engineers would be GPLv2 due to our significant involvement with Linux. In addition, GPL is a copyleft license, and copyleft ensures that the essential software freedoms (run, study, change, distribute) will be extended to any recipients of that code. What could be better for sustaining the open source ecosystem than a copyleft license?
+
+Fast forwarding on my journey to craft internal license choice guidelines for Red Hat, the end result was to not have any license preference at all. Instead, we delegate that responsibility, to the maximum extent possible, to our engineers. Why? Because each open source project and community is unique and there are social aspects to these communities that may have preferences towards various licensing philosophies (e.g., copyleft or permissive). Engineers working in those communities understand all these issues and are best equipped to choose the proper license on this knowledge. Mandating certain licenses for code contributions often will conflict with these community norms and result in reduction or prohibition in contributed content.
+
+For example, perhaps your organization believes that the latest GPL license (GPLv3) is the best for your company due to its updated provisions. If you mandated GPLv3 for all future contributions vs. GPLv2, you would be prohibited from contributing code to the Linux kernel, since that is a GPLv2 project and will likely remain that way for a very long time. Your engineers, being part of that open source community project, would know that and would automatically choose GPLv2 in the absence of such a mandate.
+
+Bottom line: Enabling engineers to make these decisions is wise and efficient.
+
+To the extent your organization may have to restrict the use of certain licenses (e.g., due to certain intellectual property concerns), this should naturally be part of your guidelines or policy. I believe it is much better to delegate to the maximum extent possible to those that understand all the nuances, politics, and licensing philosophies of these varied communities and restrict license choice only when absolutely necessary. Even having a preference for a certain license over another can be problematic. Open source engineers may have deeply rooted feelings about copyleft (either for or against), and forcing one license over the other (unless absolutely necessary for business reasons) may result in creating ill-will and ostracizing an engineer or engineering department within your organization
+
+In summary, Red Hat's guidelines are very simple and are summarized below:
+
+ 1. We suggest choosing an open source license from a set of 10 different licenses that are very common and meet the needs of most new open source projects.
+
+ 2. We allow the use of other licenses but we ask that a reason is provided to the open source legal team so we can collect and better understand some of the new and perhaps evolving needs of the open source communities that we serve. (As stated above, our engineers are on the front lines and are best equipped to deliver this type of information.)
+
+ 3. The open source legal team always has the right to override a decision, but this would be very rare and only would occur if we were aware of some community or legal concern regarding a specific license or project.
+
+ 4. Publishing source code without a license is never permitted.
+
+In summary, the advantages of these guidelines are enormous. They are very efficient and lead to a very low-friction development and approval system within our organization.
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/choose-open-source-license-engineers
+
+作者:[Jeffrey Robert Kaufman][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/jkaufman
+[b]: https://github.com/lujun9972
diff --git a/sources/talk/20190228 A Brief History of FOSS Practices.md b/sources/talk/20190228 A Brief History of FOSS Practices.md
new file mode 100644
index 0000000000..58e90a8efa
--- /dev/null
+++ b/sources/talk/20190228 A Brief History of FOSS Practices.md
@@ -0,0 +1,113 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (A Brief History of FOSS Practices)
+[#]: via: (https://itsfoss.com/history-of-foss)
+[#]: author: (Avimanyu Bandyopadhyay https://itsfoss.com/author/avimanyu/)
+
+A Brief History of FOSS Practices
+======
+
+We focus a great deal about Linux and Free & Open Source Software at It’s FOSS. Ever wondered how old such FOSS Practices are? How did this Practice come by? What is the History behind this revolutionary concept?
+
+In this history and trivia article, let’s take a look back in time through this brief write-up and note some interesting initiatives in the past that have grown so huge today.
+
+### Origins of FOSS
+
+![History of FOSS][1]
+
+The origins of FOSS goes back to the 1950s. When hardware was purchased, there used to be no additional charges for bundled software and the source code would also be available in order to fix possible bugs in the software.
+
+It was actually a common Practice back then for users with the freedom to customize the code.
+
+At that time, mostly academicians and researchers in the industry were the collaborators to develop such software.
+
+The term Open Source was not there yet. Instead, the term that was popular at that time was “Public Domain Software”. As of today, ideologically, both are very much [different][2] in nature even though they may sound similar.
+
+
+
+Back in 1955, some users of the [IBM 701][3] computer system from Los Angeles, voluntarily founded a group called SHARE. The “SHARE Program Library Agency” (SPLA) distributed information and software through magnetic tapes.
+
+Technical information shared, was about programming languages, operating systems, database systems, and user experiences for enterprise users of small, medium, and large-scale IBM computers.
+
+The initiative that is now more than 60 years old, continues to follow its goals quite actively. SHARE has its upcoming event coming up as [SHARE Phoenix 2019][4]. You can download and check out their complete timeline [here][5].
+
+### The GNU Project
+
+Announced at MIT on September 27, 1983, by Richard Stallman, the GNU Project is what immensely empowers and supports the Free Software Community today.
+
+### Free Software Foundation
+
+The “Free Software Movement” by Richard Stallman established a new norm for developing Free Software.
+
+He founded The Free Software Foundation (FSF) on 4th October 1985 to support the free software movement. Software that ensures that the end users have freedom in using, studying, sharing and modifying that software came to be called as Free Software.
+
+**Free as in Free Speech, Not Free Beer**
+
+
+
+The Free Software Movement laid the following rules to establish the distinctiveness of the idea:
+
+ * The freedom to run the program as you wish, for any purpose (freedom 0).
+ * The freedom to study how the program works, and change it so it does your computing as you wish (freedom 1). Access to the source code is a precondition for this.
+ * The freedom to redistribute copies so you can help your neighbor (freedom 2).
+ * The freedom to distribute copies of your modified versions to others (freedom 3). By doing this you can give the whole community a chance to benefit from your changes. Access to the source code is a precondition for this.
+
+### The Linux Kernel
+
+
+
+How can we miss this section at It’s FOSS! The Linux kernel was released as freely modifiable source code in 1991 by Linus Torvalds. At first, it was neither Free Software nor used an Open-source software license. In February 1992, Linux was relicensed under the GPL.
+
+### The Linux Foundation
+
+The Linux Foundation has a goal to empower open source projects to accelerate technology development and commercial adoption. It is an initiative that was taken in 2000 via the [Open Source Development Labs][6] (OSDL) which later merged with the [Free Standards Group][7].
+
+Linus Torvalds works at The Linux Foundation who provide complete support to him so that he can work full-time on improving Linux.
+
+### Open Source
+
+When the source code of [Netscape][8] Communicator was released in 1998, the label “Open Source” was adopted by a group of individuals at a strategy session held on February 3rd, 1998 in Palo Alto, California. The idea grew from a visionary realization that the [Netscape announcement][9] had changed the way people looked at commercial software.
+
+This opened up a whole new world, creating a new perspective that revealed the superiority and advantage of an open development process that could be powered by collaboration.
+
+[Christine Peterson][10] was the one among that group of individuals who originally suggested the term “Open Source” as we perceive today (mentioned [earlier][11]).
+
+### Evolution of Business Models
+
+The concept of Open Source is a huge phenomenon right now and there are several companies that continue to adopt the Open Source Approach to this day. [As of April 2015, 78% of companies used Open Source Software][12] with different [Open Source Licenses][13].
+
+Several organisations have adopted [different business models][14] for Open Source. Red Hat and Mozilla are two good examples.
+
+So this was a brief recap of some interesting facts from FOSS History. Do let us know your thoughts if you want to share in the comments below.
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/history-of-foss
+
+作者:[Avimanyu Bandyopadhyay][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/avimanyu/
+[b]: https://github.com/lujun9972
+[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/02/history-of-foss.png?resize=800%2C450&ssl=1
+[2]: https://opensource.org/node/878
+[3]: https://en.wikipedia.org/wiki/IBM_701
+[4]: https://event.share.org/home
+[5]: https://www.share.org/d/do/11532
+[6]: https://en.wikipedia.org/wiki/Open_Source_Development_Labs
+[7]: https://en.wikipedia.org/wiki/Free_Standards_Group
+[8]: https://en.wikipedia.org/wiki/Netscape
+[9]: https://web.archive.org/web/20021001071727/http://wp.netscape.com:80/newsref/pr/newsrelease558.html
+[10]: https://en.wikipedia.org/wiki/Christine_Peterson
+[11]: https://itsfoss.com/nanotechnology-open-science-ai/
+[12]: https://www.zdnet.com/article/its-an-open-source-world-78-percent-of-companies-run-open-source-software/
+[13]: https://itsfoss.com/open-source-licenses-explained/
+[14]: https://opensource.com/article/17/12/open-source-business-models
diff --git a/sources/talk/20190228 IRC vs IRL- How to run a good IRC meeting.md b/sources/talk/20190228 IRC vs IRL- How to run a good IRC meeting.md
new file mode 100644
index 0000000000..99f0c5c465
--- /dev/null
+++ b/sources/talk/20190228 IRC vs IRL- How to run a good IRC meeting.md
@@ -0,0 +1,56 @@
+[#]: collector: (lujun9972)
+[#]: translator: (lujun9972)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (IRC vs IRL: How to run a good IRC meeting)
+[#]: via: (https://opensource.com/article/19/2/irc-vs-irl-meetings)
+[#]: author: (Ben Cotton https://opensource.com/users/bcotton)
+
+IRC vs IRL: How to run a good IRC meeting
+======
+Internet Relay Chat meetings can be a great way to move a project forward if you follow these best practices.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_community_1.png?itok=rT7EdN2m)
+
+There's an art to running a meeting in any format. Many people have learned to run in-person or telephone meetings, but [Internet Relay Chat][1] (IRC) meetings have unique characteristics that differ from "in real life" (IRL) meetings. This article will share the advantages and disadvantages of the IRC format as well as tips that will help you lead IRC meetings more effectively.
+
+Why IRC? Despite the wealth of real-time chat options available today, [IRC remains a cornerstone of open source projects][2]. If your project uses another communication method, don't worry. Most of this advice works for any synchronous text chat mechanism, perhaps with a few tweaks here and there.
+
+### Challenges of IRC meetings
+
+IRC meetings pose certain challenges compared to in-person meetings. You know that lag between when one person finishes talking and the next one begins? It's worse in IRC because people have to type what they're thinking. This is slower than talking and—unlike with talking—you can't tell when someone else is trying to compose a message. Moderators must remember to insert long pauses when asking for responses or moving to the next topic. And someone who wants to speak up should insert a brief message (e.g., a period) to let the moderator know.
+
+IRC meetings also lack the metadata you get from other methods. You can't read facial expressions or tone of voice in text. This means you have to be careful with your word choice and phrasing.
+
+And IRC meetings make it really easy to get distracted. At least when someone is looking at funny cat GIFs during an in-person meeting, you'll see them smile and hear them laugh at inopportune times. In IRC, unless they accidentally paste the wrong text, there's no peer pressure even to pretend to pay attention. With IRC, you can even be in multiple meetings at once. I've done this, but it's dangerous if you need to be an active participant.
+
+### Benefits of IRC meetings
+
+IRC meetings have some unique advantages, too. IRC is a very resource-light medium. It doesn't tax bandwidth or CPU. This lowers the barrier for participation, which is advantageous for both the underprivileged and people who are on the road. For volunteer contributors, it means they may be able to participate during their workday. And it means participants don't need to find a quiet space where they can talk without bothering those around them.
+
+With a meeting bot, IRC can produce meeting minutes instantly. In Fedora, we use Zodbot, an instance of Debian's [Meetbot][3], to log meetings and provide interaction. When a meeting ends, the minutes and full logs are immediately available to the community. This can reduce the administrative overhead of running the meeting.
+
+### It's like a normal meeting, but different
+
+Conducting a meeting via IRC or other text-based medium means thinking about the meeting in a slightly different way. Although it lacks some of the benefits of higher-bandwidth modes of communication, it has advantages, too. Running an IRC meeting provides the opportunity to develop discipline that can help you run any type of meeting.
+
+Like any meeting, IRC meetings are best when there's a defined agenda and purpose. A good meeting moderator knows when to let the conversation follow twists and turns and when it's time to reel it back in. There's no hard and fast rule here—it's very much an art. But IRC offers an advantage in this regard. By setting the channel topic to the meeting's current topic, people have a visible reminder of what they should be talking about.
+
+If your project doesn't already conduct synchronous meetings, you should give it some thought. For projects with a diverse set of time zones, finding a mutually agreeable time to hold a meeting is hard. You can't rely on meetings as your only source of coordination. But they can be a valuable part of how your project works.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/irc-vs-irl-meetings
+
+作者:[Ben Cotton][a]
+选题:[lujun9972][b]
+译者:[lujun9972](https://github.com/lujun9972)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/bcotton
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Internet_Relay_Chat
+[2]: https://opensource.com/article/16/6/getting-started-irc
+[3]: https://wiki.debian.org/MeetBot
diff --git a/sources/talk/20190228 Why CLAs aren-t good for open source.md b/sources/talk/20190228 Why CLAs aren-t good for open source.md
new file mode 100644
index 0000000000..ca39619762
--- /dev/null
+++ b/sources/talk/20190228 Why CLAs aren-t good for open source.md
@@ -0,0 +1,76 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Why CLAs aren't good for open source)
+[#]: via: (https://opensource.com/article/19/2/cla-problems)
+[#]: author: (Richard Fontana https://opensource.com/users/fontana)
+
+Why CLAs aren't good for open source
+======
+Few legal topics in open source are as controversial as contributor license agreements.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/write-hand_0.jpg?itok=Uw5RJD03)
+
+Few legal topics in open source are as controversial as [contributor license agreements][1] (CLAs). Unless you count the special historical case of the [Fedora Project Contributor Agreement][2] (which I've always seen as an un-CLA), or, like [Karl Fogel][3], you classify the [DCO][4] as a [type of CLA][5], today Red Hat makes no use of CLAs for the projects it maintains.
+
+It wasn't always so. Red Hat's earliest projects followed the traditional practice I've called "inbound=outbound," in which contributions to a project are simply provided under the project's open source license with no execution of an external, non-FOSS contract required. But in the early 2000s, Red Hat began experimenting with the use of contributor agreements. Fedora started requiring contributors to sign a CLA based on the widely adapted [Apache ICLA][6], while a Free Software Foundation-derived copyright assignment agreement and a pair of bespoke CLAs were inherited from the Cygnus and JBoss acquisitions, respectively. We even took [a few steps][7] towards adopting an Apache-style CLA across the rapidly growing set of Red Hat-led projects.
+
+This came to an end, in large part because those of us on the Red Hat legal team heard and understood the concerns and objections raised by Red Hat engineers and the wider technical community. We went on to become de facto leaders of what some have called the anti-CLA movement, marked notably by our [opposition to Project Harmony][8] and our [efforts][9] to get OpenStack to replace its CLA with the DCO. (We [reluctantly][10] sign tolerable upstream project CLAs out of practical necessity.)
+
+### Why CLAs are problematic
+
+Our choice not to use CLAs is a reflection of our values as an authentic open source company with deep roots in the free software movement. Over the years, many in the open source community have explained why CLAs, and the very similar mechanism of copyright assignment, are a bad policy for open source.
+
+One reason is the red tape problem. Normally, open source development is characterized by frictionless contribution, which is enabled by inbound=outbound without imposition of further legal ceremony or process. This makes it relatively easy for new contributors to get involved in a project, allowing more effective growth of contributor communities and driving technical innovation upstream. Frictionless contribution is a key part of the advantage open source development holds over proprietary alternatives. But frictionless contribution is negated by CLAs. Having to sign an unusual legal agreement before a contribution can be accepted creates a bureaucratic hurdle that slows down development and discourages participation. This cost persists despite the growing use of automation by CLA-using projects.
+
+CLAs also give rise to an asymmetry of legal power among a project's participants, which also discourages the growth of strong contributor and user communities around a project. With Apache-style CLAs, the company or organization leading the project gets special rights that other contributors do not receive, while those other contributors must shoulder certain legal obligations (in addition to the red tape burden) from which the project leader is exempt. The problem of asymmetry is most severe in copyleft projects, but it is present even when the outbound license is permissive.
+
+When assessing the arguments for and against CLAs, bear in mind that today, as in the past, the vast majority of the open source code in any product originates in projects that follow the inbound=outbound practice. The use of CLAs by a relatively small number of projects causes collateral harm to all the others by signaling that, for some reason, open source licensing is insufficient to handle contributions flowing into a project.
+
+### The case for CLAs
+
+Since CLAs continue to be a minority practice and originate from outside open source community culture, I believe that CLA proponents should bear the burden of explaining why they are necessary or beneficial relative to their costs. I suspect that most companies using CLAs are merely emulating peer company behavior without critical examination. CLAs have an understandable, if superficial, appeal to risk-averse lawyers who are predisposed to favor greater formality, paper, and process regardless of the business costs. Still, some arguments in favor of CLAs are often advanced and deserve consideration.
+
+**Easy relicensing:** If administered appropriately, Apache-style CLAs give the project steward effectively unlimited power to sublicense contributions under terms of the steward's choice. This is sometimes seen as desirable because of the potential need to relicense a project under some other open source license. But the value of easy relicensing has been greatly exaggerated by pointing to a few historical cases involving major relicensing campaigns undertaken by projects with an unusually large number of past contributors (all of which were successful without the use of a CLA). There are benefits in relicensing being hard because it results in stable legal expectations around a project and encourages projects to consult their contributor communities before undertaking significant legal policy changes. In any case, most inbound=outbound open source projects never attempt to relicense during their lifetime, and for the small number that do, relicensing will be relatively painless because typically the number of past contributors to contact will not be large.
+
+**Provenance tracking:** It is sometimes claimed that CLAs enable a project to rigorously track the provenance of contributions, which purportedly has some legal benefit. It is unclear what is achieved by the use of CLAs in this regard that is not better handled through such non-CLA means as preserving Git commit history. And the DCO would seem to be much better suited to tracking contributions, given that it is normally used on a per-commit basis, while CLAs are signed once per contributor and are administratively separate from code contributions. Moreover, provenance tracking is often described as though it were a benefit for the public, yet I know of no case where a project provides transparent, ready public access to CLA acceptance records.
+
+**License revocation:** Some CLA advocates warn of the prospect that a contributor may someday attempt to revoke a past license grant. To the extent that the concern is about largely judgment-proof individual contributors with no corporate affiliation, it is not clear why an Apache-style CLA provides more meaningful protection against this outcome compared to the use of an open source license. And, as with so many of the legal risks raised in discussions of open source legal policy, this appears to be a phantom risk. I have heard of only a few purported attempts at license revocation over the years, all of which were resolved quickly when the contributor backed down in the face of community pressure.
+
+**Unauthorized employee contribution:** This is a special case of the license revocation issue and has recently become a point commonly raised by CLA advocates. When an employee contributes to an upstream project, normally the employer owns the copyrights and patents for which the project needs licenses, and only certain executives are authorized to grant such licenses. Suppose an employee contributed proprietary code to a project without approval from the employer, and the employer later discovers this and demands removal of the contribution or sues the project's users. This risk of unauthorized contributions is thought to be minimized by use of something like the [Apache CCLA][11] with its representations and signature requirement, coupled with some adequate review process to ascertain that the CCLA signer likely was authorized to sign (a step which I suspect is not meaningfully undertaken by most CLA-using companies).
+
+Based on common sense and common experience, I contend that in nearly all cases today, employee contributions are done with the actual or constructive knowledge and consent of the employer. If there were an atmosphere of high litigation risk surrounding open source software, perhaps this risk should be taken more seriously, but litigation arising out of open source projects remains remarkably uncommon.
+
+More to the point, I know of no case where an allegation of copyright or patent infringement against an inbound=outbound project, not stemming from an alleged open source license violation, would have been prevented by use of a CLA. Patent risk, in particular, is often cited by CLA proponents when pointing to the risk of unauthorized contributions, but the patent license grants in Apache-style CLAs are, by design, quite narrow in scope. Moreover, corporate contributions to an open source project will typically be few in number, small in size (and thus easily replaceable), and likely to be discarded as time goes on.
+
+### Alternatives
+
+If your company does not buy into the anti-CLA case and cannot get comfortable with the simple use of inbound=outbound, there are alternatives to resorting to an asymmetric and administratively burdensome Apache-style CLA requirement. The use of the DCO as a complement to inbound=outbound addresses at least some of the concerns of risk-averse CLA advocates. If you must use a true CLA, there is no need to use the Apache model (let alone a [monstrous derivative][10] of it). Consider the non-specification core of the [Eclipse Contributor Agreement][12]—essentially the DCO wrapped inside a CLA—or the Software Freedom Conservancy's [Selenium CLA][13], which merely ceremonializes an inbound=outbound contribution policy.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/2/cla-problems
+
+作者:[Richard Fontana][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/fontana
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/article/18/3/cla-vs-dco-whats-difference
+[2]: https://opensource.com/law/10/6/new-contributor-agreement-fedora
+[3]: https://www.red-bean.com/kfogel/
+[4]: https://developercertificate.org
+[5]: https://producingoss.com/en/contributor-agreements.html#developer-certificate-of-origin
+[6]: https://www.apache.org/licenses/icla.pdf
+[7]: https://www.freeipa.org/page/Why_CLA%3F
+[8]: https://opensource.com/law/11/7/trouble-harmony-part-1
+[9]: https://wiki.openstack.org/wiki/OpenStackAndItsCLA
+[10]: https://opensource.com/article/19/1/cla-proliferation
+[11]: https://www.apache.org/licenses/cla-corporate.txt
+[12]: https://www.eclipse.org/legal/ECA.php
+[13]: https://docs.google.com/forms/d/e/1FAIpQLSd2FsN12NzjCs450ZmJzkJNulmRC8r8l8NYwVW5KWNX7XDiUw/viewform?hl=en_US&formkey=dFFjXzBzM1VwekFlOWFWMjFFRjJMRFE6MQ#gid=0
diff --git a/sources/talk/20190301 What-s happening in the OpenStack community.md b/sources/talk/20190301 What-s happening in the OpenStack community.md
new file mode 100644
index 0000000000..28e3bf2fd3
--- /dev/null
+++ b/sources/talk/20190301 What-s happening in the OpenStack community.md
@@ -0,0 +1,73 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (What's happening in the OpenStack community?)
+[#]: via: (https://opensource.com/article/19/3/whats-happening-openstack)
+[#]: author: (Jonathan Bryce https://opensource.com/users/jonathan-bryce)
+
+What's happening in the OpenStack community?
+======
+
+In many ways, 2018 was a transformative year for the OpenStack Foundation.
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/travel-mountain-cloud.png?itok=ZKsJD_vb)
+
+Since 2010, the OpenStack community has been building open source software to run cloud computing infrastructure. Initially, the focus was public and private clouds, but open infrastructure has been pulled into many new important use cases like telecoms, 5G, and manufacturing IoT.
+
+As OpenStack software matured and grew in scope to support new technologies like bare metal provisioning and container infrastructure, the community widened its thinking to embrace users who deploy and run the software in addition to the developers who build the software. Questions like, "What problems are users trying to solve?" "Which technologies are users trying to integrate?" and "What are the gaps?" began to drive the community's thinking and decision making.
+
+In response to those questions, the OSF reorganized its approach and created a new "open infrastructure" framework focused on use cases, including edge, container infrastructure, CI/CD, and private and hybrid cloud. And, for the first time, the OSF is hosting open source projects outside of the OpenStack project.
+
+Following are three highlights from the [OSF 2018 Annual Report][1]; I encourage you to read the entire report for more detailed information about what's new.
+
+### Pilot projects
+
+On the heels of launching [Kata Containers][2] in December 2017, the OSF launched three pilot projects in 2018—[Zuul][3], [StarlingX][4], and [Airship][5]—that help further our goals of taking our technology into additional relevant markets. Each project follows the tenets we consider key to the success of true open source, [the Four Opens][6]: open design, open collaboration, open development, and open source. While these efforts are still new, they have been extremely valuable in helping us learn how we should expand the scope of the OSF, as well as showing others the kind of approach we will take.
+
+While the OpenStack project remained at the core of the team's focus, pilot projects are helping expand usage of open infrastructure across markets and already benefiting the OpenStack community. This has attracted dozens of new developers to the open infrastructure community, which will ultimately benefit the OpenStack community and users.
+
+There is direct benefit from these contributors working upstream in OpenStack, such as through StarlingX, as well as indirect benefit from the relationships we've built with the Kubernetes community through the Kata Containers project. Airship is similarly bridging the gaps between the Kubernetes and OpenStack ecosystems. This shows users how the technologies work together. A rise in contributions to Zuul has provided the engine for OpenStack CI and keeps our development running smoothly.
+
+### Containers collaboration
+
+In addition to investing in new pilot projects, we continued efforts to work with key adjacent projects in 2018, and we made particularly good progress with Kubernetes. OSF staffer Chris Hoge helps lead the cloud provider special interest group, where he has helped standardize how Kubernetes deployments expect to run on top of various infrastructure. This has clarified OpenStack's place in the Kubernetes ecosystem and led to valuable integration points, like having OpenStack as part of the Kubernetes release testing process.
+
+Additionally, OpenStack Magnum was certified as a Kubernetes installer by the CNCF. Through the Kata Containers community, we have deepened these relationships into additional areas within the container ecosystem resulting in a number of companies getting involved for the first time.
+
+### Evolving events
+
+We knew heading into 2018 that the environment around our events was changing and we needed to respond. During the year, we held two successful project team gatherings (PTGs) in Dublin and Denver, reaching capacity for both events while also including new projects and OpenStack operators. We held OpenStack Summits in Vancouver and Berlin, both experiencing increases in attendance and project diversity since Sydney in 2017, with each Summit including more than 30 open source projects. Recognizing this broader audience and the OSF's evolving strategy, the OpenStack Summit was renamed the [Open Infrastructure Summit][7], beginning with the Denver event coming up in April.
+
+In 2018, we boosted investment in China, onboarding a China Community Manager based in Shanghai and hosting a strategy day in Beijing with 30+ attendees from Gold and Platinum Members in China. This effort will continue in 2019 as we host our first Summit in China: the [Open Infrastructure Summit Shanghai][8] in November.
+
+We also worked with the community in 2018 to define a new model for events to maximize participation while saving on travel and expenses for the individuals and companies who are increasingly stretched across multiple open source communities. We arrived at a plan that we will implement and iterate on in 2019 where we will collocate PTGs as standalone events adjacent to our Open Infrastructure Summits.
+
+### Looking ahead
+
+We've seen impressive progress, but the biggest accomplishment might be in establishing a framework for the future of the foundation itself. In 2018, we advanced the open infrastructure mission by establishing OSF as an effective place to collaborate for CI/CD, container infrastructure, and edge computing, in addition to the traditional public and private cloud use cases. The open infrastructure approach opened a lot of doors in 2018, from the initial release of software from each pilot project, to live 5G demos, to engagement with hyperscale public cloud providers.
+
+Ultimately, our value comes from the effectiveness of our communities and the software they produce. As 2019 unfolds, our community is excited to apply learnings from 2018 to the benefit of developers, users, and the commercial ecosystem across all our projects.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/whats-happening-openstack
+
+作者:[Jonathan Bryce][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/jonathan-bryce
+[b]: https://github.com/lujun9972
+[1]: https://www.openstack.org/foundation/2018-openstack-foundation-annual-report
+[2]: https://katacontainers.io/
+[3]: https://zuul-ci.org/
+[4]: https://www.starlingx.io/
+[5]: https://www.airshipit.org/
+[6]: https://www.openstack.org/four-opens/
+[7]: https://www.openstack.org/summit/denver-2019/
+[8]: https://www.openstack.org/summit/shanghai-2019
diff --git a/sources/talk/20190306 How to pack an IT travel kit.md b/sources/talk/20190306 How to pack an IT travel kit.md
new file mode 100644
index 0000000000..b05ee460b7
--- /dev/null
+++ b/sources/talk/20190306 How to pack an IT travel kit.md
@@ -0,0 +1,100 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to pack an IT travel kit)
+[#]: via: (https://opensource.com/article/19/3/it-toolkit-remote)
+[#]: author: (Peter Cheer https://opensource.com/users/petercheer)
+
+How to pack an IT travel kit
+======
+Before you travel, make sure you're ready for challenges in hardware, infrastructure, and software.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/tools_sysadmin_cloud.png?itok=sUciG0Cn)
+
+I've had several opportunities to do IT work in less-developed and remote areas, where internet coverage and technology access aren't at the high level we have in our first-world cities. Many people heading off to undeveloped areas ask me for advice on preparing for the local technology landscape. Since conditions vary greatly around this big world, it's impossible to give specific advice for most areas, but I do have some general suggestions based on my experience that may help you.
+
+Also, before you leave home, do as much research as you can about the general IT and telecom environment where you are traveling so you're a little better prepared for what you may encounter there.
+
+### Planning for the local hardware and infrastructure
+
+ * Even in many cities, internet connections tend to be expensive, slow, and not reliable for large downloads. Don't forget that internet coverage, speeds, and cost in cities are unlikely to be matched in more remote areas.
+
+
+ * The electricity supply may be unreliable with inconsistent voltage. If you are taking your computer, bring some surge protection—although in my experience, the electricity voltage is more likely to drop than to spike.
+
+
+ * It is always useful to have a small selection of hand tools, such as screwdrivers and needle-nose pliers, for repairing computer hardware. A lack of spare parts can limit opportunities for much beyond basic troubleshooting, although stripping usable components from dead computers can be worthwhile.
+
+
+
+### Planning for the software you'll find
+
+ * You can assume that most of the computer systems you'll find will be some incarnation of Microsoft Windows. You can expect that many will not be officially licensed, not be getting updates nor security patches, and are infected by multiple viruses and other malware.
+
+
+ * You can also expect that most application software will be proprietary and much of it will be unlicensed and lag behind the latest release versions. These conditions are depressing for open source enthusiasts, but this is the world as it is, rather than the world we would like it to be.
+
+
+ * It is wise to view any Windows system you do not control as potentially infected with viruses and malware. It's good practice to reserve a USB thumb drive for files you'll use with these Windows systems; this means that if (or more likely when) that thumb drive becomes infected, you can just reformat it at no cost.
+
+
+ * Bring copies of free antivirus software such as [AVG][1] and [Avast][2], including recent virus definition files for them, as well as virus removal and repair tools such as [Sophos][3] and [Hirens Boot CD][4].
+
+
+ * Trying to keep software current on machines that have no or infrequent access to the internet is a challenge. This is particularly true with web browsers, which tend to go through rapid release cycles. My preferred web browser is Mozilla Firefox and having a copy of the latest release is useful.
+
+
+ * Bring repair discs for a selection of recent Microsoft operating systems, and make sure that includes service packs for Windows and Microsoft Office.
+
+
+
+### Planning for the software you'll bring
+
+There's no better way to convey the advantages of open source software than by showing it to people. Here are some recommendations along that line.
+
+ * When gathering software to take with you, make sure you get the full offline installation option. Often, the most prominently displayed download links on websites are stubs that require internet access to download the components. They won't work if you're in an area with poor (or no) internet service.
+
+
+ * Also, make sure to get the 32-bit and 64-bit versions of the software. While 32-bit machines are becoming less common, you may encounter them and it's best to be prepared.
+
+
+ * Having a [bootable version of Linux][5] is vital for two reasons. First, it can be used to rescue data from a seriously damaged Windows machine. Second, it's an easy way to show off Linux without installing it on someone's machine. [Linux Mint][6] is my favorite distro for this purpose, because the graphical interface (GUI) is similar enough to Windows to appear non-threatening and it includes a good range of application software.
+
+
+ * Bring the widest selection of open source applications you can—you can't count on being able to download something from the internet.
+
+
+ * When possible, bring your open source software library as portable applications that will run without installing them. One of the many ways to mess up those Windows machines is to install and uninstall a lot of software, and using portable apps gets around this problem. Many open source applications, including Libre Office, GIMP, Blender, and Inkscape, have portable app versions for Windows.
+
+
+ * It's smart to bring a supply of blank disks so you can give away copies of your open source software stash on media that is a bit more secure than a USB thumb drive.
+
+
+ * Don't forget to bring programs and resources related to projects you will be working on. (For example, most of my overseas work involves tuition, mentoring, and skills transfer, so I usually add a selection of open source software tools for creating learning resources.)
+
+
+
+### Your turn
+
+There are many variables and surprises when doing IT work in undeveloped areas. If you have suggestions—for programs I've missed or tips that I didn't cover—please share them in the comments.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/it-toolkit-remote
+
+作者:[Peter Cheer][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/petercheer
+[b]: https://github.com/lujun9972
+[1]: https://www.avg.com/en-gb/free-antivirus-download
+[2]: https://www.avast.com/en-gb/free-antivirus-download
+[3]: https://www.sophos.com/en-us/products/free-tools/virus-removal-tool.aspx
+[4]: https://www.hiren.info/
+[5]: https://opensource.com/article/18/7/getting-started-etcherio
+[6]: https://linuxmint.com/
diff --git a/sources/talk/20190307 Small Scale Scrum vs. Large Scale Scrum.md b/sources/talk/20190307 Small Scale Scrum vs. Large Scale Scrum.md
new file mode 100644
index 0000000000..7da83306a5
--- /dev/null
+++ b/sources/talk/20190307 Small Scale Scrum vs. Large Scale Scrum.md
@@ -0,0 +1,106 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Small Scale Scrum vs. Large Scale Scrum)
+[#]: via: (https://opensource.com/article/19/3/small-scale-scrum-vs-large-scale-scrum)
+[#]: author: (Agnieszka Gancarczyk https://opensource.com/users/agagancarczyk)
+
+Small Scale Scrum vs. Large Scale Scrum
+======
+We surveyed individual members of small and large scrum teams. Here are some key findings.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/BUSINESS_crowdvsopen.png?itok=AFjno_8v)
+
+Following the publication of the [Small Scale Scrum framework][1], we wanted to collect feedback on how teams in our target demographic (consultants, open source developers, and students) work and what they value. With this first opportunity to inspect, adapt, and help shape the next stage of Small Scale Scrum, we decided to create a survey to capture some data points and begin to validate some of our assumptions and hypotheses.
+
+**[[Download the Introduction to Small Scale Scrum guide]][2]**
+
+Our reasons for using the survey were multifold, but chief among them were the global distribution of teams, the small local data sample available in our office, access to customers, and the industry’s utilization of surveys (e.g., the [Stack Overflow Developer Survey 2018][3], [HackerRank 2018 Developer Skills Report][4], and [GitLab 2018 Global Developer Report][5]).
+
+The scrum’s iterative process was used to facilitate the creation of the survey shown below:
+
+![](https://opensource.com/sites/default/files/uploads/survey_process.png)
+
+[The survey][6], which we invite you to complete, consisted of 59 questions and was distributed at a local college ([Waterford Institute of Technology][7]) and to Red Hat's consultancy and engineering teams. Our initial data was gathered from the responses of 54 individuals spread across small and large scrum teams, who were asked about their experiences with agile within their teams.
+
+Here are the main results and initial findings of the survey:
+
+ * A full 96% of survey participants practice a form of agile, work in distributed teams, think scrum principles help them reduce development complexity, and believe agile contributes to the success of their projects.
+
+ * Only 8% of survey participants belong to small (one- to three-person) teams, and 10 out of 51 describe their typical project as short-lived (three months or less).
+
+ * The majority of survey participants were software engineers, but quality engineers (QE), project managers (PM), product owners (PO), and scrum masters were also represented.
+
+ * Scrum master, PO, and team member are typical roles in projects.
+
+ * Nearly half of survey respondents work on, or are assigned to, more than one project at the same time.
+
+ * Almost half of projects are customer/value-generating vs. improvement/not directly value-generating or unclassified.
+
+ * Almost half of survey participants said that their work is clarified sometimes or most of the time and estimated before development with extensions available sometimes or most of the time. They said asking for clarification of work items is the team’s responsibility.
+
+ * Almost half of survey respondents said they write tests for their code, and they adhere to best coding practices, document their code, and get their code reviewed before merging.
+
+ * Almost all survey participants introduce bugs to the codebase, which are prioritized by them, the team, PM, PO, team lead, or the scrum master.
+
+ * Participants ask for help and mentoring when a task is complex. They also take on additional roles on their projects when needed, including business analyst, PM, QE, and architect, and they sometimes find changing roles difficult.
+
+ * When changing roles on a daily basis, individuals feel they lose one to two hours on average, but they still complete their work on time most of the time.
+
+ * Most survey participants use scrum (65%), followed by hybrid (18%) and Kanban (12%). This is consistent with results of [VersionOne’s State of Agile Report][8].
+
+ * The daily standup, sprint, sprint planning and estimating, backlog grooming, and sprint retrospective are among the top scrum ceremonies and principles followed, and team members do preparation work before meetings.
+
+ * The majority of sprints (62%) are three weeks long, followed by two-week sprints (26%), one-week sprints (6%), and four-week sprints (4%). Two percent of participants are not using sprints due to strict release and update timings, with all activities organized and planned around those dates.
+
+ * Teams use [planning poker][9] to estimate (storypoint) user stories. User stories contain acceptance criteria.
+
+ * Teams create and use a [Definition of Done][10] mainly in respect to features and determining completion of user stories.
+
+ * The majority of teams don’t have or use a [Definition of Ready][11] to ensure that user stories are actionable, testable, and clear.
+
+ * Unit, integration, functional, automated, performance/load, and acceptance tests are commonly used.
+
+ * Overall collaboration between team members is considered high, and team members use various communication channels.
+
+ * The majority of survey participants spend more than four hours weekly in meetings, including face-to-face meetings, web conferences, and email communication.
+
+ * The majority of customers are considered large, and half of them understand and follow scrum principles.
+
+ * Customers respect “no deadlines” most of the time and sometimes help create user stories and participate in sprint planning, sprint review and demonstration, sprint retrospective, and backlog review and refinement.
+
+ * Only 27% of survey participants know their customers have a high level of satisfaction with the adoption of agile, while the majority (58%) don’t know this information at all.
+
+
+
+
+These survey results will inform the next stage of our data-gathering exercise. We will apply Small Scale Scrum to real-world projects, and the guidance obtained from the survey will help us gather key data points as we move toward version 2.0 of Small Scale Scrum. If you want to help, take our [survey][6]. If you have a project to which you'd like to apply Small Scale Scrum, please get in touch.
+
+[Download the Introduction to Small Scale Scrum guide][2]
+
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/small-scale-scrum-vs-large-scale-scrum
+
+作者:[Agnieszka Gancarczyk][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/agagancarczyk
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/article/19/2/small-scale-scrum-framework
+[2]: https://opensource.com/downloads/small-scale-scrum
+[3]: https://insights.stackoverflow.com/survey/2018/
+[4]: https://research.hackerrank.com/developer-skills/2018/
+[5]: https://about.gitlab.com/developer-survey/2018/
+[6]: https://docs.google.com/forms/d/e/1FAIpQLScAXf52KMEiEzS68OOIsjLtwZJto_XT7A3b9aB0RhasnE_dEw/viewform?c=0&w=1
+[7]: https://www.wit.ie/
+[8]: https://explore.versionone.com/state-of-agile/versionone-12th-annual-state-of-agile-report
+[9]: https://en.wikipedia.org/wiki/Planning_poker
+[10]: https://www.scruminc.com/definition-of-done/
+[11]: https://www.scruminc.com/definition-of-ready/
diff --git a/sources/talk/20190311 Discuss everything Fedora.md b/sources/talk/20190311 Discuss everything Fedora.md
new file mode 100644
index 0000000000..5795fbf3f7
--- /dev/null
+++ b/sources/talk/20190311 Discuss everything Fedora.md
@@ -0,0 +1,45 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Discuss everything Fedora)
+[#]: via: (https://fedoramagazine.org/discuss-everything-fedora/)
+[#]: author: (Ryan Lerch https://fedoramagazine.org/introducing-flatpak/)
+
+Discuss everything Fedora
+======
+![](https://fedoramagazine.org/wp-content/uploads/2019/03/fedora-discussion-816x345.jpg)
+
+Are you interested in how Fedora is being developed? Do you want to get involved, or see what goes into making a release? You want to check out [Fedora Discussion][1]. It is a relatively new place where members of the Fedora Community meet to discuss, ask questions, and interact. Keep reading for more information.
+
+Note that the Fedora Discussion system is mainly aimed at contributors. If you have questions on using Fedora, check out [Ask Fedora][2] (which is being migrated in the future).
+
+![][3]
+
+Fedora Discussion is a forum and discussion site that uses the [Discourse open source discussion platform][4].
+
+There are already several categories useful for Fedora users, including [Desktop][5] (covering Fedora Workstation, Fedora Silverblue, KDE, XFCE, and more) and the [Server, Cloud, and IoT][6] category . Additionally, some of the [Fedora Special Interest Groups (SIGs) have discussions as well][7]. Finally, the [Fedora Friends][8] category helps you connect with other Fedora users and Community members by providing discussions about upcoming meetups and hackfests.
+
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/discuss-everything-fedora/
+
+作者:[Ryan Lerch][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/introducing-flatpak/
+[b]: https://github.com/lujun9972
+[1]: https://discussion.fedoraproject.org/
+[2]: https://ask.fedoraproject.org
+[3]: https://fedoramagazine.org/wp-content/uploads/2019/03/discussion-screenshot-1024x663.png
+[4]: https://www.discourse.org/about
+[5]: https://discussion.fedoraproject.org/c/desktop
+[6]: https://discussion.fedoraproject.org/c/server
+[7]: https://discussion.fedoraproject.org/c/sigs
+[8]: https://discussion.fedoraproject.org/c/friends
diff --git a/sources/talk/20190312 When the web grew up- A browser story.md b/sources/talk/20190312 When the web grew up- A browser story.md
new file mode 100644
index 0000000000..6a168939ad
--- /dev/null
+++ b/sources/talk/20190312 When the web grew up- A browser story.md
@@ -0,0 +1,65 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (When the web grew up: A browser story)
+[#]: via: (https://opensource.com/article/19/3/when-web-grew)
+[#]: author: (Mike Bursell https://opensource.com/users/mikecamel)
+
+When the web grew up: A browser story
+======
+A personal story of when the internet came of age.
+
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/OSDC_Internet_Sign.png?itok=5MFGKs14)
+
+Recently, I [shared how][1] upon leaving university in 1994 with a degree in English literature and theology, I somehow managed to land a job running a web server in a world where people didn't really know what a web server was yet. And by "in a world," I don't just mean within the organisation in which I worked, but the world in general. The web was new—really new—and people were still trying to get their heads around it.
+
+That's not to suggest that the place where I was working—an academic publisher—particularly "got it" either. This was a world in which a large percentage of the people visiting their website were still running 28k8 modems. I remember my excitement in getting a 33k6 modem. At least we were past the days of asymmetric upload/download speeds,1 where 1200/300 seemed like an eminently sensible bandwidth description. This meant that the high-design, high-colour, high-resolution documents created by the print people (with whom I shared a floor) were completely impossible on the web. I wouldn't allow anything bigger than a 40k GIF on the front page of the website, and that was pushing it for many of our visitors. Anything larger than 60k or so would be explicitly linked as a standalone image from a thumbnail on the referring page.
+
+To say that the marketing department didn't like this was an understatement. Even worse was the question of layout. "Browsers decide how to lay out documents," I explained, time after time, "you can use headers or paragraphs, but how documents appear on the page isn't defined by the document, but by the renderer!" They wanted control. They wanted different coloured backgrounds. After a while, they got that. I went to what I believe was the first W3C meeting at which the idea of Cascading Style Sheets (CSS) was discussed. And argued vehemently against them. The suggestion that document writers should control layout was anathema.2 It took some while for CSS to be adopted, and in the meantime, those who cared about such issues adopted the security trainwreck that was Portable Document Format (PDF).
+
+How documents were rendered wasn't the only issue. Being a publisher of actual physical books, the whole point of having a web presence, as far as the marketing department was concerned, was to allow customers—or potential customers—to know not only what a book was about, but also how much it was going to cost them to buy. This, however, presented a problem. You see, the internet—in which I include the rapidly growing World Wide Web—was an open, free-for-all libertarian sort of place where nobody was interested in money; in fact, where talk of money was to be shunned and avoided.
+
+I took the mainstream "Netizen" view that there was no place for pricing information online. My boss—and, indeed, pretty much everybody else in the organisation—took a contrary view. They felt that customers should be able to see how much books would cost them. They also felt that my bank manager would like to see how much money was coming into my bank account on a monthly basis, which might be significantly reduced if I didn't come round to their view.
+
+Luckily, by the time I'd climbed down from my high horse and got over myself a bit—probably only a few weeks after I'd started digging my heels in—the web had changed, and there were other people putting pricing information up about their products. These newcomers were generally looked down upon by the old schoolers who'd been running web servers since the early days,3 but it was clear which way the wind was blowing. This didn't mean that the battle was won for our website, however. As an academic publisher, we shared an academic IP name ("ac.uk") with the University. The University was less than convinced that publishing pricing information was appropriate until some senior folks at the publisher pointed out that Princeton University Press was doing it, and wouldn't we look a bit silly if…?
+
+The fun didn't stop there, either. A few months into my tenure as webmaster ("webmaster@…"), we started to see a worrying trend, as did lots of other websites. Certain visitors were single-handedly bringing our webserver to its knees. These visitors were running a new web browser: Netscape. Netscape was badly behaved. Netscape was multi-threaded.
+
+Why was this an issue? Well, before Netscape, all web browsers had been single-threaded. They would open one connection at a time, so even if you had, say five GIFs on a page,4 they would request the HTML base file, parse that, then download the first GIF, complete that, then the second, complete that, and so on. In fact, they often did the GIFs in the wrong order, which made for very odd page loading, but still, that was the general idea. The rude people at Netscape decided that they could open multiple connections to the webserver at a time to request all the GIFs at the same time, for example! And why was this a problem? Well, the problem was that most webservers were single-threaded. They weren't designed to have multiple connections open at any one time. Certainly, the HTTP server that we ran (MacHTTP) was single-threaded. Even though we had paid for it (it was originally shareware), the version we had couldn't cope with multiple requests at a time.
+
+The debate raged across the internet. Who did these Netscape people think they were, changing how the world worked? How it was supposed to work? The world settled into different camps, and as with all technical arguments, heated words were exchanged on both sides. The problem was that not only was Netscape multi-threaded, it was also just better than the alternatives. Lots of web server code maintainers, MacHTTP author Chuck Shotton among them, sat down and did some serious coding to produce multi-threaded beta versions of their existing code. Everyone moved almost immediately to the beta versions, they got stable, and in the end, single-threaded browsers either adapted and became multi-threaded themselves, or just went the way of all outmoded products and died a quiet death.6
+
+This, for me, is when the web really grew up. It wasn't prices on webpages nor designers being able to define what you'd see on a page,8 but rather when browsers became easier to use and when the network effect of thousands of viewers moving to many millions tipped the balance in favour of the consumer, not the producer. There were more steps in my journey—which I'll save for another time—but from around this point, my employers started looking at our monthly, then weekly, then daily logs, and realising that this was actually going to be something big and that they'd better start paying some real attention.
+
+1\. How did they come back, again?
+
+2\. It may not surprise you to discover that I'm still happiest at the command line.
+
+3\. About six months before.
+
+4\. Reckless, true, but it was beginning to happen.5
+
+5\. Oh, and no—it was GIFs or BMP. JPEG was still a bright idea that hadn't yet taken off.
+
+6\. It's never actually quiet: there are always a few diehard enthusiasts who insist that their preferred solution is technically superior and bemoan the fact that the rest of the internet has gone to the devil.7
+
+7\. I'm not one to talk: I still use Lynx from time to time.
+
+8\. Creating major and ongoing problems for those with different accessibility needs, I would point out.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/19/3/when-web-grew
+
+作者:[Mike Bursell][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/mikecamel
+[b]: https://github.com/lujun9972
+[1]: https://opensource.com/article/18/11/how-web-was-won
diff --git a/sources/talk/20190313 Why is no one signing their emails.md b/sources/talk/20190313 Why is no one signing their emails.md
new file mode 100644
index 0000000000..b2b862951a
--- /dev/null
+++ b/sources/talk/20190313 Why is no one signing their emails.md
@@ -0,0 +1,104 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Why is no one signing their emails?)
+[#]: via: (https://arp242.net/weblog/signing-emails.html)
+[#]: author: (Martin Tournoij https://arp242.net/)
+
+Why is no one signing their emails?
+======
+
+
+I received this email a while ago:
+
+> Queensland University of Technology sent you an Amazon.com Gift Card!
+>
+> You’ve received an Amazon.com gift card! You’ll need the claim code below to place your order.
+>
+> Happy shopping!
+
+Queensland University of Technology? Why would they send me anything? Where is that even? Australia right? That’s the other side of the world! Looks like spam!
+
+It did look pretty good for spam, so I took a second look. And a very close third look, and then I decided it wasn’t spam.
+
+I was still confused why they sent me this. A week later I remembered: half a year prior I had done an interview regarding my participation on Stack Overflow for someone’s paper; she was studying somewhere in Australia – presumably the university of Queensland. No one had ever mentioned anything about a reward or Amazon gift card so I wasn’t expecting it. It’s a nice bonus though.
+
+Here’s the thing: I’ve spent several years professionally developing email systems; I administered email servers; I read all the relevant RFCs. While there are certainly people who are more knowledgable, I know more about email than the vast majority of the population. And I still had to take a careful look to verify the email wasn’t a phishing attempt.
+
+And I’m not even a target; I’m just this guy, you know? [Ask John Podesta what it is to be targeted][1]:
+
+> SecureWorks concluded Fancy Bear had sent Podesta an email on March 19, 2016, that had the appearance of a Google security alert, but actually contained a misleading link—a strategy known as spear-phishing. [..] The email was initially sent to the IT department as it was suspected of being a fake but was described as “legitimate” in an e-mail sent by a department employee, who later said he meant to write “illegitimate”.
+
+Yikes! If I was even remotely high-profile I’d be crazy paranoid about all emails I get.
+
+It seems to me that there is a fairly easy solution to verify the author of an email: sign it with a digital signature; PGP is probably the best existing solution right now. I don’t even care about encryption here, just signing to prevent phishing.
+
+PGP has a well-deserved reputation for being hard, but that’s only for certain scenarios. A lot of the problems/difficulties stem from trying to accommodate the “random person A emails random person B” use case, but this isn’t really what I care about here. “Large company with millions of users sends thousands of emails daily” is a very different use case.
+
+Much of the key exchange/web-of-trust dilemma can be bypassed by shipping email clients with keys for large organisations (PayPal, Google, etc.) baked in, like browsers do with some certificates. Even just publishing your key on your website (or, if you’re a bank, in local branches etc.) is already a lot better than not signing anything at all. Right now there seems to be a catch-22 scenario: clients don’t implement better support as very few people are using PGP, while very few companies bother signing their emails with PGP because so few people can benefit from it.
+
+On the end-user side, things are also not very hard; we’re just conceded with validating signatures, nothing more. For this purpose PGP isn’t hard. It’s like verifying your Linux distro’s package system: all of them sign their packages (usually with PGP) and they get verified on installation, but as an end-user I never see it unless something goes wrong.
+
+There are many aspects of PGP that are hard to set up and manage, but verifying signatures isn’t one of them. The user-visible part of this is very limited. Remember, no one is expected to sign their own emails: just verify that the signature is correct (which the software will do). Conceptually, it’s not that different from verifying a handwritten signature.
+
+DKIM and SPF already exist and are useful, but limited. All both do is verify that an email which claims to be from `amazon.com` is really from `amazon.com`. If I send an email from `mail.amazon-account-security.com` or `amazonn.com` then it just verifies that it was sent from that domain, not that it was sent from the organisation Amazon.
+
+What I am proposing is subtly different. In my (utopian) future every serious organisation will sign their email with PGP (just like every serious organisation uses https). Then every time I get an email which claims to be from Amazon I can see it’s either not signed, or not signed by a key I know. If adoption is broad enough we can start showing warnings such as “this email wasn’t signed, do you want to trust it?” and “this signature isn’t recognized, yikes!”
+
+There’s also S/MIME, which has better client support and which works more or less the same as HTTPS: you get a certificate from the Certificate Authority Mafia, sign your email with it, and presto. The downside of this is that anyone can sign their emails with a valid key, which isn’t necessarily telling you much (just because haxx0r.ru has a certificate doesn’t mean it’s trustworthy).
+
+Is it perfect? No. I understand stuff like key exchange is hard and that baking in keys isn’t perfect. Is it better? Hell yes. Would probably have avoided Podesta and the entire Democratic Party a lot of trouble. Here’s a “[sophisticated new phishing campaign][2]” targeted at PayPal users. How “sophisticated”? Well, by not having glaring stupid spelling errors, duplicating the PayPal layout in emails, duplicating the PayPal login screen, a few forms, and getting an SSL certificate. Truly, the pinnacle of Computer Science.
+
+Okay sure, they spent some effort on it; but any nincompoop can do it; if this passes for “sophisticated phishing” where “it’s easy to see how users could be fooled” then the bar is pretty low.
+
+I can’t recall receiving a single email from any organisation that is signed (much less encrypted). Banks, financial services, utilities, immigration services, governments, tax services, voting registration, Facebook, Twitter, a zillion websites … all happily sent me emails hoping I wouldn’t consider them spam and hoping I wouldn’t confuse a phishing email for one of theirs.
+
+Interesting experiment: send invoices for, say, a utility bill for a local provider. Just copy the layout from the last utility bill you received. I’ll bet you’ll make more money than freelancing on UpWork if you do it right.
+
+I’ve been intending to write this post for years, but never quite did because “surely not everyone is stupid?” I’m not a crypto expert, so perhaps I’m missing something here, but I wouldn’t know what. Let me know if I am.
+
+In the meanwhile PayPal is attempting to solve the problem by publishing [articles which advise you to check for spelling errors][3]. Okay, it’s good advice, but do we really want this to be the barrier between an attacker and your money? Or Russian hacking groups and your emails? Anyone can sign any email with any key, but “unknown signature” warnings strike me as a lot better UX than “carefully look for spelling errors or misleading domain names”.
+
+The way forward is to make it straight-forward to implement signing in apps and then just do it as a developer, whether asked or not; just as you set up https whether you’re asked or not. I’ll write a follow-up with more technical details later, assuming no one pokes holes in this article :-)
+
+#### Response to some feedback
+
+Some response to some feedback that I couldn’t be bothered to integrate in the article’s prose:
+
+ * “You can’t trust webmail with crypto!”
+If you use webmail then you’re already trusting the email provider with everything. What’s so bad with trusting them to verify a signature, too?
+
+We’re not communicating state secrets over encrypted email here; we’re just verifying the signature on “PayPal sent you a message, click here to view it”-kind of emails.
+
+ * “Isn’t this ignoring the massive problem that is key management?”
+Yes, it’s hard problem; but that doesn’t mean it can’t be done. I already mentioned some possible solutions in the article.
+
+
+
+
+**Footnotes**
+
+ 1. We could make something better; PGP contians a lot of cruft. But for now PGP is “good enough”.
+
+
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://arp242.net/weblog/signing-emails.html
+
+作者:[Martin Tournoij][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://arp242.net/
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Podesta_emails#Data_theft
+[2]: https://www.eset.com/us/about/newsroom/corporate-blog/paypal-users-targeted-in-sophisticated-new-phishing-campaign/
+[3]: https://www.paypal.com/cs/smarthelp/article/how-to-spot-fake,-spoof,-or-phishing-emails-faq2340
diff --git a/sources/talk/20190314 A Look Back at the History of Firefox.md b/sources/talk/20190314 A Look Back at the History of Firefox.md
new file mode 100644
index 0000000000..f4118412b4
--- /dev/null
+++ b/sources/talk/20190314 A Look Back at the History of Firefox.md
@@ -0,0 +1,115 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (A Look Back at the History of Firefox)
+[#]: via: (https://itsfoss.com/history-of-firefox)
+[#]: author: (John Paul https://itsfoss.com/author/john/)
+
+A Look Back at the History of Firefox
+======
+
+The Firefox browser has been a mainstay of the open-source community for a long time. For many years it was the default web browser on (almost) all Linux distros and the lone obstacle to Microsoft’s total dominance of the internet. This browser has roots that go back all the way to the very early days of the internet. Since this week marks the 30th anniversary of the internet, there is no better time to talk about how Firefox became the browser we all know and love.
+
+### Early Roots
+
+In the early 1990s, a young man named [Marc Andreessen][1] was working on his bachelor’s degree in computer science at the University of Illinois. While there, he started working for the [National Center for Supercomputing Applications][2]. During that time [Sir Tim Berners-Lee][3] released an early form of the web standards that we know today. Marc [was introduced][4] to a very primitive web browser named [ViolaWWW][5]. Seeing that the technology had potential, Marc and Eric Bina created an easy to install browser for Unix named [NCSA Mosaic][6]). The first alpha was released in June 1993. By September, there were ports to Windows and Macintosh. Mosaic became very popular because it was easier to use than other browsing software.
+
+In 1994, Marc graduated and moved to California. He was approached by Jim Clark, who had made his money selling computer hardware and software. Clark had used Mosaic and saw the financial possibilities of the internet. Clark recruited Marc and Eric to start an internet software company. The company was originally named Mosaic Communications Corporation, however, the University of Illinois did not like [their use of the name Mosaic][7]. As a result, the company name was changed to Netscape Communications Corporation.
+
+The company’s first project was an online gaming network for the Nintendo 64, but that fell through. The first product they released was a web browser named Mosaic Netscape 0.9, subsequently renamed Netscape Navigator. Internally, the browser project was codenamed mozilla, which stood for “Mosaic killer”. An employee created a cartoon of a [Godzilla like creature][8]. They wanted to take out the competition.
+
+![Early Firefox Mascot][9]Early Mozilla mascot at Netscape
+
+They succeed mightily. At the time, one of the biggest advantages that Netscape had was the fact that its browser looked and functioned the same on every operating system. Netscape described this as giving everyone a level playing field.
+
+As usage of Netscape Navigator increase, the market share of NCSA Mosaic cratered. In 1995, Netscape went public. [On the first day][10], the stock started at $28, jumped to $75 and ended the day at $58. Netscape was without any rivals.
+
+But that didn’t last for long. In the summer of 1994, Microsoft released Internet Explorer 1.0, which was based on Spyglass Mosaic which was based on NCSA Mosaic. The [browser wars][11] had begun.
+
+Over the next few years, Netscape and Microsoft competed for dominance of the internet. Each added features to compete with the other. Unfortunately, Internet Explorer had an advantage because it came bundled with Windows. On top of that, Microsoft had more programmers and money to throw at the problem. Toward the end of 1997, Netscape started to run into financial problems.
+
+### Going Open Source
+
+![Mozilla Firefox][12]
+
+In January 1998, Netscape open-sourced the code of the Netscape Communicator 4.0 suite. The [goal][13] was to “harness the creative power of thousands of programmers on the Internet by incorporating their best enhancements into future versions of Netscape’s software. This strategy is designed to accelerate development and free distribution by Netscape of future high-quality versions of Netscape Communicator to business customers and individuals.”
+
+The project was to be shepherded by the newly created Mozilla Organization. However, the code from Netscape Communicator 4.0 proved to be very difficult to work with due to its size and complexity. On top of that, several parts could not be open sourced because of licensing agreements with third parties. In the end, it was decided to rewrite the browser from scratch using the new [Gecko][14]) rendering engine.
+
+In November 1998, Netscape was acquired by AOL for [stock swap valued at $4.2 billion][15].
+
+Starting from scratch was a major undertaking. Mozilla Firefox (initially nicknamed Phoenix) was created in June 2002 and it worked on multiple operating systems, such as Linux, Mac OS, Microsoft Windows, and Solaris.
+
+The following year, AOL announced that they would be shutting down browser development. The Mozilla Foundation was subsequently created to handle the Mozilla trademarks and handle the financing of the project. Initially, the Mozilla Foundation received $2 million in donations from AOL, IBM, Sun Microsystems, and Red Hat.
+
+In March 2003, Mozilla [announced pl][16][a][16][ns][16] to separate the suite into stand-alone applications because of creeping software bloat. The stand-alone browser was initially named Phoenix. However, the name was changed due to a trademark dispute with the BIOS manufacturer Phoenix Technologies, which had a BIOS-based browser named trademark dispute with the BIOS manufacturer Phoenix Technologies. Phoenix was renamed Firebird only to run afoul of the Firebird database server people. The browser was once more renamed to the Firefox that we all know.
+
+At the time, [Mozilla said][17], “We’ve learned a lot about choosing names in the past year (more than we would have liked to). We have been very careful in researching the name to ensure that we will not have any problems down the road. We have begun the process of registering our new trademark with the US Patent and Trademark office.”
+
+![Mozilla Firefox 1.0][18]Firefox 1.0 : [Picture Credit][19]
+
+The first official release of Firefox was [0.8][20] on February 8, 2004. 1.0 followed on November 9, 2004. Version 2.0 and 3.0 followed in October 2006 and June 2008 respectively. Each major release brought with it many new features and improvements. In many respects, Firefox pulled ahead of Internet Explorer in terms of features and technology, but IE still had more users.
+
+That changed with the release of Google’s Chrome browser. In the months before the release of Chrome in September 2008, Firefox accounted for 30% of all [browser usage][21] and IE had over 60%. According to StatCounter’s [January 2019 report][22], Firefox accounts for less than 10% of all browser usage, while Chrome has over 70%.
+
+Fun Fact
+
+Contrary to popular belief, the logo of Firefox doesn’t feature a fox. It’s actually a [Red Panda][23]. In Chinese, “fire fox” is another name for the red panda.
+
+### The Future
+
+As noted above, Firefox currently has the lowest market share in its recent history. There was a time when a bunch of browsers were based on Firefox, such as the early version of the [Flock browser][24]). Now most browsers are based on Google technology, such as Opera and Vivaldi. Even Microsoft is giving up on browser development and [joining the Chromium band wagon][25].
+
+This might seem like quite a downer after the heights of the early Netscape years. But don’t forget what Firefox has accomplished. A group of developers from around the world have created the second most used browser in the world. They clawed 30% market share away from Microsoft’s monopoly, they can do it again. After all, they have us, the open source community, behind them.
+
+The fight against the monopoly is one of the several reasons [why I use Firefox][26]. Mozilla regained some of its lost market-share with the revamped release of [Firefox Quantum][27] and I believe that it will continue the upward path.
+
+What event from Linux and open source history would you like us to write about next? Please let us know in the comments below.
+
+If you found this article interesting, please take a minute to share it on social media, Hacker News or [Reddit][28].
+
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/history-of-firefox
+
+作者:[John Paul][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://itsfoss.com/author/john/
+[b]: https://github.com/lujun9972
+[1]: https://en.wikipedia.org/wiki/Marc_Andreessen
+[2]: https://en.wikipedia.org/wiki/National_Center_for_Supercomputing_Applications
+[3]: https://en.wikipedia.org/wiki/Tim_Berners-Lee
+[4]: https://www.w3.org/DesignIssues/TimBook-old/History.html
+[5]: http://viola.org/
+[6]: https://en.wikipedia.org/wiki/Mosaic_(web_browser
+[7]: http://www.computinghistory.org.uk/det/1789/Marc-Andreessen/
+[8]: http://www.davetitus.com/mozilla/
+[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/Mozilla_boxing.jpg?ssl=1
+[10]: https://www.marketwatch.com/story/netscape-ipo-ignited-the-boom-taught-some-hard-lessons-20058518550
+[11]: https://en.wikipedia.org/wiki/Browser_wars
+[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/mozilla-firefox.jpg?resize=800%2C450&ssl=1
+[13]: https://web.archive.org/web/20021001071727/wp.netscape.com/newsref/pr/newsrelease558.html
+[14]: https://en.wikipedia.org/wiki/Gecko_(software)
+[15]: http://news.cnet.com/2100-1023-218360.html
+[16]: https://web.archive.org/web/20050618000315/http://www.mozilla.org/roadmap/roadmap-02-Apr-2003.html
+[17]: https://www-archive.mozilla.org/projects/firefox/firefox-name-faq.html
+[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/03/firefox-1.jpg?ssl=1
+[19]: https://www.iceni.com/blog/firefox-1-0-introduced-2004/
+[20]: https://en.wikipedia.org/wiki/Firefox_version_history
+[21]: https://en.wikipedia.org/wiki/Usage_share_of_web_browsers
+[22]: http://gs.statcounter.com/browser-market-share/desktop/worldwide/#monthly-201901-201901-bar
+[23]: https://en.wikipedia.org/wiki/Red_panda
+[24]: https://en.wikipedia.org/wiki/Flock_(web_browser
+[25]: https://www.windowscentral.com/microsoft-building-chromium-powered-web-browser-windows-10
+[26]: https://itsfoss.com/why-firefox/
+[27]: https://itsfoss.com/firefox-quantum-ubuntu/
+[28]: http://reddit.com/r/linuxusersgroup
+[29]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/03/mozilla-firefox.jpg?fit=800%2C450&ssl=1
diff --git a/sources/tech/20150616 Computer Laboratory - Raspberry Pi- Lesson 10 Input01.md b/sources/tech/20150616 Computer Laboratory - Raspberry Pi- Lesson 10 Input01.md
deleted file mode 100644
index eb0f8091d4..0000000000
--- a/sources/tech/20150616 Computer Laboratory - Raspberry Pi- Lesson 10 Input01.md
+++ /dev/null
@@ -1,496 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (ezio )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Computer Laboratory – Raspberry Pi: Lesson 10 Input01)
-[#]: via: (https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/input01.html)
-[#]: author: (Alex Chadwick https://www.cl.cam.ac.uk)
-
-ezio is translating
-
-Computer Laboratory – Raspberry Pi: Lesson 10 Input01
-======
-
-Welcome to the Input lesson series. In this series, you will learn how to receive inputs to the Raspberry Pi using the keyboard. We will start with just revealing the input, and then move to a more traditional text prompt.
-
-This first input lesson teaches some theory about drivers and linking, as well as about keyboards and ends up displaying text on the screen.
-
-### 1 Getting Started
-
-It is expected that you have completed the OK series, and it would be helpful to have completed the Screen series. Many of the files from that series will be called, without comment. If you do not have these files, or prefer to use a correct implementation, download the template for this lesson from the [Downloads][1] page. If you're using your own implementation, please remove everything after your call to SetGraphicsAddress.
-
-### 2 USB
-
-```
-The USB standard was designed to make simple hardware in exchange for complex software.
-```
-
-As you are no doubt aware, the Raspberry Pi model B has two USB ports, commonly used for connecting a mouse and keyboard. This was a very good design decision, USB is a very generic connector, and many different kinds of device use it. It's simple to build new devices for, simple to write device drivers for, and is highly extensible thanks to USB hubs. Could it get any better? Well, no, in fact for an Operating Systems developer this is our worst nightmare. The USB standard is huge. I really mean it this time, it is over 700 pages, before you've even thought about connecting a device.
-
-I spoke to a number of other hobbyist Operating Systems developers about this and they all say one thing: don't bother. "It will take too long to implement", "You won't be able to write a tutorial on it" and "It will be of little benefit". In many ways they are right, I'm not able to write a tutorial on the USB standard, as it would take weeks. I also can't teach how to write device drivers for all the different devices, so it is useless on its own. However, I can do the next best thing: Get a working USB driver, get a keyboard driver, and then teach how to use these in an Operating System. I set out searching for a free driver that would run in an operating system that doesn't even know what a file is yet, but I couldn't find one. They were all too high level. So, I attempted to write one. Everybody was right, this took weeks to do. However, I'm pleased to say I did get one that works with no external help from the Operating System, and can talk to a mouse and keyboard. It is by no means complete, efficient, or correct, but it does work. It has been written in C and the full source code can be found on the downloads page for those interested.
-
-So, this tutorial won't be a lesson on the USB standard (at all). Instead we'll look at how to work with other people's code.
-
-### 3 Linking
-
-```
-Linking allows us to make reusable code 'libraries' that anyone can use in their program.
-```
-
-Since we're about to incorporate external code into the Operating System, we need to talk about linking. Linking is a process which is applied to programs or Operating System to link in functions. What this means is that when a program is made, we don't necessarily code every function (almost certainly not in fact). Linking is what we do to make our program link to functions in other people's code. This has actually been going on all along in our Operating Systems, as the linker links together all of the different files, each of which is compiled separately.
-
-```
-Programs often just call libraries, which call other libraries and so on until eventually they call an Operating System library which we would write.
-```
-
-There are two types of linking: static and dynamic. Static linking is like what goes on when we make our Operating Systems. The linker finds all the addresses of the functions, and writes them into the code, before the program is finished. Dynamic linking is linking that occurs after the program is 'complete'. When it is loaded, the dynamic linker goes through the program and links any functions which are not in the program to libraries in the Operating System. This is one of the jobs our Operating System should eventually be capable of, but for now everything will be statically linked.
-
-The USB driver I have written is suitable for static linking. This means I give you the compiled code for each of my files, and then the linker finds functions in your code which are not defined in your code, and links them to functions in my code. On the [Downloads][1] page for this lesson is a makefile and my USB driver, which you will need to continue. Download them and replace the makefile in your code with this one, and also put the driver in the same folder as that makefile.
-
-### 4 Keyboards
-
-In order to get input into our Operating System, we need to understand at some level how keyboards actually work. Keyboards have two types of keys: Normal and Modifier keys. The normal keys are the letters, numbers, function keys, etc. They constitute almost every key on the keyboard. The modifiers are up to 8 special keys. These are left shift, right shift, left control, right control, left alt, right alt, left GUI and right GUI. The keyboard can detect any combination of the modifier keys being held, as well as up to 6 normal keys. Every time a key changes (i.e. is pushed or released), it reports this to the computer. Typically, keyboards also have three LEDs for Caps Lock, Num Lock and Scroll Lock, which are controlled by the computer, not the keyboard itself. Keyboards may have many more lights such as power, mute, etc.
-
-In order to help standardise USB keyboards, a table of values was produced, such that every keyboard key ever is given a unique number, as well as every conceivable LED. The table below lists the first 126 of values.
-
-Table 4.1 USB Keyboard Keys
-| Number | Description | Number | Description | Number | Description | Number | Description | |
-| ------ | ---------------- | ------- | ---------------------- | -------- | -------------- | --------------- | -------------------- | |
-| 4 | a and A | 5 | b and B | 6 | c and C | 7 | d and D | |
-| 8 | e and E | 9 | f and F | 10 | g and G | 11 | h and H | |
-| 12 | i and I | 13 | j and J | 14 | k and K | 15 | l and L | |
-| 16 | m and M | 17 | n and N | 18 | o and O | 19 | p and P | |
-| 20 | q and Q | 21 | r and R | 22 | s and S | 23 | t and T | |
-| 24 | u and U | 25 | v and V | 26 | w and W | 27 | x and X | |
-| 28 | y and Y | 29 | z and Z | 30 | 1 and ! | 31 | 2 and @ | |
-| 32 | 3 and # | 33 | 4 and $ | 34 | 5 and % | 35 | 6 and ^ | |
-| 36 | 7 and & | 37 | 8 and * | 38 | 9 and ( | 39 | 0 and ) | |
-| 40 | Return (Enter) | 41 | Escape | 42 | Delete (Backspace) | 43 | Tab | |
-| 44 | Spacebar | 45 | - and _ | 46 | = and + | 47 | [ and { | |
-| 48 | ] and } | 49 | \ and | | 50 | # and ~ | 51 | ; and : |
-| 52 | ' and " | 53 | ` and ~ | 54 | , and < | 55 | . and > | |
-| 56 | / and ? | 57 | Caps Lock | 58 | F1 | 59 | F2 | |
-| 60 | F3 | 61 | F4 | 62 | F5 | 63 | F6 | |
-| 64 | F7 | 65 | F8 | 66 | F9 | 67 | F10 | |
-| 68 | F11 | 69 | F12 | 70 | Print Screen | 71 | Scroll Lock | |
-| 72 | Pause | 73 | Insert | 74 | Home | 75 | Page Up | |
-| 76 | Delete forward | 77 | End | 78 | Page Down | 79 | Right Arrow | |
-| 80 | Left Arrow | 81 | Down Arrow | 82 | Up Arrow | 83 | Num Lock | |
-| 84 | Keypad / | 85 | Keypad * | 86 | Keypad - | 87 | Keypad + | |
-| 88 | Keypad Enter | 89 | Keypad 1 and End | 90 | Keypad 2 and Down Arrow | 91 | Keypad 3 and Page Down | |
-| 92 | Keypad 4 and Left Arrow | 93 | Keypad 5 | 94 | Keypad 6 and Right Arrow | 95 | Keypad 7 and Home | |
-| 96 | Keypad 8 and Up Arrow | 97 | Keypad 9 and Page Up | 98 | Keypad 0 and Insert | 99 | Keypad . and Delete | |
-| 100 | \ and | | 101 | Application | 102 | Power | 103 | Keypad = |
-| 104 | F13 | 105 | F14 | 106 | F15 | 107 | F16 | |
-| 108 | F17 | 109 | F18 | 110 | F19 | 111 | F20 | |
-| 112 | F21 | 113 | F22 | 114 | F23 | 115 | F24 | |
-| 116 | Execute | 117 | Help | 118 | Menu | 119 | Select | |
-| 120 | Stop | 121 | Again | 122 | Undo | 123 | Cut | |
-| 124 | Copy | 125 | Paste | 126 | Find | 127 | Mute | |
-| 128 | Volume Up | 129 | Volume Down | | | | | |
-
-The full list can be found in section 10, page 53 of [HID Usage Tables 1.12][2].
-
-### 5 The Nut Behind the Wheel
-
-```
-These summaries and the code they describe form an API - Application Product Interface.
-```
-
-Normally, when you work with someone else's code, they provide a summary of their methods, what they do and roughly how they work, as well as how they can go wrong. Here is a table of the relevant instructions required to use my USB driver.
-
-Table 5.1 Keyboard related functions in CSUD
-| Function | Arguments | Returns | Description |
-| ----------------------- | ----------------------- | ----------------------- | ----------------------- |
-| UsbInitialise | None | r0 is result code | This method is the all-in-one method that loads the USB driver, enumerates all devices and attempts to communicate with them. This method generally takes about a second to execute, though with a few USB hubs plugged in this can be significantly longer. After this method is completed methods in the keyboard driver become available, regardless of whether or not a keyboard is indeed inserted. Result code explained below. |
-| UsbCheckForChange | None | None | Essentially provides the same effect as UsbInitialise, but does not provide the same one time initialisation. This method checks every port on every connected hub recursively, and adds new devices if they have been added. This should be very quick if there are no changes, but can take up to a few seconds if a hub with many devices is attached. |
-| KeyboardCount | None | r0 is count | Returns the number of keyboards currently connected and detected. UsbCheckForChange may update this. Up to 4 keyboards are supported by default. Up to this many keyboards may be accessed through this driver. |
-| KeyboardGetAddress | r0 is index | r0 is address | Retrieves the address of a given keyboard. All other functions take a keyboard address in order to know which keyboard to access. Thus, to communicate with a keyboard, first check the count, then retrieve the address, then use other methods. Note, the order of keyboards that this method returns may change after calls to UsbCheckForChange. |
-| KeyboardPoll | r0 is address | r0 is result code | Reads in the current key state from the keyboard. This operates via polling the device directly, contrary to the best practice. This means that if this method is not called frequently enough, a key press could be missed. All reading methods simply return the value as of the last poll. |
-| KeyboardGetModifiers | r0 is address | r0 is modifier state | Retrieves the status of the modifier keys as of the last poll. These are the shift, alt control and GUI keys on both sides. This is returned as a bit field, such that a 1 in the bit 0 means left control is held, bit 1 means left shift, bit 2 means left alt, bit 3 means left GUI and bits 4 to 7 mean the right versions of those previous. If there is a problem r0 contains 0. |
-| KeyboardGetKeyDownCount | r0 is address | r0 is count | Retrieves the number of keys currently held down on the keyboard. This excludes modifier keys. Normally, this cannot go above 6. If there is an error this method returns 0. |
-| KeyboardGetKeyDown | r0 is address, r1 is key number | r0 is scan code | Retrieves the scan code (see Table 4.1) of a particular held down key. Normally, to work out which keys are down, call KeyboardGetKeyDownCount and then call KeyboardGetKeyDown up to that many times with increasing values of r1 to determine which keys are down. Returns 0 if there is a problem. It is safe (but not recommended) to call this method without calling KeyboardGetKeyDownCount and interpret 0s as keys not held. Note, the order or scan codes can change randomly (some keyboards sort numerically, some sort temporally, no guarantees are made). |
-| KeyboardGetKeyIsDown | r0 is address, r1 is scan code | r0 is status | Alternative to KeyboardGetKeyDown, checks if a particular scan code is among the held down keys. Returns 0 if not, or a non-zero value if so. Faster when detecting particular scan codes (e.g. looking for ctrl+c). On error, returns 0. |
-| KeyboardGetLedSupport | r0 is address | r0 is LEDs | Checks which LEDs a particular keyboard supports. Bit 0 being 1 represents Number Lock, bit 1 represents Caps Lock, bit 2 represents Scroll Lock, bit 3 represents Compose, bit 4 represents Kana, bit 5 represents Power, bit 6 represents Mute and bit 7 represents Compose. As per the USB standard, none of these LEDs update automatically (e.g. Caps Lock must be set manually when the Caps Lock scan code is detected). |
-| KeyboardSetLeds | r0 is address, r1 is LEDs | r0 is result code | Attempts to turn on/off the specified LEDs on the keyboard. See below for result code values. See KeyboardGetLedSupport for LEDs' values. |
-
-```
-Result codes are an easy way to handle errors, but often more elegant solutions exist in higher level code.
-```
-
-Several methods return 'result codes'. These are commonplace in C code, and are just numbers which represent what happened in a method call. By convention, 0 always indicates success. The following result codes are used by this driver.
-
-Table 5.2 - CSUD Result Codes
-| Code | Description |
-| ---- | ----------------------------------------------------------------------- |
-| 0 | Method completed successfully. |
-| -2 | Argument: A method was called with an invalid argument. |
-| -4 | Device: The device did not respond correctly to the request. |
-| -5 | Incompatible: The driver is not compatible with this request or device. |
-| -6 | Compiler: The driver was compiled incorrectly, and is broken. |
-| -7 | Memory: The driver ran out of memory. |
-| -8 | Timeout: The device did not respond in the expected time. |
-| -9 | Disconnect: The device requested has disconnected, and cannot be used. |
-
-The general usage of the driver is as follows:
-
- 1. Call UsbInitialise
- 2. Call UsbCheckForChange
- 3. Call KeyboardCount
- 4. If this is 0, go to 2.
- 5. For each keyboard you support:
- 1. Call KeyboardGetAddress
- 2. Call KeybordGetKeyDownCount
- 3. For each key down:
- 1. Check whether or not it has just been pushed
- 2. Store that the key is down
- 4. For each key stored:
- 1. Check whether or not key is released
- 2. Remove key if released
- 6. Perform actions based on keys pushed/released
- 7. Go to 2.
-
-
-
-Ultimately, you may do whatever you wish to with the keyboard, and these methods should allow you to access all of its functionality. Over the next 2 lessons, we shall look at completing the input side of a text terminal, similarly to most command line computers, and interpreting the commands. In order to do this, we're going to need to have keyboard inputs in a more useful form. You may notice that my driver is (deliberately) unhelpful, because it doesn't have methods to deduce whether or not a key has just been pushed down or released, it only has methods about what is currently held down. This means we'll need to write such methods ourselves.
-
-### 6 Updates Available
-
-Repeatedly checking for updates is called 'polling'. This is in contrast to interrupt driven IO, where the device sends a signal when data is ready.
-
-First of all, let's implement a method KeyboardUpdate which detects the first keyboard and uses its poll method to get the current input, as well as saving the last inputs for comparison. We can then use this data with other methods to translate scan codes to keys. The method should do precisely the following:
-
- 1. Retrieve a stored keyboard address (initially 0).
- 2. If this is not 0, go to 9.
- 3. Call UsbCheckForChange to detect new keyboards.
- 4. Call KeyboardCount to detect how many keyboards are present.
- 5. If this is 0 store the address as 0 and return; we can't do anything with no keyboard.
- 6. Call KeyboardGetAddress with parameter 0 to get the first keyboard's address.
- 7. Store this address.
- 8. If this is 0, return; there is some problem.
- 9. Call KeyboardGetKeyDown 6 times to get each key currently down and store them
- 10. Call KeyboardPoll
- 11. If the result is non-zero go to 3. There is some problem (such as disconnected keyboard).
-
-
-
-To store the values mentioned above, we will need the following values in the .data section.
-
-```
-.section .data
-.align 2
-KeyboardAddress:
-.int 0
-KeyboardOldDown:
-.rept 6
-.hword 0
-.endr
-```
-
-```
-.hword num inserts the half word constant num into the file directly.
-```
-
-```
-.rept num [commands] .endr copies the commands commands to the output num times.
-```
-
-Try to implement the method yourself. My implementation for this is as follows:
-
-1.
-```
-.section .text
-.globl KeyboardUpdate
-KeyboardUpdate:
-push {r4,r5,lr}
-
-kbd .req r4
-ldr r0,=KeyboardAddress
-ldr kbd,[r0]
-```
-We load in the keyboard address.
-2.
-```
-teq kbd,#0
-bne haveKeyboard$
-```
-If the address is non-zero, we have a keyboard. Calling UsbCheckForChanges is slow, and so if everything works we avoid it.
-3.
-```
-getKeyboard$:
-bl UsbCheckForChange
-```
-If we don't have a keyboard, we have to check for new devices.
-4.
-```
-bl KeyboardCount
-```
-Now we see if a new keyboard has been added.
-5.
-```
-teq r0,#0
-ldreq r1,=KeyboardAddress
-streq r0,[r1]
-beq return$
-```
-There are no keyboards, so we have no keyboard address.
-6.
-```
-mov r0,#0
-bl KeyboardGetAddress
-```
-Let's just get the address of the first keyboard. You may want to allow more.
-7.
-```
-ldr r1,=KeyboardAddress
-str r0,[r1]
-```
-Store the keyboard's address.
-8.
-```
-teq r0,#0
-beq return$
-mov kbd,r0
-```
-If we have no address, there is nothing more to do.
-9.
-```
-saveKeys$:
- mov r0,kbd
- mov r1,r5
- bl KeyboardGetKeyDown
-
- ldr r1,=KeyboardOldDown
- add r1,r5,lsl #1
- strh r0,[r1]
- add r5,#1
- cmp r5,#6
- blt saveKeys$
-```
-Loop through all the keys, storing them in KeyboardOldDown. If we ask for too many, this returns 0 which is fine.
-
-10.
-```
-mov r0,kbd
-bl KeyboardPoll
-```
-Now we get the new keys.
-
-11.
-```
-teq r0,#0
-bne getKeyboard$
-
-return$:
-pop {r4,r5,pc}
-.unreq kbd
-```
-Finally we check if KeyboardPoll worked. If not, we probably disconnected.
-
-
-With our new KeyboardUpdate method, checking for inputs becomes as simple as calling this method at regular intervals, and it will even check for disconnections etc. This is a useful method to have, as our actual key processing may differ based on the situation, and so being able to get the current input in its raw form with one method call is generally applicable. The next method we ideally want is KeyboardGetChar, a method that simply returns the next key pressed as an ASCII character, or returns 0 if no key has just been pressed. This could be extended to support typing a key multiple times if it is held for a certain duration, and to support the 'lock' keys as well as modifiers.
-
-To make this method it is useful if we have a method KeyWasDown, which simply returns 0 if a given scan code is not in the KeyboardOldDown values, and returns a non-zero value otherwise. Have a go at implementing this yourself. As always, a solution can be found on the downloads page.
-
-### 7 Look Up Tables
-
-```
-In many areas of programming, the larger the program, the faster it is. Look up tables are large, but are very fast. Some problems can be solved by a mixture of look up tables and normal functions.
-```
-
-The KeyboardGetChar method could be quite complex if we write it poorly. There are 100s of scan codes, each with different effects depending on the presence or absence of the shift key or other modifiers. Not all of the keys can be translated to a character. For some characters, multiple keys can produce the same character. A useful trick in situations with such vast arrays of possibilities is look up tables. A look up table, much like in the physical sense, is a table of values and their results. For some limited functions, the simplest way to deduce the answer is just to precompute every answer, and just return the correct one by retrieving it. In this case, we could build up a sequence of values in memory such that the nth value into the sequence is the ASCII character code for the scan code n. This means our method would simply have to detect if a key was pressed, and then retrieve its value from the table. Further, we could have a separate table for the values when shift is held, so that the shift key simply changes which table we're working with.
-
-After the .section .data command, copy the following tables:
-
-```
-.align 3
-KeysNormal:
- .byte 0x0, 0x0, 0x0, 0x0, 'a', 'b', 'c', 'd'
- .byte 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'
- .byte 'm', 'n', 'o', 'p', 'q', 'r', 's', 't'
- .byte 'u', 'v', 'w', 'x', 'y', 'z', '1', '2'
- .byte '3', '4', '5', '6', '7', '8', '9', '0'
- .byte '\n', 0x0, '\b', '\t', ' ', '-', '=', '['
- .byte ']', '\\\', '#', ';', '\'', '`', ',', '.'
- .byte '/', 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
- .byte 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
- .byte 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
- .byte 0x0, 0x0, 0x0, 0x0, '/', '*', '-', '+'
- .byte '\n', '1', '2', '3', '4', '5', '6', '7'
- .byte '8', '9', '0', '.', '\\\', 0x0, 0x0, '='
-
-.align 3
-KeysShift:
- .byte 0x0, 0x0, 0x0, 0x0, 'A', 'B', 'C', 'D'
- .byte 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L'
- .byte 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'
- .byte 'U', 'V', 'W', 'X', 'Y', 'Z', '!', '"'
- .byte '£', '$', '%', '^', '&', '*', '(', ')'
- .byte '\n', 0x0, '\b', '\t', ' ', '_', '+', '{'
- .byte '}', '|', '~', ':', '@', '¬', '<', '>'
- .byte '?', 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
- .byte 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
- .byte 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0
- .byte 0x0, 0x0, 0x0, 0x0, '/', '*', '-', '+'
- .byte '\n', '1', '2', '3', '4', '5', '6', '7'
- .byte '8', '9', '0', '.', '|', 0x0, 0x0, '='
-```
-
-```
-.byte num inserts the byte constant num into the file directly.
-```
-
-```
-Most assemblers and compilers recognise escape sequences; character sequences such as \t which insert special characters instead.
-```
-
-These tables map directly the first 104 scan codes onto the ASCII characters as a table of bytes. We also have a separate table describing the effects of the shift key on those scan codes. I've used the ASCII null character (0) for all keys without direct mappings in ASCII (such as the function keys). Backspace is mapped to the ASCII backspace character (8 denoted \b), enter is mapped to the ASCII new line character (10 denoted \n) and tab is mapped to the ASCII horizontal tab character (9 denoted \t).
-
-The KeyboardGetChar method will need to do the following:
-
- 1. Check if KeyboardAddress is 0. If so, return 0.
- 2. Call KeyboardGetKeyDown up to 6 times. Each time:
- 1. If key is 0, exit loop.
- 2. Call KeyWasDown. If it was, go to the next key.
- 3. If the scan code is more than 103, go to the next key.
- 4. Call KeyboardGetModifiers
- 5. If shift is held, load the address of KeysShift. Otherwise load KeysNormal.
- 6. Read the ASCII value from the table.
- 7. If it is 0, go to the next key otherwise return this ASCII code and exit.
- 3. Return 0.
-
-
-
-Try to implement this yourself. My implementation is presented below:
-
-1.
-```
-.globl KeyboardGetChar
-KeyboardGetChar:
-ldr r0,=KeyboardAddress
-ldr r1,[r0]
-teq r1,#0
-moveq r0,#0
-moveq pc,lr
-```
-Simple check to see if we have a keyboard.
-
-2.
-```
-push {r4,r5,r6,lr}
-kbd .req r4
-key .req r6
-mov r4,r1
-mov r5,#0
-keyLoop$:
- mov r0,kbd
- mov r1,r5
- bl KeyboardGetKeyDown
-```
-r5 will hold the index of the key, r4 holds the keyboard address.
-
- 1.
- ```
- teq r0,#0
- beq keyLoopBreak$
- ```
- If a scan code is 0, it either means there is an error, or there are no more keys.
-
- 2.
- ```
- mov key,r0
- bl KeyWasDown
- teq r0,#0
- bne keyLoopContinue$
- ```
- If a key was already down it is uninteresting, we only want ot know about key presses.
-
- 3.
- ```
- cmp key,#104
- bge keyLoopContinue$
- ```
- If a key has a scan code higher than 104, it will be outside our table, and so is not relevant.
-
- 4.
- ```
- mov r0,kbd
- bl KeyboardGetModifiers
- ```
- We need to know about the modifier keys in order to deduce the character.
-
- 5.
- ```
- tst r0,#0b00100010
- ldreq r0,=KeysNormal
- ldrne r0,=KeysShift
- ```
- We detect both a left and right shift key as changing the characters to their shift variants. Remember, a tst instruction computes the logical AND and then compares it to zero, so it will be equal to 0 if and only if both of the shift bits are zero.
-
- 6.
- ```
- ldrb r0,[r0,key]
- ```
- Now we can load in the key from the look up table.
-
- 7.
- ```
- teq r0,#0
- bne keyboardGetCharReturn$
- keyLoopContinue$:
- add r5,#1
- cmp r5,#6
- blt keyLoop$
- ```
- If the look up code contains a zero, we must continue. To continue, we increment the index, and check if we've reached 6.
-
-3.
-```
-keyLoopBreak$:
-mov r0,#0
-keyboardGetCharReturn$:
-pop {r4,r5,r6,pc}
-.unreq kbd
-.unreq key
-```
-We return our key here, if we reach keyLoopBreak$, then we know there is no key held, so return 0.
-
-
-
-
-### 8 Notepad OS
-
-Now we have our KeyboardGetChar method, we can make an operating system that just types what the user writes to the screen. For simplicity we'll ignore all the unusual keys. In 'main.s' delete all code after bl SetGraphicsAddress. Call UsbInitialise, set r4 and r5 to 0, then loop forever over the following commands:
-
- 1. Call KeyboardUpdate
- 2. Call KeyboardGetChar
- 3. If it is 0, got to 1
- 4. Copy r4 and r5 to r1 and r2 then call DrawCharacter
- 5. Add r0 to r4
- 6. If r4 is 1024, add r1 to r5 and set r4 to 0
- 7. If r5 is 768 set r5 to 0
- 8. Go to 1
-
-
-
-Now compile this and test it on the Pi. You should almost immediately be able to start typing text to the screen when the Pi starts. If not, please see our troubleshooting page.
-
-When it works, congratulations, you've achieved an interface with the computer. You should now begin to realise that you've almost got a primitive operating system together. You can now interface with the computer, issuing it commands, and receive feedback on screen. In the next tutorial, [Input02][3] we will look at producing a full text terminal, in which the user types commands, and the computer executes them.
-
---------------------------------------------------------------------------------
-
-via: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/input01.html
-
-作者:[Alex Chadwick][a]
-选题:[lujun9972][b]
-译者:[ezio](https://github.com/oska874)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.cl.cam.ac.uk
-[b]: https://github.com/lujun9972
-[1]: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/downloads.html
-[2]: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/downloads/hut1_12v2.pdf
-[3]: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/input02.html
diff --git a/sources/tech/20160301 How To Set Password Policies In Linux.md b/sources/tech/20160301 How To Set Password Policies In Linux.md
new file mode 100644
index 0000000000..bad7c279bc
--- /dev/null
+++ b/sources/tech/20160301 How To Set Password Policies In Linux.md
@@ -0,0 +1,356 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How To Set Password Policies In Linux)
+[#]: via: (https://www.ostechnix.com/how-to-set-password-policies-in-linux/)
+[#]: author: (SK https://www.ostechnix.com/author/sk/)
+
+How To Set Password Policies In Linux
+======
+![](https://www.ostechnix.com/wp-content/uploads/2016/03/How-To-Set-Password-Policies-In-Linux-720x340.jpg)
+
+Even though Linux is secure by design, there are many chances for the security breach. One of them is weak passwords. As a System administrator, you must provide a strong password for the users. Because, mostly system breaches are happening due to weak passwords. This tutorial describes how to set password policies such as **password length** , **password complexity** , **password** **expiration period** etc., in DEB based systems like Debian, Ubuntu, Linux Mint, and RPM based systems like RHEL, CentOS, Scientific Linux.
+
+### Set password length in DEB based systems
+
+By default, all Linux operating systems requires **password length of minimum 6 characters** for the users. I strongly advice you not to go below this limit. Also, don’t use your real name, parents/spouse/kids name, or your date of birth as a password. Even a novice hacker can easily break such kind of passwords in minutes. The good password must always contains more than 6 characters including a number, a capital letter, and a special character.
+
+Usually, the password and authentication-related configuration files will be stored in **/etc/pam.d/** location in DEB based operating systems.
+
+To set minimum password length, edit**/etc/pam.d/common-password** file;
+
+```
+$ sudo nano /etc/pam.d/common-password
+```
+
+Find the following line:
+
+```
+password [success=2 default=ignore] pam_unix.so obscure sha512
+```
+
+![][2]
+
+And add an extra word: **minlen=8** at the end. Here I set the minimum password length as **8**.
+
+```
+password [success=2 default=ignore] pam_unix.so obscure sha512 minlen=8
+```
+
+![](https://www.ostechnix.com/wp-content/uploads/2016/03/sk@sk-_002-3-1.jpg)
+
+Save and close the file. So, now the users can’t use less than 8 characters for their password.
+
+### Set password length in RPM based systems
+
+**In RHEL, CentOS, Scientific Linux 7.x** systems, run the following command as root user to set password length.
+
+```
+# authconfig --passminlen=8 --update
+```
+
+To view the minimum password length, run:
+
+```
+# grep "^minlen" /etc/security/pwquality.conf
+```
+
+**Sample output:**
+
+```
+minlen = 8
+```
+
+**In RHEL, CentOS, Scientific Linux 6.x** systems, edit **/etc/pam.d/system-auth** file:
+
+```
+# nano /etc/pam.d/system-auth
+```
+
+Find the following line and add the following at the end of the line:
+
+```
+password requisite pam_cracklib.so try_first_pass retry=3 type= minlen=8
+```
+
+![](https://www.ostechnix.com/wp-content/uploads/2016/03/root@server_003-3.jpg)
+
+As per the above setting, the minimum password length is **8** characters.
+
+### Set password complexity in DEB based systems
+
+This setting enforces how many classes, i.e upper-case, lower-case, and other characters, should be in a password.
+
+First install password quality checking library using command:
+
+```
+$ sudo apt-get install libpam-pwquality
+```
+
+Then, edit **/etc/pam.d/common-password** file:
+
+```
+$ sudo nano /etc/pam.d/common-password
+```
+
+To set at least one **upper-case** letters in the password, add a word **‘ucredit=-1’** at the end of the following line.
+
+```
+password requisite pam_pwquality.so retry=3 ucredit=-1
+```
+
+![](https://www.ostechnix.com/wp-content/uploads/2016/03/sk@sk-_001-7.jpg)
+
+Set at least one **lower-case** letters in the password as shown below.
+
+```
+password requisite pam_pwquality.so retry=3 dcredit=-1
+```
+
+Set at least **other** letters in the password as shown below.
+
+```
+password requisite pam_pwquality.so retry=3 ocredit=-1
+```
+
+As you see in the above examples, we have set at least (minimum) one upper-case, lower-case, and a special character in the password. You can set any number of maximum allowed upper-case, lower-case, and other letters in your password.
+
+You can also set the minimum/maximum number of allowed classes in the password.
+
+The following example shows the minimum number of required classes of characters for the new password:
+
+```
+password requisite pam_pwquality.so retry=3 minclass=2
+```
+
+### Set password complexity in RPM based systems
+
+**In RHEL 7.x / CentOS 7.x / Scientific Linux 7.x:**
+
+To set at least one lower-case letter in the password, run:
+
+```
+# authconfig --enablereqlower --update
+```
+
+To view the settings, run:
+
+```
+# grep "^lcredit" /etc/security/pwquality.conf
+```
+
+**Sample output:**
+
+```
+lcredit = -1
+```
+
+Similarly, set at least one upper-case letter in the password using command:
+
+```
+# authconfig --enablerequpper --update
+```
+
+To view the settings:
+
+```
+# grep "^ucredit" /etc/security/pwquality.conf
+```
+
+**Sample output:**
+
+```
+ucredit = -1
+```
+
+To set at least one digit in the password, run:
+
+```
+# authconfig --enablereqdigit --update
+```
+
+To view the setting, run:
+
+```
+# grep "^dcredit" /etc/security/pwquality.conf
+```
+
+**Sample output:**
+
+```
+dcredit = -1
+```
+
+To set at least one other character in the password, run:
+
+```
+# authconfig --enablereqother --update
+```
+
+To view the setting, run:
+
+```
+# grep "^ocredit" /etc/security/pwquality.conf
+```
+
+**Sample output:**
+
+```
+ocredit = -1
+```
+
+In **RHEL 6.x / CentOS 6.x / Scientific Linux 6.x systems** , edit **/etc/pam.d/system-auth** file as root user:
+
+```
+# nano /etc/pam.d/system-auth
+```
+
+Find the following line and add the following at the end of the line:
+
+```
+password requisite pam_cracklib.so try_first_pass retry=3 type= minlen=8 dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1
+```
+
+As per the above setting, the password must have at least 8 characters. In addtion, the password should also have at least one upper-case letter, one lower-case letter, one digit, and one other characters.
+
+### Set password expiration period in DEB based systems
+
+Now, We are going to set the following policies.
+
+ 1. Maximum number of days a password may be used.
+ 2. Minimum number of days allowed between password changes.
+ 3. Number of days warning given before a password expires.
+
+
+
+To set this policy, edit:
+
+```
+$ sudo nano /etc/login.defs
+```
+
+Set the values as per your requirement.
+
+```
+PASS_MAX_DAYS 100
+PASS_MIN_DAYS 0
+PASS_WARN_AGE 7
+```
+
+![](https://www.ostechnix.com/wp-content/uploads/2016/03/sk@sk-_002-8.jpg)
+
+As you see in the above example, the user should change the password once in every **100** days and the warning message will appear **7** days before password expiration.
+
+Be mindful that these settings will impact the newly created users.
+
+To set maximum number of days between password change to existing users, you must run the following command:
+
+```
+$ sudo chage -M
+```
+
+To set minimum number of days between password change, run:
+
+```
+$ sudo chage -m
+```
+
+To set warning before password expires, run:
+
+```
+$ sudo chage -W
+```
+
+To display the password for the existing users, run:
+
+```
+$ sudo chage -l sk
+```
+
+Here, **sk** is my username.
+
+**Sample output:**
+
+```
+Last password change : Feb 24, 2017
+Password expires : never
+Password inactive : never
+Account expires : never
+Minimum number of days between password change : 0
+Maximum number of days between password change : 99999
+Number of days of warning before password expires : 7
+```
+
+As you see in the above output, the password never expires.
+
+To change the password expiration period of an existing user,
+
+```
+$ sudo chage -E 24/06/2018 -m 5 -M 90 -I 10 -W 10 sk
+```
+
+The above command will set password of the user **‘sk’** to expire on **24/06/2018**. Also the the minimum number days between password change is set 5 days and the maximum number of days between password changes is set to **90** days. The user account will be locked automatically after **10 days** and It will display a warning message for **10 days** before password expiration.
+
+### Set password expiration period in RPM based systems
+
+This is same as DEB based systems.
+
+### Forbid previously used passwords in DEB based systems
+
+You can limit the users to set a password which is already used in the past. To put this in layman terms, the users can’t use the same password again.
+
+To do so, edit**/etc/pam.d/common-password** file:
+
+```
+$ sudo nano /etc/pam.d/common-password
+```
+
+Find the following line and add the word **‘remember=5’** at the end:
+
+```
+password [success=2 default=ignore] pam_unix.so obscure use_authtok try_first_pass sha512 remember=5
+```
+
+The above policy will prevent the users to use the last 5 used passwords.
+
+### Forbid previously used passwords in RPM based systems
+
+This is same for both RHEL 6.x and RHEL 7.x and it’s clone systems like CentOS, Scientific Linux.
+
+Edit **/etc/pam.d/system-auth** file as root user,
+
+```
+# vi /etc/pam.d/system-auth
+```
+
+Find the following line, and add **remember=5** at the end.
+
+```
+password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
+```
+
+You know now what is password policies in Linux, and how to set different password policies in DEB and RPM based systems.
+
+That’s all for now. I will be here soon with another interesting and useful article. Until then stay tuned with OSTechNix. If you find this tutorial helpful, share it on your social, professional networks and support us.
+
+Cheers!
+
+
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/how-to-set-password-policies-in-linux/
+
+作者:[SK][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.ostechnix.com/author/sk/
+[b]: https://github.com/lujun9972
+[1]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[2]: http://www.ostechnix.com/wp-content/uploads/2016/03/sk@sk-_003-2-1.jpg
diff --git a/sources/tech/20160922 Annoying Experiences Every Linux Gamer Never Wanted.md b/sources/tech/20160922 Annoying Experiences Every Linux Gamer Never Wanted.md
deleted file mode 100644
index 8362f15d9b..0000000000
--- a/sources/tech/20160922 Annoying Experiences Every Linux Gamer Never Wanted.md
+++ /dev/null
@@ -1,159 +0,0 @@
-Annoying Experiences Every Linux Gamer Never Wanted!
-============================================================
-
-
- [![Linux gamer's problem](https://itsfoss.com/wp-content/uploads/2016/09/Linux-Gaming-Problems.jpg)][10]
-
-[Gaming on Linux][12] has come a long way. There are dedicated [Linux gaming distributions][13] now. But this doesn’t mean that gaming experience on Linux is as smooth as on Windows.
-
-What are the obstacles that should be thought about to ensure that we enjoy games as much as Windows users do?
-
-[Wine][14], [PlayOnLinux][15] and other similar tools are not always able to play every popular Windows game. In this article, I would like to discuss various factors that must be dealt with in order to have the best possible Linux gaming experience.
-
-### #1 SteamOS is Open Source, Steam for Linux is NOT
-
-As stated on the [SteamOS page][16], even though SteamOS is open source, Steam for Linux continues to be proprietary. Had it also been open source, the amount of support from the open source community would have been tremendous! Since it is not, [the birth of Project Ascension was inevitable][17]:
-
-[video](https://youtu.be/07UiS5iAknA)
-
-Project Ascension is an open source game launcher designed to launch games that have been bought and downloaded from anywhere – they can be Steam games, [Origin games][18], Uplay games, games downloaded directly from game developer websites or from DVD/CD-ROMs.
-
-Here is how it all began: [Sharing The Idea][19] resulted in a very interesting discussion with readers all over from the gaming community pitching in their own opinions and suggestions.
-
-### #2 Performance compared to Windows
-
-Getting Windows games to run on Linux is not always an easy task. But thanks to a feature called [CSMT][20] (command stream multi-threading), PlayOnLinux is now better equipped to deal with these performance issues, though it’s still a long way to achieve Windows level outcomes.
-
-Native Linux support for games has not been so good for past releases.
-
-Last year, it was reported that SteamOS performed [significantly worse][21] than Windows. Tomb Raider was released on SteamOS/Steam for Linux last year. However, benchmark results were [not at par][22] with performance on Windows.
-
-[video](https://youtu.be/nkWUBRacBNE)
-
-This was much obviously due to the fact that the game had been developed with [DirectX][23] in mind and not [OpenGL][24].
-
-Tomb Raider is the [first Linux game that uses TressFX][25]. This video includes TressFX comparisons:
-
-[video](https://youtu.be/-IeY5ZS-LlA)
-
-Here is another interesting comparison which shows Wine+CSMT performing much better than the native Linux version itself on Steam! This is the power of Open Source!
-
-[Suggested readA New Linux OS "OSu" Vying To Be Ubuntu Of Arch Linux World][26]
-
-[video](https://youtu.be/sCJkC6oJ08A)
-
-TressFX has been turned off in this case to avoid FPS loss.
-
-Here is another Linux vs Windows comparison for the recently released “[Life is Strange][27]” on Linux:
-
-[video](https://youtu.be/Vlflu-pIgIY)
-
-It’s good to know that [_Steam for Linux_][28] has begun to show better improvements in performance for this new Linux game.
-
-Before launching any game for Linux, developers should consider optimizing them especially if it’s a DirectX game and requires OpenGL translation. We really do hope that [Deus Ex: Mankind Divided on Linux][29] gets benchmarked well, upon release. As its a DirectX game, we hope it’s being ported well for Linux. Here’s [what the Executive Game Director had to say][30].
-
-### #3 Proprietary NVIDIA Drivers
-
-[AMD’s support for Open Source][31] is definitely commendable when compared to [NVIDIA][32]. Though [AMD][33] driver support is [pretty good on Linux][34] now due to its better open source driver, NVIDIA graphic card owners will still have to use the proprietary NVIDIA drivers because of the limited capabilities of the open-source version of NVIDIA’s graphics driver called Nouveau.
-
-In the past, legendary Linus Torvalds has also shared his thoughts about Linux support from NVIDIA to be totally unacceptable:
-
-[video](https://youtu.be/O0r6Pr_mdio)
-
-You can watch the complete talk [here][35]. Although NVIDIA responded with [a commitment for better linux support][36], the open source graphics driver still continues to be weak as before.
-
-### #4 Need for Uplay and Origin DRM support on Linux
-
-[video](https://youtu.be/rc96NFwyxWU)
-
-The above video describes how to install the [Uplay][37] DRM on Linux. The uploader also suggests that the use of wine as the main tool of games and applications is not recommended on Linux. Rather, preference to native applications should be encouraged instead.
-
-The following video is a guide about installing the [Origin][38] DRM on Linux:
-
-[video](https://youtu.be/ga2lNM72-Kw)
-
-Digital Rights Management Software adds another layer for game execution and hence it adds up to the already challenging task to make a Windows game run well on Linux. So in addition to making the game execute, W.I.N.E has to take care of running the DRM software such as Uplay or Origin as well. It would have been great if, like Steam, Linux could have got its own native versions of Uplay and Origin.
-
-[Suggested readLinux Foundation Head Calls 2017 'Year of the Linux Desktop'... While Running Apple's macOS Himself][39]
-
-### #5 DirectX 11 support for Linux
-
-Even though we have tools on Linux to run Windows applications, every game comes with its own set of tweak requirements for it to be playable on Linux. Though there was an announcement about [DirectX 11 support for Linux][40] last year via Code Weavers, it’s still a long way to go to make playing newly launched titles on Linux a possibility. Currently, you can
-
-Currently, you can [buy Crossover from Codeweavers][41] to get the best DirectX 11 support available. This [thread][42] on the Arch Linux forums clearly shows how much more effort is required to make this dream a possibility. Here is an interesting [find][43] from a [Reddit thread][44], which mentions Wine getting [DirectX 11 patches from Codeweavers][45]. Now that’s definitely some good news.
-
-### #6 100% of Steam games are not available for Linux
-
-This is an important point to ponder as Linux gamers continue to miss out on every major game release since most of them land up on Windows. Here is a guide to [install Steam for Windows on Linux][46].
-
-### #7 Better Support from video game publishers for OpenGL
-
-Currently, developers and publishers focus primarily on DirectX for video game development rather than OpenGL. Now as Steam is officially here for Linux, developers should start considering development in OpenGL as well.
-
-[Direct3D][47] is made solely for the Windows platform. The OpenGL API is an open standard, and implementations exist for not only Windows but a wide variety of other platforms.
-
-Though quite an old article, [this valuable resource][48] shares a lot of thoughtful information on the realities of OpenGL and DirectX. The points made are truly very sensible and enlightens the reader about the facts based on actual chronological events.
-
-Publishers who are launching their titles on Linux should definitely not leave out the fact that developing the game on OpenGL would be a much better deal than translating it from DirectX to OpenGL. If conversion has to be done, the translations must be well optimized and carefully looked into. There might be a delay in releasing the games but still it would definitely be worth the wait.
-
-Have more annoyances to share? Do let us know in the comments.
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/linux-gaming-problems/
-
-作者:[Avimanyu Bandyopadhyay ][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://itsfoss.com/author/avimanyu/
-[1]:https://itsfoss.com/author/avimanyu/
-[2]:https://itsfoss.com/linux-gaming-problems/#comments
-[3]:https://www.facebook.com/share.php?u=https%3A%2F%2Fitsfoss.com%2Flinux-gaming-problems%2F%3Futm_source%3Dfacebook%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare
-[4]:https://twitter.com/share?original_referer=/&text=Annoying+Experiences+Every+Linux+Gamer+Never+Wanted%21&url=https://itsfoss.com/linux-gaming-problems/%3Futm_source%3Dtwitter%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare&via=itsfoss2
-[5]:https://plus.google.com/share?url=https%3A%2F%2Fitsfoss.com%2Flinux-gaming-problems%2F%3Futm_source%3DgooglePlus%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare
-[6]:https://www.linkedin.com/cws/share?url=https%3A%2F%2Fitsfoss.com%2Flinux-gaming-problems%2F%3Futm_source%3DlinkedIn%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare
-[7]:http://www.stumbleupon.com/submit?url=https://itsfoss.com/linux-gaming-problems/&title=Annoying+Experiences+Every+Linux+Gamer+Never+Wanted%21
-[8]:https://www.reddit.com/submit?url=https://itsfoss.com/linux-gaming-problems/&title=Annoying+Experiences+Every+Linux+Gamer+Never+Wanted%21
-[9]:https://itsfoss.com/wp-content/uploads/2016/09/Linux-Gaming-Problems.jpg
-[10]:https://itsfoss.com/wp-content/uploads/2016/09/Linux-Gaming-Problems.jpg
-[11]:http://pinterest.com/pin/create/bookmarklet/?media=https://itsfoss.com/wp-content/uploads/2016/09/Linux-Gaming-Problems.jpg&url=https://itsfoss.com/linux-gaming-problems/&is_video=false&description=Linux%20gamer%27s%20problem
-[12]:https://itsfoss.com/linux-gaming-guide/
-[13]:https://itsfoss.com/linux-gaming-distributions/
-[14]:https://itsfoss.com/use-windows-applications-linux/
-[15]:https://www.playonlinux.com/en/
-[16]:http://store.steampowered.com/steamos/
-[17]:http://www.ibtimes.co.uk/reddit-users-want-replace-steam-open-source-game-launcher-project-ascension-1498999
-[18]:https://www.origin.com/
-[19]:https://www.reddit.com/r/pcmasterrace/comments/33xcvm/we_hate_valves_monopoly_over_pc_gaming_why/
-[20]:https://github.com/wine-compholio/wine-staging/wiki/CSMT
-[21]:http://arstechnica.com/gaming/2015/11/ars-benchmarks-show-significant-performance-hit-for-steamos-gaming/
-[22]:https://www.gamingonlinux.com/articles/tomb-raider-benchmark-video-comparison-linux-vs-windows-10.7138
-[23]:https://en.wikipedia.org/wiki/DirectX
-[24]:https://en.wikipedia.org/wiki/OpenGL
-[25]:https://www.gamingonlinux.com/articles/tomb-raider-released-for-linux-video-thoughts-port-report-included-the-first-linux-game-to-use-tresfx.7124
-[26]:https://itsfoss.com/osu-new-linux/
-[27]:http://lifeisstrange.com/
-[28]:https://itsfoss.com/install-steam-ubuntu-linux/
-[29]:https://itsfoss.com/deus-ex-mankind-divided-linux/
-[30]:http://wccftech.com/deus-ex-mankind-divided-director-console-ports-on-pc-is-disrespectful/
-[31]:http://developer.amd.com/tools-and-sdks/open-source/
-[32]:http://nvidia.com/
-[33]:http://amd.com/
-[34]:http://www.makeuseof.com/tag/open-source-amd-graphics-now-awesome-heres-get/
-[35]:https://youtu.be/MShbP3OpASA
-[36]:https://itsfoss.com/nvidia-optimus-support-linux/
-[37]:http://uplay.com/
-[38]:http://origin.com/
-[39]:https://itsfoss.com/linux-foundation-head-uses-macos/
-[40]:http://www.pcworld.com/article/2940470/hey-gamers-directx-11-is-coming-to-linux-thanks-to-codeweavers-and-wine.html
-[41]:https://itsfoss.com/deal-run-windows-software-and-games-on-linux-with-crossover-15-66-off/
-[42]:https://bbs.archlinux.org/viewtopic.php?id=214771
-[43]:https://ghostbin.com/paste/sy3e2
-[44]:https://www.reddit.com/r/linux_gaming/comments/3ap3uu/directx_11_support_coming_to_codeweavers/
-[45]:https://www.codeweavers.com/about/blogs/caron/2015/12/10/directx-11-really-james-didnt-lie
-[46]:https://itsfoss.com/linux-gaming-guide/
-[47]:https://en.wikipedia.org/wiki/Direct3D
-[48]:http://blog.wolfire.com/2010/01/Why-you-should-use-OpenGL-and-not-DirectX
diff --git a/sources/tech/20171010 In Device We Trust Measure Twice Compute Once with Xen Linux TPM 2.0 and TXT.md b/sources/tech/20171010 In Device We Trust Measure Twice Compute Once with Xen Linux TPM 2.0 and TXT.md
index 20c14074c6..3c61f6dd8f 100644
--- a/sources/tech/20171010 In Device We Trust Measure Twice Compute Once with Xen Linux TPM 2.0 and TXT.md
+++ b/sources/tech/20171010 In Device We Trust Measure Twice Compute Once with Xen Linux TPM 2.0 and TXT.md
@@ -1,3 +1,6 @@
+ezio is translating
+
+
In Device We Trust: Measure Twice, Compute Once with Xen, Linux, TPM 2.0 and TXT
============================================================
diff --git a/sources/tech/20171212 Toplip – A Very Strong File Encryption And Decryption CLI Utility.md b/sources/tech/20171212 Toplip – A Very Strong File Encryption And Decryption CLI Utility.md
deleted file mode 100644
index ad3528f60b..0000000000
--- a/sources/tech/20171212 Toplip – A Very Strong File Encryption And Decryption CLI Utility.md
+++ /dev/null
@@ -1,282 +0,0 @@
-Toplip – A Very Strong File Encryption And Decryption CLI Utility
-======
-There are numerous file encryption tools available on the market to protect
-your files. We have already reviewed some encryption tools such as
-[**Cryptomater**][1], [**Cryptkeeper**][2], [**CryptGo**][3], [**Cryptr**][4],
-[**Tomb**][5], and [**GnuPG**][6] etc. Today, we will be discussing yet
-another file encryption and decryption command line utility named **"
-Toplip"**. It is a free and open source encryption utility that uses a very
-strong encryption method called **[AES256][7]** , along with an **XTS-AES**
-design to safeguard your confidential data. Also, it uses [**Scrypt**][8], a
-password-based key derivation function, to protect your passphrases against
-brute-force attacks.
-
-### Prominent features
-
-Compared to other file encryption tools, toplip ships with the following
-unique and prominent features.
-
- * Very strong XTS-AES256 based encryption method.
- * Plausible deniability.
- * Encrypt files inside images (PNG/JPG).
- * Multiple passphrase protection.
- * Simplified brute force recovery protection.
- * No identifiable output markers.
- * Open source/GPLv3.
-
-### Installing Toplip
-
-There is no installation required. Toplip is a standalone executable binary
-file. All you have to do is download the latest toplip from the [**official
-products page**][9] and make it as executable. To do so, just run:
-
-```
-chmod +x toplip
-```
-
-### Usage
-
-If you run toplip without any arguments, you will see the help section.
-
-```
-./toplip
-```
-
-[![][10]][11]
-
-Allow me to show you some examples.
-
-For the purpose of this guide, I have created two files namely **file1** and
-**file2**. Also, I have an image file which we need it to hide the files
-inside it. And finally, I have **toplip** executable binary file. I have kept
-them all in a directory called **test**.
-
-[![][12]][13]
-
-**Encrypt/decrypt a single file**
-
-Now, let us encrypt **file1**. To do so, run:
-
-```
-./toplip file1 > file1.encrypted
-```
-
-This command will prompt you to enter a passphrase. Once you have given the
-passphrase, it will encrypt the contents of **file1** and save them in a file
-called **file1.encrypted** in your current working directory.
-
-Sample output of the above command would be:
-
-```
-This is toplip v1.20 (C) 2015, 2016 2 Ton Digital. Author: Jeff Marrison A showcase piece for the HeavyThing library. Commercial support available Proudly made in Cooroy, Australia. More info: https://2ton.com.au/toplip file1 Passphrase #1: generating keys...Done
-Encrypting...Done
-```
-
-To verify if the file is really encrypted., try to open it and you will see
-some random characters.
-
-To decrypt the encrypted file, use **-d** flag like below:
-
-```
-./toplip -d file1.encrypted
-```
-
-This command will decrypt the given file and display the contents in the
-Terminal window.
-
-To restore the file instead of writing to stdout, do:
-
-```
-./toplip -d file1.encrypted > file1.decrypted
-```
-
-Enter the correct passphrase to decrypt the file. All contents of **file1.encrypted** will be restored in a file called **file1.decrypted**.
-
-Please don't follow this naming method. I used it for the sake of easy understanding. Use any other name(s) which is very hard to predict.
-
-**Encrypt/decrypt multiple files
-**
-
-Now we will encrypt two files with two separate passphrases for each one.
-
-```
-./toplip -alt file1 file2 > file3.encrypted
-```
-
-You will be asked to enter passphrase for each file. Use different
-passphrases.
-
-Sample output of the above command will be:
-
-```
-This is toplip v1.20 (C) 2015, 2016 2 Ton Digital. Author: Jeff Marrison A showcase piece for the HeavyThing library. Commercial support available Proudly made in Cooroy, Australia. More info: https://2ton.com.au/toplip
-**file2 Passphrase #1** : generating keys...Done
-**file1 Passphrase #1** : generating keys...Done
-Encrypting...Done
-```
-
-What the above command will do is encrypt the contents of two files and save
-them in a single file called **file3.encrypted**. While restoring, just give
-the respective password. For example, if you give the passphrase of the file1,
-toplip will restore file1. If you enter the passphrase of file2, toplip will
-restore file2.
-
-Each **toplip** encrypted output may contain up to four wholly independent
-files, and each created with their own separate and unique passphrase. Due to
-the way the encrypted output is put together, there is no way to easily
-determine whether or not multiple files actually exist in the first place. By
-default, even if only one file is encrypted using toplip, random data is added
-automatically. If more than one file is specified, each with their own
-passphrase, then you can selectively extract each file independently and thus
-deny the existence of the other files altogether. This effectively allows a
-user to open an encrypted bundle with controlled exposure risk, and no
-computationally inexpensive way for an adversary to conclusively identify that
-additional confidential data exists. This is called **Plausible deniability**
-, one of the notable feature of toplip.
-
-To decrypt **file1** from **file3.encrypted** , just enter:
-
-```
-./toplip -d file3.encrypted > file1.encrypted
-```
-
-You will be prompted to enter the correct passphrase of file1.
-
-To decrypt **file2** from **file3.encrypted** , enter:
-
-```
-./toplip -d file3.encrypted > file2.encrypted
-```
-
-Do not forget to enter the correct passphrase of file2.
-
-**Use multiple passphrase protection**
-
-This is another cool feature that I admire. We can provide multiple
-passphrases for a single file when encrypting it. It will protect the
-passphrases against brute force attempts.
-
-```
-./toplip -c 2 file1 > file1.encrypted
-```
-
-Here, **-c 2** represents two different passphrases. Sample output of above
-command would be:
-
-```
-This is toplip v1.20 (C) 2015, 2016 2 Ton Digital. Author: Jeff Marrison A showcase piece for the HeavyThing library. Commercial support available Proudly made in Cooroy, Australia. More info: https://2ton.com.au/toplip
-**file1 Passphrase #1:** generating keys...Done
-**file1 Passphrase #2:** generating keys...Done
-Encrypting...Done
-```
-
-As you see in the above example, toplip prompted me to enter two passphrases.
-Please note that you must **provide two different passphrases** , not a single
-passphrase twice.
-
-To decrypt this file, do:
-
-```
-$ ./toplip -c 2 -d file1.encrypted > file1.decrypted
-This is toplip v1.20 (C) 2015, 2016 2 Ton Digital. Author: Jeff Marrison A showcase piece for the HeavyThing library. Commercial support available Proudly made in Cooroy, Australia. More info: https://2ton.com.au/toplip
-**file1.encrypted Passphrase #1:** generating keys...Done
-**file1.encrypted Passphrase #2:** generating keys...Done
-Decrypting...Done
-```
-
-**Hide files inside image**
-
-The practice of concealing a file, message, image, or video within another
-file is called **steganography**. Fortunately, this feature exists in toplip
-by default.
-
-To hide a file(s) inside images, use **-m** flag as shown below.
-
-```
-$ ./toplip -m image.png file1 > image1.png
-This is toplip v1.20 (C) 2015, 2016 2 Ton Digital. Author: Jeff Marrison A showcase piece for the HeavyThing library. Commercial support available Proudly made in Cooroy, Australia. More info: https://2ton.com.au/toplip
-file1 Passphrase #1: generating keys...Done
-Encrypting...Done
-```
-
-This command conceals the contents of file1 inside an image named image1.png.
-To decrypt it, run:
-
-```
-$ ./toplip -d image1.png > file1.decrypted This is toplip v1.20 (C) 2015, 2016 2 Ton Digital. Author: Jeff Marrison A showcase piece for the HeavyThing library. Commercial support available Proudly made in Cooroy, Australia. More info: https://2ton.com.au/toplip
-image1.png Passphrase #1: generating keys...Done
-Decrypting...Done
-```
-
-**Increase password complexity**
-
-To make things even harder to break, we can increase the password complexity
-like below.
-
-```
-./toplip -c 5 -i 0x8000 -alt file1 -c 10 -i 10 file2 > file3.encrypted
-```
-
-The above command will prompt to you enter 10 passphrases for the file1, 5
-passphrases for the file2 and encrypt both of them in a single file called
-"file3.encrypted". As you may noticed, we have used one more additional flag
-**-i** in this example. This is used to specify key derivation iterations.
-This option overrides the default iteration count of 1 for scrypt's initial
-and final PBKDF2 stages. Hexadecimal or decimal values permitted, e.g.
-**0x8000** , **10** , etc. Please note that this can dramatically increase the
-calculation times.
-
-To decrypt file1, use:
-
-```
-./toplip -c 5 -i 0x8000 -d file3.encrypted > file1.decrypted
-```
-
-To decrypt file2, use:
-
-```
-./toplip -c 10 -i 10 -d file3.encrypted > file2.decrypted
-```
-
-To know more about the underlying technical information and crypto methods
-used in toplip, refer its official website given at the end.
-
-My personal recommendation to all those who wants to protect their data. Don't
-rely on single method. Always use more than one tools/methods to encrypt
-files. Do not write passphrases/passwords in a paper and/or do not save them
-in your local or cloud storage. Just memorize them and destroy the notes. If
-you're poor at remembering passwords, consider to use any trustworthy password
-managers.
-
-And, that's all. More good stuffs to come. Stay tuned!
-
-Cheers!
-
-
-
-
---------------------------------------------------------------------------------
-
-via: https://www.ostechnix.com/toplip-strong-file-encryption-decryption-cli-utility/
-
-作者:[SK][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.ostechnix.com/author/sk/
-[1]:https://www.ostechnix.com/cryptomator-open-source-client-side-encryption-tool-cloud/
-[2]:https://www.ostechnix.com/how-to-encrypt-your-personal-foldersdirectories-in-linux-mint-ubuntu-distros/
-[3]:https://www.ostechnix.com/cryptogo-easy-way-encrypt-password-protect-files/
-[4]:https://www.ostechnix.com/cryptr-simple-cli-utility-encrypt-decrypt-files/
-[5]:https://www.ostechnix.com/tomb-file-encryption-tool-protect-secret-files-linux/
-[6]:https://www.ostechnix.com/an-easy-way-to-encrypt-and-decrypt-files-from-commandline-in-linux/
-[7]:http://en.wikipedia.org/wiki/Advanced_Encryption_Standard
-[8]:http://en.wikipedia.org/wiki/Scrypt
-[9]:https://2ton.com.au/Products/
-[10]:https://www.ostechnix.com/wp-content/uploads/2017/12/toplip-2.png%201366w,%20https://www.ostechnix.com/wp-content/uploads/2017/12/toplip-2-300x157.png%20300w,%20https://www.ostechnix.com/wp-content/uploads/2017/12/toplip-2-768x403.png%20768w,%20https://www.ostechnix.com/wp-content/uploads/2017/12/toplip-2-1024x537.png%201024w
-[11]:http://www.ostechnix.com/wp-content/uploads/2017/12/toplip-2.png
-[12]:https://www.ostechnix.com/wp-content/uploads/2017/12/toplip-1.png%20779w,%20https://www.ostechnix.com/wp-content/uploads/2017/12/toplip-1-300x101.png%20300w,%20https://www.ostechnix.com/wp-content/uploads/2017/12/toplip-1-768x257.png%20768w
-[13]:http://www.ostechnix.com/wp-content/uploads/2017/12/toplip-1.png
-
diff --git a/sources/tech/20171214 Build a game framework with Python using the module Pygame.md b/sources/tech/20171214 Build a game framework with Python using the module Pygame.md
new file mode 100644
index 0000000000..704c74e042
--- /dev/null
+++ b/sources/tech/20171214 Build a game framework with Python using the module Pygame.md
@@ -0,0 +1,283 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Build a game framework with Python using the module Pygame)
+[#]: via: (https://opensource.com/article/17/12/game-framework-python)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+Build a game framework with Python using the module Pygame
+======
+The first part of this series explored Python by creating a simple dice game. Now it's time to make your own game from scratch.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python2-header.png?itok=tEvOVo4A)
+
+In my [first article in this series][1], I explained how to use Python to create a simple, text-based dice game. This time, I'll demonstrate how to use the Python module Pygame to create a graphical game. It will take several articles to get a game that actually does anything, but by the end of the series, you will have a better understanding of how to find and learn new Python modules and how to build an application from the ground up.
+
+Before you start, you must install [Pygame][2].
+
+### Installing new Python modules
+
+There are several ways to install Python modules, but the two most common are:
+
+ * From your distribution's software repository
+ * Using the Python package manager, pip
+
+
+
+Both methods work well, and each has its own set of advantages. If you're developing on Linux or BSD, leveraging your distribution's software repository ensures automated and timely updates.
+
+However, using Python's built-in package manager gives you control over when modules are updated. Also, it is not OS-specific, meaning you can use it even when you're not on your usual development machine. Another advantage of pip is that it allows local installs of modules, which is helpful if you don't have administrative rights to a computer you're using.
+
+### Using pip
+
+If you have both Python and Python3 installed on your system, the command you want to use is probably `pip3`, which differentiates it from Python 2.x's `pip` command. If you're unsure, try `pip3` first.
+
+The `pip` command works a lot like most Linux package managers. You can search for Python modules with `search`, then install them with `install`. If you don't have permission to install software on the computer you're using, you can use the `--user` option to just install the module into your home directory.
+
+```
+$ pip3 search pygame
+[...]
+Pygame (1.9.3) - Python Game Development
+sge-pygame (1.5) - A 2-D game engine for Python
+pygame_camera (0.1.1) - A Camera lib for PyGame
+pygame_cffi (0.2.1) - A cffi-based SDL wrapper that copies the pygame API.
+[...]
+$ pip3 install Pygame --user
+```
+
+Pygame is a Python module, which means that it's just a set of libraries that can be used in your Python programs. In other words, it's not a program that you launch, like [IDLE][3] or [Ninja-IDE][4] are.
+
+### Getting started with Pygame
+
+A video game needs a setting; a world in which it takes place. In Python, there are two different ways to create your setting:
+
+ * Set a background color
+ * Set a background image
+
+
+
+Your background is only an image or a color. Your video game characters can't interact with things in the background, so don't put anything too important back there. It's just set dressing.
+
+### Setting up your Pygame script
+
+To start a new Pygame project, create a folder on your computer. All your game files go into this directory. It's vitally important that you keep all the files needed to run your game inside of your project folder.
+
+![](https://opensource.com/sites/default/files/u128651/project.jpg)
+
+A Python script starts with the file type, your name, and the license you want to use. Use an open source license so your friends can improve your game and share their changes with you:
+
+```
+#!/usr/bin/env python3
+# by Seth Kenlon
+
+## GPLv3
+# This program is free software: you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+```
+
+Then you tell Python what modules you want to use. Some of the modules are common Python libraries, and of course, you want to include the one you just installed, Pygame.
+
+```
+import pygame # load pygame keywords
+import sys # let python use your file system
+import os # help python identify your OS
+```
+
+Since you'll be working a lot with this script file, it helps to make sections within the file so you know where to put stuff. You do this with block comments, which are comments that are visible only when looking at your source code. Create three blocks in your code.
+
+```
+'''
+Objects
+'''
+
+# put Python classes and functions here
+
+'''
+Setup
+'''
+
+# put run-once code here
+
+'''
+Main Loop
+'''
+
+# put game loop here
+```
+
+Next, set the window size for your game. Keep in mind that not everyone has a big computer screen, so it's best to use a screen size that fits on most people's computers.
+
+There is a way to toggle full-screen mode, the way many modern video games do, but since you're just starting out, keep it simple and just set one size.
+
+```
+'''
+Setup
+'''
+worldx = 960
+worldy = 720
+```
+
+The Pygame engine requires some basic setup before you can use it in a script. You must set the frame rate, start its internal clock, and start (`init`) Pygame.
+
+```
+fps = 40 # frame rate
+ani = 4 # animation cycles
+clock = pygame.time.Clock()
+pygame.init()
+```
+
+Now you can set your background.
+
+### Setting the background
+
+Before you continue, open a graphics application and create a background for your game world. Save it as `stage.png` inside a folder called `images` in your project directory.
+
+There are several free graphics applications you can use.
+
+ * [Krita][5] is a professional-level paint materials emulator that can be used to create beautiful images. If you're very interested in creating art for video games, you can even purchase a series of online [game art tutorials][6].
+ * [Pinta][7] is a basic, easy to learn paint application.
+ * [Inkscape][8] is a vector graphics application. Use it to draw with shapes, lines, splines, and Bézier curves.
+
+
+
+Your graphic doesn't have to be complex, and you can always go back and change it later. Once you have it, add this code in the setup section of your file:
+
+```
+world = pygame.display.set_mode([worldx,worldy])
+backdrop = pygame.image.load(os.path.join('images','stage.png').convert())
+backdropbox = world.get_rect()
+```
+
+If you're just going to fill the background of your game world with a color, all you need is:
+
+```
+world = pygame.display.set_mode([worldx,worldy])
+```
+
+You also must define a color to use. In your setup section, create some color definitions using values for red, green, and blue (RGB).
+
+```
+'''
+Setup
+'''
+
+BLUE = (25,25,200)
+BLACK = (23,23,23 )
+WHITE = (254,254,254)
+```
+
+At this point, you could theoretically start your game. The problem is, it would only last for a millisecond.
+
+To prove this, save your file as `your-name_game.py` (replace `your-name` with your actual name). Then launch your game.
+
+If you are using IDLE, run your game by selecting `Run Module` from the Run menu.
+
+If you are using Ninja, click the `Run file` button in the left button bar.
+
+![](https://opensource.com/sites/default/files/u128651/ninja_run_0.png)
+
+You can also run a Python script straight from a Unix terminal or a Windows command prompt.
+
+```
+$ python3 ./your-name_game.py
+```
+
+If you're using Windows, use this command:
+
+```
+py.exe your-name_game.py
+```
+
+However you launch it, don't expect much, because your game only lasts a few milliseconds right now. You can fix that in the next section.
+
+### Looping
+
+Unless told otherwise, a Python script runs once and only once. Computers are very fast these days, so your Python script runs in less than a second.
+
+To force your game to stay open and active long enough for someone to see it (let alone play it), use a `while` loop. To make your game remain open, you can set a variable to some value, then tell a `while` loop to keep looping for as long as the variable remains unchanged.
+
+This is often called a "main loop," and you can use the term `main` as your variable. Add this anywhere in your setup section:
+
+```
+main = True
+```
+
+During the main loop, use Pygame keywords to detect if keys on the keyboard have been pressed or released. Add this to your main loop section:
+
+```
+'''
+Main loop
+'''
+while main == True:
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit(); sys.exit()
+ main = False
+
+ if event.type == pygame.KEYDOWN:
+ if event.key == ord('q'):
+ pygame.quit()
+ sys.exit()
+ main = False
+```
+
+Also in your main loop, refresh your world's background.
+
+If you are using an image for the background:
+
+```
+world.blit(backdrop, backdropbox)
+```
+
+If you are using a color for the background:
+
+```
+world.fill(BLUE)
+```
+
+Finally, tell Pygame to refresh everything on the screen and advance the game's internal clock.
+
+```
+ pygame.display.flip()
+ clock.tick(fps)
+```
+
+Save your file, and run it again to see the most boring game ever created.
+
+To quit the game, press `q` on your keyboard.
+
+In the [next article][9] of this series, I'll show you how to add to your currently empty game world, so go ahead and start creating some graphics to use!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/17/12/game-framework-python
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [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/article/17/10/python-101
+[2]: http://www.pygame.org/wiki/about
+[3]: https://en.wikipedia.org/wiki/IDLE
+[4]: http://ninja-ide.org/
+[5]: http://krita.org
+[6]: https://gumroad.com/l/krita-game-art-tutorial-1
+[7]: https://pinta-project.com/pintaproject/pinta/releases
+[8]: http://inkscape.org
+[9]: https://opensource.com/article/17/12/program-game-python-part-3-spawning-player
diff --git a/sources/tech/20171215 How to add a player to your Python game.md b/sources/tech/20171215 How to add a player to your Python game.md
new file mode 100644
index 0000000000..caa1e4754e
--- /dev/null
+++ b/sources/tech/20171215 How to add a player to your Python game.md
@@ -0,0 +1,162 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (How to add a player to your Python game)
+[#]: via: (https://opensource.com/article/17/12/game-python-add-a-player)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+How to add a player to your Python game
+======
+Part three of a series on building a game from scratch with Python.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python3-game.png?itok=jG9UdwC3)
+
+In the [first article of this series][1], I explained how to use Python to create a simple, text-based dice game. In the second part, I showed you how to build a game from scratch, starting with [creating the game's environment][2]. But every game needs a player, and every player needs a playable character, so that's what we'll do next in the third part of the series.
+
+In Pygame, the icon or avatar that a player controls is called a sprite. If you don't have any graphics to use for a player sprite yet, create something for yourself using [Krita][3] or [Inkscape][4]. If you lack confidence in your artistic skills, you can also search [OpenClipArt.org][5] or [OpenGameArt.org][6] for something pre-generated. Then, if you didn't already do so in the previous article, create a directory called `images` alongside your Python project directory. Put the images you want to use in your game into the `images` folder.
+
+To make your game truly exciting, you ought to use an animated sprite for your hero. It means you have to draw more assets, but it makes a big difference. The most common animation is a walk cycle, a series of drawings that make it look like your sprite is walking. The quick and dirty version of a walk cycle requires four drawings.
+
+![](https://opensource.com/sites/default/files/u128651/walk-cycle-poses.jpg)
+
+Note: The code samples in this article allow for both a static player sprite and an animated one.
+
+Name your player sprite `hero.png`. If you're creating an animated sprite, append a digit after the name, starting with `hero1.png`.
+
+### Create a Python class
+
+In Python, when you create an object that you want to appear on screen, you create a class.
+
+Near the top of your Python script, add the code to create a player. In the code sample below, the first three lines are already in the Python script that you're working on:
+
+```
+import pygame
+import sys
+import os # new code below
+
+class Player(pygame.sprite.Sprite):
+ '''
+ Spawn a player
+ '''
+ def __init__(self):
+ pygame.sprite.Sprite.__init__(self)
+ self.images = []
+ img = pygame.image.load(os.path.join('images','hero.png')).convert()
+ self.images.append(img)
+ self.image = self.images[0]
+ self.rect = self.image.get_rect()
+```
+
+If you have a walk cycle for your playable character, save each drawing as an individual file called `hero1.png` to `hero4.png` in the `images` folder.
+
+Use a loop to tell Python to cycle through each file.
+
+```
+'''
+Objects
+'''
+
+class Player(pygame.sprite.Sprite):
+ '''
+ Spawn a player
+ '''
+ def __init__(self):
+ pygame.sprite.Sprite.__init__(self)
+ self.images = []
+ for i in range(1,5):
+ img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert()
+ self.images.append(img)
+ self.image = self.images[0]
+ self.rect = self.image.get_rect()
+```
+
+### Bring the player into the game world
+
+Now that a Player class exists, you must use it to spawn a player sprite in your game world. If you never call on the Player class, it never runs, and there will be no player. You can test this out by running your game now. The game will run just as well as it did at the end of the previous article, with the exact same results: an empty game world.
+
+To bring a player sprite into your world, you must call the Player class to generate a sprite and then add it to a Pygame sprite group. In this code sample, the first three lines are existing code, so add the lines afterwards:
+
+```
+world = pygame.display.set_mode([worldx,worldy])
+backdrop = pygame.image.load(os.path.join('images','stage.png')).convert()
+backdropbox = screen.get_rect()
+
+# new code below
+
+player = Player() # spawn player
+player.rect.x = 0 # go to x
+player.rect.y = 0 # go to y
+player_list = pygame.sprite.Group()
+player_list.add(player)
+```
+
+Try launching your game to see what happens. Warning: it won't do what you expect. When you launch your project, the player sprite doesn't spawn. Actually, it spawns, but only for a millisecond. How do you fix something that only happens for a millisecond? You might recall from the previous article that you need to add something to the main loop. To make the player spawn for longer than a millisecond, tell Python to draw it once per loop.
+
+Change the bottom clause of your loop to look like this:
+
+```
+ world.blit(backdrop, backdropbox)
+ player_list.draw(screen) # draw player
+ pygame.display.flip()
+ clock.tick(fps)
+```
+
+Launch your game now. Your player spawns!
+
+### Setting the alpha channel
+
+Depending on how you created your player sprite, it may have a colored block around it. What you are seeing is the space that ought to be occupied by an alpha channel. It's meant to be the "color" of invisibility, but Python doesn't know to make it invisible yet. What you are seeing, then, is the space within the bounding box (or "hit box," in modern gaming terms) around the sprite.
+
+![](https://opensource.com/sites/default/files/u128651/greenscreen.jpg)
+
+You can tell Python what color to make invisible by setting an alpha channel and using RGB values. If you don't know the RGB values your drawing uses as alpha, open your drawing in Krita or Inkscape and fill the empty space around your drawing with a unique color, like #00ff00 (more or less a "greenscreen green"). Take note of the color's hex value (#00ff00, for greenscreen green) and use that in your Python script as the alpha channel.
+
+Using alpha requires the addition of two lines in your Sprite creation code. Some version of the first line is already in your code. Add the other two lines:
+
+```
+ img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert()
+ img.convert_alpha() # optimise alpha
+ img.set_colorkey(ALPHA) # set alpha
+```
+
+Python doesn't know what to use as alpha unless you tell it. In the setup area of your code, add some more color definitions. Add this variable definition anywhere in your setup section:
+
+```
+ALPHA = (0, 255, 0)
+```
+
+In this example code, **0,255,0** is used, which is the same value in RGB as #00ff00 is in hex. You can get all of these color values from a good graphics application like [GIMP][7], Krita, or Inkscape. Alternately, you can also detect color values with a good system-wide color chooser, like [KColorChooser][8].
+
+![](https://opensource.com/sites/default/files/u128651/kcolor.png)
+
+If your graphics application is rendering your sprite's background as some other value, adjust the values of your alpha variable as needed. No matter what you set your alpha value, it will be made "invisible." RGB values are very strict, so if you need to use 000 for alpha, but you need 000 for the black lines of your drawing, just change the lines of your drawing to 111, which is close enough to black that nobody but a computer can tell the difference.
+
+Launch your game to see the results.
+
+![](https://opensource.com/sites/default/files/u128651/alpha.jpg)
+
+In the [fourth part of this series][9], I'll show you how to make your sprite move. How exciting!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/17/12/game-python-add-a-player
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [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/article/17/10/python-101
+[2]: https://opensource.com/article/17/12/program-game-python-part-2-creating-game-world
+[3]: http://krita.org
+[4]: http://inkscape.org
+[5]: http://openclipart.org
+[6]: https://opengameart.org/
+[7]: http://gimp.org
+[8]: https://github.com/KDE/kcolorchooser
+[9]: https://opensource.com/article/17/12/program-game-python-part-4-moving-your-sprite
diff --git a/sources/tech/20180112 8 KDE Plasma Tips and Tricks to Improve Your Productivity.md b/sources/tech/20180112 8 KDE Plasma Tips and Tricks to Improve Your Productivity.md
deleted file mode 100644
index 4335a7a98d..0000000000
--- a/sources/tech/20180112 8 KDE Plasma Tips and Tricks to Improve Your Productivity.md
+++ /dev/null
@@ -1,97 +0,0 @@
-8 KDE Plasma Tips and Tricks to Improve Your Productivity
-======
-
-[#] leon-shi is translating
-![](https://www.maketecheasier.com/assets/uploads/2018/01/kde-plasma-desktop-featured.jpg)
-
-KDE's Plasma is easily one of the most powerful desktop environments available for Linux. It's highly configurable, and it looks pretty good, too. That doesn't amount to a whole lot unless you can actually get things done.
-
-You can easily configure Plasma and make use of a lot of its convenient and time-saving features to boost your productivity and have a desktop that empowers you, rather than getting in your way.
-
-These tips aren't in any particular order, so you don't need to prioritize. Pick the ones that best fit your workflow.
-
- **Related** : [10 of the Best KDE Plasma Applications You Should Try][1]
-
-### 1. Multimedia Controls
-
-This isn't so much of a tip as it is something that's good to keep in mind. Plasma keeps multimedia controls everywhere. You don't need to open your media player every time you need to pause, resume, or skip a song; you can mouse over the minimized window or even control it via the lock screen. There's no need to scramble to log in to change a song or because you forgot to pause one.
-
-### 2. KRunner
-
-![KDE Plasma KRunner][2]
-
-KRunner is an often under-appreciated feature of the Plasma desktop. Most people are used to digging through the application launcher menu to find the program that they're looking to launch. That's not necessary with KRunner.
-
-To use KRunner, make sure that your focus is on the desktop itself. (Click on it instead of a window.) Then, start typing the name of the program that you want. KRunner will automatically drop down from the top of your screen with suggestions. Click or press Enter on the one you're looking for. It's much faster than remembering which category your program is under.
-
-### 3. Jump Lists
-
-![KDE Plasma Jump Lists][3]
-
-Jump lists are a fairly recent addition to the Plasma desktop. They allow you to launch an application directly to a specific section or feature.
-
-So if you have a launcher on a menu bar, you can right-click and get a list of places to jump to. Select where you want to go, and you're off.
-
-### 4. KDE Connect
-
-![KDE Connect Menu Android][4]
-
-[KDE Connect][5] is a massive help if you have an Android phone. It connects the phone to your desktop so you can share things seamlessly between the devices.
-
-With KDE Connect, you can see your [Android device's notification][6] on your desktop in real time. It also enables you to send and receive text messages from Plasma without ever picking up your phone.
-
-KDE Connect also lets you send files and share web pages between your phone and your computer. You can easily move from one device to the other without a lot of hassle or losing your train of thought.
-
-### 5. Plasma Vaults
-
-![KDE Plasma Vault][7]
-
-Plasma Vaults are another new addition to the Plasma desktop. They are KDE's simple solution to encrypted files and folders. If you don't work with encrypted files, this one won't really save you any time. If you do, though, vaults are a much simpler approach.
-
-Plasma Vaults let you create encrypted directories as a regular user without root and manage them from your task bar. You can mount and unmount the directories on the fly without the need for external programs or additional privileges.
-
-### 6. Pager Widget
-
-![KDE Plasma Pager][8]
-
-Configure your desktop with the pager widget. It allows you to easily access three additional workspaces for even more screen room.
-
-Add the widget to your menu bar, and you can slide between multiple workspaces. These are all the size of your screen, so you gain multiple times the total screen space. That lets you lay out more windows without getting confused by a minimized mess or disorganization.
-
-### 7. Create a Dock
-
-![KDE Plasma Dock][9]
-
-Plasma is known for its flexibility and the room it allows for configuration. Use that to your advantage. If you have programs that you're always using, consider setting up an OS X style dock with your most used applications. You'll be able to get them with a single click rather than going through a menu or typing in their name.
-
-### 8. Add a File Tree to Dolphin
-
-![Plasma Dolphin Directory][10]
-
-It's much easier to navigate folders in a directory tree. Dolphin, Plasma's default file manager, has built-in functionality to display a directory listing in the form of a tree on the side of the folder window.
-
-To enable the directory tree, click on the "Control" tab, then "Configure Dolphin," "View Modes," and "Details." Finally, select "Expandable Folders."
-
-Remember that these tips are just tips. Don't try to force yourself to do something that's getting in your way. You may hate using file trees in Dolphin. You may never use Pager. That's alright. There may even be something that you personally like that's not listed here. Do what works for you. That said, at least a few of these should shave some serious time out of your work day.
-
---------------------------------------------------------------------------------
-
-via: https://www.maketecheasier.com/kde-plasma-tips-tricks-improve-productivity/
-
-作者:[Nick Congleton][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.maketecheasier.com/author/nickcongleton/
-[1]:https://www.maketecheasier.com/10-best-kde-plasma-applications/ (10 of the Best KDE Plasma Applications You Should Try)
-[2]:https://www.maketecheasier.com/assets/uploads/2017/10/pe-krunner.jpg (KDE Plasma KRunner)
-[3]:https://www.maketecheasier.com/assets/uploads/2017/10/pe-jumplist.jpg (KDE Plasma Jump Lists)
-[4]:https://www.maketecheasier.com/assets/uploads/2017/05/kde-connect-menu-e1494899929112.jpg (KDE Connect Menu Android)
-[5]:https://www.maketecheasier.com/send-receive-sms-linux-kde-connect/
-[6]:https://www.maketecheasier.com/android-notifications-ubuntu-kde-connect/
-[7]:https://www.maketecheasier.com/assets/uploads/2017/10/pe-vault.jpg (KDE Plasma Vault)
-[8]:https://www.maketecheasier.com/assets/uploads/2017/10/pe-pager.jpg (KDE Plasma Pager)
-[9]:https://www.maketecheasier.com/assets/uploads/2017/10/pe-dock.jpg (KDE Plasma Dock)
-[10]:https://www.maketecheasier.com/assets/uploads/2017/10/pe-dolphin.jpg (Plasma Dolphin Directory)
diff --git a/sources/tech/20180122 Ick- a continuous integration system.md b/sources/tech/20180122 Ick- a continuous integration system.md
deleted file mode 100644
index 4620e2c036..0000000000
--- a/sources/tech/20180122 Ick- a continuous integration system.md
+++ /dev/null
@@ -1,75 +0,0 @@
-Ick: a continuous integration system
-======
-**TL;DR:** Ick is a continuous integration or CI system. See for more information.
-
-More verbose version follows.
-
-### First public version released
-
-The world may not need yet another continuous integration system (CI), but I do. I've been unsatisfied with the ones I've tried or looked at. More importantly, I am interested in a few things that are more powerful than what I've ever even heard of. So I've started writing my own.
-
-My new personal hobby project is called ick. It is a CI system, which means it can run automated steps for building and testing software. The home page is at , and the [download][1] page has links to the source code and .deb packages and an Ansible playbook for installing it.
-
-I have now made the first publicly advertised release, dubbed ALPHA-1, version number 0.23. It is of alpha quality, and that means it doesn't have all the intended features and if any of the features it does have work, you should consider yourself lucky.
-
-### Invitation to contribute
-
-Ick has so far been my personal project. I am hoping to make it more than that, and invite contributions. See the [governance][2] page for the constitution, the [getting started][3] page for tips on how to start contributing, and the [contact][4] page for how to get in touch.
-
-### Architecture
-
-Ick has an architecture consisting of several components that communicate over HTTPS using RESTful APIs and JSON for structured data. See the [architecture][5] page for details.
-
-### Manifesto
-
-Continuous integration (CI) is a powerful tool for software development. It should not be tedious, fragile, or annoying. It should be quick and simple to set up, and work quietly in the background unless there's a problem in the code being built and tested.
-
-A CI system should be simple, easy, clear, clean, scalable, fast, comprehensible, transparent, reliable, and boost your productivity to get things done. It should not be a lot of effort to set up, require a lot of hardware just for the CI, need frequent attention for it to keep working, and developers should never have to wonder why something isn't working.
-
-A CI system should be flexible to suit your build and test needs. It should support multiple types of workers, as far as CPU architecture and operating system version are concerned.
-
-Also, like all software, CI should be fully and completely free software and your instance should be under your control.
-
-(Ick is little of this yet, but it will try to become all of it. In the best possible taste.)
-
-### Dreams of the future
-
-In the long run, I would ick to have features like ones described below. It may take a while to get all of them implemented.
-
- * A build may be triggered by a variety of events. Time is an obvious event, as is source code repository for the project changing. More powerfully, any build dependency changing, regardless of whether the dependency comes from another project built by ick, or a package from, say, Debian: ick should keep track of all the packages that get installed into the build environment of a project, and if any of their versions change, it should trigger the project build and tests again.
-
- * Ick should support building in (or against) any reasonable target, including any Linux distribution, any free operating system, and any non-free operating system that isn't brain-dead.
-
- * Ick should manage the build environment itself, and be able to do builds that are isolated from the build host or the network. This partially works: one can ask ick to build a container and run a build in the container. The container is implemented using systemd-nspawn. This can be improved upon, however. (If you think Docker is the only way to go, please contribute support for that.)
-
- * Ick should support any workers that it can control over ssh or a serial port or other such neutral communication channel, without having to install an agent of any kind on them. Ick won't assume that it can have, say, a full Java run time, so that the worker can be, say, a micro controller.
-
- * Ick should be able to effortlessly handle very large numbers of projects. I'm thinking here that it should be able to keep up with building everything in Debian, whenever a new Debian source package is uploaded. (Obviously whether that is feasible depends on whether there are enough resources to actually build things, but ick itself should not be the bottleneck.)
-
- * Ick should optionally provision workers as needed. If all workers of a certain type are busy, and ick's been configured to allow using more resources, it should do so. This seems like it would be easy to do with virtual machines, containers, cloud providers, etc.
-
- * Ick should be flexible in how it can notify interested parties, particularly about failures. It should allow an interested party to ask to be notified over IRC, Matrix, Mastodon, Twitter, email, SMS, or even by a phone call and speech syntethiser. "Hello, interested party. It is 04:00 and you wanted to be told when the hello package has been built for RISC-V."
-
-
-
-
-### Please give feedback
-
-If you try ick, or even if you've just read this far, please share your thoughts on it. See the [contact][4] page for where to send it. Public feedback is preferred over private, but if you prefer private, that's OK too.
-
---------------------------------------------------------------------------------
-
-via: https://blog.liw.fi/posts/2018/01/22/ick_a_continuous_integration_system/
-
-作者:[Lars Wirzenius][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://blog.liw.fi/
-[1]:http://ick.liw.fi/download/
-[2]:http://ick.liw.fi/governance/
-[3]:http://ick.liw.fi/getting-started/
-[4]:http://ick.liw.fi/contact/
-[5]:http://ick.liw.fi/architecture/
diff --git a/sources/tech/20180128 Get started with Org mode without Emacs.md b/sources/tech/20180128 Get started with Org mode without Emacs.md
deleted file mode 100644
index 75a5bcb092..0000000000
--- a/sources/tech/20180128 Get started with Org mode without Emacs.md
+++ /dev/null
@@ -1,78 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Get started with Org mode without Emacs)
-[#]: via: (https://opensource.com/article/19/1/productivity-tool-org-mode)
-[#]: author: (Kevin Sonney https://opensource.com/users/ksonney (Kevin Sonney))
-
-Get started with Org mode without Emacs
-======
-No, you don't need Emacs to use Org, the 16th in our series on open source tools that will make you more productive in 2019.
-
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/web_browser_desktop_devlopment_design_system_computer.jpg?itok=pfqRrJgh)
-
-There seems to be a mad rush at the beginning of every year to find ways to be more productive. New Year's resolutions, the itch to start the year off right, and of course, an "out with the old, in with the new" attitude all contribute to this. And the usual round of recommendations is heavily biased towards closed source and proprietary software. It doesn't have to be that way.
-
-Here's the 16th of my picks for 19 new (or new-to-you) open source tools to help you be more productive in 2019.
-
-### Org (without Emacs)
-
-[Org mode][1] (or just Org) is not in the least bit new, but there are still many people who have never used it. They would love to try it out to get a feel for how Org can help them be productive. But the biggest barrier is that Org is associated with Emacs, and many people think one requires the other. Not so! Org can be used with a variety of other tools and editors once you understand the basics.
-
-![](https://opensource.com/sites/default/files/uploads/org-1.png)
-
-Org, at its very heart, is a structured text file. It has headers, subheaders, and keywords that allow other tools to parse files into agendas and to-do lists. Org files can be edited with any flat-text editor (e.g., [Vim][2], [Atom][3], or [Visual Studio Code][4]), and many have plugins that help create and manage Org files.
-
-A basic Org file looks something like this:
-
-```
-* Task List
-** TODO Write Article for Day 16 - Org w/out emacs
- DEADLINE: <2019-01-25 12:00>
-*** DONE Write sample org snippet for article
- - Include at least one TODO and one DONE item
- - Show notes
- - Show SCHEDULED and DEADLINE
-*** TODO Take Screenshots
-** Dentist Appointment
- SCHEDULED: <2019-01-31 13:30-14:30>
-```
-
-Org uses an outline format that uses ***** as bullets to indicate an item's level. Any item that begins with the word TODO (yes, in all caps) is just that—a to-do item. The work DONE indicates it is completed. SCHEDULED and DEADLINE indicate dates and times relevant to the item. If there's no time in either field, the item is considered an all-day event.
-
-With the right plugins, your favorite text editor becomes a powerhouse of productivity and organization. For example, the [vim-orgmode][5] plugin's features include functions to create Org files, syntax highlighting, and key commands to generate agendas and comprehensive to-do lists across files.
-
-![](https://opensource.com/sites/default/files/uploads/org-2.png)
-
-The Atom [Organized][6] plugin adds a sidebar on the right side of the screen that shows the agenda and to-do items in Org files. It can read from multiple files by default with a path set up in the configuration options. The Todo sidebar allows you to click on a to-do item to mark it done, then automatically updates the source Org file.
-
-![](https://opensource.com/sites/default/files/uploads/org-3.png)
-
-There are also a whole host of tools that "speak Org" to help keep you productive. With libraries in Python, Perl, PHP, NodeJS, and more, you can develop your own scripts and tools. And, of course, there is also [Emacs][7], which has Org support within the core distribution.
-
-![](https://opensource.com/sites/default/files/uploads/org-4.png)
-
-Org mode is one of the best tools for keeping on track with what needs to be done and when. And, contrary to myth, it doesn't need Emacs, just a text editor.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/1/productivity-tool-org-mode
-
-作者:[Kevin Sonney][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/ksonney (Kevin Sonney)
-[b]: https://github.com/lujun9972
-[1]: https://orgmode.org/
-[2]: https://www.vim.org/
-[3]: https://atom.io/
-[4]: https://code.visualstudio.com/
-[5]: https://github.com/jceb/vim-orgmode
-[6]: https://atom.io/packages/organized
-[7]: https://www.gnu.org/software/emacs/
diff --git a/sources/tech/20180129 The 5 Best Linux Distributions for Development.md b/sources/tech/20180129 The 5 Best Linux Distributions for Development.md
deleted file mode 100644
index cc11407ff3..0000000000
--- a/sources/tech/20180129 The 5 Best Linux Distributions for Development.md
+++ /dev/null
@@ -1,158 +0,0 @@
-The 5 Best Linux Distributions for Development
-============================================================
-
-![Linux distros for devs](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/king-penguins_1920.jpg?itok=qmy8htw6 "Linux distros for devs")
-Jack Wallen looks at some of the best LInux distributions for development efforts.[Creative Commons Zero][6]
-
-When considering Linux, there are so many variables to take into account. What package manager do you wish to use? Do you prefer a modern or old-standard desktop interface? Is ease of use your priority? How flexible do you want your distribution? What task will the distribution serve?
-
-It is that last question which should often be considered first. Is the distribution going to work as a desktop or a server? Will you be doing network or system audits? Or will you be developing? If you’ve spent much time considering Linux, you know that for every task there are several well-suited distributions. This certainly holds true for developers. Even though Linux, by design, is an ideal platform for developers, there are certain distributions that rise above the rest, to serve as great operating systems to serve developers.
-
-I want to share what I consider to be some of the best distributions for your development efforts. Although each of these five distributions can be used for general purpose development (with maybe one exception), they each serve a specific purpose. You may or may not be surprised by the selections.
-
-With that said, let’s get to the choices.
-
-### Debian
-
-The [Debian][14] distribution winds up on the top of many a Linux list. With good reason. Debian is that distribution from which so many are based. It is this reason why many developers choose Debian. When you develop a piece of software on Debian, chances are very good that package will also work on [Ubuntu][15], [Linux Mint][16], [Elementary OS][17], and a vast collection of other distributions.
-
-Beyond that obvious answer, Debian also has a very large amount of applications available, by way of the default repositories (Figure 1).
-
-![Debian apps](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/devel_1.jpg?itok=3mpkS3Kp "Debian apps")
-Figure 1: Available applications from the standard Debian repositories.[Used with permission][1]
-
-To make matters even programmer-friendly, those applications (and their dependencies) are simple to install. Take, for instance, the build-essential package (which can be installed on any distribution derived from Debian). This package includes the likes of dkpg-dev, g++, gcc, hurd-dev, libc-dev, and make—all tools necessary for the development process. The build-essential package can be installed with the command sudo apt install build-essential.
-
-There are hundreds of other developer-specific applications available from the standard repositories, tools such as:
-
-* Autoconf—configure script builder
-
-* Autoproject—creates a source package for a new program
-
-* Bison—general purpose parser generator
-
-* Bluefish—powerful GUI editor, targeted towards programmers
-
-* Geany—lightweight IDE
-
-* Kate—powerful text editor
-
-* Eclipse—helps builders independently develop tools that integrate with other people’s tools
-
-The list goes on and on.
-
-Debian is also as rock-solid a distribution as you’ll find, so there’s very little concern you’ll lose precious work, by way of the desktop crashing. As a bonus, all programs included with Debian have met the [Debian Free Software Guidelines][18], which adheres to the following “social contract”:
-
-* Debian will remain 100% free.
-
-* We will give back to the free software community.
-
-* We will not hide problems.
-
-* Our priorities are our users and free software
-
-* Works that do not meet our free software standards are included in a non-free archive.
-
-Also, if you’re new to developing on Linux, Debian has a handy [Programming section in their user manual][19].
-
-### openSUSE Tumbleweed
-
-If you’re looking to develop with a cutting-edge, rolling release distribution, [openSUSE][20] offers one of the best in [Tumbleweed][21]. Not only will you be developing with the most up to date software available, you’ll be doing so with the help of openSUSE’s amazing administrator tools … of which includes YaST. If you’re not familiar with YaST (Yet another Setup Tool), it’s an incredibly powerful piece of software that allows you to manage the whole of the platform, from one convenient location. From within YaST, you can also install using RPM Groups. Open YaST, click on RPM Groups (software grouped together by purpose), and scroll down to the Development section to see the large amount of groups available for installation (Figure 2).
-
-
-![openSUSE](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/devel_2.jpg?itok=EeCjn1cx "openSUSE")
-Figure 2: Installing package groups in openSUSE Tumbleweed.[Creative Commons Zero][2]
-
-openSUSE also allows you to quickly install all the necessary devtools with the simple click of a weblink. Head over to the [rpmdevtools install site][22] and click the link for Tumbleweed. This will automatically add the necessary repository and install rpmdevtools.
-
-By developing with a rolling release distribution, you know you’re working with the most recent releases of installed software.
-
-### CentOS
-
-Let’s face it, [Red Hat Enterprise Linux][23] (RHEL) is the de facto standard for enterprise businesses. If you’re looking to develop for that particular platform, and you can’t afford a RHEL license, you cannot go wrong with [CentOS][24]—which is, effectively, a community version of RHEL. You will find many of the packages found on CentOS to be the same as in RHEL—so once you’re familiar with developing on one, you’ll be fine on the other.
-
-If you’re serious about developing on an enterprise-grade platform, you cannot go wrong starting with CentOS. And because CentOS is a server-specific distribution, you can more easily develop for a web-centric platform. Instead of developing your work and then migrating it to a server (hosted on a different machine), you can easily have CentOS setup to serve as an ideal host for both developing and testing.
-
-Looking for software to meet your development needs? You only need open up the CentOS Application Installer, where you’ll find a Developer section that includes a dedicated sub-section for Integrated Development Environments (IDEs - Figure 3).
-
-![CentOS](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/devel_3.jpg?itok=0oe4zj9j "CentOS")
-Figure 3: Installing a powerful IDE is simple in CentOS.[Used with permission][3]
-
-CentOS also includes Security Enhanced Linux (SELinux), which makes it easier for you to test your software’s ability to integrate with the same security platform found in RHEL. SELinux can often cause headaches for poorly designed software, so having it at the ready can be a real boon for ensuring your applications work on the likes of RHEL. If you’re not sure where to start with developing on CentOS 7, you can read through the [RHEL 7 Developer Guide][25].
-
-### Raspbian
-
-Let’s face it, embedded systems are all the rage. One easy means of working with such systems is via the Raspberry Pi—a tiny footprint computer that has become incredibly powerful and flexible. In fact, the Raspberry Pi has become the hardware used by DIYers all over the planet. Powering those devices is the [Raspbian][26] operating system. Raspbian includes tools like [BlueJ][27], [Geany][28], [Greenfoot][29], [Sense HAT Emulator][30], [Sonic Pi][31], and [Thonny Python IDE][32], [Python][33], and [Scratch][34], so you won’t want for the necessary development software. Raspbian also includes a user-friendly desktop UI (Figure 4), to make things even easier.
-
-![Raspbian](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/devel_4.jpg?itok=VLoYak6L "Raspbian")
-Figure 4: The Raspbian main menu, showing pre-installed developer software.[Used with permission][4]
-
-For anyone looking to develop for the Raspberry Pi platform, Raspbian is a must have. If you’d like to give Raspbian a go, without the Raspberry Pi hardware, you can always install it as a VirtualBox virtual machine, by way of the ISO image found [here][35].
-
-### Pop!_OS
-
-Don’t let the name full you, [System76][36]’s [Pop!_OS][37] entry into the world of operating systems is serious. And although what System76 has done to this Ubuntu derivative may not be readily obvious, it is something special.
-
-The goal of System76 is to create an operating system specific to the developer, maker, and computer science professional. With a newly-designed GNOME theme, Pop!_OS is beautiful (Figure 5) and as highly functional as you would expect from both the hardware maker and desktop designers.
-
-### [devel_5.jpg][11]
-
-![Pop!_OS](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/devel_5.jpg?itok=n4K7k7Gd "Pop!_OS")
-Figure 5: The Pop!_OS Desktop.[Used with permission][5]
-
-But what makes Pop!_OS special is the fact that it is being developed by a company dedicated to Linux hardware. This means, when you purchase a System76 laptop, desktop, or server, you know the operating system will work seamlessly with the hardware—on a level no other company can offer. I would predict that, with Pop!_OS, System76 will become the Apple of Linux.
-
-### Time for work
-
-In their own way, each of these distributions. You have a stable desktop (Debian), a cutting-edge desktop (openSUSE Tumbleweed), a server (CentOS), an embedded platform (Raspbian), and a distribution to seamless meld with hardware (Pop!_OS). With the exception of Raspbian, any one of these distributions would serve as an outstanding development platform. Get one installed and start working on your next project with confidence.
-
- _Learn more about Linux through the free ["Introduction to Linux" ][13]course from The Linux Foundation and edX._
-
---------------------------------------------------------------------------------
-
-via: https://www.linux.com/blog/learn/intro-to-linux/2018/1/5-best-linux-distributions-development
-
-作者:[JACK WALLEN ][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://www.linux.com/users/jlwallen
-[1]:https://www.linux.com/licenses/category/used-permission
-[2]:https://www.linux.com/licenses/category/creative-commons-zero
-[3]:https://www.linux.com/licenses/category/used-permission
-[4]:https://www.linux.com/licenses/category/used-permission
-[5]:https://www.linux.com/licenses/category/used-permission
-[6]:https://www.linux.com/licenses/category/creative-commons-zero
-[7]:https://www.linux.com/files/images/devel1jpg
-[8]:https://www.linux.com/files/images/devel2jpg
-[9]:https://www.linux.com/files/images/devel3jpg
-[10]:https://www.linux.com/files/images/devel4jpg
-[11]:https://www.linux.com/files/images/devel5jpg
-[12]:https://www.linux.com/files/images/king-penguins1920jpg
-[13]:https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
-[14]:https://www.debian.org/
-[15]:https://www.ubuntu.com/
-[16]:https://linuxmint.com/
-[17]:https://elementary.io/
-[18]:https://www.debian.org/social_contract
-[19]:https://www.debian.org/doc/manuals/debian-reference/ch12.en.html
-[20]:https://www.opensuse.org/
-[21]:https://en.opensuse.org/Portal:Tumbleweed
-[22]:https://software.opensuse.org/download.html?project=devel%3Atools&package=rpmdevtools
-[23]:https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux
-[24]:https://www.centos.org/
-[25]:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/pdf/developer_guide/Red_Hat_Enterprise_Linux-7-Developer_Guide-en-US.pdf
-[26]:https://www.raspberrypi.org/downloads/raspbian/
-[27]:https://www.bluej.org/
-[28]:https://www.geany.org/
-[29]:https://www.greenfoot.org/
-[30]:https://www.raspberrypi.org/blog/sense-hat-emulator/
-[31]:http://sonic-pi.net/
-[32]:http://thonny.org/
-[33]:https://www.python.org/
-[34]:https://scratch.mit.edu/
-[35]:http://rpf.io/x86iso
-[36]:https://system76.com/
-[37]:https://system76.com/pop
diff --git a/sources/tech/20180202 Tips for success when getting started with Ansible.md b/sources/tech/20180202 Tips for success when getting started with Ansible.md
deleted file mode 100644
index 539db2ac86..0000000000
--- a/sources/tech/20180202 Tips for success when getting started with Ansible.md
+++ /dev/null
@@ -1,73 +0,0 @@
-Tips for success when getting started with Ansible
-======
-
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bus-big-data.png?itok=L34b2exg)
-
-Ansible is an open source automation tool used to configure servers, install software, and perform a wide variety of IT tasks from one central location. It is a one-to-many agentless mechanism where all instructions are run from a control machine that communicates with remote clients over SSH, although other protocols are also supported.
-
-While targeted for system administrators with privileged access who routinely perform tasks such as installing and configuring applications, Ansible can also be used by non-privileged users. For example, a database administrator using the `mysql` login ID could use Ansible to create databases, add users, and define access-level controls.
-
-Let's go over a very simple example where a system administrator provisions 100 servers each day and must run a series of Bash commands on each one before handing it off to users.
-
-![](https://opensource.com/sites/default/files/u128651/mapping-bash-commands-to-ansible.png)
-
-This is a simple example, but should illustrate how easily commands can be specified in yaml files and executed on remote servers. In a heterogeneous environment, conditional statements can be added so that certain commands are only executed in certain servers (e.g., "only execute `yum` commands in systems that are not Ubuntu or Debian").
-
-One important feature in Ansible is that a playbook describes a desired state in a computer system, so a playbook can be run multiple times against a server without impacting its state. If a certain task has already been implemented (e.g., "user `sysman` already exists"), then Ansible simply ignores it and moves on.
-
-### Definitions
-
- * **Tasks:**``A task is the smallest unit of work. It can be an action like "Install a database," "Install a web server," "Create a firewall rule," or "Copy this configuration file to that server."
- * **Plays:**``A play is made up of tasks. For example, the play: "Prepare a database to be used by a web server" is made up of tasks: 1) Install the database package; 2) Set a password for the database administrator; 3) Create a database; and 4) Set access to the database.
- * **Playbook:**``A playbook is made up of plays. A playbook could be: "Prepare my website with a database backend," and the plays would be 1) Set up the database server; and 2) Set up the web server.
- * **Roles:**``Roles are used to save and organize playbooks and allow sharing and reuse of playbooks. Following the previous examples, if you need to fully configure a web server, you can use a role that others have written and shared to do just that. Since roles are highly configurable (if written correctly), they can be easily reused to suit any given deployment requirements.
- * **Ansible Galaxy:**``Ansible [Galaxy][1] is an online repository where roles are uploaded so they can be shared with others. It is integrated with GitHub, so roles can be organized into Git repositories and then shared via Ansible Galaxy.
-
-
-
-These definitions and their relationships are depicted here:
-
-![](https://opensource.com/sites/default/files/u128651/ansible-definitions.png)
-
-Please note this is just one way to organize the tasks that need to be executed. We could have split up the installation of the database and the web server into separate playbooks and into different roles. Most roles in Ansible Galaxy install and configure individual applications. You can see examples for installing [mysql][2] and installing [httpd][3].
-
-### Tips for writing playbooks
-
-The best source for learning Ansible is the official [documentation][4] site. And, as usual, online search is your friend. I recommend starting with simple tasks, like installing applications or creating users. Once you are ready, follow these guidelines:
-
- * When testing, use a small subset of servers so that your plays execute faster. If they are successful in one server, they will be successful in others.
- * Always do a dry run to make sure all commands are working (run with `--check-mode` flag).
- * Test as often as you need to without fear of breaking things. Tasks describe a desired state, so if a desired state is already achieved, it will simply be ignored.
- * Be sure all host names defined in `/etc/ansible/hosts` are resolvable.
- * Because communication to remote hosts is done using SSH, keys have to be accepted by the control machine, so either 1) exchange keys with remote hosts prior to starting; or 2) be ready to type in "Yes" to accept SSH key exchange requests for each remote host you want to manage.
- * Although you can combine tasks for different Linux distributions in one playbook, it's cleaner to write a separate playbook for each distro.
-
-
-
-### In the final analysis
-
-Ansible is a great choice for implementing automation in your data center:
-
- * It's agentless, so it is simpler to install than other automation tools.
- * Instructions are in YAML (though JSON is also supported) so it's easier than writing shell scripts.
- * It's open source software, so contribute back to it and make it even better!
-
-
-
-How have you used Ansible to automate your data center? Share your experience in the comments.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/2/tips-success-when-getting-started-ansible
-
-作者:[Jose Delarosa][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/jdelaros1
-[1]:https://galaxy.ansible.com/
-[2]:https://galaxy.ansible.com/bennojoy/mysql/
-[3]:https://galaxy.ansible.com/xcezx/httpd/
-[4]:http://docs.ansible.com/
diff --git a/sources/tech/20180220 JSON vs XML vs TOML vs CSON vs YAML.md b/sources/tech/20180220 JSON vs XML vs TOML vs CSON vs YAML.md
index eeb290c82b..bb723b75e6 100644
--- a/sources/tech/20180220 JSON vs XML vs TOML vs CSON vs YAML.md
+++ b/sources/tech/20180220 JSON vs XML vs TOML vs CSON vs YAML.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: ( )
+[#]: translator: (GraveAccent)
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20180307 3 open source tools for scientific publishing.md b/sources/tech/20180307 3 open source tools for scientific publishing.md
deleted file mode 100644
index 0bbc3578e9..0000000000
--- a/sources/tech/20180307 3 open source tools for scientific publishing.md
+++ /dev/null
@@ -1,78 +0,0 @@
-3 open source tools for scientific publishing
-======
-
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/LIFE_science.png?itok=WDKARWGV)
-One industry that lags behind others in the adoption of digital or open source tools is the competitive and lucrative world of scientific publishing. Worth over £19B ($26B) annually, according to figures published by Stephen Buranyi in [The Guardian][1] last year, the system for selecting, publishing, and sharing even the most important scientific research today still bears many of the constraints of print media. New digital-era technologies present a huge opportunity to accelerate discovery, make science collaborative instead of competitive, and redirect investments from infrastructure development into research that benefits society.
-
-The non-profit [eLife initiative][2] was established by the funders of research, in part to encourage the use of these technologies to this end. In addition to publishing an open-access journal for important advances in life science and biomedical research, eLife has made itself into a platform for experimentation and showcasing innovation in research communication—with most of this experimentation based around the open source ethos.
-
-Working on open publishing infrastructure projects gives us the opportunity to accelerate the reach and adoption of the types of technology and user experience (UX) best practices that we consider important to the advancement of the academic publishing industry. Speaking very generally, the UX of open source products is often left undeveloped, which can in some cases dissuade people from using it. As part of our investment in OSS development, we place a strong emphasis on UX in order to encourage users to adopt these products.
-
-All of our code is open source, and we actively encourage community involvement in our projects, which to us means faster iteration, more experimentation, greater transparency, and increased reach for our work.
-
-The projects that we are involved in, such as the development of Libero (formerly known as [eLife Continuum][3]) and the [Reproducible Document Stack][4], along with our recent collaboration with [Hypothesis][5], show how OSS can be used to bring about positive changes in the assessment, publication, and communication of new discoveries.
-
-### Libero
-
-Libero is a suite of services and applications available to publishers that includes a post-production publishing system, a full front-end user interface pattern suite, Libero's Lens Reader, an open API, and search and recommendation engines.
-
-Last year, we took a user-driven approach to redesigning the front end of Libero, resulting in less distracting site “furniture” and a greater focus on research articles. We tested and iterated all the key functional areas of the site with members of the eLife community to ensure the best possible reading experience for everyone. The site’s new API also provides simpler access to content for machine readability, including text mining, machine learning, and online application development.
-
-The content on our website and the patterns that drive the new design are all open source to encourage future product development for both eLife and other publishers that wish to use it.
-
-### The Reproducible Document Stack
-
-In collaboration with [Substance][6] and [Stencila][7], eLife is also engaged in a project to create a Reproducible Document Stack (RDS)—an open stack of tools for authoring, compiling, and publishing computationally reproducible manuscripts online.
-
-Today, an increasing number of researchers are able to document their computational experiments through languages such as [R Markdown][8] and [Python][9]. These can serve as important parts of the experimental record, and while they can be shared independently from or alongside the resulting research article, traditional publishing workflows tend to relegate these assets as a secondary class of content. To publish papers, researchers using these languages often have little option but to submit their computational results as “flattened” outputs in the form of figures, losing much of the value and reusability of the code and data references used in the computation. And while electronic notebook solutions such as [Jupyter][10] can enable researchers to publish their code in an easily reusable and executable form, that’s still in addition to, rather than as an integral part of, the published manuscript.
-
-The [Reproducible Document Stack][11] project aims to address these challenges through development and publication of a working prototype of a reproducible manuscript that treats code and data as integral parts of the document, demonstrating a complete end-to-end technology stack from authoring through to publication. It will ultimately allow authors to submit their manuscripts in a format that includes embedded code blocks and computed outputs (statistical results, tables, or graphs), and have those assets remain both visible and executable throughout the publication process. Publishers will then be able to preserve these assets directly as integral parts of the published online article.
-
-### Open annotation with Hypothesis
-
-Most recently, we introduced open annotation in collaboration with [Hypothesis][12] to enable users of our website to make comments, highlight important sections of articles, and engage with the reading public online.
-
-Through this collaboration, the open source Hypothesis software was customized with new moderation features, single sign-on authentication, and user-interface customization options, giving publishers more control over its implementation on their sites. These enhancements are already driving higher-quality discussions around published scholarly content.
-
-The tool can be integrated seamlessly into publishers’ websites, with the scholarly publishing platform [PubFactory][13] and content solutions provider [Ingenta][14] already taking advantage of its improved feature set. [HighWire][15] and [Silverchair][16] are also offering their publishers the opportunity to implement the service.
-
-### Other industries and open source
-
-Over time, we hope to see more publishers adopt Hypothesis, Libero, and other projects to help them foster the discovery and reuse of important scientific research. But the opportunities for innovation eLife has been able to leverage because of these and other OSS technologies are also prevalent in other industries.
-
-The world of data science would be nowhere without the high-quality, well-supported open source software and the communities built around it; [TensorFlow][17] is a leading example of this. Thanks to OSS and its communities, all areas of AI and machine learning have seen rapid acceleration and advancement compared to other areas of computing. Similar is the explosion in usage of Linux as a cloud web host, followed by containerization with Docker, and now the growth of Kubernetes, one of the most popular open source projects on GitHub.
-
-All of these technologies enable organizations to do more with less and focus on innovation instead of reinventing the wheel. And in the end, that’s the real benefit of OSS: It lets us all learn from each other’s failures while building on each other's successes.
-
-We are always on the lookout for opportunities to engage with the best emerging talent and ideas at the interface of research and technology. Find out more about some of these engagements on [eLife Labs][18], or contact [innovation@elifesciences.org][19] for more information.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/3/scientific-publishing-software
-
-作者:[Paul Shanno][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/pshannon
-[1]:https://www.theguardian.com/science/2017/jun/27/profitable-business-scientific-publishing-bad-for-science
-[2]:https://elifesciences.org/about
-[3]:https://elifesciences.org/inside-elife/33e4127f/elife-introduces-continuum-a-new-open-source-tool-for-publishing
-[4]:https://elifesciences.org/for-the-press/e6038800/elife-supports-development-of-open-technology-stack-for-publishing-reproducible-manuscripts-online
-[5]:https://elifesciences.org/for-the-press/81d42f7d/elife-enhances-open-annotation-with-hypothesis-to-promote-scientific-discussion-online
-[6]:https://github.com/substance
-[7]:https://github.com/stencila/stencila
-[8]:https://rmarkdown.rstudio.com/
-[9]:https://www.python.org/
-[10]:http://jupyter.org/
-[11]:https://elifesciences.org/labs/7dbeb390/reproducible-document-stack-supporting-the-next-generation-research-article
-[12]:https://github.com/hypothesis
-[13]:http://www.pubfactory.com/
-[14]:http://www.ingenta.com/
-[15]:https://github.com/highwire
-[16]:https://www.silverchair.com/community/silverchair-universe/hypothesis/
-[17]:https://www.tensorflow.org/
-[18]:https://elifesciences.org/labs
-[19]:mailto:innovation@elifesciences.org
diff --git a/sources/tech/20180507 Modularity in Fedora 28 Server Edition.md b/sources/tech/20180507 Modularity in Fedora 28 Server Edition.md
new file mode 100644
index 0000000000..0b5fb0415b
--- /dev/null
+++ b/sources/tech/20180507 Modularity in Fedora 28 Server Edition.md
@@ -0,0 +1,76 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Modularity in Fedora 28 Server Edition)
+[#]: via: (https://fedoramagazine.org/wp-content/uploads/2018/05/f28-server-modularity-816x345.jpg)
+[#]: author: (Stephen Gallagher https://fedoramagazine.org/author/sgallagh/)
+
+Modularity in Fedora 28 Server Edition
+======
+
+![](https://fedoramagazine.org/wp-content/uploads/2018/05/f28-server-modularity-816x345.jpg)
+
+### What is Modularity?
+
+A classic conundrum that all open-source distributions have faced is the “too fast/too slow” problem. Users install an operating system in order to enable the use of their applications. A comprehensive distribution like Fedora has an advantage and a disadvantage to the large amount of available software. While the package the user wants may be available, it might not be available in the version needed. Here’s how Modularity can help solve that problem.
+
+Fedora sometimes moves too fast for some users. Its rapid release cycle and desire to carry the latest stable software can result in breaking compatibility with applications. If a user can’t run a web application because Fedora upgraded a web framework to an incompatible version, it can be very frustrating. The classic answer to the “too fast” problem has been “Fedora should have an LTS release.” However, this approach only solves half the problem and makes the flip side of this conundrum worse.
+
+There are also times when Fedora moves too slowly for some of its users. For example, a Fedora release may be poorly-timed alongside the release of other desirable software. Once a Fedora release is declared stable, packagers must abide by the [Stable Updates Policy][1] and not introduce incompatible changes into the system.
+
+Fedora Modularity addresses both sides of this problem. Fedora will still ship a standard release under its traditional policy. However, it will also ship a set of modules that define alternative versions of popular software. Those in the “too fast” camp still have the benefit of Fedora’s newer kernel and other general platform enhancements. In addition, they still have access to older frameworks or toolchains that support their applications.
+
+In addition, those users who like to live closer to the edge can access newer software than was available at release time.
+
+### What is Modularity not?
+
+Modularity is not a drop-in replacement for [Software Collections][2]. These two technologies try to solve many of the same problems, but have distinct differences.
+
+Software Collections install different versions of packages in parallel on the system. However, their downside is that each installation exists in its own namespaced portion of the filesystem. Furthermore, each application that relies on them needs to be told where to find them.
+
+With Modularity, only one version of a package exists on the system, but the user can choose which one. The advantage is that this version lives in a standard location on the system. The package requires no special changes to applications that rely on it. Feedback from user studies shows most users don’t actually rely on parallel installation. Containerization and virtualization solve that problem.
+
+### Why not just use containers?
+
+This is another common question. Why would a user want modules when they could just use containers? The answer is, someone still has to maintain the software in the containers. Modules provide pre-packaged content for those containers that users don’t need to maintain, update and patch on their own. This is how Fedora takes the traditional value of a distribution and moves it into the new, containerized world.
+
+Here’s an example of how Modularity solves problems for users of Node.js and Review Board.
+
+### Node.js
+
+Many readers may be familiar with Node.js, a popular server-side JavaScript runtime. Node.js has an even/odd release policy. Its community supports even-numbered releases (6.x, 8.x, 10.x, etc.) for around 30 months. Meanwhile, they support odd-numbered releases that are essentially developer previews for 9 months.
+
+Due to this cycle, Fedora carried only the most recent even-numbered version of Node.js in its stable repositories. It avoided the odd-numbered versions entirely since their lifecycle was shorter than Fedora, and generally not aligned with a Fedora release. This didn’t sit well with some Fedora users, who wanted access to the latest and greatest enhancements.
+
+Thanks to Modularity, Fedora 28 shipped with not just one, but three versions of Node.js to satisfy both developers and stable deployments. Fedora 28’s traditional repository shipped with Node.js 8.x. This version was the most recent long-term stable version at release time. The Modular repositories (available by default on Fedora 28 Server edition) also made the older Node.js 6.x release and the newer Node.js 9.x development release available.
+
+Additionally, Node.js released 10.x upstream just days after Fedora 28\. In the past, users who wanted to deploy that version had to wait until Fedora 29, or use sources from outside Fedora. However, thanks again to Modularity, Node.js 10.x is already [available][3] in the Modular Updates-Testing repository for Fedora 28.
+
+### Review Board
+
+Review Board is a popular Django application for performing code reviews. Fedora included Review Board from Fedora 13 all the way until Fedora 21\. At that point, Fedora moved to Django 1.7\. Review Board was unable to keep up, due to backwards-incompatible changes in Django’s database support. It remained alive in EPEL for RHEL/CentOS 7, simply because those releases had fortunately frozen on Django 1.6\. Nevertheless, its time in Fedora was apparently over.
+
+However, with the advent of Modularity, Fedora could again ship the older Django as a non-default module stream. As a result, Review Board has been restored to Fedora as a module. Fedora carries both supported releases from upstream: 2.5.x and 3.0.x.
+
+### Putting the pieces together
+
+Fedora has always provided users with a wide range of software to use. Fedora Modularity now provides them with deeper choices for which versions of the software they need. The next few years will be very exciting for Fedora, as developers and users start putting together their software in new and exciting (or old and exciting) ways.
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/wp-content/uploads/2018/05/f28-server-modularity-816x345.jpg
+
+作者:[Stephen Gallagher][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://fedoramagazine.org/author/sgallagh/
+[b]: https://github.com/lujun9972
+[1]: https://fedoraproject.org/wiki/Updates_Policy#Stable_Releases
+[2]: https://www.softwarecollections.org
+[3]: https://bodhi.fedoraproject.org/updates/FEDORA-MODULAR-2018-2b0846cb86
diff --git a/sources/tech/20180514 An introduction to the Pyramid web framework for Python.md b/sources/tech/20180514 An introduction to the Pyramid web framework for Python.md
index 03a6fa6494..a16e604774 100644
--- a/sources/tech/20180514 An introduction to the Pyramid web framework for Python.md
+++ b/sources/tech/20180514 An introduction to the Pyramid web framework for Python.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (Flowsnow)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: subject: (An introduction to the Pyramid web framework for Python)
diff --git a/sources/tech/20180518 What-s a hero without a villain- How to add one to your Python game.md b/sources/tech/20180518 What-s a hero without a villain- How to add one to your Python game.md
deleted file mode 100644
index 3ca8fba288..0000000000
--- a/sources/tech/20180518 What-s a hero without a villain- How to add one to your Python game.md
+++ /dev/null
@@ -1,275 +0,0 @@
-What's a hero without a villain? How to add one to your Python game
-======
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/game-dogs-chess-play-lead.png?itok=NAuhav4Z)
-
-In the previous articles in this series (see [part 1][1], [part 2][2], [part 3][3], and [part 4][4]), you learned how to use Pygame and Python to spawn a playable character in an as-yet empty video game world. But, what's a hero without a villain?
-
-It would make for a pretty boring game if you had no enemies, so in this article, you'll add an enemy to your game and construct a framework for building levels.
-
-It might seem strange to jump ahead to enemies when there's still more to be done to make the player sprite fully functional, but you've learned a lot already, and creating villains is very similar to creating a player sprite. So relax, use the knowledge you already have, and see what it takes to stir up some trouble.
-
-For this exercise, you can download some pre-built assets from [Open Game Art][5]. Here are some of the assets I use:
-
-
-+ Inca tileset
-+ Some invaders
-+ Sprites, characters, objects, and effects
-
-
-### Creating the enemy sprite
-
-Yes, whether you realize it or not, you basically already know how to implement enemies. The process is very similar to creating a player sprite:
-
- 1. Make a class so enemies can spawn.
- 2. Create an `update` function so enemies can detect collisions.
- 3. Create a `move` function so your enemy can roam around.
-
-
-
-Start with the class. Conceptually, it's mostly the same as your Player class. You set an image or series of images, and you set the sprite's starting position.
-
-Before continuing, make sure you have a graphic for your enemy, even if it's just a temporary one. Place the graphic in your game project's `images` directory (the same directory where you placed your player image).
-
-A game looks a lot better if everything alive is animated. Animating an enemy sprite is done the same way as animating a player sprite. For now, though, keep it simple, and use a non-animated sprite.
-
-At the top of the `objects` section of your code, create a class called Enemy with this code:
-```
-class Enemy(pygame.sprite.Sprite):
-
- '''
-
- Spawn an enemy
-
- '''
-
- def __init__(self,x,y,img):
-
- pygame.sprite.Sprite.__init__(self)
-
- self.image = pygame.image.load(os.path.join('images',img))
-
- self.image.convert_alpha()
-
- self.image.set_colorkey(ALPHA)
-
- self.rect = self.image.get_rect()
-
- self.rect.x = x
-
- self.rect.y = y
-
-```
-
-If you want to animate your enemy, do it the [same way][4] you animated your player.
-
-### Spawning an enemy
-
-You can make the class useful for spawning more than just one enemy by allowing yourself to tell the class which image to use for the sprite and where in the world the sprite should appear. This means you can use this same enemy class to generate any number of enemy sprites anywhere in the game world. All you have to do is make a call to the class, and tell it which image to use and the X and Y coordinates of your desired spawn point.
-
-Again, this is similar in principle to spawning a player sprite. In the `setup` section of your script, add this code:
-```
-enemy = Enemy(20,200,'yeti.png')# spawn enemy
-
-enemy_list = pygame.sprite.Group() # create enemy group
-
-enemy_list.add(enemy) # add enemy to group
-
-```
-
-In that sample code, `20` is the X position and `200` is the Y position. You might need to adjust these numbers, depending on how big your enemy sprite is, but try to get it to spawn in a place so that you can reach it with your player sprite. `Yeti.png` is the image used for the enemy.
-
-Next, draw all enemies in the enemy group to the screen. Right now, you have only one enemy, but you can add more later if you want. As long as you add an enemy to the enemies group, it will be drawn to the screen during the main loop. The middle line is the new line you need to add:
-```
- player_list.draw(world)
-
- enemy_list.draw(world) # refresh enemies
-
- pygame.display.flip()
-
-```
-
-Launch your game. Your enemy appears in the game world at whatever X and Y coordinate you chose.
-
-### Level one
-
-Your game is in its infancy, but you will probably want to add another level. It's important to plan ahead when you program so your game can grow as you learn more about programming. Even though you don't even have one complete level yet, you should code as if you plan on having many levels.
-
-Think about what a "level" is. How do you know you are at a certain level in a game?
-
-You can think of a level as a collection of items. In a platformer, such as the one you are building here, a level consists of a specific arrangement of platforms, placement of enemies and loot, and so on. You can build a class that builds a level around your player. Eventually, when you create more than one level, you can use this class to generate the next level when your player reaches a specific goal.
-
-Move the code you wrote to create an enemy and its group into a new function that will be called along with each new level. It requires some modification so that each time you create a new level, you can create several enemies:
-```
-class Level():
-
- def bad(lvl,eloc):
-
- if lvl == 1:
-
- enemy = Enemy(eloc[0],eloc[1],'yeti.png') # spawn enemy
-
- enemy_list = pygame.sprite.Group() # create enemy group
-
- enemy_list.add(enemy) # add enemy to group
-
- if lvl == 2:
-
- print("Level " + str(lvl) )
-
-
-
- return enemy_list
-
-```
-
-The `return` statement ensures that when you use the `Level.bad` function, you're left with an `enemy_list` containing each enemy you defined.
-
-Since you are creating enemies as part of each level now, your `setup` section needs to change, too. Instead of creating an enemy, you must define where the enemy will spawn and what level it belongs to.
-```
-eloc = []
-
-eloc = [200,20]
-
-enemy_list = Level.bad( 1, eloc )
-
-```
-
-Run the game again to confirm your level is generating correctly. You should see your player, as usual, and the enemy you added in this chapter.
-
-### Hitting the enemy
-
-An enemy isn't much of an enemy if it has no effect on the player. It's common for enemies to cause damage when a player collides with them.
-
-Since you probably want to track the player's health, the collision check happens in the Player class rather than in the Enemy class. You can track the enemy's health, too, if you want. The logic and code are pretty much the same, but, for now, just track the player's health.
-
-To track player health, you must first establish a variable for the player's health. The first line in this code sample is for context, so add the second line to your Player class:
-```
- self.frame = 0
-
- self.health = 10
-
-```
-
-In the `update` function of your Player class, add this code block:
-```
- hit_list = pygame.sprite.spritecollide(self, enemy_list, False)
-
- for enemy in hit_list:
-
- self.health -= 1
-
- print(self.health)
-
-```
-
-This code establishes a collision detector using the Pygame function `sprite.spritecollide`, called `enemy_hit`. This collision detector sends out a signal any time the hitbox of its parent sprite (the player sprite, where this detector has been created) touches the hitbox of any sprite in `enemy_list`. The `for` loop is triggered when such a signal is received and deducts a point from the player's health.
-
-Since this code appears in the `update` function of your player class and `update` is called in your main loop, Pygame checks for this collision once every clock tick.
-
-### Moving the enemy
-
-An enemy that stands still is useful if you want, for instance, spikes or traps that can harm your player, but the game is more of a challenge if the enemies move around a little.
-
-Unlike a player sprite, the enemy sprite is not controlled by the user. Its movements must be automated.
-
-Eventually, your game world will scroll, so how do you get an enemy to move back and forth within the game world when the game world itself is moving?
-
-You tell your enemy sprite to take, for example, 10 paces to the right, then 10 paces to the left. An enemy sprite can't count, so you have to create a variable to keep track of how many paces your enemy has moved and program your enemy to move either right or left depending on the value of your counting variable.
-
-First, create the counter variable in your Enemy class. Add the last line in this code sample:
-```
- self.rect = self.image.get_rect()
-
- self.rect.x = x
-
- self.rect.y = y
-
- self.counter = 0 # counter variable
-
-```
-
-Next, create a `move` function in your Enemy class. Use an if-else loop to create what is called an infinite loop:
-
- * Move right if the counter is on any number from 0 to 100.
- * Move left if the counter is on any number from 100 to 200.
- * Reset the counter back to 0 if the counter is greater than 200.
-
-
-
-An infinite loop has no end; it loops forever because nothing in the loop is ever untrue. The counter, in this case, is always either between 0 and 100 or 100 and 200, so the enemy sprite walks right to left and right to left forever.
-
-The actual numbers you use for how far the enemy will move in either direction depending on your screen size, and possibly, eventually, the size of the platform your enemy is walking on. Start small and work your way up as you get used to the results. Try this first:
-```
- def move(self):
-
- '''
-
- enemy movement
-
- '''
-
- distance = 80
-
- speed = 8
-
-
-
- if self.counter >= 0 and self.counter <= distance:
-
- self.rect.x += speed
-
- elif self.counter >= distance and self.counter <= distance*2:
-
- self.rect.x -= speed
-
- else:
-
- self.counter = 0
-
-
-
- self.counter += 1
-
-```
-
-You can adjust the distance and speed as needed.
-
-Will this code work if you launch your game now?
-
-Of course not, and you probably know why. You must call the `move` function in your main loop. The first line in this sample code is for context, so add the last two lines:
-```
- enemy_list.draw(world) #refresh enemy
-
- for e in enemy_list:
-
- e.move()
-
-```
-
-Launch your game and see what happens when you hit your enemy. You might have to adjust where the sprites spawn so that your player and your enemy sprite can collide. When they do collide, look in the console of [IDLE][6] or [Ninja-IDE][7] to see the health points being deducted.
-
-![](https://opensource.com/sites/default/files/styles/panopoly_image_original/public/u128651/yeti.png?itok=4_GsDGor)
-
-You may notice that health is deducted for every moment your player and enemy are touching. That's a problem, but it's a problem you'll solve later, after you've had more practice with Python.
-
-For now, try adding some more enemies. Remember to add each enemy to the `enemy_list`. As an exercise, see if you can think of how you can change how far different enemy sprites move.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/5/pygame-enemy
-
-作者:[Seth Kenlon][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/seth
-[1]:https://opensource.com/article/17/10/python-101
-[2]:https://opensource.com/article/17/12/game-framework-python
-[3]:https://opensource.com/article/17/12/game-python-add-a-player
-[4]:https://opensource.com/article/17/12/game-python-moving-player
-[5]:https://opengameart.org
-[6]:https://docs.python.org/3/library/idle.html
-[7]:http://ninja-ide.org/
diff --git a/sources/tech/20180530 Introduction to the Pony programming language.md b/sources/tech/20180530 Introduction to the Pony programming language.md
deleted file mode 100644
index 2292c65fc2..0000000000
--- a/sources/tech/20180530 Introduction to the Pony programming language.md
+++ /dev/null
@@ -1,95 +0,0 @@
-beamrolling is translating.
-Introduction to the Pony programming language
-======
-
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming_keys.jpg?itok=O4qaYCHK)
-
-At [Wallaroo Labs][1], where I'm the VP of engineering, we're are building a [high-performance, distributed stream processor][2] written in the [Pony][3] programming language. Most people haven't heard of Pony, but it has been an excellent choice for Wallaroo, and it might be an excellent choice for your next project, too.
-
-> "A programming language is just another tool. It's not about syntax. It's not about expressiveness. It's not about paradigms or models. It's about managing hard problems." —Sylvan Clebsch, creator of Pony
-
-I'm a contributor to the Pony project, but here I'll touch on why Pony is a good choice for applications like Wallaroo and share ways I've used Pony. If you are interested in a more in-depth look at why we use Pony to write Wallaroo, we have a [blog post][4] about that.
-
-### What is Pony?
-
-You can think of Pony as something like "Rust meets Erlang." Pony sports buzzworthy features. It is:
-
- * Type-safe
- * Memory-safe
- * Exception-safe
- * Data-race-free
- * Deadlock-free
-
-
-
-Additionally, it's compiled to efficient native code, and it's developed in the open and available under a two-clause BSD license.
-
-That's a lot of features, but here I'll focus on the few that were key to my company adopting Pony.
-
-### Why Pony?
-
-Writing fast, safe, efficient, highly concurrent programs is not easy with most of our existing tools. "Fast, efficient, and highly concurrent" is an achievable goal, but throw in "safe," and things get a lot harder. With Wallaroo, we wanted to accomplish all four, and Pony has made it easy to achieve.
-
-#### Highly concurrent
-
-Pony makes concurrency easy. Part of the way it does that is by providing an opinionated concurrency story. In Pony, all concurrency happens via the [actor model][5].
-
-The actor model is most famous via the implementations in Erlang and Akka. The actor model has been around since the 1970s, and details vary widely from implementation to implementation. What doesn't vary is that all computation is executed by actors that communicate via asynchronous messaging.
-
-Think of the actor model this way: objects in object-oriented programming are state + synchronous methods and actors are state + asynchronous methods.
-
-When an actor receives a message, it executes a corresponding method. That method might operate on a state that is accessible by only that actor. The actor model allows us to use a mutable state in a concurrency-safe manner. Every actor is single-threaded. Two methods within an actor are never run concurrently. This means that, within a given actor, data updates cannot cause data races or other problems commonly associated with threads and mutable states.
-
-#### Fast and efficient
-
-Pony actors are scheduled with an efficient work-stealing scheduler. There's a single Pony scheduler per available CPU. The thread-per-core concurrency model is part of Pony's attempt to work in concert with the CPU to operate as efficiently as possible. The Pony runtime attempts to be as CPU-cache friendly as possible. The less your code thrashes the cache, the better it will run. Pony aims to help your code play nice with CPU caches.
-
-The Pony runtime also features per-actor heaps so that, during garbage collection, there's no "stop the world" garbage collection step. This means your program is always doing at least some work. As a result, Pony programs end up with very consistent performance and predictable latencies.
-
-#### Safe
-
-The Pony type system introduces a novel concept: reference capabilities, which make data safety part of the type system. The type of every variable in Pony includes information about how the data can be shared between actors. The Pony compiler uses the information to verify, at compile time, that your code is data-race- and deadlock-free.
-
-If this sounds a bit like Rust, it's because it is. Pony's reference capabilities and Rust's borrow checker both provide data safety; they just approach it in different ways and have different tradeoffs.
-
-### Is Pony right for you?
-
-Deciding whether to use a new programming language for a non-hobby project is hard. You must weigh the appropriateness of the tool against its immaturity compared to other solutions. So, what about Pony and you?
-
-Pony might be the right solution if you have a hard concurrency problem to solve. Concurrent applications are Pony's raison d'être. If you can accomplish what you want in a single-threaded Python script, you probably don't need Pony. If you have a hard concurrency problem, you should consider Pony and its powerful data-race-free, concurrency-aware type system.
-
-You'll get a compiler that will prevent you from introducing many concurrency-related bugs and a runtime that will give you excellent performance characteristics.
-
-### Getting started with Pony
-
-If you're ready to get started with Pony, your first visit should be the [Learn section][6] of the Pony website. There you will find directions for installing the Pony compiler and resources for learning the language.
-
-If you like to contribute to the language you are using, we have some [beginner-friendly issues][7] waiting for you on GitHub.
-
-Also, I can't wait to start talking with you on [our IRC channel][8] and the [Pony mailing list][9].
-
-To learn more about Pony, attend Sean Allen's talk, [Pony: How I learned to stop worrying and embrace an unproven technology][10], at the [20th OSCON][11], July 16-19, 2018, in Portland, Ore.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/5/pony
-
-作者:[Sean T Allen][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/seantallen
-[1]:http://www.wallaroolabs.com/
-[2]:https://github.com/wallaroolabs/wallaroo
-[3]:https://www.ponylang.org/
-[4]:https://blog.wallaroolabs.com/2017/10/why-we-used-pony-to-write-wallaroo/
-[5]:https://en.wikipedia.org/wiki/Actor_model
-[6]:https://www.ponylang.org/learn/
-[7]:https://github.com/ponylang/ponyc/issues?q=is%3Aissue+is%3Aopen+label%3A%22complexity%3A+beginner+friendly%22
-[8]:https://webchat.freenode.net/?channels=%23ponylang
-[9]:https://pony.groups.io/g/user
-[10]:https://conferences.oreilly.com/oscon/oscon-or/public/schedule/speaker/213590
-[11]:https://conferences.oreilly.com/oscon/oscon-or
diff --git a/sources/tech/20180531 Qalculate- - The Best Calculator Application in The Entire Universe.md b/sources/tech/20180531 Qalculate- - The Best Calculator Application in The Entire Universe.md
deleted file mode 100644
index 6cbea61308..0000000000
--- a/sources/tech/20180531 Qalculate- - The Best Calculator Application in The Entire Universe.md
+++ /dev/null
@@ -1,125 +0,0 @@
-Qalculate! – The Best Calculator Application in The Entire Universe
-======
-I have been a GNU-Linux user and a [Debian][1] user for more than a decade. As I started using the desktop more and more, it seemed to me that apart from few web-based services most of my needs were being met with [desktop applications][2] within Debian itself.
-
-One of such applications was the need for me to calculate between different measurements of units. While there are and were many web-services which can do the same, I wanted something which could do all this and more on my desktop for both privacy reasons as well as not having to hunt for a web service for doing one thing or the other. My search ended when I found Qalculate!.
-
-### Qalculate! The most versatile calculator application
-
-![Qalculator is the best calculator app][3]
-
-This is what aptitude says about [Qalculate!][4] and I cannot put it in better terms:
-
-> Powerful and easy to use desktop calculator – GTK+ version
->
-> Qalculate! is small and simple to use but with much power and versatility underneath. Features include customizable functions, units, arbitrary precision, plotting, and a graphical interface that uses a one-line fault-tolerant expression entry (although it supports optional traditional buttons).
-
-It also did have a KDE interface as well as in its previous avatar, but at least in Debian testing, it just shows only the GTK+ version which can be seen from the github [repo][5] as well.
-
-Needless to say that Qalculate! is available in Debian repository and hence can easily be installed [using apt command][6] or through software center in Debian based distributions like Ubuntu. It is also availale for Windows and macOS.
-
-#### Features of Qalculate!
-
-Now while it would be particularly long to go through the whole list of functionality it allows – allow me to list some of the functionality to be followed by a few screenshots of just a couple of functionalities that Qalculate! provides. The idea is basically to familiarize you with a couple of basic methods and then leave it up to you to enjoy exploring what all Qalculate! can do.
-
- * Algebra
- * Calculus
- * Combinatorics
- * Complex_Numbers
- * Data_Sets
- * Date_&_Time
- * Economics
- * Exponents_&_Logarithms
- * Geometry
- * Logical
- * Matrices_&_Vectors
- * Miscellaneous
- * Number_Theory
- * Statistics
- * Trigonometry
-
-
-
-#### Using Qalculate!
-
-Using Qalculate! is not complicated. You can even write in the simple natural language. However, I recommend [reading the manual][7] to utilize the full potential of Qalculate!
-
-![qalculate byte to gibibyte conversion ][8]
-
-![conversion from celcius degrees to fahreneit][9]
-
-#### qalc is the command line version of Qalculate!
-
-You can achieve the same results as Qalculate! with its command-line brethren qalc
-```
-$ qalc 62499836 byte to gibibyte
-62499836 * byte = approx. 0.058207508 gibibyte
-
-$ qalc 40 degree celsius to fahrenheit
-(40 * degree) * celsius = 104 deg*oF
-
-```
-
-I shared the command-line interface so that people who don’t like GUI interfaces and prefer command-line (CLI) or have headless nodes (no GUI) could also use qalculate, pretty common in server environments.
-
-If you want to use it in scripts, I guess libqalculate would be the way to go and seeing how qalculate-gtk, qalc depend on it seems it should be good enough.
-
-Just to share, you could also explore how to use plotting of series data but that and other uses will leave to you. Don’t forget to check the /usr/share/doc/qalculate/index.html to see all the different functionalities that Qalculate! has.
-
-Note:- Do note that though Debian prefers [gnuplot][10] to showcase the pretty graphs that can come out of it.
-
-#### Bonus Tip: You can thank the developer via command line in Debian
-
-If you use Debian and like any package, you can quickly thank the Debian Developer or maintainer maintaining the said package using:
-```
-reportbug --kudos $PACKAGENAME
-
-```
-
-Since I liked QaIculate!, I would like to give a big shout-out to the Debian developer and maintainer Vincent Legout for the fantastic work he has done.
-```
-reportbug --kudos qalculate
-
-```
-
-I would also suggest reading my detailed article on using reportbug tool for [bug reporting in Debian][11].
-
-#### The opinion of a Polymer Chemist on Qalculate!
-
-Through my fellow author [Philip Prado][12], we contacted a Mr. Timothy Meyers, currently a student working in a polymer lab as a Polymer Chemist.
-
-His professional opinion on Qaclulate! is –
-
-> This looks like almost any scientist to use as any type of data calculations statistics could use this program issue would be do you know the commands and such to make it function
->
-> I feel like there’s some Physics constants that are missing but off the top of my head I can’t think of what they are but I feel like there’s not very many [fluid dynamics][13] stuff in there and also some different like [light absorption][14] coefficients for different compounds but that’s just a chemist in me I don’t know if those are super necessary. [Free energy][15] might be one
-
-In the end, I just want to share this is a mere introduction to what Qalculate! can do and is limited by what you want to get done and your imagination. I hope you like Qalculate!
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/qalculate/
-
-作者:[Shirish][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://itsfoss.com/author/shirish/
-[1]:https://www.debian.org/
-[2]:https://itsfoss.com/essential-linux-applications/
-[3]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/05/qalculate-app-featured-1-800x450.jpeg
-[4]:https://qalculate.github.io/
-[5]:https://github.com/Qalculate
-[6]:https://itsfoss.com/apt-command-guide/
-[7]:https://qalculate.github.io/manual/index.html
-[8]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/04/qalculate-byte-conversion.png
-[9]:https://4bds6hergc-flywheel.netdna-ssl.com/wp-content/uploads/2018/04/qalculate-gtk-weather-conversion.png
-[10]:http://www.gnuplot.info/
-[11]:https://itsfoss.com/bug-report-debian/
-[12]:https://itsfoss.com/author/phillip/
-[13]:https://en.wikipedia.org/wiki/Fluid_dynamics
-[14]:https://en.wikipedia.org/wiki/Absorption_(electromagnetic_radiation)
-[15]:https://en.wikipedia.org/wiki/Gibbs_free_energy
diff --git a/sources/tech/20180601 Get Started with Snap Packages in Linux.md b/sources/tech/20180601 Get Started with Snap Packages in Linux.md
index 632151832a..1693d3c44e 100644
--- a/sources/tech/20180601 Get Started with Snap Packages in Linux.md
+++ b/sources/tech/20180601 Get Started with Snap Packages in Linux.md
@@ -1,3 +1,12 @@
+[#]: collector: (lujun9972)
+[#]: translator: (pityonline)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Get Started with Snap Packages in Linux)
+[#]: via: (https://www.linux.com/learn/intro-to-linux/2018/5/get-started-snap-packages-linux)
+[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen)
+
Get Started with Snap Packages in Linux
======
@@ -139,7 +148,7 @@ via: https://www.linux.com/learn/intro-to-linux/2018/5/get-started-snap-packages
作者:[Jack Wallen][a]
选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
+译者:[pityonline](https://github.com/pityonline)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/sources/tech/20180611 3 open source alternatives to Adobe Lightroom.md b/sources/tech/20180611 3 open source alternatives to Adobe Lightroom.md
index c489b0f0f1..664c054913 100644
--- a/sources/tech/20180611 3 open source alternatives to Adobe Lightroom.md
+++ b/sources/tech/20180611 3 open source alternatives to Adobe Lightroom.md
@@ -1,5 +1,3 @@
-scoutydren is translating
-
3 open source alternatives to Adobe Lightroom
======
diff --git a/sources/tech/20180612 7 open source tools to make literature reviews easy.md b/sources/tech/20180612 7 open source tools to make literature reviews easy.md
index 96edb68eff..674f4ea44b 100644
--- a/sources/tech/20180612 7 open source tools to make literature reviews easy.md
+++ b/sources/tech/20180612 7 open source tools to make literature reviews easy.md
@@ -1,3 +1,4 @@
+translated by lixinyuxx
7 open source tools to make literature reviews easy
======
diff --git a/sources/tech/20180621 How to connect to a remote desktop from Linux.md b/sources/tech/20180621 How to connect to a remote desktop from Linux.md
deleted file mode 100644
index 241d243b0b..0000000000
--- a/sources/tech/20180621 How to connect to a remote desktop from Linux.md
+++ /dev/null
@@ -1,137 +0,0 @@
-tomjlw is translating
-How to connect to a remote desktop from Linux
-======
-
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003499_01_cloud21x_cc.png?itok=5UwC92dO)
-
-A [remote desktop][1], according to Wikipedia, is "a software or operating system feature that allows a personal computer's desktop environment to be run remotely on one system (usually a PC, but the concept applies equally to a server), while being displayed on a separate client device."
-
-In other words, a remote desktop is used to access an environment running on another computer. For example, the [ManageIQ/Integration tests][2] repository's pull request (PR) testing system exposes a Virtual Network Computing (VNC) connection port so I can remotely view my PRs being tested in real time. Remote desktops are also used to help customers solve computer problems: with the customer's permission, you can establish a VNC or Remote Desktop Protocol (RDP) connection to see or interactively access the computer to troubleshoot or repair the problem.
-
-These connections are made using remote desktop connection software, and there are many options available. I use [Remmina][3] because I like its minimal, easy-to-use user interface (UI). It's written in GTK+ and is open source under the GNU GPL license.
-
-In this article, I'll explain how to use the Remmina client to connect remotely from a Linux computer to a Windows 10 system and a Red Hat Enterprise Linux 7 system.
-
-### Install Remmina on Linux
-
-First, you need to install Remmina on the computer you'll use to access the other computer(s) remotely. If you're using Fedora, you can run the following command to install Remmina:
-```
-sudo dnf install -y remmina
-
-```
-
-If you want to install Remmina on a different Linux platform, follow these [installation instructions][4]. You should then find Remmina with your other apps (Remmina is selected in this image).
-
-![](https://opensource.com/sites/default/files/uploads/remmina1-on-desktop.png)
-
-Launch Remmina by clicking on the icon. You should see a screen that resembles this:
-
-![](https://opensource.com/sites/default/files/uploads/remmina2_launched.png)
-
-Remmina offers several types of connections, including RDP, which is used to connect to Windows-based computers, and VNC, which is used to connect to Linux machines. As you can see in the top-left corner above, Remmina's default setting is RDP.
-
-### Connecting to Windows 10
-
-Before you can connect to a Windows 10 computer through RDP, you must change some permissions to allow remote desktop sharing and connections through your firewall.
-
-[Note: Windows 10 Home has no RDP feature listed. ][5]
-
-To enable remote desktop sharing, in **File Explorer** right-click on **My Computer → Properties → Remote Settings** and, in the pop-up that opens, check **Allow remote connections to this computer** , then select **Apply**.
-
-![](https://opensource.com/sites/default/files/uploads/remmina3_connect_win10.png)
-
-Next, enable remote desktop connections through your firewall. First, search for **firewall settings** in the **Start** menu and select **Allow an app through Windows Firewall**.
-
-![](https://opensource.com/sites/default/files/uploads/remmina4_firewall.png)
-
-In the window that opens, look for **Remote Desktop** under **Allowed apps and features**. Check the box(es) in the **Private **and/or **Public** columns, depending on the type of network(s) you will use to access this desktop. Click **OK**.
-
-![](https://opensource.com/sites/default/files/uploads/remmina5_firewall_2.png)
-
-Go to the Linux computer you use to remotely access the Windows PC and launch Remmina. Enter the IP address of your Windows computer and hit the Enter key. (How do I locate my IP address [in Linux][6] and [Windows 10][7]?) When prompted, enter your username and password and click OK.
-
-![](https://opensource.com/sites/default/files/uploads/remmina6_login.png)
-
-If you're asked to accept the certificate, select OK.
-
-![](https://opensource.com/sites/default/files/uploads/remmina7_certificate.png)
-
-You should be able to see your Windows 10 computer's desktop.
-
-![](https://opensource.com/sites/default/files/uploads/remmina8_remote_desktop.png)
-
-### Connecting to Red Hat Enterprise Linux 7
-
-To set permissions to enable remote access on your RHEL7 computer, open **All Settings** on the Linux desktop.
-
-![](https://opensource.com/sites/default/files/uploads/remmina9_settings.png)
-
-Click on the Sharing icon, and this window will open:
-
-![](https://opensource.com/sites/default/files/uploads/remmina10_sharing.png)
-
-If **Screen Sharing** is off, click on it. A window will open, where you can slide it into the **On** position. If you want to allow remote connections to control the desktop, set **Allow Remote Control** to **On**. You can also select between two access options: one that prompts the computer's primary user to accept or deny the connection request, and another that allows connection authentication with a password. At the bottom of the window, select the network interface where connections are allowed, then close the window.
-
-Next, open **Firewall Settings** from **Applications Menu → Sundry → Firewall**.
-
-![](https://opensource.com/sites/default/files/uploads/remmina11_firewall_settings.png)
-
-Check the box next to vnc-server (as shown above) and close the window. Then, head to Remmina on your remote computer, enter the IP address of the Linux desktop you want to connect with, select **VNC** as the protocol, and hit the **Enter** key.
-
-![](https://opensource.com/sites/default/files/uploads/remmina12_vncprotocol.png)
-
-If you previously chose the authentication option **New connections must ask for access** , the RHEL system's user will see a prompt like this:
-
-![](https://opensource.com/sites/default/files/uploads/remmina13_permission.png)
-
-Select **Accept** for the remote connection to succeed.
-
-If you chose the option to authenticate the connection with a password, Remmina will prompt you for the password.
-
-![](https://opensource.com/sites/default/files/uploads/remmina14_password-auth.png)
-
-Enter the password and hit **OK** , and you should be connected to the remote computer.
-
-![](https://opensource.com/sites/default/files/uploads/remmina15_connected.png)
-
-### Using Remmina
-
-Remmina offers a tabbed UI, as shown in above picture, much like a web browser. In the top-left corner, as shown in the screenshot above, you can see two tabs: one for the previously established Windows 10 connection and a new one for the RHEL connection.
-
-On the left-hand side of the window, there is a toolbar with options such as **Resize Window** , **Full-Screen Mode** , **Preferences** , **Screenshot** , **Disconnect** , and more. Explore them and see which ones work best for you.
-
-You can also create saved connections in Remmina by clicking on the **+** (plus) sign in the top-left corner. Fill in the form with details specific to your connection and click **Save**. Here is an example Windows 10 RDP connection:
-
-![](https://opensource.com/sites/default/files/uploads/remmina16_saved-connection.png)
-
-The next time you open Remmina, the connection will be available.
-
-![](https://opensource.com/sites/default/files/uploads/remmina17_connection-available.png)
-
-Just click on it, and your connection will be established without re-entering the details.
-
-### Additional info
-
-When you use remote desktop software, all the operations you perform take place on the remote desktop and use its resources—Remmina (or similar software) is just a way to interact with that desktop. You can also access a computer remotely through SSH, but it usually limits you to a text-only terminal to that computer.
-
-You should also note that enabling remote connections with your computer could cause serious damage if an attacker uses this method to gain access to your computer. Therefore, it is wise to disallow remote desktop connections and block related services in your firewall when you are not actively using Remote Desktop.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/6/linux-remote-desktop
-
-作者:[Kedar Vijay Kulkarni][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://opensource.com/users/kkulkarn
-[1]:https://en.wikipedia.org/wiki/Remote_desktop_software
-[2]:https://github.com/ManageIQ/integration_tests
-[3]:https://www.remmina.org/wp/
-[4]:https://www.tecmint.com/remmina-remote-desktop-sharing-and-ssh-client/
-[5]:https://superuser.com/questions/1019203/remote-desktop-settings-missing#1019212
-[6]:https://opensource.com/article/18/5/how-find-ip-address-linux
-[7]:https://www.groovypost.com/howto/find-windows-10-device-ip-address/
diff --git a/sources/tech/20180629 How To Get Flatpak Apps And Games Built With OpenGL To Work With Proprietary Nvidia Graphics Drivers.md b/sources/tech/20180629 How To Get Flatpak Apps And Games Built With OpenGL To Work With Proprietary Nvidia Graphics Drivers.md
deleted file mode 100644
index a9d540adae..0000000000
--- a/sources/tech/20180629 How To Get Flatpak Apps And Games Built With OpenGL To Work With Proprietary Nvidia Graphics Drivers.md
+++ /dev/null
@@ -1,113 +0,0 @@
-How To Get Flatpak Apps And Games Built With OpenGL To Work With Proprietary Nvidia Graphics Drivers
-======
-**Some applications and games built with OpenGL support and packaged as Flatpak fail to start with proprietary Nvidia drivers. This article explains how to get such Flatpak applications or games them to start, without installing the open source drivers (Nouveau).**
-
-Here's an example. I'm using the proprietary Nvidia drivers on my Ubuntu 18.04 desktop (`nvidia-driver-390`) and when I try to launch the latest
-```
-$ /usr/bin/flatpak run --branch=stable --arch=x86_64 --command=krita --file-forwarding org.kde.krita
-Gtk-Message: Failed to load module "canberra-gtk-module"
-Gtk-Message: Failed to load module "canberra-gtk-module"
-libGL error: No matching fbConfigs or visuals found
-libGL error: failed to load driver: swrast
-Could not initialize GLX
-
-```
-
-To fix Flatpak games and applications not starting when using OpenGL with proprietary Nvidia graphics drivers, you'll need to install a runtime for your currently installed proprietary Nvidia drivers. Here's how to do this.
-
-**1\. Add the FlatHub repository if you haven't already. You can find exact instructions for your Linux distribution[here][1].**
-
-**2. Now you'll need to figure out the exact version of the proprietary Nvidia drivers installed on your system. **
-
-_This step is dependant of the Linux distribution you're using and I can't cover all cases. The instructions below are Ubuntu-oriented (and Ubuntu flavors) but hopefully you can figure out for yourself the Nvidia drivers version installed on your system._
-
-To do this in Ubuntu, open `Software & Updates` , switch to the `Additional Drivers` tab and note the name of the Nvidia driver package.
-
-As an example, this is `nvidia-driver-390` in my case, as you can see here:
-
-![](https://1.bp.blogspot.com/-FAfjtGNeUJc/WzYXMYTFBcI/AAAAAAAAAx0/xUhIO83IAjMuK4Hn0jFUYKJhSKw8y559QCLcBGAs/s1600/additional-drivers-nvidia-ubuntu.png)
-
-That's not all. We've only found out the Nvidia drivers major version but we'll also need to know the minor version. To get the exact Nvidia driver version, which we'll need for the next step, run this command (should work in any Debian-based Linux distribution, like Ubuntu, Linux Mint and so on):
-```
-apt-cache policy NVIDIA-PACKAGE-NAME
-
-```
-
-Where NVIDIA-PACKAGE-NAME is the Nvidia drivers package name listed in `Software & Updates` . For example, to see the exact installed version of the `nvidia-driver-390` package, run this command:
-```
-$ apt-cache policy nvidia-driver-390
-nvidia-driver-390:
- Installed: 390.48-0ubuntu3
- Candidate: 390.48-0ubuntu3
- Version table:
- * 390.48-0ubuntu3 500
- 500 http://ro.archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages
- 100 /var/lib/dpkg/status
-
-```
-
-In this command's output, look for the `Installed` section and note the version numbers (excluding `-0ubuntu3` and anything similar). Now we know the exact version of the installed Nvidia drivers (`390.48` in my example). Remember this because we'll need it for the next step.
-
-**3\. And finally, you can install the Nvidia runtime for your installed proprietary Nvidia graphics drivers, from FlatHub**
-
-To list all the available Nvidia runtime packages available on FlatHub, you can use this command:
-```
-flatpak remote-ls flathub | grep nvidia
-
-```
-
-Hopefully the runtime for your installed Nvidia drivers is available on FlatHub. You can now proceed to install the runtime by using this command:
-
- * For 64bit systems:
-
-
-```
-flatpak install flathub org.freedesktop.Platform.GL.nvidia-MAJORVERSION-MINORVERSION
-
-```
-
-Replace MAJORVERSION with the Nvidia driver major version installed on your computer (390 in my example above) and
-MINORVERSION with the minor version (48 in my example from step 2).
-
-For example, to install the runtime for Nvidia graphics driver version 390.48, you'd have to use this command:
-```
-flatpak install flathub org.freedesktop.Platform.GL.nvidia-390-48
-
-```
-
- * For 32bit systems (or to be able to run 32bit applications or games on 64bit), install the 32bit runtime using:
-
-
-```
-flatpak install flathub org.freedesktop.Platform.GL32.nvidia-MAJORVERSION-MINORVERSION
-
-```
-
-Once again, replace MAJORVERSION with the Nvidia driver major version installed on your computer (390 in my example above) and MINORVERSION with the minor version (48 in my example from step 2).
-
-For example, to install the 32bit runtime for Nvidia graphics driver version 390.48, you'd have to use this command:
-```
-flatpak install flathub org.freedesktop.Platform.GL32.nvidia-390-48
-
-```
-
-That is all you need to do to get applications or games packaged as Flatpak that are built with OpenGL to run.
-
-
---------------------------------------------------------------------------------
-
-via: https://www.linuxuprising.com/2018/06/how-to-get-flatpak-apps-and-games-built.html
-
-作者:[Logix][a]
-选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://plus.google.com/118280394805678839070
-[1]:https://flatpak.org/setup/
-[2]:https://www.linuxuprising.com/2018/06/free-painting-software-krita-410.html
-[3]:https://www.linuxuprising.com/2018/06/winepak-is-flatpak-repository-for.html
-[4]:https://github.com/winepak/applications/issues/23
-[5]:https://github.com/flatpak/flatpak/issues/138
diff --git a/sources/tech/20180725 Put platforms in a Python game with Pygame.md b/sources/tech/20180725 Put platforms in a Python game with Pygame.md
new file mode 100644
index 0000000000..759bfc01df
--- /dev/null
+++ b/sources/tech/20180725 Put platforms in a Python game with Pygame.md
@@ -0,0 +1,590 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Put platforms in a Python game with Pygame)
+[#]: via: (https://opensource.com/article/18/7/put-platforms-python-game)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+Put platforms in a Python game with Pygame
+======
+In part six of this series on building a Python game from scratch, create some platforms for your characters to travel.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/header.png?itok=iq8HFoEJ)
+
+This is part 6 in an ongoing series about creating video games in Python 3 using the Pygame module. Previous articles are:
+
++ [Learn how to program in Python by building a simple dice game][24]
++ [Build a game framework with Python using the Pygame module][25]
++ [How to add a player to your Python game][26]
++ [Using Pygame to move your game character around][27]
++ [What's a hero without a villain? How to add one to your Python game][28]
+
+
+A platformer game needs platforms.
+
+In [Pygame][1], the platforms themselves are sprites, just like your playable sprite. That's important because having platforms that are objects makes it a lot easier for your player sprite to interact with them.
+
+There are two major steps in creating platforms. First, you must code the objects, and then you must map out where you want the objects to appear.
+
+### Coding platform objects
+
+To build a platform object, you create a class called `Platform`. It's a sprite, just like your [`Player`][2] [sprite][2], with many of the same properties.
+
+Your `Platform` class needs to know a lot of information about what kind of platform you want, where it should appear in the game world, and what image it should contain. A lot of that information might not even exist yet, depending on how much you have planned out your game, but that's all right. Just as you didn't tell your Player sprite how fast to move until the end of the [Movement article][3], you don't have to tell `Platform` everything upfront.
+
+Near the top of the script you've been writing in this series, create a new class. The first three lines in this code sample are for context, so add the code below the comment:
+
+```
+import pygame
+import sys
+import os
+## new code below:
+
+class Platform(pygame.sprite.Sprite):
+# x location, y location, img width, img height, img file
+def __init__(self,xloc,yloc,imgw,imgh,img):
+ pygame.sprite.Sprite.__init__(self)
+ self.image = pygame.image.load(os.path.join('images',img)).convert()
+ self.image.convert_alpha()
+ self.image.set_colorkey(ALPHA)
+ self.rect = self.image.get_rect()
+ self.rect.y = yloc
+ self.rect.x = xloc
+```
+
+When called, this class creates an object onscreen in some X and Y location, with some width and height, using some image file for texture. It's very similar to how players or enemies are drawn onscreen.
+
+### Types of platforms
+
+The next step is to map out where all your platforms need to appear.
+
+#### The tile method
+
+There are a few different ways to implement a platform game world. In the original side-scroller games, such as Mario Super Bros. and Sonic the Hedgehog, the technique was to use "tiles," meaning that there were a few blocks to represent the ground and various platforms, and these blocks were used and reused to make a level. You have only eight or 12 different kinds of blocks, and you line them up onscreen to create the ground, floating platforms, and whatever else your game needs. Some people find this the easier way to make a game since you just have to make (or download) a small set of level assets to create many different levels. The code, however, requires a little more math.
+
+![Supertux, a tile-based video game][5]
+
+[SuperTux][6], a tile-based video game.
+
+#### The hand-painted method
+
+Another method is to make each and every asset as one whole image. If you enjoy creating assets for your game world, this is a great excuse to spend time in a graphics application, building each and every part of your game world. This method requires less math, because all the platforms are whole, complete objects, and you tell [Python][7] where to place them onscreen.
+
+Each method has advantages and disadvantages, and the code you must use is slightly different depending on the method you choose. I'll cover both so you can use one or the other, or even a mix of both, in your project.
+
+### Level mapping
+
+Mapping out your game world is a vital part of level design and game programming in general. It does involve math, but nothing too difficult, and Python is good at math so it can help some.
+
+You might find it helpful to design on paper first. Get a sheet of paper and draw a box to represent your game window. Draw platforms in the box, labeling each with its X and Y coordinates, as well as its intended width and height. The actual positions in the box don't have to be exact, as long as you keep the numbers realistic. For instance, if your screen is 720 pixels wide, then you can't fit eight platforms at 100 pixels each all on one screen.
+
+Of course, not all platforms in your game have to fit in one screen-sized box, because your game will scroll as your player walks through it. So keep drawing your game world to the right of the first screen until the end of the level.
+
+If you prefer a little more precision, you can use graph paper. This is especially helpful when designing a game with tiles because each grid square can represent one tile.
+
+![Example of a level map][9]
+
+Example of a level map.
+
+#### Coordinates
+
+You may have learned in school about the [Cartesian coordinate system][10]. What you learned applies to Pygame, except that in Pygame, your game world's coordinates place `0,0` in the top-left corner of your screen instead of in the middle, which is probably what you're used to from Geometry class.
+
+![Example of coordinates in Pygame][12]
+
+Example of coordinates in Pygame.
+
+The X axis starts at 0 on the far left and increases infinitely to the right. The Y axis starts at 0 at the top of the screen and extends down.
+
+#### Image sizes
+
+Mapping out a game world is meaningless if you don't know how big your players, enemies, and platforms are. You can find the dimensions of your platforms or tiles in a graphics program. In [Krita][13], for example, click on the **Image** menu and select **Properties**. You can find the dimensions at the very top of the **Properties** window.
+
+Alternately, you can create a simple Python script to tell you the dimensions of an image. Open a new text file and type this code into it:
+
+```
+#!/usr/bin/env python3
+
+from PIL import Image
+import os.path
+import sys
+
+if len(sys.argv) > 1:
+ print(sys.argv[1])
+else:
+ sys.exit('Syntax: identify.py [filename]')
+
+pic = sys.argv[1]
+dim = Image.open(pic)
+X = dim.size[0]
+Y = dim.size[1]
+
+print(X,Y)
+```
+
+Save the text file as `identify.py`.
+
+To set up this script, you must install an extra set of Python modules that contain the new keywords used in the script:
+
+```
+$ pip3 install Pillow --user
+```
+
+Once that is installed, run your script from within your game project directory:
+
+```
+$ python3 ./identify.py images/ground.png
+(1080, 97)
+```
+
+The image size of the ground platform in this example is 1080 pixels wide and 97 high.
+
+### Platform blocks
+
+If you choose to draw each asset individually, you must create several platforms and any other elements you want to insert into your game world, each within its own file. In other words, you should have one file per asset, like this:
+
+![One image file per object][15]
+
+One image file per object.
+
+You can reuse each platform as many times as you want, just make sure that each file only contains one platform. You cannot use a file that contains everything, like this:
+
+![Your level cannot be one image file][17]
+
+Your level cannot be one image file.
+
+You might want your game to look like that when you've finished, but if you create your level in one big file, there is no way to distinguish a platform from the background, so either paint your objects in their own file or crop them from a large file and save individual copies.
+
+**Note:** As with your other assets, you can use [GIMP][18], Krita, [MyPaint][19], or [Inkscape][20] to create your game assets.
+
+Platforms appear on the screen at the start of each level, so you must add a `platform` function in your `Level` class. The special case here is the ground platform, which is important enough to be treated as its own platform group. By treating the ground as its own special kind of platform, you can choose whether it scrolls or whether it stands still while other platforms float over the top of it. It's up to you.
+
+Add these two functions to your `Level` class:
+
+```
+def ground(lvl,x,y,w,h):
+ ground_list = pygame.sprite.Group()
+ if lvl == 1:
+ ground = Platform(x,y,w,h,'block-ground.png')
+ ground_list.add(ground)
+
+ if lvl == 2:
+ print("Level " + str(lvl) )
+
+ return ground_list
+
+def platform( lvl ):
+ plat_list = pygame.sprite.Group()
+ if lvl == 1:
+ plat = Platform(200, worldy-97-128, 285,67,'block-big.png')
+ plat_list.add(plat)
+ plat = Platform(500, worldy-97-320, 197,54,'block-small.png')
+ plat_list.add(plat)
+ if lvl == 2:
+ print("Level " + str(lvl) )
+
+ return plat_list
+```
+
+The `ground` function requires an X and Y location so Pygame knows where to place the ground platform. It also requires the width and height of the platform so Pygame knows how far the ground extends in each direction. The function uses your `Platform` class to generate an object onscreen, and then adds that object to the `ground_list` group.
+
+The `platform` function is essentially the same, except that there are more platforms to list. In this example, there are only two, but you can have as many as you like. After entering one platform, you must add it to the `plat_list` before listing another. If you don't add a platform to the group, then it won't appear in your game.
+
+> **Tip:** It can be difficult to think of your game world with 0 at the top, since the opposite is what happens in the real world; when figuring out how tall you are, you don't measure yourself from the sky down, you measure yourself from your feet to the top of your head.
+>
+> If it's easier for you to build your game world from the "ground" up, it might help to express Y-axis values as negatives. For instance, you know that the bottom of your game world is the value of `worldy`. So `worldy` minus the height of the ground (97, in this example) is where your player is normally standing. If your character is 64 pixels tall, then the ground minus 128 is exactly twice as tall as your player. Effectively, a platform placed at 128 pixels is about two stories tall, relative to your player. A platform at -320 is three more stories. And so on.
+
+As you probably know by now, none of your classes and functions are worth much if you don't use them. Add this code to your setup section (the first line is just for context, so add the last two lines):
+
+```
+enemy_list = Level.bad( 1, eloc )
+ground_list = Level.ground( 1,0,worldy-97,1080,97 )
+plat_list = Level.platform( 1 )
+```
+
+And add these lines to your main loop (again, the first line is just for context):
+
+```
+enemy_list.draw(world) # refresh enemies
+ground_list.draw(world) # refresh ground
+plat_list.draw(world) # refresh platforms
+```
+
+### Tiled platforms
+
+Tiled game worlds are considered easier to make because you just have to draw a few blocks upfront and can use them over and over to create every platform in the game. There are even sets of tiles for you to use on sites like [OpenGameArt.org][21].
+
+The `Platform` class is the same as the one provided in the previous sections.
+
+The `ground` and `platform` in the `Level` class, however, must use loops to calculate how many blocks to use to create each platform.
+
+If you intend to have one solid ground in your game world, the ground is simple. You just "clone" your ground tile across the whole window. For instance, you could create a list of X and Y values to dictate where each tile should be placed, and then use a loop to take each value and draw one tile. This is just an example, so don't add this to your code:
+
+```
+# Do not add this to your code
+gloc = [0,656,64,656,128,656,192,656,256,656,320,656,384,656]
+```
+
+If you look carefully, though, you can see all the Y values are always the same, and the X values increase steadily in increments of 64, which is the size of the tiles. That kind of repetition is exactly what computers are good at, so you can use a little bit of math logic to have the computer do all the calculations for you:
+
+Add this to the setup part of your script:
+
+```
+gloc = []
+tx = 64
+ty = 64
+
+i=0
+while i <= (worldx/tx)+tx:
+ gloc.append(i*tx)
+ i=i+1
+
+ground_list = Level.ground( 1,gloc,tx,ty )
+```
+
+Now, regardless of the size of your window, Python divides the width of the game world by the width of the tile and creates an array listing each X value. This doesn't calculate the Y value, but that never changes on flat ground anyway.
+
+To use the array in a function, use a `while` loop that looks at each entry and adds a ground tile at the appropriate location:
+
+```
+def ground(lvl,gloc,tx,ty):
+ ground_list = pygame.sprite.Group()
+ i=0
+ if lvl == 1:
+ while i < len(gloc):
+ ground = Platform(gloc[i],worldy-ty,tx,ty,'tile-ground.png')
+ ground_list.add(ground)
+ i=i+1
+
+ if lvl == 2:
+ print("Level " + str(lvl) )
+
+ return ground_list
+```
+
+This is nearly the same code as the `ground` function for the block-style platformer, provided in a previous section above, aside from the `while` loop.
+
+For moving platforms, the principle is similar, but there are some tricks you can use to make your life easier.
+
+Rather than mapping every platform by pixels, you can define a platform by its starting pixel (its X value), the height from the ground (its Y value), and how many tiles to draw. That way, you don't have to worry about the width and height of every platform.
+
+The logic for this trick is a little more complex, so copy this code carefully. There is a `while` loop inside of another `while` loop because this function must look at all three values within each array entry to successfully construct a full platform. In this example, there are only three platforms defined as `ploc.append` statements, but your game probably needs more, so define as many as you need. Of course, some won't appear yet because they're far offscreen, but they'll come into view once you implement scrolling.
+
+```
+def platform(lvl,tx,ty):
+ plat_list = pygame.sprite.Group()
+ ploc = []
+ i=0
+ if lvl == 1:
+ ploc.append((200,worldy-ty-128,3))
+ ploc.append((300,worldy-ty-256,3))
+ ploc.append((500,worldy-ty-128,4))
+ while i < len(ploc):
+ j=0
+ while j <= ploc[i][2]:
+ plat = Platform((ploc[i][0]+(j*tx)),ploc[i][1],tx,ty,'tile.png')
+ plat_list.add(plat)
+ j=j+1
+ print('run' + str(i) + str(ploc[i]))
+ i=i+1
+
+ if lvl == 2:
+ print("Level " + str(lvl) )
+
+ return plat_list
+```
+
+To get the platforms to appear in your game world, they must be in your main loop. If you haven't already done so, add these lines to your main loop (again, the first line is just for context):
+
+```
+ enemy_list.draw(world) # refresh enemies
+ ground_list.draw(world) # refresh ground
+ plat_list.draw(world) # refresh platforms
+```
+
+Launch your game, and adjust the placement of your platforms as needed. Don't worry that you can't see the platforms that are spawned offscreen; you'll fix that soon.
+
+Here is the game so far in a picture and in code:
+
+![Pygame game][23]
+
+Our Pygame platformer so far.
+
+```
+ #!/usr/bin/env python3
+# draw a world
+# add a player and player control
+# add player movement
+# add enemy and basic collision
+# add platform
+
+# GNU All-Permissive License
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved. This file is offered as-is,
+# without any warranty.
+
+import pygame
+import sys
+import os
+
+'''
+Objects
+'''
+
+class Platform(pygame.sprite.Sprite):
+ # x location, y location, img width, img height, img file
+ def __init__(self,xloc,yloc,imgw,imgh,img):
+ pygame.sprite.Sprite.__init__(self)
+ self.image = pygame.image.load(os.path.join('images',img)).convert()
+ self.image.convert_alpha()
+ self.rect = self.image.get_rect()
+ self.rect.y = yloc
+ self.rect.x = xloc
+
+class Player(pygame.sprite.Sprite):
+ '''
+ Spawn a player
+ '''
+ def __init__(self):
+ pygame.sprite.Sprite.__init__(self)
+ self.movex = 0
+ self.movey = 0
+ self.frame = 0
+ self.health = 10
+ self.score = 1
+ self.images = []
+ for i in range(1,9):
+ img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert()
+ img.convert_alpha()
+ img.set_colorkey(ALPHA)
+ self.images.append(img)
+ self.image = self.images[0]
+ self.rect = self.image.get_rect()
+
+ def control(self,x,y):
+ '''
+ control player movement
+ '''
+ self.movex += x
+ self.movey += y
+
+ def update(self):
+ '''
+ Update sprite position
+ '''
+
+ self.rect.x = self.rect.x + self.movex
+ self.rect.y = self.rect.y + self.movey
+
+ # moving left
+ if self.movex < 0:
+ self.frame += 1
+ if self.frame > ani*3:
+ self.frame = 0
+ self.image = self.images[self.frame//ani]
+
+ # moving right
+ if self.movex > 0:
+ self.frame += 1
+ if self.frame > ani*3:
+ self.frame = 0
+ self.image = self.images[(self.frame//ani)+4]
+
+ # collisions
+ enemy_hit_list = pygame.sprite.spritecollide(self, enemy_list, False)
+ for enemy in enemy_hit_list:
+ self.health -= 1
+ print(self.health)
+
+ ground_hit_list = pygame.sprite.spritecollide(self, ground_list, False)
+ for g in ground_hit_list:
+ self.health -= 1
+ print(self.health)
+
+
+class Enemy(pygame.sprite.Sprite):
+ '''
+ Spawn an enemy
+ '''
+ def __init__(self,x,y,img):
+ pygame.sprite.Sprite.__init__(self)
+ self.image = pygame.image.load(os.path.join('images',img))
+ #self.image.convert_alpha()
+ #self.image.set_colorkey(ALPHA)
+ self.rect = self.image.get_rect()
+ self.rect.x = x
+ self.rect.y = y
+ self.counter = 0
+
+ def move(self):
+ '''
+ enemy movement
+ '''
+ distance = 80
+ speed = 8
+
+ if self.counter >= 0 and self.counter <= distance:
+ self.rect.x += speed
+ elif self.counter >= distance and self.counter <= distance*2:
+ self.rect.x -= speed
+ else:
+ self.counter = 0
+
+ self.counter += 1
+
+class Level():
+ def bad(lvl,eloc):
+ if lvl == 1:
+ enemy = Enemy(eloc[0],eloc[1],'yeti.png') # spawn enemy
+ enemy_list = pygame.sprite.Group() # create enemy group
+ enemy_list.add(enemy) # add enemy to group
+
+ if lvl == 2:
+ print("Level " + str(lvl) )
+
+ return enemy_list
+
+ def loot(lvl,lloc):
+ print(lvl)
+
+ def ground(lvl,gloc,tx,ty):
+ ground_list = pygame.sprite.Group()
+ i=0
+ if lvl == 1:
+ while i < len(gloc):
+ print("blockgen:" + str(i))
+ ground = Platform(gloc[i],worldy-ty,tx,ty,'ground.png')
+ ground_list.add(ground)
+ i=i+1
+
+ if lvl == 2:
+ print("Level " + str(lvl) )
+
+ return ground_list
+
+'''
+Setup
+'''
+worldx = 960
+worldy = 720
+
+fps = 40 # frame rate
+ani = 4 # animation cycles
+clock = pygame.time.Clock()
+pygame.init()
+main = True
+
+BLUE = (25,25,200)
+BLACK = (23,23,23 )
+WHITE = (254,254,254)
+ALPHA = (0,255,0)
+
+world = pygame.display.set_mode([worldx,worldy])
+backdrop = pygame.image.load(os.path.join('images','stage.png')).convert()
+backdropbox = world.get_rect()
+player = Player() # spawn player
+player.rect.x = 0
+player.rect.y = 0
+player_list = pygame.sprite.Group()
+player_list.add(player)
+steps = 10 # how fast to move
+
+eloc = []
+eloc = [200,20]
+gloc = []
+#gloc = [0,630,64,630,128,630,192,630,256,630,320,630,384,630]
+tx = 64 #tile size
+ty = 64 #tile size
+
+i=0
+while i <= (worldx/tx)+tx:
+ gloc.append(i*tx)
+ i=i+1
+ print("block: " + str(i))
+
+enemy_list = Level.bad( 1, eloc )
+ground_list = Level.ground( 1,gloc,tx,ty )
+
+'''
+Main loop
+'''
+while main == True:
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit(); sys.exit()
+ main = False
+
+ if event.type == pygame.KEYDOWN:
+ if event.key == pygame.K_LEFT or event.key == ord('a'):
+ player.control(-steps,0)
+ if event.key == pygame.K_RIGHT or event.key == ord('d'):
+ player.control(steps,0)
+ if event.key == pygame.K_UP or event.key == ord('w'):
+ print('jump')
+
+ if event.type == pygame.KEYUP:
+ if event.key == pygame.K_LEFT or event.key == ord('a'):
+ player.control(steps,0)
+ if event.key == pygame.K_RIGHT or event.key == ord('d'):
+ player.control(-steps,0)
+ if event.key == ord('q'):
+ pygame.quit()
+ sys.exit()
+ main = False
+
+# world.fill(BLACK)
+ world.blit(backdrop, backdropbox)
+ player.update()
+ player_list.draw(world) #refresh player position
+ enemy_list.draw(world) # refresh enemies
+ ground_list.draw(world) # refresh enemies
+ for e in enemy_list:
+ e.move()
+ pygame.display.flip()
+ clock.tick(fps)
+```
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/18/7/put-platforms-python-game
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://opensource.com/users/seth
+[b]: https://github.com/lujun9972
+[1]: https://www.pygame.org/news
+[2]: https://opensource.com/article/17/12/game-python-add-a-player
+[3]: https://opensource.com/article/17/12/game-python-moving-player
+[4]: /file/403841
+[5]: https://opensource.com/sites/default/files/uploads/supertux.png (Supertux, a tile-based video game)
+[6]: https://www.supertux.org/
+[7]: https://www.python.org/
+[8]: /file/403861
+[9]: https://opensource.com/sites/default/files/uploads/layout.png (Example of a level map)
+[10]: https://en.wikipedia.org/wiki/Cartesian_coordinate_system
+[11]: /file/403871
+[12]: https://opensource.com/sites/default/files/uploads/pygame_coordinates.png (Example of coordinates in Pygame)
+[13]: https://krita.org/en/
+[14]: /file/403876
+[15]: https://opensource.com/sites/default/files/uploads/pygame_floating.png (One image file per object)
+[16]: /file/403881
+[17]: https://opensource.com/sites/default/files/uploads/pygame_flattened.png (Your level cannot be one image file)
+[18]: https://www.gimp.org/
+[19]: http://mypaint.org/about/
+[20]: https://inkscape.org/en/
+[21]: https://opengameart.org/content/simplified-platformer-pack
+[22]: /file/403886
+[23]: https://opensource.com/sites/default/files/uploads/pygame_platforms.jpg (Pygame game)
+[24]: Learn how to program in Python by building a simple dice game
+[25]: https://opensource.com/article/17/12/game-framework-python
+[26]: https://opensource.com/article/17/12/game-python-add-a-player
+[27]: https://opensource.com/article/17/12/game-python-moving-player
+[28]: https://opensource.com/article/18/5/pygame-enemy
+
diff --git a/sources/tech/20180906 What a shell dotfile can do for you.md b/sources/tech/20180906 What a shell dotfile can do for you.md
index 35593e1e32..16ee0936e3 100644
--- a/sources/tech/20180906 What a shell dotfile can do for you.md
+++ b/sources/tech/20180906 What a shell dotfile can do for you.md
@@ -1,3 +1,11 @@
+[#]: collector: (lujun9972)
+[#]: translator: (runningwater)
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (What a shell dotfile can do for you)
+[#]: via: (https://opensource.com/article/18/9/shell-dotfile)
+[#]: author: (H.Waldo Grunenwald https://opensource.com/users/gwaldo)
What a shell dotfile can do for you
======
@@ -223,7 +231,7 @@ via: https://opensource.com/article/18/9/shell-dotfile
作者:[H.Waldo Grunenwald][a]
选题:[lujun9972](https://github.com/lujun9972)
-译者:[译者ID](https://github.com/译者ID)
+译者:[runningwater](https://github.com/runningwater)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/sources/tech/20181123 Three SSH GUI Tools for Linux.md b/sources/tech/20181123 Three SSH GUI Tools for Linux.md
deleted file mode 100644
index 9691a737ca..0000000000
--- a/sources/tech/20181123 Three SSH GUI Tools for Linux.md
+++ /dev/null
@@ -1,176 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: subject: (Three SSH GUI Tools for Linux)
-[#]: via: (https://www.linux.com/blog/learn/intro-to-linux/2018/11/three-ssh-guis-linux)
-[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen)
-[#]: url: ( )
-
-Three SSH GUI Tools for Linux
-======
-
-![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ssh.jpg?itok=3UcXhJt7)
-
-At some point in your career as a Linux administrator, you’re going to use Secure Shell (SSH) to remote into a Linux server or desktop. Chances are, you already have. In some instances, you’ll be SSH’ing into multiple Linux servers at once. In fact, Secure Shell might well be one of the most-used tools in your Linux toolbox. Because of this, you’ll want to make the experience as efficient as possible. For many admins, nothing is as efficient as the command line. However, there are users out there who do prefer a GUI tool, especially when working from a desktop machine to remote into and work on a server.
-
-If you happen to prefer a good GUI tool, you’ll be happy to know there are a couple of outstanding graphical tools for SSH on Linux. Couple that with a unique terminal window that allows you to remote into multiple machines from the same window, and you have everything you need to work efficiently. Let’s take a look at these three tools and find out if one (or more) of them is perfectly apt to meet your needs.
-
-I’ll be demonstrating these tools on [Elementary OS][1], but they are all available for most major distributions.
-
-### PuTTY
-
-Anyone that’s been around long enough knows about [PuTTY][2]. In fact, PuTTY is the de facto standard tool for connecting, via SSH, to Linux servers from the Windows environment. But PuTTY isn’t just for Windows. In fact, from withing the standard repositories, PuTTY can also be installed on Linux. PuTTY’s feature list includes:
-
- * Saved sessions.
-
- * Connect via IP address or hostname.
-
- * Define alternative SSH port.
-
- * Connection type definition.
-
- * Logging.
-
- * Options for keyboard, bell, appearance, connection, and more.
-
- * Local and remote tunnel configuration
-
- * Proxy support
-
- * X11 tunneling support
-
-
-
-
-The PuTTY GUI is mostly a way to save SSH sessions, so it’s easier to manage all of those various Linux servers and desktops you need to constantly remote into and out of. Once you’ve connected, from PuTTY to the Linux server, you will have a terminal window in which to work. At this point, you may be asking yourself, why not just work from the terminal window? For some, the convenience of saving sessions does make PuTTY worth using.
-
-Installing PuTTY on Linux is simple. For example, you could issue the command on a Debian-based distribution:
-
-```
-sudo apt-get install -y putty
-```
-
-Once installed, you can either run the PuTTY GUI from your desktop menu or issue the command putty. In the PuTTY Configuration window (Figure 1), type the hostname or IP address in the HostName (or IP address) section, configure the port (if not the default 22), select SSH from the connection type, and click Open.
-
-![PuTTY Connection][4]
-
-Figure 1: The PuTTY Connection Configuration Window.
-
-[Used with permission][5]
-
-Once the connection is made, you’ll then be prompted for the user credentials on the remote server (Figure 2).
-
-![log in][7]
-
-Figure 2: Logging into a remote server with PuTTY.
-
-[Used with permission][5]
-
-To save a session (so you don’t have to always type the remote server information), fill out the IP address (or hostname), configure the port and connection type, and then (before you click Open), type a name for the connection in the top text area of the Saved Sessions section, and click Save. This will then save the configuration for the session. To then connect to a saved session, select it from the saved sessions window, click Load, and then click Open. You should then be prompted for the remote credentials on the remote server.
-
-### EasySSH
-
-Although [EasySSH][8] doesn’t offer the amount of configuration options found in PuTTY, it’s (as the name implies) incredibly easy to use. One of the best features of EasySSH is that it offers a tabbed interface, so you can have multiple SSH connections open and quickly switch between them. Other EasySSH features include:
-
- * Groups (so you can group tabs for an even more efficient experience).
-
- * Username/password save.
-
- * Appearance options.
-
- * Local and remote tunnel support.
-
-
-
-
-Install EasySSH on a Linux desktop is simple, as the app can be installed via flatpak (which does mean you must have Flatpak installed on your system). Once flatpak is installed, add EasySSH with the commands:
-
-```
-sudo flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
-
-sudo flatpak install flathub com.github.muriloventuroso.easyssh
-```
-
-Run EasySSH with the command:
-
-```
-flatpak run com.github.muriloventuroso.easyssh
-```
-
-The EasySSH app will open, where you can click the + button in the upper left corner. In the resulting window (Figure 3), configure your SSH connection as required.
-
-![Adding a connection][10]
-
-Figure 3: Adding a connection in EasySSH is simple.
-
-[Used with permission][5]
-
-Once you’ve added the connection, it will appear in the left navigation of the main window (Figure 4).
-
-![EasySSH][12]
-
-Figure 4: The EasySSH main window.
-
-[Used with permission][5]
-
-To connect to a remote server in EasySSH, select it from the left navigation and then click the Connect button (Figure 5).
-
-![Connecting][14]
-
-Figure 5: Connecting to a remote server with EasySSH.
-
-[Used with permission][5]
-
-The one caveat with EasySSH is that you must save the username and password in the connection configuration (otherwise the connection will fail). This means anyone with access to the desktop running EasySSH can remote into your servers without knowing the passwords. Because of this, you must always remember to lock your desktop screen any time you are away (and make sure to use a strong password). The last thing you want is to have a server vulnerable to unwanted logins.
-
-### Terminator
-
-Terminator is not actually an SSH GUI. Instead, Terminator functions as a single window that allows you to run multiple terminals (and even groups of terminals) at once. Effectively you can open Terminator, split the window vertical and horizontally (until you have all the terminals you want), and then connect to all of your remote Linux servers by way of the standard SSH command (Figure 6).
-
-![Terminator][16]
-
-Figure 6: Terminator split into three different windows, each connecting to a different Linux server.
-
-[Used with permission][5]
-
-To install Terminator, issue a command like:
-
-### sudo apt-get install -y terminator
-
-Once installed, open the tool either from your desktop menu or from the command terminator. With the window opened, you can right-click inside Terminator and select either Split Horizontally or Split Vertically. Continue splitting the terminal until you have exactly the number of terminals you need, and then start remoting into those servers.
-The caveat to using Terminator is that it is not a standard SSH GUI tool, in that it won’t save your sessions or give you quick access to those servers. In other words, you will always have to manually log into your remote Linux servers. However, being able to see your remote Secure Shell sessions side by side does make administering multiple remote machines quite a bit easier.
-
-Few (But Worthwhile) Options
-
-There aren’t a lot of SSH GUI tools available for Linux. Why? Because most administrators prefer to simply open a terminal window and use the standard command-line tools to remotely access their servers. However, if you have a need for a GUI tool, you have two solid options and one terminal that makes logging into multiple machines slightly easier. Although there are only a few options for those looking for an SSH GUI tool, those that are available are certainly worth your time. Give one of these a try and see for yourself.
-
---------------------------------------------------------------------------------
-
-via: https://www.linux.com/blog/learn/intro-to-linux/2018/11/three-ssh-guis-linux
-
-作者:[Jack Wallen][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.linux.com/users/jlwallen
-[b]: https://github.com/lujun9972
-[1]: https://elementary.io/
-[2]: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
-[3]: https://www.linux.com/files/images/sshguis1jpg
-[4]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ssh_guis_1.jpg?itok=DiNTz_wO (PuTTY Connection)
-[5]: https://www.linux.com/licenses/category/used-permission
-[6]: https://www.linux.com/files/images/sshguis2jpg
-[7]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ssh_guis_2.jpg?itok=4ORsJlz3 (log in)
-[8]: https://github.com/muriloventuroso/easyssh
-[9]: https://www.linux.com/files/images/sshguis3jpg
-[10]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ssh_guis_3.jpg?itok=bHC2zlda (Adding a connection)
-[11]: https://www.linux.com/files/images/sshguis4jpg
-[12]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ssh_guis_4.jpg?itok=hhJzhRIg (EasySSH)
-[13]: https://www.linux.com/files/images/sshguis5jpg
-[14]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ssh_guis_5.jpg?itok=piFEFYTQ (Connecting)
-[15]: https://www.linux.com/files/images/sshguis6jpg
-[16]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ssh_guis_6.jpg?itok=-kYl6iSE (Terminator)
diff --git a/sources/tech/20181124 14 Best ASCII Games for Linux That are Insanely Good.md b/sources/tech/20181124 14 Best ASCII Games for Linux That are Insanely Good.md
deleted file mode 100644
index 094467698b..0000000000
--- a/sources/tech/20181124 14 Best ASCII Games for Linux That are Insanely Good.md
+++ /dev/null
@@ -1,335 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: subject: (14 Best ASCII Games for Linux That are Insanely Good)
-[#]: via: (https://itsfoss.com/best-ascii-games/)
-[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
-[#]: url: ( )
-
-14 Best ASCII Games for Linux That are Insanely Good
-======
-
-Text-based or should I say [terminal-based games][1] were very popular a decade back – when you didn’t have visual masterpieces like God Of War, Red Dead Redemption 2 or Spiderman.
-
-Of course, the Linux platform has its share of good games – but not always the “latest and greatest”. But, there are some ASCII games out there – to which you can never turn your back on.
-
-I’m not sure if you’d believe me, some of the ASCII games proved to be very addictive (So, it might take a while for me to resume work on the next article, or I might just get fired? – Help me!)
-
-Jokes apart, let us take a look at the best ASCII games.
-
-**Note:** Installing ASCII games could be time-consuming (some might ask you to install additional dependencies or simply won’t work). You might even encounter some ASCII games that require you build from Source. So, we’ve filtered out only the ones that are easy to install/run – without breaking a sweat.
-
-### Things to do before Running or Installing an ASCII Game
-
-Some of the ASCII games might require you to install [Simple DirectMedia Layer][2] unless you already have it installed. So, in case, you should install them first before trying to run any of the games mentioned in this article.
-
-For that, you just need to type in these commands:
-
-```
-sudo apt install libsdl2-2.0
-```
-
-```
-sudo apt install libsdl2_mixer-2.0
-```
-
-
-### Best ASCII Games for Linux
-
-![Best Ascii games for Linux][3]
-
-The games listed are in no particular order of ranking.
-
-#### 1 . [Curse of War][4]
-
-![Curse of War ascii games][5]
-
-Curse of War is an interesting strategy game. You might find it a bit confusing at first but once you get to know it – you’ll love it. I’ll recommend you to take a look at the rules of the game on their [homepage][4] before launching the game.
-
-You will be building infrastructure, secure resources and directing your army to fight. All you have to do is place your flag in a good position to let your army take care of the rest. It’s not just about attacking – you need to manage and secure the resources to help win the fight.
-
-If you’ve never played any ASCII game before, be patient and spend some time learning it – to experience it to its fullest potential.
-
-##### How to install Curse of War?
-
-You will find it in the official repository. So, type in the following command to install it:
-
-```
-sudo apt install curseofwar
-```
-#### 2. ASCII Sector
-
-![ascii sector][6]
-
-Hate strategy games? Fret not, ASCII sector is a game that has a space-setting and lets you explore a lot.
-
-Also, the game isn’t just limited to exploration, you need some action? You got that here as well. Of course, not the best combat experience- but it is fun. It gets even more exciting when you see a variety of bases, missions, and quests. You’ll encounter a leveling system in this tiny game where you have to earn enough money or trade in order upgrade your spaceship.
-
-The best part about this game is – you can create your own quests or play other’s.
-
-###### How to install ASCII Sector?
-
-You need to first download and unpack the archived package from the [official site][7]. After it’s done, open up your terminal and type these commands (replace the **Downloads** folder with your location where the unpacked folder exists, ignore it if the unpacked folder resides inside your home directory):
-
-```
-cd Downloads
-cd asciisec
-chmod +x asciisec
-./asciisec
-```
-
-#### 3. DoomRL
-
-![doom ascii game][8]
-
-You must be knowing the classic game “Doom”. So, if you want the scaled down experience of it as a rogue-like, DoomRL is for you. It is an ASCII-based game, in case you don’t feel like it to be.
-
-It’s a very tiny game with a lot of gameplay hours to have fun with.
-
-###### How to install DoomRL?
-
-Similar to what you did for ASCII Sector, you need to download the official archive from their [download page][9] and then extract it to a folder.
-
-After extracting it, type in these commands:
-
-```
-cd Downloads // navigating to the location where the unpacked folder exists
-```
-
-```
-cd doomrl-linux-x64-0997
-chmod +x doomrl
-./doomrl
-```
-#### 4. Pyramid Builder
-
-![Pyramid Builder ascii game for Linux][10]
-
-Pyramid Builder is an innovative take as an ASCII game where get to improve your civilization by helping build pyramids.
-
-You need to direct the workers to farm, unload the cargo, and move the gigantic stones to successfully build the pyramid.
-
-It is indeed a beautiful ASCII game to download.
-
-###### How to install Pyramid Builder?
-
-Simply head to its official site and download the package to unpack it. After extraction, navigate to the folder and run the executable file.
-
-```
-cd Downloads
-cd pyramid_builder_linux
-chmod +x pyramid_builder_linux.x86_64
-./pyramid_builder_linux.x86_64
-```
-#### 5. DiabloRL
-
-![Diablo ascii RPG game][11]
-
-If you’re an avid gamer, you must have heard about Blizzard’s Diablo 1. It is undoubtedly a good game.
-
-You get the chance to play a unique rendition of the game – which is an ASCII game. DiabloRL is a turn-based rogue-like game that is insanely good. You get to choose from a variety of classes (Warrior, Sorcerer, or Rogue). Every class would result in a different gameplay experience with a set of different stats.
-
-Of course, personal preference will differ – but it’s a decent “unmake” of Diablo. What do you think?
-
-#### 6. Ninvaders
-
-![Ninvaders terminal game for Linux][12]
-
-Ninvaders is one of the best ASCII game just because it’s so simple and an arcade game to kill time.
-
-You have to defend against a hord of invaders – just finish them off before they get to you. It sounds very simple – but it is a challenging game.
-
-##### How to install Ninvaders?
-
-Similar to Curse of War, you can find this in the official repository. So, just type in this command to install it:
-
-```
-sudo apt install ninvaders
-```
-#### 7. Empire
-
-![Empire terminal game][13]
-
-A real-time strategy game for which you will need an active Internet connection. I’m personally not a fan of Real-Time strategy games, but if you are a fan of such games – you should really check out their [guide][14] to play this game – because it can be very challenging to learn.
-
-The rectangle contains cities, land, and water. You need to expand your city with an army, ships, planes and other resources. By expanding quickly, you will be able to capture other cities by destroying them before they make a move.
-
-##### How to install Empire?
-
-Install this is very simple, just type in the following command:
-
-```
-sudo apt install empire
-```
-
-#### 8. Nudoku
-
-![Nudoku is a terminal version game of Sudoku][15]
-
-Love Sudoku? Well, you have Nudoku – a clone for it. A perfect time-killing ASCII game while you relax.
-
-It presents you with three difficulty levels – Easy, normal, and hard. If you want to put up a challenge with the computer, the hard difficulty will be perfect! If you just want to chill, go for the easy one.
-
-##### How to install Nudoku?
-
-It’s very easy to get it installed, just type in the following command in the terminal:
-
-```
-sudo apt install nudoku
-```
-
-#### 9\. Nethack
-
-A dungeons and dragon-style ASCII game which is one of the best out there. I believe it’s one of your favorites if you already knew about ASCII games for Linux – in general.
-
-It features a lot of different levels (about 45) and comes packed in with a bunch of weapons, scrolls, potions, armor, rings, and gems. You can also choose permadeath as your mode to play it.
-
-It’s not just about killing here – you got a lot to explore.
-
-##### How to install Nethack?
-
-Simply follow the command below to install it:
-
-```
-sudo apt install nethack
-```
-
-#### 10. ASCII Jump
-
-![ascii jump game][16]
-
-ASCII Jump is a dead simple game where you have to slide along a varierty of tracks – while jumping, changing position, and moving as long as you can to cover maximum distance.
-
-It’s really amazing to see how this ASCII game looks like (visually) even it seems so simple. You can start with the training mode and then proceed to the world cup. You also get to choose your competitors and the hills on which you want to start the game.
-
-##### How to install Ascii Jump?
-
-To install the game, just type the following command:
-
-```
-sudo apt install asciijump
-```
-
-#### 11. Bastet
-
-![Bastet is tetris game in ascii form][17]
-
-Let’s just not pay any attention to the name – it’s actually a fun clone of Tetris game.
-
-You shouldn’t expect it to be just another ordinary tetris game – but it will present you the worst possible bricks to play with. Have fun!
-
-##### How to install Bastet?
-
-Open the terminal and type in the following command:
-
-```
-sudo apt install bastet
-```
-
-#### 12\. Bombardier
-
-![Bomabrdier game in ascii form][18]
-
-Bombardier is yet another simple ASCII game which will keep you hooked on to it.
-
-Here, you have a helicopter (or whatever you’d like to call your aircraft) which lowers down every cycle and you need to throw bombs in order to destroy the blocks/buildings under you. The game also puts a pinch of humor for the messages it displays when you destroy a block. It is fun.
-
-##### How to install Bombardier?
-
-Bombardier is available in the official repository, so just type in the following in the terminal to install it:
-
-```
-sudo apt install bombardier
-```
-
-#### 13\. Angband
-
-![Angband ascii game][19]
-
-A cool dungeon exploration game with a neat interface. You can see all the vital information in a single screen while you explore the game.
-
-It contains different kinds of race to pick a character. You can either be an Elf, Hobbit, Dwarf or something else – there’s nearly a dozen to choose from. Remember, that you need to defeat the lord of darkness at the end – so make every upgrade possible to your weapon and get ready.
-
-How to install Angband?
-
-Simply type in the following command:
-
-```
-sudo apt install angband
-```
-
-#### 14\. GNU Chess
-
-![GNU Chess is a chess game that you can play in Linux terminal][20]
-
-How can you not play chess? It is my favorite strategy game!
-
-But, GNU Chess can be tough to play with unless you know the Algebraic notation to describe the next move. Of course, being an ASCII game – it isn’t quite possible to interact – so it asks you the notation to detect your move and displays the output (while it waits for the computer to think its next move).
-
-##### How to install GNU Chess?
-
-If you’re aware of the algebraic notations of Chess, enter the following command to install it from the terminal:
-
-```
-sudo apt install gnuchess
-```
-
-#### Some Honorable Mentions
-
-As I mentioned earlier, we’ve tried to recommend you the best (but also the ones that are the easiest to install on your Linux machine).
-
-However, there are some iconic ASCII games which deserve the attention and requires a tad more effort to install (You will get the source code and you need to build it / install it).
-
-Some of those games are:
-
-+ [Cataclysm: Dark Days Ahead][22]
-+ [Brogue][23]
-+ [Dwarf Fortress][24]
-
-You should follow our [guide to install software from source code][21].
-
-### Wrapping Up
-
-Which of the ASCII games mentioned seem perfect for you? Did we miss any of your favorites?
-
-Let us know your thoughts in the comments below.
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/best-ascii-games/
-
-作者:[Ankush Das][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [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-command-line-games-linux/
-[2]: https://www.libsdl.org/
-[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/best-ascii-games-featured.png?resize=800%2C450&ssl=1
-[4]: http://a-nikolaev.github.io/curseofwar/
-[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/11/curseofwar-ascii-game.jpg?fit=800%2C479&ssl=1
-[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/ascii-sector-game.jpg?fit=800%2C424&ssl=1
-[7]: http://www.asciisector.net/download/
-[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/11/doom-rl-ascii-game.jpg?ssl=1
-[9]: https://drl.chaosforge.org/downloads
-[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/pyramid-builder-ascii-game.jpg?fit=800%2C509&ssl=1
-[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/11/diablo-rl-ascii-game.jpg?ssl=1
-[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/ninvaders-ascii-game.jpg?fit=800%2C426&ssl=1
-[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/empire-ascii-game.jpg?fit=800%2C570&ssl=1
-[14]: http://www.wolfpackempire.com/infopages/Guide.html
-[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/11/nudoku-ascii-game.jpg?fit=800%2C434&ssl=1
-[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/11/ascii-jump.jpg?fit=800%2C566&ssl=1
-[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/11/bastet-tetris-clone-ascii.jpg?fit=800%2C465&ssl=1
-[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2018/11/bombardier.jpg?fit=800%2C571&ssl=1
-[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2018/11/angband-ascii-game.jpg?ssl=1
-[20]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2018/11/gnuchess-ascii-game.jpg?ssl=1
-[21]: https://itsfoss.com/install-software-from-source-code/
-[22]: https://github.com/CleverRaven/Cataclysm-DDA
-[23]: https://sites.google.com/site/broguegame/
-[24]: http://www.bay12games.com/dwarves/index.html
-
diff --git a/sources/tech/20181204 4 Unique Terminal Emulators for Linux.md b/sources/tech/20181204 4 Unique Terminal Emulators for Linux.md
deleted file mode 100644
index 04110b670e..0000000000
--- a/sources/tech/20181204 4 Unique Terminal Emulators for Linux.md
+++ /dev/null
@@ -1,169 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (4 Unique Terminal Emulators for Linux)
-[#]: via: (https://www.linux.com/blog/learn/2018/12/4-unique-terminals-linux)
-[#]: author: (Jack Wallen https://www.linux.com/users/jlwallen)
-
-4 Unique Terminal Emulators for Linux
-======
-![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/terminals_main.jpg?itok=e6av-5VO)
-Let’s face it, if you’re a Linux administrator, you’re going to work with the command line. To do that, you’ll be using a terminal emulator. Most likely, your distribution of choice came pre-installed with a default terminal emulator that gets the job done. But this is Linux, so you have a wealth of choices to pick from, and that ideology holds true for terminal emulators as well. In fact, if you open up your distribution’s GUI package manager (or search from the command line), you’ll find a trove of possible options. Of those, many are pretty straightforward tools; however, some are truly unique.
-
-In this article, I’ll highlight four such terminal emulators, that will not only get the job done, but do so while making the job a bit more interesting or fun. So, let’s take a look at these terminals.
-
-### Tilda
-
-[Tilda][1] is designed for Gtk and is a member of the cool drop-down family of terminals. That means the terminal is always running in the background, ready to drop down from the top of your monitor (such as Guake and Yakuake). What makes Tilda rise above many of the others is the number of configuration options available for the terminal (Figure 1).
-![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/terminals_1.jpg?itok=bra6qb6X)
-
-Tilda can be installed from the standard repositories. On a Ubuntu- (or Debian-) based distribution, the installation is as simple as:
-
-```
-sudo apt-get install tilda -y
-```
-
-Once installed, open Tilda from your desktop menu, which will also open the configuration window. Configure the app to suit your taste and then close the configuration window. You can then open and close Tilda by hitting the F1 hotkey. One caveat to using Tilda is that, after the first run, you won’t find any indication as to how to reach the configuration wizard. No worries. If you run the command tilda -C it will open the configuration window, while still retaining the options you’ve previously set.
-
-Available options include:
-
- * Terminal size and location
-
- * Font and color configurations
-
- * Auto Hide
-
- * Title
-
- * Custom commands
-
- * URL Handling
-
- * Transparency
-
- * Animation
-
- * Scrolling
-
- * And more
-
-
-
-
-What I like about these types of terminals is that they easily get out of the way when you don’t need them and are just a button click away when you do. For those that hop in and out of the terminal, a tool like Tilda is ideal.
-
-### Aterm
-
-Aterm holds a special place in my heart, as it was one of the first terminals I used that made me realize how flexible Linux was. This was back when AfterStep was my window manager of choice (which dates me a bit) and I was new to the command line. What Aterm offered was a terminal emulator that was highly customizable, while helping me learn the ins and outs of using the terminal (how to add options and switches to a command). “How?” you ask. Because Aterm never had a GUI for customization. To run Aterm with any special options, it had to run as a command. For example, say you want to open Aterm with transparency enabled, green text, white highlights, and no scroll bar. To do this, issue the command:
-
-```
-aterm -tr -fg green -bg white +xb
-```
-
-The end result (with the top command running for illustration) would look like that shown in Figure 2.
-
-![Aterm][3]
-
-Figure 2: Aterm with a few custom options.
-
-[Used with permission][4]
-
-Of course, you must first install Aterm. Fortunately, the application is still found in the standard repositories, so installing on the likes of Ubuntu is as simple as:
-
-```
-sudo apt-get install aterm -y
-```
-
-If you want to always open Aterm with those options, your best bet is to create an alias in your ~/.bashrc file like so:
-
-```
-alias=”aterm -tr -fg green -bg white +sb”
-```
-
-Save that file and, when you issue the command aterm, it will always open with those options. For more about creating aliases, check out [this tutorial][5].
-
-### Eterm
-
-Eterm is the second terminal that really showed me how much fun the Linux command line could be. Eterm is the default terminal emulator for the Enlightenment desktop. When I eventually migrated from AfterStep to Enlightenment (back in the early 2000s), I was afraid I’d lose out on all those cool aesthetic options. That turned out to not be the case. In fact, Eterm offered plenty of unique options, while making the task easier with a terminal toolbar. With Eterm, you can easily select from a large number of background images (should you want one - Figure 3) by selecting from the Background > Pixmap menu entry.
-
-![Eterm][7]
-
-Figure 3: Selecting from one of the many background images for Eterm.
-
-[Used with permission][4]
-
-There are a number of other options to configure (such as font size, map alerts, toggle scrollbar, brightness, contrast, and gamma of background images, and more). The one thing you want to make sure is, after you’ve configured Eterm to suit your tastes, to click Eterm > Save User Settings (otherwise, all settings will be lost when you close the app).
-
-Eterm can be installed from the standard repositories, with a command such as:
-
-```
-sudo apt-get install eterm
-```
-
-### Extraterm
-
-[Extraterm][8] should probably win a few awards for coolest feature set of any terminal window project available today. The most unique feature of Extraterm is the ability to wrap commands in color-coded frames (blue for successful commands and red for failed commands - Figure 4).
-
-![Extraterm][10]
-
-Figure 4: Extraterm showing two failed command frames.
-
-[Used with permission][4]
-
-When you run a command, Extraterm will wrap the command in an isolated frame. If the command succeeds, the frame will be outlined in blue. Should the command fail, the frame will be outlined in red.
-
-Extraterm cannot be installed via the standard repositories. In fact, the only way to run Extraterm on Linux (at the moment) is to [download the precompiled binary][11] from the project’s GitHub page, extract the file, change into the newly created directory, and issue the command ./extraterm.
-
-Once the app is running, to enable frames you must first enable bash integration. To do that, open Extraterm and then right-click anywhere in the window to reveal the popup menu. Scroll until you see the entry for Inject Bash shell Integration (Figure 5). Select that entry and you can then begin using the frames option.
-
-![Extraterm][13]
-
-Figure 5: Injecting Bash integration for Extraterm.
-
-[Used with permission][4]
-
-If you run a command, and don’t see a frame appear, you probably have to create a new frame for the command (as Extraterm only ships with a few default frames). To do that, click on the Extraterm menu button (three horizontal lines in the top right corner of the window), select Settings, and then click the Frames tab. In this window, scroll down and click the New Rule button. You can then add a command you want to work with the frames option (Figure 6).
-
-![frames][15]
-
-Figure 6: Adding a new rule for frames.
-
-[Used with permission][4]
-
-If, after this, you still don’t see frames appearing, download the extraterm-commands file from the [Download page][11], extract the file, change into the newly created directory, and issue the command sh setup_extraterm_bash.sh. That should enable frames for Extraterm.
-There’s plenty more options available for Extraterm. I’m convinced, once you start playing around with this new take on the terminal window, you won’t want to go back to the standard terminal. Hopefully the developer will make this app available to the standard repositories soon (as it could easily become one of the most popular terminal windows in use).
-
-### And Many More
-
-As you probably expected, there are quite a lot of terminals available for Linux. These four represent (at least for me) four unique takes on the task, each of which do a great job of helping you run the commands every Linux admin needs to run. If you aren’t satisfied with one of these, give your package manager a look to see what’s available. You are sure to find something that works perfectly for you.
-
---------------------------------------------------------------------------------
-
-via: https://www.linux.com/blog/learn/2018/12/4-unique-terminals-linux
-
-作者:[Jack Wallen][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://www.linux.com/users/jlwallen
-[b]: https://github.com/lujun9972
-[1]: http://tilda.sourceforge.net/tildadoc.php
-[2]: https://www.linux.com/files/images/terminals2jpg
-[3]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/terminals_2.jpg?itok=gBkRLwDI (Aterm)
-[4]: https://www.linux.com/licenses/category/used-permission
-[5]: https://www.linux.com/blog/learn/2018/12/aliases-diy-shell-commands
-[6]: https://www.linux.com/files/images/terminals3jpg
-[7]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/terminals_3.jpg?itok=RVPTJAtK (Eterm)
-[8]: http://extraterm.org
-[9]: https://www.linux.com/files/images/terminals4jpg
-[10]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/terminals_4.jpg?itok=2n01qdwO (Extraterm)
-[11]: https://github.com/sedwards2009/extraterm/releases
-[12]: https://www.linux.com/files/images/terminals5jpg
-[13]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/terminals_5.jpg?itok=FdaE1Mpf (Extraterm)
-[14]: https://www.linux.com/files/images/terminals6jpg
-[15]: https://www.linux.com/sites/lcom/files/styles/rendered_file/public/terminals_6.jpg?itok=lQ1Zv5wq (frames)
diff --git a/sources/tech/20181216 Schedule a visit with the Emacs psychiatrist.md b/sources/tech/20181216 Schedule a visit with the Emacs psychiatrist.md
deleted file mode 100644
index 6d72cda348..0000000000
--- a/sources/tech/20181216 Schedule a visit with the Emacs psychiatrist.md
+++ /dev/null
@@ -1,62 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Schedule a visit with the Emacs psychiatrist)
-[#]: via: (https://opensource.com/article/18/12/linux-toy-eliza)
-[#]: author: (Jason Baker https://opensource.com/users/jason-baker)
-
-Schedule a visit with the Emacs psychiatrist
-======
-Eliza is a natural language processing chatbot hidden inside of one of Linux's most popular text editors.
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/uploads/linux-toy-eliza.png?itok=3ioiBik_)
-
-Welcome to another day of the 24-day-long Linux command-line toys advent calendar. If this is your first visit to the series, you might be asking yourself what a command-line toy even is. We’re figuring that out as we go, but generally, it could be a game, or any simple diversion that helps you have fun at the terminal.
-
-Some of you will have seen various selections from our calendar before, but we hope there’s at least one new thing for everyone.
-
-Today's selection is a hidden gem inside of Emacs: Eliza, the Rogerian psychotherapist, a terminal toy ready to listen to everything you have to say.
-
-A brief aside: While this toy is amusing, your health is no laughing matter. Please take care of yourself this holiday season, physically and mentally, and if stress and anxiety from the holidays are having a negative impact on your wellbeing, please consider seeing a professional for guidance. It really can help.
-
-To launch [Eliza][1], first, you'll need to launch Emacs. There's a good chance Emacs is already installed on your system, but if it's not, it's almost certainly in your default repositories.
-
-Since I've been pretty fastidious about keeping this series in the terminal, launch Emacs with the **-nw** flag to keep in within your terminal emulator.
-
-```
-$ emacs -nw
-```
-
-Inside of Emacs, type M-x doctor to launch Eliza. For those of you like me from a Vim background who have no idea what this means, just hit escape, type x and then type doctor. Then, share all of your holiday frustrations.
-
-Eliza goes way back, all the way to the mid-1960s a the MIT Artificial Intelligence Lab. [Wikipedia][2] has a rather fascinating look at her history.
-
-Eliza isn't the only amusement inside of Emacs. Check out the [manual][3] for a whole list of fun toys.
-
-
-![Linux toy: eliza animated][5]
-
-Do you have a favorite command-line toy that you think I ought to profile? We're running out of time, but I'd still love to hear your suggestions. Let me know in the comments below, and I'll check it out. And let me know what you thought of today's amusement.
-
-Be sure to check out yesterday's toy, [Head to the arcade in your Linux terminal with this Pac-man clone][6], and come back tomorrow for another!
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/18/12/linux-toy-eliza
-
-作者:[Jason Baker][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/jason-baker
-[b]: https://github.com/lujun9972
-[1]: https://www.emacswiki.org/emacs/EmacsDoctor
-[2]: https://en.wikipedia.org/wiki/ELIZA
-[3]: https://www.gnu.org/software/emacs/manual/html_node/emacs/Amusements.html
-[4]: /file/417326
-[5]: https://opensource.com/sites/default/files/uploads/linux-toy-eliza-animated.gif (Linux toy: eliza animated)
-[6]: https://opensource.com/article/18/12/linux-toy-myman
diff --git a/sources/tech/20181218 Using Pygame to move your game character around.md b/sources/tech/20181218 Using Pygame to move your game character around.md
new file mode 100644
index 0000000000..96daf8da7d
--- /dev/null
+++ b/sources/tech/20181218 Using Pygame to move your game character around.md
@@ -0,0 +1,353 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Using Pygame to move your game character around)
+[#]: via: (https://opensource.com/article/17/12/game-python-moving-player)
+[#]: author: (Seth Kenlon https://opensource.com/users/seth)
+
+Using Pygame to move your game character around
+======
+In the fourth part of this series, learn how to code the controls needed to move a game character.
+![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/python4-game.png?itok=tXFHaLdt)
+
+In the first article in this series, I explained how to use Python to create a simple, [text-based dice game][1]. In the second part, we began building a game from scratch, starting with [creating the game's environment][2]. And, in the third installment, we [created a player sprite][3] and made it spawn in your (rather empty) game world. As you've probably noticed, a game isn't much fun if you can't move your character around. In this article, we'll use Pygame to add keyboard controls so you can direct your character's movement.
+
+There are functions in Pygame to add other kinds of controls, but since you certainly have a keyboard if you're typing out Python code, that's what we'll use. Once you understand keyboard controls, you can explore other options on your own.
+
+You created a key to quit your game in the second article in this series, and the principle is the same for movement. However, getting your character to move is a little more complex.
+
+Let's start with the easy part: setting up the controller keys.
+
+### Setting up keys for controlling your player sprite
+
+Open your Python game script in IDLE, Ninja-IDE, or a text editor.
+
+Since the game must constantly "listen" for keyboard events, you'll be writing code that needs to run continuously. Can you figure out where to put code that needs to run constantly for the duration of the game?
+
+If you answered "in the main loop," you're correct! Remember that unless code is in a loop, it will run (at most) only once—and it may not run at all if it's hidden away in a class or function that never gets used.
+
+To make Python monitor for incoming key presses, add this code to the main loop. There's no code to make anything happen yet, so use `print` statements to signal success. This is a common debugging technique.
+
+```
+while main == True:
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit(); sys.exit()
+ main = False
+
+ if event.type == pygame.KEYDOWN:
+ if event.key == pygame.K_LEFT or event.key == ord('a'):
+ print('left')
+ if event.key == pygame.K_RIGHT or event.key == ord('d'):
+ print('right')
+ if event.key == pygame.K_UP or event.key == ord('w'):
+ print('jump')
+
+ if event.type == pygame.KEYUP:
+ if event.key == pygame.K_LEFT or event.key == ord('a'):
+ print('left stop')
+ if event.key == pygame.K_RIGHT or event.key == ord('d'):
+ print('right stop')
+ if event.key == ord('q'):
+ pygame.quit()
+ sys.exit()
+ main = False
+```
+
+Some people prefer to control player characters with the keyboard characters W, A, S, and D, and others prefer to use arrow keys. Be sure to include both options.
+
+**Note: **It's vital that you consider all of your users when programming. If you write code that works only for you, it's very likely that you'll be the only one who uses your application. More importantly, if you seek out a job writing code for money, you are expected to write code that works for everyone. Giving your users choices, such as the option to use either arrow keys or WASD, is a sign of a good programmer.
+
+Launch your game using Python, and watch the console window for output as you press the right, left, and up arrows, or the A, D, and W keys.
+
+```
+$ python ./your-name_game.py
+ left
+ left stop
+ right
+ right stop
+ jump
+```
+
+This confirms that Pygame detects key presses correctly. Now it's time to do the hard work of making the sprite move.
+
+### Coding the player movement function
+
+To make your sprite move, you must create a property for your sprite that represents movement. When your sprite is not moving, this variable is set to `0`.
+
+If you are animating your sprite, or should you decide to animate it in the future, you also must track frames to enable the walk cycle to stay on track.
+
+Create the variables in the Player class. The first two lines are for context (you already have them in your code, if you've been following along), so add only the last three:
+
+```
+ def __init__(self):
+ pygame.sprite.Sprite.__init__(self)
+ self.movex = 0 # move along X
+ self.movey = 0 # move along Y
+ self.frame = 0 # count frames
+```
+
+With those variables set, it's time to code the sprite's movement.
+
+The player sprite doesn't need to respond to control all the time; sometimes it will not be moving. The code that controls the sprite, therefore, is only one small part of all the things the player sprite will do. When you want to make an object in Python do something independent of the rest of its code, you place your new code in a function. Python functions start with the keyword `def`, which stands for define.
+
+Make a function in your Player class to add some number of pixels to your sprite's position on screen. Don't worry about how many pixels you add yet; that will be decided in later code.
+
+```
+ def control(self,x,y):
+ '''
+ control player movement
+ '''
+ self.movex += x
+ self.movey += y
+```
+
+To move a sprite in Pygame, you have to tell Python to redraw the sprite in its new location—and where that new location is.
+
+Since the Player sprite isn't always moving, the updates need to be only one function within the Player class. Add this function after the `control` function you created earlier.
+
+To make it appear that the sprite is walking (or flying, or whatever it is your sprite is supposed to do), you need to change its position on screen when the appropriate key is pressed. To get it to move across the screen, you redefine its position, designated by the `self.rect.x` and `self.rect.y` properties, to its current position plus whatever amount of `movex` or `movey` is applied. (The number of pixels the move requires is set later.)
+
+```
+ def update(self):
+ '''
+ Update sprite position
+ '''
+ self.rect.x = self.rect.x + self.movex
+```
+
+Do the same thing for the Y position:
+
+```
+ self.rect.y = self.rect.y + self.movey
+```
+
+For animation, advance the animation frames whenever your sprite is moving, and use the corresponding animation frame as the player image:
+
+```
+ # moving left
+ if self.movex < 0:
+ self.frame += 1
+ if self.frame > 3*ani:
+ self.frame = 0
+ self.image = self.images[self.frame//ani]
+
+ # moving right
+ if self.movex > 0:
+ self.frame += 1
+ if self.frame > 3*ani:
+ self.frame = 0
+ self.image = self.images[(self.frame//ani)+4]
+```
+
+Tell the code how many pixels to add to your sprite's position by setting a variable, then use that variable when triggering the functions of your Player sprite.
+
+First, create the variable in your setup section. In this code, the first two lines are for context, so just add the third line to your script:
+
+```
+player_list = pygame.sprite.Group()
+player_list.add(player)
+steps = 10 # how many pixels to move
+```
+
+Now that you have the appropriate function and variable, use your key presses to trigger the function and send the variable to your sprite.
+
+Do this by replacing the `print` statements in your main loop with the Player sprite's name (player), the function (.control), and how many steps along the X axis and Y axis you want the player sprite to move with each loop.
+
+```
+ if event.type == pygame.KEYDOWN:
+ if event.key == pygame.K_LEFT or event.key == ord('a'):
+ player.control(-steps,0)
+ if event.key == pygame.K_RIGHT or event.key == ord('d'):
+ player.control(steps,0)
+ if event.key == pygame.K_UP or event.key == ord('w'):
+ print('jump')
+
+ if event.type == pygame.KEYUP:
+ if event.key == pygame.K_LEFT or event.key == ord('a'):
+ player.control(steps,0)
+ if event.key == pygame.K_RIGHT or event.key == ord('d'):
+ player.control(-steps,0)
+ if event.key == ord('q'):
+ pygame.quit()
+ sys.exit()
+ main = False
+```
+
+Remember, `steps` is a variable representing how many pixels your sprite moves when a key is pressed. If you add 10 pixels to the location of your player sprite when you press D or the right arrow, then when you stop pressing that key you must subtract 10 (`-steps`) to return your sprite's momentum back to 0.
+
+Try your game now. Warning: it won't do what you expect.
+
+Why doesn't your sprite move yet? Because the main loop doesn't call the `update` function.
+
+Add code to your main loop to tell Python to update the position of your player sprite. Add the line with the comment:
+
+```
+ player.update() # update player position
+ player_list.draw(world)
+ pygame.display.flip()
+ clock.tick(fps)
+```
+
+Launch your game again to witness your player sprite move across the screen at your bidding. There's no vertical movement yet because those functions will be controlled by gravity, but that's another lesson for another article.
+
+In the meantime, if you have access to a joystick, try reading Pygame's documentation for its [joystick][4] module and see if you can make your sprite move that way. Alternately, see if you can get the [mouse][5] to interact with your sprite.
+
+Most importantly, have fun!
+
+### All the code used in this tutorial
+
+For your reference, here is all the code used in this series of articles so far.
+
+```
+#!/usr/bin/env python3
+# draw a world
+# add a player and player control
+# add player movement
+
+# GNU All-Permissive License
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved. This file is offered as-is,
+# without any warranty.
+
+import pygame
+import sys
+import os
+
+'''
+Objects
+'''
+
+class Player(pygame.sprite.Sprite):
+ '''
+ Spawn a player
+ '''
+ def __init__(self):
+ pygame.sprite.Sprite.__init__(self)
+ self.movex = 0
+ self.movey = 0
+ self.frame = 0
+ self.images = []
+ for i in range(1,5):
+ img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert()
+ img.convert_alpha()
+ img.set_colorkey(ALPHA)
+ self.images.append(img)
+ self.image = self.images[0]
+ self.rect = self.image.get_rect()
+
+ def control(self,x,y):
+ '''
+ control player movement
+ '''
+ self.movex += x
+ self.movey += y
+
+ def update(self):
+ '''
+ Update sprite position
+ '''
+
+ self.rect.x = self.rect.x + self.movex
+ self.rect.y = self.rect.y + self.movey
+
+ # moving left
+ if self.movex < 0:
+ self.frame += 1
+ if self.frame > 3*ani:
+ self.frame = 0
+ self.image = self.images[self.frame//ani]
+
+ # moving right
+ if self.movex > 0:
+ self.frame += 1
+ if self.frame > 3*ani:
+ self.frame = 0
+ self.image = self.images[(self.frame//ani)+4]
+
+
+'''
+Setup
+'''
+worldx = 960
+worldy = 720
+
+fps = 40 # frame rate
+ani = 4 # animation cycles
+clock = pygame.time.Clock()
+pygame.init()
+main = True
+
+BLUE = (25,25,200)
+BLACK = (23,23,23 )
+WHITE = (254,254,254)
+ALPHA = (0,255,0)
+
+world = pygame.display.set_mode([worldx,worldy])
+backdrop = pygame.image.load(os.path.join('images','stage.png')).convert()
+backdropbox = world.get_rect()
+player = Player() # spawn player
+player.rect.x = 0
+player.rect.y = 0
+player_list = pygame.sprite.Group()
+player_list.add(player)
+steps = 10 # how fast to move
+
+'''
+Main loop
+'''
+while main == True:
+ for event in pygame.event.get():
+ if event.type == pygame.QUIT:
+ pygame.quit(); sys.exit()
+ main = False
+
+ if event.type == pygame.KEYDOWN:
+ if event.key == pygame.K_LEFT or event.key == ord('a'):
+ player.control(-steps,0)
+ if event.key == pygame.K_RIGHT or event.key == ord('d'):
+ player.control(steps,0)
+ if event.key == pygame.K_UP or event.key == ord('w'):
+ print('jump')
+
+ if event.type == pygame.KEYUP:
+ if event.key == pygame.K_LEFT or event.key == ord('a'):
+ player.control(steps,0)
+ if event.key == pygame.K_RIGHT or event.key == ord('d'):
+ player.control(-steps,0)
+ if event.key == ord('q'):
+ pygame.quit()
+ sys.exit()
+ main = False
+
+# world.fill(BLACK)
+ world.blit(backdrop, backdropbox)
+ player.update()
+ player_list.draw(world) #refresh player position
+ pygame.display.flip()
+ clock.tick(fps)
+```
+
+You've come far and learned much, but there's a lot more to do. In the next few articles, you'll add enemy sprites, emulated gravity, and lots more. In the mean time, practice with Python!
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/17/12/game-python-moving-player
+
+作者:[Seth Kenlon][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [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/article/17/10/python-101
+[2]: https://opensource.com/article/17/12/program-game-python-part-2-creating-game-world
+[3]: https://opensource.com/article/17/12/program-game-python-part-3-spawning-player
+[4]: http://pygame.org/docs/ref/joystick.html
+[5]: http://pygame.org/docs/ref/mouse.html#module-pygame.mouse
diff --git a/sources/tech/20181221 Large files with Git- LFS and git-annex.md b/sources/tech/20181221 Large files with Git- LFS and git-annex.md
index 2e7b9a9b74..29a76f810f 100644
--- a/sources/tech/20181221 Large files with Git- LFS and git-annex.md
+++ b/sources/tech/20181221 Large files with Git- LFS and git-annex.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (runningwater)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
@@ -96,7 +96,7 @@ via: https://anarc.at/blog/2018-12-21-large-files-with-git/
作者:[Anarc.at][a]
选题:[lujun9972][b]
-译者:[runningwater](https://github.com/runningwater)
+译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
diff --git a/sources/tech/20181222 How to detect automatically generated emails.md b/sources/tech/20181222 How to detect automatically generated emails.md
index 2ccaeddeee..23b509a77b 100644
--- a/sources/tech/20181222 How to detect automatically generated emails.md
+++ b/sources/tech/20181222 How to detect automatically generated emails.md
@@ -1,5 +1,5 @@
[#]: collector: (lujun9972)
-[#]: translator: (wyxplus)
+[#]: translator: ( )
[#]: reviewer: ( )
[#]: publisher: ( )
[#]: url: ( )
diff --git a/sources/tech/20190103 How to use Magit to manage Git projects.md b/sources/tech/20190103 How to use Magit to manage Git projects.md
deleted file mode 100644
index dbcb63d736..0000000000
--- a/sources/tech/20190103 How to use Magit to manage Git projects.md
+++ /dev/null
@@ -1,93 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (How to use Magit to manage Git projects)
-[#]: via: (https://opensource.com/article/19/1/how-use-magit)
-[#]: author: (Sachin Patil https://opensource.com/users/psachin)
-
-How to use Magit to manage Git projects
-======
-Emacs' Magit extension makes it easy to get started with Git version control.
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003588_01_rd3os.combacktoschoolseriesk12_rh_021x_0.png?itok=fvorN0e-)
-
-[Git][1] is an excellent [version control][2] tool for managing projects, but it can be hard for novices to learn. It's difficult to work from the Git command line unless you're familiar with the flags and options and the appropriate situations to use them. This can be discouraging and cause people to be stuck with very limited usage.
-
-Fortunately, most of today's integrated development environments (IDEs) include Git extensions that make using it a lot easier. One such Git extension available in Emacs is called [Magit][3].
-
-The Magit project has been around for 10 years and defines itself as "a Git porcelain inside Emacs." In other words, it's an interface where every action can be managed by pressing a key. This article walks you through the Magit interface and explains how to use it to manage a Git project.
-
-If you haven't already, [install Emacs][4], then [install Magit][5] before you continue with this tutorial.
-
-### Magit's interface
-
-Start by visiting a project directory in Emacs' [Dired mode][6]. For example, all my Emacs configurations are stored in the **~/.emacs.d/** directory, which is managed by Git.
-
-![](https://opensource.com/sites/default/files/uploads/visiting_a_git_project.png)
-
-If you were working from the command line, you would enter **git status** to find a project's current status. Magit has a similar function: **magit-status**. You can call this function using **M-x magit-status** (short for the keystroke **Alt+x magit-status** ). Your result will look something like this:
-
-![](https://opensource.com/sites/default/files/uploads/magit_status.png)
-
-Magit shows much more information than you would get from the **git status** command. It shows a list of untracked files, files that aren't staged, and staged files. It also shows the stash list and the most recent commits—all in a single window.
-
-If you want to know what has changed, use the Tab key. For example, if I move my cursor over the unstaged file **custom_functions.org** and press the Tab key, Magit will display the changes:
-
-![](https://opensource.com/sites/default/files/uploads/show_unstaged_content.png)
-
-This is similar to using the command **git diff custom_functions.org**. Staging a file is even easier. Simply move the cursor over a file and press the **s** key. The file will be quickly moved to the staged file list:
-
-![](https://opensource.com/sites/default/files/uploads/staging_a_file.png)
-
-To unstage a file, use the **u** key. It is quicker and more fun to use **s** and **u** instead of entering **git add -u ** and **git reset HEAD ** on the command line.
-
-### Commit changes
-
-In the same Magit window, pressing the **c** key will display a commit window that provides flags like **\--all** to stage all files or **\--signoff** to add a signoff line to a commit message.
-
-![](https://opensource.com/sites/default/files/uploads/magit_commit_popup.png)
-
-Move your cursor to the line where you want to enable a signoff flag and press Enter. This will highlight the **\--signoff** text, which indicates that the flag is enabled.
-
-![](https://opensource.com/sites/default/files/uploads/magit_signoff_commit.png)
-
-Pressing **c** again will display the window to write the commit message.
-
-![](https://opensource.com/sites/default/files/uploads/magit_commit_message.png)
-
-Finally, use **C-c C-c **(short form of the keys Ctrl+cc) to commit the changes.
-
-![](https://opensource.com/sites/default/files/uploads/magit_commit_message_2.png)
-
-### Push changes
-
-Once the changes are committed, the commit line will appear in the **Recent commits** section.
-
-![](https://opensource.com/sites/default/files/uploads/magit_commit_log.png)
-
-Place the cursor on that commit and press **p** to push the changes.
-
-I've uploaded a [demonstration][7] on YouTube if you want to get a feel for using Magit. I have just scratched the surface in this article. It has many cool features to help you with Git branches, rebasing, and more. You can find [documentation, support, and more][8] linked from Magit's homepage.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/19/1/how-use-magit
-
-作者:[Sachin Patil][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]: https://opensource.com/users/psachin
-[b]: https://github.com/lujun9972
-[1]: https://git-scm.com
-[2]: https://git-scm.com/book/en/v2/Getting-Started-About-Version-Control
-[3]: https://magit.vc
-[4]: https://www.gnu.org/software/emacs/download.html
-[5]: https://magit.vc/manual/magit/Installing-from-Melpa.html#Installing-from-Melpa
-[6]: https://www.gnu.org/software/emacs/manual/html_node/emacs/Dired-Enter.html#Dired-Enter
-[7]: https://youtu.be/Vvw75Pqp7Mc
-[8]: https://magit.vc/
diff --git a/sources/tech/20190104 Midori- A Lightweight Open Source Web Browser.md b/sources/tech/20190104 Midori- A Lightweight Open Source Web Browser.md
deleted file mode 100644
index a2e31daf6c..0000000000
--- a/sources/tech/20190104 Midori- A Lightweight Open Source Web Browser.md
+++ /dev/null
@@ -1,110 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (Midori: A Lightweight Open Source Web Browser)
-[#]: via: (https://itsfoss.com/midori-browser)
-[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
-
-Midori: A Lightweight Open Source Web Browser
-======
-
-**Here’s a quick review of the lightweight, fast, open source web browser Midori, which has returned from the dead.**
-
-If you are looking for a lightweight [alternative web browser][1], try Midori.
-
-[Midori][2] is an open source web browser that focuses more on being lightweight than on providing a ton of features.
-
-If you have never heard of Midori, you might think that it is a new application but Midori was first released in 2007.
-
-Because it focused on speed, Midori soon gathered a niche following and became the default browser in lightweight Linux distributions like Bodhi Linux, SilTaz etc.
-
-Other distributions like [elementary OS][3] also used Midori as its default browser. But the development of Midori stalled around 2016 and its fans started wondering if Midori was dead already. elementary OS dropped it from its latest release, I believe, for this reason.
-
-The good news is that Midori is not dead. After almost two years of inactivity, the development resumed in the last quarter of 2018. A few extensions including an ad-blocker were added in the later releases.
-
-### Features of Midori web browser
-
-![Midori web browser][4]
-
-Here are some of the main features of the Midori browser
-
- * Written in Vala with GTK+3 and WebKit rendering engine.
- * Tabs, windows and session management
- * Speed dial
- * Saves tab for the next session by default
- * Uses DuckDuckGo as a default search engine. It can be changed to Google or Yahoo.
- * Bookmark management
- * Customizable and extensible interface
- * Extension modules can be written in C and Vala
- * Supports HTML5
- * An extremely limited set of extensions include an ad-blocker, colorful tabs etc. No third-party extensions.
- * Form history
- * Private browsing
- * Available for Linux and Windows
-
-
-
-Trivia: Midori is a Japanese word that means green. The Midori developer is not Japanese if you were guessing something along that line.
-
-### Experiencing Midori
-
-![Midori web browser in Ubuntu 18.04][5]
-
-I have been using Midori for the past few days. The experience is mostly fine. It supports HTML5 and renders the websites quickly. The ad-blocker is okay. The browsing experience is more or less smooth as you would expect in any standard web browser.
-
-The lack of extensions has always been a weak point of Midori so I am not going to talk about that.
-
-What I did notice is that it doesn’t support international languages. I couldn’t find a way to add new language support. It could not render the Hindi fonts at all and I am guessing it’s the same with many other non-[Romance languages][6].
-
-I also had my fair share of troubles with YouTube videos. Some videos would throw playback error while others would run just fine.
-
-Midori didn’t eat my RAM like Chrome so that’s a big plus here.
-
-If you want to try out Midori, let’s see how can you get your hands on it.
-
-### Install Midori on Linux
-
-Midori is no longer available in the Ubuntu 18.04 repository. However, the newer versions of Midori can be easily installed using the [Snap packages][7].
-
-If you are using Ubuntu, you can find Midori (Snap version) in the Software Center and install it from there.
-
-![Midori browser is available in Ubuntu Software Center][8]Midori browser is available in Ubuntu Software Center
-
-For other Linux distributions, make sure that you have [Snap support enabled][9] and then you can install Midori using the command below:
-
-```
-sudo snap install midori
-```
-
-You always have the option to compile from the source code. You can download the source code of Midori from its website.
-
-If you like Midori and want to help this open source project, please donate to them or [buy Midori merchandise from their shop][10].
-
-Do you use Midori or have you ever tried it? How’s your experience with it? What other web browser do you prefer to use? Please share your views in the comment section below.
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/midori-browser
-
-作者:[Abhishek Prakash][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [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/open-source-browsers-linux/
-[2]: https://www.midori-browser.org/
-[3]: https://itsfoss.com/elementary-os-juno-features/
-[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/Midori-web-browser.jpeg?resize=800%2C450&ssl=1
-[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2019/01/midori-browser-linux.jpeg?resize=800%2C491&ssl=1
-[6]: https://en.wikipedia.org/wiki/Romance_languages
-[7]: https://itsfoss.com/use-snap-packages-ubuntu-16-04/
-[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/midori-ubuntu-software-center.jpeg?ssl=1
-[9]: https://itsfoss.com/install-snap-linux/
-[10]: https://www.midori-browser.org/shop
-[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/01/Midori-web-browser.jpeg?fit=800%2C450&ssl=1
diff --git a/sources/tech/20190104 Three Ways To Reset And Change Forgotten Root Password on RHEL 7-CentOS 7 Systems.md b/sources/tech/20190104 Three Ways To Reset And Change Forgotten Root Password on RHEL 7-CentOS 7 Systems.md
new file mode 100644
index 0000000000..6619cfe65a
--- /dev/null
+++ b/sources/tech/20190104 Three Ways To Reset And Change Forgotten Root Password on RHEL 7-CentOS 7 Systems.md
@@ -0,0 +1,254 @@
+[#]: collector: (lujun9972)
+[#]: translator: ( )
+[#]: reviewer: ( )
+[#]: publisher: ( )
+[#]: url: ( )
+[#]: subject: (Three Ways To Reset And Change Forgotten Root Password on RHEL 7/CentOS 7 Systems)
+[#]: via: (https://www.2daygeek.com/linux-reset-change-forgotten-root-password-in-rhel-7-centos-7/)
+[#]: author: (Prakash Subramanian https://www.2daygeek.com/author/prakash/)
+
+Three Ways To Reset And Change Forgotten Root Password on RHEL 7/CentOS 7 Systems
+======
+
+If you are forget to remember your root password for RHEL 7 and CentOS 7 systems and want to reset the forgotten root password?
+
+If so, don’t worry we are here to help you out on this.
+
+Navigate to the following link if you want to **[reset forgotten root password on RHEL 6/CentOS 6][1]**.
+
+This is generally happens when you use different password in vast environment or if you are not maintaining the proper inventory.
+
+Whatever it is. No issues, we will help you through this article.
+
+It can be done in many ways but we are going to show you the best three methods which we tried many times for our clients.
+
+In Linux servers there are three different users are available. These are, Normal User, System User and Super User.
+
+As everyone knows the Root user is known as super user in Linux and Administrator is in Windows.
+
+We can’t perform any major activity without root password so, make sure you should have the right root password when you perform any major tasks.
+
+If you don’t know or don’t have it, try to reset using one of the below method.
+
+ * Reset Forgotten Root Password By Booting into Single User Mode using `rd.break`
+ * Reset Forgotten Root Password By Booting into Single User Mode using `init=/bin/bash`
+ * Reset Forgotten Root Password By Booting into Rescue Mode
+
+
+
+### Method-1: Reset Forgotten Root Password By Booting into Single User Mode
+
+Just follow the below procedure to reset the forgotten root password in RHEL 7/CentOS 7 systems.
+
+To do so, reboot your system and follow the instructions carefully.
+
+**`Step-1:`** Reboot your system and interrupt at the boot menu by hitting **`e`** key to modify the kernel arguments.
+![][3]
+
+**`Step-2:`** In the GRUB options, find `linux16` word and add the `rd.break` word in the end of the file then press `Ctrl+x` or `F10` to boot into single user mode.
+![][4]
+
+**`Step-3:`** At this point of time, your root filesystem will be mounted in Read only (RO) mode to /sysroot. Run the below command to confirm this.
+
+```
+# mount | grep root
+```
+
+![][5]
+
+**`Step-4:`** Based on the above output, i can say that i’m in single user mode and my root file system is mounted in read only mode.
+
+It won’t allow you to make any changes on your system until you mount the root filesystem with Read and write (RW) mode to /sysroot. To do so, use the following command.
+
+```
+# mount -o remount,rw /sysroot
+```
+
+![][6]
+
+**`Step-5:`** Currently your file systems are mounted as a temporary partition. Now, your command prompt shows **switch_root:/#**.
+
+Run the following command to get into a chroot jail so that /sysroot is used as the root of the file system.
+
+```
+# chroot /sysroot
+```
+
+![][7]
+
+**`Step-6:`** Now you can able to reset the root password with help of `passwd` command.
+
+```
+# echo "CentOS7$#123" | passwd --stdin root
+```
+
+![][8]
+
+**`Step-7:`** By default CentOS 7/RHEL 7 use SELinux in enforcing mode, so create a following hidden file which will automatically perform a relabel of all files on next boot.
+
+It allow us to fix the context of the **/etc/shadow** file.
+
+```
+# touch /.autorelabel
+```
+
+![][9]
+
+**`Step-8:`** Issue `exit` twice to exit from the chroot jail environment and reboot the system.
+![][10]
+
+**`Step-9:`** Now you can login to your system with your new password.
+![][11]
+
+### Method-2: Reset Forgotten Root Password By Booting into Single User Mode
+
+Alternatively we can use the below procedure to reset the forgotten root password in RHEL 7/CentOS 7 systems.
+
+**`Step-1:`** Reboot your system and interrupt at the boot menu by hitting **`e`** key to modify the kernel arguments.
+![][3]
+
+**`Step-2:`** In the GRUB options, find `rhgb quiet` word and replace with the `init=/bin/bash` or `init=/bin/sh` word then press `Ctrl+x` or `F10` to boot into single user mode.
+
+Screenshot for **`init=/bin/bash`**.
+![][12]
+
+Screenshot for **`init=/bin/sh`**.
+![][13]
+
+**`Step-3:`** At this point of time, your root system will be mounted in Read only mode to /. Run the below command to confirm this.
+
+```
+# mount | grep root
+```
+
+![][14]
+
+**`Step-4:`** Based on the above ouput, i can say that i’m in single user mode and my root file system is mounted in read only (RO) mode.
+
+It won’t allow you to make any changes on your system until you mount the root file system with Read and write (RW) mode. To do so, use the following command.
+
+```
+# mount -o remount,rw /
+```
+
+![][15]
+
+**`Step-5:`** Now you can able to reset the root password with help of `passwd` command.
+
+```
+# echo "RHEL7$#123" | passwd --stdin root
+```
+
+![][16]
+
+**`Step-6:`** By default CentOS 7/RHEL 7 use SELinux in enforcing mode, so create a following hidden file which will automatically perform a relabel of all files on next boot.
+
+It allow us to fix the context of the **/etc/shadow** file.
+
+```
+# touch /.autorelabel
+```
+
+![][17]
+
+**`Step-7:`** Finally `Reboot` the system.
+
+```
+# exec /sbin/init 6
+```
+
+![][18]
+
+**`Step-9:`** Now you can login to your system with your new password.
+![][11]
+
+### Method-3: Reset Forgotten Root Password By Booting into Rescue Mode
+
+Alternatively, we can reset the forgotten Root password for RHEL 7 and CentOS 7 systems using Rescue mode.
+
+**`Step-1:`** Insert the bootable media through USB or DVD drive which is compatible for you and reboot your system. It will take to you to the below screen.
+
+Hit `Troubleshooting` to launch the `Rescue` mode.
+![][19]
+
+**`Step-2:`** Choose `Rescue a CentOS system` and hit `Enter` button.
+![][20]
+
+**`Step-3:`** Here choose `1` and the rescue environment will now attempt to find your Linux installation and mount it under the directory `/mnt/sysimage`.
+![][21]
+
+**`Step-4:`** Simple hit `Enter` to get a shell.
+![][22]
+
+**`Step-5:`** Run the following command to get into a chroot jail so that /mnt/sysimage is used as the root of the file system.
+
+```
+# chroot /mnt/sysimage
+```
+
+![][23]
+
+**`Step-6:`** Now you can able to reset the root password with help of **passwd** command.
+
+```
+# echo "RHEL7$#123" | passwd --stdin root
+```
+
+![][24]
+
+**`Step-7:`** By default CentOS 7/RHEL 7 use SELinux in enforcing mode, so create a following hidden file which will automatically perform a relabel of all files on next boot.
+It allow us to fix the context of the /etc/shadow file.
+
+```
+# touch /.autorelabel
+```
+
+![][25]
+
+**`Step-8:`** Remove the bootable media then initiate the reboot.
+
+**`Step-9:`** Issue `exit` twice to exit from the chroot jail environment and reboot the system.
+![][26]
+
+**`Step-10:`** Now you can login to your system with your new password.
+![][11]
+
+--------------------------------------------------------------------------------
+
+via: https://www.2daygeek.com/linux-reset-change-forgotten-root-password-in-rhel-7-centos-7/
+
+作者:[Prakash Subramanian][a]
+选题:[lujun9972][b]
+译者:[译者ID](https://github.com/译者ID)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]: https://www.2daygeek.com/author/prakash/
+[b]: https://github.com/lujun9972
+[1]: https://www.2daygeek.com/linux-reset-change-forgotten-root-password-in-rhel-6-centos-6/
+[2]: data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
+[3]: https://www.2daygeek.com/wp-content/uploads/2018/12/reset-forgotten-root-password-on-rhel-7-centos-7-2.png
+[4]: https://www.2daygeek.com/wp-content/uploads/2018/12/reset-forgotten-root-password-on-rhel-7-centos-7-3.png
+[5]: https://www.2daygeek.com/wp-content/uploads/2018/12/reset-forgotten-root-password-on-rhel-7-centos-7-5.png
+[6]: https://www.2daygeek.com/wp-content/uploads/2018/12/reset-forgotten-root-password-on-rhel-7-centos-7-6.png
+[7]: https://www.2daygeek.com/wp-content/uploads/2018/12/reset-forgotten-root-password-on-rhel-7-centos-7-8.png
+[8]: https://www.2daygeek.com/wp-content/uploads/2018/12/reset-forgotten-root-password-on-rhel-7-centos-7-10.png
+[9]: https://www.2daygeek.com/wp-content/uploads/2018/12/reset-forgotten-root-password-on-rhel-7-centos-7-10a.png
+[10]: https://www.2daygeek.com/wp-content/uploads/2018/12/reset-forgotten-root-password-on-rhel-7-centos-7-11.png
+[11]: https://www.2daygeek.com/wp-content/uploads/2018/12/reset-forgotten-root-password-on-rhel-7-centos-7-12.png
+[12]: https://www.2daygeek.com/wp-content/uploads/2018/12/method-reset-forgotten-root-password-on-rhel-7-centos-7-1.png
+[13]: https://www.2daygeek.com/wp-content/uploads/2018/12/method-reset-forgotten-root-password-on-rhel-7-centos-7-1a.png
+[14]: https://www.2daygeek.com/wp-content/uploads/2018/12/method-reset-forgotten-root-password-on-rhel-7-centos-7-3.png
+[15]: https://www.2daygeek.com/wp-content/uploads/2018/12/method-reset-forgotten-root-password-on-rhel-7-centos-7-4.png
+[16]: https://www.2daygeek.com/wp-content/uploads/2018/12/method-reset-forgotten-root-password-on-rhel-7-centos-7-5.png
+[17]: https://www.2daygeek.com/wp-content/uploads/2018/12/method-reset-forgotten-root-password-on-rhel-7-centos-7-6.png
+[18]: https://www.2daygeek.com/wp-content/uploads/2018/12/method-reset-forgotten-root-password-on-rhel-7-centos-7-7.png
+[19]: https://www.2daygeek.com/wp-content/uploads/2018/12/rescue-reset-forgotten-root-password-on-rhel-7-centos-7-1.png
+[20]: https://www.2daygeek.com/wp-content/uploads/2018/12/rescue-reset-forgotten-root-password-on-rhel-7-centos-7-2.png
+[21]: https://www.2daygeek.com/wp-content/uploads/2018/12/rescue-reset-forgotten-root-password-on-rhel-7-centos-7-3.png
+[22]: https://www.2daygeek.com/wp-content/uploads/2018/12/rescue-reset-forgotten-root-password-on-rhel-7-centos-7-4.png
+[23]: https://www.2daygeek.com/wp-content/uploads/2018/12/rescue-reset-forgotten-root-password-on-rhel-7-centos-7-5.png
+[24]: https://www.2daygeek.com/wp-content/uploads/2018/12/rescue-reset-forgotten-root-password-on-rhel-7-centos-7-6.png
+[25]: https://www.2daygeek.com/wp-content/uploads/2018/12/rescue-reset-forgotten-root-password-on-rhel-7-centos-7-7.png
+[26]: https://www.2daygeek.com/wp-content/uploads/2018/12/rescue-reset-forgotten-root-password-on-rhel-7-centos-7-8.png
diff --git a/sources/tech/20190108 How ASLR protects Linux systems from buffer overflow attacks.md b/sources/tech/20190108 How ASLR protects Linux systems from buffer overflow attacks.md
deleted file mode 100644
index 41d4e47acc..0000000000
--- a/sources/tech/20190108 How ASLR protects Linux systems from buffer overflow attacks.md
+++ /dev/null
@@ -1,133 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: ( )
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (How ASLR protects Linux systems from buffer overflow attacks)
-[#]: via: (https://www.networkworld.com/article/3331199/linux/what-does-aslr-do-for-linux.html)
-[#]: author: (Sandra Henry-Stocker https://www.networkworld.com/author/Sandra-Henry_Stocker/)
-
-How ASLR protects Linux systems from buffer overflow attacks
-======
-
-![](https://images.idgesg.net/images/article/2019/01/shuffling-cards-100784640-large.jpg)
-
-Address Space Layout Randomization (ASLR) is a memory-protection process for operating systems that guards against buffer-overflow attacks. It helps to ensure that the memory addresses associated with running processes on systems are not predictable, thus flaws or vulnerabilities associated with these processes will be more difficult to exploit.
-
-ASLR is used today on Linux, Windows, and MacOS systems. It was first implemented on Linux in 2005. In 2007, the technique was deployed on Microsoft Windows and MacOS. While ASLR provides the same function on each of these operating systems, it is implemented differently on each one.
-
-The effectiveness of ASLR is dependent on the entirety of the address space layout remaining unknown to the attacker. In addition, only executables that are compiled as Position Independent Executable (PIE) programs will be able to claim the maximum protection from ASLR technique because all sections of the code will be loaded at random locations. PIE machine code will execute properly regardless of its absolute address.
-
-**[ Also see:[Invaluable tips and tricks for troubleshooting Linux][1] ]**
-
-### ASLR limitations
-
-In spite of ASLR making exploitation of system vulnerabilities more difficult, its role in protecting systems is limited. It's important to understand that ASLR:
-
- * Doesn't _resolve_ vulnerabilities, but makes exploiting them more of a challenge
- * Doesn't track or report vulnerabilities
- * Doesn't offer any protection for binaries that are not built with ASLR support
- * Isn't immune to circumvention
-
-
-
-### How ASLR works
-
-ASLR increases the control-flow integrity of a system by making it more difficult for an attacker to execute a successful buffer-overflow attack by randomizing the offsets it uses in memory layouts.
-
-ASLR works considerably better on 64-bit systems, as these systems provide much greater entropy (randomization potential).
-
-### Is ASLR working on your Linux system?
-
-Either of the two commands shown below will tell you whether ASLR is enabled on your system.
-
-```
-$ cat /proc/sys/kernel/randomize_va_space
-2
-$ sysctl -a --pattern randomize
-kernel.randomize_va_space = 2
-```
-
-The value (2) shown in the commands above indicates that ASLR is working in full randomization mode. The value shown will be one of the following:
-
-```
-0 = Disabled
-1 = Conservative Randomization
-2 = Full Randomization
-```
-
-If you disable ASLR and run the commands below, you should notice that the addresses shown in the **ldd** output below are all the same in the successive **ldd** commands. The **ldd** command works by loading the shared objects and showing where they end up in memory.
-
-```
-$ sudo sysctl -w kernel.randomize_va_space=0 <== disable
-[sudo] password for shs:
-kernel.randomize_va_space = 0
-$ ldd /bin/bash
- linux-vdso.so.1 (0x00007ffff7fd1000) <== same addresses
- libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007ffff7c69000)
- libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ffff7c63000)
- libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7a79000)
- /lib64/ld-linux-x86-64.so.2 (0x00007ffff7fd3000)
-$ ldd /bin/bash
- linux-vdso.so.1 (0x00007ffff7fd1000) <== same addresses
- libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007ffff7c69000)
- libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ffff7c63000)
- libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ffff7a79000)
- /lib64/ld-linux-x86-64.so.2 (0x00007ffff7fd3000)
-```
-
-If the value is set back to **2** to enable ASLR, you will see that the addresses will change each time you run the command.
-
-```
-$ sudo sysctl -w kernel.randomize_va_space=2 <== enable
-[sudo] password for shs:
-kernel.randomize_va_space = 2
-$ ldd /bin/bash
- linux-vdso.so.1 (0x00007fff47d0e000) <== first set of addresses
- libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f1cb7ce0000)
- libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f1cb7cda000)
- libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1cb7af0000)
- /lib64/ld-linux-x86-64.so.2 (0x00007f1cb8045000)
-$ ldd /bin/bash
- linux-vdso.so.1 (0x00007ffe1cbd7000) <== second set of addresses
- libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007fed59742000)
- libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fed5973c000)
- libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fed59552000)
- /lib64/ld-linux-x86-64.so.2 (0x00007fed59aa7000)
-```
-
-### Attempting to bypass ASLR
-
-In spite of its advantages, attempts to bypass ASLR are not uncommon and seem to fall into several categories:
-
- * Using address leaks
- * Gaining access to data relative to particular addresses
- * Exploiting implementation weaknesses that allow attackers to guess addresses when entropy is low or when the ASLR implementation is faulty
- * Using side channels of hardware operation
-
-
-
-### Wrap-up
-
-ASLR is of great value, especially when run on 64 bit systems and implemented properly. While not immune from circumvention attempts, it does make exploitation of system vulnerabilities considerably more difficult. Here is a reference that can provide a lot more detail [on the Effectiveness of Full-ASLR on 64-bit Linux][2], and here is a paper on one circumvention effort to [bypass ASLR][3] using branch predictors.
-
-Join the Network World communities on [Facebook][4] and [LinkedIn][5] to comment on topics that are top of mind.
-
---------------------------------------------------------------------------------
-
-via: https://www.networkworld.com/article/3331199/linux/what-does-aslr-do-for-linux.html
-
-作者:[Sandra Henry-Stocker][a]
-选题:[lujun9972][b]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [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/3242170/linux/invaluable-tips-and-tricks-for-troubleshooting-linux.html
-[2]: https://cybersecurity.upv.es/attacks/offset2lib/offset2lib-paper.pdf
-[3]: http://www.cs.ucr.edu/~nael/pubs/micro16.pdf
-[4]: https://www.facebook.com/NetworkWorld/
-[5]: https://www.linkedin.com/company/network-world
diff --git a/sources/tech/20190110 5 useful Vim plugins for developers.md b/sources/tech/20190110 5 useful Vim plugins for developers.md
deleted file mode 100644
index 2b5b9421d4..0000000000
--- a/sources/tech/20190110 5 useful Vim plugins for developers.md
+++ /dev/null
@@ -1,369 +0,0 @@
-[#]: collector: (lujun9972)
-[#]: translator: (pityonline)
-[#]: reviewer: ( )
-[#]: publisher: ( )
-[#]: url: ( )
-[#]: subject: (5 useful Vim plugins for developers)
-[#]: via: (https://opensource.com/article/19/1/vim-plugins-developers)
-[#]: author: (Ricardo Gerardi https://opensource.com/users/rgerardi)
-
-5 useful Vim plugins for developers
-======
-Expand Vim's capabilities and improve your workflow with these five plugins for writing code.
-![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/web_browser_desktop_devlopment_design_system_computer.jpg?itok=pfqRrJgh)
-
-I have used [Vim][1] as a text editor for over 20 years, but about two years ago I decided to make it my primary text editor. I use Vim to write code, configuration files, blog articles, and pretty much everything I can do in plaintext. Vim has many great features and, once you get used to it, you become very productive.
-
-I tend to use Vim's robust native capabilities for most of what I do, but there are a number of plugins developed by the open source community that extend Vim's capabilities, improve your workflow, and make you even more productive.
-
-Following are five plugins that are useful when using Vim to write code in any programming language.
-
-### 1. Auto Pairs
-
-The [Auto Pairs][2] plugin helps insert and delete pairs of characters, such as brackets, parentheses, or quotation marks. This is very useful for writing code, since most programming languages use pairs of characters in their syntax—such as parentheses for function calls or quotation marks for string definitions.
-
-In its most basic functionality, Auto Pairs inserts the corresponding closing character when you type an opening character. For example, if you enter a bracket **[** , Auto-Pairs automatically inserts the closing bracket **]**. Conversely, if you use the Backspace key to delete the opening bracket, Auto Pairs deletes the corresponding closing bracket.
-
-If you have automatic indentation on, Auto Pairs inserts the paired character in the proper indented position when you press Return/Enter, saving you from finding the correct position and typing the required spaces or tabs.
-
-Consider this Go code block for instance:
-
-```
-package main
-
-import "fmt"
-
-func main() {
- x := true
- items := []string{"tv", "pc", "tablet"}
-
- if x {
- for _, i := range items
- }
-}
-```
-
-Inserting an opening curly brace **{** after **items** and pressing Return/Enter produces this result:
-
-```
-package main
-
-import "fmt"
-
-func main() {
- x := true
- items := []string{"tv", "pc", "tablet"}
-
- if x {
- for _, i := range items {
- | (cursor here)
- }
- }
-}
-```
-
-Auto Pairs offers many other options (which you can read about on [GitHub][3]), but even these basic features will save time.
-
-### 2. NERD Commenter
-
-The [NERD Commenter][4] plugin adds code-commenting functions to Vim, similar to the ones found in an integrated development environment (IDE). With this plugin installed, you can select one or several lines of code and change them to comments with the press of a button.
-
-NERD Commenter integrates with the standard Vim [filetype][5] plugin, so it understands several programming languages and uses the appropriate commenting characters for single or multi-line comments.
-
-The easiest way to get started is by pressing **Leader+Space** to toggle the current line between commented and uncommented. The standard Vim Leader key is the **\** character.
-
-In Visual mode, you can select multiple lines and toggle their status at the same time. NERD Commenter also understands counts, so you can provide a count n followed by the command to change n lines together.
-
-Other useful features are the "Sexy Comment," triggered by **Leader+cs** , which creates a fancy comment block using the multi-line comment character. For example, consider this block of code:
-
-```
-package main
-
-import "fmt"
-
-func main() {
- x := true
- items := []string{"tv", "pc", "tablet"}
-
- if x {
- for _, i := range items {
- fmt.Println(i)
- }
- }
-}
-```
-
-Selecting all the lines in **function main** and pressing **Leader+cs** results in the following comment block:
-
-```
-package main
-
-import "fmt"
-
-func main() {
-/*
- * x := true
- * items := []string{"tv", "pc", "tablet"}
- *
- * if x {
- * for _, i := range items {
- * fmt.Println(i)
- * }
- * }
- */
-}
-```
-
-Since all the lines are commented in one block, you can uncomment the entire block by toggling any of the lines of the block with **Leader+Space**.
-
-NERD Commenter is a must-have for any developer using Vim to write code.
-
-### 3. VIM Surround
-
-The [Vim Surround][6] plugin helps you "surround" existing text with pairs of characters (such as parentheses or quotation marks) or tags (such as HTML or XML tags). It's similar to Auto Pairs but, instead of working while you're inserting text, it's more useful when you're editing text.
-
-For example, if you have the following sentence:
-
-```
-"Vim plugins are awesome !"
-```
-
-You can remove the quotation marks around the sentence by pressing the combination **ds"** while your cursor is anywhere between the quotation marks:
-
-```
-Vim plugins are awesome !
-```
-
-You can also change the double quotation marks to single quotation marks with the command **cs"'** :
-
-```
-'Vim plugins are awesome !'
-```
-
-Or replace them with brackets by pressing **cs'[**
-
-```
-[ Vim plugins are awesome ! ]
-```
-
-While it's a great help for text objects, this plugin really shines when working with HTML or XML tags. Consider the following HTML line:
-
-```
-
Vim plugins are awesome !
-```
-
-You can emphasize the word "awesome" by pressing the combination **ysiw ** while the cursor is anywhere on that word:
-
-```
-
Vim plugins are awesome !
-```
-
-Notice that the plugin is smart enough to use the proper closing tag **< /em>**.
-
-Vim Surround can also indent text and add tags in their own lines using **ySS**. For example, if you have:
-
-```
-
Vim plugins are awesome !
-```
-
-Add a **div** tag with this combination: **ySS
**, and notice that the paragraph line is indented automatically.
-
-```
-