diff --git a/translated/tech/20170215 How to take screenshots on Linux using Scrot.md b/published/20170215 How to take screenshots on Linux using Scrot.md
similarity index 100%
rename from translated/tech/20170215 How to take screenshots on Linux using Scrot.md
rename to published/20170215 How to take screenshots on Linux using Scrot.md
diff --git a/translated/tech/20170910 Cool vim feature sessions.md b/published/20170910 Cool vim feature sessions.md
similarity index 100%
rename from translated/tech/20170910 Cool vim feature sessions.md
rename to published/20170910 Cool vim feature sessions.md
diff --git a/translated/tech/20171006 Concurrent Servers Part 3 - Event-driven.md b/published/20171006 Concurrent Servers Part 3 - Event-driven.md
similarity index 77%
rename from translated/tech/20171006 Concurrent Servers Part 3 - Event-driven.md
rename to published/20171006 Concurrent Servers Part 3 - Event-driven.md
index 01c1d74112..1c0a0a329f 100644
--- a/translated/tech/20171006 Concurrent Servers Part 3 - Event-driven.md
+++ b/published/20171006 Concurrent Servers Part 3 - Event-driven.md
@@ -1,9 +1,9 @@
-并发服务器(3) —— 事件驱动
+并发服务器(三):事件驱动
============================================================
-这是《并发服务器》系列的第三节。[第一节][26] 介绍了阻塞式编程,[第二节 —— 线程][27] 探讨了多线程,将其作为一种可行的方法来实现服务器并发编程。
+这是并发服务器系列的第三节。[第一节][26] 介绍了阻塞式编程,[第二节:线程][27] 探讨了多线程,将其作为一种可行的方法来实现服务器并发编程。
-另一种常见的实现并发的方法叫做 _事件驱动编程_,也可以叫做 _异步_ 编程 [^注1][28]。这种方法变化万千,因此我们会从最基本的开始,使用一些基本的 APIs 而非从封装好的高级方法开始。本系列以后的文章会讲高层次抽象,还有各种混合的方法。
+另一种常见的实现并发的方法叫做 _事件驱动编程_,也可以叫做 _异步_ 编程 ^注1 。这种方法变化万千,因此我们会从最基本的开始,使用一些基本的 API 而非从封装好的高级方法开始。本系列以后的文章会讲高层次抽象,还有各种混合的方法。
本系列的所有文章:
@@ -13,13 +13,13 @@
### 阻塞式 vs. 非阻塞式 I/O
-要介绍这个标题,我们先讲讲阻塞和非阻塞 I/O 的区别。阻塞式 I/O 更好理解,因为这是我们使用 I/O 相关 API 时的“标准”方式。从套接字接收数据的时候,调用 `recv` 函数会发生 _阻塞_,直到它从端口上接收到了来自另一端套接字的数据。这恰恰是第一部分讲到的顺序服务器的问题。
+作为本篇的介绍,我们先讲讲阻塞和非阻塞 I/O 的区别。阻塞式 I/O 更好理解,因为这是我们使用 I/O 相关 API 时的“标准”方式。从套接字接收数据的时候,调用 `recv` 函数会发生 _阻塞_,直到它从端口上接收到了来自另一端套接字的数据。这恰恰是第一部分讲到的顺序服务器的问题。
因此阻塞式 I/O 存在着固有的性能问题。第二节里我们讲过一种解决方法,就是用多线程。哪怕一个线程的 I/O 阻塞了,别的线程仍然可以使用 CPU 资源。实际上,阻塞 I/O 通常在利用资源方面非常高效,因为线程就等待着 —— 操作系统将线程变成休眠状态,只有满足了线程需要的条件才会被唤醒。
-_非阻塞式_ I/O 是另一种思路。把套接字设成非阻塞模式时,调用 `recv` 时(还有 `send`,但是我们现在只考虑接收),函数返回地会很快,哪怕没有数据要接收。这时,就会返回一个特殊的错误状态 ^[注2][15] 来通知调用者,此时没有数据传进来。调用者可以去做其他的事情,或者尝试再次调用 `recv` 函数。
+_非阻塞式_ I/O 是另一种思路。把套接字设成非阻塞模式时,调用 `recv` 时(还有 `send`,但是我们现在只考虑接收),函数返回的会很快,哪怕没有接收到数据。这时,就会返回一个特殊的错误状态 ^注2 来通知调用者,此时没有数据传进来。调用者可以去做其他的事情,或者尝试再次调用 `recv` 函数。
-证明阻塞式和非阻塞式的 `recv` 区别的最好方式就是贴一段示例代码。这里有个监听套接字的小程序,一直在 `recv` 这里阻塞着;当 `recv` 返回了数据,程序就报告接收到了多少个字节 ^[注3][16]:
+示范阻塞式和非阻塞式的 `recv` 区别的最好方式就是贴一段示例代码。这里有个监听套接字的小程序,一直在 `recv` 这里阻塞着;当 `recv` 返回了数据,程序就报告接收到了多少个字节 ^注3 :
```
int main(int argc, const char** argv) {
@@ -69,8 +69,7 @@ hello # wait for 2 seconds after typing this
socket world
^D # to end the connection>
```
-
-The listening program will print the following:
+
监听程序会输出以下内容:
```
@@ -144,7 +143,6 @@ int main(int argc, const char** argv) {
这里与阻塞版本有些差异,值得注意:
1. `accept` 函数返回的 `newsocktfd` 套接字因调用了 `fcntl`, 被设置成非阻塞的模式。
-
2. 检查 `recv` 的返回状态时,我们对 `errno` 进行了检查,判断它是否被设置成表示没有可供接收的数据的状态。这时,我们仅仅是休眠了 200 毫秒然后进入到下一轮循环。
同样用 `nc` 进行测试,以下是非阻塞监听器的输出:
@@ -183,19 +181,19 @@ Peer disconnected; I'm done.
作为练习,给输出添加一个时间戳,确认调用 `recv` 得到结果之间花费的时间是比输入到 `nc` 中所用的多还是少(每一轮是 200 ms)。
-这里就实现了使用非阻塞的 `recv` 让监听者检查套接字变为可能,并且在没有数据的时候重新获得控制权。换句话说,这就是 _polling(轮询)_ —— 主程序周期性的查询套接字以便读取数据。
+这里就实现了使用非阻塞的 `recv` 让监听者检查套接字变为可能,并且在没有数据的时候重新获得控制权。换句话说,用编程的语言说这就是 轮询 —— 主程序周期性的查询套接字以便读取数据。
对于顺序响应的问题,这似乎是个可行的方法。非阻塞的 `recv` 让同时与多个套接字通信变成可能,轮询这些套接字,仅当有新数据到来时才处理。就是这样,这种方式 _可以_ 用来写并发服务器;但实际上一般不这么做,因为轮询的方式很难扩展。
-首先,我在代码中引入的 200 ms 延迟对于记录非常好(监听器在我输入 `nc` 之间只打印几行 “Calling recv...”,但实际上应该有上千行)。但它也增加了多达 200 ms 的服务器响应时间,这几乎是意料不到的。实际的程序中,延迟会低得多,休眠时间越短,进程占用的 CPU 资源就越多。有些时钟周期只是浪费在等待,这并不好,尤其是在移动设备上,这些设备的电量往往有限。
+首先,我在代码中引入的 200ms 延迟对于演示非常好(监听器在我输入 `nc` 之间只打印几行 “Calling recv...”,但实际上应该有上千行)。但它也增加了多达 200ms 的服务器响应时间,这无意是不必要的。实际的程序中,延迟会低得多,休眠时间越短,进程占用的 CPU 资源就越多。有些时钟周期只是浪费在等待,这并不好,尤其是在移动设备上,这些设备的电量往往有限。
-但是当我们实际这样来使用多个套接字的时候,更严重的问题出现了。想像下监听器正在同时处理 1000 个 客户端。这意味着每一个循环迭代里面,它都得为 _这 1000 个套接字中的每一个_ 执行一遍非阻塞的 `recv`,找到其中准备好了数据的那一个。这非常低效,并且极大的限制了服务器能够并发处理的客户端数。这里有个准则:每次轮询之间等待的间隔越久,服务器响应性越差;而等待的时间越少,CPU 在无用的轮询上耗费的资源越多。
+但是当我们实际这样来使用多个套接字的时候,更严重的问题出现了。想像下监听器正在同时处理 1000 个客户端。这意味着每一个循环迭代里面,它都得为 _这 1000 个套接字中的每一个_ 执行一遍非阻塞的 `recv`,找到其中准备好了数据的那一个。这非常低效,并且极大的限制了服务器能够并发处理的客户端数。这里有个准则:每次轮询之间等待的间隔越久,服务器响应性越差;而等待的时间越少,CPU 在无用的轮询上耗费的资源越多。
-讲真,所有的轮询都像是无用功。当然操作系统应该是知道哪个套接字是准备好了数据的,因此没必要逐个扫描。事实上,就是这样,接下来就会讲一些API,让我们可以更优雅地处理多个客户端。
+讲真,所有的轮询都像是无用功。当然操作系统应该是知道哪个套接字是准备好了数据的,因此没必要逐个扫描。事实上,就是这样,接下来就会讲一些 API,让我们可以更优雅地处理多个客户端。
### select
-`select` 的系统调用是轻便的(POSIX),标准 Unix API 中常有的部分。它是为上一节最后一部分描述的问题而设计的 —— 允许一个线程可以监视许多文件描述符 ^[注4][17] 的变化,不用在轮询中执行不必要的代码。我并不打算在这里引入一个关于 `select` 的理解性的教程,有很多网站和书籍讲这个,但是在涉及到问题的相关内容时,我会介绍一下它的 API,然后再展示一个非常复杂的例子。
+`select` 的系统调用是可移植的(POSIX),是标准 Unix API 中常有的部分。它是为上一节最后一部分描述的问题而设计的 —— 允许一个线程可以监视许多文件描述符 ^注4 的变化,而不用在轮询中执行不必要的代码。我并不打算在这里引入一个关于 `select` 的全面教程,有很多网站和书籍讲这个,但是在涉及到问题的相关内容时,我会介绍一下它的 API,然后再展示一个非常复杂的例子。
`select` 允许 _多路 I/O_,监视多个文件描述符,查看其中任何一个的 I/O 是否可用。
@@ -209,30 +207,25 @@ int select(int nfds, fd_set *readfds, fd_set *writefds,
`select` 的调用过程如下:
1. 在调用之前,用户先要为所有不同种类的要监视的文件描述符创建 `fd_set` 实例。如果想要同时监视读取和写入事件,`readfds` 和 `writefds` 都要被创建并且引用。
-
2. 用户可以使用 `FD_SET` 来设置集合中想要监视的特殊描述符。例如,如果想要监视描述符 2、7 和 10 的读取事件,在 `readfds` 这里调用三次 `FD_SET`,分别设置 2、7 和 10。
-
3. `select` 被调用。
-
4. 当 `select` 返回时(现在先不管超时),就是说集合中有多少个文件描述符已经就绪了。它也修改 `readfds` 和 `writefds` 集合,来标记这些准备好的描述符。其它所有的描述符都会被清空。
-
5. 这时用户需要遍历 `readfds` 和 `writefds`,找到哪个描述符就绪了(使用 `FD_ISSET`)。
-作为完整的例子,我在并发的服务器程序上使用 `select`,重新实现了我们之前的协议。[完整的代码在这里][18];接下来的是代码中的高亮,还有注释。警告:示例代码非常复杂,因此第一次看的时候,如果没有足够的时间,快速浏览也没有关系。
+作为完整的例子,我在并发的服务器程序上使用 `select`,重新实现了我们之前的协议。[完整的代码在这里][18];接下来的是代码中的重点部分及注释。警告:示例代码非常复杂,因此第一次看的时候,如果没有足够的时间,快速浏览也没有关系。
### 使用 select 的并发服务器
使用 I/O 的多发 API 诸如 `select` 会给我们服务器的设计带来一些限制;这不会马上显现出来,但这值得探讨,因为它们是理解事件驱动编程到底是什么的关键。
-最重要的是,要记住这种方法本质上是单线程的 ^[注5][19]。服务器实际上在 _同一时刻只能做一件事_。因为我们想要同时处理多个客户端请求,我们需要换一种方式重构代码。
+最重要的是,要记住这种方法本质上是单线程的 ^注5 。服务器实际上在 _同一时刻只能做一件事_。因为我们想要同时处理多个客户端请求,我们需要换一种方式重构代码。
首先,让我们谈谈主循环。它看起来是什么样的呢?先让我们想象一下服务器有一堆任务,它应该监视哪些东西呢?两种类型的套接字活动:
1. 新客户端尝试连接。这些客户端应该被 `accept`。
-
2. 已连接的客户端发送数据。这个数据要用 [第一节][11] 中所讲到的协议进行传输,有可能会有一些数据要被回送给客户端。
-尽管这两种活动在本质上有所区别,我们还是要把他们放在一个循环里,因为只能有一个主循环。循环会包含 `select` 的调用。这个 `select` 的调用会监视上述的两种活动。
+尽管这两种活动在本质上有所区别,我们还是要把它们放在一个循环里,因为只能有一个主循环。循环会包含 `select` 的调用。这个 `select` 的调用会监视上述的两种活动。
这里是部分代码,设置了文件描述符集合,并在主循环里转到被调用的 `select` 部分。
@@ -264,9 +257,7 @@ while (1) {
这里的一些要点:
1. 由于每次调用 `select` 都会重写传递给函数的集合,调用器就得维护一个 “master” 集合,在循环迭代中,保持对所监视的所有活跃的套接字的追踪。
-
2. 注意我们所关心的,最开始的唯一那个套接字是怎么变成 `listener_sockfd` 的,这就是最开始的套接字,服务器借此来接收新客户端的连接。
-
3. `select` 的返回值,是在作为参数传递的集合中,那些已经就绪的描述符的个数。`select` 修改这个集合,用来标记就绪的描述符。下一步是在这些描述符中进行迭代。
```
@@ -298,7 +289,7 @@ for (int fd = 0; fd <= fdset_max && nready > 0; fd++) {
}
```
-这部分循环检查 _可读的_ 描述符。让我们跳过监听器套接字(要浏览所有内容,[看这个代码][20]) 然后看看当其中一个客户端准备好了之后会发生什么。出现了这种情况后,我们调用一个叫做 `on_peer_ready_recv` 的 _回调_ 函数,传入相应的文件描述符。这个调用意味着客户端连接到套接字上,发送某些数据,并且对套接字上 `recv` 的调用不会被阻塞 ^[注6][21]。这个回调函数返回结构体 `fd_status_t`。
+这部分循环检查 _可读的_ 描述符。让我们跳过监听器套接字(要浏览所有内容,[看这个代码][20]) 然后看看当其中一个客户端准备好了之后会发生什么。出现了这种情况后,我们调用一个叫做 `on_peer_ready_recv` 的 _回调_ 函数,传入相应的文件描述符。这个调用意味着客户端连接到套接字上,发送某些数据,并且对套接字上 `recv` 的调用不会被阻塞 ^注6 。这个回调函数返回结构体 `fd_status_t`。
```
typedef struct {
@@ -307,7 +298,7 @@ typedef struct {
} fd_status_t;
```
-这个结构体告诉主循环,是否应该监视套接字的读取事件,写入事件,或者两者都监视。上述代码展示了 `FD_SET` 和 `FD_CLR` 是怎么在合适的描述符集合中被调用的。对于主循环中某个准备好了写入数据的描述符,代码是类似的,除了它所调用的回调函数,这个回调函数叫做 `on_peer_ready_send`。
+这个结构体告诉主循环,是否应该监视套接字的读取事件、写入事件,或者两者都监视。上述代码展示了 `FD_SET` 和 `FD_CLR` 是怎么在合适的描述符集合中被调用的。对于主循环中某个准备好了写入数据的描述符,代码是类似的,除了它所调用的回调函数,这个回调函数叫做 `on_peer_ready_send`。
现在来花点时间看看这个回调:
@@ -464,37 +455,36 @@ INFO:2017-09-26 05:29:18,070:conn0 disconnecting
INFO:2017-09-26 05:29:18,070:conn2 disconnecting
```
-和线程的情况相似,客户端之间没有延迟,他们被同时处理。而且在 `select-server` 也没有用线程!主循环 _多路_ 处理所有的客户端,通过高效使用 `select` 轮询多个套接字。回想下 [第二节中][22] 顺序的 vs 多线程的客户端处理过程的图片。对于我们的 `select-server`,三个客户端的处理流程像这样:
+和线程的情况相似,客户端之间没有延迟,它们被同时处理。而且在 `select-server` 也没有用线程!主循环 _多路_ 处理所有的客户端,通过高效使用 `select` 轮询多个套接字。回想下 [第二节中][22] 顺序的 vs 多线程的客户端处理过程的图片。对于我们的 `select-server`,三个客户端的处理流程像这样:

所有的客户端在同一个线程中同时被处理,通过乘积,做一点这个客户端的任务,然后切换到另一个,再切换到下一个,最后切换回到最开始的那个客户端。注意,这里没有什么循环调度,客户端在它们发送数据的时候被客户端处理,这实际上是受客户端左右的。
-### 同步,异步,事件驱动,回调
+### 同步、异步、事件驱动、回调
-`select-server` 示例代码为讨论什么是异步编程,它和事件驱动及基于回调的编程有何联系,提供了一个良好的背景。因为这些词汇在并发服务器的(非常矛盾的)讨论中很常见。
+`select-server` 示例代码为讨论什么是异步编程、它和事件驱动及基于回调的编程有何联系,提供了一个良好的背景。因为这些词汇在并发服务器的(非常矛盾的)讨论中很常见。
-让我们从一段 `select` 的手册页面中引用的一句好开始:
+让我们从一段 `select` 的手册页面中引用的一句话开始:
-> select,pselect,FD_CLR,FD_ISSET,FD_SET,FD_ZERO - 同步 I/O 处理
+> select,pselect,FD\_CLR,FD\_ISSET,FD\_SET,FD\_ZERO - 同步 I/O 处理
因此 `select` 是 _同步_ 处理。但我刚刚演示了大量代码的例子,使用 `select` 作为 _异步_ 处理服务器的例子。有哪些东西?
-答案是:这取决于你的观查角度。同步常用作阻塞处理,并且对 `select` 的调用实际上是阻塞的。和第 1、2 节中讲到的顺序的、多线程的服务器中对 `send` 和 `recv` 是一样的。因此说 `select` 是 _同步的_ API 是有道理的。可是,服务器的设计却可以是 _异步的_,或是 _基于回调的_,或是 _事件驱动的_,尽管其中有对 `select` 的使用。注意这里的 `on_peer_*` 函数是回调函数;它们永远不会阻塞,并且只有网络事件触发的时候才会被调用。它们可以获得部分数据,并能够在调用过程中保持稳定的状态。
+答案是:这取决于你的观察角度。同步常用作阻塞处理,并且对 `select` 的调用实际上是阻塞的。和第 1、2 节中讲到的顺序的、多线程的服务器中对 `send` 和 `recv` 是一样的。因此说 `select` 是 _同步的_ API 是有道理的。可是,服务器的设计却可以是 _异步的_,或是 _基于回调的_,或是 _事件驱动的_,尽管其中有对 `select` 的使用。注意这里的 `on_peer_*` 函数是回调函数;它们永远不会阻塞,并且只有网络事件触发的时候才会被调用。它们可以获得部分数据,并能够在调用过程中保持稳定的状态。
-如果你曾经做过一些 GUI 编程,这些东西对你来说应该很亲切。有个 “事件循环”,常常完全隐藏在框架里,应用的 “业务逻辑” 建立在回调上,这些回调会在各种事件触发后被调用,用户点击鼠标,选择菜单,定时器到时间,数据到达套接字,等等。曾经最常见的编程模型是客户端的 JavaScript,这里面有一堆回调函数,它们在浏览网页时用户的行为被触发。
+如果你曾经做过一些 GUI 编程,这些东西对你来说应该很亲切。有个 “事件循环”,常常完全隐藏在框架里,应用的 “业务逻辑” 建立在回调上,这些回调会在各种事件触发后被调用,用户点击鼠标、选择菜单、定时器触发、数据到达套接字等等。曾经最常见的编程模型是客户端的 JavaScript,这里面有一堆回调函数,它们在浏览网页时用户的行为被触发。
### select 的局限
-使用 `select` 作为第一个异步服务器的例子对于说明这个概念很有用,而且由于 `select` 是很常见,可移植的 API。但是它也有一些严重的缺陷,在监视的文件描述符非常大的时候就会出现。
+使用 `select` 作为第一个异步服务器的例子对于说明这个概念很有用,而且由于 `select` 是很常见、可移植的 API。但是它也有一些严重的缺陷,在监视的文件描述符非常大的时候就会出现。
1. 有限的文件描述符的集合大小。
-
2. 糟糕的性能。
-从文件描述符的大小开始。`FD_SETSIZE` 是一个编译期常数,在如今的操作系统中,它的值通常是 1024。它被硬编码在 `glibc` 的头文件里,并且不容易修改。它把 `select` 能够监视的文件描述符的数量限制在 1024 以内。曾有些分支想要写出能够处理上万个并发访问的客户端请求的服务器,这个问题很有现实意义。有一些方法,但是不可移植,也很难用。
+从文件描述符的大小开始。`FD_SETSIZE` 是一个编译期常数,在如今的操作系统中,它的值通常是 1024。它被硬编码在 `glibc` 的头文件里,并且不容易修改。它把 `select` 能够监视的文件描述符的数量限制在 1024 以内。曾有些人想要写出能够处理上万个并发访问的客户端请求的服务器,所以这个问题很有现实意义。有一些方法,但是不可移植,也很难用。
-糟糕的性能问题就好解决的多,但是依然非常严重。注意当 `select` 返回的时候,它向调用者提供的信息是 “就绪的” 描述符的个数,还有被修改过的描述符集合。描述符集映射着描述符 就绪/未就绪”,但是并没有提供什么有效的方法去遍历所有就绪的描述符。如果只有一个描述符是就绪的,最坏的情况是调用者需要遍历 _整个集合_ 来找到那个描述符。这在监视的描述符数量比较少的时候还行,但是如果数量变的很大的时候,这种方法弊端就凸显出了 ^[注7][23]。
+糟糕的性能问题就好解决的多,但是依然非常严重。注意当 `select` 返回的时候,它向调用者提供的信息是 “就绪的” 描述符的个数,还有被修改过的描述符集合。描述符集映射着描述符“就绪/未就绪”,但是并没有提供什么有效的方法去遍历所有就绪的描述符。如果只有一个描述符是就绪的,最坏的情况是调用者需要遍历 _整个集合_ 来找到那个描述符。这在监视的描述符数量比较少的时候还行,但是如果数量变的很大的时候,这种方法弊端就凸显出了 ^注7 。
由于这些原因,为了写出高性能的并发服务器, `select` 已经不怎么用了。每一个流行的操作系统有独特的不可移植的 API,允许用户写出非常高效的事件循环;像框架这样的高级结构还有高级语言通常在一个可移植的接口中包含这些 API。
@@ -541,30 +531,23 @@ while (1) {
}
```
-通过调用 `epoll_ctl` 来配置 `epoll`。这时,配置监听的套接字数量,也就是 `epoll` 监听的描述符的数量。然后分配一个缓冲区,把就绪的事件传给 `epoll` 以供修改。在主循环里对 `epoll_wait` 的调用是魅力所在。它阻塞着,直到某个描述符就绪了(或者超时),返回就绪的描述符数量。但这时,不少盲目地迭代所有监视的集合,我们知道 `epoll_write` 会修改传给它的 `events` 缓冲区,缓冲区中有就绪的事件,从 0 到 `nready-1`,因此我们只需迭代必要的次数。
+通过调用 `epoll_ctl` 来配置 `epoll`。这时,配置监听的套接字数量,也就是 `epoll` 监听的描述符的数量。然后分配一个缓冲区,把就绪的事件传给 `epoll` 以供修改。在主循环里对 `epoll_wait` 的调用是魅力所在。它阻塞着,直到某个描述符就绪了(或者超时),返回就绪的描述符数量。但这时,不要盲目地迭代所有监视的集合,我们知道 `epoll_write` 会修改传给它的 `events` 缓冲区,缓冲区中有就绪的事件,从 0 到 `nready-1`,因此我们只需迭代必要的次数。
要在 `select` 里面重新遍历,有明显的差异:如果在监视着 1000 个描述符,只有两个就绪, `epoll_waits` 返回的是 `nready=2`,然后修改 `events` 缓冲区最前面的两个元素,因此我们只需要“遍历”两个描述符。用 `select` 我们就需要遍历 1000 个描述符,找出哪个是就绪的。因此,在繁忙的服务器上,有许多活跃的套接字时 `epoll` 比 `select` 更加容易扩展。
-剩下的代码很直观,因为我们已经很熟悉 `select 服务器` 了。实际上,`epoll 服务器` 中的所有“业务逻辑”和 `select 服务器` 是一样的,回调构成相同的代码。
+剩下的代码很直观,因为我们已经很熟悉 “select 服务器” 了。实际上,“epoll 服务器” 中的所有“业务逻辑”和 “select 服务器” 是一样的,回调构成相同的代码。
-这种相似是通过将事件循环抽象分离到一个库/框架中。我将会详述这些内容,因为很多优秀的程序员曾经也是这样做的。相反,下一篇文章里我们会了解 `libuv`,一个最近出现的更加受欢迎的时间循环抽象层。像 `libuv` 这样的库让我们能够写出并发的异步服务器,并且不用考虑系统调用下繁琐的细节。
+这种相似是通过将事件循环抽象分离到一个库/框架中。我将会详述这些内容,因为很多优秀的程序员曾经也是这样做的。相反,下一篇文章里我们会了解 libuv,一个最近出现的更加受欢迎的时间循环抽象层。像 libuv 这样的库让我们能够写出并发的异步服务器,并且不用考虑系统调用下繁琐的细节。
* * *
-
-[注1][1] 我试着在两件事的实际差别中突显自己,一件是做一些网络浏览和阅读,但经常做得头疼。有很多不同的选项,从“他们是一样的东西”到“一个是另一个的子集”,再到“他们是完全不同的东西”。在面临这样主观的观点时,最好是完全放弃这个问题,专注特殊的例子和用例。
-
-[注2][2] POSIX 表示这可以是 `EAGAIN`,也可以是 `EWOULDBLOCK`,可移植应用应该对这两个都进行检查。
-
-[注3][3] 和这个系列所有的 C 示例类似,代码中用到了某些助手工具来设置监听套接字。这些工具的完整代码在这个 [仓库][4] 的 `utils` 模块里。
-
-[注4][5] `select` 不是网络/套接字专用的函数,它可以监视任意的文件描述符,有可能是硬盘文件,管道,终端,套接字或者 Unix 系统中用到的任何文件描述符。这篇文章里,我们主要关注它在套接字方面的应用。
-
-[注5][6] 有多种方式用多线程来实现事件驱动,我会把它放在稍后的文章中进行讨论。
-
-[注6][7] 由于各种非实验因素,它 _仍然_ 可以阻塞,即使是在 `select` 说它就绪了之后。因此服务器上打开的所有套接字都被设置成非阻塞模式,如果对 `recv` 或 `send` 的调用返回了 `EAGAIN` 或者 `EWOULDBLOCK`,回调函数就装作没有事件发生。阅读示例代码的注释可以了解更多细节。
-
-[注7][8] 注意这比该文章前面所讲的异步 polling 例子要稍好一点。polling 需要 _一直_ 发生,而 `select` 实际上会阻塞到有一个或多个套接字准备好读取/写入;`select` 会比一直询问浪费少得多的 CPU 时间。
+- 注1:我试着在做网络浏览和阅读这两件事的实际差别中突显自己,但经常做得头疼。有很多不同的选项,从“它们是一样的东西”到“一个是另一个的子集”,再到“它们是完全不同的东西”。在面临这样主观的观点时,最好是完全放弃这个问题,专注特殊的例子和用例。
+- 注2:POSIX 表示这可以是 `EAGAIN`,也可以是 `EWOULDBLOCK`,可移植应用应该对这两个都进行检查。
+- 注3:和这个系列所有的 C 示例类似,代码中用到了某些助手工具来设置监听套接字。这些工具的完整代码在这个 [仓库][4] 的 `utils` 模块里。
+- 注4:`select` 不是网络/套接字专用的函数,它可以监视任意的文件描述符,有可能是硬盘文件、管道、终端、套接字或者 Unix 系统中用到的任何文件描述符。这篇文章里,我们主要关注它在套接字方面的应用。
+- 注5:有多种方式用多线程来实现事件驱动,我会把它放在稍后的文章中进行讨论。
+- 注6:由于各种非实验因素,它 _仍然_ 可以阻塞,即使是在 `select` 说它就绪了之后。因此服务器上打开的所有套接字都被设置成非阻塞模式,如果对 `recv` 或 `send` 的调用返回了 `EAGAIN` 或者 `EWOULDBLOCK`,回调函数就装作没有事件发生。阅读示例代码的注释可以了解更多细节。
+- 注7:注意这比该文章前面所讲的异步轮询的例子要稍好一点。轮询需要 _一直_ 发生,而 `select` 实际上会阻塞到有一个或多个套接字准备好读取/写入;`select` 会比一直询问浪费少得多的 CPU 时间。
--------------------------------------------------------------------------------
@@ -572,7 +555,7 @@ via: https://eli.thegreenplace.net/2017/concurrent-servers-part-3-event-driven/
作者:[Eli Bendersky][a]
译者:[GitFuture](https://github.com/GitFuture)
-校对:[校对者ID](https://github.com/校对者ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
@@ -587,9 +570,9 @@ via: https://eli.thegreenplace.net/2017/concurrent-servers-part-3-event-driven/
[8]:https://eli.thegreenplace.net/2017/concurrent-servers-part-3-event-driven/#id9
[9]:https://eli.thegreenplace.net/tag/concurrency
[10]:https://eli.thegreenplace.net/tag/c-c
-[11]:http://eli.thegreenplace.net/2017/concurrent-servers-part-1-introduction/
-[12]:http://eli.thegreenplace.net/2017/concurrent-servers-part-1-introduction/
-[13]:http://eli.thegreenplace.net/2017/concurrent-servers-part-2-threads/
+[11]:https://linux.cn/article-8993-1.html
+[12]:https://linux.cn/article-8993-1.html
+[13]:https://linux.cn/article-9002-1.html
[14]:http://eli.thegreenplace.net/2017/concurrent-servers-part-3-event-driven/
[15]:https://eli.thegreenplace.net/2017/concurrent-servers-part-3-event-driven/#id11
[16]:https://eli.thegreenplace.net/2017/concurrent-servers-part-3-event-driven/#id12
@@ -598,10 +581,10 @@ via: https://eli.thegreenplace.net/2017/concurrent-servers-part-3-event-driven/
[19]:https://eli.thegreenplace.net/2017/concurrent-servers-part-3-event-driven/#id14
[20]:https://github.com/eliben/code-for-blog/blob/master/2017/async-socket-server/select-server.c
[21]:https://eli.thegreenplace.net/2017/concurrent-servers-part-3-event-driven/#id15
-[22]:http://eli.thegreenplace.net/2017/concurrent-servers-part-2-threads/
+[22]:https://linux.cn/article-9002-1.html
[23]:https://eli.thegreenplace.net/2017/concurrent-servers-part-3-event-driven/#id16
[24]:https://github.com/eliben/code-for-blog/blob/master/2017/async-socket-server/epoll-server.c
[25]:https://eli.thegreenplace.net/2017/concurrent-servers-part-3-event-driven/
-[26]:http://eli.thegreenplace.net/2017/concurrent-servers-part-1-introduction/
-[27]:http://eli.thegreenplace.net/2017/concurrent-servers-part-2-threads/
+[26]:https://linux.cn/article-8993-1.html
+[27]:https://linux.cn/article-9002-1.html
[28]:https://eli.thegreenplace.net/2017/concurrent-servers-part-3-event-driven/#id10
diff --git a/translated/tech/20171024 How to Encrypt and Decrypt Individual Files With GPG.md b/published/20171024 How to Encrypt and Decrypt Individual Files With GPG.md
similarity index 60%
rename from translated/tech/20171024 How to Encrypt and Decrypt Individual Files With GPG.md
rename to published/20171024 How to Encrypt and Decrypt Individual Files With GPG.md
index 6b534be640..dffab516ac 100644
--- a/translated/tech/20171024 How to Encrypt and Decrypt Individual Files With GPG.md
+++ b/published/20171024 How to Encrypt and Decrypt Individual Files With GPG.md
@@ -1,68 +1,66 @@
如何使用 GPG 加解密文件
-------
-### 目标
+=================
-使用 GPG 加密文件
+目标:使用 GPG 加密文件
-### 发行版
+发行版:适用于任何发行版
-适用于任何发行版
+要求:安装了 GPG 的 Linux 或者拥有 root 权限来安装它。
-### 要求
+难度:简单
-安装了 GPG 的 Linux 或者拥有 root 权限来安装它。
+约定:
-### 难度
-
-简单
-
-### 约定
-
-* # - 需要使用 root 权限来执行指定命令,可以直接使用 root 用户来执行也可以使用 sudo 命令
-
-* $ - 可以使用普通用户来执行指定命令
+* `#` - 需要使用 root 权限来执行指定命令,可以直接使用 root 用户来执行,也可以使用 `sudo` 命令
+* `$` - 可以使用普通用户来执行指定命令
### 介绍
-加密非常重要。它对于保护敏感信息来说是必不可少的。
-你的私人文件应该要被加密,而 GPG 提供了很好的解决方案。
+加密非常重要。它对于保护敏感信息来说是必不可少的。你的私人文件应该要被加密,而 GPG 提供了很好的解决方案。
### 安装 GPG
-GPG 的使用非常广泛。你在几乎每个发行版的仓库中都能找到它。
-如果你还没有安装它,那现在就来安装一下吧。
+GPG 的使用非常广泛。你在几乎每个发行版的仓库中都能找到它。如果你还没有安装它,那现在就来安装一下吧。
-#### Debian/Ubuntu
+**Debian/Ubuntu**
-```shell
+```
$ sudo apt install gnupg
```
-#### Fedora
-```shell
+
+**Fedora**
+
+```
# dnf install gnupg2
```
-#### Arch
-```shell
+
+**Arch**
+
+```
# pacman -S gnupg
```
-#### Gentoo
-```shell
+
+**Gentoo**
+
+```
# emerge --ask app-crypt/gnupg
```
-### Create a Key
-你需要一个密钥对来加解密文件。如果你为 SSH 已经生成过了密钥对,那么你可以直接使用它。
-如果没有,GPG 包含工具来生成密钥对。
-```shell
+### 创建密钥
+
+你需要一个密钥对来加解密文件。如果你为 SSH 已经生成过了密钥对,那么你可以直接使用它。如果没有,GPG 包含工具来生成密钥对。
+
+```
$ gpg --full-generate-key
```
-GPG 有一个命令行程序帮你一步一步的生成密钥。它还有一个简单得多的工具,但是这个工具不能让你设置密钥类型,密钥的长度以及过期时间,因此不推荐使用这个工具。
+
+GPG 有一个命令行程序可以帮你一步一步的生成密钥。它还有一个简单得多的工具,但是这个工具不能让你设置密钥类型,密钥的长度以及过期时间,因此不推荐使用这个工具。
GPG 首先会询问你密钥的类型。没什么特别的话选择默认值就好。
下一步需要设置密钥长度。`4096` 是一个不错的选择。
-之后,可以设置过期的日期。 如果希望密钥永不过期则设置为 `0`
+之后,可以设置过期的日期。 如果希望密钥永不过期则设置为 `0`。
然后,输入你的名称。
@@ -72,20 +70,19 @@ GPG 首先会询问你密钥的类型。没什么特别的话选择默认值就
所有这些都完成后,GPG 会让你校验一下这些信息。
-GPG 还会问你是否需要为密钥设置密码。这一步是可选的, 但是会增加保护的程度。
-若需要设置密码,则 GPG 会收集你的操作信息来增加密钥的健壮性。 所有这些都完成后, GPG 会显示密钥相关的信息。
+GPG 还会问你是否需要为密钥设置密码。这一步是可选的, 但是会增加保护的程度。若需要设置密码,则 GPG 会收集你的操作信息来增加密钥的健壮性。 所有这些都完成后, GPG 会显示密钥相关的信息。
### 加密的基本方法
-现在你拥有了自己的密钥,加密文件非常简单。 使用虾米那命令在 `/tmp` 目录中创建一个空白文本文件。
+现在你拥有了自己的密钥,加密文件非常简单。 使用下面的命令在 `/tmp` 目录中创建一个空白文本文件。
-```shell
+```
$ touch /tmp/test.txt
```
然后用 GPG 来加密它。这里 `-e` 标志告诉 GPG 你想要加密文件, `-r` 标志指定接收者。
-```shell
+```
$ gpg -e -r "Your Name" /tmp/test.txt
```
@@ -95,34 +92,35 @@ GPG 需要知道这个文件的接收者和发送者。由于这个文件给是
你收到加密文件后,就需要对它进行解密。 你无需指定解密用的密钥。 这个信息被编码在文件中。 GPG 会尝试用其中的密钥进行解密。
-```shel
+```
$ gpg -d /tmp/test.txt.gpg
```
### 发送文件
+
假设你需要发送文件给别人。你需要有接收者的公钥。 具体怎么获得密钥由你自己决定。 你可以让他们直接把公钥发送给你, 也可以通过密钥服务器来获取。
收到对方公钥后,导入公钥到 GPG 中。
-```shell
+```
$ gpg --import yourfriends.key
```
-这些公钥与你自己创建的密钥一样,自带了名称和电子邮件地址的信息。
-记住,为了让别人能解密你的文件,别人也需要你的公钥。 因此导出公钥并将之发送出去。
+这些公钥与你自己创建的密钥一样,自带了名称和电子邮件地址的信息。 记住,为了让别人能解密你的文件,别人也需要你的公钥。 因此导出公钥并将之发送出去。
-```shell
+```
gpg --export -a "Your Name" > your.key
```
现在可以开始加密要发送的文件了。它跟之前的步骤差不多, 只是需要指定你自己为发送人。
+
```
$ gpg -e -u "Your Name" -r "Their Name" /tmp/test.txt
```
### 结语
-就这样了。GPG 还有一些高级选项, 不过你在 99% 的时间内都不会用到这些高级选项。 GPG 就是这么易于使用。
-你也可以使用创建的密钥对来发送和接受加密邮件,其步骤跟上面演示的差不多, 不过大多数的电子邮件客户端在拥有密钥的情况下会自动帮你做这个动作。
+
+就这样了。GPG 还有一些高级选项, 不过你在 99% 的时间内都不会用到这些高级选项。 GPG 就是这么易于使用。你也可以使用创建的密钥对来发送和接受加密邮件,其步骤跟上面演示的差不多, 不过大多数的电子邮件客户端在拥有密钥的情况下会自动帮你做这个动作。
--------------------------------------------------------------------------------
@@ -130,7 +128,7 @@ via: https://linuxconfig.org/how-to-encrypt-and-decrypt-individual-files-with-gp
作者:[Nick Congleton][a]
译者:[lujun9972](https://github.com/lujun9972)
-校对:[校对者 ID](https://github.com/校对者 ID)
+校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux 中国](https://linux.cn/) 荣誉推出
diff --git a/published/20171120 Mark McIntyre How Do You Fedora.md b/published/20171120 Mark McIntyre How Do You Fedora.md
new file mode 100644
index 0000000000..3ce32fd266
--- /dev/null
+++ b/published/20171120 Mark McIntyre How Do You Fedora.md
@@ -0,0 +1,74 @@
+Mark McIntyre:与 Fedora 的那些事
+===========================
+
+
+
+最近我们采访了 Mark McIntyre,谈了他是如何使用 Fedora 系统的。这也是 Fedora 杂志上[系列文章的一部分][2]。该系列简要介绍了 Fedora 用户,以及他们是如何用 Fedora 把事情做好的。如果你想成为采访对象,请通过[反馈表][3]与我们联系。
+
+### Mark McIntyre 是谁?
+
+Mark McIntyre 为极客而生,以 Linux 为乐趣。他说:“我在 13 岁开始编程,当时自学 BASIC 语言,我体会到其中的乐趣,并在乐趣的引导下,一步步成为专业的码农。” Mark 和他的侄女都是披萨饼的死忠粉。“去年秋天,我和我的侄女开始了一个任务,去尝试诺克斯维尔的许多披萨饼连锁店。点击[这里][4]可以了解我们的进展情况。”Mark 也是一名业余的摄影爱好者,并且在 Flickr 上 [发布自己的作品][5]。
+
+
+
+作为一名开发者,Mark 有着丰富的工作背景。他用过 Visual Basic 编写应用程序,用过 LotusScript、 PL/SQL(Oracle)、 Tcl/TK 编写代码,也用过基于 Python 的 Django 框架。他的强项是 Python。这也是目前他作为系统工程师的工作语言。“我经常使用 Python。由于我的工作变得更像是自动化工程师, Python 用得就更频繁了。”
+
+McIntyre 自称是个书呆子,喜欢科幻电影,但他最喜欢的一部电影却不是科幻片。“尽管我是个书呆子,喜欢看《星际迷航》、《星球大战》之类的影片,但《光荣战役》或许才是我最喜欢的电影。”他还提到,电影《冲出宁静号》是一个著名电视剧的精彩后续(指《萤火虫》)。
+
+Mark 比较看重他人的谦逊、知识与和气。他欣赏能够设身处地为他人着想的人。“如果你决定为另一个人服务,那么你会选择自己愿意亲近的人,而不是让自己备受折磨的人。”
+
+McIntyre 目前在 [Scripps Networks Interactive][6] 工作,这家公司是 HGTV、Food Network、Travel Channel、DIY、GAC 以及其他几个有线电视频道的母公司。“我现在是一名系统工程师,负责非线性视频内容,这是所有媒体要开展线上消费所需要的。”他为一些开发团队提供支持,他们编写应用程序,将线性视频从有线电视发布到线上平台,比如亚马逊、葫芦。这些系统既包含预置系统,也包含云系统。Mark 还开发了一些自动化工具,将这些应用程序主要部署到云基础结构中。
+
+### Fedora 社区
+
+Mark 形容 Fedora 社区是一个富有活力的社区,充满着像 Fedora 用户一样热爱生活的人。“从设计师到封包人,这个团体依然非常活跃,生机勃勃。” 他继续说道:“这使我对该操作系统抱有一种信心。”
+
+2002 年左右,Mark 开始经常使用 IRC 上的 #fedora 频道:“那时候,Wi-Fi 在启用适配器和配置模块功能时,有许多还是靠手工实现的。”为了让他的 Wi-Fi 能够工作,他不得不重新去编译 Fedora 内核。
+
+McIntyre 鼓励他人参与 Fedora 社区。“这里有许多来自不同领域的机会。前端设计、测试部署、开发、应用程序打包以及新技术实现。”他建议选择一个感兴趣的领域,然后向那个团体提出疑问。“这里有许多机会去奉献自己。”
+
+对于帮助他起步的社区成员,Mark 赞道:“Ben Williams 非常乐于助人。在我第一次接触 Fedora 时,他帮我搞定了一些 #fedora 支持频道中的安装补丁。” Ben 也鼓励 Mark 去做 Fedora [大使][7]。
+
+### 什么样的硬件和软件?
+
+McIntyre 将 Fedora Linux 系统用在他的笔记本和台式机上。在服务器上他选择了 CentOS,因为它有更长的生命周期支持。他现在的台式机是自己组装的,配有 Intel 酷睿 i5 处理器,32GB 的内存和2TB 的硬盘。“我装了个 4K 的显示屏,有足够大的地方来同时查看所有的应用。”他目前工作用的笔记本是戴尔灵越二合一,配备 13 英寸的屏,16 GB 的内存和 525 GB 的 m.2 固态硬盘。
+
+
+
+Mark 现在将 Fedora 26 运行在他过去几个月装配的所有机器中。当一个新版本正式发布的时候,他倾向于避开这个高峰期。“除非在它即将发行的时候,我的工作站中有个正在运行下一代测试版本,通常情况下,一旦它发展成熟,我都会试着去获取最新的版本。”他经常采取就地更新:“这种就地更新方法利用 dnf 系统升级插件,目前表现得非常好。”
+
+为了搞摄影,McIntyre 用上了 [GIMP][8]、[Darktable][9],以及其他一些照片查看包和快速编辑包。当不用 Web 电子邮件时,Mark 会使用 [Geary][10],还有[GNOME Calendar][11]。Mark 选用 HexChat 作为 IRC 客户端,[HexChat][12] 与在 Fedora 服务器实例上运行的 [ZNC bouncer][13] 联机。他的部门通过 Slave 进行沟通交流。
+
+“我从来都不是 IDE 粉,所以大多数的编辑任务都是在 [vim][14] 上完成的。”Mark 偶尔也会打开一个简单的文本编辑器,如 [gedit][15],或者 [xed][16]。他用 [GPaste][17] 做复制和粘贴工作。“对于终端的选择,我已经变成 [Tilix][18] 的忠粉。”McIntyre 通过 [Rhythmbox][19] 来管理他喜欢的播客,并用 [Epiphany][20] 实现快速网络查询。
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/mark-mcintyre-fedora/
+
+作者:[Charles Profitt][a]
+译者:[zrszrszrs](https://github.com/zrszrszrs)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://fedoramagazine.org/author/cprofitt/
+[1]:https://fedoramagazine.org/mark-mcintyre-fedora/
+[2]:https://fedoramagazine.org/tag/how-do-you-fedora/
+[3]:https://fedoramagazine.org/submit-an-idea-or-tip/
+[4]:https://knox-pizza-quest.blogspot.com/
+[5]:https://www.flickr.com/photos/mockgeek/
+[6]:http://www.scrippsnetworksinteractive.com/
+[7]:https://fedoraproject.org/wiki/Ambassadors
+[8]:https://www.gimp.org/
+[9]:http://www.darktable.org/
+[10]:https://wiki.gnome.org/Apps/Geary
+[11]:https://wiki.gnome.org/Apps/Calendar
+[12]:https://hexchat.github.io/
+[13]:https://wiki.znc.in/ZNC
+[14]:http://www.vim.org/
+[15]:https://wiki.gnome.org/Apps/Gedit
+[16]:https://github.com/linuxmint/xed
+[17]:https://github.com/Keruspe/GPaste
+[18]:https://fedoramagazine.org/try-tilix-new-terminal-emulator-fedora/
+[19]:https://wiki.gnome.org/Apps/Rhythmbox
+[20]:https://wiki.gnome.org/Apps/Web
diff --git a/published/20171128 How To Tell If Your Linux Server Has Been Compromised.md b/published/20171128 How To Tell If Your Linux Server Has Been Compromised.md
new file mode 100644
index 0000000000..3ce5f449e3
--- /dev/null
+++ b/published/20171128 How To Tell If Your Linux Server Has Been Compromised.md
@@ -0,0 +1,149 @@
+如何判断 Linux 服务器是否被入侵?
+=========================
+
+本指南中所谓的服务器被入侵或者说被黑了的意思,是指未经授权的人或程序为了自己的目的登录到服务器上去并使用其计算资源,通常会产生不好的影响。
+
+免责声明:若你的服务器被类似 NSA 这样的国家机关或者某个犯罪集团入侵,那么你并不会注意到有任何问题,这些技术也无法发觉他们的存在。
+
+然而,大多数被攻破的服务器都是被类似自动攻击程序这样的程序或者类似“脚本小子”这样的廉价攻击者,以及蠢蛋罪犯所入侵的。
+
+这类攻击者会在访问服务器的同时滥用服务器资源,并且不怎么会采取措施来隐藏他们正在做的事情。
+
+### 被入侵服务器的症状
+
+当服务器被没有经验攻击者或者自动攻击程序入侵了的话,他们往往会消耗 100% 的资源。他们可能消耗 CPU 资源来进行数字货币的采矿或者发送垃圾邮件,也可能消耗带宽来发动 DoS 攻击。
+
+因此出现问题的第一个表现就是服务器 “变慢了”。这可能表现在网站的页面打开的很慢,或者电子邮件要花很长时间才能发送出去。
+
+那么你应该查看那些东西呢?
+
+#### 检查 1 - 当前都有谁在登录?
+
+你首先要查看当前都有谁登录在服务器上。发现攻击者登录到服务器上进行操作并不复杂。
+
+其对应的命令是 `w`。运行 `w` 会输出如下结果:
+
+```
+ 08:32:55 up 98 days, 5:43, 2 users, load average: 0.05, 0.03, 0.00
+USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
+root pts/0 113.174.161.1 08:26 0.00s 0.03s 0.02s ssh root@coopeaa12
+root pts/1 78.31.109.1 08:26 0.00s 0.01s 0.00s w
+```
+
+第一个 IP 是英国 IP,而第二个 IP 是越南 IP。这个不是个好兆头。
+
+停下来做个深呼吸, 不要恐慌之下只是干掉他们的 SSH 连接。除非你能够防止他们再次进入服务器,否则他们会很快进来并踢掉你,以防你再次回去。
+
+请参阅本文最后的“被入侵之后怎么办”这一章节来看找到了被入侵的证据后应该怎么办。
+
+`whois` 命令可以接一个 IP 地址然后告诉你该 IP 所注册的组织的所有信息,当然就包括所在国家的信息。
+
+#### 检查 2 - 谁曾经登录过?
+
+Linux 服务器会记录下哪些用户,从哪个 IP,在什么时候登录的以及登录了多长时间这些信息。使用 `last` 命令可以查看这些信息。
+
+输出类似这样:
+
+```
+root pts/1 78.31.109.1 Thu Nov 30 08:26 still logged in
+root pts/0 113.174.161.1 Thu Nov 30 08:26 still logged in
+root pts/1 78.31.109.1 Thu Nov 30 08:24 - 08:26 (00:01)
+root pts/0 113.174.161.1 Wed Nov 29 12:34 - 12:52 (00:18)
+root pts/0 14.176.196.1 Mon Nov 27 13:32 - 13:53 (00:21)
+```
+
+这里可以看到英国 IP 和越南 IP 交替出现,而且最上面两个 IP 现在还处于登录状态。如果你看到任何未经授权的 IP,那么请参阅最后章节。
+
+登录后的历史记录会记录到二进制的 `/var/log/wtmp` 文件中(LCTT 译注:这里作者应该写错了,根据实际情况修改),因此很容易被删除。通常攻击者会直接把这个文件删掉,以掩盖他们的攻击行为。 因此, 若你运行了 `last` 命令却只看得见你的当前登录,那么这就是个不妙的信号。
+
+如果没有登录历史的话,请一定小心,继续留意入侵的其他线索。
+
+#### 检查 3 - 回顾命令历史
+
+这个层次的攻击者通常不会注意掩盖命令的历史记录,因此运行 `history` 命令会显示出他们曾经做过的所有事情。
+一定留意有没有用 `wget` 或 `curl` 命令来下载类似垃圾邮件机器人或者挖矿程序之类的非常规软件。
+
+命令历史存储在 `~/.bash_history` 文件中,因此有些攻击者会删除该文件以掩盖他们的所作所为。跟登录历史一样,若你运行 `history` 命令却没有输出任何东西那就表示历史文件被删掉了。这也是个不妙的信号,你需要很小心地检查一下服务器了。(LCTT 译注,如果没有命令历史,也有可能是你的配置错误。)
+
+#### 检查 4 - 哪些进程在消耗 CPU?
+
+你常遇到的这类攻击者通常不怎么会去掩盖他们做的事情。他们会运行一些特别消耗 CPU 的进程。这就很容易发现这些进程了。只需要运行 `top` 然后看最前的那几个进程就行了。
+
+这也能显示出那些未登录进来的攻击者。比如,可能有人在用未受保护的邮件脚本来发送垃圾邮件。
+
+如果你最上面的进程对不了解,那么你可以 Google 一下进程名称,或者通过 `losf` 和 `strace` 来看看它做的事情是什么。
+
+使用这些工具,第一步从 `top` 中拷贝出进程的 PID,然后运行:
+
+```
+strace -p PID
+```
+
+这会显示出该进程调用的所有系统调用。它产生的内容会很多,但这些信息能告诉你这个进程在做什么。
+
+```
+lsof -p PID
+```
+
+这个程序会列出该进程打开的文件。通过查看它访问的文件可以很好的理解它在做的事情。
+
+#### 检查 5 - 检查所有的系统进程
+
+消耗 CPU 不严重的未授权进程可能不会在 `top` 中显露出来,不过它依然可以通过 `ps` 列出来。命令 `ps auxf` 就能显示足够清晰的信息了。
+
+你需要检查一下每个不认识的进程。经常运行 `ps` (这是个好习惯)能帮助你发现奇怪的进程。
+
+#### 检查 6 - 检查进程的网络使用情况
+
+`iftop` 的功能类似 `top`,它会排列显示收发网络数据的进程以及它们的源地址和目的地址。类似 DoS 攻击或垃圾机器人这样的进程很容易显示在列表的最顶端。
+
+#### 检查 7 - 哪些进程在监听网络连接?
+
+通常攻击者会安装一个后门程序专门监听网络端口接受指令。该进程等待期间是不会消耗 CPU 和带宽的,因此也就不容易通过 `top` 之类的命令发现。
+
+`lsof` 和 `netstat` 命令都会列出所有的联网进程。我通常会让它们带上下面这些参数:
+
+```
+lsof -i
+```
+
+```
+netstat -plunt
+```
+
+你需要留意那些处于 `LISTEN` 和 `ESTABLISHED` 状态的进程,这些进程要么正在等待连接(LISTEN),要么已经连接(ESTABLISHED)。如果遇到不认识的进程,使用 `strace` 和 `lsof` 来看看它们在做什么东西。
+
+### 被入侵之后该怎么办呢?
+
+首先,不要紧张,尤其当攻击者正处于登录状态时更不能紧张。**你需要在攻击者警觉到你已经发现他之前夺回机器的控制权。**如果他发现你已经发觉到他了,那么他可能会锁死你不让你登陆服务器,然后开始毁尸灭迹。
+
+如果你技术不太好那么就直接关机吧。你可以在服务器上运行 `shutdown -h now` 或者 `systemctl poweroff` 这两条命令之一。也可以登录主机提供商的控制面板中关闭服务器。关机后,你就可以开始配置防火墙或者咨询一下供应商的意见。
+
+如果你对自己颇有自信,而你的主机提供商也有提供上游防火墙,那么你只需要以此创建并启用下面两条规则就行了:
+
+1. 只允许从你的 IP 地址登录 SSH。
+2. 封禁除此之外的任何东西,不仅仅是 SSH,还包括任何端口上的任何协议。
+
+这样会立即关闭攻击者的 SSH 会话,而只留下你可以访问服务器。
+
+如果你无法访问上游防火墙,那么你就需要在服务器本身创建并启用这些防火墙策略,然后在防火墙规则起效后使用 `kill` 命令关闭攻击者的 SSH 会话。(LCTT 译注:本地防火墙规则 有可能不会阻止已经建立的 SSH 会话,所以保险起见,你需要手工杀死该会话。)
+
+最后还有一种方法,如果支持的话,就是通过诸如串行控制台之类的带外连接登录服务器,然后通过 `systemctl stop network.service` 停止网络功能。这会关闭所有服务器上的网络连接,这样你就可以慢慢的配置那些防火墙规则了。
+
+重夺服务器的控制权后,也不要以为就万事大吉了。
+
+不要试着修复这台服务器,然后接着用。你永远不知道攻击者做过什么,因此你也永远无法保证这台服务器还是安全的。
+
+最好的方法就是拷贝出所有的数据,然后重装系统。(LCTT 译注:你的程序这时已经不可信了,但是数据一般来说没问题。)
+
+--------------------------------------------------------------------------------
+
+via: https://bash-prompt.net/guides/server-hacked/
+
+作者:[Elliot Cooper][a]
+译者:[lujun9972](https://github.com/lujun9972)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://bash-prompt.net
diff --git a/published/20171130 Wake up and Shut Down Linux Automatically.md b/published/20171130 Wake up and Shut Down Linux Automatically.md
new file mode 100644
index 0000000000..d1c2167a35
--- /dev/null
+++ b/published/20171130 Wake up and Shut Down Linux Automatically.md
@@ -0,0 +1,132 @@
+如何自动唤醒和关闭 Linux
+=====================
+
+
+
+> 了解如何通过配置 Linux 计算机来根据时间自动唤醒和关闭。
+
+
+不要成为一个电能浪费者。如果你的电脑不需要开机就请把它们关机。出于方便和计算机宅的考虑,你可以通过配置你的 Linux 计算机实现自动唤醒和关闭。
+
+### 宝贵的系统运行时间
+
+有时候有些电脑需要一直处在开机状态,在不超过电脑运行时间的限制下这种情况是被允许的。有些人为他们的计算机可以长时间的正常运行而感到自豪,且现在我们有内核热补丁能够实现只有在硬件发生故障时才需要机器关机。我认为比较实际可行的是,像减少移动部件磨损一样节省电能,且在不需要机器运行的情况下将其关机。比如,你可以在规定的时间内唤醒备份服务器,执行备份,然后关闭它直到它要进行下一次备份。或者,你可以设置你的互联网网关只在特定的时间运行。任何不需要一直运行的东西都可以将其配置成在其需要工作的时候打开,待其完成工作后将其关闭。
+
+### 系统休眠
+
+对于不需要一直运行的电脑,使用 root 的 cron 定时任务(即 `/etc/crontab`)可以可靠地关闭电脑。这个例子创建一个 root 定时任务实现每天晚上 11 点 15 分定时关机。
+
+```
+# crontab -e -u root
+# m h dom mon dow command
+15 23 * * * /sbin/shutdown -h now
+```
+
+以下示例仅在周一至周五运行:
+
+```
+15 23 * * 1-5 /sbin/shutdown -h now
+```
+
+您可以为不同的日期和时间创建多个 cron 作业。 通过命令 `man 5 crontab` 可以了解所有时间和日期的字段。
+
+一个快速、容易的方式是,使用 `/etc/crontab` 文件。但这样你必须指定用户:
+
+```
+15 23 * * 1-5 root shutdown -h now
+```
+
+### 自动唤醒
+
+实现自动唤醒是一件很酷的事情;我大多数 SUSE (SUSE Linux)的同事都在纽伦堡,因此,因此为了跟同事能有几小时一起工作的时间,我不得不需要在凌晨五点起床。我的计算机早上 5 点半自动开始工作,而我只需要将自己和咖啡拖到我的桌子上就可以开始工作了。按下电源按钮看起来好像并不是什么大事,但是在每天的那个时候每件小事都会变得很大。
+
+唤醒 Linux 计算机可能不如关闭它可靠,因此你可能需要尝试不同的办法。你可以使用远程唤醒(Wake-On-LAN)、RTC 唤醒或者个人电脑的 BIOS 设置预定的唤醒这些方式。这些方式可行的原因是,当你关闭电脑时,这并不是真正关闭了计算机;此时计算机处在极低功耗状态且还可以接受和响应信号。只有在你拔掉电源开关时其才彻底关闭。
+
+### BIOS 唤醒
+
+BIOS 唤醒是最可靠的。我的系统主板 BIOS 有一个易于使用的唤醒调度程序 (图 1)。对你来说也是一样的容易。
+
+
+
+*图 1:我的系统 BIOS 有个易用的唤醒定时器。*
+
+### 主机远程唤醒(Wake-On-LAN)
+
+远程唤醒是仅次于 BIOS 唤醒的又一种可靠的唤醒方法。这需要你从第二台计算机发送信号到所要打开的计算机。可以使用 Arduino 或树莓派发送给基于 Linux 的路由器或者任何 Linux 计算机的唤醒信号。首先,查看系统主板 BIOS 是否支持 Wake-On-LAN ,要是支持的话,必须先启动它,因为它被默认为禁用。
+
+然后,需要一个支持 Wake-On-LAN 的网卡;无线网卡并不支持。你需要运行 `ethtool` 命令查看网卡是否支持 Wake-On-LAN :
+
+```
+# ethtool eth0 | grep -i wake-on
+ Supports Wake-on: pumbg
+ Wake-on: g
+```
+
+这条命令输出的 “Supports Wake-on” 字段会告诉你你的网卡现在开启了哪些功能:
+
+* d -- 禁用
+* p -- 物理活动唤醒
+* u -- 单播消息唤醒
+* m -- 多播(组播)消息唤醒
+* b -- 广播消息唤醒
+* a -- ARP 唤醒
+* g -- 特定数据包唤醒
+* s -- 设有密码的特定数据包唤醒
+
+`ethtool` 命令的 man 手册并没说清楚 `p` 选项的作用;这表明任何信号都会导致唤醒。然而,在我的测试中它并没有这么做。想要实现远程唤醒主机,必须支持的功能是 `g` —— 特定数据包唤醒,而且下面的“Wake-on” 行显示这个功能已经在启用了。如果它没有被启用,你可以通过 `ethtool` 命令来启用它。
+
+```
+# ethtool -s eth0 wol g
+```
+
+这条命令可能会在重启后失效,所以为了确保万无一失,你可以创建个 root 用户的定时任务(cron)在每次重启的时候来执行这条命令。
+
+```
+@reboot /usr/bin/ethtool -s eth0 wol g
+```
+
+另一个选择是最近的网络管理器版本有一个很好的小复选框来启用 Wake-On-LAN(图 2)。
+
+
+
+*图 2:启用 Wake on LAN*
+
+这里有一个可以用于设置密码的地方,但是如果你的网络接口不支持安全开机密码,它就不起作用。
+
+现在你需要配置第二台计算机来发送唤醒信号。你并不需要 root 权限,所以你可以为你的普通用户创建 cron 任务。你需要用到的是想要唤醒的机器的网络接口和MAC地址信息。
+
+```
+30 08 * * * /usr/bin/wakeonlan D0:50:99:82:E7:2B
+```
+
+### RTC 唤醒
+
+通过使用实时闹钟来唤醒计算机是最不可靠的方法。对于这个方法,可以参看 [Wake Up Linux With an RTC Alarm Clock][4] ;对于现在的大多数发行版来说这种方法已经有点过时了。
+
+下周继续了解更多关于使用 RTC 唤醒的方法。
+
+通过 Linux 基金会和 edX 可以学习更多关于 Linux 的免费 [Linux 入门][5]教程。
+
+(题图:[The Observatory at Delhi][7])
+
+--------------------------------------------------------------------------------
+
+via:https://www.linux.com/learn/intro-to-linux/2017/11/wake-and-shut-down-linux-automatically
+
+作者:[Carla Schroder][a]
+译者:[HardworkFish](https://github.com/HardworkFish)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://www.linux.com/users/cschroder
+[1]:https://www.linux.com/files/images/bannerjpg
+[2]:https://www.linux.com/files/images/fig-1png-11
+[3]:https://www.linux.com/files/images/fig-2png-7
+[4]:https://www.linux.com/learn/wake-linux-rtc-alarm-clock
+[5]:https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
+[6]:https://www.linux.com/licenses/category/creative-commons-attribution
+[7]:http://www.columbia.edu/itc/mealac/pritchett/00routesdata/1700_1799/jaipur/delhijantarearly/delhijantarearly.html
+[8]:https://www.linux.com/licenses/category/used-permission
+[9]:https://www.linux.com/licenses/category/used-permission
+
diff --git a/sources/tech/20171005 How to manage Linux containers with Ansible Container.md b/sources/tech/20171005 How to manage Linux containers with Ansible Container.md
deleted file mode 100644
index 0f200d73a8..0000000000
--- a/sources/tech/20171005 How to manage Linux containers with Ansible Container.md
+++ /dev/null
@@ -1,114 +0,0 @@
-Translating by qhwdw How to manage Linux containers with Ansible Container
-============================================================
-
-### Ansible Container addresses Dockerfile shortcomings and offers complete management for containerized projects.
-
-
-Image by : opensource.com
-
-I love containers and use the technology every day. Even so, containers aren't perfect. Over the past couple of months, however, a set of projects has emerged that addresses some of the problems I've experienced.
-
-I started using containers with [Docker][11], since this project made the technology so popular. Aside from using the container engine, I learned how to use **[docker-compose][6]** and started managing my projects with it. My productivity skyrocketed! One command to run my project, no matter how complex it was. I was so happy.
-
-After some time, I started noticing issues. The most apparent were related to the process of creating container images. The Docker tool uses a custom file format as a recipe to produce container images—Dockerfiles. This format is easy to learn, and after a short time you are ready to produce container images on your own. The problems arise once you want to master best practices or have complex scenarios in mind.
-
-More on Ansible
-
-* [How Ansible works][1]
-
-* [Free Ansible eBooks][2]
-
-* [Ansible quick start video][3]
-
-* [Download and install Ansible][4]
-
-Let's take a break and travel to a different land: the world of [Ansible][22]. You know it? It's awesome, right? You don't? Well, it's time to learn something new. Ansible is a project that allows you to manage your infrastructure by writing tasks and executing them inside environments of your choice. No need to install and set up any services; everything can easily run from your laptop. Many people already embrace Ansible.
-
-Imagine this scenario: You invested in Ansible, you wrote plenty of Ansible roles and playbooks that you use to manage your infrastructure, and you are thinking about investing in containers. What should you do? Start writing container image definitions via shell scripts and Dockerfiles? That doesn't sound right.
-
-Some people from the Ansible development team asked this question and realized that those same Ansible roles and playbooks that people wrote and use daily can also be used to produce container images. But not just that—they can be used to manage the complete lifecycle of containerized projects. From these ideas, the [Ansible Container][12] project was born. It utilizes existing Ansible roles that can be turned into container images and can even be used for the complete application lifecycle, from build to deploy in production.
-
-Let's talk about the problems I mentioned regarding best practices in context of Dockerfiles. A word of warning: This is going to be very specific and technical. Here are the top three issues I have:
-
-### 1\. Shell scripts embedded in Dockerfiles.
-
-When writing Dockerfiles, you can specify a script that will be interpreted via **/bin/sh -c**. It can be something like:
-
-```
-RUN dnf install -y nginx
-```
-
-where RUN is a Dockerfile instruction and the rest are its arguments (which are passed to shell). But imagine a more complex scenario:
-
-```
-RUN set -eux; \
- \
-# this "case" statement is generated via "update.sh"
- %%ARCH-CASE%%; \
- \
- url="https://golang.org/dl/go${GOLANG_VERSION}.${goRelArch}.tar.gz"; \
- wget -O go.tgz "$url"; \
- echo "${goRelSha256} *go.tgz" | sha256sum -c -; \
-```
-
-This one is taken from [the official golang image][13]. It doesn't look pretty, right?
-
-### 2\. You can't parse Dockerfiles easily.
-
-Dockerfiles are a new format without a formal specification. This is tricky if you need to process Dockerfiles in your infrastructure (e.g., automate the build process a bit). The only specification is [the code][14] that is part of **dockerd**. The problem is that you can't use it as a library. The easiest solution is to write a parser on your own and hope for the best. Wouldn't it be better to use some well-known markup language, such as YAML or JSON?
-
-### 3\. It's hard to control.
-
-If you are familiar with the internals of container images, you may know that every image is composed of layers. Once the container is created, the layers are stacked onto each other (like pancakes) using union filesystem technology. The problem is, that you cannot explicitly control this layering—you can't say, "here starts a new layer." You are forced to change your Dockerfile in a way that may hurt readability. The bigger problem is that a set of best practices has to be followed to achieve optimal results—newcomers have a really hard time here.
-
-### Comparing Ansible language and Dockerfiles
-
-The biggest shortcoming of Dockerfiles in comparison to Ansible is that Ansible, as a language, is much more powerful. For example, Dockerfiles have no direct concept of variables, whereas Ansible has a complete templating system (variables are just one of its features). Ansible contains a large number of modules that can be easily utilized, such as [**wait_for**][15], which can be used for service readiness checks—e.g., wait until a service is ready before proceeding. With Dockerfiles, everything is a shell script. So if you need to figure out service readiness, it has to be done with shell (or installed separately). The other problem with shell scripts is that, with growing complexity, maintenance becomes a burden. Plenty of people have already figured this out and turned those shell scripts into Ansible.
-
-If you are interested in this topic and would like to know more, please come to [Open Source Summit][16] in Prague to see [my presentation][17] on Monday, Oct. 23, at 4:20 p.m. in Palmovka room.
-
- _Learn more in Tomas Tomecek's talk, [From Dockerfiles to Ansible Container][7], at [Open Source Summit EU][8], which will be held October 23-26 in Prague._
-
-
-
-### About the author
-
- [][18] Tomas Tomecek - Engineer. Hacker. Speaker. Tinker. Red Hatter. Likes containers, linux, open source, python 3, rust, zsh, tmux.[More about me][9]
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/17/10/dockerfiles-ansible-container
-
-作者:[Tomas Tomecek ][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/tomastomecek
-[1]:https://www.ansible.com/how-ansible-works?intcmp=701f2000000h4RcAAI
-[2]:https://www.ansible.com/ebooks?intcmp=701f2000000h4RcAAI
-[3]:https://www.ansible.com/quick-start-video?intcmp=701f2000000h4RcAAI
-[4]:https://docs.ansible.com/ansible/latest/intro_installation.html?intcmp=701f2000000h4RcAAI
-[5]:https://opensource.com/article/17/10/dockerfiles-ansible-container?imm_mid=0f9013&cmp=em-webops-na-na-newsltr_20171201&rate=Wiw_0D6PK_CAjqatYu_YQH0t1sNHEF6q09_9u3sYkCY
-[6]:https://github.com/docker/compose
-[7]:http://sched.co/BxIW
-[8]:http://events.linuxfoundation.org/events/open-source-summit-europe
-[9]:https://opensource.com/users/tomastomecek
-[10]:https://opensource.com/user/175651/feed
-[11]:https://opensource.com/tags/docker
-[12]:https://www.ansible.com/ansible-container
-[13]:https://github.com/docker-library/golang/blob/master/Dockerfile-debian.template#L14
-[14]:https://github.com/moby/moby/tree/master/builder/dockerfile
-[15]:http://docs.ansible.com/wait_for_module.html
-[16]:http://events.linuxfoundation.org/events/open-source-summit-europe
-[17]:http://events.linuxfoundation.org/events/open-source-summit-europe/program/schedule
-[18]:https://opensource.com/users/tomastomecek
-[19]:https://opensource.com/users/tomastomecek
-[20]:https://opensource.com/users/tomastomecek
-[21]:https://opensource.com/article/17/10/dockerfiles-ansible-container?imm_mid=0f9013&cmp=em-webops-na-na-newsltr_20171201#comments
-[22]:https://opensource.com/tags/ansible
-[23]:https://opensource.com/tags/containers
-[24]:https://opensource.com/tags/ansible
-[25]:https://opensource.com/tags/docker
-[26]:https://opensource.com/tags/open-source-summit
diff --git a/sources/tech/20171005 Reasons Kubernetes is cool.md b/sources/tech/20171005 Reasons Kubernetes is cool.md
index a9d10b9cdb..e1e63e77e8 100644
--- a/sources/tech/20171005 Reasons Kubernetes is cool.md
+++ b/sources/tech/20171005 Reasons Kubernetes is cool.md
@@ -1,3 +1,4 @@
+Translating by qhwdw
Reasons Kubernetes is cool
============================================================
diff --git a/sources/tech/20171112 Love Your Bugs.md b/sources/tech/20171112 Love Your Bugs.md
index bf79f27cf7..0404875a25 100644
--- a/sources/tech/20171112 Love Your Bugs.md
+++ b/sources/tech/20171112 Love Your Bugs.md
@@ -1,3 +1,5 @@
+yixunx translating
+
Love Your Bugs
============================================================
diff --git a/sources/tech/20171113 Glitch write fun small web projects instantly.md b/sources/tech/20171113 Glitch write fun small web projects instantly.md
deleted file mode 100644
index 734853ce51..0000000000
--- a/sources/tech/20171113 Glitch write fun small web projects instantly.md
+++ /dev/null
@@ -1,76 +0,0 @@
-translating---geekpi
-
-Glitch: write fun small web projects instantly
-============================================================
-
-I just wrote about Jupyter Notebooks which are a fun interactive way to write Python code. That reminded me I learned about Glitch recently, which I also love!! I built a small app to [turn of twitter retweets][2] with it. So!
-
-[Glitch][3] is an easy way to make Javascript webapps. (javascript backend, javascript frontend)
-
-The fun thing about glitch is:
-
-1. you start typing Javascript code into their web interface
-
-2. as soon as you type something, it automagically reloads the backend of your website with the new code. You don’t even have to save!! It autosaves.
-
-So it’s like Heroku, but even more magical!! Coding like this (you type, and the code runs on the public internet immediately) just feels really **fun** to me.
-
-It’s kind of like sshing into a server and editing PHP/HTML code on your server and having it instantly available, which I kind of also loved. Now we have “better deployment practices” than “just edit the code and it is instantly on the internet” but we are not talking about Serious Development Practices, we are talking about writing tiny programs for fun.
-
-### glitch has awesome example apps
-
-Glitch seems like fun nice way to learn programming!
-
-For example, there’s a space invaders game (code by [Mary Rose Cook][4]) at [https://space-invaders.glitch.me/][5]. The thing I love about this is that in just a few clicks I can
-
-1. click “remix this”
-
-2. start editing the code to make the boxes orange instead of black
-
-3. have my own space invaders game!! Mine is at [http://julias-space-invaders.glitch.me/][1]. (i just made very tiny edits to make it orange, nothing fancy)
-
-They have tons of example apps that you can start from – for instance [bots][6], [games][7], and more.
-
-### awesome actually useful app: tweetstorms
-
-The way I learned about Glitch was from this app which shows you tweetstorms from a given user: [https://tweetstorms.glitch.me/][8].
-
-For example, you can see [@sarahmei][9]’s tweetstorms at [https://tweetstorms.glitch.me/sarahmei][10] (she tweets a lot of good tweetstorms!).
-
-### my glitch app: turn off retweets
-
-When I learned about Glitch I wanted to turn off retweets for everyone I follow on Twitter (I know you can do it in Tweetdeck!) and doing it manually was a pain – I had to do it one person at a time. So I wrote a tiny Glitch app to do it for me!
-
-I liked that I didn’t have to set up a local development environment, I could just start typing and go!
-
-Glitch only supports Javascript and I don’t really know Javascript that well (I think I’ve never written a Node program before), so the code isn’t awesome. But I had a really good time writing it – being able to type and just see my code running instantly was delightful. Here it is: [https://turn-off-retweets.glitch.me/][11].
-
-### that’s all!
-
-Using Glitch feels really fun and democratic. Usually if I want to fork someone’s web project and make changes I wouldn’t do it – I’d have to fork it, figure out hosting, set up a local dev environment or Heroku or whatever, install the dependencies, etc. I think tasks like installing node.js dependencies used to be interesting, like “cool i am learning something new” and now I just find them tedious.
-
-So I love being able to just click “remix this!” and have my version on the internet instantly.
-
-
---------------------------------------------------------------------------------
-
-via: https://jvns.ca/blog/2017/11/13/glitch--write-small-web-projects-easily/
-
-作者:[Julia Evans ][a]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://jvns.ca/
-[1]:http://julias-space-invaders.glitch.me/
-[2]:https://turn-off-retweets.glitch.me/
-[3]:https://glitch.com/
-[4]:https://maryrosecook.com/
-[5]:https://space-invaders.glitch.me/
-[6]:https://glitch.com/handy-bots
-[7]:https://glitch.com/games
-[8]:https://tweetstorms.glitch.me/
-[9]:https://twitter.com/sarahmei
-[10]:https://tweetstorms.glitch.me/sarahmei
-[11]:https://turn-off-retweets.glitch.me/
diff --git a/sources/tech/20171120 Mark McIntyre How Do You Fedora.md b/sources/tech/20171120 Mark McIntyre How Do You Fedora.md
deleted file mode 100644
index bfd19e1eda..0000000000
--- a/sources/tech/20171120 Mark McIntyre How Do You Fedora.md
+++ /dev/null
@@ -1,75 +0,0 @@
-translating by zrszrszrs
-# [Mark McIntyre: How Do You Fedora?][1]
-
-
-
-
-We recently interviewed Mark McIntyre on how he uses Fedora. This is [part of a series][2] on the Fedora Magazine. The series profiles Fedora users and how they use Fedora to get things done. Contact us on the [feedback form][3] to express your interest in becoming a interviewee.
-
-### Who is Mark McIntyre?
-
-Mark McIntyre is a geek by birth and Linux by choice. “I started coding at the early age of 13 learning BASIC on my own and finding the excitement of programming which led me down a path of becoming a professional coder,” he says. McIntyre and his niece are big fans of pizza. “My niece and I started a quest last fall to try as many of the pizza joints in Knoxville. You can read about our progress at [https://knox-pizza-quest.blogspot.com/][4]” Mark is also an amateur photographer and [publishes his images][5] on Flickr.
-
-
-
-Mark has a diverse background as a developer. He has worked with Visual Basic for Applications, LotusScript, Oracle’s PL/SQL, Tcl/Tk and Python with Django as the framework. His strongest skill is Python which he uses in his current job as a systems engineer. “I am using Python on a regular basis. As my job is morphing into more of an automation engineer, that became more frequent.”
-
-McIntyre is a self-described nerd and loves sci-fi movies, but his favorite movie falls out of that genre. “As much as I am a nerd and love the Star Trek and Star Wars and related movies, the movie Glory is probably my favorite of all time.” He also mentioned that Serenity was a fantastic follow-up to a great TV series.
-
-Mark values humility, knowledge and graciousness in others. He appreciates people who act based on understanding the situation that other people are in. “If you add a decision to serve another, you have the basis for someone you’d want to be around instead of someone who you have to tolerate.”
-
-McIntyre works for [Scripps Networks Interactive][6], which is the parent company for HGTV, Food Network, Travel Channel, DIY, GAC, and several other cable channels. “Currently, I function as a systems engineer for the non-linear video content, which is all the media purposed for online consumption.” He supports a few development teams who write applications to publish the linear video from cable TV into the online formats such as Amazon and Hulu. The systems include both on-premise and cloud systems. Mark also develops automation tools for deploying these applications primarily to a cloud infrastructure.
-
-### The Fedora community
-
-Mark describes the Fedora community as an active community filled with people who enjoy life as Fedora users. “From designers to packagers, this group is still very active and feels alive.” McIntyre continues, “That gives me a sense of confidence in the operating system.”
-
-He started frequenting the #fedora channel on IRC around 2002: “Back then, Wi-Fi functionality was still done a lot by hand in starting the adapter and configuring the modules.” In order to get his Wi-Fi working he had to recompile the Fedora kernel. Shortly after, he started helping others in the #fedora channel.
-
-McIntyre encourages others to get involved in the Fedora Community. “There are many different areas of opportunity in which to be involved. Front-end design, testing deployments, development, packaging of applications, and new technology implementation.” He recommends picking an area of interest and asking questions of that group. “There are many opportunities available to jump in to contribute.”
-
-He credits a fellow community member with helping him get started: “Ben Williams was very helpful in my first encounters with Fedora, helping me with some of my first installation rough patches in the #fedora support channel.” Ben also encouraged Mark to become an [Ambassador][7].
-
-### What hardware and software?
-
-McIntyre uses Fedora Linux on all his laptops and desktops. On servers he chooses CentOS, due to the longer support lifecycle. His current desktop is self-built and equipped with an Intel Core i5 processor, 32 GB of RAM and 2 TB of disk space. “I have a 4K monitor attached which gives me plenty of room for viewing all my applications at once.” His current work laptop is a Dell Inspiron 2-in-1 13-inch laptop with 16 GB RAM and a 525 GB m.2 SSD.
-
-
-
-Mark currently runs Fedora 26 on any box he setup in the past few months. When it comes to new versions he likes to avoid the rush when the version is officially released. “I usually try to get the latest version as soon as it goes gold, with the exception of one of my workstations running the next version’s beta when it is closer to release.” He usually upgrades in place: “The in-place upgrade using _dnf system-upgrade_ works very well these days.”
-
-To handle his photography, McIntyre uses [GIMP][8] and [Darktable][9], along with a few other photo viewing and quick editing packages. When not using web-based email, he uses [Geary][10] along with [GNOME Calendar][11]. Mark’s IRC client of choice is [HexChat][12] connecting to a [ZNC bouncer][13]running on a Fedora Server instance. His department’s communication is handled via Slack.
-
-“I have never really been a big IDE fan, so I spend time in [vim][14] for most of my editing.” Occasionally, he opens up a simple text editor like [gedit][15] or [xed][16]. Mark uses [GPaste][17] for copying and pasting. “I have become a big fan of [Tilix][18] for my terminal choice.” McIntyre manages the podcasts he likes with [Rhythmbox][19], and uses [Epiphany][20] for quick web lookups.
-
---------------------------------------------------------------------------------
-
-via: https://fedoramagazine.org/mark-mcintyre-fedora/
-
-作者:[Charles Profitt][a]
-译者:[译者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/cprofitt/
-[1]:https://fedoramagazine.org/mark-mcintyre-fedora/
-[2]:https://fedoramagazine.org/tag/how-do-you-fedora/
-[3]:https://fedoramagazine.org/submit-an-idea-or-tip/
-[4]:https://knox-pizza-quest.blogspot.com/
-[5]:https://www.flickr.com/photos/mockgeek/
-[6]:http://www.scrippsnetworksinteractive.com/
-[7]:https://fedoraproject.org/wiki/Ambassadors
-[8]:https://www.gimp.org/
-[9]:http://www.darktable.org/
-[10]:https://wiki.gnome.org/Apps/Geary
-[11]:https://wiki.gnome.org/Apps/Calendar
-[12]:https://hexchat.github.io/
-[13]:https://wiki.znc.in/ZNC
-[14]:http://www.vim.org/
-[15]:https://wiki.gnome.org/Apps/Gedit
-[16]:https://github.com/linuxmint/xed
-[17]:https://github.com/Keruspe/GPaste
-[18]:https://fedoramagazine.org/try-tilix-new-terminal-emulator-fedora/
-[19]:https://wiki.gnome.org/Apps/Rhythmbox
-[20]:https://wiki.gnome.org/Apps/Web
diff --git a/sources/tech/20171129 5 best practices for getting started with DevOps.md b/sources/tech/20171129 5 best practices for getting started with DevOps.md
deleted file mode 100644
index 7694180c14..0000000000
--- a/sources/tech/20171129 5 best practices for getting started with DevOps.md
+++ /dev/null
@@ -1,95 +0,0 @@
-translating---aiwhj
-5 best practices for getting started with DevOps
-============================================================
-
-### Are you ready to implement DevOps, but don't know where to begin? Try these five best practices.
-
-
-
-Image by :
-
-[Andrew Magill][8]. Modified by Opensource.com. [CC BY 4.0][9]
-
-DevOps often stymies early adopters with its ambiguity, not to mention its depth and breadth. By the time someone buys into the idea of DevOps, their first questions usually are: "How do I get started?" and "How do I measure success?" These five best practices are a great road map to starting your DevOps journey.
-
-### 1\. Measure all the things
-
-You don't know for sure that your efforts are even making things better unless you can quantify the outcomes. Are my features getting out to customers more rapidly? Are fewer defects escaping to them? Are we responding to and recovering more quickly from failure?
-
-Before you change anything, think about what kinds of outcomes you expect from your DevOps transformation. When you're further into your DevOps journey, you'll enjoy a rich array of near-real-time reports on everything about your service. But consider starting with these two metrics:
-
-* **Time to market** measures the end-to-end, often customer-facing, business experience. It usually begins when a feature is formally conceived and ends when the customer can consume the feature in production. Time to market is not mainly an engineering team metric; more importantly it shows your business' complete end-to-end efficiency in bringing valuable new features to market and isolates opportunities for system-wide improvement.
-
-* **Cycle time** measures the engineering team process. Once work on a new feature starts, when does it become available in production? This metric is very useful for understanding the efficiency of the engineering team and isolating opportunities for team-level improvement.
-
-### 2\. Get your process off the ground
-
-DevOps success requires an organization to put a regular (and hopefully effective) process in place and relentlessly improve upon it. It doesn't have to start out being effective, but it must be a regular process. Usually that it's some flavor of agile methodology like Scrum or Scrumban; sometimes it's a Lean derivative. Whichever way you go, pick a formal process, start using it, and get the basics right.
-
-Regular inspect-and-adapt behaviors are key to your DevOps success. Make good use of opportunities like the stakeholder demo, team retrospectives, and daily standups to find opportunities to improve your process.
-
-A lot of your DevOps success hinges on people working effectively together. People on a team need to work from a common process that they are empowered to improve upon. They also need regular opportunities to share what they are learning with other stakeholders, both upstream and downstream, in the process.
-
-Good process discipline will help your organization consume the other benefits of DevOps at the great speed that comes as your success builds.
-
-Although it's common for more development-oriented teams to successfully adopt processes like Scrum, operations-focused teams (or others that are more interrupt-driven) may opt for a process with a more near-term commitment horizon, such as Kanban.
-
-### 3\. Visualize your end-to-end workflow
-
-There is tremendous power in being able to see who's working on what part of your service at any given time. Visualizing your workflow will help people know what they need to work on next, how much work is in progress, and where the bottlenecks are in the process.
-
-You can't effectively limit work in process until you can see it and quantify it. Likewise, you can't effectively eliminate bottlenecks until you can clearly see them.
-
-Visualizing the entire workflow will help people in all parts of the organization understand how their work contributes to the success of the whole. It can catalyze relationship-building across organizational boundaries to help your teams collaborate more effectively towards a shared sense of success.
-
-### 4\. Continuous all the things
-
-DevOps promises a dizzying array of compelling automation. But Rome wasn't built in a day. One of the first areas you can focus your efforts on is [continuous integration][10] (CI). But don't stop there; you'll want to follow quickly with [continuous delivery][11] (CD) and eventually continuous deployment.
-
-Your CD pipeline is your opportunity to inject all manner of automated quality testing into your process. The moment new code is committed, your CD pipeline should run a battery of tests against the code and the successfully built artifact. The artifact that comes out at the end of this gauntlet is what progresses along your process until eventually it's seen by customers in production.
-
-Another "continuous" that doesn't get enough attention is continuous improvement. That's as simple as setting some time aside each day to ask your colleagues: "What small thing can we do today to get better at how we do our work?" These small, daily changes compound over time into more profound results. You'll be pleasantly surprised! But it also gets people thinking all the time about how to improve things.
-
-### 5\. Gherkinize
-
-Fostering more effective communication across your organization is crucial to fostering the sort of systems thinking prevalent in successful DevOps journeys. One way to help that along is to use a shared language between the business and the engineers to express the desired acceptance criteria for new features. A good product manager can learn [Gherkin][12] in a day and begin using it to express acceptance criteria in an unambiguous, structured form of plain English. Engineers can use this Gherkinized acceptance criteria to write acceptance tests against the criteria, and then develop their feature code until the tests pass. This is a simplification of [acceptance test-driven development][13](ATDD) that can also help kick start your DevOps culture and engineering practice.
-
-### Start on your journey
-
-Don't be discouraged by getting started with your DevOps practice. It's a journey. And hopefully these five ideas give you solid ways to get started.
-
-
-### About the author
-
- [][14]
-
- Magnus Hedemark - Magnus has been in the IT industry for over 20 years, and a technology enthusiast for most of his life. He's presently Manager of DevOps Engineering at UnitedHealth Group. In his spare time, Magnus enjoys photography and paddling canoes.
-
---------------------------------------------------------------------------------
-
-via: https://opensource.com/article/17/11/5-keys-get-started-devops
-
-作者:[Magnus Hedemark ][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/magnus919
-[1]:https://opensource.com/tags/devops?src=devops_resource_menu1
-[2]:https://opensource.com/resources/devops?src=devops_resource_menu2
-[3]:https://www.openshift.com/promotions/devops-with-openshift.html?intcmp=7016000000127cYAAQ&src=devops_resource_menu3
-[4]:https://enterprisersproject.com/article/2017/5/9-key-phrases-devops?intcmp=7016000000127cYAAQ&src=devops_resource_menu4
-[5]:https://www.redhat.com/en/insights/devops?intcmp=7016000000127cYAAQ&src=devops_resource_menu5
-[6]:https://opensource.com/article/17/11/5-keys-get-started-devops?rate=oEOzMXx1ghbkfl2a5ae6AnvO88iZ3wzkk53K2CzbDWI
-[7]:https://opensource.com/user/25739/feed
-[8]:https://ccsearch.creativecommons.org/image/detail/7qRx_yrcN5isTMS0u9iKMA==
-[9]:https://creativecommons.org/licenses/by-sa/4.0/
-[10]:https://martinfowler.com/articles/continuousIntegration.html
-[11]:https://martinfowler.com/bliki/ContinuousDelivery.html
-[12]:https://cucumber.io/docs/reference
-[13]:https://en.wikipedia.org/wiki/Acceptance_test%E2%80%93driven_development
-[14]:https://opensource.com/users/magnus919
-[15]:https://opensource.com/users/magnus919
-[16]:https://opensource.com/users/magnus919
-[17]:https://opensource.com/tags/devops
diff --git a/sources/tech/20171129 Someone Tries to Bring Back Ubuntus Unity from the Dead as an Official Spin.md b/sources/tech/20171129 Someone Tries to Bring Back Ubuntus Unity from the Dead as an Official Spin.md
index 0e38373c3f..d50a3cdfc5 100644
--- a/sources/tech/20171129 Someone Tries to Bring Back Ubuntus Unity from the Dead as an Official Spin.md
+++ b/sources/tech/20171129 Someone Tries to Bring Back Ubuntus Unity from the Dead as an Official Spin.md
@@ -1,3 +1,5 @@
+translating---geekpi
+
Someone Tries to Bring Back Ubuntu's Unity from the Dead as an Official Spin
============================================================
diff --git a/sources/tech/20171130 Undistract-me : Get Notification When Long Running Terminal Commands Complete.md b/sources/tech/20171130 Undistract-me : Get Notification When Long Running Terminal Commands Complete.md
deleted file mode 100644
index 46afe9b893..0000000000
--- a/sources/tech/20171130 Undistract-me : Get Notification When Long Running Terminal Commands Complete.md
+++ /dev/null
@@ -1,156 +0,0 @@
-translating---geekpi
-
-Undistract-me : Get Notification When Long Running Terminal Commands Complete
-============================================================
-
-by [sk][2] · November 30, 2017
-
-
-
-A while ago, we published how to [get notification when a Terminal activity is done][3]. Today, I found out a similar utility called “undistract-me” that notifies you when long running terminal commands complete. Picture this scenario. You run a command that takes a while to finish. In the mean time, you check your facebook and get so involved in it. After a while, you remembered that you ran a command few minutes ago. You go back to the Terminal and notice that the command has already finished. But you have no idea when the command is completed. Have you ever been in this situation? I bet most of you were in this situation many times. This is where “undistract-me” comes in help. You don’t need to constantly check the terminal to see if a command is completed or not. Undistract-me utility will notify you when a long running command is completed. It will work on Arch Linux, Debian, Ubuntu and other Ubuntu-derivatives.
-
-#### Installing Undistract-me
-
-Undistract-me is available in the default repositories of Debian and its variants such as Ubuntu. All you have to do is to run the following command to install it.
-
-```
-sudo apt-get install undistract-me
-```
-
-The Arch Linux users can install it from AUR using any helper programs.
-
-Using [Pacaur][4]:
-
-```
-pacaur -S undistract-me-git
-```
-
-Using [Packer][5]:
-
-```
-packer -S undistract-me-git
-```
-
-Using [Yaourt][6]:
-
-```
-yaourt -S undistract-me-git
-```
-
-Then, run the following command to add “undistract-me” to your Bash.
-
-```
-echo 'source /etc/profile.d/undistract-me.sh' >> ~/.bashrc
-```
-
-Alternatively you can run this command to add it to your Bash:
-
-```
-echo "source /usr/share/undistract-me/long-running.bash\nnotify_when_long_running_commands_finish_install" >> .bashrc
-```
-
-If you are in Zsh shell, run this command:
-
-```
-echo "source /usr/share/undistract-me/long-running.bash\nnotify_when_long_running_commands_finish_install" >> .zshrc
-```
-
-Finally update the changes:
-
-For Bash:
-
-```
-source ~/.bashrc
-```
-
-For Zsh:
-
-```
-source ~/.zshrc
-```
-
-#### Configure Undistract-me
-
-By default, Undistract-me will consider any command that takes more than 10 seconds to complete as a long-running command. You can change this time interval by editing /usr/share/undistract-me/long-running.bash file.
-
-```
-sudo nano /usr/share/undistract-me/long-running.bash
-```
-
-Find “LONG_RUNNING_COMMAND_TIMEOUT” variable and change the default value (10 seconds) to something else of your choice.
-
- [][7]
-
-Save and close the file. Do not forget to update the changes:
-
-```
-source ~/.bashrc
-```
-
-Also, you can disable notifications for particular commands. To do so, find the “LONG_RUNNING_IGNORE_LIST” variable and add the commands space-separated like below.
-
-By default, the notification will only show if the active window is not the window the command is running in. That means, it will notify you only if the command is running in the background Terminal window. If the command is running in active window Terminal, you will not be notified. If you want undistract-me to send notifications either the Terminal window is visible or in the background, you can set IGNORE_WINDOW_CHECK to 1 to skip the window check.
-
-The other cool feature of Undistract-me is you can set audio notification along with visual notification when a command is done. By default, it will only send a visual notification. You can change this behavior by setting the variable UDM_PLAY_SOUND to a non-zero integer on the command line. However, your Ubuntu system should have pulseaudio-utils and sound-theme-freedesktop utilities installed to enable this functionality.
-
-Please remember that you need to run the following command to update the changes made.
-
-For Bash:
-
-```
-source ~/.bashrc
-```
-
-For Zsh:
-
-```
-source ~/.zshrc
-```
-
-It is time to verify if this really works.
-
-#### Get Notification When Long Running Terminal Commands Complete
-
-Now, run any command that takes longer than 10 seconds or the time duration you defined in Undistract-me script.
-
-I ran the following command on my Arch Linux desktop.
-
-```
-sudo pacman -Sy
-```
-
-This command took 32 seconds to complete. After the completion of the above command, I got the following notification.
-
- [][8]
-
-Please remember Undistract-me script notifies you only if the given command took more than 10 seconds to complete. If the command is completed in less than 10 seconds, you will not be notified. Of course, you can change this time interval settings as I described in the Configuration section above.
-
-I find this tool very useful. It helped me to get back to the business after I completely lost in some other tasks. I hope this tool will be helpful to you too.
-
-More good stuffs to come. Stay tuned!
-
-Cheers!
-
-Resource:
-
-* [Undistract-me GitHub Repository][1]
-
---------------------------------------------------------------------------------
-
-via: https://www.ostechnix.com/undistract-get-notification-long-running-terminal-commands-complete/
-
-作者:[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://github.com/jml/undistract-me
-[2]:https://www.ostechnix.com/author/sk/
-[3]:https://www.ostechnix.com/get-notification-terminal-task-done/
-[4]:https://www.ostechnix.com/install-pacaur-arch-linux/
-[5]:https://www.ostechnix.com/install-packer-arch-linux-2/
-[6]:https://www.ostechnix.com/install-yaourt-arch-linux/
-[7]:http://www.ostechnix.com/wp-content/uploads/2017/11/undistract-me-1.png
-[8]:http://www.ostechnix.com/wp-content/uploads/2017/11/undistract-me-2.png
diff --git a/sources/tech/20171201 Fedora Classroom Session: Ansible 101.md b/sources/tech/20171201 Fedora Classroom Session: Ansible 101.md
deleted file mode 100644
index a74b196663..0000000000
--- a/sources/tech/20171201 Fedora Classroom Session: Ansible 101.md
+++ /dev/null
@@ -1,71 +0,0 @@
-### [Fedora Classroom Session: Ansible 101][2]
-
-### By Sachin S Kamath
-
-
-
-Fedora Classroom sessions continue this week with an Ansible session. The general schedule for sessions appears [on the wiki][3]. You can also find [resources and recordings from previous sessions][4] there. Here are details about this week’s session on [Thursday, 30th November at 1600 UTC][5]. That link allows you to convert the time to your timezone.
-
-### Topic: Ansible 101
-
-As the Ansible [documentation][6] explains, Ansible is an IT automation tool. It’s primarily used to configure systems, deploy software, and orchestrate more advanced IT tasks. Examples include continuous deployments or zero downtime rolling updates.
-
-This Classroom session covers the topics listed below:
-
-1. Introduction to SSH
-
-2. Understanding different terminologies
-
-3. Introduction to Ansible
-
-4. Ansible installation and setup
-
-5. Establishing password-less connection
-
-6. Ad-hoc commands
-
-7. Managing inventory
-
-8. Playbooks examples
-
-There will also be a follow-up Ansible 102 session later. That session will cover complex playbooks, roles, dynamic inventory files, control flow and Galaxy.
-
-### Instructors
-
-We have two experienced instructors handling this session.
-
-[Geoffrey Marr][7], also known by his IRC name as “coremodule,” is a Red Hat employee and Fedora contributor with a background in Linux and cloud technologies. While working, he spends his time lurking in the [Fedora QA][8] wiki and test pages. Away from work, he enjoys RaspberryPi projects, especially those focusing on software-defined radio.
-
-[Vipul Siddharth][9] is an intern at Red Hat who also works on Fedora. He loves to contribute to open source and seeks opportunities to spread the word of free and open source software.
-
-### Joining the session
-
-This session takes place on [BlueJeans][10]. The following information will help you join the session:
-
-* URL: [https://bluejeans.com/3466040121][1]
-
-* Meeting ID (for Desktop App): 3466040121
-
-We hope you attend, learn from, and enjoy this session! If you have any feedback about the sessions, have ideas for a new one or want to host a session, please feel free to comment on this post or edit the [Classroom wiki page][11].
-
---------------------------------------------------------------------------------
-
-via: https://fedoramagazine.org/fedora-classroom-session-ansible-101/
-
-作者:[Sachin S Kamath]
-译者:[译者ID](https://github.com/译者ID)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[1]:https://bluejeans.com/3466040121
-[2]:https://fedoramagazine.org/fedora-classroom-session-ansible-101/
-[3]:https://fedoraproject.org/wiki/Classroom
-[4]:https://fedoraproject.org/wiki/Classroom#Previous_Sessions
-[5]:https://www.timeanddate.com/worldclock/fixedtime.html?msg=Fedora+Classroom+-+Ansible+101&iso=20171130T16&p1=%3A
-[6]:http://docs.ansible.com/ansible/latest/index.html
-[7]:https://fedoraproject.org/wiki/User:Coremodule
-[8]:https://fedoraproject.org/wiki/QA
-[9]:https://fedoraproject.org/wiki/User:Siddharthvipul1
-[10]:https://www.bluejeans.com/downloads
-[11]:https://fedoraproject.org/wiki/Classroom
diff --git a/sources/tech/20171203 Best Network Monitoring Tools For Linux.md b/sources/tech/20171203 Best Network Monitoring Tools For Linux.md
index aec39b9822..d53e4e0534 100644
--- a/sources/tech/20171203 Best Network Monitoring Tools For Linux.md
+++ b/sources/tech/20171203 Best Network Monitoring Tools For Linux.md
@@ -1,3 +1,4 @@
+Translating by qhwdw
Best Network Monitoring Tools For Linux
===============================
diff --git a/sources/tech/20171204 30 Best Linux Games On Steam You Should Play in 2017.md b/sources/tech/20171204 30 Best Linux Games On Steam You Should Play in 2017.md
deleted file mode 100644
index 7a14f92847..0000000000
--- a/sources/tech/20171204 30 Best Linux Games On Steam You Should Play in 2017.md
+++ /dev/null
@@ -1,308 +0,0 @@
-yixunx translating
-
-30 Best Linux Games On Steam You Should Play in 2017
-============================================================
-
-When it comes to Gaming, a system running on Windows platform is what anyone would recommend. It still is a superior choice for gamers with better graphics driver support and perfect hardware compatibility. But, what about the thought of [gaming on a Linux system][9]? Well, yes, of course – it is possible – maybe you thought of it at some point in time but the collection of Linux games on [Steam for Linux][10] platform wasn’t appealing at all few years back.
-
-However, that’s not true at all for the current scene. The Steam store now has a lot of great games listed for Linux platform (including a lot of major titles). So, in this article, we’ll be taking a look at the best Linux games on Steam.
-
-But before we do that, let me tell you a money saving trick. If you are an avid gamer who spends plenty of time and money on gaming, you should subscribe to Humble Monthly. This monthly subscription program from [Humble Bundle][11] gives you $100 in games for just $12 each month.
-
-Not all games might be available on Linux though but it is still a good deal because you get additional 10% discount on any games or books you buy from [Humble Bundle website][12].
-
-The best thing here is that every purchase you make supports a charity organization. So, you are not just gaming, you are also making a difference to the world.
-
-### Best Linux games on Steam
-
-The list of best Linux games on steam is in no particular ranking order.
-
-Additional Note: While there’s a lot of games available on Steam for Linux, there are still a lot of problems you would face as a Linux gamer. You can refer to one of our articles to know about the [annoying experiences every Linux gamer encounters][14].
-
-Jump Directly to your preferred genre of Games:
-
-* [Action Games][3]
-
-* [RPG Games][4]
-
-* [Racing/Sports/Simulation Games][5]
-
-* [Adventure Games][6]
-
-* [Indie Games][7]
-
-* [Strategy Games][8]
-
-### Best Action Games for Linux On Steam
-
-### 1\. Counter-Strike: Global Offensive (Multiplayer)
-
-CS GO is definitely one of the best FPS games for Linux on Steam. I don’t think this game needs an introduction but in case you are unaware of it – I must mention that it is one of the most enjoyable FPS multiplayer game you would ever play. You’ll observe CS GO is one of the games contributing a major part to the e-sports scene. To up your rank – you need to play competitive matches. In either case, you can continue playing casual matches.
-
-I could have listed Rainbow Six siege instead of Counter-Strike, but we still don’t have it for Linux/Steam OS.
-
-[CS: GO (Purchase)][15]
-
-### 2\. Left 4 Dead 2 (Multiplayer/Singleplayer)
-
-One of the most loved first-person zombie shooter multiplayer game. You may get it for as low as 1.3 USD on a Steam sale. It is an interesting game which gives you the chills and thrills you’d expect from a zombie game. The game features swamps, cities, cemetries, and a lot more environments to keep things interesting and horrific. The guns aren’t super techy but definitely provides a realistic experience considering it’s an old game.
-
-[Left 4 Dead 2 (Purchase)][16]
-
-### 3\. Borderlands 2 (Singleplayer/Co-op)
-
-Borderlands 2 is an interesting take on FPS games for PC. It isn’t anything like you experienced before. The graphics look sketchy and cartoony but that does not let you miss the real action you always look for in a first-person shooter game. You can trust me on that!
-
-If you are looking for one of the best Linux games with tons of DLC – Borderlands 2 will definitely suffice.
-
-[Borderlands 2 (Purchase)][17]
-
-### 4\. Insurgency (Multiplayer)
-
-Insurgency is yet another impressive FPS game available on Steam for Linux machines. It takes a different approach by eliminating the HUD or the ammo counter. As most of the reviewers mentioned – pure shooting game focusing on the weapon and the tactics of your team. It may not be the best FPS game – but it surely is one of them if you like – Delta Force kinda shooters along with your squad.
-
-[Insurgency (Purchase)][18]
-
-### 5\. Bioshock: Infinite (Singleplayer)
-
-Bioshock Infinite would definitely remain as one of the best singleplayer FPS games ever developed for PC. You get unrealistic powers to kill your enemies. And, so do your enemies have a lot of tricks up in the sleeves. It is a story-rich FPS game which you should not miss playing on your Linux system!
-
-[BioShock: Infinite (Purchase)][19]
-
-### 6\. HITMAN – Game of the Year Edition (Singleplayer)
-
-The Hitman series is obviously one of the most loved game series for a PC gamer. The recent iteration of HITMAN series saw an episodic release which wasn’t appreciated much but now with Square Enix gone, the GOTY edition announced with a few more additions is back to the spotlight. Make sure to get creative with your assassinations in the game Agent 47!
-
-[HITMAN (GOTY)][20]
-
-### 7\. Portal 2
-
-Portal 2 is the perfect blend of action and adventure. It is a puzzle game which lets you join co-op sessions and create interesting puzzles. The co-op mode features a completely different campaign when compared to the single player mode.
-
-[Portal 2 (Purchase)][21]
-
-### 8\. Deux Ex: Mankind Divided
-
-If you are on the lookout for a shooter game focused on stealth skills – Deux Ex would be the perfect addition to your Steam library. It is indeed a very beautiful game with some state-of-the-art weapons and crazy fighting mechanics.
-
-[Deus Ex: Mankind Divided (Purchase)][22]
-
-### 9\. Metro 2033 Redux / Metro Last Light Redux
-
-Both Metro 2033 Redux and the Last Light are the definitive editions of the classic hit Metro 2033 and Last Light. The game has a post-apocalyptic setting. You need to eliminate all the mutants in order to ensure the survival of mankind. You should explore the rest when you get to play it!
-
-[Metro 2033 Redux (Purchase)][23]
-
-[Metro Last Light Redux (Purchase)][24]
-
-### 10\. Tannenberg (Multiplayer)
-
-Tannenberg is a brand new game – announced a month before this article was published. The game is based on the Eastern Front (1914-1918) as a part of World War I. It is a multiplayer-only game. So, if you want to experience WWI gameplay experience, look no further!
-
-[Tannenberg (Purchase)][25]
-
-### Best RPG Games for Linux on Steam
-
-### 11\. Shadow of Mordor
-
-Shadow of Mordor is one of the most exciting open world RPG game you will find listed on Steam for Linux systems. You have to fight as a ranger (Talion) with the bright master (Celebrimbor) to defeat Sauron’s army (and then approach killing him). The fighting mechanics are very impressive. It is a must try game!
-
-[SOM (Purchase)][26]
-
-### 12\. Divinity: Original Sin – Enhanced Edition
-
-Divinity: Original is a kick-ass Indie-RPG game that’s unique in itself and very much enjoyable. It is probably one of the highest rated RPG games with a mixture of Adventure & Strategy. The enhanced edition includes new game modes and a complete revamp of voice-overs, controller support, co-op sessions, and so much more.
-
-[Divinity: Original Sin (Purchase)][27]
-
-### 13\. Wasteland 2: Director’s Cut
-
-Wasteland 2 is an amazing CRPG game. If Fallout 4 was to be ported down as a CRPG as well – this is what we would have expected it to be. The director’s cut edition includes a complete visual overhaul with hundred new characters.
-
-[Wasteland 2 (Purchase)][28]
-
-### 14\. Darkwood
-
-A horror-filled top-down view RPG game. You get to explore the world, scavenging materials, and craft weapons to survive.
-
-[Darkwood (Purchase)][29]
-
-### Best Racing/Sports/Simulation Games
-
-### 15\. Rocket League
-
-Rocket League is an action-packed soccer game conceptualized by rocket-powered battle cars. Not just driving the car and heading to the goal – you can even make your opponents go – kaboom!
-
-A fantastic sports-action game every gamer must have installed!
-
-[Rocket League (Purchase)][30]
-
-### 16\. Road Redemption
-
-Missing Road Rash? Well, Road Redemption will quench your thirst as a spiritual successor to Road Rash. Ofcourse, it is not officially “Road Rash II” – but it is equally enjoyable. If you loved Road Rash, you’ll like it too.
-
-[Road Redemption (Purchase)][31]
-
-### 17\. Dirt Rally
-
-Dirt Rally is for the gamers who want to experience off-road and on-road racing game. The visuals are breathtaking and the game is enjoyable with near to perfect driving mechanics.
-
-[Dirt Rally (Purchase)][32]
-
-### 18\. F1 2017
-
-F1 2017 is yet another impressive car racing game from the developers of Dirt Rally (Codemasters & Feral Interactive). It features all of the iconic F1 racing cars that you need to experience.
-
-[F1 2017 (Purchase)][33]
-
-### 19. GRID Autosport
-
-GRID is one of the most underrated car racing games available out there. GRID Autosport is the sequel to GRID 2\. The gameplay seems stunning to me. With even better cars than GRID 2, the GRID Autosport is a recommended racing game for every PC gamer out there. The game also supports a multiplayer mode where you can play with your friends – representing as a team.
-
-[GRID Autosport (Purchase)][34]
-
-### Best Adventure Games
-
-### 20\. ARK: Survival Evolved
-
-ARK Survival Evolved is a quite decent survival game with exciting adventures following in the due course. You find yourself in the middle of nowhere (ARK Island) and have got no choice except training the dinosaurs, teaming up with other players, hunt someone to get the required resources, and craft items to maximize your chances to survive and escape the Island.
-
-[ARK: Survival Evolved (Purchase)][35]
-
-### 21\. This War of Mine
-
-A unique game where you aren’t a soldier but a civilian facing the hardships of wartime. You’ve to make your way through highly-skilled enemies and help out other survivors as well.
-
-[This War of Mine (Purchase)][36]
-
-### 22\. Mad Max
-
-Mad Max is all about survival and brutality. It includes powerful cars, an open-world setting, weapons, and hand-to-hand combat. You need to keep exploring the place and also focus on upgrading your vehicle to prepare for the worst. You need to think carefully and have a strategy before you make a decision.
-
-[Mad Max (Purchase)][37]
-
-### Best Indie Games
-
-### 23\. Terraria
-
-It is a 2D game which has received overwhelmingly positive reviews on Steam. Dig, fight, explore, and build to keep your journey going. The environments are automatically generated. So, it isn’t anything static. You might encounter something first and your friend might encounter the same after a while. You’ll also get to experience creative 2D action-packed sequences.
-
-[Terraria (Purchase)][38]
-
-### 24\. Kingdoms and Castles
-
-With Kingdoms and Castles, you get to build your own kingdom. You have to manage your kingdom by collecting tax (as funds necessary) from the people, take care of the forests, handle the city
-
-design, and also make sure no one raids your kingdom by implementing proper defences.
-
-It is a fairly new game but quite trending among the Indie genre of games.
-
-[Kingdoms and Castles][39]
-
-### Best Strategy Games on Steam For Linux Machines
-
-### 25\. Sid Meier’s Civilization V
-
-Sid Meier’s Civilization V is one of the best-rated strategy game available for PC. You could opt for Civilization VI – if you want. But, the gamers still root for Sid Meier’s Civilization V because of its originality and creative implementation.
-
-[Civilization V (Purchase)][40]
-
-### 26\. Total War: Warhammer
-
-Total War: Warhammer is an incredible turn-based strategy game available for PC. Sadly, the Warhammer II isn’t available for Linux as of yet. But 2016’s Warhammer is still a great choice if you like real-time battles that involve building/destroying empires with flying creatures and magical powers.
-
-[Warhammer I (Purchase)][41]
-
-### 27\. Bomber Crew
-
-Wanted a strategy simulation game that’s equally fun to play? Bomber Crew is the answer to it. You need to choose the right crew and maintain it in order to win it all.
-
-[Bomber Crew (Purchase)][42]
-
-### 28\. Age of Wonders III
-
-A very popular strategy title with a mixture of empire building, role playing, and warfare. A polished turn-based strategy game you must try!
-
-[Age of Wonders III (Purchase)][43]
-
-### 29\. Cities: Skylines
-
-A pretty straightforward strategy game to build a city from scratch and manage everything in it. You’ll experience the thrills and hardships of building and maintaining a city. I wouldn’t expect every gamer to like this game – it has a very specific userbase.
-
-[Cities: Skylines (Purchase)][44]
-
-### 30\. XCOM 2
-
-XCOM 2 is one of the best turn-based strategy game available for PC. I wonder how crazy it could have been to have XCOM 2 as a first person shooter game. However, it’s still a masterpiece with an overwhelming response from almost everyone who bought the game. If you have the budget to spend more on this game, do get the – “War of the Chosen” – DLC.
-
-[XCOM 2 (Purchase)][45]
-
-### Wrapping Up
-
-Among all the games available for Linux, we did include most of the major titles and some the latest games with an overwhelming response from the gamers.
-
-Do you think we missed any of your favorite Linux game available on Steam? Also, what are the games that you would like to see on Steam for Linux platform?
-
-Let us know your thoughts in the comments below.
-
---------------------------------------------------------------------------------
-
-via: https://itsfoss.com/best-linux-games-steam/
-
-作者:[Ankush Das][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/ankush/
-[1]:https://itsfoss.com/author/ankush/
-[2]:https://itsfoss.com/best-linux-games-steam/#comments
-[3]:https://itsfoss.com/best-linux-games-steam/#action
-[4]:https://itsfoss.com/best-linux-games-steam/#rpg
-[5]:https://itsfoss.com/best-linux-games-steam/#racing
-[6]:https://itsfoss.com/best-linux-games-steam/#adv
-[7]:https://itsfoss.com/best-linux-games-steam/#indie
-[8]:https://itsfoss.com/best-linux-games-steam/#strategy
-[9]:https://itsfoss.com/linux-gaming-guide/
-[10]:https://itsfoss.com/install-steam-ubuntu-linux/
-[11]:https://www.humblebundle.com/?partner=itsfoss
-[12]:https://www.humblebundle.com/store?partner=itsfoss
-[13]:https://www.humblebundle.com/monthly?partner=itsfoss
-[14]:https://itsfoss.com/linux-gaming-problems/
-[15]:http://store.steampowered.com/app/730/CounterStrike_Global_Offensive/
-[16]:http://store.steampowered.com/app/550/Left_4_Dead_2/
-[17]:http://store.steampowered.com/app/49520/?snr=1_5_9__205
-[18]:http://store.steampowered.com/app/222880/?snr=1_5_9__205
-[19]:http://store.steampowered.com/agecheck/app/8870/
-[20]:http://store.steampowered.com/app/236870/?snr=1_5_9__205
-[21]:http://store.steampowered.com/app/620/?snr=1_5_9__205
-[22]:http://store.steampowered.com/app/337000/?snr=1_5_9__205
-[23]:http://store.steampowered.com/app/286690/?snr=1_5_9__205
-[24]:http://store.steampowered.com/app/287390/?snr=1_5_9__205
-[25]:http://store.steampowered.com/app/633460/?snr=1_5_9__205
-[26]:http://store.steampowered.com/app/241930/?snr=1_5_9__205
-[27]:http://store.steampowered.com/app/373420/?snr=1_5_9__205
-[28]:http://store.steampowered.com/app/240760/?snr=1_5_9__205
-[29]:http://store.steampowered.com/app/274520/?snr=1_5_9__205
-[30]:http://store.steampowered.com/app/252950/?snr=1_5_9__205
-[31]:http://store.steampowered.com/app/300380/?snr=1_5_9__205
-[32]:http://store.steampowered.com/app/310560/?snr=1_5_9__205
-[33]:http://store.steampowered.com/app/515220/?snr=1_5_9__205
-[34]:http://store.steampowered.com/app/255220/?snr=1_5_9__205
-[35]:http://store.steampowered.com/app/346110/?snr=1_5_9__205
-[36]:http://store.steampowered.com/app/282070/?snr=1_5_9__205
-[37]:http://store.steampowered.com/app/234140/?snr=1_5_9__205
-[38]:http://store.steampowered.com/app/105600/?snr=1_5_9__205
-[39]:http://store.steampowered.com/app/569480/?snr=1_5_9__205
-[40]:http://store.steampowered.com/app/8930/?snr=1_5_9__205
-[41]:http://store.steampowered.com/app/364360/?snr=1_5_9__205
-[42]:http://store.steampowered.com/app/537800/?snr=1_5_9__205
-[43]:http://store.steampowered.com/app/226840/?snr=1_5_9__205
-[44]:http://store.steampowered.com/app/255710/?snr=1_5_9__205
-[45]:http://store.steampowered.com/app/268500/?snr=1_5_9__205
-[46]:https://www.facebook.com/share.php?u=https%3A%2F%2Fitsfoss.com%2Fbest-linux-games-steam%2F%3Futm_source%3Dfacebook%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare
-[47]:https://twitter.com/share?original_referer=/&text=30+Best+Linux+Games+On+Steam+You+Should+Play+in+2017&url=https://itsfoss.com/best-linux-games-steam/%3Futm_source%3Dtwitter%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare&via=ankushdas9
-[48]:https://plus.google.com/share?url=https%3A%2F%2Fitsfoss.com%2Fbest-linux-games-steam%2F%3Futm_source%3DgooglePlus%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare
-[49]:https://www.linkedin.com/cws/share?url=https%3A%2F%2Fitsfoss.com%2Fbest-linux-games-steam%2F%3Futm_source%3DlinkedIn%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare
-[50]:https://www.reddit.com/submit?url=https://itsfoss.com/best-linux-games-steam/&title=30+Best+Linux+Games+On+Steam+You+Should+Play+in+2017
diff --git a/sources/tech/20171205 Using sudo to delegate permissions in Linux.md b/sources/tech/20171205 Using sudo to delegate permissions in Linux.md
new file mode 100644
index 0000000000..46a807c7a4
--- /dev/null
+++ b/sources/tech/20171205 Using sudo to delegate permissions in Linux.md
@@ -0,0 +1,229 @@
+translating by lujun9972
+Using sudo to delegate permissions in Linux
+======
+I recently wrote a short Bash program to copy MP3 files from a USB thumb drive on one network host to another network host. The files are copied to a specific directory on the server that I run for a volunteer organization, from where the files can be downloaded and played.
+
+My program does a few other things, such as changing the name of the files before they are copied so they are automatically sorted by date on the webpage. It also deletes all the files on the USB drive after verifying that the transfer completed correctly. This nice little program has a few options, such as -h to display help, -t for test mode, and a couple of others.
+
+My program, as wonderful as it is, must run as root to perform its primary functions. Unfortunately, this organization has only a few people who have any interest in administering our audio and computer systems, which puts me in the position of finding semi-technical people and training them to log into the computer used to perform the transfer and run this little program.
+
+It is not that I cannot run the program myself, but for various reasons, including travel and illness, I am not always there. Even when I am present, as the "lazy sysadmin," I like to have others do my work for me. So, I write scripts to automate those tasks and use sudo to anoint a couple of users to run the scripts. Many Linux commands require the user to be root in order to run. This protects the system against accidental damage, such as that caused by my own stupidity, and intentional damage by a user with malicious intent.
+
+### Do that sudo that you do so well
+
+The sudo program is a handy tool that allows me as a sysadmin with root access to delegate responsibility for all or a few administrative tasks to other users of the computer. It allows me to perform that delegation without compromising the root password, thus maintaining a high level of security on the host.
+
+Let's assume, for example, that I have given regular user, "ruser," access to my Bash program, "myprog," which must be run as root to perform parts of its functions. First, the user logs in as ruser with their own password, then uses the following command to run myprog.
+
+```
+ sudo myprog
+```
+
+I find it helpful to have the log of each command run by sudo for training. I can see who did what and whether they entered the command correctly.
+
+I have done this to delegate authority to myself and one other user to run a single program; however, sudo can be used to do so much more. It can allow the sysadmin to delegate authority for managing network functions or specific services to a single person or to a group of trusted users. It allows these functions to be delegated while protecting the security of the root password.
+
+### Configuring the sudoers file
+
+As a sysadmin, I can use the /etc/sudoers file to allow users or groups of users access to a single command, defined groups of commands, or all commands. This flexibility is key to both the power and the simplicity of using sudo for delegation.
+
+I found the sudoers file very confusing at first, so below I have copied and deconstructed the entire sudoers file from the host on which I am using it. Hopefully it won't be quite so obscure for you by the time you get through this analysis. Incidentally, I've found that the default configuration files in Red Hat-based distributions tend to have lots of comments and examples to provide guidance, which makes things easier, with less online searching required.
+
+Do not use your standard editor to modify the sudoers file. Use the visudo command because it is designed to enable any changes as soon as the file is saved and you exit the editor. It is possible to use editors besides Vi in the same way as visudo.
+
+Let's start analyzing this file at the beginning with a couple types of aliases.
+
+### Host aliases
+
+The host aliases section is used to create groups of hosts on which commands or command aliases can be used to provide access. The basic idea is that this single file will be maintained for all hosts in an organization and copied to /etc of each host. Some hosts, such as servers, can thus be configured as a group to give some users access to specific commands, such as the ability to start and stop services like HTTPD, DNS, and networking; to mount filesystems; and so on.
+
+IP addresses can be used instead of host names in the host aliases.
+
+```
+## Sudoers allows particular users to run various commands as
+## the root user, without needing the root password.
+##
+## Examples are provided at the bottom of the file for collections
+## of related commands, which can then be delegated out to particular
+## users or groups.
+##
+## This file must be edited with the 'visudo' command.
+
+## Host Aliases
+## Groups of machines. You may prefer to use hostnames (perhaps using
+## wildcards for entire domains) or IP addresses instead.
+# Host_Alias FILESERVERS = fs1, fs2
+# Host_Alias MAILSERVERS = smtp, smtp2
+
+## User Aliases
+## These aren't often necessary, as you can use regular groups
+## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
+## rather than USERALIAS
+# User_Alias ADMINS = jsmith, mikem
+User_Alias AUDIO = dboth, ruser
+
+## Command Aliases
+## These are groups of related commands...
+
+## Networking
+# Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig,
+ /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables,
+/usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool
+
+## Installation and management of software
+# Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
+
+## Services
+# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
+
+## Updating the locate database
+# Cmnd_Alias LOCATE = /usr/bin/updatedb
+
+## Storage
+# Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount
+
+## Delegating permissions
+# Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp
+
+## Processes
+# Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall
+
+## Drivers
+# Cmnd_Alias DRIVERS = /sbin/modprobe
+
+# Defaults specification
+
+#
+# Refuse to run if unable to disable echo on the tty.
+#
+Defaults !visiblepw
+
+Defaults env_reset
+Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
+Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
+Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
+Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
+Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
+
+Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
+
+## Next comes the main part: which users can run what software on
+## which machines (the sudoers file can be shared between multiple
+## systems).
+## Syntax:
+##
+## user MACHINE=COMMANDS
+##
+## The COMMANDS section may have other options added to it.
+##
+## Allow root to run any commands anywhere
+root ALL=(ALL) ALL
+
+## Allows members of the 'sys' group to run networking, software,
+## service management apps and more.
+# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
+
+## Allows people in group wheel to run all commands
+%wheel ALL=(ALL) ALL
+
+## Same thing without a password
+# %wheel ALL=(ALL) NOPASSWD: ALL
+
+## Allows members of the users group to mount and unmount the
+## cdrom as root
+# %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
+
+## Allows members of the users group to shutdown this system
+# %users localhost=/sbin/shutdown -h now
+
+## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
+#includedir /etc/sudoers.d
+
+################################################################################
+# Added by David Both, 11/04/2017 to provide limited access to myprog #
+################################################################################
+#
+AUDIO guest1=/usr/local/bin/myprog
+```
+
+### User aliases
+
+The user alias configuration allows root to sort users into aliased groups so that an entire group can have access to certain root capabilities. This is the section to which I have added the line User_Alias AUDIO = dboth, ruser, which defines the alias AUDIO and assigns two users to that alias.
+
+It is possible, as stated in the sudoers file, to simply use groups defined in the /etc/groups file instead of aliases. If you already have a group defined there that meets your needs, such as "audio," use that group name preceded by a % sign like so: %audio when assigning commands that will be made available to groups later in the sudoers file.
+
+### Command aliases
+
+Further down in the sudoers file is a command aliases section. These aliases are lists of related commands, such as networking commands or commands required to install updates or new RPM packages. These aliases allow the sysadmin to easily permit access to groups of commands.
+
+A number of aliases are already set up in this section that make it easy to delegate access to specific types of commands.
+
+### Environment defaults
+
+The next section sets some default environment variables. The item that is most interesting in this section is the !visiblepw line, which prevents sudo from running if the user environment is set to show the password. This is a security precaution that should not be overridden.
+
+### Command section
+
+The command section is the main part of the sudoers file. Everything you need to do can be done without all the aliases by adding enough entries here. The aliases just make it a whole lot easier.
+
+This section uses the aliases you've already defined to tell sudo who can do what on which hosts. The examples are self-explanatory once you understand the syntax in this section. Let's look at the syntax that we find in the command section.
+
+```
+ruser ALL=(ALL) ALL
+```
+
+This is a generic entry for our user, ruser. The first ALL in the line indicates that this rule applies on all hosts. The second ALL allows ruser to run commands as any other user. By default, commands are run as root user, but ruser can specify on the sudo command line that a program be run as any other user. The last ALL means that ruser can run all commands without restriction. This would effectively make ruser root.
+
+Note that there is an entry for root, as shown below. This allows root to have all-encompassing access to all commands on all hosts.
+
+```
+root ALL=(ALL) ALL
+```
+
+To try this out, I commented out the line and, as root, tried to run chown without sudo. That did work—much to my surprise. Then I used sudo chown and that failed with the message, "Root is not in the sudoers file. This incident will be reported." This means that root can run everything as root, but nothing when using the sudo command. This would prevent root from running commands as other users via the sudo command, but root has plenty of ways around that restriction.
+
+The code below is the one I added to control access to myprog. It specifies that users who are listed in the AUDIO group, as defined near the top of the sudoers file, have access to only one program, myprog, on one host, guest1.
+
+```
+AUDIO guest1=/usr/local/bin/myprog
+```
+
+Note that the syntax of the line above specifies only the host on which this access is to be allowed and the program. It does not specify that the user may run the program as any other user.
+
+### Bypassing passwords
+
+You can also use NOPASSWORD to allow the users specified in the group AUDIO to run myprog without the need for entering their passwords. Here's how:
+
+```
+AUDIO guest1=NOPASSWORD : /usr/local/bin/myprog
+```
+
+I did not do this for my program, because I believe that users with sudo access must stop and think about what they are doing, and this may help a bit with that. I used the entry for my little program as an example.
+
+### wheel
+
+The wheel specification in the command section of the sudoers file, as shown below, allows all users in the "wheel" group to run all commands on any host. The wheel group is defined in the /etc/group file, and users must be added to the group there for this to work. The % sign preceding the group name means that sudo should look for that group in the /etc/group file.
+
+```
+%wheel ALL = (ALL) ALL
+```
+
+This is a good way to delegate full root access to multiple users without providing the root password. Just adding a user to the wheel group gives them access to full root powers. It also provides a means to monitor their activities via the log entries created by sudo. Some distributions, such as Ubuntu, add users' IDs to the wheel group in /etc/group, which allows them to use the sudo command for all privileged commands.
+
+### Final thoughts
+
+I have used sudo here for a very limited objective—providing one or two users with access to a single command. I accomplished this with two lines (if you ignore my own comments). Delegating authority to perform certain tasks to users who do not have root access is simple and can save you, as a sysadmin, a good deal of time. It also generates log entries that can help detect problems.
+
+The sudoers file offers a plethora of capabilities and options for configuration. Check the man files for sudo and sudoers for the down-and-dirty details.
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/17/12/using-sudo-delegate
+
+作者:[David Both][a]
+译者:[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/dboth
diff --git a/translated/tech/20171005 How to manage Linux containers with Ansible Container.md b/translated/tech/20171005 How to manage Linux containers with Ansible Container.md
new file mode 100644
index 0000000000..624d25694a
--- /dev/null
+++ b/translated/tech/20171005 How to manage Linux containers with Ansible Container.md
@@ -0,0 +1,116 @@
+怎么去使用 Ansible Container 去管理 Linux 容器
+============================================================
+
+### Ansible Container 处理 Dockerfile 的不足和对容器化项目提供完整的管理。
+
+
+Image by : opensource.com
+
+我喜欢容器,并且每天都使用这个技术。在过去几个月,在一组项目中已经解决了我遇到的问题,即便如此,容器并不完美。
+
+我刚开始时,用 [Docker][11] 使用容器,因为这个项目使这个技术非常流行。除此之外,使用这个容器引擎,我学到了怎么去使用 **[docker-compose][6]** 以及怎么去用它管理我的项目。使用它使我的生产力猛增!一个命令去运行我的项目,而不管它有多复杂。因此,我太高兴了。
+
+使用一段时间之后,我发现了一些问题。最明显的问题是创建窗口镜像的过程。Docker 工具使用一个定制的文件格式作为一个 Recipe 去制作容器镜像 — Dockerfiles。这个格式很容易学会,并且很短的一段时间之后,你就可以为你自己制作容器镜像了。但是,一旦你希望去掌握最佳实践或者有复杂场景的想法,问题就会出现。
+
+Ansible 的更多资源
+
+* [Ansible 是怎么工作的][1]
+
+* [免费的 Ansible 电子书][2]
+
+* [Ansible 快速上手视频][3]
+
+* [下载和安装 Ansible][4]
+
+让我们先休息一会儿,先去了解一个不同的东西:[Ansible][22] 的世界。你知道它吗?它棒极了,是吗?你不这么认为?好吧,是时候去学习一些新事物了。Ansible 是一个项目,它允许你通过写一些任务去管理你的基础设施,并在你选择的环境中运行它们。不需要去安装和设置任何的服务;你可以从你的笔记本电脑中去很很容易地做任何事情。许多人已经接受 Ansible 了。
+
+想像一下这样的场景:你在 Ansible 中,你写了很多的 Ansible 角色和 playbooks,你可以用它们去管理你的基础设施,并且想把它们运用到容器中。你应该怎么做?开始通过 shell 脚本和 Dockerfiles 去写容器镜像定义?听起来好像不对。
+
+来自 Ansible 开发团队的一些人问到这个问题,并且它们意识到,人们每天使用那些同样的 Ansible 角色和 playbooks 也可以用来制作容器镜像。但是 Ansible 能做到的不止这些 — 它可以被用于去管理容器化项目的完整的生命周期。从这些想法中,[Ansible Container][12] 项目诞生了。它使用已有的可以变成容器镜像的 Ansible 角色,甚至可以被用于应用程序在生产系统中从构建到部署的完整生命周期。
+
+现在让我们讨论一下,在 Dockerfiles 环境中关于最佳实践时可能存在的问题。这里有一个警告:这将是非常具体且技术性的。出现最多的三个问题有:
+
+### 1\. 在 Dockerfiles 中内嵌的 Shell 脚本。
+
+当写 Dockerfiles 时,你可以通过 **/bin/sh -c** 解释指定的脚本。它可以做类似这样的事情:
+
+```
+RUN dnf install -y nginx
+```
+
+RUN 处是一个 Dockerfile 指令并且其它的都是参数(它传递给 shell)。但是,想像一个更复杂的场景:
+
+```
+RUN set -eux; \
+ \
+# this "case" statement is generated via "update.sh"
+ %%ARCH-CASE%%; \
+ \
+ url="https://golang.org/dl/go${GOLANG_VERSION}.${goRelArch}.tar.gz"; \
+ wget -O go.tgz "$url"; \
+ echo "${goRelSha256} *go.tgz" | sha256sum -c -; \
+```
+
+这仅是从 [the official golang image][13] 中拿来的一个。它看起来并不好看,是不是?
+
+### 2\. 你解析 Dockerfiles 并不容易。
+
+Dockerfiles 是一个没有正式规范的新格式。如果你需要在你的基础设施(比如,让构建过程自动化一点)中去处理 Dockerfiles 将会很复杂。仅有的规划是 [这个代码][14],它是 **dockerd** 的一部分。问题是你不能使用它作为一个库(library)。最容易的解决方案是你自己写一个解析器,然后祈祷它运行的很好。使用一些众所周知的标记语言不是更好吗?比如,YAML 或者 JSON。
+
+### 3\. 管理困难。
+
+如果你熟悉容器镜像的内部结构,你可能知道每个镜像是由层(layers)构成的。一旦容器被创建,这些层就使用联合文件系统技术堆叠在一起(像煎饼一样)。问题是,你并不能显式地管理这些层 — 你不能说,“这儿开始一个新层”,你被迫使用一种可读性不好的方法去改变你的 Dockerfile。最大的问题是,必须遵循一套最佳实践以去达到最优结果 — 新来的人在这个地方可能很困难。
+
+### Ansible 语言和 Dockerfiles 比较
+
+相比 Ansible,Dockerfiles 的最大缺点,也是 Ansible 的优点,作为一个语言,Ansible 更强大。例如,Dockerfiles 没有直接的变量概念,而 Ansible 有一个完整的模板系统(变量只是它其中的一个特性)。Ansible 包含了很多更易于使用的模块,比如,[**wait_for**][15],它可以被用于服务就绪检查,比如,在处理之前等待服务准备就绪。在 Dockerfiles 中,做任何事情都通过一个 shell 脚本。因此,如果你想去找出已准备好的服务,它必须使用 shell(或者独立安装)去做。使用 shell 脚本的其它问题是,它会变得很复杂,维护成为一种负担。很多人已经找到了这个问题,并将这些 shell 脚本转到 Ansible。
+
+如果你对这个主题感兴趣,并且想去了解更多内容,请访问 [Open Source Summit][16],在 Prague 去看 [我的演讲][17],时间是 10 月 23 日,星期一,4:20 p.m. 在 Palmovka room 中。
+
+ _看更多的 Tomas Tomecek 演讲,[从 Dockerfiles 到 Ansible Container][7],在 [Open Source Summit EU][8],它将在 10 月 23-26 日在 Prague 召开。_
+
+
+
+### 关于作者
+
+ [][18] Tomas Tomecek - 工程师、Hacker、演讲者、Tinker、Red Hatter。喜欢容器、linux、开源软件、python 3、rust、zsh、tmux。[More about me][9]
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/17/10/dockerfiles-ansible-container
+
+作者:[Tomas Tomecek][a]
+译者:[qhwdw](https://github.com/qhwdw)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://opensource.com/users/tomastomecek
+[1]:https://www.ansible.com/how-ansible-works?intcmp=701f2000000h4RcAAI
+[2]:https://www.ansible.com/ebooks?intcmp=701f2000000h4RcAAI
+[3]:https://www.ansible.com/quick-start-video?intcmp=701f2000000h4RcAAI
+[4]:https://docs.ansible.com/ansible/latest/intro_installation.html?intcmp=701f2000000h4RcAAI
+[5]:https://opensource.com/article/17/10/dockerfiles-ansible-container?imm_mid=0f9013&cmp=em-webops-na-na-newsltr_20171201&rate=Wiw_0D6PK_CAjqatYu_YQH0t1sNHEF6q09_9u3sYkCY
+[6]:https://github.com/docker/compose
+[7]:http://sched.co/BxIW
+[8]:http://events.linuxfoundation.org/events/open-source-summit-europe
+[9]:https://opensource.com/users/tomastomecek
+[10]:https://opensource.com/user/175651/feed
+[11]:https://opensource.com/tags/docker
+[12]:https://www.ansible.com/ansible-container
+[13]:https://github.com/docker-library/golang/blob/master/Dockerfile-debian.template#L14
+[14]:https://github.com/moby/moby/tree/master/builder/dockerfile
+[15]:http://docs.ansible.com/wait_for_module.html
+[16]:http://events.linuxfoundation.org/events/open-source-summit-europe
+[17]:http://events.linuxfoundation.org/events/open-source-summit-europe/program/schedule
+[18]:https://opensource.com/users/tomastomecek
+[19]:https://opensource.com/users/tomastomecek
+[20]:https://opensource.com/users/tomastomecek
+[21]:https://opensource.com/article/17/10/dockerfiles-ansible-container?imm_mid=0f9013&cmp=em-webops-na-na-newsltr_20171201#comments
+[22]:https://opensource.com/tags/ansible
+[23]:https://opensource.com/tags/containers
+[24]:https://opensource.com/tags/ansible
+[25]:https://opensource.com/tags/docker
+[26]:https://opensource.com/tags/open-source-summit
+
+
diff --git a/translated/tech/20171113 Glitch write fun small web projects instantly.md b/translated/tech/20171113 Glitch write fun small web projects instantly.md
new file mode 100644
index 0000000000..fde7d7f880
--- /dev/null
+++ b/translated/tech/20171113 Glitch write fun small web projects instantly.md
@@ -0,0 +1,73 @@
+Glitch:立即写出有趣的小型网站项目
+============================================================
+
+我刚写了一篇关于 Jupyter Notebooks 是一个有趣的交互式写 Python 代码的方式。这让我想起我最近学习了 Glitch,这个我同样喜爱!我构建了一个小的程序来用于[关闭转发 twitter][2]。因此有了这篇文章!
+
+[Glitch][3] 是一个简单的构建 Javascript web 程序的方式(javascript 后端、javascript 前端)
+
+关于 glitch 有趣的事有:
+
+1. 你在他们的网站输入 Javascript 代码
+
+2. 只要输入了任何代码,它会自动用你的新代码重载你的网站。你甚至不必保存!它会自动保存。
+
+所以这就像 Heroku,但更神奇!像这样的编码(你输入代码,代码立即在公共网络上运行)对我而言感觉很**有趣**。
+
+这有点像 ssh 登录服务器,编辑服务器上的 PHP/HTML 代码,并让它立即可用,这也是我所喜爱的。现在我们有了“更好的部署实践”,而不是“编辑代码,它立即出现在互联网上”,但我们并不是在谈论严肃的开发实践,而是在讨论编写微型程序的乐趣。
+
+### Glitch 有很棒的示例应用程序
+
+Glitch 似乎是学习编程的好方式!
+
+比如,这有一个太空侵略者游戏(由 [Mary Rose Cook][4] 编写):[https://space-invaders.glitch.me/][5]。我喜欢的是我只需要点击几下。
+
+1. 点击 “remix this”
+
+2. 开始编辑代码使箱子变成橘色而不是黑色
+
+3. 制作我自己太空侵略者游戏!我的在这:[http://julias-space-invaders.glitch.me/][1]。(我只做了很小的更改使其变成橘色,没什么神奇的)
+
+他们有大量的示例程序,你可以从中启动 - 例如[机器人][6]、[游戏][7]等等。
+
+### 实际有用的非常好的程序:tweetstorms
+
+我学习 Glitch 的方式是从这个程序:[https://tweetstorms.glitch.me/][8],它会向你展示给定用户的 tweetstorm。
+
+比如,你可以在 [https://tweetstorms.glitch.me/sarahmei][10] 看到 [@sarahmei][9] 的 tweetstorm(她发布了很多好的 tweetstorm!)。
+
+### 我的 Glitch 程序: 关闭转推
+
+当我了解到 Glitch 的时候,我想关闭在 Twitter 上关注的所有人的转推(我知道可以在 Tweetdeck 中做这件事),而且手动做这件事是一件很痛苦的事 - 我一次只能设置一个人。所以我写了一个 Glitch 程序来为我做!
+
+我喜欢我不必设置一个本地开发环境,我可以直接开始输入然后开始!
+
+Glitch 只支持 Javascript,我不非常了解 Javascript(我之前从没写过一个 Node 程序),所以代码不是很好。但是编写它很愉快 - 能够输入并立即看到我的代码运行是令人愉快的。这是我的项目:[https://turn-off-retweets.glitch.me/][11]。
+
+### 就是这些!
+
+使用 Glitch 感觉真的很有趣和民主。通常情况下,如果我想 fork 某人的 Web 项目,并做出更改,我不会这样做 - 我必须 fork,找一个托管,设置本地开发环境或者 Heroku 或其他,安装依赖项等。我认为像安装 node.js 依赖关系这样的任务过去很有趣,就像“我正在学习新东西很酷”,现在我觉得它们很乏味。
+
+所以我喜欢只需点击 “remix this!” 并立即在互联网上能有我的版本。
+
+--------------------------------------------------------------------------------
+
+via: https://jvns.ca/blog/2017/11/13/glitch--write-small-web-projects-easily/
+
+作者:[Julia Evans ][a]
+译者:[geekpi](https://github.com/geekpi)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://jvns.ca/
+[1]:http://julias-space-invaders.glitch.me/
+[2]:https://turn-off-retweets.glitch.me/
+[3]:https://glitch.com/
+[4]:https://maryrosecook.com/
+[5]:https://space-invaders.glitch.me/
+[6]:https://glitch.com/handy-bots
+[7]:https://glitch.com/games
+[8]:https://tweetstorms.glitch.me/
+[9]:https://twitter.com/sarahmei
+[10]:https://tweetstorms.glitch.me/sarahmei
+[11]:https://turn-off-retweets.glitch.me/
diff --git a/translated/tech/20171118 Language engineering for great justice.md b/translated/tech/20171118 Language engineering for great justice.md
index 301337b11c..fc116e2e18 100644
--- a/translated/tech/20171118 Language engineering for great justice.md
+++ b/translated/tech/20171118 Language engineering for great justice.md
@@ -1,59 +1,59 @@
- -最合理的语言工程模式
- -============================================================
- -
- -当你熟练掌握一体化工程技术时,你就会发现它逐渐超过了技术优化的层面。我们制作的每件手工艺品都在一个大环境背景下,在这个环境中,人类的行为逐渐突破了经济意义,社会学意义,达到了奥地利经济学家所称的“人类行为学”,这是目的明确的人类行为所能达到的最大范围。
- -
- -对我来说这并不只是抽象理论。当我在开源发展项目中编写时,我的行为就十分符合人类行为学的理论,这行为不是针对任何特定的软件技术或某个客观事物,它指的是在开发科技的过程中人类行为的背景环境。从人类行为学角度对科技进行的解读不断增加,大量的这种解读可以重塑科技框架,带来人类生产力和满足感的极大幅度增长,而这并不是由于我们换了工具,而是在于我们改变了掌握它们的方式。
- -
- -在这个背景下,我在第三篇额外的文章中谈到了 C 语言的衰退和正在到来的巨大改变,而我们也确实能够感受到系统编程的新时代的到来,在这个时刻,我决定把我之前有的大体的预感具象化为更加具体的,更实用的点子,它们主要是关于计算机语言设计的分析,例如为什么他们会成功,或为什么他们会失败。
- -
- -在我最近的一篇文章中,我写道:所有计算机语言都是对机器资源的成本和程序员工作成本的相对权衡的结果,和对其相对价值的体现。这些都是在一个计算能力成本不断下降但程序员工作成本不减反增的背景下产生的。我还强调了转化成本在使原有交易主张适用于当下环境中的新增角色。在文中我将编程人员描述为一个寻找今后最适方案的探索者。
- -
- -现在我要讲一讲最后一点。以现有水平为起点,一个语言工程师有极大可能通过多种方式推动语言设计的发展。通过什么系统呢? GC 还是人工分配?使用何种配置,命令式语言,函数程式语言或是面向对象语言?但是从人类行为学的角度来说,我认为它的形式会更简洁,也许只是选择解决长期问题还是短期问题?
- -
- -所谓的“远”“近”之分,是指硬件成本的逐渐降低,软件复杂程度的上升和由现有语言向其他语言转化的成本的增加,根据它们的变化曲线所做出的判断。短期问题指编程人员眼下发现的问题,长期问题指可预见的一系列情况,但它们一段时间内不会到来。针对近期问题所做出的部署需要非常及时且有效,但随着情况的变化,短期解决方案有可能很快就不适用了。而长期的解决方案可能因其过于超前而夭折,或因其代价过高无法被接受。
- -
- -在计算机刚刚面世的时候, FORTRAN 是近期亟待解决的问题, LISP 是远期问题。汇编语言是短期解决方案,图解说明非通用语言的分类应用,还有关门电阻不断上涨的成本。随着计算机技术的发展,PHP 和 Javascript逐渐应用于游戏中。至于长期的解决方案? Oberon , Ocaml , ML , XML-Docbook 都可以。 他们形成的激励机制带来了大量具有突破性和原创性的想法,事态蓬勃但未形成体系,那个时候距离专业语言的面世还很远,(值得注意的是这些想法的出现都是人类行为学中的因果,并非由于某种技术)。专业语言会失败,这是显而易见的,它的转入成本高昂,让大部分人望而却步,因此不能没能达到能够让主流群体接受的水平,被孤立,被搁置。这也是 LISP 不为人知的的过去,作为前 LISP 管理层人员,出于对它深深的爱,我为你们讲述了这段历史。
- -
- -如果短期解决方案出现故障,它的后果更加惨不忍睹,最好的结果是期待一个相对体面的失败,好转换到另一个设计方案。(通常在转化成本较高时)如果他们执意继续,通常造成众多方案相互之间藕断丝连,形成一个不断扩张的复合体,一直维持到不能运转下去,变成一堆摇摇欲坠的杂物。是的,我说的就是 C++ 语言,还有 Java 描述语言,(唉)还有 Perl,虽然 Larry Wall 的好品味成功地让他维持了很多年,问题一直没有爆发,但在 Perl 6 发行时,他的好品味最终引爆了整个问题。
- -
- -这种思考角度激励了编程人员向着两个不同的目的重新塑造语言设计: ①以远近为轴,在自身和预计的未来之间选取一个最适点,然后 ②降低由一种或多种语言转化为自身语言的转入成本,这样你就可以吸纳他们的用户群。接下来我会讲讲 C 语言是怎样占领全世界的。
- -
- -在整个计算机发展史中,没有谁能比 C 语言完美地把握最适点的选取了,我要做的只是证明这一点,作为一种实用的主流语言, C 语言有着更长的寿命,它目睹了无数个竞争者的兴衰,但它的地位仍旧不可取代。从淘汰它的第一个竞争者到现在已经过了 35 年,但看起来C语言的终结仍旧不会到来。
- -
- -当然,如果你愿意的话,可以把 C 语言的持久存在归功于人类的文化惰性,但那是对“文化惰性”这个词的曲解, C 语言一直得以延续的真正原因是没有人提供足够的转化费用!
- -
- -相反的, C 语言低廉的内部转化费用未得到应有的重视,C 语言是如此的千变万化,从它漫长统治时期的初期开始,它就可以适用于多种语言如 FORTRAN , Pascal , 汇编语言和 LISP 的编程习惯。在二十世纪八十年代我就注意到,我可以根据编程人员的编码风格判断出他的母语是什么,这也从另一方面证明了C 语言的魅力能够吸引全世界的人使用它。
- -
- -C++ 语言同样胜在它低廉的转化费用。很快,大部分新兴的语言为了降低自身转化费用,纷纷参考 C 语言语法。请注意这给未来的语言设计环境带来了什么影响:它尽可能地提高了 C-like 语言的价值,以此来降低其他语言转化为 C 语言的转化成本。
- -
- -另一种降低转入成本的方法十分简单,即使没接触过编程的人都能学会,但这种方法很难完成。我认为唯一使用了这种方法的 Python就是靠这种方法进入了职业比赛。对这个方法我一带而过,是因为它并不是我希望看到的,顺利执行的系统语言战略,虽然我很希望它不是那样的。
- -
- -今天我们在2017年年底聚集在这里,下一项我们应该为某些暴躁的团体发声,如 Go 团队,但事实并非如此。 Go 这个项目漏洞百出,我甚至可以想象出它失败的各种可能,Go 团队太过固执独断,即使几乎整个用户群体都认为 Go 需要做出改变了,Go 团队也无动于衷,这是个大问题。 一旦发生故障, GC 发生延迟或者用牺牲生产量来弥补延迟,但无论如何,它都会严重影响到这种语言的应用,大幅缩小这种语言的适用范围。
- -
- -即便如此,在 Go 的设计中,还是有一个我颇为认同的远大战略目标,想要理解这个目标,我们需要回想一下如果想要取代 C 语言,要面临的短期问题是什么。同我之前提到的,随着项目计划的不断扩张,故障率也在持续上升,这其中内存管理方面的故障尤其多,而内存管理一直是崩溃漏洞和安全漏洞的高发领域。
- -
- -我们现在已经知道了两件十分中重要的紧急任务,要想取代 C 语言,首先要先做到这两点:(1)解决内存管理问题;(2)降低由 C 语言向本语言转化时所需的转入成本。纵观编程语言的历史——从人类行为学的角度来看,作为 C 语言的准替代者,如果不能有效解决转入成本过高这个问题,那他们所做的其他部分做得再好都不算数。相反的,如果他们把转入成本过高这个问题解决地很好,即使他们其他部分做的不是最好的,人们也不会对他们吹毛求疵。
- -
- -这正是 Go 的做法,但这个理论并不是完美无瑕的,它也有局限性。目前 GC 延迟限制了它的发展,但 Go 现在选择照搬 Unix 下 C 语言的传染战略,让自身语言变成易于转入,便于传播的语言,其繁殖速度甚至快于替代品。但从长远角度看,这并不是个好办法。
- -
- -当然, Rust 语言的不足是个十分明显的问题,我们不应当回避它。而它,正将自己定位为适用于长远计划的选择。在之前的部分中我已经谈到了为什么我觉得它还不完美,Rust 语言在 TIBOE 和PYPL 指数上的成就也证明了我的说法,在 TIBOE 上 Rust 从来没有进过前20名,在 PYPL 指数上它的成就也比 Go 差很多。
- -
- -五年后 Rust 能发展的怎样还是个问题,如果他们愿意改变,我建议他们重视转入成本问题。以我个人经历来说,由 C 语言转入 Rust 语言的能量壁垒使人望而却步。如果编码提升工具比如 Corrode 只能把 C 语言映射为不稳定的 Rust 语言,但不能解决能量壁垒的问题;或者如果有更简单的方法能够自动注释所有权或试用期,人们也不再需要它们了——这些问题编译器就能够解决。目前我不知道怎样解决这个问题,但我觉得他们最好找出解决方案。
- -
- -在最后我想强调一下,虽然在 Ken Thompson 的设计经历中,他看起来很少解决短期问题,但他对未来有着极大的包容性,并且这种包容性还在不断提升。当然 Unix 也是这样的, 它让我不禁暗自揣测,让我认为 Go 语言中令人不快的地方都其实是他们未来事业的基石(例如缺乏泛型)。如果要确认这件事是真假,我需要比 Ken 还要聪明,但这并不是一件容易让人相信的事情。
- -
- ---------------------------------------------------------------------------------
- -
- -via: http://esr.ibiblio.org/?p=7745
- -
- -作者:[Eric Raymond ][a]
- -译者:[Valoniakim](https://github.com/Valoniakim)
- -校对:[校对者ID](https://github.com/校对者ID)
- -
- -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
- -
- -[a]:http://esr.ibiblio.org/?author=2
- -[1]:http://esr.ibiblio.org/?author=2
- -[2]:http://esr.ibiblio.org/?p=7711&cpage=1#comment-1913931
- -[3]:http://esr.ibiblio.org/?p=7745
+ESR:最合理的语言工程模式
+============================================================
+
+当你熟练掌握一体化工程技术时,你就会发现它逐渐超过了技术优化的层面。我们制作的每件手工艺品都在一个大环境背景下,在这个环境中,人类的行为逐渐突破了经济意义、社会学意义,达到了奥地利经济学家所称的“人类行为学”,这是目的明确的人类行为所能达到的最大范围。
+
+对我来说这并不只是抽象理论。当我在开源开发项目中编写论文时,我的行为就十分符合人类行为学的理论,这行为不是针对任何特定的软件技术或某个客观事物,它指的是在开发科技的过程中人类行为的背景环境。从人类行为学角度对科技进行的解读不断增加,大量的这种解读可以重塑科技框架,带来人类生产力和满足感的极大幅度增长,而这并不是由于我们换了工具,而是在于我们改变了掌握它们的方式。
+
+在这个背景下,我的计划之外的文章系列的第三篇中谈到了 C 语言的衰退和正在到来的巨大改变,而我们也确实能够感受到系统编程的新时代的到来,在这个时刻,我决定把我之前有的大体的预感具象化为更加具体的、更实用的想法,它们主要是关于计算机语言设计的分析,例如为什么它们会成功,或为什么它们会失败。
+
+在我最近的一篇文章中,我写道:所有计算机语言都是对机器资源的成本和程序员工作成本的相对权衡的结果,和对其相对价值的体现。这些都是在一个计算能力成本不断下降但程序员工作成本不减反增的背景下产生的。我还强调了转化成本在使原有交易主张适用于当下环境中的新增角色。在文中我将编程人员描述为一个寻找今后最适方案的探索者。
+
+现在我要讲一讲最后一点。以现有水平为起点,一个语言工程师有极大可能通过多种方式推动语言设计的发展。通过什么系统呢? GC 还是人工分配?使用何种配置,命令式语言、函数程式语言或是面向对象语言?但是从人类行为学的角度来说,我认为它的形式会更简洁,也许只是选择解决长期问题还是短期问题?
+
+所谓的“远”、“近”之分,是指硬件成本的逐渐降低,软件复杂程度的上升和由现有语言向其他语言转化的成本的增加,根据它们的变化曲线所做出的判断。短期问题指编程人员眼下发现的问题,长期问题指可预见的一系列情况,但它们一段时间内不会到来。针对近期问题所做出的部署需要非常及时且有效,但随着情况的变化,短期解决方案有可能很快就不适用了。而长期的解决方案可能因其过于超前而夭折,或因其代价过高无法被接受。
+
+在计算机刚刚面世的时候, FORTRAN 是近期亟待解决的问题, LISP 是远期问题,汇编语言是短期解决方案。说明这种分类适用于非通用语言,还有 roff 标记语言。随着计算机技术的发展,PHP 和 Javascript 逐渐参与到这场游戏中。至于长期的解决方案? Oberon、Ocaml、ML、XML-Docbook 都可以。 它们形成的激励机制带来了大量具有突破性和原创性的想法,事态蓬勃但未形成体系,那个时候距离专业语言的面世还很远,(值得注意的是这些想法的出现都是人类行为学中的因果,并非由于某种技术)。专业语言会失败,这是显而易见的,它的转入成本高昂,让大部分人望而却步,因此不能达到能够让主流群体接受的水平,被孤立,被搁置。这也是 LISP 不为人知的的过去,作为前 LISP 管理层人员,出于对它深深的爱,我为你们讲述了这段历史。
+
+如果短期解决方案出现故障,它的后果更加惨不忍睹,最好的结果是期待一个相对体面的失败,好转换到另一个设计方案。(通常在转化成本较高时)如果他们执意继续,通常造成众多方案相互之间藕断丝连,形成一个不断扩张的复合体,一直维持到不能运转下去,变成一堆摇摇欲坠的杂物。是的,我说的就是 C++ 语言,还有 Java 描述语言,(唉)还有 Perl,虽然 Larry Wall 的好品味成功地让他维持了很多年,问题一直没有爆发,但在 Perl 6 发行时,他的好品味最终引爆了整个问题。
+
+这种思考角度激励了编程人员向着两个不同的目的重新塑造语言设计: (1)以远近为轴,在自身和预计的未来之间选取一个最适点,然后(2)降低由一种或多种语言转化为自身语言的转入成本,这样你就可以吸纳他们的用户群。接下来我会讲讲 C 语言是怎样占领全世界的。
+
+在整个计算机发展史中,没有谁能比 C 语言完美地把握最适点的选取了,我要做的只是证明这一点,作为一种实用的主流语言, C 语言有着更长的寿命,它目睹了无数个竞争者的兴衰,但它的地位仍旧不可取代。从淘汰它的第一个竞争者到现在已经过了 35 年,但看起来C语言的终结仍旧不会到来。
+
+当然,如果你愿意的话,可以把 C 语言的持久存在归功于人类的文化惰性,但那是对“文化惰性”这个词的曲解, C 语言一直得以延续的真正原因是没有人提供足够的转化费用!
+
+相反的, C 语言低廉的内部转化成本未得到应有的重视,C 语言是如此的千变万化,从它漫长统治时期的初期开始,它就可以适用于多种语言如 FORTRAN、Pascal 、汇编语言和 LISP 的编程习惯。在二十世纪八十年代我就注意到,我可以根据编程人员的编码风格判断出他的母语是什么,这也从另一方面证明了C 语言的魅力能够吸引全世界的人使用它。
+
+C++ 语言同样胜在它低廉的转化成本。很快,大部分新兴的语言为了降低自身转化成本,纷纷参考 C 语言语法。请注意这给未来的语言设计环境带来了什么影响:它尽可能地提高了类 C 语言的价值,以此来降低其他语言转化为 C 语言的转化成本。
+
+另一种降低转入成本的方法十分简单,即使没接触过编程的人都能学会,但这种方法很难完成。我认为唯一使用了这种方法的 Python 就是靠这种方法进入了职业比赛。对这个方法我一带而过,是因为它并不是我希望看到的,顺利执行的系统语言战略,虽然我很希望它不是那样的。
+
+今天我们在 2017 年底聚集在这里,下一项我们应该为某些暴躁的团体发声,如 Go 团队,但事实并非如此。 Go 这个项目漏洞百出,我甚至可以想象出它失败的各种可能,Go 团队太过固执独断,即使几乎整个用户群体都认为 Go 需要做出改变了,Go 团队也无动于衷,这是个大问题。 一旦发生故障, GC 发生延迟或者用牺牲生产量来弥补延迟,但无论如何,它都会严重影响到这种语言的应用,大幅缩小这种语言的适用范围。
+
+即便如此,在 Go 的设计中,还是有一个我颇为认同的远大战略目标,想要理解这个目标,我们需要回想一下如果想要取代 C 语言,要面临的短期问题是什么。同我之前提到的,随着项目计划的不断扩张,故障率也在持续上升,这其中内存管理方面的故障尤其多,而内存管理一直是崩溃漏洞和安全漏洞的高发领域。
+
+我们现在已经知道了两件十分重要的紧急任务,要想取代 C 语言,首先要先做到这两点:(1)解决内存管理问题;(2)降低由 C 语言向本语言转化时所需的转入成本。纵观编程语言的历史——从人类行为学的角度来看,作为 C 语言的准替代者,如果不能有效解决转入成本过高这个问题,那他们所做的其他部分做得再好都不算数。相反的,如果他们把转入成本过高这个问题解决地很好,即使他们其他部分做的不是最好的,人们也不会对他们吹毛求疵。
+
+这正是 Go 的做法,但这个理论并不是完美无瑕的,它也有局限性。目前 GC 延迟限制了它的发展,但 Go 现在选择照搬 Unix 下 C 语言的传染战略,让自身语言变成易于转入,便于传播的语言,其繁殖速度甚至快于替代品。但从长远角度看,这并不是个好办法。
+
+当然, Rust 语言的不足是个十分明显的问题,我们不应当回避它。而它,正将自己定位为适用于长远计划的选择。在之前的部分中我已经谈到了为什么我觉得它还不完美,Rust 语言在 TIBOE 和PYPL 指数上的成就也证明了我的说法,在 TIBOE 上 Rust 从来没有进过前 20 名,在 PYPL 指数上它的成就也比 Go 差很多。
+
+五年后 Rust 能发展的怎样还是个问题,如果他们愿意改变,我建议他们重视转入成本问题。以我个人经历来说,由 C 语言转入 Rust 语言的能量壁垒使人望而却步。如果编码提升工具比如 Corrode 只能把 C 语言映射为不稳定的 Rust 语言,但不能解决能量壁垒的问题;或者如果有更简单的方法能够自动注释所有权或试用期,人们也不再需要它们了——这些问题编译器就能够解决。目前我不知道怎样解决这个问题,但我觉得他们最好找出解决方案。
+
+在最后我想强调一下,虽然在 Ken Thompson 的设计经历中,他看起来很少解决短期问题,但他对未来有着极大的包容性,并且这种包容性还在不断提升。当然 Unix 也是这样的, 它让我不禁暗自揣测,让我认为 Go 语言中令人不快的地方都其实是他们未来事业的基石(例如缺乏泛型)。如果要确认这件事是真假,我需要比 Ken 还要聪明,但这并不是一件容易让人相信的事情。
+
+--------------------------------------------------------------------------------
+
+via: http://esr.ibiblio.org/?p=7745
+
+作者:[Eric Raymond][a]
+译者:[Valoniakim](https://github.com/Valoniakim)
+校对:[wxy](https://github.com/wxy)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:http://esr.ibiblio.org/?author=2
+[1]:http://esr.ibiblio.org/?author=2
+[2]:http://esr.ibiblio.org/?p=7711&cpage=1#comment-1913931
+[3]:http://esr.ibiblio.org/?p=7745
diff --git a/translated/tech/20171128 How To Tell If Your Linux Server Has Been Compromised.md b/translated/tech/20171128 How To Tell If Your Linux Server Has Been Compromised.md
deleted file mode 100644
index 29fe95d868..0000000000
--- a/translated/tech/20171128 How To Tell If Your Linux Server Has Been Compromised.md
+++ /dev/null
@@ -1,163 +0,0 @@
-如何判断Linux服务器是否被入侵
---------------
-
-本指南中所谓的服务器被入侵或者说被黑了的意思是指未经认证的人或程序为了自己的目的登录到服务器上去并使用其计算资源, 通常会产生不好的影响。
-
-免责声明: 若你的服务器被类似NSA这样的国家机关或者某个犯罪集团如请,那么你并不会发现有任何问题,这些技术也无法发觉他们的存在。
-
-然而, 大多数被攻破的服务器都是被类似自动攻击程序这样的程序或者类似“脚本小子”这样的廉价攻击者,以及蠢蛋犯罪所入侵的。
-
-这类攻击者会在访问服务器的同时滥用服务器资源,并且不怎么会采取措施来隐藏他们正在做的事情。
-
-### 入侵服务器的症状
-
-当服务器被没有经验攻击者或者自动攻击程序入侵了的话,他们往往会消耗100%的资源. 他们可能消耗CPU资源来进行数字货币的采矿或者发送垃圾邮件,也可能消耗带宽来发动 `DoS` 攻击。
-
-因此出现问题的第一个表现就是服务器 “变慢了”. 这可能表现在网站的页面打开的很慢, 或者电子邮件要花很长时间才能发送出去。
-
-那么你应该查看那些东西呢?
-
-#### 检查 1 - 当前都有谁在登录?
-
-你首先要查看当前都有谁登录在服务器上. 发现攻击者登录到服务器上进行操作并不罕见。
-
-其对应的命令是 `w`. 运行 `w` 会输出如下结果:
-
-```
- 08:32:55 up 98 days, 5:43, 2 users, load average: 0.05, 0.03, 0.00
-USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
-root pts/0 113.174.161.1 08:26 0.00s 0.03s 0.02s ssh root@coopeaa12
-root pts/1 78.31.109.1 08:26 0.00s 0.01s 0.00s w
-
-```
-
-第一个IP是英国IP,而第二个IP是越南IP. 这个不是个好兆头。
-
-停下来做个深呼吸, 不要紧,只需要杀掉他们的SSH连接就好了. Unless you can stop then re-entering the server they will do so quickly and quite likely kick you off and stop you getting back in。
-
-请参阅本文最后的 `入侵之后怎么办` 这一章节来看发现被入侵的证据后应该怎么办。
-
-`whois` 命令可以接一个IP地址然后告诉你IP注册的组织的所有信息, 当然就包括所在国家的信息。
-
-#### 检查 2 - 谁曾经登录过?
-
-Linux 服务器会记录下哪些用户,从哪个IP,在什么时候登录的以及登陆了多长时间这些信息. 使用 `last` 命令可以查看这些信息。
-
-输出类似这样:
-
-```
-root pts/1 78.31.109.1 Thu Nov 30 08:26 still logged in
-root pts/0 113.174.161.1 Thu Nov 30 08:26 still logged in
-root pts/1 78.31.109.1 Thu Nov 30 08:24 - 08:26 (00:01)
-root pts/0 113.174.161.1 Wed Nov 29 12:34 - 12:52 (00:18)
-root pts/0 14.176.196.1 Mon Nov 27 13:32 - 13:53 (00:21)
-
-```
-
-这里可以看到英国IP和越南IP交替出现, 而且最上面两个IP现在还处于登录状态. 如果你看到任何未经授权的IP,那么请参阅最后章节。
-
-登录历史记录会以文本格式记录到 `~/.bash_history`(注:这里作者应该写错了)中,因此很容易被删除。
-通常攻击者会直接把这个文件删掉,以掩盖他们的攻击行为. 因此, 若你运行了 `last` 命令却只看得见你的当前登录,那么这就是个不妙的信号。
-
-如果没有登录历史的话,请一定小心,继续留意入侵的其他线索。
-
-#### 检查 3 - 回顾命令历史
-
-这个层次的攻击者通常不会注意掩盖命令的历史记录,因此运行 `history` 命令会显示出他们曾经做过的所有事情。
-一定留意有没有用 `wget` 或 `curl` 命令来下载类似垃圾邮件机器人或者挖矿程序之类的软件。
-
-命令历史存储在 `~/.bash_history` 文件中,因此有些攻击者会删除该文件以掩盖他们的所作所为。
-跟登录历史一样, 若你运行 `history` 命令却没有输出任何东西那就表示历史文件被删掉了. 这也是个不妙的信号,你需要很小心地检查一下服务器了。
-
-#### 检查 4 - 哪些进程在消耗CPU?
-
-你常遇到的这类攻击者通常不怎么会去掩盖他们做的事情. 他们会运行一些特别消耗CPU的进程. 这就很容易发着这些进程了. 只需要运行 `top` 然后看最前的那几个进程就行了。
-
-这也能显示出那些未登录的攻击者来. 比如,可能有人在用未受保护的邮件脚本来发送垃圾邮件。
-
-如果你最上面的进程对不了解,那么你可以google一下进程名称,或者通过 `losf` 和 `strace` 来看看它做的事情是什么。
-
-使用这些工具,第一步从 `top` 中拷贝出进程的 PID,然后运行:
-
-```shell
-strace -p PID
-
-```
-
-这会显示出进程调用的所有系统调用. 它产生的内容会很多,但这些信息能告诉你这个进程在做什么。
-
-```
-lsof -p PID
-
-```
-
-这个程序会列出进程打开的文件. 通过查看它访问的文件可以很好的理解它在做的事情。
-
-#### 检查 5 - 检查所有的系统进程
-
-消耗CPU不严重的未认证进程可能不会在 `top` 中显露出来,不过它依然可以通过 `ps` 列出来. 命令 `ps auxf` 就能显示足够清晰的信息了。
-
-你需要检查一下每个不认识的进程. 经常运行 `ps` (这是个好习惯) 能帮助你发现奇怪的进程。
-
-#### 检查 6 - 检查进程的网络使用情况
-
-`iftop` 的功能类似 `top`,他会显示一系列收发网络数据的进程以及他们的源地址和目的地址。
-类似 `DoS` 攻击或垃圾制造器这样的进程很容易显示在列表的最顶端。
-
-#### 检查 7 - 哪些进程在监听网络连接?
-
-通常攻击者会安装一个后门程序专门监听网络端口接受指令. 该进程等待期间是不会消耗CPU和带宽的,因此也就不容易通过 `top` 之类的命令发现。
-
-`lsof` 和 `netstat` 命令都会列出所有的联网进程. 我通常会让他们带上下面这些参数:
-
-```
-lsof -i
-
-```
-
-```
-netstat -plunt
-
-```
-
-你需要留意那些处于 `LISTEN` 和 `ESTABLISHED` 状态的进程,这些进程要么正在等待连接(LISTEN),要么已经连接(ESTABLISHED)。
-如果遇到不认识的进程,使用 `strace` 和 `lsof` 来看看它们在做什么东西。
-
-### 被入侵之后该怎么办呢?
-
-首先,不要紧张, 尤其当攻击者正处于登陆状态时更不能紧张. 你需要在攻击者警觉到你已经发现他之前夺回机器的控制权。
-如果他发现你已经发觉到他了,那么他可能会锁死你不让你登陆服务器,然后开始毁尸灭迹。
-
-如果你技术不太好那么就直接关机吧. 你可以在服务器上运行 `shutdown -h now` 或者 `systemctl poweroff` 这两条命令. 也可以登陆主机提供商的控制面板中关闭服务器。
-关机后,你就可以开始配置防火墙或者咨询一下供应商的意见。
-
-如果你对自己颇有自信,而你的主机提供商也有提供上游防火墙,那么你只需要以此创建并启用下面两条规则就行了:
-
-1. 只允许从你的IP地址登陆SSH
-
-2. 封禁除此之外的任何东西,不仅仅是SSH,还包括任何端口上的任何协议。
-
-这样会立即关闭攻击者的SSH会话,而只留下你访问服务器。
-
-如果你无法访问上游防火墙,那么你就需要在服务器本身创建并启用这些防火墙策略,然后在防火墙规则起效后使用 `kill` 命令关闭攻击者的ssh会话。
-
-最后还有一种方法, 就是通过诸如串行控制台之类的带外连接登陆服务器,然后通过 `systemctl stop network.service` 停止网络功能。
-这会关闭所有服务器上的网络连接,这样你就可以慢慢的配置那些防火墙规则了。
-
-重夺服务器的控制权后,也不要以为就万事大吉了。
-
-不要试着修复这台服务器,让后接着用. 你永远不知道攻击者做过什么因此你也永远无法保证这台服务器还是安全的。
-
-最好的方法就是拷贝出所有的资料,然后重装系统。
-
---------------------------------------------------------------------------------
-
-via: https://bash-prompt.net/guides/server-hacked/
-
-作者:[Elliot Cooper][a]
-译者:[lujun9972](https://github.com/lujun9972)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[a]:https://bash-prompt.net
diff --git a/translated/tech/20171129 5 best practices for getting started with DevOps.md b/translated/tech/20171129 5 best practices for getting started with DevOps.md
new file mode 100644
index 0000000000..3fa96176d5
--- /dev/null
+++ b/translated/tech/20171129 5 best practices for getting started with DevOps.md
@@ -0,0 +1,92 @@
+5 个最佳实践开始你的 DevOps 之旅
+============================================================
+
+### 想要实现 DevOps 但是不知道如何开始吗?试试这 5 个最佳实践吧。
+
+
+
+
+Image by : [Andrew Magill][8]. Modified by Opensource.com. [CC BY 4.0][9]
+
+想要采用 DevOps 的人通常会过早的被它的歧义性给吓跑,更不要说更加深入的使用了。当一些人开始使用 DevOps 的时候都会问:“如何开始使用呢?”,”怎么才算使用了呢?“。这 5 个最佳实践是很好的路线图来指导你的 DevOps 之旅。
+
+### 1\. 衡量所有的事情
+
+除非你能量化输出结果,否则你并不能确认你的努力能否使事情变得更好。新功能能否快速的输出给客户?有更少的漏洞泄漏给他们吗?出错了能快速应对和恢复吗?
+
+在你开始做任何修改之前,思考一下你切换到 DevOps 之后想要一些什么样的输出。随着你的 DevOps 之旅,将享受到服务的所有内容的丰富的实时报告,从这两个指标考虑一下:
+
+* **上架时间** 衡量端到端,通常是面向客户的业务经验。这通常从一个功能被正式提出而开始,客户在产品中开始使用这个功能而结束。上架时间不是团队的主要指标;更加重要的是,当开发出一个有价值的新功能时,它表明了你完成业务的效率,为系统改进提供了一个机会。
+
+* **时间周期** 衡量工程团队的进度。从开始开发一个新功能开始,到在产品中运行需要多久?这个指标对于你理解团队的效率是非常有用的,为团队等级的提升提供了一个机会。
+
+### 2\. 放飞你的流程
+
+DevOps 的成功需要团队布置一个定期流程并且持续提升它。这不总是有效的,但是必须是一个定期(希望有效)的流程。通常它有一些敏捷开发的味道,就像 Scrum 或者 Scrumban 一样;一些时候它也像精益开发。不论你用的什么方法,挑选一个正式的流程,开始使用它,并且做好这些基础。
+
+定期检查和调整流程是 DevOps 成功的关键,抓住相关演示,团队回顾,每日会议的机会来提升你的流程。
+
+DevOps 的成功取决于大家一起有效的工作。团队的成员需要在一个有权改进的公共流程中工作。他们也需要定期找机会分享从这个流程中上游或下游的其他人那里学到的东西。
+
+随着你构建成功。好的流程规范能帮助你的团队以很快的速度体会到 DevOps 其他的好处
+
+尽管更多面向开发的团队采用 Scrum 是常见的,但是以运营为中心的团队(或者其他中断驱动的团队)可能选用一个更短期的流程,例如 Kanban。
+
+### 3\. 可视化工作流程
+这是很强大的,能够看到哪个人在给定的时间做哪一部分工作,可视化你的工作流程能帮助大家知道接下来应该做什么,流程中有多少工作以及流程中的瓶颈在哪里。
+
+在你看到和衡量之前你并不能有效的限制流程中的工作。同样的,你也不能有效的排除瓶颈直到你清楚的看到它。
+
+全部工作可视化能帮助团队中的成员了解他们在整个工作中的贡献。这样可以促进跨组织边界的关系建设,帮助您的团队更有效地协作,实现共同的成就感。
+
+### 4\. 持续化所有的事情
+
+DevOps 应该是强制自动化的。然而罗马不是一日建成的。你应该注意的第一个事情应该是努力的持续集成(CI),但是不要停留到这里;紧接着的是持续交付(CD)以及最终的持续部署。
+
+持续部署的过程中是个注入自动测试的好时机。这个时候新代码刚被提交,你的持续部署应该运行测试代码来测试你的代码和构建成功的加工品。这个加工品经受流程的考验被产出直到最终被客户看到。
+
+另一个“持续”是不太引人注意的持续改进。一个简单的场景是每天询问你旁边的同事:“今天做些什么能使工作变得更好?”,随着时间的推移,这些日常的小改进融合到一起会引起很大的结果,你将很惊喜!但是这也会让人一直思考着如何改进。
+
+### 5\. Gherkinize
+
+促进组织间更有效的沟通对于成功的 DevOps 的系统思想至关重要。在程序员和业务员之间直接使用共享语言来描述新功能的需求文档对于沟通是个好办法。一个好的产品经理能在一天内学会 [Gherkin][12] 然后使用它构造出明确的英语来描述需求文档,工程师会使用 Gherkin 描述的需求文档来写功能测试,之后开发功能代码直到代码通过测试。这是一个简化的 [验收测试驱动开发][13](ATDD),这样就开始了你的 DevOps 文化和开发实践。
+
+### 开始你旅程
+
+不要自馁哦。希望这五个想法给你坚实的入门方法。
+
+
+### 关于作者
+
+ [][14]
+
+ Magnus Hedemark - Magnus 在IT行业已有20多年,并且一直热衷于技术。他目前是 nitedHealth Group 的 DevOps 工程师。在业余时间,Magnus 喜欢摄影和划独木舟。
+
+--------------------------------------------------------------------------------
+
+via: https://opensource.com/article/17/11/5-keys-get-started-devops
+
+作者:[Magnus Hedemark ][a]
+译者:[aiwhj](https://github.com/aiwhj)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://opensource.com/users/magnus919
+[1]:https://opensource.com/tags/devops?src=devops_resource_menu1
+[2]:https://opensource.com/resources/devops?src=devops_resource_menu2
+[3]:https://www.openshift.com/promotions/devops-with-openshift.html?intcmp=7016000000127cYAAQ&src=devops_resource_menu3
+[4]:https://enterprisersproject.com/article/2017/5/9-key-phrases-devops?intcmp=7016000000127cYAAQ&src=devops_resource_menu4
+[5]:https://www.redhat.com/en/insights/devops?intcmp=7016000000127cYAAQ&src=devops_resource_menu5
+[6]:https://opensource.com/article/17/11/5-keys-get-started-devops?rate=oEOzMXx1ghbkfl2a5ae6AnvO88iZ3wzkk53K2CzbDWI
+[7]:https://opensource.com/user/25739/feed
+[8]:https://ccsearch.creativecommons.org/image/detail/7qRx_yrcN5isTMS0u9iKMA==
+[9]:https://creativecommons.org/licenses/by-sa/4.0/
+[10]:https://martinfowler.com/articles/continuousIntegration.html
+[11]:https://martinfowler.com/bliki/ContinuousDelivery.html
+[12]:https://cucumber.io/docs/reference
+[13]:https://en.wikipedia.org/wiki/Acceptance_test%E2%80%93driven_development
+[14]:https://opensource.com/users/magnus919
+[15]:https://opensource.com/users/magnus919
+[16]:https://opensource.com/users/magnus919
+[17]:https://opensource.com/tags/devops
diff --git a/sources/tech/20171130 How to find all files with a specific text using Linux shell .md b/translated/tech/20171130 How to find all files with a specific text using Linux shell .md
similarity index 59%
rename from sources/tech/20171130 How to find all files with a specific text using Linux shell .md
rename to translated/tech/20171130 How to find all files with a specific text using Linux shell .md
index f5909c27c9..41b02fc989 100644
--- a/sources/tech/20171130 How to find all files with a specific text using Linux shell .md
+++ b/translated/tech/20171130 How to find all files with a specific text using Linux shell .md
@@ -1,56 +1,38 @@
-translating by lujun9972
-How to find all files with a specific text using Linux shell
+如何在 Linux shell 中找出所有包含指定文本的文件
------
-### Objective
+### 目标
-The following article provides some useful tips on how to find all files within any specific directory or entire file-system containing any specific word or string.
+本文提供一些关于如何搜索出指定目录或整个文件系统中那些包含指定单词或字符串的文件。
-### Difficulty
+### 难度
-EASY
+容易
-### Conventions
+### 约定
-* # - requires given command to be executed with root privileges either directly as a root user or by use of sudo command
+* \# - 需要使用 root 权限来执行指定命令,可以直接使用 root 用户来执行也可以使用 sudo 命令
-* $ - given command to be executed as a regular non-privileged user
+* \$ - 可以使用普通用户来执行指定命令
-### Examples
+### 案例
-### Find all files with a specific string non-recursively
+#### 非递归搜索包含指定字符串的文件
-The first command example will search for a string
+第一个例子让我们来搜索 `/etc/` 目录下所有包含 `stretch` 字符串的文件,但不去搜索其中的子目录:
-`stretch`
-
-in all files within
-
-`/etc/`
-
-directory while excluding any sub-directories:
-
-```
+```shell
# grep -s stretch /etc/*
/etc/os-release:PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
/etc/os-release:VERSION="9 (stretch)"
```
-`-s`
+grep 的 `-s` 选项会在发现不能存在或者不能读取的文件时抑制报错信息。结果现实除了文件名外还有包含请求字符串的行也被一起输出了。
-grep option will suppress error messages about nonexistent or unreadable files. The output shows filenames as well as prints the actual line containing requested string.
+#### 递归地搜索包含指定字符串的文件
-### Find all files with a specific string recursively
+上面案例中忽略了所有的子目录。所谓递归搜索就是指同时搜索所有的子目录。
+下面的命令会在 `/etc/` 及其子目录中搜索包含 `stretch` 字符串的文件:
-The above command omitted all sub-directories. To search recursively means to also traverse all sub-directories. The following command will search for a string
-
-`stretch`
-
-in all files within
-
-`/etc/`
-
-directory including all sub-directories:
-
-```
+```shell
# grep -R stretch /etc/*
/etc/apt/sources.list:# deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main
/etc/apt/sources.list:#deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main
@@ -84,29 +66,10 @@ directory including all sub-directories:
/etc/os-release:VERSION="9 (stretch)"
```
-The above
+#### 搜索所有包含特定单词的文件
+上面 `grep` 命令的案例中列出的是所有包含字符串 `stretch` 的文件。也就是说包含 `stretches` , `stretched` 等内容的行也会被显示。 使用 grep 的 `-w` 选项会只显示包含特定单词的行:
-`grep`
-
-command example lists all files containing string
-
-`stretch`
-
-. Meaning the lines with
-
-`stretches`
-
-,
-
-`stretched`
-
-etc. are also shown. Use grep's
-
-`-w`
-
-option to show only a specific word:
-
-```
+```shell
# grep -Rw stretch /etc/*
/etc/apt/sources.list:# deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main
/etc/apt/sources.list:#deb cdrom:[Debian GNU/Linux testing _Stretch_ - Official Snapshot amd64 NETINST Binary-1 20170109-05:56]/ stretch main
@@ -121,17 +84,10 @@ option to show only a specific word:
/etc/os-release:VERSION="9 (stretch)"
```
-The above commands may produce an unnecessary output. The next example will only show all file names containing string
+#### 显示包含特定文本文件的文件名
+上面的命令都会产生多余的输出。下一个案例则会递归地搜索 `etc` 目录中包含 `stretch` 的文件并只输出文件名:
-`stretch`
-
-within
-
-`/etc/`
-
-directory recursively:
-
-```
+```shell
# grep -Rl stretch /etc/*
/etc/apt/sources.list
/etc/dictionaries-common/words
@@ -139,29 +95,11 @@ directory recursively:
/etc/os-release
```
-All searches are by default case sensitive which means that any search for a string
+#### 大小写不敏感的搜索
+默认情况下搜索 hi 大小写敏感的,也就是说当搜索字符串 `stretch` 时只会包含大小写一致内容的文件。
+通过使用 grep 的 `-i` 选项,grep 命令还会列出所有包含 `Stretch` , `STRETCH` , `StReTcH` 等内容的文件,也就是说进行的是大小写不敏感的搜索。
-`stretch`
-
-will only show files containing the exact uppercase and lowercase match. By using grep's
-
-`-i`
-
-option the command will also list any lines containing
-
-`Stretch`
-
-,
-
-`STRETCH`
-
-,
-
-`StReTcH`
-
-etc., hence, to perform case-insensitive search.
-
-```
+```shell
# grep -Ril stretch /etc/*
/etc/apt/sources.list
/etc/dictionaries-common/default.hash
@@ -170,39 +108,19 @@ etc., hence, to perform case-insensitive search.
/etc/os-release
```
-Using
+#### 搜索是包含/排除指定文件
+`grep` 命令也可以只在指定文件中进行搜索。比如,我们可以只在配置文件(扩展名为`.conf`)中搜索指定的文本/字符串。 下面这个例子就会在 `/etc` 目录中搜索带字符串 `bash` 且所有扩展名为 `.conf` 的文件:
-`grep`
-
-command it is also possible to include only specific files as part of the search. For example we only would like to search for a specific text/string within configuration files with extension
-
-`.conf`
-
-. The next example will find all files with extension
-
-`.conf`
-
-within
-
-`/etc`
-
-directory containing string
-
-`bash`
-
-:
-
-```
+```shell
# grep -Ril bash /etc/*.conf
OR
# grep -Ril --include=\*.conf bash /etc/*
/etc/adduser.conf
```
-`--exclude`
-option we can exclude any specific filenames:
+类似的,也可以使用 `--exclude` 来排除特定的文件:
-```
+```shell
# grep -Ril --exclude=\*.conf bash /etc/*
/etc/alternatives/view
/etc/alternatives/vim
@@ -227,57 +145,30 @@ option we can exclude any specific filenames:
/etc/skel/.bash_logout
```
-Same as with files grep can also exclude specific directories from the search. Use
+#### 搜索时排除指定目录
+跟文件一样,grep 也能在搜索时排除指定目录。 使用 `--exclude-dir` 选项就行。
+下面这个例子会搜索 `/etc` 目录中搜有包含字符串 `stretch` 的文件,但不包括 `/etc/grub.d` 目录下的文件:
-`--exclude-dir`
-
-option to exclude directory from search. The following search example will find all files containing string
-
-`stretch`
-
-within
-
-`/etc`
-
-directory and exclude
-
-`/etc/grub.d`
-
-from search:
-
-```
+```shell
# grep --exclude-dir=/etc/grub.d -Rwl stretch /etc/*
/etc/apt/sources.list
/etc/dictionaries-common/words
/etc/os-release
```
-By using
+#### 显示包含搜索字符串的行号
+`-n` 选项还会显示指定字符串所在行的行号:
-`-n`
-
-option grep will also provide an information regarding a line number where the specific string was found:
-
-```
+```shell
# grep -Rni bash /etc/*.conf
/etc/adduser.conf:6:DSHELL=/bin/bash
```
-The last example will use
+#### 寻找不包含指定字符串的文件
+最后这个例子使用 `-v` 来列出所有 *不* 包含指定字符串的文件。
+例如下面命令会搜索 `/etc` 目录中不包含 `stretch` 的所有文件:
-`-v`
-
-option to list all files NOT containing a specific keyword. For example the following search will list all files within
-
-`/etc/`
-
-directory which do not contain string
-
-`stretch`
-
-:
-
-```
+```shell
# grep -Rlv stretch /etc/*
```
@@ -287,7 +178,7 @@ via: https://linuxconfig.org/how-to-find-all-files-with-a-specific-text-using-li
作者:[Lubos Rendek][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/) 荣誉推出
diff --git a/translated/tech/20171130 Undistract-me_Get Notification When Long Running Terminal Commands Complete.md b/translated/tech/20171130 Undistract-me_Get Notification When Long Running Terminal Commands Complete.md
new file mode 100644
index 0000000000..26a087d440
--- /dev/null
+++ b/translated/tech/20171130 Undistract-me_Get Notification When Long Running Terminal Commands Complete.md
@@ -0,0 +1,154 @@
+Undistract-me:当长时间运行的终端命令完成时获取通知
+============================================================
+
+作者:[sk][2],时间:2017.11.30
+
+
+
+前一段时间,我们发表了如何[在终端活动完成时获取通知][3]。今天,我发现了一个叫做 “undistract-me” 的类似工具,它可以在长时间运行的终端命令完成时通知你。想象这个场景。你运行着一个需要一段时间才能完成的命令。与此同时,你查看你的 Facebook,并参与其中。过了一会儿,你记得你几分钟前执行了一个命令。你回到终端,注意到这个命令已经完成了。但是你不知道命令何时完成。你有没有遇到这种情况?我敢打赌,你们大多数人遇到过许多次这种情况。这就是 “undistract-me” 能帮助的了。你不需要经常检查终端,查看命令是否完成。长时间运行的命令完成后,undistract-me 会通知你。它能在 Arch Linux、Debian、Ubuntu 和其他 Ubuntu 衍生版上运行。
+
+#### 安装 Undistract-me
+
+Undistract-me 可以在 Debian 及其衍生版(如 Ubuntu)的默认仓库中使用。你要做的就是运行下面的命令来安装它。
+
+```
+sudo apt-get install undistract-me
+```
+
+Arch Linux 用户可以使用任何帮助程序从 AUR 安装它。
+
+使用 [Pacaur][4]:
+
+```
+pacaur -S undistract-me-git
+```
+
+使用 [Packer][5]:
+
+```
+packer -S undistract-me-git
+```
+
+使用 [Yaourt][6]:
+
+```
+yaourt -S undistract-me-git
+```
+
+然后,运行以下命令将 “undistract-me” 添加到 Bash 中。
+
+```
+echo 'source /etc/profile.d/undistract-me.sh' >> ~/.bashrc
+```
+
+或者,你可以运行此命令将其添加到你的 Bash:
+
+```
+echo "source /usr/share/undistract-me/long-running.bash\nnotify_when_long_running_commands_finish_install" >> .bashrc
+```
+
+如果你在 Zsh shell 中,请运行以下命令:
+
+```
+echo "source /usr/share/undistract-me/long-running.bash\nnotify_when_long_running_commands_finish_install" >> .zshrc
+```
+
+最后更新更改:
+
+对于 Bash:
+
+```
+source ~/.bashrc
+```
+
+对于 Zsh:
+
+```
+source ~/.zshrc
+```
+
+#### 配置 Undistract-me
+
+默认情况下,Undistract-me 会将任何超过 10 秒的命令视为长时间运行的命令。你可以通过编辑 /usr/share/undistract-me/long-running.bash 来更改此时间间隔。
+
+```
+sudo nano /usr/share/undistract-me/long-running.bash
+```
+
+找到 “LONG_RUNNING_COMMAND_TIMEOUT” 变量并将默认值(10 秒)更改为你所选择的其他值。
+
+ [][7]
+
+保存并关闭文件。不要忘记更新更改:
+
+```
+source ~/.bashrc
+```
+
+此外,你可以禁用特定命令的通知。为此,找到 “LONG_RUNNING_IGNORE_LIST” 变量并像下面那样用空格分隔命令。
+
+默认情况下,只有当活动窗口不是命令运行的窗口时才会显示通知。也就是说,只有当命令在后台“终端”窗口中运行时,它才会通知你。如果该命令在活动窗口终端中运行,则不会收到通知。如果你希望无论终端窗口可见还是在后台都发送通知,你可以将 IGNORE_WINDOW_CHECK 设置为 1 以跳过窗口检查。
+
+Undistract-me 的另一个很酷的功能是当命令完成时,你可以设置音频通知和可视通知。默认情况下,它只会发送一个可视通知。你可以通过在命令行上将变量 UDM_PLAY_SOUND 设置为非零整数来更改此行为。但是,你的 Ubuntu 系统应该安装 pulseaudio-utils 和 sound-theme-freedesktop 程序来启用此功能。
+
+请记住,你需要运行以下命令来更新所做的更改。
+
+对于 Bash:
+
+```
+source ~/.bashrc
+```
+
+对于 Zsh:
+
+```
+source ~/.zshrc
+```
+
+现在是时候来验证这是否真的有效。
+
+#### 在长时间运行的终端命令完成时获取通知
+
+现在,运行任何需要超过 10 秒或者你在 Undistract-me 脚本中定义的时间的命令
+
+我在 Arch Linux 桌面上运行以下命令。
+
+```
+sudo pacman -Sy
+```
+
+这个命令花了 32 秒完成。上述命令完成后,我收到以下通知。
+
+ [][8]
+
+请记住,只有当给定的命令花了超过 10 秒才能完成,Undistract-me 脚本才会通知你。如果命令在 10 秒内完成,你将不会收到通知。当然,你可以按照上面的“配置”部分所述更改此时间间隔设置。
+
+我发现这个工具非常有用。在我迷失在其他任务上时,它帮助我回到正事。我希望这个工具也能对你有帮助。
+
+还有更多的工具。保持耐心!
+
+干杯!
+
+资源:
+
+* [Undistract-me GitHub 仓库][1]
+
+--------------------------------------------------------------------------------
+
+via: https://www.ostechnix.com/undistract-get-notification-long-running-terminal-commands-complete/
+
+作者:[sk][a]
+译者:[geekpi](https://github.com/geekpi)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://www.ostechnix.com/author/sk/
+[1]:https://github.com/jml/undistract-me
+[2]:https://www.ostechnix.com/author/sk/
+[3]:https://www.ostechnix.com/get-notification-terminal-task-done/
+[4]:https://www.ostechnix.com/install-pacaur-arch-linux/
+[5]:https://www.ostechnix.com/install-packer-arch-linux-2/
+[6]:https://www.ostechnix.com/install-yaourt-arch-linux/
+[7]:http://www.ostechnix.com/wp-content/uploads/2017/11/undistract-me-1.png
+[8]:http://www.ostechnix.com/wp-content/uploads/2017/11/undistract-me-2.png
diff --git a/translated/tech/20171130 Wake up and Shut Down Linux Automatically.md b/translated/tech/20171130 Wake up and Shut Down Linux Automatically.md
deleted file mode 100644
index a4b829620f..0000000000
--- a/translated/tech/20171130 Wake up and Shut Down Linux Automatically.md
+++ /dev/null
@@ -1,142 +0,0 @@
-
-自动唤醒和关闭 Linux
-=====================
-
-### [banner.jpg][1]
-
-
-
-了解如何通过配置 Linux 计算机来查看时间,并实现自动唤醒和关闭 Linux
-
-[Creative Commons Attribution][6][The Observatory at Delhi][7]
-
-不要成为一个电能浪费者。如果你的电脑不需要开机就请把它们关机。出于方便和计算机宅的考虑,你可以通过配置你的 Linux 计算机实现自动唤醒和关闭 Linux 。
-
-### 系统运行时间
-
-有时候有些电脑需要一直处在开机状态,在不超过电脑运行时间的限制下这种情况是被允许的。有些人为他们的计算机可以长时间的正常运行而感到自豪,且现在我们有内核热补丁能够实现只有在硬件发生故障时才允许机器关机。我认为比较实际可行的是能够在机器需要节省电能以及在移动硬件发生磨损的情况下,且在不需要机器运行的情况下将其关机。比如,你可以在规定的时间内唤醒备份服务器,执行备份,然后关闭它直到它要进行下一次备份。或者,你可以设置你的 Internet 网关只在特定的时间运行。任何不需要一直运行的东西都可以将其配置成在其需要工作的时候打开,待其完成工作后将其关闭。
-
-### 系统休眠
-
-对于不需要一直运行的电脑,使用 root 的 cron 定时任务或者 `/etc/crontab` 文件 可以可靠地关闭电脑。这个例子创建一个 root 定时任务实现每天下午 11点15分 定时关机。
-
-```
-# crontab -e -u root
-# m h dom mon dow command
-15 23 * * * /sbin/shutdown -h now
-```
-以下示例仅在周一至周五运行:
-```
-15 23 * * 1-5 /sbin/shutdown -h now
-```
-您可以为不同的日期和时间创建多个cron作业。 通过命令 ``man 5 crontab`` 可以了解所有时间和日期的字段。
-
-一个快速、容易的方式是,使用 `/etc/crontab ` 文件。但这样你必须指定用户:
-
-```
-15 23 * * 1-5 root shutdown -h now
-```
-
-### 自动唤醒
-
-实现自动唤醒是一件很酷的事情; 我大多数使用 SUSE (SUSE Linux)的同事都在纽伦堡,因此,因此为了跟同事能有几小时一起工作的时间,我不得不需要在凌晨五点起床。我的计算机早上 5点半自动开始工作,而我只需要将自己和咖啡拖到我的桌子上就可以开始工作了。按下电源按钮看起来好像并不是什么大事,但是在每天的那个时候每件小事都会变得很大。
-
-唤醒 Linux 计算机可能不比关闭它稳当,因此你可能需要尝试不同的办法。你可以使用远程唤醒(Wake-On-LAN)、RTC 唤醒或者个人电脑的 BIOS 设置预定的唤醒这些方式。做这些工作的原因是,当你关闭电脑时,这并不是真正关闭了计算机;此时计算机处在极低功耗状态且还可以接受和响应信号。你需要拔掉电源开关将其彻底关闭。
-
-### BIOS 唤醒
-
-BIOS 唤醒是最可靠的。我的系统主板 BIOS 有一个易于使用的唤醒调度程序。(Figure 1). Chances are yours does, too. Easy peasy.
-
-### [fig-1.png][2]
-
-
-
-Figure 1: My system BIOS has an easy-to-use wakeup scheduler.
-
-[Used with permission][8]
-
-
-### 主机远程唤醒(Wake-On-LAN)
-
-远程唤醒是仅次于 BIOS 唤醒的又一种可靠的唤醒方法。这需要你从第二台计算机发送信号到所要打开的计算机。可以使用 Arduino 或 树莓派(Raspberry Pi) 发送基于 Linux 的路由器或者任何 Linux 计算机的唤醒信号。首先,查看系统主板 BIOS 是否支持 Wake-On-LAN ,要是支持的话,必须先启动它,因为它被默认为禁用。
-
-然后,需要一个支持 Wake-On-LAN 的网卡;无线网卡并不支持。你需要运行 `ethtool` 命令查看网卡是否支持 Wake-On-LAN :
-
-```
-# ethtool eth0 | grep -i wake-on
- Supports Wake-on: pumbg
- Wake-on: g
-```
-这条命令输出的 Supports Wake-on 字段会告诉你你的网卡现在开启了哪些功能:
-
-* d -- 禁用
-
-* p -- 物理活动唤醒
-
-* u -- 单播消息唤醒
-
-* m -- 多播(组播)消息唤醒
-
-* b -- 广播消息唤醒
-
-* a -- ARP(Address Resolution Protocol) 唤醒
-
-* g -- magic packet 唤醒
-
-* s -- 设有密码的 magic packet 唤醒
-
-man ethtool 命令并没说清楚 p 选项的作用;这表明任何信号都会导致唤醒。然而,在我的测试中它并没有这么做。想要实现远程唤醒主机,必须支持的功能是 `g -- magic packet` 唤醒,而且显示这个功能已经在启用了。如果它没有被启用,你可以通过 `ethtool` 命令来启用它。
-
-```
-# ethtool -s eth0 wol g
-```
-这条命令可能会在重启后失效,所以为了确保万无一失,你可以创建个 root 用户的定时任务(cron)在每次重启的时候来执行这条命令。
-```
-@reboot /usr/bin/ethtool -s eth0 wol g
-```
-
-### [fig-2.png][3]
-
-
-
-Figure 2: Enable Wake on LAN.
-
-[Used with permission][9]
-
-另一个选择是最近的网络管理器版本有一个很好的小复选框来启用 Wake-On-LAN(图2)。
-
-这里有一个可以用于设置密码的地方,但是如果你的网络接口不支持安全密码,它就不起作用。
-
-现在你需要配置第二台计算机来发送唤醒信号。你并不需要 root 权限,所以你可以为你的用户创建 cron 任务。你需要用到的是想要唤醒的机器的网络接口和MAC地址信息。
-
-```
-30 08 * * * /usr/bin/wakeonlan D0:50:99:82:E7:2B
-```
-### RTC 唤醒(RTC Alarm Clock)
-
-通过使用实时闹钟来唤醒计算机是最不可靠的方法。对于这个方法,可以参看 [Wake Up Linux With an RTC Alarm Clock][4] ;对于现在的大多数发行版来说这种方法已经有点过时了。
-
-下周继续了解更多关于使用RTC唤醒的方法。
-
-通过 Linux 基金会和 edX 可以学习更多关于 Linux 的免费 [ Linux 入门][5]教程。
-
---------------------------------------------------------------------------------
-
-via:https://www.linux.com/learn/intro-to-linux/2017/11/wake-and-shut-down-linux-automatically
-
-作者:[Carla Schroder]
-译者:[译者ID](https://github.com/HardworkFish)
-校对:[校对者ID](https://github.com/校对者ID)
-
-本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
-
-[1]:https://www.linux.com/files/images/bannerjpg
-[2]:https://www.linux.com/files/images/fig-1png-11
-[3]:https://www.linux.com/files/images/fig-2png-7
-[4]:https://www.linux.com/learn/wake-linux-rtc-alarm-clock
-[5]:https://training.linuxfoundation.org/linux-courses/system-administration-training/introduction-to-linux
-[6]:https://www.linux.com/licenses/category/creative-commons-attribution
-[7]:http://www.columbia.edu/itc/mealac/pritchett/00routesdata/1700_1799/jaipur/delhijantarearly/delhijantarearly.html
-[8]:https://www.linux.com/licenses/category/used-permission
-[9]:https://www.linux.com/licenses/category/used-permission
-
diff --git a/translated/tech/20171201 Fedora Classroom Session_Ansible 101.md b/translated/tech/20171201 Fedora Classroom Session_Ansible 101.md
new file mode 100644
index 0000000000..4a4c5514ba
--- /dev/null
+++ b/translated/tech/20171201 Fedora Classroom Session_Ansible 101.md
@@ -0,0 +1,71 @@
+### [Fedora 课堂会议: Ansible 101][2]
+
+### By Sachin S Kamath
+
+
+
+Fedora 课堂会议本周继续进行,本周的主题是 Ansible。 会议的时间安排表发布在 [wiki][3] 上。你还可以从那里找到[之前会议的资源和录像][4]。以下是会议的具体时间 [11月30日本周星期四 1600 UTC][5]。该链接可以将这个时间转换为您的时区上的时间。
+
+### 主题: Ansible 101
+
+正如 Ansible [文档][6] 所说,Ansible 是一个 IT 自动化工具。它主要用于配置系统,部署软件和编排更高级的 IT 任务。示例包括持续交付与零停机滚动升级。
+
+本课堂课程涵盖以下主题:
+
+1. SSH 简介
+
+2. 了解不同的术语
+
+3. Ansible 简介
+
+4. Ansible 安装和设置
+
+5. 建立无密码连接
+
+6. Ad-hoc 命令
+
+7. 管理 inventory
+
+8. Playbooks 示例
+
+之后还将有 Ansible 102 的后续会议。该会议将涵盖复杂的 playbooks,playbooks 角色(roles),动态 inventory 文件,流程控制和 Ansible Galaxy 命令行工具.
+
+### 讲师
+
+我们有两位经验丰富的讲师进行这次会议。
+
+[Geoffrey Marr][7],IRC 聊天室中名字叫 coremodule,是 Red Hat 的一名员工和 Fedora 的贡献者,拥有 Linux 和云技术的背景。工作时,他潜心于 [Fedora QA][8] wiki 和测试页面中。业余时间, 他热衷于 RaspberryPi 项目,尤其是专注于那些软件无线电(Software-defined radio)项目。
+
+[Vipul Siddharth][9] 是Red Hat的实习生,他也在Fedora上工作。他喜欢贡献开源,借此机会传播自由开源软件。
+
+### 加入会议
+
+本次会议将在 [BlueJeans][10] 上进行。下面的信息可以帮你加入到会议:
+
+* 网址: [https://bluejeans.com/3466040121][1]
+
+* 会议 ID (桌面版): 3466040121
+
+我们希望您可以参加,学习,并享受这个会议!如果您对会议有任何反馈意见,有什么新的想法或者想要主持一个会议, 可以随时在这篇文章发表评论或者查看[课堂 wiki 页面][11].
+
+--------------------------------------------------------------------------------
+
+via: https://fedoramagazine.org/fedora-classroom-session-ansible-101/
+
+作者:[Sachin S Kamath]
+译者:[imquanquan](https://github.com/imquanquan)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[1]:https://bluejeans.com/3466040121
+[2]:https://fedoramagazine.org/fedora-classroom-session-ansible-101/
+[3]:https://fedoraproject.org/wiki/Classroom
+[4]:https://fedoraproject.org/wiki/Classroom#Previous_Sessions
+[5]:https://www.timeanddate.com/worldclock/fixedtime.html?msg=Fedora+Classroom+-+Ansible+101&iso=20171130T16&p1=%3A
+[6]:http://docs.ansible.com/ansible/latest/index.html
+[7]:https://fedoraproject.org/wiki/User:Coremodule
+[8]:https://fedoraproject.org/wiki/QA
+[9]:https://fedoraproject.org/wiki/User:Siddharthvipul1
+[10]:https://www.bluejeans.com/downloads
+[11]:https://fedoraproject.org/wiki/Classroom
diff --git a/translated/tech/20171204 30 Best Linux Games On Steam You Should Play in 2017.md b/translated/tech/20171204 30 Best Linux Games On Steam You Should Play in 2017.md
new file mode 100644
index 0000000000..f9fadae4ec
--- /dev/null
+++ b/translated/tech/20171204 30 Best Linux Games On Steam You Should Play in 2017.md
@@ -0,0 +1,304 @@
+2017 年最好的 30 款支持 Linux 的 Steam 游戏
+============================================================
+
+说到游戏,人们一般都会推荐使用 Windows 系统。Windows 能提供更好的显卡支持和硬件兼容性,所以对于游戏爱好者来说的确是个更好的选择。但你是否想过[在 Linux 系统上玩游戏][9]?这的确是可能的,也许你以前还曾经考虑过。但在几年之前, [Steam for Linux][10] 上可玩的游戏并不是很吸引人。
+
+但现在情况完全不一样了。Steam 商店里现在有许多支持 Linux 平台的游戏(包括很多主流大作)。我们在本文中将介绍 Steam 上最好的一些 Linux 游戏。
+
+在进入正题之前,先介绍一个省钱小窍门。如果你是个狂热的游戏爱好者,在游戏上花费很多时间和金钱的话,我建议你订阅 [Humble 每月包(Humble Monthly)][11]。这是个每月收费的订阅服务,每月只用 12 美元就能获得价值 100 美元的游戏。
+
+这个游戏包中可能有些游戏不支持 Linux,但除了 Steam 游戏之外,它还会让 [Humble Bundle 网站][12]上所有的游戏和书籍都打九折,所以这依然是个不错的优惠。
+
+更棒的是,你在 Humble Bundle 上所有的消费都会捐出一部分给慈善机构。所以你在享受游戏的同时还在帮助改变世界。
+
+### Steam 上最好的 Linux 游戏
+
+以下排名无先后顺序。
+
+额外提示:虽然在 Steam 上有很多支持 Linux 的游戏,但你在 Linux 上玩游戏时依然可能会遇到各种问题。你可以阅读我们之前的文章:[每个 Linux 游戏玩家都会遇到的烦人问题][14]
+
+可以点击以下链接跳转到你喜欢的游戏类型:
+
+* [动作类游戏][3]
+
+* [角色扮演类游戏][4]
+
+* [赛车/运动/模拟类游戏][5]
+
+* [冒险类游戏][6]
+
+* [独立游戏][7]
+
+* [策略类游戏][8]
+
+### Steam 上最佳 Linux 动作类游戏
+
+### 1\. 反恐精英:全球攻势(Counter-Strike: Global Offensive)(多人)
+
+《CS:GO》毫无疑问是 Steam 上支持 Linux 的最好的 FPS 游戏之一。我觉得这款游戏无需介绍,但如果你没有听说过它,我要告诉你这将会是你玩过的最好玩的多人 FPS 游戏之一。《CS:GO》还是电子竞技中的一个主流项目。想要提升等级的话,你需要在天梯上和其他玩家同台竞技。但你也可以选择更加轻松的休闲模式。
+
+我本想写《彩虹六号:围攻行动》,但它目前还不支持 Linux 或 Steam OS。
+
+[购买《CS: GO》][15]
+
+### 2\. 求生之路 2(多人/单机)
+
+这是最受欢迎的僵尸主题多人 FPS 游戏之一。在 Steam 优惠时,价格可以低至 1.3 美元。这是个有趣的游戏,能让你体会到你在僵尸游戏中期待的寒意和紧张感。游戏中的环境包括了沼泽、城市、墓地等等,让游戏既有趣又吓人。游戏中的枪械并不是非常先进,但作为一个老游戏来说,它已经提供了足够真实的体验。
+
+[购买《求生之路 2》][16]
+
+### 3\. 无主之地 2(Borderlands 2)(单机/协作)
+
+《无主之地 2》是个很有意思的 FPS 游戏。它和你以前玩过的游戏完全不同。画风看上去有些诡异和卡通化,但我可以保证,游戏体验可一点也不逊色!
+
+如果你在寻找一个好玩而且有很多 DLC 的 Linux 游戏,《无主之地 2》绝对是个不错的选择。
+
+[购买《无主之地 2》][17]
+
+### 4\. 叛乱(Insurgency)(多人)
+
+《叛乱》是 Steam 上又一款支持 Linux 的优秀的 FPS 游戏。它剑走偏锋,从屏幕上去掉了 HUD 和弹药数量指示。如同许多评论者所说,这是款注重武器和团队战术的纯粹的射击游戏。这也许不是最好的 FPS 游戏,但如果你想玩和《三角洲部队》类似的多人游戏的话,这绝对是最好的游戏之一。
+
+[购买《叛乱》][18]
+
+### 5\. 生化奇兵:无限(Bioshock: Infinite)(单机)
+
+《生化奇兵:无限》毫无疑问将会作为 PC 平台最好的单机 FPS 游戏之一而载入史册。你可以利用很多强大的能力来杀死你的敌人。同时你的敌人也各个身怀绝技。游戏的剧情也非常丰富。你不容错过!
+
+[购买《生化奇兵:无限》][19]
+
+### 6\. 《杀手(年度版)》(HITMAN - Game of the Year Edition)(单机)
+
+《杀手》系列无疑是 PC 游戏爱好者们的最爱之一。本系列的最新作开始按章节发布,让很多玩家觉得不满。但现在 Square Enix 撤出了开发,而最新的年度版带着新的内容重返舞台。在游戏中发挥你的想象力暗杀你的目标吧,杀手47!
+
+[购买(杀手(年度版))][20]
+
+### 7\. 传送门 2
+
+《传送门 2》完美地结合了动作与冒险。这是款解谜类游戏,你可以与其他玩家协作,并开发有趣的谜题。协作模式提供了和单机模式截然不同的游戏内容。
+
+[购买《传送门2》][21]
+
+### 8\. 杀出重围:人类分裂
+
+如果你在寻找隐蔽类的射击游戏,《杀出重围》是个完美的选择。这是个非常华丽的游戏,有着最先进的武器和超乎寻常的战斗机制。
+
+[购买《杀出重围:人类分裂》][22]
+
+### 9\. 地铁 2033 重置版(Metro 2033 Redux) / 地铁:最后曙光 重置版(Metro Last Light Redux)
+
+《地铁 2033 重置版》和《地铁:最后曙光 重置版》是经典的《地铁 2033》和《地铁:最后曙光》的最终版本。故事发生在世界末日之后。你需要消灭所有的变种人来保证人类的生存。剩下的就交给你自己去探索了!
+
+[购买《地铁 2033 重置版》][23]
+
+[购买《地铁:最后曙光 重置版》][24]
+
+### 10\. 坦能堡(Tannenberg)(多人)
+
+《坦能堡》是个全新的游戏 - 在本文发表一个月前刚刚发售。游戏背景是第一次世界大战的东线战场(1914-1918)。这款游戏只有多人模式。如果你想要在游戏中体验第一次世界大战,不要错过这款游戏!
+
+[购买《坦能堡》][25]
+
+### Steam 上最佳 Linux 角色扮演类游戏
+
+### 11\. 中土世界:暗影魔多(Shadow of Mordor)
+
+《中土世界:暗影魔多》 是 Steam 上支持 Linux 的最好的开放式角色扮演类游戏之一。你将扮演一个游侠(塔里昂),和光明领主(凯勒布理鹏)并肩作战击败索隆的军队(并最终和他直接交手)。战斗机制非常出色。这是款不得不玩的游戏!
+
+[购买《中土世界:暗影魔多》][26]
+
+### 12\. 神界:原罪加强版(Divinity: Original Sin – Enhanced Edition)
+
+《神界:原罪》是一款极其优秀的角色扮演类独立游戏。它非常独特而又引人入胜。这或许是评分最高的带有冒险和策略元素的角色扮演游戏。加强版添加了新的游戏模式,并且完全重做了配音、手柄支持、协作任务等等。
+
+[购买《神界:原罪加强版》][27]
+
+### 13\. 废土 2:导演剪辑版(Wasteland 2: Director’s Cut)
+
+《废土 2》是一款出色的 CRPG 游戏。如果《辐射 4》被移植成 CRPG 游戏,大概就是这种感觉。导演剪辑版完全重做了画面,并且增加了一百多名新人物。
+
+[购买《废土 2》][28]
+
+### 14\. 阴暗森林(Darkwood)
+
+一个充满恐怖的俯视角角色扮演类游戏。你将探索世界、搜集材料、制作武器来生存下去。
+
+[购买《阴暗森林》][29]
+
+### 最佳赛车 / 运动 / 模拟类游戏
+
+### 15\. 火箭联盟(Rocket League)
+
+《火箭联盟》是一款充满刺激的足球游戏。游戏中你将驾驶用火箭助推的战斗赛车。你不仅是要驾车把球带进对方球门,你甚至还可以让你的对手化为灰烬!
+
+这是款超棒的体育动作类游戏,每个游戏爱好者都值得拥有!
+
+[购买《火箭联盟》][30]
+
+### 16\. 公路救赎(Road Redemption)
+
+想念《暴力摩托》了?作为它精神上的续作,《公路救赎》可以缓解你的饥渴。当然,这并不是真正的《暴力摩托 2》,但它一样有趣。如果你喜欢《暴力摩托》,你也会喜欢这款游戏。
+
+[购买《公路救赎》][31]
+
+### 17\. 尘埃拉力赛(Dirt Rally)
+
+《尘埃拉力赛》是为想要体验公路和越野赛车的玩家准备的。画面非常有魄力,驾驶手感也近乎完美。
+
+[购买《尘埃拉力赛》][32]
+
+### 18\. F1 2017
+
+《F1 2017》是另一款令人印象深刻的赛车游戏。由《尘埃拉力赛》的开发者 Codemasters & Feral Interactive 制作。游戏中包含了所有标志性的 F1 赛车,值得你去体验。
+
+[购买《F1 2017》][33]
+
+### 19. 超级房车赛:汽车运动(GRID Autosport)
+
+《超级房车赛》是最被低估的赛车游戏之一。《超级房车赛:汽车运动》是《超级房车赛》的续作。这款游戏的可玩性令人惊艳。游戏中的赛车也比前作更好。推荐所有的 PC 游戏玩家尝试这款赛车游戏。游戏还支持多人模式,你可以和你的朋友组队参赛。
+
+[购买《超级房车赛:汽车运动》][34]
+
+### 最好的冒险游戏
+
+### 20\. 方舟:生存进化(ARK: Survival Evolved)
+
+《方舟:生存进化》是一款不错的生存游戏,里面有着激动人心的冒险。你发现自己身处一个未知孤岛(方舟岛),为了生存下去并逃离这个孤岛,你必须去驯服恐龙、与其他玩家合作、猎杀其他人来抢夺资源、以及制作物品。
+
+[购买《方舟:生存进化》][35]
+
+### 21\. 这是我的战争(This War of Mine)
+
+一款独特的战争游戏。你不是扮演士兵,而是要作为一个平民来面对战争带来的艰难。你需要在身经百战的敌人手下逃生,并帮助其他的幸存者。
+
+[购买《这是我的战争》][36]
+
+### 22\. 疯狂的麦克斯(Mad Max)
+
+生存和暴力概括了《疯狂的麦克斯》的全部内容。游戏中有性能强大的汽车,开放性的世界,各种武器,以及徒手肉搏。你要不断地探索世界,并注意升级你的汽车来防患于未然。在做决定之前,你要仔细思考并设计好策略。
+
+[购买《疯狂的麦克斯》][37]
+
+### 最佳独立游戏
+
+### 23\. 泰拉瑞亚(Terraria)
+
+这是款在 Steam 上广受好评的 2D 游戏。你在旅途中需要去挖掘、战斗、探索、建造。游戏地图是自动生成的,而不是静止的。也许你刚刚遇到的东西,你的朋友过一会儿才会遇到。你还将体验到富有新意的 2D 动作场景。
+
+[购买《泰拉瑞亚》][38]
+
+### 24\. 王国与城堡(Kingdoms and Castles)
+
+在《王国与城堡》中,你将建造你自己的王国。在管理你的王国的过程中,你需要收税、保护森林、规划城市,并且发展国防来防止别人入侵你的王国。
+
+这是款比较新的游戏,但在独立游戏中已经相对获得了比较高的人气。
+
+[购买《王国与城堡》][39]
+
+### Steam 上最佳 Linux 策略类游戏
+
+### 25\. 文明 5(Sid Meier’s Civilization V)
+
+《文明 5》是 PC 上评价最高的策略游戏之一。如果你想的话,你可以去玩《文明 6》。但是依然有许多玩家喜欢《文明 5》,觉得它更有独创性,游戏细节也更富有创造力。
+
+[购买《文明 5》][40]
+
+### 26\. 全面战争:战锤(Total War: Warhammer)
+
+《全面战争:战锤》是 PC 平台上一款非常出色的回合制策略游戏。可惜的是,新作《战锤 2》依然不支持Linux。但如果你喜欢使用飞龙和魔法来建造与毁灭帝国的话,2016 年的《战锤》依然是个不错的选择。
+
+[购买《全面战争:战锤》][41]
+
+### 27\. 轰炸小队《Bomber Crew》
+
+想要一款充满乐趣的策略游戏?《轰炸小队》就是为你准备的。你需要选择合适的队员并且让你的队伍稳定运转来取得最终的胜利。
+
+[购买《轰炸小队》][42]
+
+### 28\. 奇迹时代 3(Age of Wonders III)
+
+非常流行的策略游戏,包含帝国建造、角色扮演、以及战争元素。这是款精致的回合制策略游戏,请一定要试试!
+
+[购买《奇迹时代 3》][43]
+
+### 29\. 城市:天际线(Cities: Skylines)
+
+一款非常简洁的游戏。你要从零开始建造一座城市,并且管理它的全部运作。你将体验建造和管理城市带来的愉悦与困难。我不觉得每个玩家都会喜欢这款游戏——它的用户群体非常明确。
+
+[购买《城市:天际线》][44]
+
+### 30\. 幽浮 2(XCOM 2)
+
+《幽浮 2》是 PC 上最好的回合制策略游戏之一。我在想如果《幽浮 2》能够被制作成 FPS 游戏的话该有多棒。不过它现在已经是一款好评如潮的杰作了。如果你有多余的预算能花在这款游戏上,建议你购买“天选之战(War of the Chosen)“ DLC。
+
+[购买《幽浮 2》][45]
+
+### 总结
+
+我们从所有支持 Linux 的游戏中挑选了大部分的主流大作以及一些评价很高的新作。
+
+你觉得我们遗漏了你最喜欢的支持 Linux 的 Steam 游戏么?另外,你还希望哪些 Steam 游戏开始支持 Linux 平台?
+
+请在下面的回复中告诉我们你的想法。
+
+--------------------------------------------------------------------------------
+
+via: https://itsfoss.com/best-linux-games-steam/
+
+作者:[Ankush Das][a]
+译者:[yixunx](https://github.com/yixunx)
+校对:[校对者ID](https://github.com/校对者ID)
+
+本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
+
+[a]:https://itsfoss.com/author/ankush/
+[1]:https://itsfoss.com/author/ankush/
+[2]:https://itsfoss.com/best-linux-games-steam/#comments
+[3]:https://itsfoss.com/best-linux-games-steam/#action
+[4]:https://itsfoss.com/best-linux-games-steam/#rpg
+[5]:https://itsfoss.com/best-linux-games-steam/#racing
+[6]:https://itsfoss.com/best-linux-games-steam/#adv
+[7]:https://itsfoss.com/best-linux-games-steam/#indie
+[8]:https://itsfoss.com/best-linux-games-steam/#strategy
+[9]:https://itsfoss.com/linux-gaming-guide/
+[10]:https://itsfoss.com/install-steam-ubuntu-linux/
+[11]:https://www.humblebundle.com/?partner=itsfoss
+[12]:https://www.humblebundle.com/store?partner=itsfoss
+[13]:https://www.humblebundle.com/monthly?partner=itsfoss
+[14]:https://itsfoss.com/linux-gaming-problems/
+[15]:http://store.steampowered.com/app/730/CounterStrike_Global_Offensive/
+[16]:http://store.steampowered.com/app/550/Left_4_Dead_2/
+[17]:http://store.steampowered.com/app/49520/?snr=1_5_9__205
+[18]:http://store.steampowered.com/app/222880/?snr=1_5_9__205
+[19]:http://store.steampowered.com/agecheck/app/8870/
+[20]:http://store.steampowered.com/app/236870/?snr=1_5_9__205
+[21]:http://store.steampowered.com/app/620/?snr=1_5_9__205
+[22]:http://store.steampowered.com/app/337000/?snr=1_5_9__205
+[23]:http://store.steampowered.com/app/286690/?snr=1_5_9__205
+[24]:http://store.steampowered.com/app/287390/?snr=1_5_9__205
+[25]:http://store.steampowered.com/app/633460/?snr=1_5_9__205
+[26]:http://store.steampowered.com/app/241930/?snr=1_5_9__205
+[27]:http://store.steampowered.com/app/373420/?snr=1_5_9__205
+[28]:http://store.steampowered.com/app/240760/?snr=1_5_9__205
+[29]:http://store.steampowered.com/app/274520/?snr=1_5_9__205
+[30]:http://store.steampowered.com/app/252950/?snr=1_5_9__205
+[31]:http://store.steampowered.com/app/300380/?snr=1_5_9__205
+[32]:http://store.steampowered.com/app/310560/?snr=1_5_9__205
+[33]:http://store.steampowered.com/app/515220/?snr=1_5_9__205
+[34]:http://store.steampowered.com/app/255220/?snr=1_5_9__205
+[35]:http://store.steampowered.com/app/346110/?snr=1_5_9__205
+[36]:http://store.steampowered.com/app/282070/?snr=1_5_9__205
+[37]:http://store.steampowered.com/app/234140/?snr=1_5_9__205
+[38]:http://store.steampowered.com/app/105600/?snr=1_5_9__205
+[39]:http://store.steampowered.com/app/569480/?snr=1_5_9__205
+[40]:http://store.steampowered.com/app/8930/?snr=1_5_9__205
+[41]:http://store.steampowered.com/app/364360/?snr=1_5_9__205
+[42]:http://store.steampowered.com/app/537800/?snr=1_5_9__205
+[43]:http://store.steampowered.com/app/226840/?snr=1_5_9__205
+[44]:http://store.steampowered.com/app/255710/?snr=1_5_9__205
+[45]:http://store.steampowered.com/app/268500/?snr=1_5_9__205
+[46]:https://www.facebook.com/share.php?u=https%3A%2F%2Fitsfoss.com%2Fbest-linux-games-steam%2F%3Futm_source%3Dfacebook%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare
+[47]:https://twitter.com/share?original_referer=/&text=30+Best+Linux+Games+On+Steam+You+Should+Play+in+2017&url=https://itsfoss.com/best-linux-games-steam/%3Futm_source%3Dtwitter%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare&via=ankushdas9
+[48]:https://plus.google.com/share?url=https%3A%2F%2Fitsfoss.com%2Fbest-linux-games-steam%2F%3Futm_source%3DgooglePlus%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare
+[49]:https://www.linkedin.com/cws/share?url=https%3A%2F%2Fitsfoss.com%2Fbest-linux-games-steam%2F%3Futm_source%3DlinkedIn%26utm_medium%3Dsocial%26utm_campaign%3DSocialWarfare
+[50]:https://www.reddit.com/submit?url=https://itsfoss.com/best-linux-games-steam/&title=30+Best+Linux+Games+On+Steam+You+Should+Play+in+2017